ZGlmZiAtLWdpdCBhL2ZzL250ZnMvQ2hhbmdlTG9nIGIvZnMvbnRmcy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyYWQxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTM1MCBAQAorVG9Eby9Ob3RlczoKKwktIEZpbmQgYW5kIGZpeCBidWdzLgorCS0gQ2hlY2twb2ludCBvciBkaXNhYmxlIHRoZSB1c2VyIHNwYWNlIGpvdXJuYWwgKCRVc25Kcm5sKS4KKwktIEluIGJldHdlZW4gbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSwgbmVlZCBleGNsdXNpb24gYmV0d2VlbgorCSAgc2ltdWx0YW5lb3VzIGZpbGUgZXh0ZW5zaW9ucy4gTmVlZCBwZXJoYXBzIGFuIE5Jbm9SZXNpemVVbmRlcndheSgpCisJICBmbGFnIHdoaWNoIHdlIGNhbiBzZXQgaW4gbnRmc19wcmVwYXJlX3dyaXRlKCkgYW5kIGNsZWFyIGFnYWluIGluCisJICBudGZzX2NvbW1pdF93cml0ZSgpLiBKdXN0IGhhdmUgdG8gYmUgY2FyZWZ1bCBpbiByZWFkcGFnZS93cml0ZXBhZ2UsCisJICBhcyB3ZWxsIGFzIGluIHRydW5jYXRlLCB0aGF0IHdlIHBsYXkgbmljZS4uLiBXZSBtaWdodCBuZWVkIHRvIGhhdmUKKwkgIGEgZGF0YV9zaXplIGZpZWxkIGluIHRoZSBudGZzX2lub2RlIHRvIHN0b3JlIHRoZSByZWFsIGF0dHJpYnV0ZQorCSAgbGVuZ3RoLiBBbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGluaXRpYWxpemVkX3NpemUgZXh0ZW50aW9uIGluCisJICBudGZzX3ByZXBhcmVfd3JpdGUuIEJhc2ljYWxseSwganVzdCBiZSBfdmVyeV8gY2FyZWZ1bCBpbiB0aGlzIGNvZGUuLi4KKwkgIE9UT0gsIHBlcmhhcHMgaV9zZW0sIHdoaWNoIGlzIGhlbGQgYWNjcm9zcyBnZW5lcmljX2ZpbGVfd3JpdGUgaXMKKwkgIHN1ZmZpY2llbnQgZm9yIHN5bmNocm9uaXNhdGlvbiBoZXJlLiBXZSB0aGVuIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUKKwkgIG50ZnNfcmVhZHBhZ2Uvd3JpdGVwYWdlL3RydW5jYXRlIGludGVyb3BlcmF0ZSBwcm9wZXJseSB3aXRoIHVzLgorCSAgVVBEQVRFOiBUaGUgYWJvdmUgaXMgYWxsIG9rIGFzIGl0IGlzIGR1ZSB0byBpX3NlbSBoZWxkLiAgVGhlIG9ubHkKKwkgIHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hlY2tlZCBpcyBudGZzX3dyaXRlcGFnZSgpIHdoaWNoIGRvZXMgbm90CisJICBob2xkIGlfc2VtLiAgSXQgY2Fubm90IGNoYW5nZSBpX3NpemUgYnV0IGl0IG5lZWRzIHRvIGNvcGUgd2l0aCBhCisJICBjb25jdXJyZW50IGlfc2l6ZSBjaGFuZ2UuCisJLSBJbXBsZW1lbnQgbWZ0LmM6OnN5bmNfbWZ0X21pcnJvcl91bW91bnQoKS4gIFdlIGN1cnJlbnRseSB3aWxsIGp1c3QKKwkgIGxlYXZlIHRoZSB2b2x1bWUgZGlydHkgb24gdW1vdW50IGlmIHRoZSBmaW5hbCBpcHV0KHZvbC0+bWZ0X2lubykKKwkgIGNhdXNlcyBhIHdyaXRlIG9mIGFueSBtaXJyb3JlZCBtZnQgcmVjb3JkcyBkdWUgdG8gdGhlIG1mdCBtaXJyb3IKKwkgIGlub2RlIGhhdmluZyBiZWVuIGRpc2NhcmRlZCBhbHJlYWR5LiAgV2hldGhlciB0aGlzIGNhbiBhY3R1YWxseSBldmVyCisJICBoYXBwZW4gaXMgdW5jbGVhciBob3dldmVyIHNvIGl0IGlzIHdvcnRoIHdhaXRpbmcgdW50aWwgc29tZW9uZSBoaXRzCisJICB0aGUgcHJvYmxlbS4KKwktIEVuYWJsZSB0aGUgY29kZSBmb3Igc2V0dGluZyB0aGUgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyB3aGVuIHdlIHN0YXJ0CisJICBtYWtpbmcgTlRGUyAxLjIgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucy4KKworMi4xLjIzLVdJUAorCisJLSBBZGQgcHJpbnRrIHJhdGUgbGltaXRpbmcgZm9yIG50ZnNfd2FybmluZygpIGFuZCBudGZzX2Vycm9yKCkgd2hlbgorCSAgY29tcGlsZWQgd2l0aG91dCBkZWJ1Zy4gIFRoaXMgYXZvaWRzIGEgcG9zc2libGUgZGVuaWFsIG9mIHNlcnZpY2UKKwkgIGF0dGFjay4gIFRoYW5rcyB0byBDYXJsLURhbmllbCBIYWlsZmluZ2VyIGZyb20gU3VTRSBmb3IgcG9pbnRpbmcgdGhpcworCSAgb3V0LgorCisyLjEuMjIgLSBNYW55IGJ1ZyBhbmQgcmFjZSBmaXhlcyBhbmQgZXJyb3IgaGFuZGxpbmcgaW1wcm92ZW1lbnRzLgorCisJLSBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpLgorCS0gQ2hhbmdlIGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpIHRvIHJldHVybiBhbiBlcnJvciBjb2RlCisJICBpbnN0ZWFkIG9mIHZvaWQgYW5kIHByb3ZpZGUgYSBoZWxwZXIgbnRmc190cnVuY2F0ZV92ZnMoKSBmb3IgdGhlCisJICB2ZnMgLT50cnVuY2F0ZSBtZXRob2QuCisJLSBBZGQgYSBuZXcgbnRmcyBpbm9kZSBmbGFnIE5Jbm9UcnVuY2F0ZUZhaWxlZCgpIGFuZCBtb2RpZnkKKwkgIGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpIHRvIHNldCBhbmQgY2xlYXIgaXQgYXBwcm9wcmlhdGVseS4KKwktIEZpeCBtaW5fc2l6ZSBhbmQgbWF4X3NpemUgZGVmaW5pdGlvbnMgaW4gQVRUUl9ERUYgc3RydWN0dXJlIGluCisJICBmcy9udGZzL2xheW91dC5oIHRvIGJlIHNpZ25lZC4KKwktIEFkZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBoYW5kbGluZyBoZWxwZXJzIHRvIGZzL250ZnMvYXR0cmliLltoY106CisJICBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2soKSwgbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQoKSwgYW5kCisJICBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50KCksIHdoaWNoIGluIHR1cm4gdXNlIHRoZSBuZXcgcHJpdmF0ZSBoZWxwZXIKKwkgIG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYoKS4KKwktIEluIGZzL250ZnMvYW9wcy5jOjptYXJrX250ZnNfcmVjb3JkX2RpcnR5KCksIHRha2UgdGhlCisJICBtYXBwaW5nLT5wcml2YXRlX2xvY2sgYXJvdW5kIHRoZSBkaXJ0eWluZyBvZiB0aGUgYnVmZmVyIGhlYWRzCisJICBhbmFsYWdvdXMgdG8gdGhlIHdheSBpdCBpcyBkb25lIGluIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycygpLgorCS0gRW5zdXJlIHRoZSBtZnQgcmVjb3JkIHNpemUgZG9lcyBub3QgZXhjZWVkIHRoZSBQQUdFX0NBQ0hFX1NJWkUgYXQKKwkgIG1vdW50IHRpbWUgYXMgdGhpcyBjYW5ub3Qgd29yayB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgorCS0gQ2hlY2sgZm9yIGxvY2F0aW9uIG9mIGF0dHJpYnV0ZSBuYW1lIGFuZCBpbXByb3ZlIGVycm9yIGhhbmRsaW5nIGluCisJICBnZW5lcmFsIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc19yZWFkX2xvY2tlZF9pbm9kZSgpIGFuZCBmcmllbmRzLgorCS0gSW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVwYWdlKCksIGlmIHRoZSBwYWdlIGlzIGZ1bGx5IG91dHNpZGUKKwkgIGlfc2l6ZSwgaS5lLiByYWNlIHdpdGggdHJ1bmNhdGUsIGludmFsaWRhdGUgdGhlIGJ1ZmZlcnMgb24gdGhlIHBhZ2UKKwkgIHNvIHRoYXQgdGhleSBiZWNvbWUgZnJlZWFibGUgYW5kIGhlbmNlIHRoZSBwYWdlIGRvZXMgbm90IGxlYWsuCisJLSBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uIGZzL250ZnMvcnVubGlzdC5jOjpudGZzX3JsX21lcmdlKCkuICAoQWRyaWFuCisJICBCdW5rKQorCS0gRml4IHN0dXBpZCBidWcgaW4gZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19hdHRyX2ZpbmQoKSB0aGF0IHJlc3VsdGVkIGluCisJICBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiB0aGUgZXJyb3IgY29kZSBwYXRoIHdoZW4gYSBjb3JydXB0CisJICBhdHRyaWJ1dGUgd2FzIGZvdW5kLiAgKFRoYW5rcyB0byBEb21lbiBQdW5jZXIgZm9yIHRoZSBidWcgcmVwb3J0LikKKwktIEFkZCBNT0RVTEVfVkVSU0lPTigpIHRvIGZzL250ZnMvc3VwZXIuYy4KKwktIE1ha2Ugc2V2ZXJhbCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBzdGF0aWMuICAoQWRyaWFuIEJ1bmspCisJLSBNb2RpZnkgZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSBzbyBpdCBhbGxvY2F0ZXMKKwkgIGJ1ZmZlcnMgZm9yIHRoZSBwYWdlIGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50IGFuZCB0aGVuIG1hcmtzIHRoZQorCSAgYnVmZmVycyBiZWxvbmdpbmcgdG8gdGhlIG50ZnMgcmVjb3JkIGRpcnR5LiAgVGhpcyBjYXVzZXMgdGhlIGJ1ZmZlcnMKKwkgIHRvIGJlY29tZSBidXN5IGFuZCBoZW5jZSB0aGV5IGFyZSBzYWZlIGZyb20gcmVtb3ZhbCB1bnRpbCB0aGUgcGFnZQorCSAgaGFzIGJlZW4gd3JpdHRlbiBvdXQuCisJLSBGaXggc3R1cGlkIGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIGluIHRoZQorCSAgZXJyb3IgaGFuZGxpbmcgY29kZSBwYXRoIHRoYXQgcmVzdWx0ZWQgaW4gYSBCVUcoKSBkdWUgdG8gdHJ5aW5nIHRvCisJICB1bm1hcCBhbiBleHRlbnQgbWZ0IHJlY29yZCB3aGVuIHRoZSBtYXBwaW5nIG9mIGl0IGhhZCBmYWlsZWQgYW5kIGl0CisJICB0aHVzIHdhcyBub3QgbWFwcGVkLiAgKFRoYW5rcyB0byBLZW4gTWFjRmVycmluIGZvciB0aGUgYnVnIHJlcG9ydC4pCisJLSBEcm9wIHRoZSBydW5saXN0IGxvY2sgYWZ0ZXIgdGhlIHZjbiBoYXMgYmVlbiByZWFkIGluCisJICBmcy9udGZzL2xjbmFsbG9jLmM6Ol9fbnRmc19jbHVzdGVyX2ZyZWUoKS4KKwktIFJld3JpdGUgaGFuZGxpbmcgb2YgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGVycm9ycy4gIFdlIG5vdyBkbyBub3Qgc2V0CisJICBQYWdlRXJyb3IoKSB3aGVuIHN1Y2ggZXJyb3JzIGFyZSBkZXRlY3RlZCBpbiB0aGUgYXN5bmMgaS9vIGhhbmRsZXIKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpLiAgQWxsIHVzZXJzIG9mIG1zdAorCSAgcHJvdGVjdGVkIGF0dHJpYnV0ZXMgbm93IGNoZWNrIHRoZSBtYWdpYyBvZiBlYWNoIG50ZnMgcmVjb3JkIGFzIHRoZXkKKwkgIHVzZSBpdCBhbmQgYWN0IGFwcHJvcHJpYXRlbHkuICBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyBlcnJvcnMKKwkgIGdyYW51bGFyIHBlciBudGZzIHJlY29yZCByYXRoZXIgdGhhbiBwZXIgcGFnZSB3aGljaCBzb2x2ZXMgdGhlIGNhc2UKKwkgIHdoZXJlIHdlIGNhbm5vdCBhY2Nlc3MgYW55IG9mIHRoZSBudGZzIHJlY29yZHMgaW4gYSBwYWdlIHdoZW4gYQorCSAgc2luZ2xlIG9uZSBvZiB0aGVtIGhhZCBhbiBtc3QgZXJyb3IuICAoVGhhbmtzIHRvIEtlbiBNYWNGZXJyaW4gZm9yCisJICB0aGUgYnVnIHJlcG9ydC4pCisJLSBGaXggZXJyb3IgaGFuZGxpbmcgaW4gZnMvbnRmcy9xdW90YS5jOjpudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlKCkKKwkgIHdoZXJlIHdlIGZhaWxlZCB0byByZWxlYXNlIGlfc2VtIG9uIHRoZSAkUXVvdGEvJFEgYXR0cmlidXRlIGlub2RlLgorCS0gRml4IGJ1ZyBpbiBoYW5kbGluZyBvZiBiYWQgaW5vZGVzIGluIGZzL250ZnMvbmFtZWkuYzo6bnRmc19sb29rdXAoKS4KKwktIEFkZCBtYXBwaW5nIG9mIHVubWFwcGVkIGJ1ZmZlcnMgdG8gYWxsIHJlbWFpbmluZyBjb2RlIHBhdGhzLCBpLmUuCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSwgbWZ0LmM6Om50ZnNfc3luY19tZnRfbWlycm9yKCksCisJICBhbmQgd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKS4gIEZyb20gbm93IG9uIHdlIHJlcXVpcmUgdGhhdCB0aGUKKwkgIGNvbXBsZXRlIHJ1bmxpc3QgZm9yIHRoZSBtZnQgbWlycm9yIGlzIGFsd2F5cyBtYXBwZWQgaW50byBtZW1vcnkuCisJLSBBZGQgY3JlYXRpb24gb2YgYnVmZmVycyB0byBmcy9udGZzL21mdC5jOjpudGZzX3N5bmNfbWZ0X21pcnJvcigpLgorCS0gSW1wcm92ZSBlcnJvciBoYW5kbGluZyBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc197cmVhZCx3cml0ZX1fYmxvY2soKS4KKwktIENsZWFudXAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3JlYWQsd3JpdGV9cGFnZSgpIHNpbmNlIHdlIGtub3cgdGhhdCBhCisJICByZXNpZGVudCBhdHRyaWJ1dGUgd2lsbCBiZSBzbWFsbGVyIHRoYW4gYSBwYWdlIHdoaWNoIG1ha2VzIHRoZSBjb2RlCisJICBzaW1wbGVyLiAgQWxzbyBtYWtlIHRoZSBjb2RlIG1vcmUgdG9sZXJhbnQgdG8gY29uY3VycmVudCAtPnRydW5jYXRlLgorCisyLjEuMjEgLSBGaXggc29tZSByYWNlcyBhbmQgYnVncywgcmV3cml0ZSBtZnQgd3JpdGUgY29kZSwgYWRkIG1mdCBhbGxvY2F0b3IuCisKKwktIEltcGxlbWVudCBleHRlbnQgbWZ0IHJlY29yZCBkZWFsbG9jYXRpb24KKwkgIGZzL250ZnMvbWZ0LmM6Om50ZnNfZXh0ZW50X21mdF9yZWNvcmRfZnJlZSgpLgorCS0gU3BsaXR0IHJ1bmxpc3QgcmVsYXRlZCBmdW5jdGlvbnMgb2ZmIGZyb20gYXR0cmliLltoY10gdG8gcnVubGlzdC5baGNdLgorCS0gQWRkIHZvbC0+bWZ0X2RhdGFfcG9zIGFuZCBpbml0aWFsaXplIGl0IGF0IG1vdW50IHRpbWUuCisJLSBSZW5hbWUgaW5pdF9ydW5saXN0KCkgdG8gbnRmc19pbml0X3J1bmxpc3QoKSwgbnRmc192Y25fdG9fbGNuKCkgdG8KKwkgIG50ZnNfcmxfdmNuX3RvX2xjbigpLCBkZWNvbXByZXNzX21hcHBpbmdfcGFpcnMoKSB0bworCSAgbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSwgbnRmc19tZXJnZV9ydW5saXN0cygpIHRvCisJICBudGZzX3J1bmxpc3RzX21lcmdlKCkgYW5kIGFkYXB0IGFsbCBjYWxsZXJzLgorCS0gQWRkIGZzL250ZnMvcnVubGlzdC5baGNdOjpudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcygpLAorCSAgbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpLCBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKCksCisJICBhbmQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKCksIGFkYXB0ZWQgZnJvbSBsaWJudGZzLgorCS0gTWFrZSBmcy9udGZzL2xjbmFsbG9jLmM6Om50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKCkgbm90CisJICBzdGF0aWMgYW5kIGFkZCBhIGRlY2xhcmF0aW9uIGZvciBpdCB0byBsY25hbGxvYy5oLgorCS0gQWRkIGZzL250ZnMvbGNuYWxsb2MuaDo6bnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybCgpIHdoaWNoIGlzIGEgc3RhdGljCisJICBpbmxpbmUgd3JhcHBlciBmb3IgbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybF9ub2xvY2soKSB3aGljaCB0YWtlcyB0aGUKKwkgIGNsdXN0ZXIgYml0bWFwIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC4KKwktIEFkZCBmcy9udGZzL2F0dHJpYi5baGNdOjpudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZSgpLgorCS0gSW1wbGVtZW50IHRoZSBlcXVpdmFsZW50IG9mIG1lbXNldCgpIGZvciBhbiBudGZzIGF0dHJpYnV0ZSBpbgorCSAgZnMvbnRmcy9hdHRyaWIuW2hjXTo6bnRmc19hdHRyX3NldCgpIGFuZCBzd2l0Y2gKKwkgIGZzL250ZnMvbG9nZmlsZS5jOjpudGZzX2VtcHR5X2xvZ2ZpbGUoKSB0byB1c2luZyBpdC4KKwktIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYXN0cyBmcm9tIExDTl8qIGNvbnN0YW50cy4KKwktIEltcGxlbWVudCBmcy9udGZzL3J1bmxpc3QuYzo6bnRmc19ybF90cnVuY2F0ZV9ub2xvY2soKS4KKwktIEFkZCBNRlRfUkVDT1JEX09MRCBhcyBhIGNvcHkgb2YgTUZUX1JFQ09SRCBpbiBmcy9udGZzL2xheW91dC5oIGFuZAorCSAgY2hhbmdlIE1GVF9SRUNPUkQgdG8gY29udGFpbiB0aGUgTlRGUyAzLjErIHNwZWNpZmljIGZpZWxkcy4KKwktIEFkZCBhIGhlbHBlciBmdW5jdGlvbiBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHdoaWNoCisJICBtYXJrcyBhbGwgYnVmZmVycyBiZWxvbmdpbmcgdG8gYW4gbnRmcyByZWNvcmQgZGlydHksIGZvbGxvd2VkIGJ5CisJICBtYXJraW5nIHRoZSBwYWdlIHRoZSBudGZzIHJlY29yZCBpcyBpbiBkaXJ0eSBhbmQgYWxzbyBtYXJraW5nIHRoZSB2ZnMKKwkgIGlub2RlIGNvbnRhaW5pbmcgdGhlIG50ZnMgcmVjb3JkIGRpcnR5IChJX0RJUlRZX1BBR0VTKS4KKwktIFN3aXRjaCBmcy9udGZzL2luZGV4Lmg6Om50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eSgpIHRvIHVzaW5nIHRoZQorCSAgbmV3IGhlbHBlciBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpIGFuZCByZW1vdmUgdGhlIG5vCisJICBsb25nZXIgbmVlZGVkIGZzL250ZnMvaW5kZXguW2hjXTo6X19udGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKS4KKwktIE1vdmUgbnRmc197dW4sfW1hcF9wYWdlKCkgZnJvbSBudGZzLmggdG8gYW9wcy5oIGFuZCBmaXggcmVzdWx0aW5nCisJICBpbmNsdWRlIGVycm9ycy4KKwktIE1vdmUgdGhlIHR5cGVkZWZzIGZvciBydW5saXN0X2VsZW1lbnQgYW5kIHJ1bmxpc3QgZnJvbSB0eXBlcy5oIHRvCisJICBydW5saXN0LmggYW5kIGZpeCByZXN1bHRpbmcgaW5jbHVkZSBlcnJvcnMuCisJLSBSZW1vdmUgdW51c2VkIHtfXyx9Zm9ybWF0X21mdF9yZWNvcmQoKSBmcm9tIGZzL250ZnMvbWZ0LmMuCisJLSBNb2RpZnkgZnMvbnRmcy9tZnQuYzo6X19tYXJrX21mdF9yZWNvcmRfZGlydHkoKSB0byB1c2UgdGhlIGhlbHBlcgorCSAgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHdoaWNoIGFsc28gY2hhbmdlcyB0aGUgYmVoYXZpb3VyIGluIHRoYXQgd2UKKwkgIG5vdyBzZXQgdGhlIGJ1ZmZlcnMgYmVsb25naW5nIHRvIHRoZSBtZnQgcmVjb3JkIGRpcnR5IGFzIHdlbGwgYXMgdGhlCisJICBwYWdlIGl0c2VsZi4KKwktIFVwZGF0ZSBmcy9udGZzL21mdC5jOjp3cml0ZV9tZnRfcmVjb3JkX25vbG9jaygpIGFuZCBzeW5jX21mdF9taXJyb3IoKQorCSAgdG8gY29wZSB3aXRoIHRoZSBmYWN0IHRoYXQgdGhlcmUgbm93IGFyZSBkaXJ0eSBidWZmZXJzIGluIG1mdCBwYWdlcy4KKwktIFVwZGF0ZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfd3JpdGVfaW5vZGUoKSB0byBhbHNvIHVzZSB0aGUgaGVscGVyCisJICBtYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkgYW5kIHRodXMgdG8gc2V0IHRoZSBidWZmZXJzIGJlbG9uZ2luZyB0byB0aGUKKwkgIG1mdCByZWNvcmQgZGlydHkgYXMgd2VsbCBhcyB0aGUgcGFnZSBpdHNlbGYuCisJLSBGaXggY29tcGlsZXIgd2FybmluZ3Mgb24geDg2LTY0IGluIGZzL250ZnMvZGlyLmMuICAoUmFuZHkgRHVubGFwLAorCSAgc2xpZ2h0bHkgbW9kaWZpZWQgYnkgbWUpCisJLSBBZGQgZnMvbnRmcy9tZnQuYzo6dHJ5X21hcF9tZnRfcmVjb3JkKCkgd2hpY2ggZmFpbHMgd2l0aCAtRUFMUkVBRFkgaWYKKwkgIHRoZSBtZnQgcmVjb3JkIGlzIGFscmVhZHkgbG9ja2VkIGFuZCBvdGhlcndpc2UgYmVoYXZlcyB0aGUgc2FtZSB3YXkKKwkgIGFzIGZzL250ZnMvbWZ0LmM6Om1hcF9tZnRfcmVjb3JkKCkuCisJLSBNb2RpZnkgZnMvbnRmcy9tZnQuYzo6d3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKSBzbyB0aGF0IGl0IG9ubHkKKwkgIHdyaXRlcyB0aGUgbWZ0IHJlY29yZCBpZiB0aGUgYnVmZmVycyBiZWxvbmdpbmcgdG8gaXQgYXJlIGRpcnR5LgorCSAgT3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGF0IGl0IHdhcyB3cml0dGVuIG91dCBieSBvdGhlciBtZWFucyBhbHJlYWR5LgorCS0gQXR0ZW1wdGluZyB0byB3cml0ZSBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUgaXMgX25vdF8gYSBidWcgc28gcmVtb3ZlCisJICB0aGUgYnVnIGNoZWNrIGZyb20gZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfbXN0X2Jsb2NrKCkuICBJdCBpcyBpbgorCSAgZmFjdCByZXF1aXJlZCB0byB3cml0ZSBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUgd2hlbiBwcmVwYXJpbmcgdG8KKwkgIGV4dGVuZCB0aGUgaW5pdGlhbGl6ZWQgc2l6ZS4KKwktIE1hcCB0aGUgcGFnZSBpbnN0ZWFkIG9mIHVzaW5nIHBhZ2VfYWRkcmVzcygpIGJlZm9yZSB3cml0aW5nIHRvIGl0IGluCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19tZnRfd3JpdGVwYWdlKCkuCisJLSBQcm92aWRlIGV4Y2x1c2lvbiBiZXR3ZWVuIG9wZW5pbmcgYW4gaW5vZGUgLyBtYXBwaW5nIGFuIG1mdCByZWNvcmQKKwkgIGFuZCBhY2Nlc3NpbmcgdGhlIG1mdCByZWNvcmQgaW4gZnMvbnRmcy9tZnQuYzo6bnRmc19tZnRfd3JpdGVwYWdlKCkKKwkgIGJ5IHNldHRpbmcgdGhlIHBhZ2Ugbm90IHVwdG9kYXRlIHRocm91Z2hvdXQgbnRmc19tZnRfd3JpdGVwYWdlKCkuCisJLSBDbGVhciB0aGUgcGFnZSB1cHRvZGF0ZSBmbGFnIGluIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlX21zdF9ibG9jaygpCisJICB0byBlbnN1cmUgbm9vbmUgY2FuIHNlZSB0aGUgcGFnZSB3aGlsc3QgdGhlIG1zdCBmaXh1cHMgYXJlIGFwcGxpZWQuCisJLSBBZGQgdGhlIGhlbHBlciBmcy9udGZzL21mdC5jOjpudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKCkgd2hpY2gKKwkgIGNoZWNrcyBpZiBhbiBtZnQgcmVjb3JkIG1heSBiZSB3cml0dGVuIG91dCBzYWZlbHkgb2J0YWluaW5nIGFueQorCSAgbmVjZXNzYXJ5IGxvY2tzIGluIHRoZSBwcm9jZXNzLiAgVGhpcyBpcyB1c2VkIGJ5CisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKS4KKwktIE1vZGlmeSBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSB0byBhbHNvIHdvcmsgZm9yCisJICB3cml0aW5nIG1mdCByZWNvcmRzIGFuZCBpbXByb3ZlIGl0cyBlcnJvciBoYW5kbGluZyBpbiB0aGUgcHJvY2Vzcy4KKwkgIE5vdyBpZiBhbnkgb2YgdGhlIHJlY29yZHMgaW4gdGhlIHBhZ2UgZmFpbCB0byBiZSB3cml0dGVuIG91dCwgYWxsCisJICBvdGhlciByZWNvcmRzIHdpbGwgYmUgd3JpdHRlbiBvdXQgaW5zdGVhZCBvZiBhYm9ydGluZyBjb21wbGV0ZWx5LgorCS0gUmVtb3ZlIG50ZnNfbWZ0X2FvcHMgYW5kIHVwZGF0ZSBhbGwgdXNlcnMgdG8gdXNlIG50ZnNfbXN0X2FvcHMuCisJLSBNb2RpZnkgZnMvbnRmcy9pbm9kZS5jOjpudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgdG8gc2V0IHRoZQorCSAgbnRmc19tc3RfYW9wcyBmb3IgYWxsIGlub2RlcyB3aGljaCBhcmUgTklub01zdFByb3RlY3RlZCgpIGFuZAorCSAgbnRmc19hb3BzIGZvciBhbGwgb3RoZXIgaW5vZGVzLgorCS0gUmVuYW1lIGZzL250ZnMvbWZ0LmM6OnN5bmNfbWZ0X21pcnJvcnssX3Vtb3VudH0oKSB0bworCSAgbnRmc19zeW5jX21mdF9taXJyb3J7LF91bW91bnR9KCkgYW5kIGNoYW5nZSB0aGVpciBwYXJhbWV0ZXJzIHNvIHRoZXkKKwkgIG5vIGxvbmdlciByZXF1aXJlIGFuIG50ZnMgaW5vZGUgdG8gYmUgcHJlc2VudC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwktIENsZWFudXAgdGhlIGVycm9yIGhhbmRsaW5nIGluIGZzL250ZnMvbWZ0LmM6Om50ZnNfc3luY19tZnRfbWlycm9yKCkuCisJLSBDbGVhciB0aGUgcGFnZSB1cHRvZGF0ZSBmbGFnIGluIGZzL250ZnMvbWZ0LmM6Om50ZnNfc3luY19tZnRfbWlycm9yKCkKKwkgIHRvIGVuc3VyZSBub29uZSBjYW4gc2VlIHRoZSBwYWdlIHdoaWxzdCB0aGUgbXN0IGZpeHVwcyBhcmUgYXBwbGllZC4KKwktIFJlbW92ZSB0aGUgbm8gbG9uZ2VyIG5lZWRlZCBmcy9udGZzL21mdC5jOjpudGZzX21mdF93cml0ZXBhZ2UoKSBhbmQKKwkgIGZzL250ZnMvbWZ0LmM6OnRyeV9tYXBfbWZ0X3JlY29yZCgpLgorCS0gRml4IGNhbGxlcnMgb2YgZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSB0byBjYWxsIGl0CisJICB3aXRoIHRoZSBudGZzIGlub2RlIHdoaWNoIGNvbnRhaW5zIHRoZSBwYWdlIHJhdGhlciB0aGFuIHRoZSBudGZzCisJICBpbm9kZSB0aGUgbWZ0IHJlY29yZCBvZiB3aGljaCBpcyBpbiB0aGUgcGFnZS4KKwktIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfcHV0X2lub2RlKCkgYnkgbW92aW5nIHRoZQorCSAgaW5kZXggaW5vZGUgYml0bWFwIGlub2RlIHJlbGVhc2UgY29kZSBmcm9tIHRoZXJlIHRvCisJICBmcy9udGZzL2lub2RlLmM6Om50ZnNfY2xlYXJfYmlnX2lub2RlKCkuICAoVGhhbmtzIHRvIENocmlzdG9waAorCSAgSGVsbHdpZyBmb3Igc3BvdHRpbmcgdGhpcy4pCisJLSBGaXggcmFjZSBjb25kaXRpb24gaW4gZnMvbnRmcy9pbm9kZS5jOjpudGZzX3B1dF9pbm9kZSgpIGJ5IHRha2luZyB0aGUKKwkgIGlub2RlIHNlbWFwaG9yZSBhcm91bmQgdGhlIGNvZGUgdGhhdCBzZXRzIG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vIHRvCisJICBOVUxMIGFuZCByZW9yZ2FuaXplIHRoZSBjb2RlIHRvIG9wdGltaXplIGl0IGEgYml0LiAgKFRoYW5rcyB0bworCSAgQ2hyaXN0b3BoIEhlbGx3aWcgZm9yIHNwb3R0aW5nIHRoaXMuKQorCS0gTW9kaWZ5IGZzL250ZnMvYW9wcy5jOjptYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkgdG8gbm8gbG9uZ2VyIHRha2UgdGhlCisJICBudGZzIGlub2RlIGFzIGEgcGFyYW1ldGVyIGFzIHRoaXMgaXMgY29uZnVzaW5nIGFuZCBtaXNsZWFkaW5nIGFuZCB0aGUKKwkgIG5lZWRlZCBudGZzIGlub2RlIGlzIGF2YWlsYWJsZSB2aWEgTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLgorCSAgQWRhcHQgYWxsIGNhbGxlcnMgdG8gdGhpcyBjaGFuZ2UuCisJLSBNb2RpZnkgZnMvbnRmcy9tZnQuYzo6d3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKSBhbmQKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlX21zdF9ibG9jaygpIHRvIG9ubHkgY2hlY2sgdGhlIGRpcnR5IHN0YXRlCisJICBvZiB0aGUgZmlyc3QgYnVmZmVyIGluIGEgcmVjb3JkIGFuZCB0byB0YWtlIHRoaXMgYXMgdGhlIG50ZnMgcmVjb3JkCisJICBkaXJ0eSBzdGF0ZS4gIFdlIGNhbm5vdCBsb29rIGF0IHRoZSBkaXJ0eSBzdGF0ZSBmb3Igc3Vic2VxdWVudAorCSAgYnVmZmVycyBiZWNhdXNlIHdlIG1pZ2h0IGJlIHJhY2luZyB3aXRoCisJICBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpLgorCS0gTW92ZSB0aGUgc3RhdGljIGlubGluZSBudGZzX2luaXRfYmlnX2lub2RlKCkgZnJvbSBmcy9udGZzL2lub2RlLmMgdG8KKwkgIGlub2RlLmggYW5kIG1ha2UgZnMvbnRmcy9pbm9kZS5jOjpfX250ZnNfaW5pdF9pbm9kZSgpIG5vbi1zdGF0aWMgYW5kCisJICBhZGQgYSBkZWNsYXJhdGlvbiBmb3IgaXQgdG8gaW5vZGUuaC4gIEZpeCBzb21lIGNvbXBpbGF0aW9uIGlzc3VlcworCSAgdGhhdCByZXN1bHRlZCBkdWUgdG8gI2luY2x1ZGVzIGFuZCBoZWFkZXIgZmlsZSBpbnRlcmRlcGVuZGVuY2llcy4KKwktIFNpbXBsaWZ5IHNldHVwIG9mIGlfbW9kZSBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKS4KKwktIEFkZCBoZWxwZXJzIGZzL250ZnMvbGF5b3V0Lmg6Ok1LX01SRUYoKSBhbmQgTUtfTEVfTVJFRigpLgorCS0gTW9kaWZ5IGZzL250ZnMvbWZ0LmM6Om1hcF9leHRlbnRfbWZ0X3JlY29yZCgpIHRvIG9ubHkgdmVyaWZ5IHRoZSBtZnQKKwkgIHJlY29yZCBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgc3BlY2lmaWVkIChpLmUuIG5vdCB6ZXJvKS4KKwktIEFkZCBmcy9udGZzL21mdC5baGNdOjpudGZzX21mdF9yZWNvcmRfYWxsb2MoKSBhbmQgdmFyaW91cyBoZWxwZXIKKwkgIGZ1bmN0aW9ucyB1c2VkIGJ5IGl0LgorCS0gVXBkYXRlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQgd2l0aCBpbnN0cnVjdGlvbnMgb24gaG93IHRvCisJICB1c2UgdGhlIERldmljZS1NYXBwZXIgZHJpdmVyIHdpdGggTlRGUyBmdGRpc2svTERNIHJhaWQuICBUaGlzIHJlbW92ZXMKKwkgIHRoZSBsaW5lYXIgcmFpZCBwcm9ibGVtIHdpdGggdGhlIFNvZnR3YXJlIFJBSUQgLyBNRCBkcml2ZXIgd2hlbiBvbmUKKwkgIG9yIG1vcmUgb2YgdGhlIGRldmljZXMgaGFzIGFuIG9kZCBudW1iZXIgb2Ygc2VjdG9ycy4KKworMi4xLjIwIC0gRml4IHR3byBzdHVwaWQgYnVncyBpbnRyb2R1Y2VkIGluIDIuMS4xOCByZWxlYXNlLgorCisJLSBGaXggc3R1cGlkIGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoKQorCSAgd2hlcmUgd2UgZGlkIG5vdCBjbGVhciBjdHgtPmFsX2VudHJ5IGJ1dCBpdCB3YXMgc3RpbGwgc2V0IGR1ZSB0bworCSAgY2hhbmdlcyBpbiBudGZzX2F0dHJfbG9va3VwKCkgYW5kIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgaW4KKwkgIHBhcnRpY3VsYXIuCisJLSBGaXggYW5vdGhlciBzdHVwaWQgYnVnIGluIGZzL250ZnMvYXR0cmliLmM6Om50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkKKwkgIHdoZXJlIHdlIGZvcmdvdCB0byB1bm1hcCB0aGUgZXh0ZW50IG1mdCByZWNvcmQgd2hlbiB3ZSBoYWQgZmluaXNoZWQKKwkgIGVudW1lcmF0aW5nIGFuIGF0dHJpYnV0ZSB3aGljaCBjYXVzZWQgYSBidWcgY2hlY2sgdG8gdHJpZ2dlciB3aGVuIHRoZQorCSAgVkZTIGNhbGxzIC0+Y2xlYXJfaW5vZGUuCisKKzIuMS4xOSAtIE1hbnkgY2xlYW51cHMsIGltcHJvdmVtZW50cywgYW5kIGEgbWlub3IgYnVnIGZpeC4KKworCS0gVXBkYXRlIC0+c2V0YXR0ciAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3NldGF0dHIoKSkgdG8gcmVmdXNlIHRvCisJICBjaGFuZ2UgdGhlIHVpZCwgZ2lkLCBhbmQgbW9kZSBvZiBhbiBpbm9kZSBhcyB3ZSBkbyBub3Qgc3VwcG9ydCBOVEZTCisJICBBQ0xzIHlldC4KKwktIFJlbW92ZSBCS0wgdXNlIGZyb20gbnRmc19zZXRhdHRyKCkgc3luY2luZyB1cCB3aXRoIHRoZSByZXN0IG9mIHRoZQorCSAga2VybmVsLgorCS0gR2V0IHJpZCBvZiB0aGUgdWdseSB0cmFuc3BhcmVudCB1bmlvbiBpbiBmcy9udGZzL2Rpci5jOjpudGZzX3JlYWRkaXIoKQorCSAgYW5kIG50ZnNfZmlsbGRpcigpIGFzIHBlciBzdWdnZXN0aW9uIGZyb20gQWwgVmlyby4KKwktIENoYW5nZSAnXDAnIGFuZCBMJ1wwJyB0byBzaW1wbHkgMCBhcyBwZXIgYWR2aWNlIGZyb20gTGludXMgVG9ydmFsZHMuCisJLSBVcGRhdGUgLT50cnVuY2F0ZSAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3RydW5jYXRlKCkpIHRvIGNoZWNrIGlmIHRoZQorCSAgaW5vZGUgc2l6ZSBoYXMgY2hhbmdlZCBhbmQgdG8gb25seSBvdXRwdXQgYW4gZXJyb3IgaWYgc28uCisJLSBSZW5hbWUgZnMvbnRmcy9hdHRyaWIuaDo6YXR0cmlidXRlX3ZhbHVlX2xlbmd0aCgpIHRvIG50ZnNfYXR0cl9zaXplKCkuCisJLSBBZGQgbGV7MTYsMzIsNjR9IGFzIHdlbGwgYXMgc2xlezE2LDMyLDY0fSBkYXRhIHR5cGVzIHRvCisJICBmcy9udGZzL3R5cGVzLmguCisJLSBDaGFuZ2UgbnRmc2NoYXIgdG8gYmUgbGUxNiBpbnN0ZWFkIG9mIHUxNiBpbiBmcy9udGZzL3R5cGVzLmguCisJLSBBZGQgbGUgdmVyc2lvbnMgb2YgVkNOLCBMQ04sIGFuZCBMU04gY2FsbGVkIGxlVkNOLCBsZUxDTiwgYW5kIGxlTFNOLAorCSAgcmVzcGVjdGl2ZWx5LCB0byBmcy9udGZzL3R5cGVzLmguCisJLSBVcGRhdGUgZW5kaWFubmVzcyBjb252ZXJzaW9uIG1hY3JvcyBpbiBmcy9udGZzL2VuZGlhbi5oIHRvIHVzZSB0aGUKKwkgIG5ldyB0eXBlcyBhcyBhcHByb3ByaWF0ZS4KKwktIERvIHByb3BlciB0eXBlIGNhc3Rpbmcgd2hlbiB1c2luZyBzbGU2NF90b19jcHVwKCkgaW4gZnMvbnRmcy9kaXIuYworCSAgYW5kIGluZGV4LmMuCisJLSBBZGQgbGVNRlRfUkVGIGRhdGEgdHlwZSB0byBmcy9udGZzL2xheW91dC5oLgorCS0gVXBkYXRlIGFsbCBOVEZTIGhlYWRlciBmaWxlcyB3aXRoIHRoZSBuZXcgbGl0dGxlIGVuZGlhbiBkYXRhIHR5cGVzLgorCSAgQWZmZWN0ZWQgZmlsZXMgYXJlIGZzL250ZnMvbGF5b3V0LmgsIGxvZ2ZpbGUuaCwgYW5kIHRpbWUuaC4KKwktIERvIHByb3BlciB0eXBlIGNhc3Rpbmcgd2hlbiB1c2luZyBudGZzX2lzXypfcmVjb3JkcCgpIGluCisJICBmcy9udGZzL2xvZ2ZpbGUuYywgbWZ0LmMsIGFuZCBzdXBlci5jLiAKKwktIEZpeCBhbGwgdGhlIHNwYXJzZSBiaXR3aXNlIHdhcm5pbmdzLiAgSGFkIHRvIGNoYW5nZSBhbGwgdGhlIHR5cGVkZWYKKwkgIGVudW1zIHN0b3JpbmcgbGl0dGxlIGVuZGlhbiB2YWx1ZXMgdG8gc2ltcGxlIGVudW1zIHBsdXMgYSB0eXBlZGVmIGZvcgorCSAgdGhlIGRhdGF0eXBlIHRvIG1ha2Ugc3BhcnNlIGhhcHB5LgorCS0gRml4IGEgYnVnIGZvdW5kIGJ5IHRoZSBuZXcgc3BhcnNlIGJpdHdpc2Ugd2FybmluZ3Mgd2hlcmUgdGhlIGRlZmF1bHQKKwkgIHVwY2FzZSB0YWJsZSB3YXMgZGVmaW5lZCBhcyBhIHBvaW50ZXIgdG8gd2NoYXJfdCByYXRoZXIgdGhhbiBudGZzY2hhcgorCSAgaW4gZnMvbnRmcy9udGZzLmggYW5kIHN1cGVyLmMuCisJLSBDaGFuZ2Uge2NvbnN0Xyx9Y3B1X3RvX2xlezE2LDMyfSgwKSB0byBqdXN0IDAgYXMgc3VnZ2VzdGVkIGJ5IEFsIFZpcm8uCisKKzIuMS4xOCAtIEZpeCBzY2hlZHVsaW5nIGxhdGVuY2llcyBhdCBtb3VudCB0aW1lIGFzIHdlbGwgYXMgYW4gZW5kaWFubmVzcyBidWcuCisKKwktIFJlbW92ZSB2b2wtPm5yX21mdF9yZWNvcmRzIGFzIGl0IHdhcyBwcmV0dHkgbWVhbmluZ2xlc3MgYW5kIG9wdGltaXplCisJICB0aGUgY2FsY3VsYXRpb24gb2YgdG90YWwvZnJlZSBpbm9kZXMgYXMgdXNlZCBieSBzdGF0ZnMoKS4KKwktIEZpeCBzY2hlZHVsaW5nIGxhdGVuY2llcyBpbiBudGZzX2ZpbGxfc3VwZXIoKSBieSBkcm9wcGluZyB0aGUgQktMCisJICBiZWNhdXNlIHRoZSBjb2RlIGl0c2VsZiBpcyB1c2luZyB0aGUgbnRmc19sb2NrIHNlbWFwaG9yZSB3aGljaAorCSAgcHJvdmlkZXMgc2FmZSBsb2NraW5nLiAgKEluZ28gTW9sbmFyKQorCS0gRml4IGEgcG90ZW50aWFsIGJ1ZyBpbiBmcy9udGZzL21mdC5jOjptYXBfZXh0ZW50X21mdF9yZWNvcmQoKSB0aGF0CisJICBjb3VsZCBvY2N1ciBpbiB0aGUgZnV0dXJlIGZvciB3aGVuIHdlIHN0YXJ0IGNsb3NpbmcvZnJlZWluZyBleHRlbnQKKwkgIGlub2RlcyBpZiB3ZSBkb24ndCBzZXQgYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MgdG8gTlVMTCBhZnRlcgorCSAgd2UgZnJlZSBpdC4KKwktIFJlbmFtZSB7ZmluZCxsb29rdXB9X2F0dHIoKSB0byBudGZzX2F0dHJfe2ZpbmQsbG9va3VwfSgpIGFzIHdlbGwgYXMKKwkgIGZpbmRfZXh0ZXJuYWxfYXR0cigpIHRvIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgdG8gY2xlYW51cCB0aGUKKwkgIG5hbWVzcGFjZSBhIGJpdCBhbmQgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggbGlibnRmcy4KKwktIFJlbmFtZSB7e3JlLH1pbml0LGdldCxwdXR9X2F0dHJfc2VhcmNoX2N0eCgpIHRvCisJICBudGZzX2F0dHJfe3tyZSx9aW5pdCxnZXQscHV0fV9zZWFyY2hfY3R4KCkgYXMgd2VsbCBhcyB0aGUgdHlwZQorCSAgYXR0cl9zZWFyY2hfY29udGV4dCB0byBudGZzX2F0dHJfc2VhcmNoX2N0eC4KKwktIEZvcmNlIHVzZSBvZiBudGZzX2F0dHJfZmluZCgpIGluIG50ZnNfYXR0cl9sb29rdXAoKSB3aGVuIHNlYXJjaGluZworCSAgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXRzZWxmLgorCS0gRml4IGVuZGlhbm5lc3MgYnVnIGluIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkuCisJLSBDaGFuZ2UgbnRmc197ZXh0ZXJuYWxfLH1hdHRyX2ZpbmQoKSB0byByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRU5PRU5UCisJICBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgYW5kIC1FSU8gb24gcmVhbCBlcnJvci4gIEluIHRoZSBjYXNlCisJICBvZiAtRU5PRU5ULCB0aGUgc2VhcmNoIGNvbnRleHQgaXMgdXBkYXRlZCB0byBkZXNjcmliZSB0aGUgYXR0cmlidXRlCisJICBiZWZvcmUgd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZQorCSAgaW5zZXJ0ZWQgaWYgc3VjaCBhbiBhY3Rpb24gd2VyZSB0byBiZSBkZXNpcmVkIGFuZCBpbiB0aGUgY2FzZSBvZgorCSAgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSB0aGUgc2VhcmNoIGNvbnRleHQgaXMgYWxzbyB1cGRhdGVkIHRvCisJICBpbmRpY2F0ZSB0aGUgYXR0cmlidXRlIGxpc3QgZW50cnkgYmVmb3JlIHdoaWNoIHRoZSBhdHRyaWJ1dGUgbGlzdAorCSAgZW50cnkgb2YgdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZSBpbnNlcnRlZAorCSAgaWYgc3VjaCBhbiBhY3Rpb24gd2VyZSB0byBiZSBkZXNpcmVkLiAgQWxzbyBtYWtlIG50ZnNfZmluZF9hdHRyKCkKKwkgIHN0YXRpYyBhbmQgcmVtb3ZlIGl0cyBwcm90b3R5cGUgZnJvbSBhdHRyaWIuaCBhcyBpdCBpcyBub3QgdXNlZAorCSAgYW55d2hlcmUgb3RoZXIgdGhhbiBhdHRyaWIuYy4gIFVwZGF0ZSBudGZzX2F0dHJfbG9va3VwKCkgYW5kIGFsbAorCSAgY2FsbGVycyBvZiBudGZzX3tleHRlcm5hbCx9YXR0cl97ZmluZCxsb29rdXB9KCkgZm9yIHRoZSBuZXcgcmV0dXJuCisJICB2YWx1ZXMuCisJLSBNaW5vciBjbGVhbnVwIG9mIGZzL250ZnMvaW5vZGUuYzo6bnRmc19pbml0X2xvY2tlZF9pbm9kZSgpLgorCisyLjEuMTcgLSBGaXggYnVncyBpbiBtb3VudCB0aW1lIGVycm9yIGNvZGUgcGF0aHMgYW5kIG90aGVyIHVwZGF0ZXMuCisKKwktIEltcGxlbWVudCBiaXRtYXAgbW9kaWZpY2F0aW9uIGNvZGUgKGZzL250ZnMvYml0bWFwLltoY10pLiAgVGhpcworCSAgaW5jbHVkZXMgZnVuY3Rpb25zIHRvIHNldC9jbGVhciBhIHNpbmdsZSBiaXQgb3IgYSBydW4gb2YgYml0cy4KKwktIEFkZCBmcy9udGZzL2F0dHJpYi5baGNdOjpudGZzX2ZpbmRfdmNuKCkgd2hpY2ggcmV0dXJucyB0aGUgbG9ja2VkCisJICBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBhIHBhcnRpY3VsYXIgdmNuLiAgSXQgYWxzbyB0YWtlcyBjYXJlIG9mCisJICBtYXBwaW5nIGFueSBuZWVkZWQgcnVubGlzdCBmcmFnbWVudHMuCisJLSBJbXBsZW1lbnQgY2x1c3RlciAoZGUtKWFsbG9jYXRpb24gY29kZSAoZnMvbnRmcy9sY25hbGxvYy5baGNdKS4KKwktIExvYWQgYXR0cmlidXRlIGRlZmluaXRpb24gdGFibGUgZnJvbSAkQXR0ckRlZiBhdCBtb3VudCB0aW1lLgorCS0gRml4IGJ1Z3MgaW4gbW91bnQgdGltZSBlcnJvciBjb2RlIHBhdGhzIGludm9sdmluZyAoZGUpYWxsb2NhdGlvbiBvZgorCSAgdGhlIGRlZmF1bHQgYW5kIHZvbHVtZSB1cGNhc2UgdGFibGVzLgorCS0gUmVtb3ZlIG50ZnNfbnJfbW91bnRzIGFzIGl0IGlzIG5vIGxvbmdlciB1c2VkLgorCisyLjEuMTYgLSBJbXBsZW1lbnQgYWNjZXNzIHRpbWUgdXBkYXRlcywgZmlsZSBzeW5jLCBhc3luYyBpbywgYW5kIHJlYWQvd3JpdGV2LgorCisJLSBBZGQgc3VwcG9ydCBmb3IgcmVhZHYvd3JpdGV2IGFuZCBhaW9fcmVhZC9haW9fd3JpdGUgKGZzL250ZnMvZmlsZS5jKS4KKwkgIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBmaWxlIG9wZXJhdGlvbnMgcG9pbnRlcnMgdG8KKwkgIHRoZSBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgbW0vZmlsZW1hcC5jLgorCS0gSW1wbGVtZW50IGZzeW5jLCBmZGF0YXN5bmMsIGFuZCBtc3luYyBib3RoIGZvciBmaWxlcyAoZnMvbnRmcy9maWxlLmMpCisJICBhbmQgZGlyZWN0b3JpZXMgKGZzL250ZnMvZGlyLmMpLgorCS0gQWRkIHN1cHBvcnQgZm9yIHthLG0sY310aW1lIHVwZGF0ZXMgdG8gaW5vZGUuYzo6bnRmc193cml0ZV9pbm9kZSgpLgorCSAgTm90ZSwgZXhjZXB0IGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgYW5kIGFueSBvdGhlciBzeXN0ZW0gZmlsZXMgb3BlbmVkCisJICBieSB0aGUgdXNlciwgdGhlIHN5c3RlbSBmaWxlcyB3aWxsIG5vdCBoYXZlIHRoZWlyIGFjY2VzcyB0aW1lcworCSAgdXBkYXRlZCBhcyB0aGV5IGFyZSBvbmx5IGFjY2Vzc2VkIGF0IHRoZSBpbm9kZSBsZXZlbCBhbiBoZW5jZSB0aGUKKwkgIGZpbGUgbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIGNhdXNlIHRoZSB0aW1lcyB0byBiZSB1cGRhdGVkIGFyZSBuZXZlcgorCSAgaW52b2tlZC4KKworMi4xLjE1IC0gSW52YWxpZGF0ZSBxdW90YXMgd2hlbiAocmUpbW91bnRpbmcgcmVhZC13cml0ZS4KKworCS0gQWRkIG5ldyBlbGVtZW50IGl0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlIHRvIHRoZSBudGZzIGlub2RlCisJICBzdHJ1Y3R1cmUgYW5kIHNldCBpdCBhcHByb3ByaWF0ZWx5IGluIG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKS4KKwktIEltcGxlbWVudCBhIG5ldyBpbm9kZSB0eXBlICJpbmRleCIgdG8gYWxsb3cgZWZmaWNpZW50IGFjY2VzcyB0byB0aGUKKwkgIGluZGljZXMgZm91bmQgaW4gdmFyaW91cyBzeXN0ZW0gZmlsZXMgYW5kIGFkYXB0IGlub2RlIGhhbmRsaW5nCisJICBhY2NvcmRpbmdseSAoZnMvbnRmcy9pbm9kZS5baGNdKS4gIEFuIGluZGV4IGlub2RlIGlzIGVzc2VudGlhbGx5IGFuCisJICBhdHRyaWJ1dGUgaW5vZGUgKE5Jbm9BdHRyKCkgaXMgdHJ1ZSkgd2l0aCBhbiBhdHRyaWJ1dGUgdHlwZSBvZgorCSAgQVRfSU5ERVhfQUxMT0NBVElPTi4gIEFzIHN1Y2gsIGl0IGlzIG5vIGxvbmdlciBhbGxvd2VkIHRvIGNhbGwKKwkgIG50ZnNfYXR0cl9pZ2V0KCkgd2l0aCBhbiBhdHRyaWJ1dGUgdHlwZSBvZiBBVF9JTkRFWF9BTExPQ0FUSU9OIGFzCisJICB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBub3JtYWwgYXR0cmlidXRlIGlub2RlcworCSAgYW5kIGluZGV4IGlub2Rlcy4gIFRoZSBmdW5jdGlvbiB0byBvYnRhaW4gYW4gaW5kZXggaW5vZGUgaXMKKwkgIG50ZnNfaW5kZXhfaWdldCgpIGFuZCBpdCB1c2VzIHRoZSBoZWxwZXIgZnVuY3Rpb24KKwkgIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoKS4gIE5vdGUsIHdlIGRvIG5vdCBvdmVybG9hZAorCSAgbnRmc19hdHRyX2lnZXQoKSBhcyBpbmRpY2VzIGNvbnNpc3Qgb2YgbXVsdGlwbGUgYXR0cmlidXRlcyBzbyB1c2luZworCSAgbnRmc19hdHRyX2lnZXQoKSB0byBvYnRhaW4gYW4gaW5kZXggaW5vZGUgd291bGQgYmUgY29uZnVzaW5nLgorCS0gRW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gb3ZlcmZsb3cgd2hlbiBkb2luZyBwYWdlLT5pbmRleCA8PAorCSAgUEFHRV9DQUNIRV9TSElGVCBieSBjYXN0aW5nIHBhZ2UtPmluZGV4IHRvIHM2NCBpbiBmcy9udGZzL2FvcHMuYy4KKwktIFVzZSBhdG9taWMga21hcCBpbnN0ZWFkIG9mIGttYXAoKSBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX3BhZ2UoKQorCSAgYW5kIG50ZnNfcmVhZF9ibG9jaygpLgorCS0gVXNlIGNhc2Ugc2Vuc2l0aXZlIGF0dHJpYnV0ZSBsb29rdXBzIGluc3RlYWQgb2YgY2FzZSBpbnNlbnNpdGl2ZSBvbmVzLgorCS0gTG9jayBhbGwgcGFnZSBjYWNoZSBwYWdlcyBiZWxvbmdpbmcgdG8gbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGVzIHdoaWxlCisJICBhY2Nlc3NpbmcgdGhlbSB0byBlbnN1cmUgd2UgbmV2ZXIgc2VlIGNvcnJ1cHQgZGF0YSB3aGlsZSB0aGUgcGFnZSBpcworCSAgdW5kZXIgd3JpdGVvdXQuCisJLSBBZGQgZnJhbWV3b3JrIGZvciBnZW5lcmljIG50ZnMgY29sbGF0aW9uIChmcy9udGZzL2NvbGxhdGlvbi5baGNdKS4KKwkgIFdlIGhhdmUgbnRmc19pc19jb2xsYXRpb25fcnVsZV9zdXBwb3J0ZWQoKSB0byBjaGVjayBpZiB0aGUgY29sbGF0aW9uCisJICBydWxlIHlvdSB3YW50IHRvIHVzZSBpcyBzdXBwb3J0ZWQgYW5kIG50ZnNfY29sbGF0aW9uKCkgd2hpY2ggYWN0dWFsbHkKKwkgIGNvbGxhdGVzIHR3byBkYXRhIGl0ZW1zLiAgV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBDT0xMQVRJT05fQklOQVJZCisJICBhbmQgQ09MTEFUSU9OX05UT0ZTX1VMT05HIGJ1dCBzdXBwb3J0IGZvciBvdGhlciBjb2xsYXRpb24gcnVsZXMgd2lsbAorCSAgYmUgYWRkZWQgYXMgdGhlIG5lZWQgYXJpc2VzLgorCS0gQWRkIGEgbmV3IHR5cGUsIG50ZnNfaW5kZXhfY29udGV4dCwgdG8gYWxsb3cgcmV0cmlldmFsIG9mIGFuIGluZGV4CisJICBlbnRyeSB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBrZXkuICBUbyBnZXQgYW4gaW5kZXggY29udGV4dCwKKwkgIHVzZSBudGZzX2luZGV4X2N0eF9nZXQoKSBhbmQgdG8gcmVsZWFzZSBpdCwgdXNlIG50ZnNfaW5kZXhfY3R4X3B1dCgpLgorCSAgVGhpcyBhbHNvIGFkZHMgYSBuZXcgc2xhYiBjYWNoZSBmb3IgdGhlIGluZGV4IGNvbnRleHRzLiAgVG8gbG9va3VwIGEKKwkgIGtleSBpbiBhbiBpbmRleCBpbm9kZSwgdXNlIG50ZnNfaW5kZXhfbG9va3VwKCkuICBBZnRlciBtb2RpZnlpbmcgYW4KKwkgIGluZGV4IGVudHJ5LCBjYWxsIG50ZnNfaW5kZXhfZW50cnlfZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb2xsb3dlZCBieQorCSAgbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkgdG8gZW5zdXJlIHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIG91dAorCSAgdG8gZGlzay4gIEZvciBkZXRhaWxzIHNlZSBmcy9udGZzL2luZGV4LltoY10uICBOb3RlLCBhdCBwcmVzZW50LCBpZgorCSAgYW4gaW5kZXggZW50cnkgaXMgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIHJhdGhlciB0aGFuIHRoZQorCSAgaW5kZXggcm9vdCBhdHRyaWJ1dGUgaXQgd2lsbCBub3QgYmUgd3JpdHRlbiBvdXQgKHlvdSB3aWxsIGdldCBhCisJICB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgZGlzY2FyZGVkIGNoYW5nZXMgaW5zdGVhZCkuCisJLSBMb2FkIHRoZSBxdW90YSBmaWxlICgkUXVvdGEpIGFuZCBjaGVjayBpZiBxdW90YSB0cmFja2luZyBpcyBlbmFibGVkCisJICBhbmQgaWYgc28sIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZS4gIFRoaXMgY2F1c2VzIHdpbmRvd3MgdG8KKwkgIHJlc2NhbiB0aGUgdm9sdW1lIG9uIGJvb3QgYW5kIHVwZGF0ZSBhbGwgcXVvdGEgZW50cmllcy4KKwktIEFkZCBhIHNldF9wYWdlX2RpcnR5IGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9uIGZvciBudGZzX21bZnNddF9hb3BzLgorCSAgSXQgaXMgc2ltcGx5IHNldCB0byBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycygpIHRvIG1ha2Ugc3VyZSB0aGF0CisJICBydW5uaW5nIHNldF9wYWdlX2RpcnR5KCkgb24gYSBwYWdlIGNvbnRhaW5pbmcgbWZ0L250ZnMgcmVjb3JkcyB3aWxsCisJICBub3QgYWZmZWN0IHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgcGFnZSBidWZmZXJzLgorCS0gQWRkIGZzL250ZnMvaW5kZXguYzo6X19udGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKSB3aGljaCBzZXRzIGFsbAorCSAgYnVmZmVycyB0aGF0IGFyZSBpbnNpZGUgdGhlIG50ZnMgcmVjb3JkIGluIHRoZSBwYWdlIGRpcnR5IGFmdGVyIHdoaWNoCisJICBpdCBzZXRzIHRoZSBwYWdlIGRpcnR5LiAgVGhpcyBhbGxvd3MgLT53cml0ZXBhZ2UgdG8gb25seSB3cml0ZSB0aGUKKwkgIGRpcnR5IGluZGV4IHJlY29yZHMgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHdyaXRlIGFsbCB0aGUgcmVjb3JkcyBpbgorCSAgdGhlIHBhZ2UuICBNb2RpZnkgZnMvbnRmcy9pbmRleC5oOjpudGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKSB0bworCSAgdXNlIHRoaXMgcmF0aGVyIHRoYW4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMoKS4KKwktIEltcGxlbWVudCBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSB3aGljaCBlbmFibGVzIHRoZQorCSAgd3JpdGluZyBvZiBwYWdlIGNhY2hlIHBhZ2VzIGJlbG9uZ2luZyB0byBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZXMKKwkgIGxpa2UgdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGluIGRpcmVjdG9yeSBpbmRpY2VzIGFuZCBvdGhlcgorCSAgaW5kaWNlcyBsaWtlICRRdW90YS8kUSwgZXRjLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBxdW90YSBpcyBub3cgbWFya2VkCisJICBvdXQgb2YgZGF0ZSBvbiBhbGwgdm9sdW1lcyByYXRoZXIgdGhhbiBvbmx5IG9uIG9uZXMgd2hlcmUgdGhlIHF1b3RhCisJICBkZWZhdWx0cyBlbnRyeSBpcyBpbiB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgb2YgdGhlICRRdW90YS8kUSBpbmRleC4KKworMi4xLjE0IC0gRml4IGFuIE5GU2QgY2F1c2VkIGRlYWRsb2NrIHJlcG9ydGVkIGJ5IHNldmVyYWwgdXNlcnMuCisKKwktIE1vZGlmeSBmcy9udGZzL250ZnNfcmVhZGRpcigpIHRvIGNvcHkgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIHZhbHVlCisJICB0byBhIGJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBwdXQgdGhlIHNlYXJjaCBjb250ZXh0IGFuZCB1bm1hcCB0aGUgbWZ0CisJICByZWNvcmQgYmVmb3JlIGNhbGxpbmcgdGhlIGZpbGxkaXIoKSBjYWxsYmFjay4gIFdlIG5lZWQgdG8gZG8gdGhpcworCSAgYmVjYXVzZSBvZiBORlNkIHdoaWNoIGNhbGxzIC0+bG9va3VwKCkgZnJvbSBpdHMgZmlsbGRpciBjYWxsYmFjaygpCisJICBhbmQgdGhpcyBjYXVzZXMgTlRGUyB0byBkZWFkbG9jayBhcyBudGZzX2xvb2t1cCgpIG1hcHMgdGhlIG1mdCByZWNvcmQKKwkgIG9mIHRoZSBkaXJlY3RvcnkgYW5kIHNpbmNlIG50ZnNfcmVhZGRpcigpIGhhcyBnb3QgaXQgbWFwcGVkIGFscmVhZHkKKwkgIG50ZnNfbG9va3VwKCkgZGVhZGxvY2tzLgorCisyLjEuMTMgLSBFbmFibGUgb3ZlcndyaXRpbmcgb2YgcmVzaWRlbnQgZmlsZXMgYW5kIGhvdXNla2VlcGluZyBvZiBzeXN0ZW0gZmlsZXMuCisKKwktIEltcGxlbWVudCB3cml0aW5nIG9mIG1mdCByZWNvcmRzIChmcy9udGZzL21mdC5baGNdKSwgd2hpY2ggaW5jbHVkZXMKKwkgIGtlZXBpbmcgdGhlIG1mdCBtaXJyb3IgaW4gc3luYyB3aXRoIHRoZSBtZnQgd2hlbiBtaXJyb3JlZCBtZnQgcmVjb3JkcworCSAgYXJlIHdyaXR0ZW4uICBUaGUgZnVuY3Rpb25zIGFyZSB3cml0ZV9tZnRfcmVjb3Jkeyxfbm9sb2NrfSgpLiAgVGhlCisJICBpbXBsZW1lbnRhdGlvbiBpcyBxdWl0ZSBydWRpbWVudGFyeSBmb3Igbm93IHdpdGggbG90cyBvZiB0aGluZ3Mgbm90CisJICBpbXBsZW1lbnRlZCB5ZXQgYnV0IEkgYW0gbm90IHN1cmUgYW55IG9mIHRoZW0gY2FuIGFjdHVhbGx5IG9jY3VyIHNvCisJICBJIHdpbGwgd2FpdCBmb3IgcGVvcGxlIHRvIGhpdCBlYWNoIG9uZSBhbmQgb25seSB0aGVuIGltcGxlbWVudCBpdC4KKwktIENvbW1pdCBvcGVuIHN5c3RlbSBpbm9kZXMgYXQgdW1vdW50IHRpbWUuICBUaGlzIHNob3VsZCBtYWtlIGl0CisJICB2aXJ0dWFsbHkgaW1wb3NzaWJsZSBmb3Igc3luY19tZnRfbWlycm9yX3Vtb3VudCgpIHRvIGV2ZXIgYmUgbmVlZGVkLgorCS0gSW1wbGVtZW50IC0+d3JpdGVfaW5vZGUgKGZzL250ZnMvaW5vZGUuYzo6bnRmc193cml0ZV9pbm9kZSgpKSBmb3IgdGhlCisJICBudGZzIHN1cGVyIG9wZXJhdGlvbnMuICBUaGlzIGdpdmVzIHVzIGlub2RlIHdyaXRpbmcgdmlhIHRoZSBWRlMgaW5vZGUKKwkgIGRpcnR5IGNvZGUgcGF0aHMuICBOb3RlOiAgQWNjZXNzIHRpbWUgdXBkYXRlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4KKwktIEltcGxlbWVudCBmcy9udGZzL21mdC5baGNdOjp7LF9ffW1hcmtfbWZ0X3JlY29yZF9kaXJ0eSgpIGFuZCBtYWtlCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZXBhZ2UoKSBhbmQgbnRmc19jb21taXRfd3JpdGUoKSB1c2UgaXQsIHRodXMKKwkgIGZpbmFsbHkgZW5hYmxpbmcgcmVzaWRlbnQgZmlsZSBvdmVyd3JpdGUhICAoLTggIFRoaXMgYWxzbyBpbmNsdWRlcyBhCisJICBwbGFjZWhvbGRlciBmb3IgLT53cml0ZXBhZ2UgKG50ZnNfbWZ0X3dyaXRlcGFnZSgpKSwgd2hpY2ggZm9yIG5vdworCSAganVzdCByZWRpcnRpZXMgdGhlIHBhZ2UgYW5kIHJldHVybnMuICBBbHNvLCBhdCB1bW91bnQgdGltZSwgd2UgZm9yCisJICBub3cgdGhyb3cgYXdheSBhbGwgbWZ0IGRhdGEgcGFnZSBjYWNoZSBwYWdlcyBhZnRlciB0aGUgbGFzdCBjYWxsIHRvCisJICBudGZzX2NvbW1pdF9pbm9kZSgpIGluIHRoZSBob3BlIHRoYXQgYWxsIGlub2RlcyB3aWxsIGhhdmUgYmVlbgorCSAgd3JpdHRlbiBvdXQgYnkgdGhlbiBhbmQgaGVuY2Ugbm8gZGlydHkgKG1ldGEpZGF0YSB3aWxsIGJlIGxvc3QuICBXZQorCSAgYWxzbyBjaGVjayBmb3IgdGhpcyBjYXNlIGFuZCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgdGVsbGluZyB0aGUgdXNlcgorCSAgdG8gcnVuIGNoa2Rzay4KKwktIFVzZSBzZXRfcGFnZV93cml0ZWJhY2soKSBhbmQgZW5kX3BhZ2Vfd3JpdGViYWNrKCkgaW4gdGhlIHJlc2lkZW50CisJICBhdHRyaWJ1dGUgY29kZSBwYXRoIG9mIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlcGFnZSgpIG90aGVyd2lzZQorCSAgdGhlIHJhZGl4LXRyZWUgdGFnIFBBR0VDQUNIRV9UQUdfRElSVFkgcmVtYWlucyBzZXQgZXZlbiB0aG91Z2ggdGhlCisJICBwYWdlIGlzIGNsZWFuLgorCS0gSW1wbGVtZW50IG50ZnNfbWZ0X3dyaXRlcGFnZSgpIHNvIGl0IG5vdyBjaGVja3MgaWYgYW55IG9mIHRoZSBtZnQKKwkgIHJlY29yZHMgaW4gdGhlIHBhZ2UgYXJlIGRpcnR5IGFuZCBpZiBzbyByZWRpcnRpZXMgdGhlIHBhZ2UgYW5kCisJICByZXR1cm5zLiAgT3RoZXJ3aXNlIGl0IGp1c3QgcmV0dXJucyAoYWZ0ZXIgZG9pbmcgc2V0X3BhZ2Vfd3JpdGViYWNrKCksCisJICB1bmxvY2tfcGFnZSgpLCBlbmRfcGFnZV93cml0ZWJhY2soKSBvciB0aGUgcmFkaXgtdHJlZSB0YWcKKwkgIFBBR0VDQUNIRV9UQUdfRElSVFkgcmVtYWlucyBzZXQgZXZlbiB0aG91Z2ggdGhlIHBhZ2UgaXMgY2xlYW4pLCB0aHVzCisJICBhbG93aW5nIHRoZSBWTSB0byBkbyB3aXRoIHRoZSBwYWdlIGFzIGl0IHBsZWFzZXMuICBBbHNvLCBhdCB1bW91bnQKKwkgIHRpbWUsIG5vdyBvbmx5IHRocm93IGF3YXkgZGlydHkgbWZ0IChtZXRhKWRhdGEgcGFnZXMgaWYgZGlydHkgaW5vZGVzCisJICBhcmUgcHJlc2VudCBhbmQgYXNrIHRoZSB1c2VyIHRvIGVtYWlsIHVzIGlmIHRoZXkgc2VlIHRoaXMgaGFwcGVuaW5nLgorCS0gQWRkIGZ1bmN0aW9ucyBudGZzX3tjbGVhcixzZXR9X3ZvbHVtZV9mbGFncygpLCB0byBtb2RpZnkgdGhlIHZvbHVtZQorCSAgaW5mb3JtYXRpb24gZmxhZ3MgKGZzL250ZnMvc3VwZXIuYykuCisJLSBNYXJrIHRoZSB2b2x1bWUgZGlydHkgd2hlbiAocmUpbW91bnRpbmcgcmVhZC13cml0ZSBhbmQgbWFyayBpdCBjbGVhbgorCSAgd2hlbiB1bm1vdW50aW5nIG9yIHJlbW91bnRpbmcgcmVhZC1vbmx5LiAgSWYgYW55IHZvbHVtZSBlcnJvcnMgYXJlCisJICBmb3VuZCwgdGhlIHZvbHVtZSBpcyBsZWZ0IG1hcmtlZCBkaXJ0eSB0byBmb3JjZSBjaGtkc2sgdG8gcnVuLgorCS0gQWRkIGNvZGUgdG8gc2V0IHRoZSBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIHdoZW4gKHJlKW1vdW50aW5nCisJICByZWFkLXdyaXRlIGZvciBuZXdlciBOVEZTIHZlcnNpb25zIGJ1dCBsZWF2ZSBpdCBjb21tZW50ZWQgb3V0IGZvciBub3cKKwkgIHNpbmNlIHdlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zIHRoYXQgYXJlIE5URlMgMS4yIHNwZWNpZmljIHlldAorCSAgYW5kIHNpbmNlIHNldHRpbmcgdGhpcyBmbGFnIGJyZWFrcyBDYXB0aXZlLU5URlMgd2hpY2ggaXMgbm90IG5pY2UuCisJICBUaGlzIGNvZGUgbXVzdCBiZSBlbmFibGVkIG9uY2Ugd2Ugc3RhcnQgd3JpdGluZyBOVEZTIDEuMiBzcGVjaWZpYworCSAgY2hhbmdlcyBvdGhlcndpc2UgV2luZG93cyBOVEZTIGRyaXZlciBtaWdodCBjcmFzaCAvIGNhdXNlIGNvcnJ1cHRpb24uCisKKzIuMS4xMiAtIEZpeCB0aGUgc2Vjb25kIGZpeCB0byB0aGUgZGVjb21wcmVzc2lvbiBlbmdpbmUgYW5kIHNvbWUgY2xlYW51cHMuCisKKwktIEFkZCBhIG5ldyBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgc3RydWN0LCBudGZzX21zdF9hb3BzLCBmb3IgbXN0CisJICBwcm90ZWN0ZWQgYXR0cmlidXRlcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZGVmYXVsdCBudGZzX2FvcHMgZG8gbm90CisJICBtYWtlIHNlbnNlIHdpdGggbXN0IHByb3RlY3RlZCBkYXRhIGFuZCB3ZXJlIHRoZXkgdG8gd3JpdGUgYW55dGhpbmcgdG8KKwkgIHN1Y2ggYW4gYXR0cmlidXRlIHRoZXkgd291bGQgY2F1c2UgZGF0YSBjb3JydXB0aW9uIHNvIHdlIHByb3ZpZGUKKwkgIG50ZnNfbXN0X2FvcHMgd2hpY2ggZG9lcyBub3QgaGF2ZSBhbnkgd3JpdGUgcmVsYXRlZCBvcGVyYXRpb25zIHNldC4KKwktIENsZWFudXAgZGlydHkgbnRmcyBpbm9kZSBoYW5kbGluZyAoZnMvbnRmcy9pbm9kZS5baGNdKSB3aGljaCBhbHNvCisJICBpbmNsdWRlcyBhbiBhZGFwdGVkIG50ZnNfY29tbWl0X2lub2RlKCkgYW5kIGFuIGltcGxlbWVudGF0aW9uIG9mCisJICBudGZzX3dyaXRlX2lub2RlKCkgd2hpY2ggZm9yIG5vdyBqdXN0IGNsZWFucyBkaXJ0eSBpbm9kZXMgd2l0aG91dAorCSAgd3JpdGluZyB0aGVtIChpdCBkb2VzIGVtaXQgYSB3YXJuaW5nIHRoYXQgdGhpcyBpcyBoYXBwZW5pbmcpLgorCS0gVW5kbyB0aGUgc2Vjb25kIGRlY29tcHJlc3Npb24gZW5naW5lIGZpeCAoc2VlIDIuMS45IHJlbGVhc2UgQ2hhbmdlTG9nCisJICBlbnRyeSkgYXMgaXQgd2FzIG9ubHkgZml4aW5nIGEgdGhlb3JldGljYWwgYnVnIGJ1dCBhdCB0aGUgc2FtZSB0aW1lCisJICBpdCBiYWRseSBicm9rZSB0aGUgaGFuZGxpbmcgb2Ygc3BhcnNlIGFuZCB1bmNvbXByZXNzZWQgY29tcHJlc3Npb24KKwkgIGJsb2Nrcy4KKworMi4xLjExIC0gRHJpdmVyIGludGVybmFsIGNsZWFudXBzLgorCisJLSBPbmx5IGJ1aWxkIGxvZ2ZpbGUubyBpZiBidWlsZGluZyB0aGUgZHJpdmVyIHdpdGggcmVhZC13cml0ZSBzdXBwb3J0LgorCS0gUmVhbGx5IGZpbmFsIHdoaXRlIHNwYWNlIGNsZWFudXBzLgorCS0gVXNlIGdlbmVyaWNfZmZzKCkgaW5zdGVhZCBvZiBmZnMoKSBpbiBsb2dmaWxlLmMgd2hpY2ggYWxsb3dzIHRoZQorCSAgbG9nX3BhZ2Vfc2l6ZSB2YXJpYWJsZSB0byBiZSBvcHRpbWl6ZWQgYnkgZ2NjIGludG8gYSBjb25zdGFudC4KKwktIFJlbmFtZSB1Y2hhcl90IHRvIG50ZnNjaGFyIGV2ZXJ5d2hlcmUgYXMgdWNoYXJfdCBpcyB1bnNpZ25lZCAxLWJ5dGUKKwkgIGNoYXIgYXMgZGVmaW5lZCBieSBQT1NJWCBhbmQgYXMgZm91bmQgb24gc29tZSBzeXN0ZW1zLgorCisyLjEuMTAgLSBGb3JjZSByZWFkLW9ubHkgKHJlKW1vdW50aW5nIG9mIHZvbHVtZXMgd2l0aCB1bnN1cHBvcnRlZCB2b2x1bWUgZmxhZ3MuCisKKwktIEZpbmlzaCBvZmYgdGhlIHdoaXRlIHNwYWNlIGNsZWFudXBzIChyZW1vdmUgdHJhaWxpbmcgc3BhY2VzLCBldGMpLgorCS0gQ2xlYW4gdXAgbnRmc19maWxsX3N1cGVyKCkgYW5kIG50ZnNfcmVhZF9pbm9kZV9tb3VudCgpIGJ5IHJlbW92aW5nCisJICB0aGUga2x1ZGdlcyBhcm91bmQgdGhlIGZpcnN0IGlnZXQoKS4gIEluc3RlYWQgb2YgKHJlKXNldHRpbmcgLT5zX29wCisJICB3ZSBoYXZlIHRoZSAkTUZUIGlub2RlIHNldCB1cCBieSBleHBsaWNpdCBuZXdfaW5vZGUoKSAvIHNldCAtPmlfaW5vIC8KKwkgIGluc2VydF9pbm9kZV9oYXNoKCkgLyBjYWxsIG50ZnNfcmVhZF9pbm9kZV9tb3VudCgpIGRpcmVjdGx5LiAgVGhpcworCSAga2lsbHMgdGhlIG5lZWQgZm9yIHNlY29uZCBzdXBlcl9vcGVyYXRpb25zIGFuZCBhbGxvd3MgdG8gcmV0dXJuIGVycm9yCisJICBmcm9tIG50ZnNfcmVhZF9pbm9kZV9tb3VudCgpIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHVnbHkgInBvaXNvbmluZyIKKwkgIHRyaWNrcy4gIChBbCBWaXJvKQorCS0gRm9yY2UgcmVhZC1vbmx5IChyZSltb3VudGluZyBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBiaXRzIGFyZSBzZXQgaW4KKwkgIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3M6CisJICAJVk9MVU1FX0lTX0RJUlRZLCBWT0xVTUVfUkVTSVpFX0xPR19GSUxFLAorCQlWT0xVTUVfVVBHUkFERV9PTl9NT1VOVCwgVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVksCisJCVZPTFVNRV9SRVBBSVJfT0JKRUNUX0lELCBWT0xVTUVfTU9ESUZJRURfQllfQ0hLRFNLCisJICBUbyBtYWtlIHRoaXMgZWFzaWVyIHdlIGRlZmluZSBWT0xVTUVfTVVTVF9NT1VOVF9ST19NQVNLIHdpdGggYWxsIHRoZQorCSAgYWJvdmUgYml0cyBzZXQgc28gdGhlIHRlc3QgaXMgbWFkZSBlYXN5LgorCisyLjEuOSAtIEZpeCB0d28gYnVncyBpbiBkZWNvbXByZXNzaW9uIGVuZ2luZS4KKworCS0gRml4IGEgYnVnIHdoZXJlIHdlIHdvdWxkIG5vdCBhbHdheXMgZGV0ZWN0IHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZQorCSAgZW5kIG9mIGEgY29tcHJlc3Npb24gYmxvY2sgYmVjYXVzZSB3ZSB3ZXJlIGVuZGluZyBhdCBtaW51cyBvbmUgYnl0ZQorCSAgd2hpY2ggaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgYmVpbmcgYXQgdGhlIGVuZC4gIFRoZSBmaXggaXMgdG8KKwkgIGNoZWNrIHdoZXRoZXIgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIgaGFzIGJlZW4gZnVsbHkgZmlsbGVkIGFuZCBpZiBzbworCSAgd2UgYXNzdW1lIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2lvbiBibG9jay4gIEEgYmlnCisJICB0aGFuayB5b3UgdG8gTWFyY2luIEdpYnXFgmEgZm9yIHRoZSBidWcgcmVwb3J0LCB0aGUgYXNzaXN0YW5jZSBpbgorCSAgdHJhY2tpbmcgZG93biB0aGUgYnVnIGFuZCB0ZXN0aW5nIHRoZSBmaXguCisJLSBGaXggYSBwb3NzaWJsZSBidWcgd2hlcmUgd2hlbiBhIGNvbXByZXNzZWQgcmVhZCBpcyB0cnVuY2F0ZWQgdG8gdGhlCisJICBlbmQgb2YgdGhlIGZpbGUsIHRoZSBvZmZzZXQgaW5zaWRlIHRoZSBsYXN0IHBhZ2Ugd2FzIG5vdCB0cnVuY2F0ZWQuCisKKzIuMS44IC0gSGFuZGxlICRNRlQgbWlycm9yIGFuZCAkTG9nRmlsZSwgaW1wcm92ZSB0aW1lIGhhbmRsaW5nLCBhbmQgY2xlYW51cHMuCisKKwktIFVzZSBnZXRfYmgoKSBpbnN0ZWFkIG9mIG1hbnVhbCBhdG9taWNfaW5jKCkgaW4gZnMvbnRmcy9jb21wcmVzcy5jLgorCS0gTW9kaWZ5IGZzL250ZnMvdGltZS5jOjpudGZzMnV0YygpLCBnZXRfY3VycmVudF9udGZzX3RpbWUoKSwgYW5kCisJICB1dGMybnRmcygpIHRvIHdvcmsgd2l0aCBzdHJ1Y3QgdGltZXNwZWMgaW5zdGVhZCBvZiB0aW1lX3Qgb24gdGhlCisJICBMaW51eCBVVEMgdGltZSBzaWRlIHRodXMgcHJlc2VydmluZyB0aGUgZnVsbCBwcmVjaXNpb24gb2YgdGhlIE5URlMKKwkgIHRpbWUgYW5kIG9ubHkgbG9vc2luZyB1cCB0byA5OSBuYW5vLXNlY29uZHMgaW4gdGhlIExpbnV4IFVUQyB0aW1lLgorCS0gTW92ZSBmcy9udGZzL3RpbWUuYyB0byBmcy9udGZzL3RpbWUuaCBhbmQgbWFrZSB0aGUgdGltZSBmdW5jdGlvbnMKKwkgIHN0YXRpYyBpbmxpbmUuCisJLSBSZW1vdmUgdW51c2VkIG50ZnNfZGlydHlfaW5vZGUoKS4KKwktIENsZWFudXAgc3VwZXIgb3BlcmF0aW9ucyBkZWNsYXJhdGlvbiBpbiBmcy9udGZzL3N1cGVyLmMuCisJLSBXcmFwIGZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoKSBpbiAjaWZkZWYgTlRGU19SVy4KKwktIEFkZCBOSW5vVGVzdFNldEZvbygpIGFuZCBOSW5vVGVzdENsZWFyRm9vKCkgbWFjcm8gbWFnaWMgdG8KKwkgIGZzL250ZnMvaW5vZGUuaCBhbmQgdXNlIGl0IHRvIGRlY2xhcmUgTklub1Rlc3R7U2V0LENsZWFyfURpcnR5LgorCS0gTW92ZSB0eXBlZGVmcyBmb3IgbnRmc19hdHRyIGFuZCB0ZXN0X3QgZnJvbSBmcy9udGZzL2lub2RlLmMgdG8KKwkgIGZzL250ZnMvaW5vZGUuaCBzbyB0aGV5IGNhbiBiZSB1c2VkIGVsc2V3aGVyZS4KKwktIERldGVybWluZSB0aGUgbWZ0IG1pcnJvciBzaXplIGFzIHRoZSBudW1iZXIgb2YgbWlycm9yZWQgbWZ0IHJlY29yZHMKKwkgIGFuZCBzdG9yZSBpdCBpbiBudGZzX3ZvbHVtZS0+bWZ0bWlycl9zaXplIChmcy9udGZzL3N1cGVyLmMpLgorCS0gTG9hZCB0aGUgbWZ0IG1pcnJvciBhdCBtb3VudCB0aW1lIGFuZCBjb21wYXJlIHRoZSBtZnQgcmVjb3JkcyBzdG9yZWQKKwkgIGluIGl0IHRvIHRoZSBvbmVzIGluIHRoZSBtZnQuICBGb3JjZSBhIHJlYWQtb25seSBtb3VudCBpZiB0aGUgdHdvIGRvCisJICBub3QgbWF0Y2ggKGZzL250ZnMvc3VwZXIuYykuCisJLSBGaXggdHlwZSBjYXN0aW5nIHJlbGF0ZWQgd2FybmluZ3Mgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMuICBUaGFua3MKKwkgIHRvIE1lZWxpcyBSb29zIGZvciByZXBvcnRpbmcgdGhlbS4KKwktIE1vdmUgJUwgdG8gJWxsIGFzICVMIGlzIGZsb2F0aW5nIHBvaW50IGFuZCAlbGwgaXMgaW50ZWdlciB3aGljaCBpcworCSAgd2hhdCB3ZSB3YW50LgorCS0gUmVhZCB0aGUgam91cm5hbCAoJExvZ0ZpbGUpIGFuZCBkZXRlcm1pbmUgaWYgdGhlIHZvbHVtZSBoYXMgYmVlbgorCSAgc2h1dGRvd24gY2xlYW5seSBhbmQgZm9yY2UgYSByZWFkLW9ubHkgbW91bnQgaWYgbm90IChmcy9udGZzL3N1cGVyLmMKKwkgIGFuZCBmcy9udGZzL2xvZ2ZpbGUuYykuICBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBhIGNydWRlIGNoZWNrIGluCisJICB0aGF0IHdlIG9ubHkgbG9vayBhdCB0aGUgcmVzdGFydCBhcmVhcyBhbmQgbm90IGF0IHRoZSBhY3R1YWwgbG9nCisJICByZWNvcmRzIHNvIHRoYXQgdGhlcmUgd2lsbCBiZSBhIHZlcnkgc21hbGwgbnVtYmVyIG9mIGNhc2VzIHdoZXJlIHdlCisJICB0aGluayB0aGF0IGEgdm9sdW1lIGlzIGRpcnR5IHdoZW4gaW4gZmFjdCBpdCBpcyBjbGVhbi4gIFRoaXMgc2hvdWxkCisJICBvbmx5IGFmZmVjdCB2b2x1bWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBzaHV0ZG93biBjbGVhbmx5IGFuZCBkaWQgbm90CisJICBoYXZlIGFueSBwZW5kaW5nLCBub24tY2hlY2stcG9pbnRlZCBpL28uCisJLSBJZiB0aGUgJExvZ0ZpbGUgaW5kaWNhdGVzIGEgY2xlYW4gc2h1dGRvd24gYW5kIGEgcmVhZC13cml0ZSAocmUpbW91bnQKKwkgIGlzIHJlcXVlc3RlZCwgZW1wdHkgJExvZ0ZpbGUgYnkgb3ZlcndyaXRpbmcgaXQgd2l0aCAweGZmIGJ5dGVzIHRvCisJICBlbnN1cmUgdGhhdCBXaW5kb3dzIGNhbm5vdCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gYnkgcmVwbGF5aW5nIGEgc3RhbGUKKwkgIGpvdXJuYWwgYWZ0ZXIgTGludXggaGFzIHdyaXR0ZW4gdG8gdGhlIHZvbHVtZS4KKworMi4xLjcgLSBFbmFibGUgTkZTIGV4cG9ydGluZyBvZiBtb3VudGVkIE5URlMgdm9sdW1lcy4KKworCS0gU2V0IGlfZ2VuZXJhdGlvbiBpbiB0aGUgVkZTIGlub2RlIGZyb20gdGhlIHNlcV9ubyBvZiB0aGUgTlRGUyBpbm9kZS4KKwktIE1ha2UgbnRmc19sb29rdXAoKSBORlMgZXhwb3J0IHNhZmUsIGkuZS4gdXNlIGRfc3BsaWNlX2FsaWFzKCksIGV0Yy4KKwktIEltcGxlbWVudCAtPmdldF9kZW50cnkoKSBpbiBmcy9udGZzL25hbWVpLmM6Om50ZnNfZ2V0X2RlbnRyeSgpIGFzIHRoZQorCSAgZGVmYXVsdCBkb2Vzbid0IGFsbG93IGlub2RlIG51bWJlciAwIHdoaWNoIGlzIGEgdmFsaWQgaW5vZGUgb24gTlRGUworCSAgYW5kIGV2ZW4gaWYgaXQgZGlkIGFsbG93IHRoYXQgaXQgdXNlcyBpZ2V0KCkgaW5zdGVhZCBvZiBudGZzX2lnZXQoKQorCSAgd2hpY2ggbWFrZXMgaXQgdXNlbGVzcyBmb3IgdXMuCisJLSBJbXBsZW1lbnQgLT5nZXRfcGFyZW50KCkgaW4gZnMvbnRmcy9uYW1laS5jOjpudGZzX2dldF9wYXJlbnQoKSBhcyB0aGUKKwkgIGRlZmF1bHQganVzdCByZXR1cm5zIC1FQUNDRVMgd2hpY2ggaXMgbm90IHZlcnkgdXNlZnVsLgorCS0gRGVmaW5lIGV4cG9ydCBvcGVyYXRpb25zICgtPnNfZXhwb3J0X29wKSBmb3IgTlRGUyAobnRmc19leHBvcnRfb3BzKQorCSAgYW5kIHNldCB0aGVtIHVwIGluIHRoZSBzdXBlciBibG9jayBhdCBtb3VudCB0aW1lIChzdXBlci5jKSB0aGlzCisJICBhbGxvd3MgbW91bnRlZCBOVEZTIHZvbHVtZXMgdG8gYmUgZXhwb3J0ZWQgdmlhIE5GUy4KKwktIEFkZCBtaXNzaW5nIHJldHVybiAtRU9QTk9UU1VQUDsgaW4KKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZSgpLgorCS0gRW5mb3JjZSBubyBhdGltZSBhbmQgbm8gZGlyIGF0aW1lIHVwZGF0ZXMgYXQgbW91bnQvcmVtb3VudCB0aW1lIGFzCisJICB0aGV5IGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0IGFueXdheS4KKwktIE1vdmUgYSBmZXcgYXNzaWdubWVudHMgaW4gZnMvbnRmcy9hdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpIHRvCisJICBhZnRlciBhIE5VTEwgY2hlY2suICBUaGFua3MgdG8gRGF2ZSBKb25lcyBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisKKzIuMS42IC0gRml4IG1pbm9yIGJ1ZyBpbiBoYW5kbGluZyBvZiBjb21wcmVzc2VkIGRpcmVjdG9yaWVzLgorCisJLSBGaXggYnVnIGluIGhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZGlyZWN0b3JpZXMuICBBIGNvbXByZXNzZWQKKwkgIGRpcmVjdG9yeSBpcyBub3QgcmVhbGx5IGNvbXByZXNzZWQgc28gd2hlbiB3ZSBzZXQgdGhlIC0+aV9ibG9ja3MKKwkgIGZpZWxkIG9mIGEgY29tcHJlc3NlZCBkaXJlY3RvcnkgaW5vZGUgd2Ugd2VyZSBzZXR0aW5nIGl0IGZyb20gdGhlCisJICBub24tZXhpc3RpbmcgZmllbGQgbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSB3aGljaCBnYXZlIHJhbmRvbQorCSAgcmVzdWx0cy4uLiAgRm9yIGRpcmVjdG9yaWVzIHdlIG5vdyBhbHdheXMgdXNlIG5pLT5hbGxvY2F0ZWRfc2l6ZS4KKworMi4xLjUgLSBGaXggbWlub3IgYnVnIGluIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBoYW5kbGluZy4KKworCS0gRml4IGJ1ZyBpbiBhdHRyaWJ1dGUgbGlzdCBoYW5kbGluZy4gIEFjdHVhbGx5IGl0IGlzIG5vdCBhcyBtdWNoIGEgYnVnCisJICBhcyB0b28gbXVjaCBwcm90ZWN0aW9uIGluIHRoYXQgd2Ugd2VyZSBub3QgYWxsb3dpbmcgYXR0cmlidXRlIGxpc3RzCisJICB3aGljaCB3YXN0ZSBzcGFjZSBvbiBkaXNrIHdoaWxlIFdpbmRvd3MgWFAgY2xlYXJseSBhbGxvd3MgaXQgYW5kIGluCisJICBmYWN0IGNyZWF0ZXMgc3VjaCBhdHRyaWJ1dGUgbGlzdHMgc28gb3VyIGRyaXZlciB3YXMgZmFpbGluZy4KKwktIFVwZGF0ZSBOVEZTIGRvY3VtZW50YXRpb24gcmVhZHkgZm9yIDIuNiBrZXJuZWwgcmVsZWFzZS4KKworMi4xLjQgLSBSZWR1Y2UgY29tcGlsZXIgcmVxdWlyZW1lbnRzLgorCisJLSBSZW1vdmUgYWxsIHVzZXMgb2YgdW5uYW1lZCBzdHJ1Y3RzIGFuZCB1bmlvbnMgaW4gdGhlIGRyaXZlciB0byBtYWtlCisJICBvbGQgYW5kIG5ld2VyIGdjYyB2ZXJzaW9ucyBoYXBweS4gTWFrZXMgaXQgYSBiaXQgdWdsaWVyIElNTyBidXQgYXQKKwkgIGxlYXN0IHBlb3BsZSB3aWxsIHN0b3AgaGFzc2xpbmcgbWUgYWJvdXQgaXQuCisKKzIuMS4zIC0gSW1wb3J0YW50IGJ1ZyBmaXhlcyBpbiBjb3JuZXIgY2FzZXMuCisKKwktIHN1cGVyLmM6OnBhcnNlX250ZnNfYm9vdF9zZWN0b3IoKTogQ29ycmVjdCB0aGUgY2hlY2sgZm9yIDY0LWJpdAorCSAgY2x1c3RlcnMuIChQaGlsaXBwIFRob21hcykKKwktIGF0dHJpYi5jOjpsb2FkX2F0dHJpYnV0ZV9saXN0KCk6IEZpeCBidWcgd2hlbiBpbml0aWFsaXplZF9zaXplIGlzIGEKKwkgIG11bHRpcGxlIG9mIHRoZSBibG9ja19zaXplIGJ1dCBub3QgdGhlIGNsdXN0ZXIgc2l6ZS4gKFN6YWJvbGNzCisJICBTemFrYWNzaXRzIDxzemFrYUBzaWVuZXQuaHU+KQorCisyLjEuMiAtIEltcG9ydGFudCBidWcgZml4ZXMgYWxldmlhdGluZyB0aGUgaGFuZ3MgaW4gc3RhdGZzLgorCisJLSBGaXggYnVnZ3kgZnJlZSBjbHVzdGVyIGFuZCBmcmVlIGlub2RlIGRldGVybWluYXRpb24gbG9naWMuCisKKzIuMS4xIC0gTWlub3IgdXBkYXRlcy4KKworCS0gQWRkIGhhbmRsaW5nIGZvciBpbml0aWFsaXplZF9zaXplICE9IGRhdGFfc2l6ZSBpbiBjb21wcmVzc2VkIGZpbGVzLgorCS0gUmVkdWNlIGZ1bmN0aW9uIGxvY2FsIHN0YWNrIHVzYWdlIGZyb20gMHgzZDQgYnl0ZXMgdG8ganVzdCBub2lzZSBpbgorCSAgZnMvbnRmcy91cGNhc2UuYy4gKFJhbmR5IER1bmxhcCA8cmRkdW5sYXBAb3NkbC5vcmQ+KQorCS0gUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzIGZvciBuZXdlciBnY2MuCisJLSBQYWdlcyBhcmUgbm8gbG9uZ2VyIGttYXBwZWQgYnkgbW0vZmlsZW1hcC5jOjpnZW5lcmljX2ZpbGVfd3JpdGUoKQorCSAgYXJvdW5kIGNhbGxzIHRvIC0+e3ByZXBhcmUsY29tbWl0fV93cml0ZS4gIEFkYXB0IE5URlMgYXBwcm9wcmlhdGVseQorCSAgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZSgpIGJ5IHVzaW5nCisJICBrbWFwX2F0b21pYyhLTV9VU0VSMCkuCisKKzIuMS4wIC0gRmlyc3Qgc3RlcHMgdG93YXJkcyB3cml0ZSBzdXBwb3J0OiBpbXBsZW1lbnQgZmlsZSBvdmVyd3JpdGUuCisKKwktIEFkZCBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgZGV2ZWxvcG1lbnRhbCB3cml0ZSBzdXBwb3J0IHdpdGggYW4KKwkgIGFwcHJvcHJpYXRlbHkgc2NhcnkgY29uZmlndXJhdGlvbiBoZWxwIHRleHQuCisJLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlcGFnZSgpIGFuZCBpdHMKKwkgIGhlbHBlciBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9ibG9jaygpLiBUaGlzIGVuYWJsZXMgbW1hcCgyKSBiYXNlZAorCSAgb3ZlcndyaXRpbmcgb2YgZXhpc3RpbmcgZmlsZXMgb24gbnRmcy4gTm90ZTogUmVzaWRlbnQgZmlsZXMgYXJlCisJICBvbmx5IHdyaXR0ZW4gaW50byBtZW1vcnksIGFuZCBub3Qgd3JpdHRlbiBvdXQgdG8gZGlzayBhdCBwcmVzZW50LCBzbworCSAgYXZvaWQgd3JpdGluZyB0byBmaWxlcyBzbWFsbGVyIHRoYW4gYWJvdXQgMWtpQi4KKwktIEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgZnMvbnRmcy9hb3BzLmM6Om50ZnNfcHJlcGFyZV93cml0ZSgpLCBpdHMKKwkgIGhlbHBlciBmcy9udGZzL2FvcHMuYzo6bnRmc19wcmVwYXJlX25vbnJlc2lkZW50X3dyaXRlKCkgYW5kIHRoZWlyCisJICBjb3VudGVycGFydHMsIGZzL250ZnMvYW9wcy5jOjpudGZzX2NvbW1pdF93cml0ZSgpLCBhbmQKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZSgpLCByZXNwZWN0aXZlbHkuIEFsc28sCisJICBhZGQgZ2VuZXJpY19maWxlX3dyaXRlKCkgdG8gdGhlIG50ZnMgZmlsZSBvcGVyYXRpb25zIChmcy9udGZzL2ZpbGUuYykuCisJICBUaGlzIGVuYWJsZXMgd3JpdGUoMikgYmFzZWQgb3ZlcndyaXRpbmcgb2YgZXhpc3RpbmcgZmlsZXMgb24gbnRmcy4KKwkgIE5vdGU6IEFzIHdpdGggbW1hcCgyKSBiYXNlZCBvdmVyd3JpdGluZywgcmVzaWRlbnQgZmlsZXMgYXJlIG9ubHkKKwkgIHdyaXR0ZW4gaW50byBtZW1vcnksIGFuZCBub3Qgd3JpdHRlbiBvdXQgdG8gZGlzayBhdCBwcmVzZW50LCBzbyBhdm9pZAorCSAgd3JpdGluZyB0byBmaWxlcyBzbWFsbGVyIHRoYW4gYWJvdXQgMWtpQi4KKwktIEltcGxlbWVudCAtPnRydW5jYXRlIChmcy9udGZzL2lub2RlLmM6Om50ZnNfdHJ1bmNhdGUoKSkgYW5kCisJICAtPnNldGF0dHIoKSAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3NldGF0dHIoKSkgaW5vZGUgb3BlcmF0aW9ucyBmb3IKKwkgIGZpbGVzIHdpdGggdGhlIHB1cnBvc2Ugb2YgaW50ZXJjZXB0aW5nIGFuZCBhYm9ydGluZyBhbGwgaV9zaXplCisJICBjaGFuZ2VzIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0IHlldC4gbnRmc190cnVuY2F0ZSgpIGFjdHVhbGx5IG9ubHkKKwkgIGVtaXRzIGEgd2FybmluZyBtZXNzYWdlIGJ1dCBBRkFJQ1Mgb3VyIGludGVyY2VwdGlvbiBvZiBpX3NpemUgY2hhbmdlcworCSAgZWxzZXdoZXJlIG1lYW5zIG50ZnNfdHJ1bmNhdGUoKSBuZXZlciBnZXRzIGNhbGxlZCBmb3IgaV9zaXplIGNoYW5nZXMuCisJICBJdCBpcyBvbmx5IGNhbGxlZCBmcm9tIGdlbmVyaWNfZmlsZV93cml0ZSgpIHdoZW4gd2UgZmFpbCBpbgorCSAgbnRmc19wcmVwYXJlX3ssbm9ucmVzaWRlbnRffXdyaXRlKCkgaW4gb3JkZXIgdG8gZGlzY2FyZCBhbnkKKwkgIGluc3RhbnRpYXRlZCBidWZmZXJzIGJleW9uZCBpX3NpemUuIFRodXMgaV9zaXplIGlzIG5vdCBhY3R1YWxseQorCSAgY2hhbmdlZCBzbyBvdXIgd2FybmluZyBtZXNzYWdlIGlzIGVub3VnaC4gVW5mb3J0dW5hdGVseSBpdCBpcyBub3QKKwkgIHBvc3NpYmxlIHRvIGVhc2lseSBkZXRlcm1pbmUgaWYgaV9zaXplIGlzIGJlaW5nIGNoYW5nZWQgb3Igbm90IGhlbmNlCisJICB3ZSBqdXN0IGVtaXQgYW4gYXBwcm9wcmlhdGVseSB3b3JkZWQgZXJyb3IgbWVzc2FnZS4KKworMi4wLjI1IC0gU21hbGwgYnVnIGZpeGVzIGFuZCBjbGVhbnVwcy4KKworCS0gVW5sb2NrIHRoZSBwYWdlIGluIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IgY29kZSBwYXRoIGluCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkuCisJLSBJZiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX3BhZ2UoKSBpcyBjYWxsZWQgb24gYW4gdXB0b2RhdGUgcGFnZSwKKwkgIGp1c3QgdW5sb2NrIHRoZSBwYWdlIGFuZCByZXR1cm4uIChUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIC0+d3JpdGVwYWdlCisJICBjbGVhcmluZyBQYWdlVXB0b2RhdGUoKSBkdXJpbmcgd3JpdGUgb3V0IG9mIE1zdFByb3RlY3RlZCgpCisJICBhdHRyaWJ1dGVzLgorCS0gUmVtb3ZlIGxlYWtlZCB3cml0ZSBjb2RlIGFnYWluLgorCisyLjAuMjQgLSBDbGVhbnVwcy4KKworCS0gVHJlYXQgQlVHX09OKCkgYXMgQVNTRVJUKCkgbm90IFZFUklGWSgpLCBpLmUuIGRvIG5vdCB1c2Ugc2lkZSBlZmZlY3RzCisJICBpbnNpZGUgQlVHX09OKCkuIChBZGFtIEouIFJpY2h0ZXIpCisJLSBTcGxpdCBsb2dpY2FsIE9SIGV4cHJlc3Npb25zIGluc2lkZSBCVUdfT04oKSBpbnRvIGluZGl2aWR1YWwgQlVHX09OKCkKKwkgIGNhbGxzIGZvciBpbXByb3ZlZCBkZWJ1Z2dpbmcuIChBZGFtIEouIFJpY2h0ZXIpCisJLSBBZGQgZXJyb3JzIGZsYWcgdG8gdGhlIG50ZnMgdm9sdW1lIHN0YXRlLCBhY2Nlc3NlZCB2aWEKKwkgIE5Wb2x7LFNldCxDbGVhcn1FcnJvcnModm9sKS4KKwktIERvIG5vdCBhbGxvdyByZWFkLXdyaXRlIHJlbW91bnRzIG9mIHJlYWQtb25seSB2b2x1bWVzIHdpdGggZXJyb3JzLgorCS0gQ2xhcmlmeSBjb21tZW50IGZvciBudGZzIGZpbGUgb3BlcmF0aW9uIHNlbmRmaWxlIHdoaWNoIHdhcyBhZGRlZCBieQorCSAgQ2hyaXN0b3BoIEhlbGx3aWcgYSB3aGlsZSBhZ28gKGp1c3QgdXNpbmcgZ2VuZXJpY19maWxlX3NlbmRmaWxlKCkpCisJICB0byBzYXkgdGhhdCBudGZzIC0+c2VuZGZpbGUgaXMgb25seSB1c2VkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUKKwkgIHNvdXJjZSBkYXRhIGlzIG9uIHRoZSBudGZzIHBhcnRpdGlvbiBhbmQgdGhlIGRlc3RpbmF0aW9uIGlzCisJICBzb21ld2hlcmUgZWxzZSwgaS5lLiBub3RoaW5nIHdlIG5lZWQgdG8gY29uY2VybiBvdXJzZWx2ZXMgd2l0aC4KKwktIEFkZCBnZW5lcmljX2ZpbGVfd3JpdGUoKSBhcyBvdXIgbnRmcyBmaWxlIHdyaXRlIG9wZXJhdGlvbi4KKworMi4wLjIzIC0gTWFqb3IgYnVnIGZpeGVzIChyYWNlcywgZGVhZGxvY2tzLCBub24taTM4NiBhcmNoaXRlY3R1cmVzKS4KKworCS0gTWFzc2l2ZSBpbnRlcm5hbCBsb2NraW5nIGNoYW5nZXMgdG8gbWZ0IHJlY29yZCBsb2NraW5nLiBGaXhlcyBsb2NrCisJICByZWN1cnNpb24gYW5kIHJlcGxhY2VzIHRoZSBtcmVjX2xvY2sgcmVhZC93cml0ZSBzZW1hcGhvcmUgd2l0aCBhCisJICBtdXRleC4gQWxzbyByZW1vdmVzIHRoZSBub3cgc3VwZXJmbHVvdXMgbWZ0X2NvdW50LiBUaGlzIGZpeGVzIHNldmVyYWwKKwkgIHJhY2UgY29uZGl0aW9ucyBhbmQgZGVhZGxvY2tzLCBlc3BlY2lhbGx5IGluIHRoZSBmdXR1cmUgd3JpdGUgY29kZS4KKwktIEZpeCBudGZzIG92ZXIgbG9vcGJhY2sgZm9yIGNvbXByZXNzZWQgZmlsZXMgYnkgYWRkaW5nIGFuCisJICBvcHRpbWl6YXRpb24gYmFycmllci4gKGdjYyB3YXMgc2NyZXdpbmcgdXAgb3RoZXJ3aXNlID8pCisJLSBNaXNjZWxsYW5lb3VzIGNsZWFudXBzIGFsbCBvdmVyIHRoZSBjb2RlIGFuZCBhIGZpeCBvciB0d28gaW4gZXJyb3IKKwkgIGhhbmRsaW5nIGNvZGUgcGF0aHMuCisJVGhhbmtzIGdvIHRvIENocmlzdG9waCBIZWxsd2lnIGZvciBwb2ludGluZyBvdXQgdGhlIGZvbGxvd2luZyB0d286CisJLSBSZW1vdmUgbm93IHVudXNlZCBmdW5jdGlvbiBmcy9udGZzL21hbGxvYy5oOjp2bWFsbG9jX25vZnMoKS4KKwktIEZpeCBudGZzX2ZyZWUoKSBmb3IgaWE2NCBhbmQgcGFyaXNjIGJ5IGNoZWNraW5nIGZvciBWTUFMTE9DX0VORCwgdG9vLgorCisyLjAuMjIgLSBDbGVhbnVwcywgbWFpbmx5IHRvIG50ZnNfcmVhZGRpcigpLCBhbmQgdXNlIEM5OSBpbml0aWFsaXplcnMuCisKKwktIENoYW5nZSBmcy9udGZzL2Rpci5jOjpudGZzX3JlZGRpcigpIHRvIG9ubHkgcmVhZC93cml0ZSAtPmZfcG9zIG9uY2UKKwkgIGF0IGVudHJ5L2V4aXQgcmVzcGVjdGl2ZWx5LgorCS0gVXNlIEM5OSBpbml0aWFsaXplcnMgZm9yIHN0cnVjdHVyZXMuCisJLSBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGJsb2NrcyBmcm9tIGZzL250ZnMvYW9wcy5jOjpudGZzX3JlYWRfYmxvY2soKS4KKworMi4wLjIxIC0gQ2hlY2sgZm9yLCBhbmQgcmVmdXNlIHRvIHdvcmsgd2l0aCB0b28gbGFyZ2UgZmlsZXMvZGlyZWN0b3JpZXMvdm9sdW1lcy4KKworCS0gTGltaXQgdm9sdW1lIHNpemUgYXQgbW91bnQgdGltZSB0byAyVGlCIG9uIGFyY2hpdGVjdHVyZXMgd2hlcmUKKwkgIHVuc2lnbmVkIGxvbmcgaXMgMzItYml0cyAoZnMvbnRmcy9zdXBlci5jOjpwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yKCkpLgorCSAgVGhpcyBpcyB0aGUgbW9zdCB3ZSBjYW4gZG8gd2l0aG91dCBvdmVyZmxvd2luZyB0aGUgMzItYml0IGxpbWl0IG9mCisJICB0aGUgYmxvY2sgZGV2aWNlIHNpemUgaW1wb3NlZCBvbiB1cyBieSBzYl9icmVhZCgpIGFuZCBzYl9nZXRibGsoKQorCSAgZm9yIHRoZSB0aW1lIGJlaW5nLgorCS0gTGltaXQgZmlsZS9kaXJlY3Rvcnkgc2l6ZSBhdCBvcGVuKCkgdGltZSB0byAxNlRpQiBvbiBhcmNoaXRlY3R1cmVzCisJICB3aGVyZSB1bnNpZ25lZCBsb25nIGlzIDMyLWJpdHMgKGZzL250ZnMvZmlsZS5jOjpudGZzX2ZpbGVfb3BlbigpIGFuZAorCSAgZnMvbnRmcy9kaXIuYzo6bnRmc19kaXJfb3BlbigpKS4gVGhpcyBpcyB0aGUgbW9zdCB3ZSBjYW4gZG8gd2l0aG91dAorCSAgb3ZlcmZsb3dpbmcgdGhlIHBhZ2UgY2FjaGUgcGFnZSBpbmRleC4KKworMi4wLjIwIC0gU3VwcG9ydCBub24tcmVzaWRlbnQgZGlyZWN0b3J5IGluZGV4IGJpdG1hcHMsIGZpeCBwYWdlIGxlYWsgaW4gcmVhZGRpci4KKworCS0gTW92ZSB0aGUgZGlyZWN0b3J5IGluZGV4IGJpdG1hcCB0byB1c2UgYW4gYXR0cmlidXRlIGlub2RlIGluc3RlYWQgb2YKKwkgIGhhdmluZyBzcGVjaWFsIGZpZWxkcyBmb3IgaXQgaW5zaWRlIHRoZSBudGZzIGlub2RlIHN0cnVjdHVyZS4gVGhpcworCSAgbWVhbnMgdGhhdCB0aGUgaW5kZXggYml0bWFwcyBub3cgdXNlIHRoZSBwYWdlIGNhY2hlIGZvciBpL28sIHRvbywKKwkgIGFuZCBhbHNvIGFzIGEgc2lkZSBlZmZlY3Qgd2UgZ2V0IHN1cHBvcnQgZm9yIG5vbi1yZXNpZGVudCBpbmRleAorCSAgYml0bWFwcyBmb3IgZnJlZS4KKwktIFNpbXBsaWZ5L2NsZWFudXAgZXJyb3IgaGFuZGxpbmcgaW4gZnMvbnRmcy9kaXIuYzo6bnRmc19yZWFkZGlyKCkgYW5kCisJICBmaXggYSBwYWdlIGxlYWsgdGhhdCBtYW5pZmVzdGVkIGl0c2VsZiBpbiBzb21lIGNhc2VzLgorCS0gQWRkIGZzL250ZnMvaW5vZGUuYzo6bnRmc19wdXRfaW5vZGUoKSwgd2hpY2ggd2UgbmVlZCB0byByZWxlYXNlIHRoZQorCSAgaW5kZXggYml0bWFwIGlub2RlIG9uIHRoZSBmaW5hbCBpcHV0KCkuCisKKzIuMC4xOSAtIEZpeCByYWNlIGNvbmRpdGlvbiwgaW1wcm92ZW1lbnRzLCBhbmQgb3B0aW1pemF0aW9ucyBpbiBpL28gaW50ZXJmYWNlLgorCisJLSBBcHBseSBibG9jayBvcHRpbWl6YXRpb24gYWRkZWQgdG8gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpCisJICB0byBmcy9udGZzL2NvbXByZXNzLmM6Om50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKSBhcyB3ZWxsLgorCS0gRHJvcCB0aGUgImZpbGUiIGZyb20gbnRmc19maWxlX3JlYWRfY29tcHJlc3NlZF9ibG9jaygpLgorCS0gUmVuYW1lIGZzL250ZnMvYW9wcy5jOjpudGZzX2VuYl9idWZmZXJfcmVhZF9hc3luYygpIHRvCisJICBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpIChtb3JlIGxpa2UgdGhlIGZzL2J1ZmZlci5jIGNvdW50ZXJwYXJ0KS4KKwktIFVwZGF0ZSBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpIHdpdGggdGhlIGltcHJvdmVkIGxvZ2ljIGZyb20KKwkgIGl0cyB1cGRhdGVkIGNvdW50ZXJwYXJ0IGZzL2J1ZmZlci5jOjplbmRfYnVmZmVyX2FzeW5jX3JlYWQoKS4gQXBwbHkKKwkgIGZ1cnRoZXIgbG9naWMgaW1wcm92ZW1lbnRzIHRvIGJldHRlciBkZXRlcm1pbmUgd2hlbiB3ZSBzZXQgUGFnZUVycm9yLgorCS0gVXBkYXRlIHN1Ym1pc3Npb24gb2YgYnVmZmVycyBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkgdG8KKwkgIGNoZWNrIGZvciB0aGUgYnVmZmVycyBiZWluZyB1cHRvZGF0ZSBmaXJzdCBpbiBsaW5lIHdpdGggdGhlIHVwZGF0ZWQKKwkgIGZzL2J1ZmZlci5jOjpibG9ja19yZWFkX2Z1bGxfcGFnZSgpLiBUaGlzIHBsdWdzIGEgc21hbGwgcmFjZQorCSAgY29uZGl0aW9uLgorCisyLjAuMTggLSBGaXggcmFjZSBjb25kaXRpb24gaW4gcmVhZGluZyBvZiBjb21wcmVzc2VkIGZpbGVzLgorCisJLSBUaGVyZSB3YXMgYSBuYXJyb3cgd2luZG93IGJldHdlZW4gY2hlY2tpbmcgYSBidWZmZXIgaGVhZCBmb3IgYmVpbmcKKwkgIHVwdG9kYXRlIGFuZCBsb2NraW5nIGl0IGluIG50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKS4gV2Ugbm93CisJICBsb2NrIHRoZSBidWZmZXIgYW5kIHRoZW4gY2hlY2sgd2hldGhlciBpdCBpcyB1cHRvZGF0ZSBvciBub3QuCisKKzIuMC4xNyAtIENsZWFudXBzIGFuZCBvcHRpbWl6YXRpb25zIC0gc2hyaW5raW5nIHRoZSBUb0RvIGxpc3QuCisKKwktIE1vZGlmeSBmcy9udGZzL2lub2RlLmM6Om50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSB0byByZXR1cm4gYW4gZXJyb3IKKwkgIGNvZGUgYW5kIHVwZGF0ZSBjYWxsZXJzLCBpLmUuIG50ZnNfaWdldCgpLCB0byBwYXNzIHRoYXQgZXJyb3IgY29kZQorCSAgdXAgaW5zdGVhZCBvZiBqdXN0IHVzaW5nIC1FSU8uCisJLSBNb2RpZmljYXRpb25zIHRvIHN1cGVyLmMgdG8gZW5zdXJlIHRoYXQgYm90aCBtb3VudCBhbmQgcmVtb3VudAorCSAgY2Fubm90IHNldCBhbnkgd3JpdGUgcmVsYXRlZCBvcHRpb25zIHdoZW4gdGhlIGRyaXZlciBpcyBjb21waWxlZAorCSAgcmVhZC1vbmx5LgorCS0gT3B0aW1pemUgYmxvY2sgcmVzb2x1dGlvbiBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkgdG8KKwkgIGNhY2hlIHRoZSBjdXJyZW50IHJ1bmxpc3QgZWxlbWVudC4gVGhpcyBzaG91bGQgaW1wcm92ZSBwZXJmb3JtYW5jZQorCSAgd2hlbiByZWFkaW5nIHZlcnkgbGFyZ2UgYW5kL29yIHZlcnkgZnJhZ21lbnRlZCBkYXRhLgorCisyLjAuMTYgLSBDb252ZXJ0IGFjY2VzcyB0byAkTUZULyRCSVRNQVAgdG8gYXR0cmlidXRlIGlub2RlIEFQSS4KKworCS0gRml4IGEgc3R1cGlkIGJ1ZyBpbnRyb2R1Y2VkIGluIDIuMC4xNSB3aGVyZSB3ZSB3ZXJlIHVubWFwcGluZyB0aGUKKwkgIHdyb25nIGlub2RlIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc19hdHRyX2lnZXQoKS4KKwktIEZpeCBkZWJ1Z2dpbmcgY2hlY2sgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpLgorCS0gQ29udmVydCAkTUZULyRCSVRNQVAgYWNjZXNzIHRvIGF0dHJpYnV0ZSBpbm9kZSBBUEkgYW5kIHJlbW92ZSBhbGwKKwkgIHJlbW5hbnRzIG9mIHRoZSB1Z2x5IG1mdGJtcCBhZGRyZXNzIHNwYWNlIGFuZCBvcGVyYXRpb25zIGhhY2suIFRoaXMKKwkgIG1lYW5zIHdlIGZpbmFsbHkgaGF2ZSBvbmx5IG9uZSByZWFkcGFnZSBmdW5jdGlvbiBhcyB3ZWxsIGFzIG9ubHkgb25lCisJICBhc3luYyBpbyBjb21wbGV0aW9uIGhhbmRsZXIuIFlleSEgVGhlIG1mdCBiaXRtYXAgaXMgbm93IGp1c3QgYW4KKwkgIGF0dHJpYnV0ZSBpbm9kZSBhbmQgaXMgYWNjZXNzZWQgZnJvbSB2b2wtPm1mdGJtcF9pbm8ganVzdCBhcyBpZiBpdAorCSAgd2VyZSBhIG5vcm1hbCBmaWxlLiBGYWtlIGlub2RlcyBydWxlLiAoLToKKworMi4wLjE1IC0gRmFrZSBpbm9kZXMgYmFzZWQgYXR0cmlidXRlIGkvbyB2aWEgdGhlIHBhZ2VjYWNoZSwgZml4ZXMgYW5kIGNsZWFudXBzLgorCisJLSBGaXggc2lsbHkgYnVnIGluIGZzL250ZnMvc3VwZXIuYzo6cGFyc2Vfb3B0aW9ucygpIHdoaWNoIHdhcyBjYXVzaW5nCisJICByZW1vdW50cyB0byBmYWlsIHdoZW4gdGhlIHBhcnRpdGlvbiBoYWQgYW4gZW50cnkgaW4gL2V0Yy9mc3RhYiBhbmQKKwkgIHRoZSBlbnRyeSBzcGVjaWZpZWQgdGhlIG5scz0gb3B0aW9uLgorCS0gQXBwbHkgc2FtZSBtYWNybyBtYWdpYyB1c2VkIGluIGZzL250ZnMvaW5vZGUuaCB0byBmcy9udGZzL3ZvbHVtZS5oIHRvCisJICBleHBhbmQgYWxsIHRoZSBoZWxwZXIgZnVuY3Rpb25zIE5Wb2xGb28oKSwgTlZvbFNldEZvbygpLCBhbmQKKwkgIE5Wb2xDbGVhckZvbygpLgorCS0gTW92ZSBjb3B5cmlnaHQgc3RhdGVtZW50IGZyb20gZHJpdmVyIGluaXRpYWxpc2F0aW9uIG1lc3NhZ2UgdG8KKwkgIG1vZHVsZSBkZXNjcmlwdGlvbiAoZnMvc3VwZXIuYykuIFRoaXMgbWFrZXMgdGhlIGluaXRpYWxpc2F0aW9uCisJICBtZXNzYWdlIGZpdCBvbiBvbmUgbGluZSBhbmQgZml0cyBpbiBiZXR0ZXIgd2l0aCByZXN0IG9mIGtlcm5lbC4KKwktIFVwZGF0ZSBmcy9udGZzL2F0dHJpYi5jOjptYXBfcnVuX2xpc3QoKSB0byB3b3JrIG9uIGJvdGggcmVhbCBhbmQKKwkgIGF0dHJpYnV0ZSBpbm9kZXMsIGFuZCBib3RoIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisJLSBJbXBsZW1lbnQgZmFrZSBhdHRyaWJ1dGUgaW5vZGVzIGFsbG93aW5nIGFsbCBhdHRyaWJ1dGUgaS9vIHRvIGdvIHZpYQorCSAgdGhlIHBhZ2UgY2FjaGUgYW5kIHRvIHVzZSBhbGwgdGhlIG5vcm1hbCB2ZnMvbW0gZnVuY3Rpb25hbGl0eToKKwkgIC0gQWRkIG50ZnNfYXR0cl9pZ2V0KCkgYW5kIGl0cyBoZWxwZXIgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKCkKKwkgICAgdG8gZnMvbnRmcy9pbm9kZS5jLgorCSAgLSBBZGQgbmVlZGVkIGNsZWFudXAgY29kZSB0byBudGZzX2NsZWFyX2JpZ19pbm9kZSgpLgorCS0gTWVyZ2UgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKGFvcHMuYyksCisJICBub3cganVzdCBoYXZlIG50ZnNfYW9wczoKKwkgIC0gUmVuYW1lOgorCQllbmRfYnVmZmVyX3JlYWRfYXR0cl9hc3luYygpIC0+CW50ZnNfZW5kX2J1ZmZlcl9yZWFkX2FzeW5jKCksCisJCW50ZnNfYXR0cl9yZWFkX2Jsb2NrKCkJICAgICAtPgludGZzX3JlYWRfYmxvY2soKSwKKwkJbnRmc19maWxlX3JlYWRfcGFnZSgpCSAgICAgLT4JbnRmc19yZWFkcGFnZSgpLgorCSAgLSBSZXdyaXRlIGZzL250ZnMvYW9wcy5jOjpudGZzX3JlYWRwYWdlKCkgdG8gd29yayBvbiBib3RoIHJlYWwgYW5kCisJICAgIGF0dHJpYnV0ZSBpbm9kZXMsIGFuZCBib3RoIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisJICAtIFJlbW92ZSBvYnNvbGV0ZSBmcy9udGZzL2FvcHMuYzo6bnRmc19tc3RfcmVhZHBhZ2UoKS4KKworMi4wLjE0IC0gUnVuIGxpc3QgbWVyZ2luZyBjb2RlIGNsZWFudXAsIG1pbm9yIGxvY2tpbmcgY2hhbmdlcywgdHlwbyBmaXhlcy4KKworCS0gQ2hhbmdlIGZzL250ZnMvc3VwZXIuYzo6bnRmc19zdGF0ZnMoKSB0byBub3QgcmVseSBvbiBCS0wgYnkgbW92aW5nCisJICB0aGUgbG9ja2luZyBvdXQgb2Ygc3VwZXIuYzo6Z2V0X25yX2ZyZWVfbWZ0X3JlY29yZHMoKSBhbmQgdGFraW5nIGFuZAorCSAgZHJvcHBpbmcgdGhlIG1mdGJtcF9sb2NrIHJ3X3NlbWFwaG9yZSBpbiBudGZzX3N0YXRmcygpIGl0c2VsZi4KKwktIEJyaW5nIGF0dHJpYnV0ZSBydW5saXN0IG1lcmdpbmcgY29kZSAoZnMvbnRmcy9hdHRyaWIuYykgaW4gc3luYyB3aXRoCisJICBjdXJyZW50IHVzZXJzcGFjZSBudGZzIGxpYnJhcnkgY29kZS4gVGhpcyBtZWFucyB0aGF0IGlmIGEgbWVyZ2UKKwkgIGZhaWxzIHRoZSBvcmlnaW5hbCBydW5saXN0cyBhcmUgYWx3YXlzIGxlZnQgdW5tb2RpZmllZCBpbnN0ZWFkIG9mCisJICBiZWluZyBzaWxlbnRseSBjb3JydXB0ZWQuCisJLSBNaXNjIHR5cG8gZml4ZXMuCisKKzIuMC4xMyAtIFVzZSBpZ2V0NV9sb2NrZWQoKSBpbiBwcmVwYXJhdGlvbiBmb3IgZmFrZSBpbm9kZXMgYW5kIHNtYWxsIGNsZWFudXBzLgorCisJLSBSZW1vdmUgbnJfbWZ0X2JpdHMgYW5kIHRoZSBub3cgc3VwZXJmbHVvdXMgdW5pb24gd2l0aCBucl9tZnRfcmVjb3JkcworCSAgZnJvbSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuCisJLSBSZW1vdmUgbnJfbGNuX2JpdHMgYW5kIHRoZSBub3cgc3VwZXJmbHVvdXMgdW5pb24gd2l0aCBucl9jbHVzdGVycworCSAgZnJvbSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuCisJLSBVc2UgaWdldDVfbG9ja2VkKCkgYW5kIGZyaWVuZHMgaW5zdGVhZCBvZiBjb252ZW50aW9uYWwgaWdldCgpLiBXcmFwCisJICB0aGUgY2FsbCBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfaWdldCgpIGFuZCB1cGRhdGUgY2FsbGVycyBvZiBpZ2V0KCkKKwkgIHRvIHVzZSBudGZzX2lnZXQoKS4gTGVhdmUgb25seSBvbmUgaWdldCgpIGNhbGwgYXQgbW91bnQgdGltZSBzbyB3ZQorCSAgZG9uJ3QgbmVlZCBhbiBudGZzX2lnZXRfbW91bnQoKS4KKwktIENoYW5nZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfbmV3X2V4dGVudF9pbm9kZSgpIHRvIHRha2UgbWZ0X25vIGFzIGFuCisJICBhZGRpdGlvbmFsIGFyZ3VtZW50LgorCisyLjAuMTIgLSBJbml0aWFsIGNsZWFudXAgb2YgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGZvbGxvd2luZyAyLjAuMTEgY2hhbmdlcy4KKworCS0gTWVyZ2UgZnMvbnRmcy9hb3BzLmM6OmVuZF9idWZmZXJfcmVhZF9tc3RfYXN5bmMoKSBhbmQKKwkgIGZzL250ZnMvYW9wcy5jOjplbmRfYnVmZmVyX3JlYWRfZmlsZV9hc3luYygpIGludG8gb25lIGZ1bmN0aW9uCisJICBmcy9udGZzL2FvcHMuYzo6ZW5kX2J1ZmZlcl9yZWFkX2F0dHJfYXN5bmMoKSB1c2luZyBOSW5vTXN0UHJvdGVjdGVkKCkKKwkgIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGFwcGx5IG1zdCBmaXh1cHMgb3Igbm90LgorCS0gQWJvdmUgY2hhbmdlIGFsbG93cyBtZXJnaW5nIGZzL250ZnMvYW9wcy5jOjpudGZzX2ZpbGVfcmVhZF9ibG9jaygpCisJICBhbmQgZnMvbnRmcy9hb3BzLmM6Om50ZnNfbXN0X3JlYWRwYWdlKCkgaW50byBvbmUgZnVuY3Rpb24KKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2F0dHJfcmVhZF9ibG9jaygpLiBBbHNvLCBjcmVhdGUgYSB0aW55IHdyYXBwZXIKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX21zdF9yZWFkcGFnZSgpIHRvIHRyYW5zZm9ybSB0aGUgcGFyYW1ldGVycyBmcm9tCisJICB0aGUgVkZTIHJlYWRwYWdlIGZ1bmN0aW9uIHByb3RvdHlwZSB0byB0aGUgbnRmc19hdHRyX3JlYWRfYmxvY2soKQorCSAgZnVuY3Rpb24gcHJvdG90eXBlLgorCisyLjAuMTEgLSBJbml0aWFsIHByZXBhcmF0aW9ucyBmb3IgZmFrZSBpbm9kZSBiYXNlZCBhdHRyaWJ1dGUgaS9vLgorCisJLSBNb3ZlIGRlZmluaXRpb24gb2YgbnRmc19pbm9kZV9zdGF0ZV9iaXRzIHRvIGZzL250ZnMvaW5vZGUuaCBhbmQKKwkgIGRvIHNvbWUgbWFjcm8gbWFnaWMgKGFkYXB0ZWQgZnJvbSBpbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgpIHRvCisJICBleHBhbmQgYWxsIHRoZSBoZWxwZXIgZnVuY3Rpb25zIE5Jbm9Gb28oKSwgTklub1NldEZvbygpLCBhbmQKKwkgIE5Jbm9DbGVhckZvbygpLgorCS0gQWRkIG5ldyBmbGFnIHRvIG50ZnNfaW5vZGVfc3RhdGVfYml0czogTklfU3BhcnNlLgorCS0gQWRkIG5ldyBmaWVsZHMgdG8gbnRmc19pbm9kZSBzdHJ1Y3R1cmUgdG8gYWxsb3cgdXNlIG9mIGZha2UgaW5vZGVzCisJICBmb3IgYXR0cmlidXRlIGkvbzogdHlwZSwgbmFtZSwgbmFtZV9sZW4uIEFsc28gYWRkIG5ldyBzdGF0ZSBiaXRzOgorCSAgTklfQXR0ciwgd2hpY2gsIGlmIHNldCwgaW5kaWNhdGVzIHRoZSBpbm9kZSBpcyBhIGZha2UgaW5vZGUsIGFuZAorCSAgTklfTXN0UHJvdGVjdGVkLCB3aGljaCwgaWYgc2V0LCBpbmRpY2F0ZXMgdGhlIGF0dHJpYnV0ZSB1c2VzIG11bHRpCisJICBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGlvbiwgaS5lLiBmaXh1cHMgbmVlZCB0byBiZSBhcHBsaWVkIGFmdGVyCisJICByZWFkcyBhbmQgYmVmb3JlL2FmdGVyIHdyaXRlcy4KKwktIFJlbmFtZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfe25ldyxjbGVhcixkZXN0cm95fV9pbm9kZSgpIHRvCisJICBudGZzX3tuZXcsY2xlYXIsZGVzdHJveX1fZXh0ZW50X2lub2RlKCkgYW5kIHVwZGF0ZSBjYWxsZXJzLgorCS0gVXNlIG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKCkgaW4gZnMvbnRmcy9pbm9kZS5jOjpfX250ZnNfY2xlYXJfaW5vZGUoKQorCSAgaW5zdGVhZCBvZiBudGZzX2Rlc3Ryb3lfZXh0ZW50X2lub2RlKCkuCisJLSBDbGVhbnVwIG1lbW9yeSBkZWFsbG9jYXRpb25zIGluIHtfXyx9bnRmc19jbGVhcl97LGJpZ199aW5vZGUoKS4KKwktIE1ha2UgYWxsIG9wZXJhdGlvbnMgb24gbnRmcyBpbm9kZSBzdGF0ZSBiaXRzIHVzZSB0aGUgTklubyogZnVuY3Rpb25zLgorCS0gU2V0IHVwIHRoZSBuZXcgbnRmcyBpbm9kZSBmaWVsZHMgYW5kIHN0YXRlIGJpdHMgaW4KKwkgIGZzL250ZnMvaW5vZGUuYzo6bnRmc19yZWFkX2lub2RlKCkgYW5kIGFkZCBhcHByb3ByaWF0ZSBjbGVhbnVwIG9mCisJICBhbGxvY2F0ZWQgbWVtb3J5IHRvIF9fbnRmc19jbGVhcl9pbm9kZSgpLgorCS0gQ2xlYW51cCBudGZzX2lub2RlIHN0cnVjdHVyZSBhIGJpdCBmb3IgYmV0dGVyIG9yZGVyaW5nIG9mIGVsZW1lbnRzCisJICB3LnIudC4gdGhlaXIgc2l6ZSB0byBhbGxvdyBiZXR0ZXIgcGFja2luZyBvZiB0aGUgc3RydWN0dXJlIGluIG1lbW9yeS4KKworMi4wLjEwIC0gVGhlcmUgY2FuIG9ubHkgYmUgMl4zMiAtIDEgaW5vZGVzIG9uIGFuIE5URlMgdm9sdW1lLgorCisJLSBBZGQgY2hlY2sgYXQgbW91bnQgdGltZSB0byB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyIG9mIGlub2RlcyBvbiB0aGUKKwkgIHZvbHVtZSBkb2VzIG5vdCBleGNlZWQgMl4zMiAtIDEsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZm9yCisJICBOVEZTIGFjY29yZGluZyB0byBNaWNyb3NvZnQuCisJLSBDaGFuZ2UgbWZ0X25vIG1lbWJlciBvZiBudGZzX2lub2RlIHN0cnVjdHVyZSB0byBiZSB1bnNpZ25lZCBsb25nLgorCSAgVXBkYXRlIGFsbCB1c2Vycy4gVGhpcyBtYWtlcyBudGZzX2lub2RlLT5tZnRfbm8ganVzdCBhIGNvcHkgb2Ygc3RydWN0CisJICBpbm9kZS0+aV9pbm8uIEJ1dCB3ZSBjYW4ndCBqdXN0IGFsd2F5cyB1c2Ugc3RydWN0IGlub2RlLT5pX2lubyBhbmQKKwkgIHJlbW92ZSBtZnRfbm8gYmVjYXVzZSBleHRlbnQgaW5vZGVzIGRvIG5vdCBoYXZlIGFuIGF0dGFjaGVkIHN0cnVjdAorCSAgaW5vZGUuCisKKzIuMC45IC0gRGVjb21wcmVzc2lvbiBlbmdpbmUgbm93IHVzZXMgYSBzaW5nbGUgYnVmZmVyIGFuZCBvdGhlciBjbGVhbnVwcy4KKworCS0gQ2hhbmdlIGRlY29tcHJlc3Npb24gZW5naW5lIHRvIHVzZSBhIHNpbmdsZSBidWZmZXIgcHJvdGVjdGVkIGJ5IGEKKwkgIHNwaW4gbG9jayBpbnN0ZWFkIG9mIHBlci1DUFUgYnVmZmVycy4gKFJ1c3R5IFJ1c3NlbGwpCisJLSBEbyBub3QgdXBkYXRlIGNiX3BvcyB3aGVuIGhhbmRsaW5nIGEgcGFydGlhbCBmaW5hbCBwYWdlIGR1cmluZworCSAgZGVjb21wcmVzc2lvbiBvZiBhIHNwYXJzZSBjb21wcmVzc2lvbiBibG9jaywgYXMgdGhlIHZhbHVlIGlzIGxhdGVyCisJICByZXNldCB3aXRob3V0IGJlaW5nIHJlYWQvdXNlZC4gKFJ1c3R5IFJ1c3NlbGwpCisJLSBTd2l0Y2ggdG8gdXNpbmcgdGhlIG5ldyBLTV9CSU9fU1JDX0lSUSBmb3IgYXRvbWljIGttYXAoKXMuIChBbmRyZXcKKwkgIE1vcnRvbikKKwktIENoYW5nZSBidWZmZXIgc2l6ZSBpbiBudGZzX3JlYWRkaXIoKS9udGZzX2ZpbGxkaXIoKSB0byB1c2UKKwkgIE5MU19NQVhfQ0hBUlNFVF9TSVpFIHdoaWNoIG1ha2VzIHRoZSBidWZmZXJzIGFsbW9zdCAxa2lCIGVhY2ggYnV0CisJICBpdCBhbHNvIG1ha2VzIGV2ZXJ5dGhpbmcgc2FmZXIgc28gaXQgaXMgYSBnb29kIHRoaW5nLgorCS0gTWlzY2VsbGFuZW91cyBtaW5vciBjbGVhbnVwcyB0byBjb21tZW50cy4KKworMi4wLjggLSBNYWpvciB1cGRhdGVzIGZvciBoYW5kbGluZyBvZiBjYXNlIHNlbnNpdGl2aXR5IGFuZCBkY2FjaGUgYWxpYXNpbmcuCisKKwlCaWcgdGhhbmtzIGdvIHRvIEFsIFZpcm8gYW5kIG90aGVyIGluaGFiaXRhbnRzIG9mICNrZXJuZWwgZm9yIGludmVzdGluZworCXRoZWlyIHRpbWUgdG8gZGlzY3VzcyB0aGUgY2FzZSBzZW5zaXRpdml0eSBhbmQgZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKworCS0gUmVtb3ZlIHVudXNlZCBzb3VyY2UgZmlsZSBmcy9udGZzL2F0dHJhb3BzLmMuCisJLSBSZW1vdmUgc2hvd19pbm9kZXMgbW91bnQgb3B0aW9uKHMpLCB0aHVzIGRyb3BwaW5nIHN1cHBvcnQgZm9yCisJICBkaXNwbGF5aW5nIG9mIHNob3J0IGZpbGUgbmFtZXMuCisJLSBSZW1vdmUgZGVwcmVjYXRlZCBtb3VudCBvcHRpb24gcG9zaXguCisJLSBSZXN0b3JlIHNob3dfc3lzX2ZpbGVzIG1vdW50IG9wdGlvbi4KKwktIEFkZCBuZXcgbW91bnQgb3B0aW9uIGNhc2Vfc2Vuc2l0aXZlLCB0byBkZXRlcm1pbmUgaWYgdGhlIGRyaXZlcgorCSAgdHJlYXRzIGZpbGUgbmFtZXMgYXMgY2FzZSBzZW5zaXRpdmUgb3Igbm90LiBJZiBjYXNlIHNlbnNpdGl2ZSwgY3JlYXRlCisJICBmaWxlIG5hbWVzIGluIHRoZSBQT1NJWCBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgZmlsZSBuYW1lcyBpbiB0aGUKKwkgIExPTkcvV0lOMzIgbmFtZXNwYWNlLiBOb3RlLCBmaWxlcyByZW1haW4gYWNjZXNzaWJsZSB2aWEgdGhlaXIgc2hvcnQKKwkgIGZpbGUgbmFtZSwgaWYgaXQgZXhpc3RzLgorCS0gUmVtb3ZlIHJlYWxseSBkdW1iIGxvZ2ljIGJ1ZyBpbiBib290IHNlY3RvciByZWNvdmVyeSBjb2RlLgorCS0gRml4IGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMgd3J0IHNob3J0L2xvbmcgZmlsZSBuYW1lcyB2aWEgY2hhbmdlcworCSAgdG8gZnMvbnRmcy9kaXIuYzo6bnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIGFuZAorCSAgZnMvbnRmcy9uYW1laS5jOjpudGZzX2xvb2t1cCgpOgorCSAgLSBBZGQgYWRkaXRpb25hbCBhcmd1bWVudCB0byBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKCkgaW4gd2hpY2ggd2UKKwkgICAgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXRjaGluZyBmaWxlIG5hbWUgaWYgdGhlIGNhc2UgaXMgbm90CisJICAgIG1hdGNoaW5nIG9yIHRoZSBtYXRjaCBpcyBhIHNob3J0IGZpbGUgbmFtZS4gU2VlIGNvbW1lbnRzIGFib3ZlIHRoZQorCSAgICBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBkZXRhaWxzLgorCSAgLSBDaGFuZ2UgbnRmc19sb29rdXAoKSB0byBvbmx5IGNyZWF0ZSBkY2FjaGUgZW50cmllcyBmb3IgdGhlIGNvcnJlY3RseQorCSAgICBjYXNlZCBmaWxlIG5hbWUgYW5kIG9ubHkgZm9yIHRoZSBXSU4zMiBuYW1lc3BhY2UgY291bnRlcnBhcnQgb2YgRE9TCisJICAgIG5hbWVzcGFjZSBmaWxlIG5hbWVzLiBUaGlzIGVuc3VyZXMgd2UgaGF2ZSBvbmx5IG9uZSBkZW50cnkgcGVyCisJICAgIGRpcmVjdG9yeSBhbmQgYWxzbyByZW1vdmVzIGFsbCBkY2FjaGUgYWxpYXNpbmcgaXNzdWVzIGJldHdlZW4gc2hvcnQKKwkgICAgYW5kIGxvbmcgZmlsZSBuYW1lcyBvbmNlIHdlIGFkZCB3cml0ZSBzdXBwb3J0LiBTZWUgY29tbWVudHMgYWJvdmUKKwkgICAgZnVuY3Rpb24gZm9yIGRldGFpbHMuCisJLSBGaXggcG90ZW50aWFsIDEgYnl0ZSBvdmVyZmxvdyBpbiBmcy9udGZzL3VuaXN0ci5jOjpudGZzX3Vjc3RvbmxzKCkuCisKKzIuMC43IC0gTWlub3IgY2xlYW51cHMgYW5kIHVwZGF0ZXMgZm9yIGNoYW5nZXMgaW4gY29yZSBrZXJuZWwgY29kZS4KKworCS0gUmVtb3ZlIG11Y2ggb2YgdGhlIE5VTEwgc3RydWN0IGVsZW1lbnQgaW5pdGlhbGl6ZXJzLgorCS0gVmFyaW91cyB1cGRhdGVzIHRvIG1ha2UgY29tcGF0aWJsZSB3aXRoIHJlY2VudCBrZXJuZWxzLgorCS0gUmVtb3ZlIGRlZmluZXMgb2YgTUFYX0JVRl9QRVJfUEFHRSBhbmQgaW5jbHVkZSBsaW51eC9idWZmZXJfaGVhZC5oCisJICBpbiBmcy9udGZzL250ZnMuaCBpbnN0ZWFkLgorCS0gUmVtb3ZlIG5vIGxvbmdlciBuZWVkZWQgS0VSTkVMX1ZFUlNJT04gY2hlY2tzLiBXZSBhcmUgbm93IGluIHRoZQorCSAga2VybmVsIHByb3BlciBzbyB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgorCisyLjAuNiAtIE1ham9yIGJ1Z2ZpeCB0byBtYWtlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBrZXJuZWwgY2hhbmdlcy4KKworCS0gSW5pdGlhbGl6ZSB0aGUgbWZ0Ym1wIGFkZHJlc3Mgc3BhY2UgcHJvcGVybHkgbm93IHRoYXQgdGhlcmUgYXJlIG1vcmUKKwkgIGZpZWxkcyBpbiB0aGUgc3RydWN0IGFkZHJlc3Nfc3BhY2UuIFRoaXMgd2FzIGxlYWRpbmcgdG8gaGFuZ3MgYW5kCisJICBvb3BzZXMgb24gdW1vdW50IHNpbmNlIDIuNS4xMiBiZWNhdXNlIG9mIGNoYW5nZXMgdG8gb3RoZXIgcGFydHMgb2YKKwkgIHRoZSBrZXJuZWwuIFdlIHByb2JhYmx5IHdhbnQgYSBrZXJuZWwgZ2VuZXJpYyBpbml0X2FkZHJlc3Nfc3BhY2UoKQorCSAgZnVuY3Rpb24uLi4KKwktIERyb3AgQktMIGZyb20gbnRmc19yZWFkZGlyKCkgYWZ0ZXIgY29uc3VsdGF0aW9uIHdpdGggQWwgVmlyby4gVGhlCisJICBvbmx5IGNhbGxlciBvZiAtPnJlYWRkaXIoKSBpcyB2ZnNfcmVhZGRpcigpIHdoaWNoIGhvbGRzIGlfc2VtIGR1cmluZworCSAgdGhlIGNhbGwsIGFuZCBpX3NlbSBpcyBzdWZmaWNpZW50IHByb3RlY3Rpb24gYWdhaW5zdCBjaGFuZ2VzIGluIHRoZQorCSAgZGlyZWN0b3J5IGlub2RlIChpbmNsdWRpbmcgLT5pX3NpemUpLgorCS0gVXNlIGdlbmVyaWNfZmlsZV9sbHNlZWsoKSBmb3IgZGlyZWN0b3JpZXMgKGFzIG9wcG9zZWQgdG8KKwkgIGRlZmF1bHRfbGxzZWVrKCkpIGFzIHRoaXMgZG93bnMgaV9zZW0gaW5zdGVhZCBvZiB0aGUgQktMIHdoaWNoIGlzCisJICB3aGF0IHdlIG5vdyBuZWVkIGZvciBleGNsdXNpb24gYWdhaW5zdCAtPmZfcG9zIGNoYW5nZXMgY29uc2lkZXJpbmcgd2UKKwkgIG5vIGxvbmdlciB0YWtlIHRoZSBCS0wgaW4gbnRmc19yZWFkZGlyKCkuCisKKzIuMC41IC0gTWFqb3IgYnVnZml4LiBCdWZmZXIgb3ZlcmZsb3cgaW4gZXh0ZW50IGlub2RlIGhhbmRsaW5nLgorCisJLSBObyBuZWVkIHRvIHNldCBvbGQgYmxvY2tzaXplIGluIHN1cGVyLmM6Om50ZnNfZmlsbF9zdXBlcigpIGFzIHRoZQorCSAgVkZTIGRvZXMgc28gdmlhIGludm9jYXRpb24gb2YgZGVhY3RpdmF0ZV9zdXBlcigpIGNhbGxpbmcKKwkgIGZzLT5maWxsX3N1cGVyKCkgY2FsbGluZyBibG9ja19raWxsX3N1cGVyKCkgd2hpY2ggZG9lcyBpdC4KKwktIEJLTCBtb3ZlZCBmcm9tIFZGUyBpbnRvIGRpci5jOjpudGZzX3JlYWRkaXIoKS4gKExpbnVzIFRvcnZhbGRzKQorCSAgLT4gRG8gd2UgcmVhbGx5IG5lZWQgaXQ/IEkgZG9uJ3QgdGhpbmsgc28gYXMgd2UgaGF2ZSBleGNsdXNpb24gb24KKwkgIHRoZSBkaXJlY3RvcnkgbnRmc19pbm9kZSByd19zZW1hcGhvcmUgbXJlY19sb2NrLiBXZSBtbWlnaHQgaGF2ZSB0bworCSAgbW92ZSB0aGUgLT5mX3BvcyBhY2Nlc3NlcyB1bmRlciB0aGUgbXJlY19sb2NrIHRob3VnaC4gQ2hlY2sgdGhpcy4uLgorCS0gRml4IHJlYWxseSwgcmVhbGx5LCByZWFsbHkgc3R1cGlkIGJ1ZmZlciBvdmVyZmxvdyBpbiBleHRlbnQgaW5vZGUKKwkgIGhhbmRsaW5nIGluIG1mdC5jOjptYXBfZXh0ZW50X21mdF9yZWNvcmQoKS4KKworMi4wLjQgLSBDbGVhbnVwcyBhbmQgdXBkYXRlcyBmb3Iga2VybmVsIDIuNS4xMS4KKworCS0gQWRkIGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGUgTUQgZHJpdmVyIHRvIGJlIGFibGUgdG8gdXNlIE5URlMKKwkgIHN0cmlwZSBhbmQgdm9sdW1lIHNldHMgaW4gTGludXggYW5kIGdlbmVyYWxseSBjbGVhbnVwIGRvY3VtZW50YXRpb24KKwkgIGEgYml0LgorCVJlbW92ZSBhbGwgdXNlcyBvZiBrZGV2X3QgaW4gZmF2b3VyIG9mIHN0cnVjdCBibG9ja19kZXZpY2UgKjoKKwktIENoYW5nZSBjb21wcmVzcy5jOjpudGZzX2ZpbGVfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKCkgdG8gdXNlCisJICBzYl9nZXRibGsoKSBpbnN0ZWFkIG9mIGdldGJsaygpLgorCS0gQ2hhbmdlIHN1cGVyLmM6Om50ZnNfZmlsbF9zdXBlcigpIHRvIHVzZSBiZGV2X2hhcmRzZWN0X3NpemUoKSBpbnN0ZWFkCisJICBvZiBnZXRfaGFyZHNlY3Rfc2l6ZSgpLgorCS0gTm8gbmVlZCB0byBnZXQgb2xkIGJsb2Nrc2l6ZSBpbiBzdXBlci5jOjpudGZzX2ZpbGxfc3VwZXIoKSBhcworCSAgZnMvc3VwZXIuYzo6Z2V0X3NiX2JkZXYoKSBhbHJlYWR5IGRvZXMgdGhpcy4KKwktIFNldCBiaC0+Yl9iZGV2IGluc3RlYWQgb2YgYmgtPmJfZGV2IHRocm91Z2hvdXQgYW9wcy5jLgorCisyLjAuMyAtIFNtYWxsIGJ1ZyBmaXhlcywgY2xlYW51cHMsIGFuZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuCisKKwktIFJlbW92ZSBzb21lIGRlYWQgY29kZSBmcm9tIG1mdC5jLgorCS0gT3B0aW1pemUgcmVhZHBhZ2UgYW5kIHJlYWRfYmxvY2sgZnVuY3Rpb25zIHRocm91Z2hvdXQgYW9wcy5jIHNvIHRoYXQKKwkgIG9ubHkgaW5pdGlhbGl6ZWQgYmxvY2tzIGFyZSByZWFkLiBOb24taW5pdGlhbGl6ZWQgb25lcyBoYXZlIHRoZWlyCisJICBidWZmZXIgaGVhZCBtYXBwZWQsIHplcm9lZCwgYW5kIHNldCB1cCB0byBkYXRlLCB3aXRob3V0IHNjaGVkdWxpbmcKKwkgIGFueSBpL28uIFRoYW5rcyB0byBBbCBWaXJvIGZvciBhZHZpY2Ugb24gaG93IHRvIGF2b2lkIHRoZSBkZXZpY2UgaS9vLgorCVRoYW5rcyBnbyB0byBBbmRyZXcgTW9ydG9uIGZvciBzcG90dGluZyB0aGUgYmVsb3c6CisJLSBGaXggYnVnbGV0IGluIGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnMoKSBlcnJvciBjb2RlIHBhdGguCisJLSBDYWxsIGZsdXNoX2RjYWNoZV9wYWdlKCkgYWZ0ZXIgbW9kaWZ5aW5nIHBhZ2UgY2FjaGUgcGFnZSBjb250ZW50cyBpbgorCSAgbnRmc19maWxlX3JlYWRwYWdlKCkuCisJLSBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIHBhZ2UgYnVmZmVycyB0aHJvdWdob3V0IGFvcHMuYyBiZWZvcmUgY2FsbGluZworCSAgY3JlYXRlX2VtcHR5X2J1ZmZlcnMoKS4gVGhpcyBoYXBwZW5zIHdoZW4gYW4gSS9PIGVycm9yIG9jY3VycyBhbmQgdGhlCisJICByZWFkIGlzIHJldHJpZWQuIChJdCBhbHNvIGhhcHBlbnMgb25jZSB3cml0aW5nIGlzIGltcGxlbWVudGVkIHNvIHRoYXQKKwkgIG5lZWRlZCBkb2luZyBhbnl3YXkgYnV0IEkgaGFkIGxlZnQgaXQgZm9yIGxhdGVyLi4uKQorCS0gRG9uJ3QgQlVHX09OKCkgdXB0b2RhdGUgYW5kL29yIG1hcHBlZCBidWZmZXJzIHRocm91Z2hvdXQgYW9wcy5jIGluCisJICByZWFkcGFnZSBhbmQgcmVhZF9ibG9jayBmdW5jdGlvbnMuIFJlYXNvbmluZyBzYW1lIGFzIGFib3ZlIChpLmUuIEkvTworCSAgZXJyb3IgcmV0cmllcyBhbmQgZnV0dXJlIHdyaXRlIGNvZGUgcGF0aHMuKQorCisyLjAuMiAtIE1pbm9yIHVwZGF0ZXMgYW5kIGNsZWFudXBzLgorCisJLSBDbGVhbnVwOiByZW5hbWUgbXN0LmM6Ol9fcG9zdF9yZWFkX21zdF9maXh1cCB0byBwb3N0X3dyaXRlX21zdF9maXh1cAorCSAgYW5kIGNsZWFudXAgdGhlIGNvZGUgYSBiaXQsIHJlbW92aW5nIHRoZSB1bnVzZWQgc2l6ZSBwYXJhbWV0ZXIuCisJLSBDaGFuZ2UgZGVmYXVsdCBmbWFzayB0byAwMTc3IGFuZCB1cGRhdGUgZG9jdW1lbnRhdGlvbi4KKwktIENoYW5nZSBhdHRyaWIuYzo6Z2V0X2F0dHJfc2VhcmNoX2N0eCgpIHRvIHJldHVybiB0aGUgc2VhcmNoIGNvbnRleHQKKwkgIGRpcmVjdGx5IGluc3RlYWQgb2YgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlci4gQSByZXR1cm4gdmFsdWUKKwkgIG9mIE5VTEwgbWVhbnMgdGhlIGFsbG9jYXRpb24gZmFpbGVkLiBVcGRhdGVkIGFsbCBjYWxsZXJzCisJICBhcHByb3ByaWF0ZWx5LgorCS0gVXBkYXRlIHRvIDIuNS45IGtlcm5lbCAocHJlc2VydmluZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgYnkKKwkgIHJlcGxhY2luZyBhbGwgb2NjdXJlbmNlcyBvZiBwYWdlLT5idWZmZXJzIHdpdGggcGFnZV9idWZmZXJzKHBhZ2UpLgorCS0gRml4IG1pbm9yIGJ1Z3MgaW4gcnVubGlzdCBtZXJnaW5nLCBhbHNvIG1pbm9yIGNsZWFudXAuCisJLSBVcGRhdGVzIHRvIGJvb3RzZWN0b3IgbGF5b3V0IGFuZCBtZnQgbWlycm9yIGNvbnRlbnRzIGRlc2NyaXB0aW9ucy4KKwktIFNtYWxsIGJ1ZyBmaXggaW4gZXJyb3IgZGV0ZWN0aW9uIGluIHVuaXN0ci5jIGFuZCBzb21lIGNsZWFudXBzLgorCS0gR3JvdyBuYW1lIGJ1ZmZlciBhbGxvY2F0aW9ucyBpbiB1bmlzdHIuYyBpbiBhbGlnbmVkIG11dGxpcGxlZCBvZiA2NAorCSAgYnl0ZXMuCisKKzIuMC4xIC0gTWlub3IgdXBkYXRlcy4KKworCS0gTWFrZSBkZWZhdWx0IHVtYXNrIGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRhdGlvbi4KKwktIEltcHJvdmUgZG9jdW1lbnRhdGlvbi4KKwktIFNldCBkZWZhdWx0IG1vZGUgdG8gaW5jbHVkZSBleGVjdXRlIGJpdC4gVGhlIHt1LGYsZH1tYXNrIGNhbiBiZSB1c2VkCisJICB0byB0YWtlIGl0IGF3YXkgaWYgZGVzaXJlZC4gVGhpcyBhbGxvd3MgYmluYXJpZXMgdG8gYmUgZXhlY3V0ZWQgZnJvbQorCSAgYSBtb3VudGVkIG50ZnMgcGFydGl0aW9uLgorCisyLjAuMCAtIE5ldyB2ZXJzaW9uIG51bWJlci4gUmVtb3ZlIFRORyBmcm9tIHRoZSBuYW1lLiBOb3cgaW4gdGhlIGtlcm5lbC4KKworCS0gQWRkIGtpbGxfc3VwZXIsIGp1c3Qga2VlcGluZyB1cCB3aXRoIHRoZSB2ZnMgY2hhbmdlcyBpbiB0aGUga2VybmVsLgorCS0gUmVwZWF0IHNvbWUgY2hhbmdlcyBmcm9tIHRuZy0wLjAuOCB0aGF0IHNvbWVob3cgZ290IGxvc3Qgb24gdGhlIHdheQorCSAgZnJvbSB0aGUgQ1ZTIGltcG9ydCBpbnRvIEJpdEtlZXBlci4KKwktIEJlZ2luIHRvIGltcGxlbWVudCBwcm9wZXIgaGFuZGxpbmcgb2YgYWxsb2NhdGVkX3NpemUgdnMKKwkgIGluaXRpYWxpemVkX3NpemUgdnMgZGF0YV9zaXplIChpLmUuIGlfc2l6ZSkuIERvbmUgYXJlCisJICBtZnQuYzo6bnRmc19tZnRfcmVhZHBhZ2UoKSwgYW9wcy5jOjplbmRfYnVmZmVyX3JlYWRfaW5kZXhfYXN5bmMoKSwKKwkgIGFuZCBhdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpLgorCS0gTG9jayB0aGUgcnVubGlzdCBpbiBhdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpIHdoaWxlIHVzaW5nIGl0LgorCS0gRml4IG1lbW9yeSBsZWFrIGluIG50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKSBhbmQgZ2VuZXJhbGx5CisJICBjbGVhbiB1cCBjb21wcmVzcy5jIGEgbGl0dGxlLCByZW1vdmluZyBzb21lIHVuY29tbWVudGVkL3VudXNlZCBkZWJ1ZworCSAgY29kZS4KKwktIFRpZHkgdXAgZGlyLmMgYSBsaXR0bGUgYml0LgorCS0gRG9uJ3QgYm90aGVyIGdldHRpbmcgdGhlIHJ1bmxpc3QgaW4gaW5vZGUuYzo6bnRmc19yZWFkX2lub2RlKCkuCisJLSBNZXJnZSBtZnQuYzo6bnRmc19tZnRfcmVhZHBhZ2UoKSBhbmQgYW9wcy5jOjpudGZzX2luZGV4X3JlYWRwYWdlKCkKKwkgIGNyZWF0aW5nIGFvcHMuYzo6bnRmc19tc3RfcmVhZHBhZ2UoKSwgaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZgorCSAgaG9sZXMgYW5kIG92ZXJmbG93IGluIHRoZSBwcm9jZXNzIGFuZCBpbXBsZW1lbnRpbmcgdGhlIGNvcnJlY3QKKwkgIGVxdWl2YWxlbnQgb2YgbnRmc19maWxlX2dldF9ibG9jaygpIGluIG50ZnNfbXN0X3JlYWRwYWdlKCkgaXRzZWxmLgorCSAgSSBhbSBhaW1pbmcgZm9yIGNvcnJlY3RuZXNzIGF0IHRoZSBtb21lbnQuIE1vZHVsYXJpc2F0aW9uIGNhbiBjb21lCisJICBsYXRlci4KKwktIFJlbmFtZSBhb3BzLmM6OmVuZF9idWZmZXJfcmVhZF9pbmRleF9hc3luYygpIHRvCisJICBlbmRfYnVmZmVyX3JlYWRfbXN0X2FzeW5jKCkgYW5kIG9wdGltaXplIHRoZSBvdmVyZmxvdyBjaGVja2luZyBhbmQKKwkgIGhhbmRsaW5nLgorCS0gVXNlIHRoZSBob3N0IG9mIHRoZSBtZnRibXAgYWRkcmVzcyBzcGFjZSBtYXBwaW5nIHRvIGhvbGQgdGhlIG50ZnMKKwkgIHZvbHVtZS4gVGhpcyBpcyBuZWVkZWQgc28gdGhlIGFzeW5jIGkvbyBjb21wbGV0aW9uIGhhbmRsZXIgY2FuCisJICByZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIHZvbHVtZS4gSG9wZWZ1bGx5IHRoaXMgd2lsbCBub3QgY2F1c2UKKwkgIHByb2JsZW1zIGVsc2V3aGVyZSBpbiB0aGUga2VybmVsLi4uIE90aGVyd2lzZSB3aWxsIG5lZWQgdG8gdXNlIGEKKwkgIGZha2UgaW5vZGUuCisJLSBDb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBwcm9wZXIgaGFuZGxpbmcgb2YgYWxsb2NhdGVkX3NpemUgdnMKKwkgIGluaXRpYWxpemVkX3NpemUgdnMgZGF0YV9zaXplIChpLmUuIGlfc2l6ZSkgaW4gd2hvbGUgZHJpdmVyLgorCSAgQmFzaWNhbGx5IGFvcHMuYyBpcyBub3cgY29tcGxldGVseSByZXdyaXR0ZW4uCisJLSBDaGFuZ2UgTlRGUyBkcml2ZXIgbmFtZSB0byBqdXN0IE5URlMgYW5kIHNldCB2ZXJzaW9uIG51bWJlciB0byAyLjAuMAorCSAgdG8gbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGZyb20gdGhlIG9sZCBkcml2ZXIgd2hpY2ggaXMgc3RpbGwgb24KKwkgIHZlcnNpb24gMS4xLjIyLgorCit0bmctMC4wLjggLSAwOC8wMy8yMDAyIC0gTm93IHVzaW5nIEJpdEtlZXBlciwgaHR0cDovL2xpbnV4LW50ZnMuYmtiaXRzLm5ldC8KKworCS0gUmVwbGFjZSBiZGV2bmFtZShzYi0+c19kZXYpIHdpdGggc2ItPnNfaWQuCisJLSBSZW1vdmUgbm93IHN1cGVyZmx1b3VzIG5ldy1saW5lIGNoYXJhY3RlcnMgaW4gYWxsIGNhbGxlcnMgb2YKKwkgIG50ZnNfZGVidWcoKS4KKwktIEFwcGx5IGtsdWRnZSBpbiBudGZzX3JlYWRfaW5vZGUoKSwgc2V0dGluZyBpX25saW5rIHRvIDEgZm9yCisJICBkaXJlY3Rvcmllcy4gV2l0aG91dCB0aGlzIHRoZSAiZmluZCIgdXRpbGl0eSBnZXRzIHZlcnkgdXBzZXQgd2hpY2ggaXMKKwkgIGZhaXIgZW5vdWdoIGFzIExpbnV4L1VuaXggZG8gbm90IHN1cHBvcnQgZGlyZWN0b3J5IGhhcmQgbGlua3MuCisJLSBGdXJ0aGVyIHJ1bmxpc3QgbWVyZ2luZyB3b3JrLiAoUmljaGFyZCBSdXNzb24pCisJLSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgZ2NjLTIuOTUuIChSaWNoYXJkIFJ1c3NvbikKKwktIFVwZGF0ZSB0byBrZXJuZWwgMi41LjUtcHJlMSBhbmQgcmVkaWZmIHRoZSBub3cgdGlueSBwYXRjaC4KKwktIENvbnZlcnQgdG8gbmV3IGZpbGUgc3lzdGVtIGRlY2xhcmF0aW9uIHVzaW5nIC0+bnRmc19nZXRfc2IoKSBhbmQKKwkgIHJlcGxhY2luZyBudGZzX3JlYWRfc3VwZXIoKSB3aXRoIG50ZnNfZmlsbF9zdXBlcigpLgorCS0gU2V0IHNfbWF4Ynl0ZXMgdG8gTUFYX0xGU19GSUxFU0laRSB0byBhdm9pZCBwYWdlIGNhY2hlIHBhZ2UgaW5kZXgKKwkgIG92ZXJmbG93IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgorCS0gQ2xlYW51cCB1cGNhc2UgbG9hZGluZyBjb2RlIHRvIHVzZSBudGZzXyh1biltYXBfcGFnZSgpLgorCS0gRGlzYWJsZS9yZWVuYWJsZSBwcmVlbXRpb24gaW4gY3JpdGljYWwgc2VjdGlvbnMgb2YgY29tcGVzc2lvbiBlbmdpbmUuCisJLSBSZXBsYWNlIGRldmljZSBzaXplIGRldGVybWluYXRpb24gaW4gbnRmc19maWxsX3N1cGVyKCkgd2l0aAorCSAgc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSAoaW4gYnl0ZXMpIGFuZCByZW1vdmUgbm93IHN1cGVyZmx1b3VzCisJICBmdW5jdGlvbiBzdXBlci5jOjpnZXRfbnJfYmxvY2tzKCkuCisJLSBJbXBsZW1lbnQgYSBtb3VudCB0aW1lIG9wdGlvbiAoc2hvd19pbm9kZXMpIGFsbG93aW5nIGNob2ljZSBvZiB3aGljaAorCSAgdHlwZXMgb2YgaW5vZGUgbmFtZXMgcmVhZGRpcigpIHJldHVybnMgYW5kIG1vZGlmeSBudGZzX2ZpbGxkaXIoKQorCSAgYWNjb3JkaW5nbHkuIFRoZXJlIGFyZSBzZXZlcmFsIHBhcmFtZXRlcnMgdG8gc2hvd19pbm9kZXM6CisJCXN5c3RlbToJc3lzdGVtIGZpbGVzCisJCXdpbjMyOglsb25nIGZpbGUgbmFtZXMgKGluY2x1ZGluZyBQT1NJWCBmaWxlIG5hbWVzKSBbREVGQVVMVF0KKwkJbG9uZzoJc2FtZSBhcyB3aW4zMgorCQlkb3M6CXNob3J0IGZpbGUgbmFtZXMgb25seSAoZXhjbHVkaW5nIFBPU0lYIGZpbGUgbmFtZXMpCisJCXNob3J0OglzYW1lIGFzIGRvcworCQlwb3NpeDoJc2FtZSBhcyBib3RoIHdpbjMyIGFuZCBkb3MKKwkJYWxsOglhbGwgZmlsZSBuYW1lcworCSAgTm90ZSB0aGF0IHRoZSBvcHRpb25zIGFyZSBhZGRpdGl2ZSwgaS5lLiBzcGVjaWZ5aW5nOgorCQktbyBzaG93X2lub2Rlcz1zeXN0ZW0sc2hvd19pbm9kZXM9d2luMzIsc2hvd19pbm9kZXM9ZG9zCisJICBpcyB0aGUgc2FtZSBhcyBzcGVjaWZ5aW5nOgorCQktbyBzaG93X2lub2Rlcz1hbGwKKwkgIE5vdGUgdGhhdCB0aGUgInBvc2l4IiBhbmQgImFsbCIgb3B0aW9ucyB3aWxsIHNob3cgYWxsIGRpcmVjdG9yeQorCSAgbmFtZXMsIEJVVCB0aGUgbGluayBjb3VudCBvbiBlYWNoIGRpcmVjdG9yeSBpbm9kZSBlbnRyeSBpcyBzZXQgdG8gMSwKKwkgIGR1ZSB0byBMaW51eCBub3Qgc3VwcG9ydGluZyBkaXJlY3RvcnkgaGFyZCBsaW5rcy4gVGhpcyBtYXkgd2VsbAorCSAgY29uZnVzZSBzb21lIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSBkaXJlY3RvcnkgbmFtZXMgd2lsbAorCSAgaGF2ZSB0aGUgc2FtZSBpbm9kZSBudW1iZXJzLiBUaHVzIGl0IGlzIE5PVCBhZHZpc2FibGUgdG8gdXNlIHRoZQorCSAgInBvc2l4IiBvciAiYWxsIiBvcHRpb25zLiBXZSBwcm92aWRlIHRoZW0gb25seSBmb3IgY29tcGxldGVuZXNzIHNha2UuCisJLSBBZGQgY29waWVzIG9mIGFsbG9jYXRlZF9zaXplLCBpbml0aWFsaXplZF9zaXplLCBhbmQgY29tcHJlc3NlZF9zaXplIHRvCisJICB0aGUgbnRmcyBpbm9kZSBzdHJ1Y3R1cmUgYW5kIHNldCB0aGVtIHVwIGluCisJICBpbm9kZS5jOjpudGZzX3JlYWRfaW5vZGUoKS4gVGhlc2UgcmVmbGVjdCB0aGUgdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZQorCSAgZm9yIGZpbGVzIGFuZCB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIGRpcmVjdG9yaWVzLgorCS0gQWRkIGNvcGllcyBvZiBhbGxvY2F0ZWRfc2l6ZSBhbmQgaW5pdGlhbGl6ZWRfc2l6ZSB0byBudGZzIGlub2RlIGZvcgorCSAgJEJJVE1BUCBhdHRyaWJ1dGUgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgYW5kIHNldCB0aGVtIHVwIGluCisJICBpbm9kZS5jOjpudGZzX3JlYWRfaW5vZGUoKS4KKwktIEFkZCBjb3BpZXMgb2YgYWxsb2NhdGVkX3NpemUgYW5kIGluaXRpYWxpemVkX3NpemUgdG8gbnRmcyB2b2x1bWUgZm9yCisJICAkQklUTUFQIGF0dHJpYnV0ZSBvZiAkTUZUIGFuZCBzZXQgdGhlbSB1cCBpbgorCSAgc3VwZXIuYzo6bG9hZF9zeXN0ZW1fZmlsZXMoKS4KKwktIFBhcnNlIGRlcHJlY2F0ZWQgbnRmcyBkcml2ZXIgb3B0aW9ucyAoaW9jaGFyc2V0LCBzaG93X3N5c19maWxlcywKKwkgIHBvc2l4LCBhbmQgdXRmOCkgYW5kIHRlbGwgdXNlciB3aGF0IHRoZSBuZXcgb3B0aW9ucyB0byB1c2UgYXJlLiBOb3RlCisJICB3ZSBzdGlsbCBkbyBzdXBwb3J0IHRoZW0gYnV0IHRoZXkgd2lsbCBiZSByZW1vdmVkIHdpdGgga2VybmVsIDIuNy54LgorCS0gQ2hhbmdlIGFsbCBvY2N1cmVuY2VzIG9mIGludGVnZXIgbG9uZyBsb25nIHByaW50ZiBmb3JtYXR0aW5nIHRvIGhleAorCSAgYXMgcHJpbnRrKCkgd2lsbCBub3Qgc3VwcG9ydCBsb25nIGxvbmcgaW50ZWdlciBmb3JtYXQgaWYvd2hlbiB0aGUKKwkgIGRpdjY0IHBhdGNoIGdvZXMgaW50byB0aGUga2VybmVsLgorCS0gTWFrZSBzbGFiIGNhY2hlcyBoYXZlIHN0YWJsZSBuYW1lcyBhbmQgY2hhbmdlIHRoZSBuYW1lcyB0byB3aGF0IHRoZXkKKwkgIHdlcmUgaW50ZW5kZWQgdG8gYmUuIFRoZXNlIGNoYW5nZXMgYXJlIHJlcXVpcmVkL21hZGUgcG9zc2libGUgYnkgdGhlCisJICBuZXcgc2xhYiBjYWNoZSBuYW1lIGhhbmRsaW5nIHdoaWNoIHJlbW92ZXMgdGhlIGxlbmd0aCBsaW1pdGF0aW9uIGJ5CisJICByZXF1aXJpbmcgdGhlIGNhbGxlciBvZiBrbWVtX2NhY2hlX2NyZWF0ZSgpIHRvIHN1cHBseSBhIHN0YWJsZSBuYW1lCisJICB3aGljaCBpcyB0aGVuIHJlZmVyZW5jZWQgYnV0IG5vdCBjb3BpZWQuCisJLSBSZW5hbWUgcnVuX2xpc3Qgc3RydWN0dXJlIHRvIHJ1bl9saXN0X2VsZW1lbnQgYW5kIGNyZWF0ZSBhIG5ldworCSAgcnVuX2xpc3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIHRvIGEgcnVuX2xpc3RfZWxlbWVudAorCSAgc3RydWN0dXJlIGFuZCBhIHJlYWQvd3JpdGUgc2VtYXBob3JlLiBBZGFwdCBhbGwgdXNlcnMgb2YgcnVubGlzdHMKKwkgIHRvIG5ldyBzY2hlbWUgYW5kIHRha2UgYW5kIHJlbGVhc2UgdGhlIGxvY2sgYXMgbmVlZGVkLiBUaGlzIGZpeGVzIGEKKwkgIG5hc3R5IHJhY2UgYXMgdGhlIHJ1bl9saXN0IGNoYW5nZXMgZXZlbiB3aGVuIGlub2RlcyBhcmUgbG9ja2VkIGZvcgorCSAgcmVhZGluZyBhbmQgZXZlbiB3aGVuIHRoZSBpbm9kZSBpc24ndCBsb2NrZWQgYXQgYWxsLCBzbyB3ZSByZWFsbHkKKwkgIG5lZWRlZCB0aGUgc2VyaWFsaXphdGlvbi4gV2UgdXNlIGEgc2VtYXBob3JlIHJhdGhlciB0aGFuIGEgc3BpbmxvY2sKKwkgIGFzIG1lbW9yeSBhbGxvY2F0aW9ucyBjYW4gc2xlZXAgYW5kIGRvaW5nIGV2ZXJ5dGhpbmcgR0ZQX0FUT01JQworCSAgd291bGQgYmUgc2lsbHkuCisJLSBDbGVhbnVwIHJlYWRfaW5vZGUoKSByZW1vdmluZyBhbGwgY29kZSBjaGVja2luZyBmb3IgbG93ZXN0X3ZjbiAhPSAwLgorCSAgVGhpcyBjYW4gbmV2ZXIgaGFwcGVuIGR1ZSB0byB0aGUgbmF0dXJlIG9mIGxvb2t1cF9hdHRyKCkgYW5kIGhvdyB3ZQorCSAgc3VwcG9ydCBhdHRyaWJ1dGUgbGlzdHMuIElmIGl0IGRpZCBoYXBwZW4gaXQgd291bGQgaW1wbHkgdGhlIGlub2RlCisJICBiZWluZyBjb3JydXB0LgorCS0gQ2hlY2sgZm9yIGxvd2VzdF92Y24gIT0gMCBpbiBudGZzX3JlYWRfaW5vZGUoKSBhbmQgbWFyayB0aGUgaW5vZGUgYXMKKwkgIGJhZCBpZiBmb3VuZC4KKwktIFVwZGF0ZSB0byAyLjUuNi1wcmUyIGNoYW5nZXMgaW4gc3RydWN0IGFkZHJlc3Nfc3BhY2UuCisJLSBVc2UgcGFyZW50X2lubygpIHdoZW4gYWNjZXNzaW5nIGRfcGFyZW50IGlub2RlIG51bWJlciBpbiBkaXIuYy4KKwktIEltcG9ydCBTb3VyY2Vmb3JnZSBDVlMgcmVwb3NpdG9yeSBpbnRvIEJpdEtlZXBlciByZXBvc2l0b3J5OgorCQlodHRwOi8vbGludXgtbnRmcy5ia2JpdHMubmV0L250ZnMtdG5nLTIuNQorCS0gVXBkYXRlIGZzL01ha2VmaWxlLCBmcy9Db25maWcuaGVscCwgZnMvQ29uZmlnLmluLCBhbmQKKwkgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQgZm9yIE5URlMgVE5HLgorCS0gQ3JlYXRlIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBjb250cm9sbGluZyB3aGV0aGVyIGRlYnVnZ2luZworCSAgaXMgZW5hYmxlZCBvciBub3QuCisJLSBBZGQgdGhlIHJlcXVpcmVkIGV4cG9ydCBvZiBlbmRfYnVmZmVyX2lvX3N5bmMoKSBmcm9tIHRoZSBwYXRjaGVzCisJICBkaXJlY3RvcnkgdG8gdGhlIGtlcm5lbCBjb2RlLgorCS0gVXBkYXRlIGlub2RlLmM6Om50ZnNfc2hvd19vcHRpb25zKCkgd2l0aCBzaG93X2lub2RlcyBtb3VudCBvcHRpb24uCisJLSBVcGRhdGUgZXJyb3JzIG1vdW50IG9wdGlvbi4KKwordG5nLTAuMC43IC0gMTMvMDIvMjAwMiAtIFRoZSBkcml2ZXIgaXMgbm93IGZlYXR1cmUgY29tcGxldGUgZm9yIHJlYWQtb25seSEKKworCS0gQ2xlYW51cCBtZnQuYyBhbmQgaXQncyBkZWJ1Zy9lcnJvciBvdXRwdXQgaW4gcGFydGljdWxhci4gRml4IGEgbWlub3IKKwkgIGJ1ZyBpbiBtYXBwaW5nIG9mIGV4dGVudCBpbm9kZXMuIFVwZGF0ZSBhbGwgdGhlIGNvbW1lbnRzIHRvIGZpdCBhbGwKKwkgIHRoZSByZWNlbnQgY29kZSBjaGFuZ2VzLgorCS0gTW9kaWZ5IHZjbl90b19sY24oKSB0byBjb3BlIHdpdGggZW50aXJlbHkgdW5tYXBwZWQgcnVubGlzdHMuCisJLSBDbGVhbnVwcyBpbiBjb21wcmVzcy5jLCBtb3N0bHkgY29tbWVudHMgYW5kIGZvbGRpbmcgaGVscC4KKwktIEltcGxlbWVudCBhdHRyaWIuYzo6bWFwX3J1bl9saXN0KCkgYXMgYSBnZW5lcmljIGhlbHBlci4KKwktIE1ha2UgY29tcHJlc3MuYzo6bnRmc19maWxlX3JlYWRfY29tcHJlc3NlZF9ibG9jaygpIHVzZSBtYXBfcnVuX2xpc3QoKQorCSAgdGh1cyBtYWtpbmcgY29kZSBzaG9ydGVyIGFuZCBlbmFibGluZyBhdHRyaWJ1dGUgbGlzdCBzdXBwb3J0LgorCS0gQ2xlYW51cCBpbmNvcnJlY3QgdXNlIG9mIFtzdV02NCB3aXRoICVMIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyIGluCisJICBhbGwgc291cmNlIGZpbGVzLiBUeXBlIGNhc3RzIHRvIFt1bnNpZ25lZF0gbG9uZyBsb25nIGFkZGVkIHRvIGNvcnJlY3QKKwkgIHRoZSBtaXNtYXRjaGVzIChpbXBvcnRhbnQgZm9yIGFyY2hpdGVjdHVyZXMgd2hpY2ggaGF2ZSBsb25nIGxvbmcgbm90CisJICBiZWluZyA2NCBiaXRzKS4KKwktIE1lcmdlIGFzeW5jIGlvIGNvbXBsZXRpb24gaGFuZGxlcnMgZm9yIGRpcmVjdG9yeSBpbmRleGVzIGFuZCAkTUZUCisJICBkYXRhIGludG8gb25lIGJ5IHNldHRpbmcgdGhlIGluZGV4X2Jsb2NrX3NpemV7X2JpdHN9IG9mIHRoZSBudGZzCisJICBpbm9kZSBmb3IgJE1GVCB0byB0aGUgbWZ0X3JlY29yZF9zaXple19iaXRzfSBvZiB0aGUgbnRmc192b2x1bWUuCisJLSBDbGVhbnVwIGFvcHMuYywgdXBkYXRlIGNvbW1lbnRzLgorCS0gTWFrZSBudGZzX2ZpbGVfZ2V0X2Jsb2NrKCkgdXNlIG1hcF9ydW5fbGlzdCgpIHNvIGFsbCBmaWxlcyBub3cKKwkgIHN1cHBvcnQgYXR0cmlidXRlIGxpc3RzLgorCS0gTWFrZSBudGZzX2Rpcl9yZWFkcGFnZSgpIGFsbW9zdCB2ZXJiYXRpbSBjb3B5IG9mCisJICBibG9ja19yZWFkX2Z1bGxfcGFnZSgpIGJ5IHVzaW5nIG50ZnNfZmlsZV9nZXRfYmxvY2soKSB3aXRoIG9ubHkgcmVhbAorCSAgZGlmZmVyZW5jZSBiZWluZyB0aGUgdXNlIG9mIG91ciBvd24gYXN5bmMgaW8gY29tcGxldGlvbiBoYW5kbGVyCisJICByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUsIHRodXMgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiBjb2RlIGFuZAorCSAgYXV0b21hdGljYWxseSBlbmFibGluZyBhdHRyaWJ1dGUgbGlzdCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgaW5kaWNlcy4KKwktIEZpeCBidWcgaW4gbG9hZF9hdHRyaWJ1dGVfbGlzdCgpIC0gZm9yZ290IHRvIGNhbGwgYnJlbHNlIGluIGVycm9yCisJICBjb2RlIHBhdGguCisJLSBDaGFuZ2UgcGFyYW1ldGVycyB0byBmaW5kX2F0dHIoKSBhbmQgbG9va3VwX2F0dHIoKS4gV2Ugbm8gbG9uZ2VyCisJICBwYXNzIGluIHRoZSB1cGNhc2UgdGFibGUgYW5kIGl0cyBsZW5ndGguIFRoZXNlIGNhbiBiZSBnb3R0ZW4gZnJvbQorCSAgY3R4LT5udGZzX2luby0+dm9sLT51cGNhc2V7X2xlbn0uIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwktIENsZWFudXBzIGluIGF0dHJpYi5jLgorCS0gSW1wbGVtZW50IG1lcmdpbmcgb2YgcnVubGlzdHMsIGF0dHJpYi5jOjptZXJnZV9ydW5fbGlzdHMoKSBhbmQgaXRzCisJICBoZWxwZXJzLiAoUmljaGFyZCBSdXNzb24pCisJLSBBdHRyaWJ1dGUgbGlzdHMgcGFydCAyLCBhdHRyaWJ1dGUgZXh0ZW50cyBhbmQgbXVsdGkgcGFydCBydW5saXN0czoKKwkgIGVuYWJsZSBwcm9wZXIgc3VwcG9ydCBmb3IgTENOX1JMX05PVF9NQVBQRUQgYW5kIGF1dG9tYXRpYyBtYXBwaW5nIG9mCisJICBmdXJ0aGVyIHJ1bmxpc3QgcGFydHMgdmlhIGF0dHJpYi5jOjptYXBfcnVuX2xpc3QoKS4KKwktIFRpbnkgZW5kaWFubmVzcyBidWcgZml4IGluIGRlY29tcHJlc3NfbWFwcGluZ19wYWlycygpLgorCit0bmctMC4wLjYgLSBFbmNyeXB0ZWQgZGlyZWN0b3JpZXMsIGJ1ZyBmaXhlcywgY2xlYW51cHMsIGRlYnVnZ2luZyBlbmhhbmNlbWVudHMuCisKKwktIEVuYWJsZSBlbmNyeXB0ZWQgZGlyZWN0b3JpZXMuIChUaGVpciBpbmRleCByb290IGlzIG1hcmtlZCBlbmNyeXB0ZWQKKwkgIHRvIGluZGljYXRlIHRoYXQgbmV3IGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5IHNob3VsZCBiZSBjcmVhdGVkCisJICBlbmNyeXB0ZWQuKQorCS0gRml4IGJ1ZyBpbiBOSW5vQm1wTm9uUmVzaWRlbnQoKSBtYWNyby4gKEN1dCBhbmQgcGFzdGUgZXJyb3IuKQorCS0gRW5hYmxlICRFeHRlbmQgc3lzdGVtIGRpcmVjdG9yeS4gTW9zdCAoaWYgbm90IGFsbCkgZXh0ZW5kZWQgc3lzdGVtCisJICBmaWxlcyBkbyBub3QgaGF2ZSB1bm5hbWVkIGRhdGEgYXR0cmlidXRlcyBzbyBudGZzX3JlYWRfaW5vZGUoKSBoYWQgdG8KKwkgIHNwZWNpYWwgY2FzZSB0aGVtIGJ1dCB0aGF0IGlzIG9rLCBhcyB0aGUgc3BlY2lhbCBjYXNpbmcgcmVjb3ZlcnkKKwkgIGhhcHBlbnMgaW5zaWRlIGFuIGVycm9yIGNvZGUgcGF0aCBzbyB0aGVyZSBpcyB6ZXJvIHNsb3cgZG93biBpbiB0aGUKKwkgIG5vcm1hbCBmYXN0IHBhdGguIFRoZSBzcGVjaWFsIGNhc2luZyBpcyBkb25lIGJ5IGludHJvZHVjaW5nIGEgbmV3CisJICBmdW5jdGlvbiBpbm9kZS5jOjpudGZzX2lzX2V4dGVuZGVkX3N5c3RlbV9maWxlKCkgd2hpY2ggY2hlY2tzIGlmIGFueQorCSAgb2YgdGhlIGhhcmQgbGlua3MgaW4gdGhlIGlub2RlIHBvaW50IHRvICRFeHRlbmQgYXMgYmVpbmcgdGhlaXIgcGFyZW50CisJICBkaXJlY3RvcnkgYW5kIGlmIHRoZXkgZG8gd2UgYXNzdW1lIHRoaXMgaXMgYW4gZXh0ZW5kZWQgc3lzdGVtIGZpbGUuCisJLSBDcmVhdGUgYSBzeXNjdGwvcHJvYyBpbnRlcmZhY2UgdG8gYWxsb3cge2Rpcyxlbn1hYmxpbmcgb2YgZGVidWcgb3V0cHV0CisJICB3aGVuIGNvbXBpbGVkIHdpdGggLURERUJVRy4gRGVmYXVsdCBpcyBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBkaXNhYmxlZC4KKwkgIFRvIGVuYWJsZSB0aGVtLCBvbmUgd3JpdGVzIGEgbm9uLXplcm8gdmFsdWUgdG8gL3Byb2Mvc3lzL2ZzL250ZnMtZGVidWcKKwkgIChpZiAvcHJvYyBpcyBlbmFibGVkKSBvciB1c2VzIHN5c2N0bCgyKSB0byBlZmZlY3QgdGhlIHNhbWUgKGlmIHN5c2N0bAorCSAgaW50ZXJmYWNlIGlzIGVuYWJsZWQpLiBJbnNwaXJlZCBieSBvbGQgbnRmcyBkcml2ZXIuCisJLSBBZGQgZGVidWdfbXNncyBpbnNtb2Qva2VybmVsIGJvb3QgcGFyYW1ldGVyIHRvIHNldCB3aGV0aGVyIGRlYnVnCisJICBtZXNzYWdlcyBhcmUge2Rpcyxlbn1hYmxlZC4gVGhpcyBpcyB1c2VmdWwgdG8gZW5hYmxlIGRlYnVnIG1lc3NhZ2VzCisJICBkdXJpbmcgbnRmcyBpbml0aWFsaXphdGlvbiBhbmQgaXMgdGhlIG9ubHkgd2F5IHRvIGFjdGl2YXRlIGRlYnVnZ2luZworCSAgd2hlbiB0aGUgc3lzY3RsIGludGVyZmFjZSBpcyBub3QgZW5hYmxlZC4KKwktIENsZWFudXAgZGVidWcgb3V0cHV0IGluIHZhcmlvdXMgcGxhY2VzLgorCS0gUmVtb3ZlIGFsbCBkb2xsYXIgc2lnbnMgKCQpIGZyb20gdGhlIHNvdXJjZSAoZXhjZXB0IGNvbW1lbnRzKSB0bworCSAgZW5hYmxlIGNvbXBpbGF0aW9uIG9uIGFyY2hpdGVjdHVyZXMgd2hvc2UgZ2NjIGNvbXBpbGVyIGRvZXMgbm90CisJICBzdXBwb3J0IGRvbGxhciBzaWducyBpbiB0aGUgbmFtZXMgb2YgdmFyaWFibGVzL2NvbnN0YW50cy4gQXR0cmlidXRlCisJICB0eXBlcyBub3cgc3RhcnQgd2l0aCBBVF8gaW5zdGVhZCBvZiAkIGFuZCAkSTMwIGlzIG5vdyBqdXN0IEkzMC4KKwktIENsZWFudXAgbnRmc19sb29rdXAoKSBhbmQgYWRkIGNvbnNpc3RlbmN5IGNoZWNrIG9mIHNlcXVlbmNlIG51bWJlcnMuCisJLSBMb2FkIGNvbXBsZXRlIHJ1bmxpc3QgZm9yICRNRlQvJEJJVE1BUCBkdXJpbmcgbW91bnQgYW5kIGNsZWFudXAKKwkgIGFjY2VzcyBmdW5jdGlvbnMuIFRoaXMgbWVhbnMgd2Ugbm93IGNvcGUgd2l0aCAkTUZULyRCSVRNQVAgYmVpbmcKKwkgIHNwcmVhZCBhY2Nyb3NzIHNldmVyYWwgbWZ0IHJlY29yZHMuCisJLSBEaXNhYmxlIG1vZGlmaWNhdGlvbiBvZiBtZnRfem9uZV9tdWx0aXBsaWVyIG9uIHJlbW91bnQuIFdlIGNhbiBhbHdheXMKKwkgIHJlZW5hYmxlIHRoaXMgbGF0ZXIgb24gaWYgd2UgcmVhbGx5IHdhbnQgdG8sIGJ1dCB3ZSB3aWxsIG5lZWQgdG8gbWFrZQorCSAgc3VyZSB3ZSByZWFkanVzdCB0aGUgbWZ0X3pvbmUgc2l6ZSAvIGxheW91dCBhY2NvcmRpbmdseS4KKwordG5nLTAuMC41IC0gTW9kZXJuaXplIGZvciAyLjUueCBhbmQgZnVydGhlciBpbiBsaW5lLWluZyB3aXRoIEFsIFZpcm8ncyBjb21tZW50cy4KKworCS0gVXNlIHNiX3NldF9ibG9ja3NpemUoKSBpbnN0ZWFkIG9mIHNldF9ibG9ja3NpemUoKSBhbmQgdmVyaWZ5IHRoZQorCSAgcmV0dXJuIHZhbHVlLgorCS0gVXNlIHNiX2JyZWFkKCkgaW5zdGVhZCBvZiBicmVhZCgpIHRocm91Z2hvdXQuCisJLSBBZGQgaW5kZXhfdmNuX3NpemV7X2JpdHN9IHRvIG50ZnNfaW5vZGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBzaXplCisJICBvZiBhIGRpcmVjdG9yeSBpbmRleCBibG9jayB2Y24uIEFwcGx5IHJlc3VsdGluZyBzaW1wbGlmaWNhdGlvbnMgaW4KKwkgIGRpci5jIGV2ZXJ5d2hlcmUuCisJLSBGaXggYSBzbWFsbCBidWcgc29tZXdoZXJlIChidXQgZm9yZ290IHdoYXQgaXQgd2FzKS4KKwktIENoYW5nZSBudGZzX3tkZWJ1ZyxlcnJvcix3YXJuaW5nfSB0byBlbmFibGUgZ2NjIHRvIGRvIHR5cGUgY2hlY2tpbmcKKwkgIG9uIHRoZSBwcmludGYtZm9ybWF0IHBhcmFtZXRlciBsaXN0IGFuZCBmaXggYnVncyByZXBvcnRlZCBieSBnY2MKKwkgIGFzIGEgcmVzdWx0LiAoUmljaGFyZCBSdXNzb24pCisJLSBNb3ZlIGlub2RlIGFsbG9jYXRpb24gc3RyYXRlZ3kgdG8gQWwncyBuZXcgc3R1ZmYgYnV0IG1haW50YWluIHRoZQorCSAgZGl2b3JjZSBvZiBudGZzX2lub2RlIGZyb20gc3RydWN0IGlub2RlLiBUbyBhY2hpZXZlIHRoaXMgd2UgaGF2ZSB0d28KKwkgIHNlcGFyYXRlIHNsYWIgY2FjaGVzLCBvbmUgZm9yIGJpZyBudGZzIGlub2RlcyBjb250YWluaW5nIGEgc3RydWN0CisJICBpbm9kZSBhbmQgcHVyZSBudGZzIGlub2RlcyBhbmQgYXQgdGhlIHNhbWUgdGltZSBmaXggc29tZSBmYXVsdHkKKwkgIGVycm9yIGNvZGUgcGF0aHMgaW4gbnRmc19yZWFkX2lub2RlKCkuCisJLSBTaG93IG1vdW50IG9wdGlvbnMgaW4gcHJvYyAoaW5vZGUuYzo6bnRmc19zaG93X29wdGlvbnMoKSkuCisKK3RuZy0wLjAuNCAtIEJpZyBjaGFuZ2VzLCBnZXR0aW5nIGluIGxpbmUgd2l0aCBBbCBWaXJvJ3MgY29tbWVudHMuCisKKwktIE1vZGlmaWVkICh1biltYXBfbWZ0X3JlY29yZCBmdW5jdGlvbnMgdG8gYmUgY29tbW9uIGZvciByZWFkIGFuZCB3cml0ZQorCSAgY2FzZS4gVG8gc3BlY2lmeSB3aGljaCBpcyB3aGljaCwgYWRkZWQgZXh0cmEgcGFyYW1ldGVyIGF0IGZyb250IG9mCisJICBwYXJhbWV0ZXIgbGlzdC4gUGFzcyBlaXRoZXIgUkVBRCBvciBXUklURSB0byB0aGlzLCBlYWNoIGhhcyB0aGUKKwkgIG9idmlvdXMgbWVhbmluZy4KKwktIEdlbmVyYWwgY2xlYW51cHMgdG8gYWxsb3cgZm9yIGVhc2llciBmb2xkaW5nIGluIHZpLgorCS0gYXR0cmliLmM6OmRlY29tcHJlc3NfbWFwcGluZ19wYWlycygpIG5vdyBhY2NlcHRzIHRoZSBvbGQgcnVubGlzdAorCSAgYXJndW1lbnQsIGFuZCBpbnZva2VzIGF0dHJpYi5jOjptZXJnZV9ydW5fbGlzdHMoKSB0byBtZXJnZSB0aGUgb2xkCisJICBhbmQgdGhlIG5ldyBydW5saXN0cy4KKwktIFJlbW92ZWQgYXR0cmliLmM6OmZpbmRfZmlyc3RfYXR0cigpLgorCS0gSW1wbGVtZW50ZWQgbG9hZGluZyBvZiBhdHRyaWJ1dGUgbGlzdCBhbmQgY29tcGxldGUgcnVubGlzdCBmb3IgJE1GVC4KKwkgIFRoaXMgbWVhbnMgd2Ugbm93IGNvcGUgd2l0aCAkTUZUIGJlaW5nIHNwcmVhZCBhY3Jvc3Mgc2V2ZXJhbCBtZnQKKwkgIHJlY29yZHMuCisJLSBBZGFwdCB0byAyLjUuMi1wcmU5IGFuZCB0aGUgY2hhbmdlZCBjcmVhdGVfZW1wdHlfYnVmZmVycygpIHN5bnRheC4KKwktIEFkYXB0IG1ham9yL21pbm9yL2tkZXZfdC9bYmtdZGV2bmFtZSBzdHVmZiB0byBuZXcgMi41Lngga2VybmVscy4KKwktIE1ha2UgbnRmc192b2x1bWUgYmUgYWxsb2NhdGVkIHZpYSBrbWFsbG9jKCkgaW5zdGVhZCBvZiB1c2luZyBhIHNsYWIKKwkgIGNhY2hlLiBUaGVyZSBhcmUgdG9vIGxpdHRsZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmVzIGF0IGFueSBvbmUgdGltZQorCSAgdG8ganVzdGlmeSBhIHByaXZhdGUgc2xhYiBjYWNoZS4KKwktIEZpeCBib2d1cyBrbWFwKCkgdXNlIGluIGFzeW5jIGlvIGNvbXBsZXRpb24uIE5vdyB1c2Uga21hcF9hdG9taWMoKS4KKwkgIFVzZSBLTV9CSU9fSVJRIG9uIGFkdmljZSBmcm9tIElSQy9rZXJuZWwuLi4KKwktIFVzZSBudGZzX21hcF9wYWdlKCkgaW4gbWFwX21mdF9yZWNvcmQoKSBhbmQgY3JlYXRlIC0+cmVhZHBhZ2UgbWV0aG9kCisJICBmb3IgcmVhZGluZyAkTUZUIChudGZzX21mdF9yZWFkcGFnZSkuIEluIHRoZSBwcm9jZXNzIGNyZWF0ZSBkZWRpY2F0ZWQKKwkgIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyAobnRmc19tZnRfYW9wcykgZm9yICRNRlQgaW5vZGUgbWFwcGluZy4gQWxzbworCSAgcmVtb3ZlZCB0aGUgbm93IHN1cGVyZmx1b3VzIGV4cG9ydHMgZnJvbSB0aGUga2VybmVsIGNvcmUgcGF0Y2guCisJLSBGaXggYSBidWcgd2hlcmUga2ZyZWUoKSB3YXMgdXNlZCBpbnN0ZWQgb2YgbnRmc19mcmVlKCkuCisJLSBDaGFuZ2UgbWFwX21mdF9yZWNvcmQoKSB0byB0YWtlIG50ZnNfaW5vZGUgYXMgYXJndW1lbnQgaW5zdGVhZCBvZgorCSAgdmZzIGlub2RlLiBEaXRvIGZvciB1bm1hcF9tZnRfcmVjb3JkKCkuIEFkYXB0IGFsbCBjYWxsZXJzLgorCS0gQWRkIHBvaW50ZXIgdG8gbnRmc192b2x1bWUgdG8gbnRmc19pbm9kZS4KKwktIEFkZCBtZnQgcmVjb3JkIG51bWJlciBhbmQgc2VxdWVuY2UgbnVtYmVyIHRvIG50ZnNfaW5vZGUuIFN0b3AgdXNpbmcKKwkgIGlfaW5vIGFuZCBpX2dlbmVyYXRpb24gZm9yIGluLWRyaXZlciBwdXJwb3Nlcy4KKwktIEltcGxlbWVudCBhdHRyaWIuYzo6bWVyZ2VfcnVuX2xpc3RzKCkuIChSaWNoYXJkIFJ1c3NvbikKKwktIFJlbW92ZSB1c2Ugb2YgcHJvcGVyIGlub2RlcyBieSBleHRlbnQgaW5vZGVzLiBNb3ZlIGlfaW5vIGFuZAorCSAgaV9nZW5lcmF0aW9uIHRvIG50ZnNfaW5vZGUgdG8gZG8gdGhpcy4gQXBwbHkgc2ltcGxpZmljYXRpb25zIHRoYXQKKwkgIHJlc3VsdCBhbmQgcmVtb3ZlIGlnZXRfbm9fd2FpdCgpLCBldGMuCisJLSBQYXNzIG50ZnNfaW5vZGUgZXZlcnl3aGVyZSBpbiB0aGUgZHJpdmVyICh1c2VkIHRvIGJlIHN0cnVjdCBpbm9kZSkuCisJLSBBZGQgcmVmZXJlbmNlIGNvdW50aW5nIGluIG50ZnNfaW5vZGUgZm9yIHRoZSBudGZzIGlub2RlIGl0c2VsZiBhbmQKKwkgIGZvciB0aGUgbWFwcGVkIG1mdCByZWNvcmQuCisJLSBFeHRlbmQgbWZ0IHJlY29yZCBtYXBwaW5nIHNvIHdlIGNhbiAodW4pbWFwIGV4dGVudCBtZnQgcmVjb3JkcyAobmV3CisJICBmdW5jdGlvbnMgKHVuKW1hcF9leHRlbnRfbWZ0X3JlY29yZCksIGFuZCBzbyBtYXBwaW5ncyBhcmUgcmVmZXJlbmNlCisJICBjb3VudGVkIGFuZCBkb24ndCBoYXZlIHRvIGhhcHBlbiB0d2ljZSBpZiBhbHJlYWR5IG1hcHBlZCAtIGp1c3QgcmVmCisJICBjb3VudCBpbmNyZWFzZXMuCisJLSBBZGQgLW8gaW9jaGFyc2V0IGFzIGFsaWFzIHRvIC1vIG5scyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJLSBUaGUgbGF0ZXN0IGNvcmUgcGF0Y2ggaXMgbm93IHRpbnkuIEluIGZhY3QganVzdCBhIHNpbmdsZSBhZGRpdGlvbmFsCisJICBleHBvcnQgaXMgbmVjZXNzYXJ5IG92ZXIgdGhlIGJhc2Uga2VybmVsLgorCit0bmctMC4wLjMgLSBDbGVhbnVwcywgZW5oYW5jZW1lbnRzLCBidWcgZml4ZXMuCisKKwktIFdvcmsgb24gYXR0cmliLmM6OmRlY29tcHJlc3NfbWFwcGluZ19wYWlycygpIHRvIGRldGVjdCBiYXNlIGV4dGVudHMKKwkgIGFuZCBzZXR1cCB0aGUgcnVubGlzdCBhcHByb3ByaWF0ZWx5IHVzaW5nIGtub3dsZWRnZSBwcm92aWRlZCBieSB0aGUKKwkgIHNpemVzIGluIHRoZSBiYXNlIGF0dHJpYnV0ZSByZWNvcmQuCisJLSBCYWxhbmNlIHRoZSBnZXRfL3B1dF9hdHRyX3NlYXJjaF9jdHgoKSBjYWxscyBzbyB3ZSBkb24ndCBsZWFrIG1lbW9yeQorCSAgYW55IG1vcmUuCisJLSBJbnRyb2R1Y2UgbnRmc19tYWxsb2Nfbm9mcygpIGFuZCBudGZzX2ZyZWUoKSB0byBhbGxvY2F0ZS9mcmVlIGEgc2luZ2xlCisJICBwYWdlIG9yIHVzZSB2bWFsbG9jIGRlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1ZXN0ZWQuCisJLSBDbGVhbnVwIGVycm9yIG91dHB1dC4gVGhlIF9fRlVOQ1RJT05fXyAiKCk6ICIgaXMgbm93IGFkZGVkCisJICBhdXRvbWF0aWNhbGx5LiBJbnRyb2R1Y2VkIGEgbmV3IGhlYWRlciBmaWxlIGRlYnVnLmggdG8gc3VwcG9ydCB0aGlzCisJICBhbmQgYWxzbyBtb3ZlZCBudGZzX2RlYnVnKCkgZnVuY3Rpb24gaW50byBpdC4KKwktIE1ha2UgcmVhZGluZyBvZiBjb21wcmVzc2VkIGZpbGVzIG1vcmUgaW50ZWxsaWdlbnQgYW5kIGVzcGVjaWFsbHkgZ2V0CisJICByaWQgb2YgdGhlIHZtYWxsb2Nfbm9mcygpIGZyb20gcmVhZHBhZ2UoKS4gVGhpcyBub3cgdXNlcyBwZXIgQ1BVCisJICBidWZmZXJzIChhbGxvY2F0ZWQgYXQgZmlyc3QgbW91bnQgd2l0aCBjbHVzdGVyIHNpemUgPD0gNGtpQiBhbmQKKwkgIGRlYWxsb2NhdGVkIG9uIGxhc3QgdW1vdW50IHdpdGggY2x1c3RlciBzaXplIDw9IDRraUIpLCBhbmQKKwkgIGFzeW5jaHJvbm91cyBpbyBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSB1c2luZyBhIGxpc3Qgb2YgYnVmZmVyIGhlYWRzLgorCSAgRXIsIHdlIHVzZSBzeW5jaHJvbm91cyBpbyBhcyBhc3luYyBpbyBvbmx5IHdvcmtzIG9uIHdob2xlIHBhZ2VzCisJICBjb3ZlcmVkIGJ5IGJ1ZmZlcnMgYW5kIG5vdCBvbiBpbmRpdmlkdWFsIGJ1ZmZlciBoZWFkcy4uLgorCS0gQnVnIGZpeCBmb3IgcmVhZGluZyBjb21wcmVzc2VkIGZpbGVzIHdpdGggc3BhcnNlIGNvbXByZXNzaW9uIGJsb2Nrcy4KKwordG5nLTAuMC4yIC0gTm93IGhhbmRsZXMgbGFyZ2VyL2ZyYWdtZW50ZWQvY29tcHJlc3NlZCB2b2x1bWVzL2ZpbGVzL2RpcnMuCisKKwktIEZpeGVkIGhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzIHdoZW4gY2x1c3RlciBzaXplIGV4Y2VlZHMgaW5kZXggYmxvY2sKKwkgIHNpemUuCisJLSBIaWRlIERPUyBvbmx5IG5hbWUgc3BhY2UgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSByZWFkZGlyKCkgYnV0IGFsbG93CisJICB0aGVtIGluIGxvb2t1cCgpLiBUaGlzIHNob3VsZCBmaXggdGhlIHByb2JsZW0gdGhhdCBMaW51eCBkb2Vzbid0CisJICBzdXBwb3J0IGRpcmVjdG9yeSBoYXJkIGxpbmtzLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBhY2Nlc3MgdG8gZW50cmllcworCSAgdmlhIHRoZWlyIHNob3J0IGZpbGUgbmFtZS4gVGhpcyBhbHNvIGhhcyB0aGUgYmVuZWZpdCBvZiBtaW1pY2tpbmcKKwkgIHdoYXQgV2luZG93cyB1c2VycyBhcmUgdXNlZCB0bywgc28gaXQgaXMgdGhlIGlkZWFsIHNvbHV0aW9uLgorCS0gSW1wbGVtZW50ZWQgc3luY19wYWdlIGV2ZXJ5d2hlcmUgc28gbm8gbW9yZSBoYW5ncyBpbiBEIHN0YXRlIHdoZW4KKwkgIHdhaXRpbmcgZm9yIGEgcGFnZS4KKwktIFN0b3AgdXNpbmcgYmZvcmdldCgpIGluIGZhdm91ciBvZiBicmVsc2UoKS4KKwktIFN0b3AgbG9ja2luZyBidWZmZXJzIHVubmVjZXNzYXJpbHkuCisJLSBJbXBsZW1lbnRlZCBjb21wcmVzc2VkIGZpbGVzIChpbm9kZS0+bWFwcGluZyBjb250YWlucyB1bmNvbXByZXNzZWQKKwkgIGRhdGEsIHJhdyBjb21wcmVzc2VkIGRhdGEgaXMgY3VycmVudGx5IGJyZWFkKCkgaW50byBhIHZtYWxsb2MoKWVkCisJICBtZW1vcnkgYnVmZmVyKS4KKwktIEVuYWJsZSBjb21wcmVzc2VkIGRpcmVjdG9yaWVzLiAoVGhlaXIgaW5kZXggcm9vdCBpcyBtYXJrZWQgY29tcHJlc3NlZAorCSAgdG8gaW5kaWNhdGUgdGhhdCBuZXcgZmlsZXMgaW4gdGhhdCBkaXJlY3Rvcnkgc2hvdWxkIGJlIGNyZWF0ZWQKKwkgIGNvbXByZXNzZWQuKQorCS0gVXNlIHZzbnByaW50ZiByYXRoZXIgdGhhbiB2c3ByaW50ZiBpbiB0aGUgbnRmc19lcnJvciBhbmQgbnRmc193YXJuaW5nCisJICBmdW5jdGlvbnMuIChUaGFua3MgdG8gV2lsbCBEeXNvbiBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuKQorCS0gTW92ZWQgdGhlIG50ZnNfaW5vZGUgYW5kIG50ZnNfdm9sdW1lICh0aGUgZm9ybWVyIG50ZnNfaW5vZGVfaW5mbyBhbmQKKwkgIG50ZnNfc2JfaW5mbykgb3V0IG9mIHRoZSBjb21tb24gaW5vZGUgYW5kIHN1cGVyX2Jsb2NrIHN0cnVjdHVyZXMgYW5kCisJICBzdGFydGVkIHVzaW5nIHRoZSBnZW5lcmljX2lwIGFuZCBnZW5lcmljX3NicCBwb2ludGVycyBpbnN0ZWFkLiBUaGlzCisJICBtYWtlcyBudGZzIGVudGlyZWx5IHByaXZhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBrZXJuZWwgdHJlZS4KKwktIERldGVjdCBjb21waWxlciB2ZXJzaW9uIGFuZCBhYm9ydCB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgZ2NjIGxlc3MgdGhhbgorCSAgMi45NiBpcyB1c2VkLgorCS0gRml4IGJ1ZyBpbiBuYW1lIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdW5pc3RyLmMuCisJLSBJbXBsZW1lbnQgYXR0cmlidXRlIGxpc3RzIHBhcnQgMSwgdGhlIGluZnJhc3RydWN0dXJlOiBzZWFyY2ggY29udGV4dHMKKwkgIGFuZCBvcGVyYXRpb25zLCBmaW5kX2V4dGVybmFsX2F0dHIoKSwgbG9va3VwX2F0dHIoKSkgYW5kIG1ha2UgdGhlCisJICBjb2RlIHVzZSB0aGUgaW5mcmFzdHJ1Y3R1cmUuCisJLSBGaXggc3R1cGlkIGJ1ZmZlciBvdmVyZmxvdyBidWcgdGhhdCBiZWNhbWUgYXBwYXJlbnQgb24gbGFyZ2VyIHJ1bgorCSAgbGlzdCBjb250YWluaW5nIGF0dHJpYnV0ZXMuCisJLSBGaXggYnVncyBpbiByZWFkZGlyKCkgdGhhdCBiZWNhbWUgYXBwYXJlbnQgb24gbGFyZ2VyIGRpcmVjdG9yaWVzLgorCisJVGhlIGRyaXZlciBpcyBub3cgcmVhbGx5IHVzZWZ1bCBhbmQgc3Vydml2ZXMgdGhlIHRlc3QKKwkJZmluZCAuIC10eXBlIGYgLWV4ZWMgbWQ1c3VtICJ7fSIgXDsKKwl3aXRob3V0IGFueSBlcnJvciBtZXNzYWdlcyBvbiBhIG92ZXIgMUdpQiBzaXplZCBwYXJ0aXRpb24gd2l0aCA+MTZrCisJZmlsZXMgb24gaXQsIGluY2x1ZGluZyBjb21wcmVzc2VkIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhbmQgbWFueSBmaWxlcworCWFuZCBkaXJlY3RvcmllcyB3aXRoIGF0dHJpYnV0ZSBsaXN0cy4KKwordG5nLTAuMC4xIC0gVGhlIGZpcnN0IHVzZWZ1bCB2ZXJzaW9uLgorCisJLSBBZGRlZCBudGZzX2xvb2t1cCgpLgorCS0gQWRkZWQgZGVmYXVsdCB1cGNhc2UgZ2VuZXJhdGlvbiBhbmQgaGFuZGxpbmcuCisJLSBBZGRlZCBjb21waWxlIG9wdGlvbnMgdG8gYmUgc2hvd24gb24gbW9kdWxlIGluaXQuCisJLSBNYW55IGJ1ZyBmaXhlcyB0aGF0IHdlcmUgImhpZGRlbiIgYmVmb3JlLgorCS0gVXBkYXRlIHRvIGxhdGVzdCBrZXJuZWwuCisJLSBBZGRlZCBudGZzX3JlYWRkaXIoKS4KKwktIEFkZGVkIGZpbGUgb3BlcmF0aW9ucyBmb3IgbW1hcCgpLCByZWFkKCksIG9wZW4oKSBhbmQgbGxzZWVrKCkuIFdlIGp1c3QKKwkgIHVzZSB0aGUgZ2VuZXJpYyBvbmVzLiBUaGUgd2hvbGUgcG9pbnQgb2YgZ29pbmcgdGhyb3VnaCBpbXBsZW1lbnRpbmcKKwkgIHJlYWRwYWdlKCkgbWV0aG9kcyBhbmQgd2hlcmUgcG9zc2libGUgZ2V0X2Jsb2NrKCkgY2FsbCBiYWNrcyBpcyB0aGF0CisJICB0aGlzIGFsbG93cyB1cyB0byBtYWtlIHVzZSBvZiB0aGUgZ2VuZXJpYyBoaWdoIGxldmVsIG1ldGhvZHMgcHJvdmlkZWQKKwkgIGJ5IHRoZSBrZXJuZWwuCisKKwlUaGUgZHJpdmVyIGlzIG5vdyBhY3R1YWxseSB1c2VmdWwhIFlleS4gKC06IEl0IHVuZG91YnRlZGx5IGhhcyBnb3QgYnVncworCXRob3VnaCBhbmQgaXQgZG9lc24ndCBpbXBsZW1lbnQgYWNjZXNzc2luZyBjb21wcmVzc2VkIGZpbGVzIHlldC4gQWxzbywKKwlhY2Nlc3NpbmcgZmlsZXMgd2l0aCBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGVzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKwllaXRoZXIuIEJ1dCBmb3Igc21hbGwgb3Igc2ltcGxlIGZpbGUgc3lzdGVtcyBpdCBzaG91bGQgd29yayBhbmQgYWxsb3cKKwl5b3UgdG8gbGlzdCBkaXJlY3RvcmllcywgdXNlIHN0YXQgb24gZGlyZWN0b3J5IGVudHJpZXMgYW5kIHRoZSBmaWxlCisJc3lzdGVtLCBvcGVuLCByZWFkLCBtbWFwIGFuZCBsbHNlZWsgYXJvdW5kIGluIGZpbGVzLiBBIGJpZyBtaWxlIHN0b25lCisJaGFzIGJlZW4gcmVhY2hlZCEKKwordG5nLTAuMC4wIC0gSW5pdGlhbCB2ZXJzaW9uIHRhZy4KKworCUluaXRpYWwgZHJpdmVyIGltcGxlbWVudGF0aW9uLiBUaGUgZHJpdmVyIGNhbiBtb3VudCBhbmQgdW1vdW50IHNpbXBsZQorCU5URlMgZmlsZSBzeXN0ZW1zIChpLmUuIG9uZXMgd2l0aG91dCBhdHRyaWJ1dGUgbGlzdHMgaW4gdGhlIHN5c3RlbQorCWZpbGVzKS4gSWYgdGhlIG1vdW50IGZhaWxzIHRoZXJlIG1pZ2h0IGJlIHByb2JsZW1zIGluIHRoZSBlcnJvciBoYW5kbGluZworCWNvZGUgcGF0aHMsIHNvIGJlIHdhcm5lZC4gT3RoZXJ3aXNlIGl0IHNlZW1zIHRvIGJlIGxvYWRpbmcgdGhlIHN5c3RlbQorCWZpbGVzIG5pY2VseSBhbmQgdGhlIG1mdCByZWNvcmQgcmVhZCBtYXBwaW5nL3VubWFwcGluZyBzZWVtcyB0byBiZQorCXdvcmtpbmcgbmljZWx5LCB0b28uIFByb29mIG9mIGlub2RlIG1ldGFkYXRhIGluIHRoZSBwYWdlIGNhY2hlIGFuZCBub24tCisJcmVzaWRlbnQgZmlsZSB1bm5hbWVkIHN0cmVhbSBkYXRhIGluIHRoZSBwYWdlIGNhY2hlIGNvbmNlcHRzIGlzIHRodXMKKwljb21wbGV0ZS4KZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjYzODEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKyMgUnVsZXMgZm9yIG1ha2luZyB0aGUgTlRGUyBkcml2ZXIuCisKK29iai0kKENPTkZJR19OVEZTX0ZTKSArPSBudGZzLm8KKworbnRmcy1vYmpzIDo9IGFvcHMubyBhdHRyaWIubyBjb2xsYXRlLm8gY29tcHJlc3MubyBkZWJ1Zy5vIGRpci5vIGZpbGUubyBcCisJICAgICBpbmRleC5vIGlub2RlLm8gbWZ0Lm8gbXN0Lm8gbmFtZWkubyBydW5saXN0Lm8gc3VwZXIubyBzeXNjdGwubyBcCisJICAgICB1bmlzdHIubyB1cGNhc2UubworCitFWFRSQV9DRkxBR1MgPSAtRE5URlNfVkVSU0lPTj1cIjIuMS4yMlwiCisKK2lmZXEgKCQoQ09ORklHX05URlNfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKKworaWZlcSAoJChDT05GSUdfTlRGU19SVykseSkKK0VYVFJBX0NGTEFHUyArPSAtRE5URlNfUlcKKworbnRmcy1vYmpzICs9IGJpdG1hcC5vIGxjbmFsbG9jLm8gbG9nZmlsZS5vIHF1b3RhLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9mcy9udGZzL2FvcHMuYyBiL2ZzL250ZnMvYW9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDU2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2FvcHMuYwpAQCAtMCwwICsxLDIzMjQgQEAKKy8qKgorICogYW9wcy5jIC0gTlRGUyBrZXJuZWwgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGFuZCBwYWdlIGNhY2hlIGhhbmRsaW5nLgorICoJICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJydW5saXN0LmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19lbmRfYnVmZmVyX2FzeW5jX3JlYWQgLSBhc3luYyBpbyBjb21wbGV0aW9uIGZvciByZWFkaW5nIGF0dHJpYnV0ZXMKKyAqIEBiaDoJCWJ1ZmZlciBoZWFkIG9uIHdoaWNoIGlvIGlzIGNvbXBsZXRlZAorICogQHVwdG9kYXRlOgl3aGV0aGVyIEBiaCBpcyBub3cgdXB0b2RhdGUgb3Igbm90CisgKgorICogQXN5bmNocm9ub3VzIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIHJlYWRpbmcgcGFnZXMgYmVsb25naW5nIHRvIHRoZQorICogYXR0cmlidXRlIGFkZHJlc3Mgc3BhY2Ugb2YgYW4gaW5vZGUuICBUaGUgaW5vZGVzIGNhbiBlaXRoZXIgYmUgZmlsZXMgb3IKKyAqIGRpcmVjdG9yaWVzIG9yIHRoZXkgY2FuIGJlIGZha2UgaW5vZGVzIGRlc2NyaWJpbmcgc29tZSBhdHRyaWJ1dGUuCisgKgorICogSWYgTklub01zdFByb3RlY3RlZCgpLCBwZXJmb3JtIHRoZSBwb3N0IHJlYWQgbXN0IGZpeHVwcyB3aGVuIGFsbCBJTyBvbiB0aGUKKyAqIHBhZ2UgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBtYXJrIHRoZSBwYWdlIHVwdG9kYXRlIG9yIHNldCB0aGUgZXJyb3IgYml0IG9uCisgKiB0aGUgcGFnZS4gIFRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkcyB0aGF0IG5lZWQgZml4aW5nIHVwLCB3ZQorICogY2hlYXQgYSBsaXR0bGUgYml0IGJ5IHNldHRpbmcgdGhlIGluZGV4X2Jsb2NrX3NpemUgaW4gbnRmc19pbm9kZSB0byB0aGUgbnRmcworICogcmVjb3JkIHNpemUsIGFuZCBpbmRleF9ibG9ja19zaXplX2JpdHMsIHRvIHRoZSBsb2coYmFzZSAyKSBvZiB0aGUgbnRmcworICogcmVjb3JkIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIG50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwludGZzX2lub2RlICpuaTsKKwlpbnQgcGFnZV91cHRvZGF0ZSA9IDE7CisKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwluaSA9IE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCWlmIChsaWtlbHkodXB0b2RhdGUpKSB7CisJCXM2NCBmaWxlX29mczsKKworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKworCQlmaWxlX29mcyA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsKKwkJCQliaF9vZmZzZXQoYmgpOworCQkvKiBDaGVjayBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyIGhlYWQgb3ZlcmZsb3dpbmcuICovCisJCWlmIChmaWxlX29mcyArIGJoLT5iX3NpemUgPiBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQkJY2hhciAqYWRkcjsKKwkJCWludCBvZnMgPSAwOworCisJCQlpZiAoZmlsZV9vZnMgPCBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkKKwkJCQlvZnMgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSAtIGZpbGVfb2ZzOworCQkJYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKKwkJCW1lbXNldChhZGRyICsgYmhfb2Zmc2V0KGJoKSArIG9mcywgMCwgYmgtPmJfc2l6ZSAtIG9mcyk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWMoYWRkciwgS01fQklPX1NSQ19JUlEpOworCQl9CisJfSBlbHNlIHsKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkJ1ZmZlciBJL08gZXJyb3IsIGxvZ2ljYWwgYmxvY2sgJWxsdS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWNsZWFyX2J1ZmZlcl9hc3luY19yZWFkKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwl0bXAgPSBiaDsKKwlkbyB7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKHRtcCkpCisJCQlwYWdlX3VwdG9kYXRlID0gMDsKKwkJaWYgKGJ1ZmZlcl9hc3luY19yZWFkKHRtcCkpIHsKKwkJCWlmIChsaWtlbHkoYnVmZmVyX2xvY2tlZCh0bXApKSkKKwkJCQlnb3RvIHN0aWxsX2J1c3k7CisJCQkvKiBBc3luYyBidWZmZXJzIG11c3QgYmUgbG9ja2VkLiAqLworCQkJQlVHKCk7CisJCX0KKwkJdG1wID0gdG1wLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlICh0bXAgIT0gYmgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCS8qCisJICogSWYgbm9uZSBvZiB0aGUgYnVmZmVycyBoYWQgZXJyb3JzIHRoZW4gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZSwKKwkgKiBidXQgd2UgZmlyc3QgaGF2ZSB0byBwZXJmb3JtIHRoZSBwb3N0IHJlYWQgbXN0IGZpeHVwcywgaWYgdGhlCisJICogYXR0cmlidXRlIGlzIG1zdCBwcm90ZWN0ZWQsIGkuZS4gaWYgTklub01zdFByb3RlY2VkKG5pKSBpcyB0cnVlLgorCSAqIE5vdGUgd2UgaWdub3JlIGZpeHVwIGVycm9ycyBhcyB0aG9zZSBhcmUgZGV0ZWN0ZWQgd2hlbgorCSAqIG1hcF9tZnRfcmVjb3JkKCkgaXMgY2FsbGVkIHdoaWNoIGdpdmVzIHVzIHBlciByZWNvcmQgZ3JhbnVsYXJpdHkKKwkgKiByYXRoZXIgdGhhbiBwZXIgcGFnZSBncmFudWxhcml0eS4KKwkgKi8KKwlpZiAoIU5Jbm9Nc3RQcm90ZWN0ZWQobmkpKSB7CisJCWlmIChsaWtlbHkocGFnZV91cHRvZGF0ZSAmJiAhUGFnZUVycm9yKHBhZ2UpKSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9IGVsc2UgeworCQljaGFyICphZGRyOworCQl1bnNpZ25lZCBpbnQgaSwgcmVjczsKKwkJdTMyIHJlY19zaXplOworCisJCXJlY19zaXplID0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJCXJlY3MgPSBQQUdFX0NBQ0hFX1NJWkUgLyByZWNfc2l6ZTsKKwkJLyogU2hvdWxkIGhhdmUgYmVlbiB2ZXJpZmllZCBiZWZvcmUgd2UgZ290IGhlcmUuLi4gKi8KKwkJQlVHX09OKCFyZWNzKTsKKwkJYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKKwkJZm9yIChpID0gMDsgaSA8IHJlY3M7IGkrKykKKwkJCXBvc3RfcmVhZF9tc3RfZml4dXAoKE5URlNfUkVDT1JEKikoYWRkciArCisJCQkJCWkgKiByZWNfc2l6ZSksIHJlY19zaXplKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoYWRkciwgS01fQklPX1NSQ19JUlEpOworCQlpZiAobGlrZWx5KCFQYWdlRXJyb3IocGFnZSkgJiYgcGFnZV91cHRvZGF0ZSkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJfQorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybjsKK3N0aWxsX2J1c3k6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfcmVhZF9ibG9jayAtIGZpbGwgYSBAcGFnZSBvZiBhbiBhZGRyZXNzIHNwYWNlIHdpdGggZGF0YQorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byBmaWxsIHdpdGggZGF0YQorICoKKyAqIEZpbGwgdGhlIHBhZ2UgQHBhZ2Ugb2YgdGhlIGFkZHJlc3Mgc3BhY2UgYmVsb25naW5nIHRvIHRoZSBAcGFnZS0+aG9zdCBpbm9kZS4KKyAqIFdlIHJlYWQgZWFjaCBidWZmZXIgYXN5bmNocm9ub3VzbHkgYW5kIHdoZW4gYWxsIGJ1ZmZlcnMgYXJlIHJlYWQgaW4sIG91ciBpbworICogY29tcGxldGlvbiBoYW5kbGVyIG50ZnNfZW5kX2J1ZmZlcl9yZWFkX2FzeW5jKCksIGlmIHJlcXVpcmVkLCBhdXRvbWF0aWNhbGx5CisgKiBhcHBsaWVzIHRoZSBtc3QgZml4dXBzIHRvIHRoZSBwYWdlIGJlZm9yZSBmaW5hbGx5IG1hcmtpbmcgaXQgdXB0b2RhdGUgYW5kCisgKiB1bmxvY2tpbmcgaXQuCisgKgorICogV2Ugb25seSBlbmZvcmNlIGFsbG9jYXRlZF9zaXplIGxpbWl0IGJlY2F1c2UgaV9zaXplIGlzIGNoZWNrZWQgZm9yIGluCisgKiBnZW5lcmljX2ZpbGVfcmVhZCgpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBDb250YWlucyBhbiBhZGFwdGVkIHZlcnNpb24gb2YgZnMvYnVmZmVyLmM6OmJsb2NrX3JlYWRfZnVsbF9wYWdlKCkuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlKQoreworCVZDTiB2Y247CisJTENOIGxjbjsKKwludGZzX2lub2RlICpuaTsKKwludGZzX3ZvbHVtZSAqdm9sOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICphcnJbTUFYX0JVRl9QRVJfUEFHRV07CisJc2VjdG9yX3QgaWJsb2NrLCBsYmxvY2ssIHpibG9jazsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplLCB2Y25fb2ZzOworCWludCBpLCBucjsKKwl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzOworCisJbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CisJdm9sID0gbmktPnZvbDsKKworCS8qICRNRlQvJERBVEEgbXVzdCBoYXZlIGl0cyBjb21wbGV0ZSBydW5saXN0IGluIG1lbW9yeSBhdCBhbGwgdGltZXMuICovCisJQlVHX09OKCFuaS0+cnVubGlzdC5ybCAmJiAhbmktPm1mdF9ubyAmJiAhTklub0F0dHIobmkpKTsKKworCWJsb2Nrc2l6ZV9iaXRzID0gVkZTX0kobmkpLT5pX2Jsa2JpdHM7CisJYmxvY2tzaXplID0gMSA8PCBibG9ja3NpemVfYml0czsKKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJaWYgKHVubGlrZWx5KCFiaCkpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlibG9jayA9IChzNjQpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibG9ja3NpemVfYml0cyk7CisJbGJsb2NrID0gKG5pLT5hbGxvY2F0ZWRfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOworCXpibG9jayA9IChuaS0+aW5pdGlhbGl6ZWRfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZS4gKi8KKwlybCA9IE5VTEw7CisJbnIgPSBpID0gMDsKKwlkbyB7CisJCXU4ICprYWRkcjsKKworCQlpZiAodW5saWtlbHkoYnVmZmVyX3VwdG9kYXRlKGJoKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KGJ1ZmZlcl9tYXBwZWQoYmgpKSkgeworCQkJYXJyW25yKytdID0gYmg7CisJCQljb250aW51ZTsKKwkJfQorCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OworCQkvKiBJcyB0aGUgYmxvY2sgd2l0aGluIHRoZSBhbGxvd2VkIGxpbWl0cz8gKi8KKwkJaWYgKGlibG9jayA8IGxibG9jaykgeworCQkJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJCQkvKiBDb252ZXJ0IGlibG9jayBpbnRvIGNvcnJlc3BvbmRpbmcgdmNuIGFuZCBvZmZzZXQuICovCisJCQl2Y24gPSAoVkNOKWlibG9jayA8PCBibG9ja3NpemVfYml0cyA+PgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQkJdmNuX29mcyA9ICgoVkNOKWlibG9jayA8PCBibG9ja3NpemVfYml0cykgJgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCQkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCQl9CisJCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCQlybCsrOworCQkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCX0gZWxzZQorCQkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJLyogU3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsY24gPj0gMCkgeworCQkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIGNvcnJlY3QgYmxvY2suICovCisJCQkJYmgtPmJfYmxvY2tuciA9ICgobGNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpCisJCQkJCQkrIHZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCQkvKiBPbmx5IHJlYWQgaW5pdGlhbGl6ZWQgZGF0YSBibG9ja3MuICovCisJCQkJaWYgKGlibG9jayA8IHpibG9jaykgeworCQkJCQlhcnJbbnIrK10gPSBiaDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEZ1bGx5IG5vbi1pbml0aWFsaXplZCBkYXRhIGJsb2NrLCB6ZXJvIGl0LiAqLworCQkJCWdvdG8gaGFuZGxlX3pibG9jazsKKwkJCX0KKwkJCS8qIEl0IGlzIGEgaG9sZSwgbmVlZCB0byB6ZXJvIGl0LiAqLworCQkJaWYgKGxjbiA9PSBMQ05fSE9MRSkKKwkJCQlnb3RvIGhhbmRsZV9ob2xlOworCQkJLyogSWYgZmlyc3QgdHJ5IGFuZCBydW5saXN0IHVubWFwcGVkLCBtYXAgYW5kIHJldHJ5LiAqLworCQkJaWYgKCFpc19yZXRyeSAmJiBsY24gPT0gTENOX1JMX05PVF9NQVBQRUQpIHsKKwkJCQlpbnQgZXJyOworCQkJCWlzX3JldHJ5ID0gVFJVRTsKKwkJCQkvKgorCQkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nIGxvY2sgZm9yCisJCQkJICogdGhlIGR1cmF0aW9uLgorCQkJCSAqLworCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQkJaWYgKGxpa2VseSghZXJyKSkKKwkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOworCQkJCXJsID0gTlVMTDsKKwkJCQlsY24gPSBlcnI7CisJCQl9CisJCQkvKiBIYXJkIGVycm9yLCB6ZXJvIG91dCByZWdpb24uICovCisJCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmcm9tIGlub2RlIDB4JWx4LCAiCisJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCB2Y24gMHglbGx4LCAiCisJCQkJCSJvZmZzZXQgMHgleCBiZWNhdXNlIGl0cyBsb2NhdGlvbiBvbiAiCisJCQkJCSJkaXNrIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkJXMgIgorCQkJCQkiKGVycm9yIGNvZGUgJWxsaSkuIiwgbmktPm1mdF9ubywKKwkJCQkJbmktPnR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCQl2Y25fb2ZzLCBpc19yZXRyeSA/ICIgZXZlbiBhZnRlciAiCisJCQkJCSJyZXRyeWluZyIgOiAiIiwgKGxvbmcgbG9uZylsY24pOworCQl9CisJCS8qCisJCSAqIEVpdGhlciBpYmxvY2sgd2FzIG91dHNpZGUgbGJsb2NrIGxpbWl0cyBvcgorCQkgKiBudGZzX3JsX3Zjbl90b19sY24oKSByZXR1cm5lZCBlcnJvci4gIEp1c3QgemVybyB0aGF0IHBvcnRpb24KKwkJICogb2YgdGhlIHBhZ2UgYW5kIHNldCB0aGUgYnVmZmVyIHVwdG9kYXRlLgorCQkgKi8KK2hhbmRsZV9ob2xlOgorCQliaC0+Yl9ibG9ja25yID0gLTFVTDsKKwkJY2xlYXJfYnVmZmVyX21hcHBlZChiaCk7CitoYW5kbGVfemJsb2NrOgorCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgaSAqIGJsb2Nrc2l6ZSwgMCwgYmxvY2tzaXplKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSB3aGlsZSAoaSsrLCBpYmxvY2srKywgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCS8qIFJlbGVhc2UgdGhlIGxvY2sgaWYgd2UgdG9vayBpdC4gKi8KKwlpZiAocmwpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCisJLyogQ2hlY2sgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYnVmZmVyIHJlYWR5IGZvciBpL28uICovCisJaWYgKG5yKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoOworCisJCS8qIExvY2sgdGhlIGJ1ZmZlcnMuICovCisJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCQl0YmggPSBhcnJbaV07CisJCQlsb2NrX2J1ZmZlcih0YmgpOworCQkJdGJoLT5iX2VuZF9pbyA9IG50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkOworCQkJc2V0X2J1ZmZlcl9hc3luY19yZWFkKHRiaCk7CisJCX0KKwkJLyogRmluYWxseSwgc3RhcnQgaS9vIG9uIHRoZSBidWZmZXJzLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJdGJoID0gYXJyW2ldOworCQkJaWYgKGxpa2VseSghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKQorCQkJCXN1Ym1pdF9iaChSRUFELCB0YmgpOworCQkJZWxzZQorCQkJCW50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkKHRiaCwgMSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCS8qIE5vIGkvbyB3YXMgc2NoZWR1bGVkIG9uIGFueSBvZiB0aGUgYnVmZmVycy4gKi8KKwlpZiAobGlrZWx5KCFQYWdlRXJyb3IocGFnZSkpKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJZWxzZSAvKiBTaWduYWwgc3luY2hyb25vdXMgaS9vIGVycm9yLiAqLworCQluciA9IC1FSU87CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIG5yOworfQorCisvKioKKyAqIG50ZnNfcmVhZHBhZ2UgLSBmaWxsIGEgQHBhZ2Ugb2YgYSBAZmlsZSB3aXRoIGRhdGEgZnJvbSB0aGUgZGV2aWNlCisgKiBAZmlsZToJb3BlbiBmaWxlIHRvIHdoaWNoIHRoZSBwYWdlIEBwYWdlIGJlbG9uZ3Mgb3IgTlVMTAorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byBmaWxsIHdpdGggZGF0YQorICoKKyAqIEZvciBub24tcmVzaWRlbnQgYXR0cmlidXRlcywgbnRmc19yZWFkcGFnZSgpIGZpbGxzIHRoZSBAcGFnZSBvZiB0aGUgb3BlbgorICogZmlsZSBAZmlsZSBieSBjYWxsaW5nIHRoZSBudGZzIHZlcnNpb24gb2YgdGhlIGdlbmVyaWMgYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKQorICogZnVuY3Rpb24sIG50ZnNfcmVhZF9ibG9jaygpLCB3aGljaCBpbiB0dXJuIGNyZWF0ZXMgYW5kIHJlYWRzIGluIHRoZSBidWZmZXJzCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhZ2UgYXN5bmNocm9ub3VzbHkuCisgKgorICogRm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMsIE9UT0gsIG50ZnNfcmVhZHBhZ2UoKSBmaWxscyBAcGFnZSBieSBjb3B5aW5nIHRoZQorICogZGF0YSBmcm9tIHRoZSBtZnQgcmVjb3JkICh3aGljaCBhdCB0aGlzIHN0YWdlIGlzIG1vc3QgbGlrZWx5IGluIG1lbW9yeSkgYW5kCisgKiBmaWxscyB0aGUgcmVtYWluZGVyIHdpdGggemVyb2VzLiBUaHVzLCBpbiB0aGlzIGNhc2UsIEkvTyBpcyBzeW5jaHJvbm91cywgYXMKKyAqIGV2ZW4gaWYgdGhlIG1mdCByZWNvcmQgaXMgbm90IGNhY2hlZCBhdCB0aGlzIHBvaW50IGluIHRpbWUsIHdlIG5lZWQgdG8gd2FpdAorICogZm9yIGl0IHRvIGJlIHJlYWQgaW4gYmVmb3JlIHdlIGNhbiBkbyB0aGUgY29weS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbG9mZl90IGlfc2l6ZTsKKwludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CisJdTggKmthZGRyOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwl1MzIgYXR0cl9sZW47CisJaW50IGVyciA9IDA7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCS8qCisJICogVGhpcyBjYW4gcG90ZW50aWFsbHkgaGFwcGVuIGJlY2F1c2Ugd2UgY2xlYXIgUGFnZVVwdG9kYXRlKCkgZHVyaW5nCisJICogbnRmc193cml0ZXBhZ2UoKSBvZiBNc3RQcm90ZWN0ZWQoKSBhdHRyaWJ1dGVzLgorCSAqLworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJldHVybiAwOworCX0KKwluaSA9IE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCS8qIE5Jbm9Ob25SZXNpZGVudCgpID09IE5Jbm9JbmRleEFsbG9jUHJlc2VudCgpICovCisJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKKwkJLyoKKwkJICogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQgb3IKKwkJICogZW5jcnlwdGVkLgorCQkgKi8KKwkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgeworCQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7CisJCQkJZXJyID0gLUVBQ0NFUzsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkKKwkJCQlyZXR1cm4gbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2socGFnZSk7CisJCX0KKwkJLyogTm9ybWFsIGRhdGEgc3RyZWFtLiAqLworCQlyZXR1cm4gbnRmc19yZWFkX2Jsb2NrKHBhZ2UpOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQgb3IgZW5jcnlwdGVkLgorCSAqIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIgdGhhbiBhbiBtZnQgcmVjb3JkIGFuZAorCSAqIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkgemVybyBvdXQgYW55IHBhZ2VzIHdpdGgKKwkgKiBpbmRleCBhYm92ZSAwLiAgV2UgY2FuIGFsc28gZG8gdGhpcyBpZiB0aGUgZmlsZSBzaXplIGlzIDAuCisJICovCisJaWYgKHVubGlrZWx5KHBhZ2UtPmluZGV4ID4gMCB8fCAhaV9zaXplX3JlYWQoVkZTX0kobmkpKSkpIHsKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobXJlYykpIHsKKwkJZXJyID0gUFRSX0VSUihtcmVjKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBwdXRfdW5tX2Vycl9vdXQ7CisJYXR0cl9sZW4gPSBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpX3NpemUgPSBpX3NpemVfcmVhZChWRlNfSShuaSkpOworCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IGlfc2l6ZSkpCisJCWF0dHJfbGVuID0gaV9zaXplOworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCS8qIENvcHkgdGhlIGRhdGEgdG8gdGhlIHBhZ2UuICovCisJbWVtY3B5KGthZGRyLCAodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCWF0dHJfbGVuKTsKKwkvKiBaZXJvIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhZ2UuICovCisJbWVtc2V0KGthZGRyICsgYXR0cl9sZW4sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGF0dHJfbGVuKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CitwdXRfdW5tX2Vycl9vdXQ6CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7Cit1bm1fZXJyX291dDoKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworZG9uZToKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CitlcnJfb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc193cml0ZV9ibG9jayAtIHdyaXRlIGEgQHBhZ2UgdG8gdGhlIGJhY2tpbmcgc3RvcmUKKyAqIEBwYWdlOglwYWdlIGNhY2hlIHBhZ2UgdG8gd3JpdGUgb3V0CisgKiBAd2JjOgl3cml0ZWJhY2sgY29udHJvbCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciB3cml0aW5nIHBhZ2VzIGJlbG9uZ2luZyB0byBub24tcmVzaWRlbnQsIG5vbi1tc3QKKyAqIHByb3RlY3RlZCBhdHRyaWJ1dGVzIHRvIHRoZWlyIGJhY2tpbmcgc3RvcmUuCisgKgorICogRm9yIGEgcGFnZSB3aXRoIGJ1ZmZlcnMsIG1hcCBhbmQgd3JpdGUgdGhlIGRpcnR5IGJ1ZmZlcnMgYXN5bmNocm9ub3VzbHkKKyAqIHVuZGVyIHBhZ2Ugd3JpdGViYWNrLiBGb3IgYSBwYWdlIHdpdGhvdXQgYnVmZmVycywgY3JlYXRlIGJ1ZmZlcnMgZm9yIHRoZQorICogcGFnZSwgdGhlbiBwcm9jZWVkIGFzIGFib3ZlLgorICoKKyAqIElmIGEgcGFnZSBkb2Vzbid0IGhhdmUgYnVmZmVycyB0aGUgcGFnZSBkaXJ0eSBzdGF0ZSBpcyBkZWZpbml0aXZlLiBJZiBhIHBhZ2UKKyAqIGRvZXMgaGF2ZSBidWZmZXJzLCB0aGUgcGFnZSBkaXJ0eSBzdGF0ZSBpcyBqdXN0IGEgaGludCwgYW5kIHRoZSBidWZmZXIgZGlydHkKKyAqIHN0YXRlIGlzIGRlZmluaXRpdmUuIChBIGhpbnQgd2hpY2ggaGFzIHJ1bGVzOiBkaXJ0eSBidWZmZXJzIGFnYWluc3QgYSBjbGVhbgorICogcGFnZSBpcyBpbGxlZ2FsLiBPdGhlciBjb21iaW5hdGlvbnMgYXJlIGxlZ2FsIGFuZCBuZWVkIHRvIGJlIGhhbmRsZWQuIEluCisgKiBwYXJ0aWN1bGFyIGEgZGlydHkgcGFnZSBjb250YWluaW5nIGNsZWFuIGJ1ZmZlcnMgZm9yIGV4YW1wbGUuKQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBCYXNlZCBvbiBudGZzX3JlYWRfYmxvY2soKSBhbmQgX19ibG9ja193cml0ZV9mdWxsX3BhZ2UoKS4KKyAqLworc3RhdGljIGludCBudGZzX3dyaXRlX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlWQ04gdmNuOworCUxDTiBsY247CisJc2VjdG9yX3QgYmxvY2ssIGRibG9jaywgaWJsb2NrOworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19pbm9kZSAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXVuc2lnbmVkIGludCBibG9ja3NpemUsIHZjbl9vZnM7CisJaW50IGVycjsKKwlCT09MIG5lZWRfZW5kX3dyaXRlYmFjazsKKwl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzOworCisJdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCW5pID0gTlRGU19JKHZpKTsKKwl2b2wgPSBuaS0+dm9sOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKKwkJCSIweCVseC4iLCBuaS0+bWZ0X25vLCBuaS0+dHlwZSwgcGFnZS0+aW5kZXgpOworCisJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKKwlCVUdfT04oTklub01zdFByb3RlY3RlZChuaSkpOworCisJYmxvY2tzaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCWJsb2Nrc2l6ZSA9IDEgPDwgYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsCisJCQkJKDEgPDwgQkhfVXB0b2RhdGUpIHwgKDEgPDwgQkhfRGlydHkpKTsKKwl9CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWlmICh1bmxpa2VseSghYmgpKSB7CisJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRXJyb3IgYWxsb2NhdGluZyBwYWdlIGJ1ZmZlcnMuICIKKwkJCQkiUmVkaXJ0eWluZyBwYWdlIHNvIHdlIHRyeSBhZ2FpbiBsYXRlci4iKTsKKwkJLyoKKwkJICogUHV0IHRoZSBwYWdlIGJhY2sgb24gbWFwcGluZy0+ZGlydHlfcGFnZXMsIGJ1dCBsZWF2ZSBpdHMKKwkJICogYnVmZmVyJ3MgZGlydHkgc3RhdGUgYXMtaXMuCisJCSAqLworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTk9URTogRGlmZmVyZW50IG5hbWluZyBzY2hlbWUgdG8gbnRmc19yZWFkX2Jsb2NrKCkhICovCisKKwkvKiBUaGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBhZ2UuICovCisJYmxvY2sgPSAoczY0KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxvY2tzaXplX2JpdHMpOworCisJLyogVGhlIGZpcnN0IG91dCBvZiBib3VuZHMgYmxvY2sgZm9yIHRoZSBkYXRhIHNpemUuICovCisJZGJsb2NrID0gKHZpLT5pX3NpemUgKyBibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0czsKKworCS8qIFRoZSBsYXN0IChmdWxseSBvciBwYXJ0aWFsbHkpIGluaXRpYWxpemVkIGJsb2NrLiAqLworCWlibG9jayA9IG5pLT5pbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOworCisJLyoKKwkgKiBCZSB2ZXJ5IGNhcmVmdWwuICBXZSBoYXZlIG5vIGV4Y2x1c2lvbiBmcm9tIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycworCSAqIGhlcmUsIGFuZCB0aGUgKHBvdGVudGlhbGx5IHVubWFwcGVkKSBidWZmZXJzIG1heSBiZWNvbWUgZGlydHkgYXQKKwkgKiBhbnkgdGltZS4gIElmIGEgYnVmZmVyIGJlY29tZXMgZGlydHkgaGVyZSBhZnRlciB3ZSd2ZSBpbnNwZWN0ZWQgaXQKKwkgKiB0aGVuIHdlIGp1c3QgbWlzcyB0aGF0IGZhY3QsIGFuZCB0aGUgcGFnZSBzdGF5cyBkaXJ0eS4KKwkgKgorCSAqIEJ1ZmZlcnMgb3V0c2lkZSBpX3NpemUgbWF5IGJlIGRpcnRpZWQgYnkgX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzOworCSAqIGhhbmRsZSB0aGF0IGhlcmUgYnkganVzdCBjbGVhbmluZyB0aGVtLgorCSAqLworCisJLyoKKwkgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBidWZmZXJzIGluIHRoZSBwYWdlLCBtYXBwaW5nIGFsbCB0aGUgZGlydHkKKwkgKiBidWZmZXJzIHRvIGRpc2sgYWRkcmVzc2VzIGFuZCBoYW5kbGluZyBhbnkgYWxpYXNlcyBmcm9tIHRoZQorCSAqIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlJ3MgbWFwcGluZy4KKwkgKi8KKwlybCA9IE5VTEw7CisJZXJyID0gMDsKKwlkbyB7CisJCUJPT0wgaXNfcmV0cnkgPSBGQUxTRTsKKworCQlpZiAodW5saWtlbHkoYmxvY2sgPj0gZGJsb2NrKSkgeworCQkJLyoKKwkJCSAqIE1hcHBlZCBidWZmZXJzIG91dHNpZGUgaV9zaXplIHdpbGwgb2NjdXIsIGJlY2F1c2UKKwkJCSAqIHRoaXMgcGFnZSBjYW4gYmUgb3V0c2lkZSBpX3NpemUgd2hlbiB0aGVyZSBpcyBhCisJCQkgKiB0cnVuY2F0ZSBpbiBwcm9ncmVzcy4gVGhlIGNvbnRlbnRzIG9mIHN1Y2ggYnVmZmVycworCQkJICogd2VyZSB6ZXJvZWQgYnkgbnRmc193cml0ZXBhZ2UoKS4KKwkJCSAqCisJCQkgKiBGSVhNRTogV2hhdCBhYm91dCB0aGUgc21hbGwgcmFjZSB3aW5kb3cgd2hlcmUKKwkJCSAqIG50ZnNfd3JpdGVwYWdlKCkgaGFzIG5vdCBkb25lIGFueSBjbGVhcmluZyBiZWNhdXNlCisJCQkgKiB0aGUgcGFnZSB3YXMgd2l0aGluIGlfc2l6ZSBidXQgYmVmb3JlIHdlIGdldCBoZXJlLAorCQkJICogdm10cnVuY2F0ZSgpIG1vZGlmaWVzIGlfc2l6ZT8KKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDbGVhbiBidWZmZXJzIGFyZSBub3Qgd3JpdHRlbiBvdXQsIHNvIG5vIG5lZWQgdG8gbWFwIHRoZW0uICovCisJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBpbml0aWFsaXplZCBzaXplLiAqLworCQlpZiAodW5saWtlbHkoKGJsb2NrID49IGlibG9jaykgJiYKKwkJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCB2aS0+aV9zaXplKSkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHBhZ2UgaXMgZnVsbHkgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCisJCQkgKiBvdXQgYWxsIHBhZ2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgaW5pdGlhbGl6ZWQgc2l6ZQorCQkJICogYW5kIHRoZSBjdXJyZW50IHBhZ2UuIEp1c3QgdXNlIG50ZnNfcmVhZHBhZ2UoKSB0byBkbworCQkJICogdGhlIHplcm9pbmcgdHJhbnNwYXJlbnRseS4KKwkJCSAqLworCQkJaWYgKGJsb2NrID4gaWJsb2NrKSB7CisJCQkJLy8gVE9ETzoKKwkJCQkvLyBGb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gcmVhZF9jYWNoZV9wYWdlKCkKKwkJCQkvLyBBZ2FpbiBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gd2FpdF9vbl9wYWdlX2xvY2tlZCgpCisJCQkJLy8gLSBDaGVjayAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmCisJCQkJLy8JCQkhUGFnZUVycm9yKHBhZ2UpKQorCQkJCS8vIFVwZGF0ZSBpbml0aWFsaXplZCBzaXplIGluIHRoZSBhdHRyaWJ1dGUgYW5kCisJCQkJLy8gaW4gdGhlIGlub2RlLgorCQkJCS8vIEFnYWluLCBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vCV9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycygpOworCQkJCS8vIHBhZ2VfY2FjaGVfcmVsZWFzZSgpCisJCQkJLy8gV2UgZG9uJ3QgbmVlZCB0byB3YWl0IG9uIHRoZSB3cml0ZXMuCisJCQkJLy8gVXBkYXRlIGlibG9jay4KKwkJCX0KKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBwYWdlIHN0cmFkZGxlcyBpbml0aWFsaXplZCBzaXplLiBaZXJvCisJCQkgKiBhbGwgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMgYW5kIHNldCB0aGVtIHVwdG9kYXRlIChhbmQKKwkJCSAqIGRpcnR5PykuIE5vdGUsIHRoZXJlIGFyZW4ndCBhbnkgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMKKwkJCSAqIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLgorCQkJICogRklYTUU6IEZvciBhbiB1cHRvZGF0ZSBwYWdlLCB0aGUgYnVmZmVycyBtYXkgbmVlZCB0bworCQkJICogYmUgd3JpdHRlbiBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IGluaXRpYWxpemVkIG9uCisJCQkgKiBkaXNrIGJlZm9yZS4KKwkJCSAqLworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvLyBUT0RPOgorCQkJCS8vIFplcm8gYW55IG5vbi11cHRvZGF0ZSBidWZmZXJzIHVwIHRvIGlfc2l6ZS4KKwkJCQkvLyBTZXQgdGhlbSB1cHRvZGF0ZSBhbmQgZGlydHkuCisJCQl9CisJCQkvLyBUT0RPOgorCQkJLy8gVXBkYXRlIGluaXRpYWxpemVkIHNpemUgaW4gdGhlIGF0dHJpYnV0ZSBhbmQgaW4gdGhlCisJCQkvLyBpbm9kZSAodXAgdG8gaV9zaXplKS4KKwkJCS8vIFVwZGF0ZSBpYmxvY2suCisJCQkvLyBGSVhNRTogVGhpcyBpcyBpbmVmZmljaWVudC4gVHJ5IHRvIGJhdGNoIHRoZSB0d28KKwkJCS8vIHNpemUgY2hhbmdlcyB0byBoYXBwZW4gaW4gb25lIGdvLgorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBiZXlvbmQgaW5pdGlhbGl6ZWQgc2l6ZSAiCisJCQkJCSJpcyBub3Qgc3VwcG9ydGVkIHlldC4gU29ycnkuIik7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQkJLy8gRG8gTk9UIHNldF9idWZmZXJfbmV3KCkgQlVUIERPIGNsZWFyIGJ1ZmZlciByYW5nZQorCQkJLy8gb3V0c2lkZSB3cml0ZSByZXF1ZXN0IHJhbmdlLgorCQkJLy8gc2V0X2J1ZmZlcl91cHRvZGF0ZSgpIG9uIGNvbXBsZXRlIGJ1ZmZlcnMgYXMgd2VsbCBhcworCQkJLy8gc2V0X2J1ZmZlcl9kaXJ0eSgpLgorCQl9CisKKwkJLyogTm8gbmVlZCB0byBtYXAgYnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IG1hcHBlZC4gKi8KKwkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpKQorCQkJY29udGludWU7CisKKwkJLyogVW5tYXBwZWQsIGRpcnR5IGJ1ZmZlci4gTmVlZCB0byBtYXAgaXQuICovCisJCWJoLT5iX2JkZXYgPSB2b2wtPnNiLT5zX2JkZXY7CisKKwkJLyogQ29udmVydCBibG9jayBpbnRvIGNvcnJlc3BvbmRpbmcgdmNuIGFuZCBvZmZzZXQuICovCisJCXZjbiA9IChWQ04pYmxvY2sgPDwgYmxvY2tzaXplX2JpdHM7CisJCXZjbl9vZnMgPSB2Y24gJiB2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCQl2Y24gPj49IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCWlmICghcmwpIHsKK2xvY2tfcmV0cnlfcmVtYXA6CisJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJcmwgPSBuaS0+cnVubGlzdC5ybDsKKwkJfQorCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQl9IGVsc2UKKwkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkvKiBTdWNjZXNzZnVsIHJlbWFwLiAqLworCQlpZiAobGNuID49IDApIHsKKwkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIHBvaW50IHRvIGNvcnJlY3QgYmxvY2suICovCisJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykgKworCQkJCQl2Y25fb2ZzKSA+PiBibG9ja3NpemVfYml0czsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEl0IGlzIGEgaG9sZSwgbmVlZCB0byBpbnN0YW50aWF0ZSBpdC4gKi8KKwkJaWYgKGxjbiA9PSBMQ05fSE9MRSkgeworCQkJLy8gVE9ETzogSW5zdGFudGlhdGUgdGhlIGhvbGUuCisJCQkvLyBjbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCS8vIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwgYmgtPmJfYmxvY2tucik7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJXcml0aW5nIGludG8gc3BhcnNlIHJlZ2lvbnMgaXMgIgorCQkJCQkibm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJfQorCQkvKiBJZiBmaXJzdCB0cnkgYW5kIHJ1bmxpc3QgdW5tYXBwZWQsIG1hcCBhbmQgcmV0cnkuICovCisJCWlmICghaXNfcmV0cnkgJiYgbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7CisJCQlpc19yZXRyeSA9IFRSVUU7CisJCQkvKgorCQkJICogQXR0ZW1wdCB0byBtYXAgcnVubGlzdCwgZHJvcHBpbmcgbG9jayBmb3IKKwkJCSAqIHRoZSBkdXJhdGlvbi4KKwkJCSAqLworCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQkJaWYgKGxpa2VseSghZXJyKSkKKwkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQlybCA9IE5VTEw7CisJCQlsY24gPSBlcnI7CisJCX0KKwkJLyogRmFpbGVkIHRvIG1hcCB0aGUgYnVmZmVyLCBldmVuIGFmdGVyIHJldHJ5aW5nLiAqLworCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSB0byBpbm9kZSAweCVseCwgIgorCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCB2Y24gMHglbGx4LCBvZmZzZXQgMHgleCAiCisJCQkJImJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uIGRpc2sgY291bGQgbm90IGJlICIKKwkJCQkiZGV0ZXJtaW5lZCVzIChlcnJvciBjb2RlICVsbGkpLiIsIG5pLT5tZnRfbm8sCisJCQkJbmktPnR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCXZjbl9vZnMsIGlzX3JldHJ5ID8gIiBldmVuIGFmdGVyICIKKwkJCQkicmV0cnlpbmciIDogIiIsIChsb25nIGxvbmcpbGNuKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUlPOworCQlicmVhazsKKwl9IHdoaWxlIChibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyogUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSB0b29rIGl0LiAqLworCWlmIChybCkKKwkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisKKwkvKiBGb3IgdGhlIGVycm9yIGNhc2UsIG5lZWQgdG8gcmVzZXQgYmggdG8gdGhlIGJlZ2lubmluZy4gKi8KKwliaCA9IGhlYWQ7CisKKwkvKiBKdXN0IGFuIG9wdGltaXphdGlvbiwgc28gLT5yZWFkcGFnZSgpIGlzbid0IGNhbGxlZCBsYXRlci4gKi8KKwlpZiAodW5saWtlbHkoIVBhZ2VVcHRvZGF0ZShwYWdlKSkpIHsKKwkJaW50IHVwdG9kYXRlID0gMTsKKwkJZG8geworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkJdXB0b2RhdGUgPSAwOworCQkJCWJoID0gaGVhZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwkJaWYgKHVwdG9kYXRlKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKworCS8qIFNldHVwIGFsbCBtYXBwZWQsIGRpcnR5IGJ1ZmZlcnMgZm9yIGFzeW5jIHdyaXRlIGkvby4gKi8KKwlkbyB7CisJCWdldF9iaChiaCk7CisJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfZGlydHkoYmgpKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKSB7CisJCQkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKwkJCQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCQl9IGVsc2UKKwkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShlcnIpKSB7CisJCQkvKgorCQkJICogRm9yIHRoZSBlcnJvciBjYXNlLiBUaGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gc2V0CisJCQkgKiBkaXJ0eSBkdXJpbmcgYXR0YWNobWVudCB0byBhIGRpcnR5IHBhZ2UuCisJCQkgKi8KKwkJCWlmIChlcnIgIT0gLUVOT01FTSkKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQl9CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCS8vIFRPRE86IFJlbW92ZSB0aGUgLUVPUE5PVFNVUFAgY2hlY2sgbGF0ZXIgb24uLi4KKwkJaWYgKHVubGlrZWx5KGVyciA9PSAtRU9QTk9UU1VQUCkpCisJCQllcnIgPSAwOworCQllbHNlIGlmIChlcnIgPT0gLUVOT01FTSkgeworCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeS4gIgorCQkJCQkiUmVkaXJ0eWluZyBwYWdlIHNvIHdlIHRyeSBhZ2FpbiAiCisJCQkJCSJsYXRlci4iKTsKKwkJCS8qCisJCQkgKiBQdXQgdGhlIHBhZ2UgYmFjayBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0CisJCQkgKiBsZWF2ZSBpdHMgYnVmZmVyJ3MgZGlydHkgc3RhdGUgYXMtaXMuCisJCQkgKi8KKwkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisKKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwkvKiBLZWVwcyB0cnlfdG9fZnJlZV9idWZmZXJzKCkgYXdheS4gKi8KKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCS8qCisJICogU3VibWl0IHRoZSBwcmVwYXJlZCBidWZmZXJzIGZvciBpL28uIE5vdGUgdGhlIHBhZ2UgaXMgdW5sb2NrZWQsCisJICogYW5kIHRoZSBhc3luYyB3cml0ZSBpL28gY29tcGxldGlvbiBoYW5kbGVyIGNhbiBlbmRfcGFnZV93cml0ZWJhY2soKQorCSAqIGF0IGFueSB0aW1lIGFmdGVyIHRoZSAqZmlyc3QqIHN1Ym1pdF9iaCgpLiBTbyB0aGUgYnVmZmVycyBjYW4gdGhlbgorCSAqIGRpc2FwcGVhci4uLgorCSAqLworCW5lZWRfZW5kX3dyaXRlYmFjayA9IFRSVUU7CisJZG8geworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCW5lZWRfZW5kX3dyaXRlYmFjayA9IEZBTFNFOworCQl9CisJCXB1dF9iaChiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCS8qIElmIG5vIGkvbyB3YXMgc3RhcnRlZCwgbmVlZCB0byBlbmRfcGFnZV93cml0ZWJhY2soKS4gKi8KKwlpZiAodW5saWtlbHkobmVlZF9lbmRfd3JpdGViYWNrKSkKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfd3JpdGVfbXN0X2Jsb2NrIC0gd3JpdGUgYSBAcGFnZSB0byB0aGUgYmFja2luZyBzdG9yZQorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byB3cml0ZSBvdXQKKyAqIEB3YmM6CXdyaXRlYmFjayBjb250cm9sIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHdyaXRpbmcgcGFnZXMgYmVsb25naW5nIHRvIG5vbi1yZXNpZGVudCwgbXN0IHByb3RlY3RlZAorICogYXR0cmlidXRlcyB0byB0aGVpciBiYWNraW5nIHN0b3JlLiAgVGhlIG9ubHkgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGluZGV4CisgKiBhbGxvY2F0aW9uIGFuZCAkTUZULyREQVRBLiAgQm90aCBkaXJlY3RvcnkgaW5vZGVzIGFuZCBpbmRleCBpbm9kZXMgYXJlCisgKiBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhbGxvY2F0aW9uIGNhc2UuCisgKgorICogVGhlIHBhZ2UgbXVzdCByZW1haW4gbG9ja2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdyaXRlIGJlY2F1c2Ugd2UgYXBwbHkKKyAqIHRoZSBtc3QgZml4dXBzLCB3cml0ZSwgYW5kIHRoZW4gdW5kbyB0aGUgZml4dXBzLCBzbyBpZiB3ZSB3ZXJlIHRvIHVubG9jayB0aGUKKyAqIHBhZ2UgYmVmb3JlIHVuZG9pbmcgdGhlIGZpeHVwcywgYW55IG90aGVyIHVzZXIgb2YgdGhlIHBhZ2Ugd2lsbCBzZWUgdGhlCisgKiBwYWdlIGNvbnRlbnRzIGFzIGNvcnJ1cHQuCisgKgorICogV2UgY2xlYXIgdGhlIHBhZ2UgdXB0b2RhdGUgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0byBlbnN1cmUKKyAqIGV4Y2x1c2lvbiBmb3IgdGhlICRNRlQvJERBVEEgY2FzZSBhZ2FpbnN0IHNvbWVvbmUgbWFwcGluZyBhbiBtZnQgcmVjb3JkIHdlCisgKiBhcmUgYWJvdXQgdG8gYXBwbHkgdGhlIG1zdCBmaXh1cHMgdG8uCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIEJhc2VkIG9uIG50ZnNfd3JpdGVfYmxvY2soKSwgbnRmc19tZnRfd3JpdGVwYWdlKCksIGFuZAorICogd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKS4KKyAqLworc3RhdGljIGludCBudGZzX3dyaXRlX21zdF9ibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc2VjdG9yX3QgYmxvY2ssIGRibG9jaywgcmVjX2Jsb2NrOworCXN0cnVjdCBpbm9kZSAqdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwl1OCAqa2FkZHI7CisJdW5zaWduZWQgY2hhciBiaF9zaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCXVuc2lnbmVkIGludCBiaF9zaXplID0gMSA8PCBiaF9zaXplX2JpdHM7CisJdW5zaWduZWQgaW50IHJlY19zaXplID0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJbnRmc19pbm9kZSAqbG9ja2VkX25pc1tQQUdFX0NBQ0hFX1NJWkUgLyByZWNfc2l6ZV07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp0YmgsICpyZWNfc3RhcnRfYmg7CisJaW50IG1heF9iaHMgPSBQQUdFX0NBQ0hFX1NJWkUgLyBiaF9zaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJaW50IGksIG5yX2xvY2tlZF9uaXMsIG5yX3JlY3MsIG5yX2JocywgYmhzX3Blcl9yZWMsIGVyciwgZXJyMjsKKwl1bnNpZ25lZCByZWNfc2l6ZV9iaXRzOworCUJPT0wgc3luYywgaXNfbWZ0LCBwYWdlX2lzX2RpcnR5LCByZWNfaXNfZGlydHk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LiIsIHZpLT5pX2lubywgbmktPnR5cGUsIHBhZ2UtPmluZGV4KTsKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCUJVR19PTighTklub01zdFByb3RlY3RlZChuaSkpOworCWlzX21mdCA9IChTX0lTUkVHKHZpLT5pX21vZGUpICYmICF2aS0+aV9pbm8pOworCS8qCisJICogTk9URTogbnRmc193cml0ZV9tc3RfYmxvY2soKSB3b3VsZCBiZSBjYWxsZWQgZm9yICRNRlRNaXJyIGlmIGEgcGFnZQorCSAqIGluIGl0cyBwYWdlIGNhY2hlIHdlcmUgdG8gYmUgbWFya2VkIGRpcnR5LiAgSG93ZXZlciB0aGlzIHNob3VsZAorCSAqIG5ldmVyIGhhcHBlbiB3aXRoIHRoZSBjdXJyZW50IGRyaXZlciBhbmQgY29uc2lkZXJpbmcgd2UgZG8gbm90CisJICogaGFuZGxlIHRoaXMgY2FzZSBoZXJlIHdlIGRvIHdhbnQgdG8gQlVHKCksIGF0IGxlYXN0IGZvciBub3cuCisJICovCisJQlVHX09OKCEoaXNfbWZ0IHx8IFNfSVNESVIodmktPmlfbW9kZSkgfHwKKwkJCShOSW5vQXR0cihuaSkgJiYgbmktPnR5cGUgPT0gQVRfSU5ERVhfQUxMT0NBVElPTikpKTsKKwlCVUdfT04oIW1heF9iaHMpOworCisJLyogV2VyZSB3ZSBjYWxsZWQgZm9yIHN5bmMgcHVycG9zZXM/ICovCisJc3luYyA9ICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCk7CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBtYXBwZWQgYnVmZmVycy4gKi8KKwlCVUdfT04oIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlCVUdfT04oIWJoKTsKKworCXJlY19zaXplX2JpdHMgPSBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzOworCUJVR19PTighKFBBR0VfQ0FDSEVfU0laRSA+PiByZWNfc2l6ZV9iaXRzKSk7CisJYmhzX3Blcl9yZWMgPSByZWNfc2l6ZSA+PiBiaF9zaXplX2JpdHM7CisJQlVHX09OKCFiaHNfcGVyX3JlYyk7CisKKwkvKiBUaGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBhZ2UuICovCisJcmVjX2Jsb2NrID0gYmxvY2sgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwKKwkJCShQQUdFX0NBQ0hFX1NISUZUIC0gYmhfc2l6ZV9iaXRzKTsKKworCS8qIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgZGF0YSBzaXplLiAqLworCWRibG9jayA9ICh2aS0+aV9zaXplICsgYmhfc2l6ZSAtIDEpID4+IGJoX3NpemVfYml0czsKKworCXJsID0gTlVMTDsKKwllcnIgPSBlcnIyID0gbnJfYmhzID0gbnJfcmVjcyA9IG5yX2xvY2tlZF9uaXMgPSAwOworCXBhZ2VfaXNfZGlydHkgPSByZWNfaXNfZGlydHkgPSBGQUxTRTsKKwlyZWNfc3RhcnRfYmggPSBOVUxMOworCWRvIHsKKwkJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJCWlmIChsaWtlbHkoYmxvY2sgPCByZWNfYmxvY2spKSB7CisJCQlpZiAodW5saWtlbHkoYmxvY2sgPj0gZGJsb2NrKSkgeworCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogVGhpcyBibG9jayBpcyBub3QgdGhlIGZpcnN0IG9uZSBpbiB0aGUgcmVjb3JkLiAgV2UKKwkJCSAqIGlnbm9yZSB0aGUgYnVmZmVyJ3MgZGlydHkgc3RhdGUgYmVjYXVzZSB3ZSBjb3VsZAorCQkJICogaGF2ZSByYWNlZCB3aXRoIGEgcGFyYWxsZWwgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpLgorCQkJICovCisJCQlpZiAoIXJlY19pc19kaXJ0eSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh1bmxpa2VseShlcnIyKSkgeworCQkJCWlmIChlcnIyICE9IC1FTk9NRU0pCisJCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSAvKiBpZiAoYmxvY2sgPT0gcmVjX2Jsb2NrKSAqLyB7CisJCQlCVUdfT04oYmxvY2sgPiByZWNfYmxvY2spOworCQkJLyogVGhpcyBibG9jayBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSByZWNvcmQuICovCisJCQlyZWNfYmxvY2sgKz0gYmhzX3Blcl9yZWM7CisJCQllcnIyID0gMDsKKwkJCWlmICh1bmxpa2VseShibG9jayA+PSBkYmxvY2spKSB7CisJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCS8qIENsZWFuIHJlY29yZHMgYXJlIG5vdCB3cml0dGVuIG91dC4gKi8KKwkJCQlyZWNfaXNfZGlydHkgPSBGQUxTRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlY19pc19kaXJ0eSA9IFRSVUU7CisJCQlyZWNfc3RhcnRfYmggPSBiaDsKKwkJfQorCQkvKiBOZWVkIHRvIG1hcCB0aGUgYnVmZmVyIGlmIGl0IGlzIG5vdCBtYXBwZWQgYWxyZWFkeS4gKi8KKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCVZDTiB2Y247CisJCQlMQ04gbGNuOworCQkJdW5zaWduZWQgaW50IHZjbl9vZnM7CisKKwkJCS8qIE9idGFpbiB0aGUgdmNuIGFuZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICovCisJCQl2Y24gPSAoVkNOKWJsb2NrIDw8IGJoX3NpemVfYml0czsKKwkJCXZjbl9vZnMgPSB2Y24gJiB2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCQkJdmNuID4+PSB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCQl9CisJCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCQlybCsrOworCQkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCX0gZWxzZQorCQkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJLyogU3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsaWtlbHkobGNuID49IDApKSB7CisJCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpICsKKwkJCQkJCXZjbl9vZnMpID4+IGJoX3NpemVfYml0czsKKwkJCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogUmVtYXAgZmFpbGVkLiAgUmV0cnkgdG8gbWFwIHRoZSBydW5saXN0IG9uY2UKKwkJCQkgKiB1bmxlc3Mgd2UgYXJlIHdvcmtpbmcgb24gJE1GVCB3aGljaCBhbHdheXMKKwkJCQkgKiBoYXMgdGhlIHdob2xlIG9mIGl0cyBydW5saXN0IGluIG1lbW9yeS4KKwkJCQkgKi8KKwkJCQlpZiAoIWlzX21mdCAmJiAhaXNfcmV0cnkgJiYKKwkJCQkJCWxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkgeworCQkJCQlpc19yZXRyeSA9IFRSVUU7CisJCQkJCS8qCisJCQkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nCisJCQkJCSAqIGxvY2sgZm9yIHRoZSBkdXJhdGlvbi4KKwkJCQkJICovCisJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCQllcnIyID0gbnRmc19tYXBfcnVubGlzdChuaSwgdmNuKTsKKwkJCQkJaWYgKGxpa2VseSghZXJyMikpCisJCQkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQkJCWlmIChlcnIyID09IC1FTk9NRU0pCisJCQkJCQlwYWdlX2lzX2RpcnR5ID0gVFJVRTsKKwkJCQkJbGNuID0gZXJyMjsKKwkJCQl9IGVsc2UKKwkJCQkJZXJyMiA9IC1FSU87CisJCQkJLyogSGFyZCBlcnJvci4gIEFib3J0IHdyaXRpbmcgdGhpcyByZWNvcmQuICovCisJCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJCWVyciA9IGVycjI7CisJCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCB3cml0ZSBudGZzIHJlY29yZCAiCisJCQkJCQkiMHglbGx4IChpbm9kZSAweCVseCwgIgorCQkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgpIGJlY2F1c2UgIgorCQkJCQkJIml0cyBsb2NhdGlvbiBvbiBkaXNrIGNvdWxkICIKKwkJCQkJCSJub3QgYmUgZGV0ZXJtaW5lZCAoZXJyb3IgIgorCQkJCQkJImNvZGUgJWxsaSkuIiwgKHM2NClibG9jayA8PAorCQkJCQkJYmhfc2l6ZV9iaXRzID4+CisJCQkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzLAorCQkJCQkJbmktPm1mdF9ubywgbmktPnR5cGUsCisJCQkJCQkobG9uZyBsb25nKWxjbik7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgYnVmZmVyLCByZW1vdmUgdGhlCisJCQkJICogYnVmZmVycyBpbiB0aGlzIHJlY29yZCBmcm9tIHRoZSBsaXN0IG9mCisJCQkJICogYnVmZmVycyB0byB3cml0ZSBhbmQgY2xlYXIgdGhlaXIgZGlydHkgYml0CisJCQkJICogaWYgbm90IGVycm9yIC1FTk9NRU0uCisJCQkJICovCisJCQkJaWYgKHJlY19zdGFydF9iaCAhPSBiaCkgeworCQkJCQl3aGlsZSAoYmhzWy0tbnJfYmhzXSAhPSByZWNfc3RhcnRfYmgpCisJCQkJCQk7CisJCQkJCWlmIChlcnIyICE9IC1FTk9NRU0pIHsKKwkJCQkJCWRvIHsKKwkJCQkJCQljbGVhcl9idWZmZXJfZGlydHkoCisJCQkJCQkJCXJlY19zdGFydF9iaCk7CisJCQkJCQl9IHdoaWxlICgocmVjX3N0YXJ0X2JoID0KKwkJCQkJCQkJcmVjX3N0YXJ0X2JoLT4KKwkJCQkJCQkJYl90aGlzX3BhZ2UpICE9CisJCQkJCQkJCWJoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCQlCVUdfT04obnJfYmhzID49IG1heF9iaHMpOworCQliaHNbbnJfYmhzKytdID0gYmg7CisJfSB3aGlsZSAoYmxvY2srKywgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlpZiAodW5saWtlbHkocmwpKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkvKiBJZiB0aGVyZSB3ZXJlIG5vIGRpcnR5IGJ1ZmZlcnMsIHdlIGFyZSBkb25lLiAqLworCWlmICghbnJfYmhzKQorCQlnb3RvIGRvbmU7CisJLyogTWFwIHRoZSBwYWdlIHNvIHdlIGNhbiBhY2Nlc3MgaXRzIGNvbnRlbnRzLiAqLworCWthZGRyID0ga21hcChwYWdlKTsKKwkvKiBDbGVhciB0aGUgcGFnZSB1cHRvZGF0ZSBmbGFnIHdoaWxzdCB0aGUgbXN0IGZpeHVwcyBhcmUgYXBwbGllZC4gKi8KKwlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBvZnM7CisKKwkJLyogU2tpcCBidWZmZXJzIHdoaWNoIGFyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiByZWNvcmRzLiAqLworCQlpZiAoaSAlIGJoc19wZXJfcmVjKQorCQkJY29udGludWU7CisJCXRiaCA9IGJoc1tpXTsKKwkJb2ZzID0gYmhfb2Zmc2V0KHRiaCk7CisJCWlmIChpc19tZnQpIHsKKwkJCW50ZnNfaW5vZGUgKnRuaTsKKwkJCXVuc2lnbmVkIGxvbmcgbWZ0X25vOworCisJCQkvKiBHZXQgdGhlIG1mdCByZWNvcmQgbnVtYmVyLiAqLworCQkJbWZ0X25vID0gKCgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgb2ZzKQorCQkJCQk+PiByZWNfc2l6ZV9iaXRzOworCQkJLyogQ2hlY2sgd2hldGhlciB0byB3cml0ZSB0aGlzIG1mdCByZWNvcmQuICovCisJCQl0bmkgPSBOVUxMOworCQkJaWYgKCFudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKHZvbCwgbWZ0X25vLAorCQkJCQkoTUZUX1JFQ09SRCopKGthZGRyICsgb2ZzKSwgJnRuaSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSByZWNvcmQgc2hvdWxkIG5vdCBiZSB3cml0dGVuLiAgVGhpcworCQkJCSAqIG1lYW5zIHdlIG5lZWQgdG8gcmVkaXJ0eSB0aGUgcGFnZSBiZWZvcmUKKwkJCQkgKiByZXR1cm5pbmcuCisJCQkJICovCisJCQkJcGFnZV9pc19kaXJ0eSA9IFRSVUU7CisJCQkJLyoKKwkJCQkgKiBSZW1vdmUgdGhlIGJ1ZmZlcnMgaW4gdGhpcyBtZnQgcmVjb3JkIGZyb20KKwkJCQkgKiB0aGUgbGlzdCBvZiBidWZmZXJzIHRvIHdyaXRlLgorCQkJCSAqLworCQkJCWRvIHsKKwkJCQkJYmhzW2ldID0gTlVMTDsKKwkJCQl9IHdoaWxlICgrK2kgJSBiaHNfcGVyX3JlYyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogVGhlIHJlY29yZCBzaG91bGQgYmUgd3JpdHRlbi4gIElmIGEgbG9ja2VkIG50ZnMKKwkJCSAqIGlub2RlIHdhcyByZXR1cm5lZCwgYWRkIGl0IHRvIHRoZSBhcnJheSBvZiBsb2NrZWQKKwkJCSAqIG50ZnMgaW5vZGVzLgorCQkJICovCisJCQlpZiAodG5pKQorCQkJCWxvY2tlZF9uaXNbbnJfbG9ja2VkX25pcysrXSA9IHRuaTsKKwkJfQorCQkvKiBBcHBseSB0aGUgbXN0IHByb3RlY3Rpb24gZml4dXBzLiAqLworCQllcnIyID0gcHJlX3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKShrYWRkciArIG9mcyksCisJCQkJcmVjX3NpemUpOworCQlpZiAodW5saWtlbHkoZXJyMikpIHsKKwkJCWlmICghZXJyIHx8IGVyciA9PSAtRU5PTUVNKQorCQkJCWVyciA9IC1FSU87CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYXBwbHkgbXN0IGZpeHVwcyAiCisJCQkJCSIoaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsICIKKwkJCQkJInBhZ2UgaW5kZXggMHglbHgsIHBhZ2Ugb2Zmc2V0IDB4JXgpISIKKwkJCQkJIiAgVW5tb3VudCBhbmQgcnVuIGNoa2Rzay4iLCB2aS0+aV9pbm8sCisJCQkJCW5pLT50eXBlLCBwYWdlLT5pbmRleCwgb2ZzKTsKKwkJCS8qCisJCQkgKiBNYXJrIGFsbCB0aGUgYnVmZmVycyBpbiB0aGlzIHJlY29yZCBjbGVhbiBhcyB3ZSBkbworCQkJICogbm90IHdhbnQgdG8gd3JpdGUgY29ycnVwdCBkYXRhIHRvIGRpc2suCisJCQkgKi8KKwkJCWRvIHsKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmhzW2ldKTsKKwkJCQliaHNbaV0gPSBOVUxMOworCQkJfSB3aGlsZSAoKytpICUgYmhzX3Blcl9yZWMpOworCQkJY29udGludWU7CisJCX0KKwkJbnJfcmVjcysrOworCX0KKwkvKiBJZiBubyByZWNvcmRzIGFyZSB0byBiZSB3cml0dGVuIG91dCwgd2UgYXJlIGRvbmUuICovCisJaWYgKCFucl9yZWNzKQorCQlnb3RvIHVubV9kb25lOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCS8qIExvY2sgYnVmZmVycyBhbmQgc3RhcnQgc3luY2hyb25vdXMgd3JpdGUgaS9vIG9uIHRoZW0uICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXRiaCA9IGJoc1tpXTsKKwkJaWYgKCF0YmgpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQodGJoKSkpCisJCQlCVUcoKTsKKwkJLyogVGhlIGJ1ZmZlciBkaXJ0eSBzdGF0ZSBpcyBub3cgaXJyZWxldmFudCwganVzdCBjbGVhbiBpdC4gKi8KKwkJY2xlYXJfYnVmZmVyX2RpcnR5KHRiaCk7CisJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKHRiaCkpOworCQlCVUdfT04oIWJ1ZmZlcl9tYXBwZWQodGJoKSk7CisJCWdldF9iaCh0YmgpOworCQl0YmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQlzdWJtaXRfYmgoV1JJVEUsIHRiaCk7CisJfQorCS8qIFN5bmNocm9uaXplIHRoZSBtZnQgbWlycm9yIG5vdyBpZiBub3QgQHN5bmMuICovCisJaWYgKGlzX21mdCAmJiAhc3luYykKKwkJZ290byBkb19taXJyb3I7Citkb193YWl0OgorCS8qIFdhaXQgb24gaS9vIGNvbXBsZXRpb24gb2YgYnVmZmVycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJdGJoID0gYmhzW2ldOworCQlpZiAoIXRiaCkKKwkJCWNvbnRpbnVlOworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgbnRmcyAiCisJCQkJCSJyZWNvcmQgYnVmZmVyIChpbm9kZSAweCVseCwgIgorCQkJCQkiYXR0cmlidXRlIHR5cGUgMHgleCwgcGFnZSBpbmRleCAiCisJCQkJCSIweCVseCwgcGFnZSBvZmZzZXQgMHglbHgpISAgVW5tb3VudCAiCisJCQkJCSJhbmQgcnVuIGNoa2Rzay4iLCB2aS0+aV9pbm8sIG5pLT50eXBlLAorCQkJCQlwYWdlLT5pbmRleCwgYmhfb2Zmc2V0KHRiaCkpOworCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJZXJyID0gLUVJTzsKKwkJCS8qCisJCQkgKiBTZXQgdGhlIGJ1ZmZlciB1cHRvZGF0ZSBzbyB0aGUgcGFnZSBhbmQgYnVmZmVyCisJCQkgKiBzdGF0ZXMgZG8gbm90IGJlY29tZSBvdXQgb2Ygc3luYy4KKwkJCSAqLworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSh0YmgpOworCQl9CisJfQorCS8qIElmIEBzeW5jLCBub3cgc3luY2hyb25pemUgdGhlIG1mdCBtaXJyb3IuICovCisJaWYgKGlzX21mdCAmJiBzeW5jKSB7Citkb19taXJyb3I6CisJCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBtZnRfbm87CisJCQl1bnNpZ25lZCBpbnQgb2ZzOworCisJCQkvKgorCQkJICogU2tpcCBidWZmZXJzIHdoaWNoIGFyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZgorCQkJICogcmVjb3Jkcy4KKwkJCSAqLworCQkJaWYgKGkgJSBiaHNfcGVyX3JlYykKKwkJCQljb250aW51ZTsKKwkJCXRiaCA9IGJoc1tpXTsKKwkJCS8qIFNraXAgcmVtb3ZlZCBidWZmZXJzIChhbmQgaGVuY2UgcmVjb3JkcykuICovCisJCQlpZiAoIXRiaCkKKwkJCQljb250aW51ZTsKKwkJCW9mcyA9IGJoX29mZnNldCh0YmgpOworCQkJLyogR2V0IHRoZSBtZnQgcmVjb3JkIG51bWJlci4gKi8KKwkJCW1mdF9ubyA9ICgoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mcykKKwkJCQkJPj4gcmVjX3NpemVfYml0czsKKwkJCWlmIChtZnRfbm8gPCB2b2wtPm1mdG1pcnJfc2l6ZSkKKwkJCQludGZzX3N5bmNfbWZ0X21pcnJvcih2b2wsIG1mdF9ubywKKwkJCQkJCShNRlRfUkVDT1JEKikoa2FkZHIgKyBvZnMpLAorCQkJCQkJc3luYyk7CisJCX0KKwkJaWYgKCFzeW5jKQorCQkJZ290byBkb193YWl0OworCX0KKwkvKiBSZW1vdmUgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBhZ2Fpbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJaWYgKCEoaSAlIGJoc19wZXJfcmVjKSkgeworCQkJdGJoID0gYmhzW2ldOworCQkJaWYgKCF0YmgpCisJCQkJY29udGludWU7CisJCQlwb3N0X3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKShrYWRkciArCisJCQkJCWJoX29mZnNldCh0YmgpKSk7CisJCX0KKwl9CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7Cit1bm1fZG9uZToKKwkvKiBVbmxvY2sgYW55IGxvY2tlZCBpbm9kZXMuICovCisJd2hpbGUgKG5yX2xvY2tlZF9uaXMtLSA+IDApIHsKKwkJbnRmc19pbm9kZSAqdG5pLCAqYmFzZV90bmk7CisJCQorCQl0bmkgPSBsb2NrZWRfbmlzW25yX2xvY2tlZF9uaXNdOworCQkvKiBHZXQgdGhlIGJhc2UgaW5vZGUuICovCisJCWRvd24oJnRuaS0+ZXh0ZW50X2xvY2spOworCQlpZiAodG5pLT5ucl9leHRlbnRzID49IDApCisJCQliYXNlX3RuaSA9IHRuaTsKKwkJZWxzZSB7CisJCQliYXNlX3RuaSA9IHRuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJCQlCVUdfT04oIWJhc2VfdG5pKTsKKwkJfQorCQl1cCgmdG5pLT5leHRlbnRfbG9jayk7CisJCW50ZnNfZGVidWcoIlVubG9ja2luZyAlcyBpbm9kZSAweCVseC4iLAorCQkJCXRuaSA9PSBiYXNlX3RuaSA/ICJiYXNlIiA6ICJleHRlbnQiLAorCQkJCXRuaS0+bWZ0X25vKTsKKwkJdXAoJnRuaS0+bXJlY19sb2NrKTsKKwkJYXRvbWljX2RlYygmdG5pLT5jb3VudCk7CisJCWlwdXQoVkZTX0koYmFzZV90bmkpKTsKKwl9CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKK2RvbmU6CisJaWYgKHVubGlrZWx5KGVyciAmJiBlcnIgIT0gLUVOT01FTSkpIHsKKwkJLyoKKwkJICogU2V0IHBhZ2UgZXJyb3IgaWYgdGhlcmUgaXMgb25seSBvbmUgbnRmcyByZWNvcmQgaW4gdGhlIHBhZ2UuCisJCSAqIE90aGVyd2lzZSB3ZSB3b3VsZCBsb29zZSBwZXItcmVjb3JkIGdyYW51bGFyaXR5LgorCQkgKi8KKwkJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID09IFBBR0VfQ0FDSEVfU0laRSkKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwlpZiAocGFnZV9pc19kaXJ0eSkgeworCQludGZzX2RlYnVnKCJQYWdlIHN0aWxsIGNvbnRhaW5zIG9uZSBvciBtb3JlIGRpcnR5IG50ZnMgIgorCQkJCSJyZWNvcmRzLiAgUmVkaXJ0eWluZyB0aGUgcGFnZSBzdGFydGluZyBhdCAiCisJCQkJInJlY29yZCAweCVseC4iLCBwYWdlLT5pbmRleCA8PAorCQkJCShQQUdFX0NBQ0hFX1NISUZUIC0gcmVjX3NpemVfYml0cykpOworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBLZWVwIHRoZSBWTSBoYXBweS4gIFRoaXMgbXVzdCBiZSBkb25lIG90aGVyd2lzZSB0aGUKKwkJICogcmFkaXgtdHJlZSB0YWcgUEFHRUNBQ0hFX1RBR19ESVJUWSByZW1haW5zIHNldCBldmVuIHRob3VnaAorCQkgKiB0aGUgcGFnZSBpcyBjbGVhbi4KKwkJICovCisJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCX0KKwlpZiAobGlrZWx5KCFlcnIpKQorCQludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc193cml0ZXBhZ2UgLSB3cml0ZSBhIEBwYWdlIHRvIHRoZSBiYWNraW5nIHN0b3JlCisgKiBAcGFnZToJcGFnZSBjYWNoZSBwYWdlIHRvIHdyaXRlIG91dAorICogQHdiYzoJd3JpdGViYWNrIGNvbnRyb2wgc3RydWN0dXJlCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgVk0gd2hlbiBpdCB3YW50cyB0byBoYXZlIGEgZGlydHkgbnRmcyBwYWdlIGNhY2hlCisgKiBwYWdlIGNsZWFuZWQuICBUaGUgVk0gaGFzIGFscmVhZHkgbG9ja2VkIHRoZSBwYWdlIGFuZCBtYXJrZWQgaXQgY2xlYW4uCisgKgorICogRm9yIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLCBudGZzX3dyaXRlcGFnZSgpIHdyaXRlcyB0aGUgQHBhZ2UgYnkgY2FsbGluZworICogdGhlIG50ZnMgdmVyc2lvbiBvZiB0aGUgZ2VuZXJpYyBibG9ja193cml0ZV9mdWxsX3BhZ2UoKSBmdW5jdGlvbiwKKyAqIG50ZnNfd3JpdGVfYmxvY2soKSwgd2hpY2ggaW4gdHVybiBpZiBuZWNlc3NhcnkgY3JlYXRlcyBhbmQgd3JpdGVzIHRoZQorICogYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhZ2UgYXN5bmNocm9ub3VzbHkuCisgKgorICogRm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMsIE9UT0gsIG50ZnNfd3JpdGVwYWdlKCkgd3JpdGVzIHRoZSBAcGFnZSBieSBjb3B5aW5nCisgKiB0aGUgZGF0YSB0byB0aGUgbWZ0IHJlY29yZCAod2hpY2ggYXQgdGhpcyBzdGFnZSBpcyBtb3N0IGxpa2VseSBpbiBtZW1vcnkpLgorICogVGhlIG1mdCByZWNvcmQgaXMgdGhlbiBtYXJrZWQgZGlydHkgYW5kIHdyaXR0ZW4gb3V0IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUKKyAqIHZmcyBpbm9kZSBkaXJ0eSBjb2RlIHBhdGggZm9yIHRoZSBpbm9kZSB0aGUgbWZ0IHJlY29yZCBiZWxvbmdzIHRvIG9yIHZpYSB0aGUKKyAqIHZtIHBhZ2UgZGlydHkgY29kZSBwYXRoIGZvciB0aGUgcGFnZSB0aGUgbWZ0IHJlY29yZCBpcyBpbi4KKyAqCisgKiBCYXNlZCBvbiBudGZzX3JlYWRwYWdlKCkgYW5kIGZzL2J1ZmZlci5jOjpibG9ja193cml0ZV9mdWxsX3BhZ2UoKS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCWxvZmZfdCBpX3NpemU7CisJc3RydWN0IGlub2RlICp2aTsKKwludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CisJY2hhciAqa2FkZHI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptOworCXUzMiBhdHRyX2xlbjsKKwlpbnQgZXJyOworCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKworCXZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpX3NpemUgPSBpX3NpemVfcmVhZCh2aSk7CisKKwkvKiBJcyB0aGUgcGFnZSBmdWxseSBvdXRzaWRlIGlfc2l6ZT8gKHRydW5jYXRlIGluIHByb2dyZXNzKSAqLworCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+PSAoaV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KKwkJCVBBR0VfQ0FDSEVfU0hJRlQpKSB7CisJCS8qCisJCSAqIFRoZSBwYWdlIG1heSBoYXZlIGRpcnR5LCB1bm1hcHBlZCBidWZmZXJzLiAgTWFrZSB0aGVtCisJCSAqIGZyZWVhYmxlIGhlcmUsIHNvIHRoZSBwYWdlIGRvZXMgbm90IGxlYWsuCisJCSAqLworCQlibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW50ZnNfZGVidWcoIldyaXRlIG91dHNpZGUgaV9zaXplIC0gdHJ1bmNhdGVkPyIpOworCQlyZXR1cm4gMDsKKwl9CisJbmkgPSBOVEZTX0kodmkpOworCisJLyogTklub05vblJlc2lkZW50KCkgPT0gTklub0luZGV4QWxsb2NQcmVzZW50KCkgKi8KKwlpZiAoTklub05vblJlc2lkZW50KG5pKSkgeworCQkvKgorCQkgKiBPbmx5IHVubmFtZWQgJERBVEEgYXR0cmlidXRlcyBjYW4gYmUgY29tcHJlc3NlZCwgZW5jcnlwdGVkLAorCQkgKiBhbmQvb3Igc3BhcnNlLgorCQkgKi8KKwkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgeworCQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJbnRmc19kZWJ1ZygiRGVueWluZyB3cml0ZSBhY2Nlc3MgdG8gZW5jcnlwdGVkICIKKwkJCQkJCSJmaWxlLiIpOworCQkJCXJldHVybiAtRUFDQ0VTOworCQkJfQorCQkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCQkvLyBUT0RPOiBJbXBsZW1lbnQgYW5kIHJlcGxhY2UgdGhpcyBjaGVjayB3aXRoCisJCQkJLy8gcmV0dXJuIG50ZnNfd3JpdGVfY29tcHJlc3NlZF9ibG9jayhwYWdlKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBjb21wcmVzc2VkICIKKwkJCQkJCSJmaWxlcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gIgorCQkJCQkJIlNvcnJ5LiIpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVtb3ZlIHRoaXMgY2hlY2suCisJCQlpZiAoTklub1NwYXJzZShuaSkpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBzcGFyc2UgZmlsZXMgIgorCQkJCQkJImlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBTb3JyeS4iKTsKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisJCX0KKwkJLyogV2UgaGF2ZSB0byB6ZXJvIGV2ZXJ5IHRpbWUgZHVlIHRvIG1tYXAtYXQtZW5kLW9mLWZpbGUuICovCisJCWlmIChwYWdlLT5pbmRleCA+PSAoaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpKSB7CisJCQkvKiBUaGUgcGFnZSBzdHJhZGRsZXMgaV9zaXplLiAqLworCQkJdW5zaWduZWQgaW50IG9mcyA9IGlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciArIG9mcywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2ZzKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl9CisJCS8qIEhhbmRsZSBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZXMuICovCisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkKKwkJCXJldHVybiBudGZzX3dyaXRlX21zdF9ibG9jayhwYWdlLCB3YmMpOworCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCXJldHVybiBudGZzX3dyaXRlX2Jsb2NrKHBhZ2UsIHdiYyk7CisJfQorCS8qCisJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCwgZW5jcnlwdGVkLAorCSAqIHNwYXJzZSwgb3IgbXN0IHByb3RlY3RlZC4gIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIKKwkgKiB0aGFuIGFuIG1mdCByZWNvcmQgYW5kIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkKKwkgKiByZXR1cm4gZXJyb3Igb24gYW55IHBhZ2VzIHdpdGggaW5kZXggYWJvdmUgMC4KKwkgKi8KKwlCVUdfT04ocGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+IDApKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJCVUcoKSEgcGFnZS0+aW5kZXggKDB4JWx4KSA+IDAuICAiCisJCQkJIkFib3J0aW5nIHdyaXRlLiIsIHBhZ2UtPmluZGV4KTsKKwkJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCQlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBlcnJfb3V0OworCS8qCisJICogS2VlcCB0aGUgVk0gaGFwcHkuICBUaGlzIG11c3QgYmUgZG9uZSBvdGhlcndpc2UgdGhlIHJhZGl4LXRyZWUgdGFnCisJICogUEFHRUNBQ0hFX1RBR19ESVJUWSByZW1haW5zIHNldCBldmVuIHRob3VnaCB0aGUgcGFnZSBpcyBjbGVhbi4KKwkgKi8KKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJLyoKKwkgKiBIZXJlLCB3ZSBkb24ndCBuZWVkIHRvIHplcm8gdGhlIG91dCBvZiBib3VuZHMgYXJlYSBldmVyeXRpbWUgYmVjYXVzZQorCSAqIHRoZSBiZWxvdyBtZW1jcHkoKSBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdGhlIG1tYXAtYXQtZW5kLW9mLWZpbGUKKwkgKiByZXF1aXJlbWVudHMuIElmIHRoZSBmaWxlIGlzIGNvbnZlcnRlZCB0byBhIG5vbi1yZXNpZGVudCBvbmUsIHRoZW4KKwkgKiB0aGUgY29kZSBwYXRoIHVzZSBpcyBzd2l0Y2hlZCB0byB0aGUgbm9uLXJlc2lkZW50IG9uZSB3aGVyZSB0aGUKKwkgKiB6ZXJvaW5nIGhhcHBlbnMgb24gZWFjaCBudGZzX3dyaXRlcGFnZSgpIGludm9jYXRpb24uCisJICoKKwkgKiBUaGUgYWJvdmUgYWxzbyBhcHBsaWVzIG5pY2VseSB3aGVuIGlfc2l6ZSBpcyBkZWNyZWFzZWQuCisJICoKKwkgKiBXaGVuIGlfc2l6ZSBpcyBpbmNyZWFzZWQsIHRoZSBtZW1vcnkgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgaV9zaXplCisJICogX211c3RfIGJlIHplcm9lZCAob3Igb3ZlcndyaXR0ZW4gd2l0aCBuZXcgZGF0YSkuIE90aGVyd2lzZSB3ZSB3aWxsCisJICogZXhwb3NlIGRhdGEgdG8gdXNlcnNwYWNlL2Rpc2sgd2hpY2ggc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBleHBvc2VkLgorCSAqCisJICogRklYTUU6IEVuc3VyZSB0aGF0IGlfc2l6ZSBpbmNyZWFzZXMgZG8gdGhlIHplcm9pbmcvb3ZlcndyaXRpbmcgYW5kCisJICogaWYgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0LCB0aGVuIGVuYWJsZSB0aGUgemVyb2luZyBiZWxvdy4gIElmIHRoZQorCSAqIHplcm9pbmcgYmVsb3cgaXMgZW5hYmxlZCwgd2UgTVVTVCBtb3ZlIHRoZSB1bmxvY2tfcGFnZSgpIGZyb20gYWJvdmUKKwkgKiB0byBhZnRlciB0aGUga3VubWFwX2F0b21pYygpLCBpLmUuIGp1c3QgYmVmb3JlIHRoZQorCSAqIGVuZF9wYWdlX3dyaXRlYmFjaygpLgorCSAqIFVQREFURTogbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSgpIGRvIHRoZSB6ZXJvaW5nIG9uIGlfc2l6ZQorCSAqIGluY3JlYXNlcyBmb3IgcmVzaWRlbnQgYXR0cmlidXRlcyBzbyB0aG9zZSBhcmUgb2suCisJICogVE9ETzogbnRmc190cnVuY2F0ZSgpLCBvdGhlcnM/CisJICovCisKKwlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKFZGU19JKG5pKSk7CisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJaWYgKHVubGlrZWx5KGF0dHJfbGVuID4gaV9zaXplKSkgeworCQkvKiBaZXJvIG91dCBvZiBib3VuZHMgYXJlYSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwkJbWVtc2V0KCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJCWlfc2l6ZSwgMCwgYXR0cl9sZW4gLSBpX3NpemUpOworCQlhdHRyX2xlbiA9IGlfc2l6ZTsKKwl9CisJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBwYWdlIHRvIHRoZSBtZnQgcmVjb3JkLiAqLworCW1lbWNweSgodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCWthZGRyLCBhdHRyX2xlbik7CisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkvKiBaZXJvIG91dCBvZiBib3VuZHMgYXJlYSBpbiB0aGUgcGFnZSBjYWNoZSBwYWdlLiAqLworCW1lbXNldChrYWRkciArIGF0dHJfbGVuLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBhdHRyX2xlbik7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBkaXJ0eSwgc28gaXQgZ2V0cyB3cml0dGVuIGJhY2suICovCisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIDA7CitlcnJfb3V0OgorCWlmIChlcnIgPT0gLUVOT01FTSkgeworCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeS4gUmVkaXJ0eWluZyAiCisJCQkJInBhZ2Ugc28gd2UgdHJ5IGFnYWluIGxhdGVyLiIpOworCQkvKgorCQkgKiBQdXQgdGhlIHBhZ2UgYmFjayBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0IGxlYXZlIGl0cworCQkgKiBidWZmZXJzJyBkaXJ0eSBzdGF0ZSBhcy1pcy4KKwkJICovCisJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCWVyciA9IDA7CisJfSBlbHNlIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIlJlc2lkZW50IGF0dHJpYnV0ZSB3cml0ZSBmYWlsZWQgd2l0aCAiCisJCQkJImVycm9yICVpLiAgU2V0dGluZyBwYWdlIGVycm9yIGZsYWcuIiwgZXJyKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCX0KKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZSAtCisgKgorICovCitzdGF0aWMgaW50IG50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJVkNOIHZjbjsKKwlMQ04gbGNuOworCXNlY3Rvcl90IGJsb2NrLCBhYmxvY2ssIGlibG9jazsKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfaW5vZGUgKm5pOworCW50ZnNfdm9sdW1lICp2b2w7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKndhaXRbMl0sICoqd2FpdF9iaCA9IHdhaXQ7CisJdW5zaWduZWQgaW50IHZjbl9vZnMsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIGJsb2Nrc2l6ZTsKKwlpbnQgZXJyOworCUJPT0wgaXNfcmV0cnk7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0czsKKworCXZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwluaSA9IE5URlNfSSh2aSk7CisJdm9sID0gbmktPnZvbDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgYXR0cmlidXRlIHR5cGUgMHgleCwgcGFnZSBpbmRleCAiCisJCQkiMHglbHgsIGZyb20gPSAldSwgdG8gPSAldS4iLCBuaS0+bWZ0X25vLCBuaS0+dHlwZSwKKwkJCXBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCisJYmxvY2tzaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCWJsb2Nrc2l6ZSA9IDEgPDwgYmxvY2tzaXplX2JpdHM7CisKKwkvKgorCSAqIGNyZWF0ZV9lbXB0eV9idWZmZXJzKCkgd2lsbCBjcmVhdGUgdXB0b2RhdGUvZGlydHkgYnVmZmVycyBpZiB0aGUKKwkgKiBwYWdlIGlzIHVwdG9kYXRlL2RpcnR5LgorCSAqLworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJaWYgKHVubGlrZWx5KCFiaCkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogVGhlIGZpcnN0IGJsb2NrIGluIHRoZSBwYWdlLiAqLworCWJsb2NrID0gKHM2NClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2l6ZV9iaXRzKTsKKworCS8qCisJICogVGhlIGZpcnN0IG91dCBvZiBib3VuZHMgYmxvY2sgZm9yIHRoZSBhbGxvY2F0ZWQgc2l6ZS4gTm8gbmVlZCB0bworCSAqIHJvdW5kIHVwIGFzIGFsbG9jYXRlZF9zaXplIGlzIGluIG11bHRpcGxlcyBvZiBjbHVzdGVyIHNpemUgYW5kIHRoZQorCSAqIG1pbmltdW0gY2x1c3RlciBzaXplIGlzIDUxMiBieXRlcywgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHNtYWxsZXN0CisJICogYmxvY2tzaXplLgorCSAqLworCWFibG9jayA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKKworCS8qIFRoZSBsYXN0IChmdWxseSBvciBwYXJ0aWFsbHkpIGluaXRpYWxpemVkIGJsb2NrLiAqLworCWlibG9jayA9IG5pLT5pbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZS4gKi8KKwlibG9ja19zdGFydCA9IDA7CisJcmwgPSBOVUxMOworCWVyciA9IDA7CisJZG8geworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwkJLyoKKwkJICogSWYgYnVmZmVyIEBiaCBpcyBvdXRzaWRlIHRoZSB3cml0ZSwganVzdCBtYXJrIGl0IHVwdG9kYXRlCisJCSAqIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGJ1ZmZlci4KKwkJICovCisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBAYmggaXMgYXQgbGVhc3QgcGFydGlhbGx5IGJlaW5nIHdyaXR0ZW4gdG8uCisJCSAqIE1ha2Ugc3VyZSBpdCBpcyBub3QgbWFya2VkIGFzIG5ldy4KKwkJICovCisJCS8vaWYgKGJ1ZmZlcl9uZXcoYmgpKQorCQkvLwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKworCQlpZiAoYmxvY2sgPj0gYWJsb2NrKSB7CisJCQkvLyBUT0RPOiBibG9jayBpcyBhYm92ZSBhbGxvY2F0ZWRfc2l6ZSwgbmVlZCB0bworCQkJLy8gYWxsb2NhdGUgaXQuIEJlc3QgZG9uZSBpbiBvbmUgZ28gdG8gYWNjb21tb2RhdGUgbm90CisJCQkvLyBvbmx5IGJsb2NrIGJ1dCBhbGwgYWJvdmUgYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmc6CisJCQkvLyAoKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG8gKyBibG9ja3NpemUKKwkJCS8vIC0gMSkgPj4gYmxvYmtzaXplX2JpdHMuIE9idmlvdXNseSB3aWxsIG5lZWQgdG8gcm91bmQKKwkJCS8vIHVwIHRvIG5leHQgY2x1c3RlciBib3VuZGFyeSwgdG9vLiBUaGlzIHNob3VsZCBiZQorCQkJLy8gZG9uZSB3aXRoIGEgaGVscGVyIGZ1bmN0aW9uLCBzbyBpdCBjYW4gYmUgcmV1c2VkLgorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBiZXlvbmQgYWxsb2NhdGVkIHNpemUgIgorCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGVycl9vdXQ7CisJCQkvLyBOZWVkIHRvIHVwZGF0ZSBhYmxvY2suCisJCQkvLyBOZWVkIHRvIHNldF9idWZmZXJfbmV3KCkgb24gYWxsIGJsb2NrIGJocyB0aGF0IGFyZQorCQkJLy8gbmV3bHkgYWxsb2NhdGVkLgorCQl9CisJCS8qCisJCSAqIE5vdyB3ZSBoYXZlIGVub3VnaCBhbGxvY2F0ZWQgc2l6ZSB0byBmdWxmaWxsIHRoZSB3aG9sZQorCQkgKiByZXF1ZXN0LCBpLmUuIGJsb2NrIDwgYWJsb2NrIGlzIHRydWUuCisJCSAqLworCQlpZiAodW5saWtlbHkoKGJsb2NrID49IGlibG9jaykgJiYKKwkJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCB2aS0+aV9zaXplKSkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHBhZ2UgaXMgZnVsbHkgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCisJCQkgKiBvdXQgYWxsIHBhZ2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgaW5pdGlhbGl6ZWQgc2l6ZQorCQkJICogYW5kIHRoZSBjdXJyZW50IHBhZ2UuIEp1c3QgdXNlIG50ZnNfcmVhZHBhZ2UoKSB0byBkbworCQkJICogdGhlIHplcm9pbmcgdHJhbnNwYXJlbnRseS4KKwkJCSAqLworCQkJaWYgKGJsb2NrID4gaWJsb2NrKSB7CisJCQkJLy8gVE9ETzoKKwkJCQkvLyBGb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gcmVhZF9jYWNoZV9wYWdlKCkKKwkJCQkvLyBBZ2FpbiBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gd2FpdF9vbl9wYWdlX2xvY2tlZCgpCisJCQkJLy8gLSBDaGVjayAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmCisJCQkJLy8JCQkhUGFnZUVycm9yKHBhZ2UpKQorCQkJCS8vIFVwZGF0ZSBpbml0aWFsaXplZCBzaXplIGluIHRoZSBhdHRyaWJ1dGUgYW5kCisJCQkJLy8gaW4gdGhlIGlub2RlLgorCQkJCS8vIEFnYWluLCBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vCV9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycygpOworCQkJCS8vIHBhZ2VfY2FjaGVfcmVsZWFzZSgpCisJCQkJLy8gV2UgZG9uJ3QgbmVlZCB0byB3YWl0IG9uIHRoZSB3cml0ZXMuCisJCQkJLy8gVXBkYXRlIGlibG9jay4KKwkJCX0KKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBwYWdlIHN0cmFkZGxlcyBpbml0aWFsaXplZCBzaXplLiBaZXJvCisJCQkgKiBhbGwgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMgYW5kIHNldCB0aGVtIHVwdG9kYXRlIChhbmQKKwkJCSAqIGRpcnR5PykuIE5vdGUsIHRoZXJlIGFyZW4ndCBhbnkgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMKKwkJCSAqIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLgorCQkJICogRklYTUU6IEZvciBhbiB1cHRvZGF0ZSBwYWdlLCB0aGUgYnVmZmVycyBtYXkgbmVlZCB0bworCQkJICogYmUgd3JpdHRlbiBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IGluaXRpYWxpemVkIG9uCisJCQkgKiBkaXNrIGJlZm9yZS4KKwkJCSAqLworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvLyBUT0RPOgorCQkJCS8vIFplcm8gYW55IG5vbi11cHRvZGF0ZSBidWZmZXJzIHVwIHRvIGlfc2l6ZS4KKwkJCQkvLyBTZXQgdGhlbSB1cHRvZGF0ZSBhbmQgZGlydHkuCisJCQl9CisJCQkvLyBUT0RPOgorCQkJLy8gVXBkYXRlIGluaXRpYWxpemVkIHNpemUgaW4gdGhlIGF0dHJpYnV0ZSBhbmQgaW4gdGhlCisJCQkvLyBpbm9kZSAodXAgdG8gaV9zaXplKS4KKwkJCS8vIFVwZGF0ZSBpYmxvY2suCisJCQkvLyBGSVhNRTogVGhpcyBpcyBpbmVmZmljaWVudC4gVHJ5IHRvIGJhdGNoIHRoZSB0d28KKwkJCS8vIHNpemUgY2hhbmdlcyB0byBoYXBwZW4gaW4gb25lIGdvLgorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBiZXlvbmQgaW5pdGlhbGl6ZWQgc2l6ZSAiCisJCQkJCSJpcyBub3Qgc3VwcG9ydGVkIHlldC4gU29ycnkuIik7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gZXJyX291dDsKKwkJCS8vIERvIE5PVCBzZXRfYnVmZmVyX25ldygpIEJVVCBETyBjbGVhciBidWZmZXIgcmFuZ2UKKwkJCS8vIG91dHNpZGUgd3JpdGUgcmVxdWVzdCByYW5nZS4KKwkJCS8vIHNldF9idWZmZXJfdXB0b2RhdGUoKSBvbiBjb21wbGV0ZSBidWZmZXJzIGFzIHdlbGwgYXMKKwkJCS8vIHNldF9idWZmZXJfZGlydHkoKS4KKwkJfQorCisJCS8qIE5lZWQgdG8gbWFwIHVubWFwcGVkIGJ1ZmZlcnMuICovCisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCS8qIFVubWFwcGVkIGJ1ZmZlci4gTmVlZCB0byBtYXAgaXQuICovCisJCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OworCisJCQkvKiBDb252ZXJ0IGJsb2NrIGludG8gY29ycmVzcG9uZGluZyB2Y24gYW5kIG9mZnNldC4gKi8KKwkJCXZjbiA9IChWQ04pYmxvY2sgPDwgYmxvY2tzaXplX2JpdHMgPj4KKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCXZjbl9vZnMgPSAoKFZDTilibG9jayA8PCBibG9ja3NpemVfYml0cykgJgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCisJCQlpc19yZXRyeSA9IEZBTFNFOworCQkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCQl9CisJCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCQlybCsrOworCQkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCX0gZWxzZQorCQkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJaWYgKHVubGlrZWx5KGxjbiA8IDApKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBleHRlbmRlZCB0aGUgYXR0cmlidXRlIGFsbG9jYXRpb24gYWJvdmUuCisJCQkJICogSWYgd2UgaGl0IGFuIEVOT0VOVCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlCisJCQkJICogYWxsb2NhdGlvbiB3YXMgaW5zdWZmaWNpZW50IHdoaWNoIGlzIGEgYnVnLgorCQkJCSAqLworCQkJCUJVR19PTihsY24gPT0gTENOX0VOT0VOVCk7CisKKwkJCQkvKiBJdCBpcyBhIGhvbGUsIG5lZWQgdG8gaW5zdGFudGlhdGUgaXQuICovCisJCQkJaWYgKGxjbiA9PSBMQ05fSE9MRSkgeworCQkJCQkvLyBUT0RPOiBJbnN0YW50aWF0ZSB0aGUgaG9sZS4KKwkJCQkJLy8gY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQkJCS8vIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwKKwkJCQkJLy8JCWJoLT5iX2Jsb2NrbnIpOworCQkJCQkvLyBGb3Igbm9uLXVwdG9kYXRlIGJ1ZmZlcnMsIG5lZWQgdG8KKwkJCQkJLy8gemVybyBvdXQgdGhlIHJlZ2lvbiBvdXRzaWRlIHRoZQorCQkJCQkvLyByZXF1ZXN0IGluIHRoaXMgYmggb3IgYWxsIGJocywKKwkJCQkJLy8gZGVwZW5kaW5nIG9uIHdoYXQgd2UgaW1wbGVtZW50ZWQKKwkJCQkJLy8gYWJvdmUuCisJCQkJCS8vIE5lZWQgdG8gZmx1c2hfZGNhY2hlX3BhZ2UoKS4KKwkJCQkJLy8gT3IgY291bGQgdXNlIHNldF9idWZmZXJfbmV3KCkKKwkJCQkJLy8gaW5zdGVhZD8KKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBpbnRvICIKKwkJCQkJCQkic3BhcnNlIHJlZ2lvbnMgaXMgIgorCQkJCQkJCSJub3Qgc3VwcG9ydGVkIHlldC4gIgorCQkJCQkJCSJTb3JyeS4iKTsKKwkJCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQkJCWdvdG8gZXJyX291dDsKKwkJCQl9IGVsc2UgaWYgKCFpc19yZXRyeSAmJgorCQkJCQkJbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7CisJCQkJCWlzX3JldHJ5ID0gVFJVRTsKKwkJCQkJLyoKKwkJCQkJICogQXR0ZW1wdCB0byBtYXAgcnVubGlzdCwgZHJvcHBpbmcKKwkJCQkJICogbG9jayBmb3IgdGhlIGR1cmF0aW9uLgorCQkJCQkgKi8KKwkJCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQkJCWlmIChsaWtlbHkoIWVycikpCisJCQkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQkJCXJsID0gTlVMTDsKKwkJCQkJbGNuID0gZXJyOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEZhaWxlZCB0byBtYXAgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlcgorCQkJCSAqIHJldHJ5aW5nLgorCQkJCSAqLworCQkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gd3JpdGUgdG8gaW5vZGUgIgorCQkJCQkJIjB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCAiCisJCQkJCQkidmNuIDB4JWxseCwgb2Zmc2V0IDB4JXggIgorCQkJCQkJImJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uIGRpc2sgIgorCQkJCQkJImNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkJXMgIgorCQkJCQkJIihlcnJvciBjb2RlICVsbGkpLiIsCisJCQkJCQluaS0+bWZ0X25vLCBuaS0+dHlwZSwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCQkJdmNuX29mcywgaXNfcmV0cnkgPyAiIGV2ZW4gIgorCQkJCQkJImFmdGVyIHJldHJ5aW5nIiA6ICIiLAorCQkJCQkJKGxvbmcgbG9uZylsY24pOworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCS8qIFdlIG5vdyBoYXZlIGEgc3VjY2Vzc2Z1bCByZW1hcCwgaS5lLiBsY24gPj0gMC4gKi8KKworCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCWJoLT5iX2Jsb2NrbnIgPSAoKGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKQorCQkJCQkrIHZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCisJCQkvLyBGSVhNRTogU29tZXRoaW5nIGFuYWxvZ291cyB0byB0aGlzIGlzIG5lZWRlZCBmb3IKKwkJCS8vIGVhY2ggbmV3bHkgYWxsb2NhdGVkIGJsb2NrLCBpLmUuIEJIX05ldy4KKwkJCS8vIEZJWE1FOiBNaWdodCBuZWVkIHRvIHRha2UgdGhpcyBvdXQgb2YgdGhlCisJCQkvLyBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7fSwgZGVwZW5kaW5nIG9uIGhvdyB3ZQorCQkJLy8gaW1wbGVtZW50IHRoaW5ncyBkdXJpbmcgdGhlIGFsbG9jYXRlZF9zaXplIGFuZAorCQkJLy8gaW5pdGlhbGl6ZWRfc2l6ZSBleHRlbnNpb24gY29kZSBhYm92ZS4KKwkJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwKKwkJCQkJCWJoLT5iX2Jsb2NrbnIpOworCQkJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIFBhZ2UgaXMgX25vdF8gdXB0b2RhdGUsIHplcm8gc3Vycm91bmRpbmcKKwkJCQkgKiByZWdpb24uIE5PVEU6IFRoaXMgaXMgaG93IHdlIGRlY2lkZSBpZiB0bworCQkJCSAqIHplcm8gb3Igbm90IQorCQkJCSAqLworCQkJCWlmIChibG9ja19lbmQgPiB0byB8fCBibG9ja19zdGFydCA8IGZyb20pIHsKKwkJCQkJdm9pZCAqa2FkZHI7CisKKwkJCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQkJCWlmIChibG9ja19lbmQgPiB0bykKKwkJCQkJCW1lbXNldChrYWRkciArIHRvLCAwLAorCQkJCQkJCQlibG9ja19lbmQgLSB0byk7CisJCQkJCWlmIChibG9ja19zdGFydCA8IGZyb20pCisJCQkJCQltZW1zZXQoa2FkZHIgKyBibG9ja19zdGFydCwgMCwKKwkJCQkJCQkJZnJvbSAtCisJCQkJCQkJCWJsb2NrX3N0YXJ0KTsKKwkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogQGJoIGlzIG1hcHBlZCwgc2V0IGl0IHVwdG9kYXRlIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLiAqLworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgcGFnZSBpcyBub3QgdXB0b2RhdGUuIFRoZSBidWZmZXIgaXMgbWFwcGVkLiBJZiBpdCBpcyBub3QKKwkJICogdXB0b2RhdGUsIGFuZCBpdCBpcyBvbmx5IHBhcnRpYWxseSBiZWluZyB3cml0dGVuIHRvLCB3ZSBuZWVkCisJCSAqIHRvIHJlYWQgdGhlIGJ1ZmZlciBpbiBiZWZvcmUgdGhlIHdyaXRlLCBpLmUuIHJpZ2h0IG5vdy4KKwkJICovCisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCQkJCShibG9ja19zdGFydCA8IGZyb20gfHwgYmxvY2tfZW5kID4gdG8pKSB7CisJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJKndhaXRfYmgrKyA9IGJoOworCQl9CisJfSB3aGlsZSAoYmxvY2srKywgYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsCisJCQkoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyogUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSB0b29rIGl0LiAqLworCWlmIChybCkgeworCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJcmwgPSBOVUxMOworCX0KKworCS8qIElmIHdlIGlzc3VlZCByZWFkIHJlcXVlc3RzLCBsZXQgdGhlbSBjb21wbGV0ZS4gKi8KKwl3aGlsZSAod2FpdF9iaCA+IHdhaXQpIHsKKwkJd2FpdF9vbl9idWZmZXIoKi0td2FpdF9iaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CitlcnJfb3V0OgorCS8qCisJICogWmVybyBvdXQgYW55IG5ld2x5IGFsbG9jYXRlZCBibG9ja3MgdG8gYXZvaWQgZXhwb3Npbmcgc3RhbGUgZGF0YS4KKwkgKiBJZiBCSF9OZXcgaXMgc2V0LCB3ZSBrbm93IHRoYXQgdGhlIGJsb2NrIHdhcyBuZXdseSBhbGxvY2F0ZWQgaW4gdGhlCisJICogYWJvdmUgbG9vcC4KKwkgKiBGSVhNRTogV2hhdCBhYm91dCBpbml0aWFsaXplZF9zaXplIGluY3JlbWVudHM/IEhhdmUgd2UgZG9uZSBhbGwgdGhlCisJICogcmVxdWlyZWQgemVyb2luZyBhYm92ZT8gSWYgbm90IHRoaXMgZXJyb3IgaGFuZGxpbmcgaXMgYnJva2VuLCBhbmQKKwkgKiBpbiBwYXJ0aWN1bGFyIHRoZSBpZiAoYmxvY2tfZW5kIDw9IGZyb20pIGNoZWNrIGlzIGNvbXBsZXRlbHkgYm9ndXMuCisJICovCisJYmggPSBoZWFkOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlpc19yZXRyeSA9IEZBTFNFOworCWRvIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYmxvY2tfc3RhcnQgPj0gdG8pCisJCQlicmVhazsKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQl2b2lkICprYWRkcjsKKworCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciArIGJsb2NrX3N0YXJ0LCAwLCBiaC0+Yl9zaXplKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJaXNfcmV0cnkgPSBUUlVFOworCQl9CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJaWYgKGlzX3JldHJ5KQorCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlpZiAocmwpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19wcmVwYXJlX3dyaXRlIC0gcHJlcGFyZSBhIHBhZ2UgZm9yIHJlY2VpdmluZyBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBnZW5lcmljX2ZpbGVfd3JpdGUoKSB3aXRoIGlfc2VtIGhlbGQgb24gdGhlIGlub2RlCisgKiAoQHBhZ2UtPm1hcHBpbmctPmhvc3QpLiAgVGhlIEBwYWdlIGlzIGxvY2tlZCBidXQgbm90IGttYXAoKXBlZC4gIFRoZSBzb3VyY2UKKyAqIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgQHBhZ2UuCisgKgorICogTmVlZCB0byBleHRlbmQgdGhlIGF0dHJpYnV0ZS9maWxsIGluIGhvbGVzIGlmIG5lY2Vzc2FyeSwgY3JlYXRlIGJsb2NrcyBhbmQKKyAqIG1ha2UgcGFydGlhbGx5IG92ZXJ3cml0dGVuIGJsb2NrcyB1cHRvZGF0ZSwKKyAqCisgKiBpX3NpemUgaXMgbm90IHRvIGJlIG1vZGlmaWVkIHlldC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBTaG91bGQgYmUgdXNpbmcgYmxvY2tfcHJlcGFyZV93cml0ZSgpIFtzdXBwb3J0IGZvciBzcGFyc2UgZmlsZXNdIG9yCisgKiBjb250X3ByZXBhcmVfd3JpdGUoKSBbbm8gc3VwcG9ydCBmb3Igc3BhcnNlIGZpbGVzXS4gIENhbm5vdCBkbyB0aGF0IGR1ZSB0bworICogbnRmcyBzcGVjaWZpY3MgYnV0IGNhbiBsb29rIGF0IHRoZW0gZm9yIGltcGxlbWVudGF0aW9uIGd1aWRhbmNlLgorICoKKyAqIE5vdGU6IEluIHRoZSByYW5nZSwgQGZyb20gaXMgaW5jbHVzaXZlIGFuZCBAdG8gaXMgZXhjbHVzaXZlLCBpLmUuIEBmcm9tIGlzCisgKiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgcGFnZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhbmQgQHRvIGlzIHRoZSBmaXJzdCBieXRlCisgKiBhZnRlciB0aGUgbGFzdCBieXRlIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvLgorICovCitzdGF0aWMgaW50IG50ZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXM2NCBuZXdfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwludGZzX2lub2RlICpiYXNlX25pID0gTlVMTCwgKm5pID0gTlRGU19JKHZpKTsKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4ID0gTlVMTDsKKwlNRlRfUkVDT1JEICptID0gTlVMTDsKKwlBVFRSX1JFQ09SRCAqYTsKKwl1OCAqa2FkZHI7CisJdTMyIGF0dHJfbGVuOworCWludCBlcnI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgdmktPmlfaW5vLCBuaS0+dHlwZSwKKwkJCXBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSk7CisJQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKKwlCVUdfT04oZnJvbSA+IHRvKTsKKwlCVUdfT04oTklub01zdFByb3RlY3RlZChuaSkpOworCS8qCisJICogSWYgYSBwcmV2aW91cyBudGZzX3RydW5jYXRlKCkgZmFpbGVkLCByZXBlYXQgaXQgYW5kIGFib3J0IGlmIGl0CisJICogZmFpbHMgYWdhaW4uCisJICovCisJaWYgKHVubGlrZWx5KE5Jbm9UcnVuY2F0ZUZhaWxlZChuaSkpKSB7CisJCWRvd25fd3JpdGUoJnZpLT5pX2FsbG9jX3NlbSk7CisJCWVyciA9IG50ZnNfdHJ1bmNhdGUodmkpOworCQl1cF93cml0ZSgmdmktPmlfYWxsb2Nfc2VtKTsKKwkJaWYgKGVyciB8fCBOSW5vVHJ1bmNhdGVGYWlsZWQobmkpKSB7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSAtRUlPOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCS8qIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHJlc2lkZW50LCBkZWFsIHdpdGggaXQgZWxzZXdoZXJlLiAqLworCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpKSB7CisJCS8qCisJCSAqIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkLCBlbmNyeXB0ZWQsCisJCSAqIGFuZC9vciBzcGFyc2UuCisJCSAqLworCQlpZiAobmktPnR5cGUgPT0gQVRfREFUQSAmJiAhbmktPm5hbWVfbGVuKSB7CisJCQkvKiBJZiBmaWxlIGlzIGVuY3J5cHRlZCwgZGVueSBhY2Nlc3MsIGp1c3QgbGlrZSBOVDQuICovCisJCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKKwkJCQludGZzX2RlYnVnKCJEZW55aW5nIHdyaXRlIGFjY2VzcyB0byBlbmNyeXB0ZWQgIgorCQkJCQkJImZpbGUuIik7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVwbGFjZSB0aGlzIGNoZWNrIHdpdGgKKwkJCQkvLyByZXR1cm4gbnRmc193cml0ZV9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIGNvbXByZXNzZWQgIgorCQkJCQkJImZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAiCisJCQkJCQkiU29ycnkuIik7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJfQorCQkJLy8gVE9ETzogSW1wbGVtZW50IGFuZCByZW1vdmUgdGhpcyBjaGVjay4KKwkJCWlmIChOSW5vU3BhcnNlKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIHNwYXJzZSBmaWxlcyAiCisJCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJfQorCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCXJldHVybiBudGZzX3ByZXBhcmVfbm9ucmVzaWRlbnRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQsIGVuY3J5cHRlZCwgb3IKKwkgKiBzcGFyc2UuCisJICovCisJQlVHX09OKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCW5ld19zaXplID0gKChzNjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwkvKiBJZiB3ZSBkbyBub3QgbmVlZCB0byByZXNpemUgdGhlIGF0dHJpYnV0ZSBhbGxvY2F0aW9uIHdlIGFyZSBkb25lLiAqLworCWlmIChuZXdfc2l6ZSA8PSB2aS0+aV9zaXplKQorCQlnb3RvIGRvbmU7CisKKwkvLyBGSVhNRTogV2UgYWJvcnQgZm9yIG5vdyBhcyB0aGlzIGNvZGUgaXMgbm90IHNhZmUuCisJbnRmc19lcnJvcih2aS0+aV9zYiwgIkNoYW5naW5nIHRoZSBmaWxlIHNpemUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAiCisJCQkiU29ycnkuIik7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogTWFwLCBwaW4sIGFuZCBsb2NrIHRoZSAoYmFzZSkgbWZ0IHJlY29yZC4gKi8KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQltID0gTlVMTDsKKwkJY3R4ID0gTlVMTDsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisJbSA9IGN0eC0+bXJlYzsKKwlhID0gY3R4LT5hdHRyOworCS8qIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlCVUdfT04odmktPmlfc2l6ZSAhPSBhdHRyX2xlbik7CisJLyogQ2hlY2sgaWYgbmV3IHNpemUgaXMgYWxsb3dlZCBpbiAkQXR0ckRlZi4gKi8KKwllcnIgPSBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2sodm9sLCBuaS0+dHlwZSwgbmV3X3NpemUpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVSQU5HRSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGUgd291bGQgY2F1c2UgdGhlIGlub2RlICIKKwkJCQkJIjB4JWx4IHRvIGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIGZvciAiCisJCQkJCSJpdHMgYXR0cmlidXRlIHR5cGUgKDB4JXgpLiAgQWJvcnRpbmcgIgorCQkJCQkid3JpdGUuIiwgdmktPmlfaW5vLAorCQkJCQlsZTMyX3RvX2NwdShuaS0+dHlwZSkpOworCQl9IGVsc2UgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW5vZGUgMHglbHggaGFzIHVua25vd24gIgorCQkJCQkiYXR0cmlidXRlIHR5cGUgMHgleC4gIEFib3J0aW5nICIKKwkJCQkJIndyaXRlLiIsIHZpLT5pX2lubywKKwkJCQkJbGUzMl90b19jcHUobmktPnR5cGUpKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwkJZ290byBlcnJfb3V0MjsKKwl9CisJLyoKKwkgKiBFeHRlbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQgdG8gYmUgYWJsZSB0byBzdG9yZSB0aGUgbmV3IGF0dHJpYnV0ZQorCSAqIHNpemUuCisJICovCisJaWYgKG5ld19zaXplID49IHZvbC0+bWZ0X3JlY29yZF9zaXplIHx8IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKG0sIGEsCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJbmV3X3NpemUpKSB7CisJCS8qIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG1mdCByZWNvcmQuICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG1mdCByZWNvcmQgZm9yICIKKwkJCQkidGhlIHJlc2l6ZWQgYXR0cmlidXRlIHZhbHVlLiAgVGhpcyBpcyBub3QgIgorCQkJCSJzdXBwb3J0ZWQgeWV0LiAgQWJvcnRpbmcgd3JpdGUuIik7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIGVycl9vdXQyOworCX0KKwkvKgorCSAqIFdlIGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkIHRvIGZpdCB0aGUgd3JpdGUuICBUaGlzCisJICogaW1wbGllcyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWZ0IHJlY29yZCBhbmQgaGVuY2UgdGhlCisJICogYXR0cmlidXRlIG11c3QgYmUgaW4gYSBzaW5nbGUgcGFnZSBhbmQgaGVuY2UgcGFnZS0+aW5kZXggbXVzdCBiZSAwLgorCSAqLworCUJVR19PTihwYWdlLT5pbmRleCk7CisJLyoKKwkgKiBJZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3cml0ZSBpcyBwYXN0IHRoZSBvbGQgc2l6ZSwgZW5sYXJnZSB0aGUKKwkgKiBhdHRyaWJ1dGUgdmFsdWUgdXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgd3JpdGUgYW5kIGZpbGwgaXQgd2l0aAorCSAqIHplcm9lcy4KKwkgKi8KKwlpZiAoZnJvbSA+IGF0dHJfbGVuKSB7CisJCW1lbXNldCgodTgqKWEgKyBsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJCWF0dHJfbGVuLCAwLCBmcm9tIC0gYXR0cl9sZW4pOworCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGZyb20pOworCQkvKiBaZXJvIHRoZSBjb3JyZXNwb25kaW5nIGFyZWEgaW4gdGhlIHBhZ2UgYXMgd2VsbC4gKi8KKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIgKyBhdHRyX2xlbiwgMCwgZnJvbSAtIGF0dHJfbGVuKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQl9CisJfQorCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJLyoKKwkgKiBCZWNhdXNlIHJlc2lkZW50IGF0dHJpYnV0ZXMgYXJlIGhhbmRsZWQgYnkgbWVtY3B5KCkgdG8vZnJvbSB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIE1GVCByZWNvcmQsIGFuZCBiZWNhdXNlIHRoaXMgZm9ybSBvZiBpL28gaXMgYnl0ZQorCSAqIGFsaWduZWQgcmF0aGVyIHRoYW4gYmxvY2sgYWxpZ25lZCwgdGhlcmUgaXMgbm8gbmVlZCB0byBicmluZyB0aGUKKwkgKiBwYWdlIHVwdG9kYXRlIGhlcmUgYXMgaW4gdGhlIG5vbi1yZXNpZGVudCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KKwkgKiBicmluZyB0aGUgYnVmZmVycyBzdHJhZGRsZWQgYnkgdGhlIHdyaXRlIHVwdG9kYXRlIGJlZm9yZQorCSAqIGdlbmVyaWNfZmlsZV93cml0ZSgpIGRvZXMgdGhlIGNvcHlpbmcgZnJvbSB1c2Vyc3BhY2UuCisJICoKKwkgKiBXZSB0aHVzIGRlZmVyIHRoZSB1cHRvZGF0ZSBicmluZ2luZyBvZiB0aGUgcGFnZSByZWdpb24gb3V0c2lkZSB0aGUKKwkgKiByZWdpb24gd3JpdHRlbiB0byB0byBudGZzX2NvbW1pdF93cml0ZSgpLCB3aGljaCBtYWtlcyB0aGUgY29kZQorCSAqIHNpbXBsZXIgYW5kIHNhdmVzIG9uZSBhdG9taWMga21hcCB3aGljaCBpcyBnb29kLgorCSAqLworZG9uZToKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pCisJCW50ZnNfd2FybmluZyh2aS0+aV9zYiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IHJlcXVpcmVkIHRvICIKKwkJCQkicHJlcGFyZSB0aGUgd3JpdGUuIik7CisJZWxzZSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJSZXNpZGVudCBhdHRyaWJ1dGUgcHJlcGFyZSB3cml0ZSBmYWlsZWQgIgorCQkJCSJ3aXRoIGVycm9yICVpLiIsIGVycik7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJbWFrZV9iYWRfaW5vZGUodmkpOworCX0KK2Vycl9vdXQyOgorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19jb21taXRfbm9ucmVzaWRlbnRfd3JpdGUgLQorICoKKyAqLworc3RhdGljIGludCBudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJczY0IHBvcyA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJc3RydWN0IGlub2RlICp2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisJdW5zaWduZWQgaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIGJsb2Nrc2l6ZTsKKwlCT09MIHBhcnRpYWw7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgdmktPmlfaW5vLAorCQkJTlRGU19JKHZpKS0+dHlwZSwgcGFnZS0+aW5kZXgsIGZyb20sIHRvKTsKKwlibG9ja3NpemUgPSAxIDw8IHZpLT5pX2Jsa2JpdHM7CisKKwkvLyBGSVhNRTogV2UgbmVlZCBhIHdob2xlIHNsZXcgb2Ygc3BlY2lhbCBjYXNlcyBpbiBoZXJlIGZvciBjb21wcmVzc2VkCisJLy8gZmlsZXMgZm9yIGV4YW1wbGUuLi4KKwkvLyBGb3Igbm93LCB3ZSBrbm93IG50ZnNfcHJlcGFyZV93cml0ZSgpIHdvdWxkIGhhdmUgZmFpbGVkIHNvIHdlIGNhbid0CisJLy8gZ2V0IGhlcmUgaW4gYW55IG9mIHRoZSBjYXNlcyB3aGljaCB3ZSBoYXZlIHRvIHNwZWNpYWwgY2FzZSwgc28gd2UKKwkvLyBhcmUganVzdCBhIHJpcHBlZCBvZmYsIHVucm9sbGVkIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkuCisKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmxvY2tfc3RhcnQgPSAwOworCXBhcnRpYWwgPSBGQUxTRTsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQlwYXJ0aWFsID0gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCisJICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIC0+cmVhZHBhZ2UoKSBmb3IgdGhlIG5leHQKKwkgKiByZWFkKCkuICBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50IHVwdG9kYXRlIGFzIGEKKwkgKiByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCisJICovCisJaWYgKCFwYXJ0aWFsKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJLyoKKwkgKiBOb3QgY29udmluY2VkIGFib3V0IHRoaXMgYXQgYWxsLiAgU2VlIGRpc3Bhcml0eSBjb21tZW50IGFib3ZlLiAgRm9yCisJICogbm93IHdlIGtub3cgbnRmc19wcmVwYXJlX3dyaXRlKCkgd291bGQgaGF2ZSBmYWlsZWQgaW4gdGhlIHdyaXRlCisJICogZXhjZWVkcyBpX3NpemUgY2FzZSwgc28gdGhpcyB3aWxsIG5ldmVyIHRyaWdnZXIgd2hpY2ggaXMgZmluZS4KKwkgKi8KKwlpZiAocG9zID4gdmktPmlfc2l6ZSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyBiZXlvbmQgdGhlIGV4aXN0aW5nIGZpbGUgc2l6ZSBpcyAiCisJCQkJIm5vdCBzdXBwb3J0ZWQgeWV0LiAgU29ycnkuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJLy8gdmktPmlfc2l6ZSA9IHBvczsKKwkJLy8gbWFya19pbm9kZV9kaXJ0eSh2aSk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbnRmc19jb21taXRfd3JpdGUgLSBjb21taXQgdGhlIHJlY2VpdmVkIGRhdGEKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGdlbmVyaWNfZmlsZV93cml0ZSgpIHdpdGggaV9zZW0gaGVsZCBvbiB0aGUgaW5vZGUKKyAqIChAcGFnZS0+bWFwcGluZy0+aG9zdCkuICBUaGUgQHBhZ2UgaXMgbG9ja2VkIGJ1dCBub3Qga21hcCgpcGVkLiAgVGhlIHNvdXJjZQorICogZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBpbnRvIHRoZSBAcGFnZS4gIG50ZnNfcHJlcGFyZV93cml0ZSgpIGhhcyBiZWVuCisgKiBjYWxsZWQgYmVmb3JlIHRoZSBkYXRhIGNvcGllZCBhbmQgaXQgcmV0dXJuZWQgc3VjY2VzcyBzbyB3ZSBjYW4gdGFrZSB0aGUKKyAqIHJlc3VsdHMgb2YgdmFyaW91cyBCVUcgY2hlY2tzIGFuZCBzb21lIGVycm9yIGhhbmRsaW5nIGZvciBncmFudGVkLgorICoKKyAqIE5lZWQgdG8gbWFyayBtb2RpZmllZCBibG9ja3MgZGlydHkgc28gdGhleSBnZXQgd3JpdHRlbiBvdXQgbGF0ZXIgd2hlbgorICogbnRmc193cml0ZXBhZ2UoKSBpcyBpbnZva2VkIGJ5IHRoZSBWTS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBTaG91bGQgYmUgdXNpbmcgZ2VuZXJpY19jb21taXRfd3JpdGUoKS4gIFRoaXMgbWFya3MgYnVmZmVycyB1cHRvZGF0ZSBhbmQKKyAqIGRpcnR5LCBzZXRzIHRoZSBwYWdlIHVwdG9kYXRlIGlmIGFsbCBidWZmZXJzIGluIHRoZSBwYWdlIGFyZSB1cHRvZGF0ZSwgYW5kCisgKiB1cGRhdGVzIGlfc2l6ZSBpZiB0aGUgZW5kIG9mIGlvIGlzIGJleW9uZCBpX3NpemUuICBJbiB0aGF0IGNhc2UsIGl0IGFsc28KKyAqIG1hcmtzIHRoZSBpbm9kZSBkaXJ0eS4KKyAqCisgKiBDYW5ub3QgdXNlIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgZHVlIHRvIG50ZnMgc3BlY2lhbGl0aWVzIGJ1dCBjYW4gbG9vayBhdAorICogaXQgZm9yIGltcGxlbWVudGF0aW9uIGd1aWRhbmNlLgorICoKKyAqIElmIHRoaW5ncyBoYXZlIGdvbmUgYXMgb3V0bGluZWQgaW4gbnRmc19wcmVwYXJlX3dyaXRlKCksIHRoZW4gd2UgZG8gbm90CisgKiBuZWVkIHRvIGRvIGFueSBwYWdlIGNvbnRlbnQgbW9kaWZpY2F0aW9ucyBoZXJlIGF0IGFsbCwgZXhjZXB0IGluIHRoZSB3cml0ZQorICogdG8gcmVzaWRlbnQgYXR0cmlidXRlIGNhc2UsIHdoZXJlIHdlIG5lZWQgdG8gZG8gdGhlIHVwdG9kYXRlIGJyaW5naW5nIGhlcmUKKyAqIHdoaWNoIHdlIGNvbWJpbmUgd2l0aCB0aGUgY29weWluZyBpbnRvIHRoZSBtZnQgcmVjb3JkIHdoaWNoIG1lYW5zIHdlIHNhdmUKKyAqIG9uZSBhdG9taWMga21hcC4KKyAqLworc3RhdGljIGludCBudGZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCW50ZnNfaW5vZGUgKmJhc2VfbmksICpuaSA9IE5URlNfSSh2aSk7CisJY2hhciAqa2FkZHIsICprYXR0cjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCU1GVF9SRUNPUkQgKm07CisJQVRUUl9SRUNPUkQgKmE7CisJdTMyIGF0dHJfbGVuOworCWludCBlcnI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgdmktPmlfaW5vLCBuaS0+dHlwZSwKKwkJCXBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJLyogSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgcmVzaWRlbnQsIGRlYWwgd2l0aCBpdCBlbHNld2hlcmUuICovCisJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKKwkJLyogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQvZW5jcnlwdGVkLiAqLworCQlpZiAobmktPnR5cGUgPT0gQVRfREFUQSAmJiAhbmktPm5hbWVfbGVuKSB7CisJCQkvKiBFbmNyeXB0ZWQgZmlsZXMgbmVlZCBzZXBhcmF0ZSBoYW5kbGluZy4gKi8KKwkJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgeworCQkJCS8vIFdlIG5ldmVyIGdldCBoZXJlIGF0IHByZXNlbnQhCisJCQkJQlVHKCk7CisJCQl9CisJCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJCS8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorCQkJCS8vIHJldHVybiBudGZzX3dyaXRlX2NvbXByZXNzZWRfYmxvY2socGFnZSk7CisJCQkJLy8gV2UgbmV2ZXIgZ2V0IGhlcmUgYXQgcHJlc2VudCEKKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCXJldHVybiBudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZShwYWdlLCBmcm9tLCB0byk7CisJfQorCS8qCisJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCwgZW5jcnlwdGVkLCBvcgorCSAqIHNwYXJzZS4KKwkgKi8KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJLyogVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLiAqLworCWF0dHJfbGVuID0gbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCUJVR19PTihmcm9tID4gYXR0cl9sZW4pOworCWthdHRyID0gKHU4KilhICsgbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpOworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCS8qIENvcHkgdGhlIHJlY2VpdmVkIGRhdGEgZnJvbSB0aGUgcGFnZSB0byB0aGUgbWZ0IHJlY29yZC4gKi8KKwltZW1jcHkoa2F0dHIgKyBmcm9tLCBrYWRkciArIGZyb20sIHRvIC0gZnJvbSk7CisJLyogVXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAodG8gPiBhdHRyX2xlbikgeworCQlhdHRyX2xlbiA9IHRvOworCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGF0dHJfbGVuKTsKKwl9CisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgdXB0b2RhdGUsIGJyaW5nIHRoZSBvdXQgb2YgYm91bmRzIGFyZWEocykKKwkgKiB1cHRvZGF0ZSBieSBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgbWZ0IHJlY29yZCB0byB0aGUgcGFnZS4KKwkgKi8KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlpZiAoZnJvbSA+IDApCisJCQltZW1jcHkoa2FkZHIsIGthdHRyLCBmcm9tKTsKKwkJaWYgKHRvIDwgYXR0cl9sZW4pCisJCQltZW1jcHkoa2FkZHIgKyB0bywga2F0dHIgKyB0bywgYXR0cl9sZW4gLSB0byk7CisJCS8qIFplcm8gdGhlIHJlZ2lvbiBvdXRzaWRlIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwkJaWYgKGF0dHJfbGVuIDwgUEFHRV9DQUNIRV9TSVpFKQorCQkJbWVtc2V0KGthZGRyICsgYXR0cl9sZW4sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGF0dHJfbGVuKTsKKwkJLyoKKwkJICogVGhlIHByb2JhYmlsaXR5IG9mIG5vdCBoYXZpbmcgZG9uZSBhbnkgb2YgdGhlIGFib3ZlIGlzCisJCSAqIGV4dHJlbWVseSBzbWFsbCwgc28gd2UganVzdCBmbHVzaCB1bmNvbmRpdGlvbmFsbHkuCisJCSAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJLyogVXBkYXRlIGlfc2l6ZSBpZiBuZWNlc3NhcnkuICovCisJaWYgKHZpLT5pX3NpemUgPCBhdHRyX2xlbikgeworCQluaS0+YWxsb2NhdGVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IGF0dHJfbGVuOworCQlpX3NpemVfd3JpdGUodmksIGF0dHJfbGVuKTsKKwl9CisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBkaXJ0eSwgc28gaXQgZ2V0cyB3cml0dGVuIGJhY2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgcmVxdWlyZWQgdG8gIgorCQkJCSJjb21taXQgdGhlIHdyaXRlLiIpOworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJQYWdlIGlzIHVwdG9kYXRlLCBzZXR0aW5nICIKKwkJCQkJImRpcnR5IHNvIHRoZSB3cml0ZSB3aWxsIGJlIHJldHJpZWQgIgorCQkJCQkibGF0ZXIgb24gYnkgdGhlIFZNLiIpOworCQkJLyoKKwkJCSAqIFB1dCB0aGUgcGFnZSBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0IGxlYXZlIGl0cworCQkJICogYnVmZmVycycgZGlydHkgc3RhdGUgYXMtaXMuCisJCQkgKi8KKwkJCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOworCQkJZXJyID0gMDsKKwkJfSBlbHNlCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUGFnZSBpcyBub3QgdXB0b2RhdGUuICBXcml0dGVuICIKKwkJCQkJImRhdGEgaGFzIGJlZW4gbG9zdC4iKTsKKwl9IGVsc2UgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUmVzaWRlbnQgYXR0cmlidXRlIGNvbW1pdCB3cml0ZSBmYWlsZWQgIgorCQkJCSJ3aXRoIGVycm9yICVpLiIsIGVycik7CisJCU5Wb2xTZXRFcnJvcnMobmktPnZvbCk7CisJCW1ha2VfYmFkX2lub2RlKHZpKTsKKwl9CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmCS8qIE5URlNfUlcgKi8KKworLyoqCisgKiBudGZzX2FvcHMgLSBnZW5lcmFsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgaW5vZGVzIGFuZCBhdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbnRmc19hb3BzID0geworCS5yZWFkcGFnZQk9IG50ZnNfcmVhZHBhZ2UsCS8qIEZpbGwgcGFnZSB3aXRoIGRhdGEuICovCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwJLyogQ3VycmVudGx5LCBqdXN0IHVucGx1Z3MgdGhlCisJCQkJCQkgICBkaXNrIHJlcXVlc3QgcXVldWUuICovCisjaWZkZWYgTlRGU19SVworCS53cml0ZXBhZ2UJPSBudGZzX3dyaXRlcGFnZSwJLyogV3JpdGUgZGlydHkgcGFnZSB0byBkaXNrLiAqLworCS5wcmVwYXJlX3dyaXRlCT0gbnRmc19wcmVwYXJlX3dyaXRlLAkvKiBQcmVwYXJlIHBhZ2UgYW5kIGJ1ZmZlcnMKKwkJCQkJCSAgIHJlYWR5IHRvIHJlY2VpdmUgZGF0YS4gKi8KKwkuY29tbWl0X3dyaXRlCT0gbnRmc19jb21taXRfd3JpdGUsCS8qIENvbW1pdCByZWNlaXZlZCBkYXRhLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KK307CisKKy8qKgorICogbnRmc19tc3RfYW9wcyAtIGdlbmVyYWwgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGZvciBtc3QgcHJvdGVjdGVlZCBpbm9kZXMKKyAqCQkgICBhbmQgYXR0cmlidXRlcworICovCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG50ZnNfbXN0X2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gbnRmc19yZWFkcGFnZSwJLyogRmlsbCBwYWdlIHdpdGggZGF0YS4gKi8KKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAkvKiBDdXJyZW50bHksIGp1c3QgdW5wbHVncyB0aGUKKwkJCQkJCSAgIGRpc2sgcmVxdWVzdCBxdWV1ZS4gKi8KKyNpZmRlZiBOVEZTX1JXCisJLndyaXRlcGFnZQk9IG50ZnNfd3JpdGVwYWdlLAkvKiBXcml0ZSBkaXJ0eSBwYWdlIHRvIGRpc2suICovCisJLnNldF9wYWdlX2RpcnR5CT0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCS8qIFNldCB0aGUgcGFnZSBkaXJ0eQorCQkJCQkJICAgd2l0aG91dCB0b3VjaGluZyB0aGUgYnVmZmVycworCQkJCQkJICAgYmVsb25naW5nIHRvIHRoZSBwYWdlLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KK307CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbWFya19udGZzX3JlY29yZF9kaXJ0eSAtIG1hcmsgYW4gbnRmcyByZWNvcmQgZGlydHkKKyAqIEBwYWdlOglwYWdlIGNvbnRhaW5pbmcgdGhlIG50ZnMgcmVjb3JkIHRvIG1hcmsgZGlydHkKKyAqIEBvZnM6CWJ5dGUgb2Zmc2V0IHdpdGhpbiBAcGFnZSBhdCB3aGljaCB0aGUgbnRmcyByZWNvcmQgYmVnaW5zCisgKgorICogU2V0IHRoZSBidWZmZXJzIGFuZCB0aGUgcGFnZSBpbiB3aGljaCB0aGUgbnRmcyByZWNvcmQgaXMgbG9jYXRlZCBkaXJ0eS4KKyAqCisgKiBUaGUgbGF0dGVyIGFsc28gbWFya3MgdGhlIHZmcyBpbm9kZSB0aGUgbnRmcyByZWNvcmQgYmVsb25ncyB0byBkaXJ0eQorICogKElfRElSVFlfUEFHRVMgb25seSkuCisgKgorICogSWYgdGhlIHBhZ2UgZG9lcyBub3QgaGF2ZSBidWZmZXJzLCB3ZSBjcmVhdGUgdGhlbSBhbmQgc2V0IHRoZW0gdXB0b2RhdGUuCisgKiBUaGUgcGFnZSBtYXkgbm90IGJlIGxvY2tlZCB3aGljaCBpcyB3aHkgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGJ1ZmZlcnMgdW5kZXIKKyAqIHRoZSBtYXBwaW5nLT5wcml2YXRlX2xvY2suICBPbmNlIHRoZSBidWZmZXJzIGFyZSBtYXJrZWQgZGlydHkgd2Ugbm8gbG9uZ2VyCisgKiBuZWVkIHRoZSBsb2NrIHNpbmNlIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBkb2VzIG5vdCBmcmVlIGRpcnR5IGJ1ZmZlcnMuCisgKi8KK3ZvaWQgbWFya19udGZzX3JlY29yZF9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSwgY29uc3QgdW5zaWduZWQgaW50IG9mcykgeworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShtYXBwaW5nLT5ob3N0KTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKmJ1ZmZlcnNfdG9fZnJlZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGVuZCwgYmhfc2l6ZSwgYmhfb2ZzOworCisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCWVuZCA9IG9mcyArIG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCWJoX3NpemUgPSAxIDw8IFZGU19JKG5pKS0+aV9ibGtiaXRzOworCXNwaW5fbG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwlpZiAodW5saWtlbHkoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpKSB7CisJCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworCQliaCA9IGhlYWQgPSBhbGxvY19wYWdlX2J1ZmZlcnMocGFnZSwgYmhfc2l6ZSwgMSk7CisJCXNwaW5fbG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJaWYgKGxpa2VseSghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGFpbDsKKworCQkJZG8geworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJCXRhaWwgPSBiaDsKKwkJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJCX0gd2hpbGUgKGJoKTsKKwkJCXRhaWwtPmJfdGhpc19wYWdlID0gaGVhZDsKKwkJCWF0dGFjaF9wYWdlX2J1ZmZlcnMocGFnZSwgaGVhZCk7CisJCX0gZWxzZQorCQkJYnVmZmVyc190b19mcmVlID0gYmg7CisJfQorCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlkbyB7CisJCWJoX29mcyA9IGJoX29mZnNldChiaCk7CisJCWlmIChiaF9vZnMgKyBiaF9zaXplIDw9IG9mcykKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYmhfb2ZzID49IGVuZCkpCisJCQlicmVhazsKKwkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKKwlpZiAodW5saWtlbHkoYnVmZmVyc190b19mcmVlKSkgeworCQlkbyB7CisJCQliaCA9IGJ1ZmZlcnNfdG9fZnJlZS0+Yl90aGlzX3BhZ2U7CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJ1ZmZlcnNfdG9fZnJlZSk7CisJCQlidWZmZXJzX3RvX2ZyZWUgPSBiaDsKKwkJfSB3aGlsZSAoYnVmZmVyc190b19mcmVlKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2FvcHMuaCBiL2ZzL250ZnMvYW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzRlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2FvcHMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoqCisgKiBhb3BzLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgYW5kIHBhZ2UgY2FjaGUKKyAqCSAgICBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfQU9QU19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0FPUFNfSAorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJpbm9kZS5oIgorCisvKioKKyAqIG50ZnNfdW5tYXBfcGFnZSAtIHJlbGVhc2UgYSBwYWdlIHRoYXQgd2FzIG1hcHBlZCB1c2luZyBudGZzX21hcF9wYWdlKCkKKyAqIEBwYWdlOgl0aGUgcGFnZSB0byByZWxlYXNlCisgKgorICogVW5waW4sIHVubWFwIGFuZCByZWxlYXNlIGEgcGFnZSB0aGF0IHdhcyBvYnRhaW5lZCBmcm9tIG50ZnNfbWFwX3BhZ2UoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfdW5tYXBfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCisvKioKKyAqIG50ZnNfbWFwX3BhZ2UgLSBtYXAgYSBwYWdlIGludG8gYWNjZXNzaWJsZSBtZW1vcnksIHJlYWRpbmcgaXQgaWYgbmVjZXNzYXJ5CisgKiBAbWFwcGluZzoJYWRkcmVzcyBzcGFjZSBmb3Igd2hpY2ggdG8gb2J0YWluIHRoZSBwYWdlCisgKiBAaW5kZXg6CWluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgZm9yIEBtYXBwaW5nIG9mIHRoZSBwYWdlIHRvIG1hcAorICoKKyAqIFJlYWQgYSBwYWdlIGZyb20gdGhlIHBhZ2UgY2FjaGUgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgQG1hcHBpbmcgYXQgcG9zaXRpb24KKyAqIEBpbmRleCwgd2hlcmUgQGluZGV4IGlzIGluIHVuaXRzIG9mIFBBR0VfQ0FDSEVfU0laRSwgYW5kIG5vdCBpbiBieXRlcy4KKyAqCisgKiBJZiB0aGUgcGFnZSBpcyBub3QgaW4gbWVtb3J5IGl0IGlzIGxvYWRlZCBmcm9tIGRpc2sgZmlyc3QgdXNpbmcgdGhlIHJlYWRwYWdlCisgKiBtZXRob2QgZGVmaW5lZCBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIG9mIEBtYXBwaW5nIGFuZCB0aGUgcGFnZSBpcworICogYWRkZWQgdG8gdGhlIHBhZ2UgY2FjaGUgb2YgQG1hcHBpbmcgaW4gdGhlIHByb2Nlc3MuCisgKgorICogSWYgdGhlIHBhZ2UgYmVsb25ncyB0byBhbiBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZSBhbmQgaXQgaXMgbWFya2VkIGFzIHN1Y2gKKyAqIGluIGl0cyBudGZzIGlub2RlIChOSW5vTXN0UHJvdGVjdGVkKCkpIHRoZSBtc3QgZml4dXBzIGFyZSBhcHBsaWVkIGJ1dCBubworICogZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiAgVGhpcyBtZWFucyB0aGUgY2FsbGVyIGhhcyB0byB2ZXJpZnkgd2hldGhlcgorICogdGhlIG50ZnMgcmVjb3JkKHMpIGNvbnRhaW5lZCBpbiB0aGUgcGFnZSBhcmUgdmFsaWQgb3Igbm90IHVzaW5nIG9uZSBvZiB0aGUKKyAqIG50ZnNfaXNfWFhYWF9yZWNvcmR7LHB9KCkgbWFjcm9zLCB3aGVyZSBYWFhYIGlzIHRoZSByZWNvcmQgdHlwZSB5b3UgYXJlCisgKiBleHBlY3RpbmcgdG8gc2VlLiAgKEZvciBkZXRhaWxzIG9mIHRoZSBtYWNyb3MsIHNlZSBmcy9udGZzL2xheW91dC5oLikKKyAqCisgKiBJZiB0aGUgcGFnZSBpcyBpbiBoaWdoIG1lbW9yeSBpdCBpcyBtYXBwZWQgaW50byBtZW1vcnkgZGlyZWN0bHkgYWRkcmVzc2libGUKKyAqIGJ5IHRoZSBrZXJuZWwuCisgKgorICogRmluYWxseSB0aGUgcGFnZSBjb3VudCBpcyBpbmNyZW1lbnRlZCwgdGh1cyBwaW5uaW5nIHRoZSBwYWdlIGludG8gcGxhY2UuCisgKgorICogVGhlIGFib3ZlIG1lYW5zIHRoYXQgcGFnZV9hZGRyZXNzKHBhZ2UpIGNhbiBiZSB1c2VkIG9uIGFsbCBwYWdlcyBvYnRhaW5lZAorICogd2l0aCBudGZzX21hcF9wYWdlKCkgdG8gZ2V0IHRoZSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwYWdlLgorICoKKyAqIFdoZW4gZmluaXNoZWQgd2l0aCB0aGUgcGFnZSwgdGhlIGNhbGxlciBoYXMgdG8gY2FsbCBudGZzX3VubWFwX3BhZ2UoKSB0bworICogdW5waW4sIHVubWFwIGFuZCByZWxlYXNlIHRoZSBwYWdlLgorICoKKyAqIE5vdGUgdGhpcyBkb2VzIG5vdCBncmFudCBleGNsdXNpdmUgYWNjZXNzLiBJZiBzdWNoIGlzIGRlc2lyZWQsIHRoZSBjYWxsZXIKKyAqIG11c3QgcHJvdmlkZSBpdCBpbmRlcGVuZGVudGx5IG9mIHRoZSBudGZzX3t1bn1tYXBfcGFnZSgpIGNhbGxzIGJ5IHVzaW5nCisgKiBhIHtyd199c2VtYXBob3JlIG9yIG90aGVyIG1lYW5zIG9mIHNlcmlhbGl6YXRpb24uIEEgc3BpbiBsb2NrIGNhbm5vdCBiZQorICogdXNlZCBhcyBudGZzX21hcF9wYWdlKCkgY2FuIGJsb2NrLgorICoKKyAqIFRoZSB1bmxvY2tlZCBhbmQgdXB0b2RhdGUgcGFnZSBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIG9yIGFuIGVuY29kZWQgZXJyb3IKKyAqIG9uIGZhaWx1cmUuIENhbGxlciBoYXMgdG8gdGVzdCBmb3IgZXJyb3IgdXNpbmcgdGhlIElTX0VSUigpIG1hY3JvIG9uIHRoZQorICogcmV0dXJuIHZhbHVlLiBJZiB0aGF0IGV2YWx1YXRlcyB0byBUUlVFLCB0aGUgbmVnYXRpdmUgZXJyb3IgY29kZSBjYW4gYmUKKyAqIG9idGFpbmVkIHVzaW5nIFBUUl9FUlIoKSBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIG50ZnNfbWFwX3BhZ2UoKS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqbnRmc19tYXBfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwKKwkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKworCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCWttYXAocGFnZSk7CisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkgJiYgIVBhZ2VFcnJvcihwYWdlKSkKKwkJCXJldHVybiBwYWdlOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwlyZXR1cm4gcGFnZTsKK30KKworI2lmZGVmIE5URlNfUlcKKworZXh0ZXJuIHZvaWQgbWFya19udGZzX3JlY29yZF9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSwgY29uc3QgdW5zaWduZWQgaW50IG9mcyk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19BT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmMgYi9mcy9udGZzL2F0dHJpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjdmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2F0dHJpYi5jCkBAIC0wLDAgKzEsMTI1OCBAQAorLyoqCisgKiBhdHRyaWIuYyAtIE5URlMgYXR0cmlidXRlIG9wZXJhdGlvbnMuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAibnRmcy5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisKKy8qKgorICogbnRmc19tYXBfcnVubGlzdCAtIG1hcCAoYSBwYXJ0IG9mKSBhIHJ1bmxpc3Qgb2YgYW4gbnRmcyBpbm9kZQorICogQG5pOgkJbnRmcyBpbm9kZSBmb3Igd2hpY2ggdG8gbWFwIChwYXJ0IG9mKSBhIHJ1bmxpc3QKKyAqIEB2Y246CW1hcCBydW5saXN0IHBhcnQgY29udGFpbmluZyB0aGlzIHZjbgorICoKKyAqIE1hcCB0aGUgcGFydCBvZiBhIHJ1bmxpc3QgY29udGFpbmluZyB0aGUgQHZjbiBvZiB0aGUgbnRmcyBpbm9kZSBAbmkuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeSBhbmQgaXMgdW5sb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbG9jayBmb3Igd3JpdGluZyBhbmQgbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCisgKi8KK2ludCBudGZzX21hcF9ydW5saXN0KG50ZnNfaW5vZGUgKm5pLCBWQ04gdmNuKQoreworCW50ZnNfaW5vZGUgKmJhc2Vfbmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptcmVjOworCWludCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiTWFwcGluZyBydW5saXN0IHBhcnQgY29udGFpbmluZyB2Y24gMHglbGx4LiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbik7CisKKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKworCW1yZWMgPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG1yZWMpKQorCQlyZXR1cm4gUFRSX0VSUihtcmVjKTsKKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCB2Y24sIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gcHV0X2Vycl9vdXQ7CisKKwlkb3duX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkvKiBNYWtlIHN1cmUgc29tZW9uZSBlbHNlIGRpZG4ndCBkbyB0aGUgd29yayB3aGlsZSB3ZSB3ZXJlIHNsZWVwaW5nLiAqLworCWlmIChsaWtlbHkobnRmc19ybF92Y25fdG9fbGNuKG5pLT5ydW5saXN0LnJsLCB2Y24pIDw9CisJCQlMQ05fUkxfTk9UX01BUFBFRCkpIHsKKwkJcnVubGlzdF9lbGVtZW50ICpybDsKKworCQlybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKG5pLT52b2wsIGN0eC0+YXR0ciwKKwkJCQluaS0+cnVubGlzdC5ybCk7CisJCWlmIChJU19FUlIocmwpKQorCQkJZXJyID0gUFRSX0VSUihybCk7CisJCWVsc2UKKwkJCW5pLT5ydW5saXN0LnJsID0gcmw7CisJfQorCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKworcHV0X2Vycl9vdXQ6CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CitlcnJfb3V0OgorCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX2ZpbmRfdmNuIC0gZmluZCBhIHZjbiBpbiB0aGUgcnVubGlzdCBkZXNjcmliZWQgYnkgYW4gbnRmcyBpbm9kZQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBydW5saXN0IHRvIHNlYXJjaAorICogQHZjbjoJdmNuIHRvIGZpbmQKKyAqIEBuZWVkX3dyaXRlOglpZiBmYWxzZSwgbG9jayBmb3IgcmVhZGluZyBhbmQgaWYgdHJ1ZSwgbG9jayBmb3Igd3JpdGluZworICoKKyAqIEZpbmQgdGhlIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgQHZjbiBpbiB0aGUgcnVubGlzdCBkZXNjcmliZWQgYnkgdGhlIG50ZnMKKyAqIGlub2RlIEBuaSBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyB0aGUgQHZjbi4KKyAqIFRoZSBydW5saXN0IGlzIGxlZnQgbG9ja2VkIGFuZCB0aGUgY2FsbGVyIGhhcyB0byB1bmxvY2sgaXQuICBJZiBAbmVlZF93cml0ZQorICogaXMgdHJ1ZSwgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciB3cml0aW5nIGFuZCBpZiBAbmVlZF93cml0ZSBpcyBmYWxzZSwgdGhlCisgKiBydW5saXN0IGlzIGxvY2tlZCBmb3IgcmVhZGluZy4gIEluIHRoZSBlcnJvciBjYXNlLCB0aGUgcnVubGlzdCBpcyBub3QgbGVmdAorICogbG9ja2VkLgorICoKKyAqIE5vdGUgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgbGNuIG9mIHRoZSByZXR1cm5lZCBydW5saXN0IGVsZW1lbnQKKyAqIGJlaW5nID49IDAgYW5kIExDTl9IT0xFLiAgSW4gdGhlIGxhdGVyIGNhc2UgeW91IGhhdmUgdG8gcmV0dXJuIHplcm9lcyBvbgorICogcmVhZCBhbmQgYWxsb2NhdGUgY2x1c3RlcnMgb24gd3JpdGUuCisgKgorICogUmV0dXJuIHRoZSBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyB0aGUgQHZjbiBvbiBzdWNjZXNzIGFuZAorICogRVJSX1BUUigtZXJybm8pIG9uIGVycm9yLiAgWW91IG5lZWQgdG8gdGVzdCB0aGUgcmV0dXJuIHZhbHVlIHdpdGggSVNfRVJSKCkKKyAqIHRvIGRlY2lkZSBpZiB0aGUgcmV0dXJuIGlzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhbmQgUFRSX0VSUigpIHRvIGdldCB0byB0aGUKKyAqIGVycm9yIGNvZGUgaWYgSVNfRVJSKCkgaXMgdHJ1ZS4KKyAqCisgKiBUaGUgcG9zc2libGUgZXJyb3IgcmV0dXJuIGNvZGVzIGFyZToKKyAqCS1FTk9FTlQgLSBObyBzdWNoIHZjbiBpbiB0aGUgcnVubGlzdCwgaS5lLiBAdmNuIGlzIG91dCBvZiBib3VuZHMuCisgKgktRU5PTUVNIC0gTm90IGVub3VnaCBtZW1vcnkgdG8gbWFwIHJ1bmxpc3QuCisgKgktRUlPCS0gQ3JpdGljYWwgZXJyb3IgKHJ1bmxpc3QvZmlsZSBpcyBjb3JydXB0LCBpL28gZXJyb3IsIGV0YykuCisgKgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5LgorICoJICAgIC0gT24gZmFpbGluZyByZXR1cm4sIHRoZSBydW5saXN0IGlzIHVubG9ja2VkLgorICoJICAgIC0gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBydW5saXN0IGlzIGxvY2tlZC4gIElmIEBuZWVkX3dyaXRlIHVzCisgKgkgICAgICB0cnVlLCBpdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcuICBPdGhlcndpc2UgaXMgaXMgbG9ja2VkIGZvcgorICoJICAgICAgcmVhZGluZy4KKyAqLworcnVubGlzdF9lbGVtZW50ICpudGZzX2ZpbmRfdmNuKG50ZnNfaW5vZGUgKm5pLCBjb25zdCBWQ04gdmNuLAorCQljb25zdCBCT09MIG5lZWRfd3JpdGUpCit7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlpbnQgZXJyID0gMDsKKwlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHZjbiAweCVsbHgsIGxvY2sgZm9yICVzaW5nLiIsCisJCQluaS0+bWZ0X25vLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCSFuZWVkX3dyaXRlID8gInJlYWQiIDogIndyaXQiKTsKKwlCVUdfT04oIW5pKTsKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCUJVR19PTih2Y24gPCAwKTsKK2xvY2tfcmV0cnlfcmVtYXA6CisJaWYgKCFuZWVkX3dyaXRlKQorCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCWVsc2UKKwkJZG93bl93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJcmwgPSBuaS0+cnVubGlzdC5ybDsKKwlpZiAobGlrZWx5KHJsICYmIHZjbiA+PSBybFswXS52Y24pKSB7CisJCXdoaWxlIChsaWtlbHkocmwtPmxlbmd0aCkpIHsKKwkJCWlmIChsaWtlbHkodmNuIDwgcmxbMV0udmNuKSkgeworCQkJCWlmIChsaWtlbHkocmwtPmxjbiA+PSBMQ05fSE9MRSkpIHsKKwkJCQkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJCQkJcmV0dXJuIHJsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCXJsKys7CisJCX0KKwkJaWYgKGxpa2VseShybC0+bGNuICE9IExDTl9STF9OT1RfTUFQUEVEKSkgeworCQkJaWYgKGxpa2VseShybC0+bGNuID09IExDTl9FTk9FTlQpKQorCQkJCWVyciA9IC1FTk9FTlQ7CisJCQllbHNlCisJCQkJZXJyID0gLUVJTzsKKwkJfQorCX0KKwlpZiAoIW5lZWRfd3JpdGUpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCWVsc2UKKwkJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCWlmICghZXJyICYmICFpc19yZXRyeSkgeworCQkvKgorCQkgKiBUaGUgQHZjbiBpcyBpbiBhbiB1bm1hcHBlZCByZWdpb24sIG1hcCB0aGUgcnVubGlzdCBhbmQKKwkJICogcmV0cnkuCisJCSAqLworCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQlpZiAobGlrZWx5KCFlcnIpKSB7CisJCQlpc19yZXRyeSA9IFRSVUU7CisJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCX0KKwkJLyoKKwkJICogLUVJTlZBTCBhbmQgLUVOT0VOVCBjb21pbmcgZnJvbSBhIGZhaWxlZCBtYXBwaW5nIGF0dGVtcHQgYXJlCisJCSAqIGVxdWl2YWxlbnQgdG8gaS9vIGVycm9ycyBmb3IgdXMgYXMgdGhleSBzaG91bGQgbm90IGhhcHBlbiBpbgorCQkgKiBvdXIgY29kZSBwYXRocy4KKwkJICovCisJCWlmIChlcnIgPT0gLUVJTlZBTCB8fCBlcnIgPT0gLUVOT0VOVCkKKwkJCWVyciA9IC1FSU87CisJfSBlbHNlIGlmICghZXJyKQorCQllcnIgPSAtRUlPOworCW50ZnNfZXJyb3IobmktPnZvbC0+c2IsICJGYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpLiIsIGVycik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiBudGZzX2F0dHJfZmluZCAtIGZpbmQgKG5leHQpIGF0dHJpYnV0ZSBpbiBtZnQgcmVjb3JkCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgdG8gZmluZAorICogQG5hbWU6CWF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQgKG9wdGlvbmFsLCBpLmUuIE5VTEwgbWVhbnMgZG9uJ3QgY2FyZSkKKyAqIEBuYW1lX2xlbjoJYXR0cmlidXRlIG5hbWUgbGVuZ3RoIChvbmx5IG5lZWRlZCBpZiBAbmFtZSBwcmVzZW50KQorICogQGljOgkJSUdOT1JFX0NBU0Ugb3IgQ0FTRV9TRU5TSVRJVkUgKGlnbm9yZWQgaWYgQG5hbWUgbm90IHByZXNlbnQpCisgKiBAdmFsOglhdHRyaWJ1dGUgdmFsdWUgdG8gZmluZCAob3B0aW9uYWwsIHJlc2lkZW50IGF0dHJpYnV0ZXMgb25seSkKKyAqIEB2YWxfbGVuOglhdHRyaWJ1dGUgdmFsdWUgbGVuZ3RoCisgKiBAY3R4OglzZWFyY2ggY29udGV4dCB3aXRoIG1mdCByZWNvcmQgYW5kIGF0dHJpYnV0ZSB0byBzZWFyY2ggZnJvbQorICoKKyAqIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LiAgVXNlIG50ZnNfYXR0cl9sb29rdXAoKQorICogaW5zdGVhZC4KKyAqCisgKiBudGZzX2F0dHJfZmluZCgpIHRha2VzIGEgc2VhcmNoIGNvbnRleHQgQGN0eCBhcyBwYXJhbWV0ZXIgYW5kIHNlYXJjaGVzIHRoZQorICogbWZ0IHJlY29yZCBzcGVjaWZpZWQgYnkgQGN0eC0+bXJlYywgYmVnaW5uaW5nIGF0IEBjdHgtPmF0dHIsIGZvciBhbgorICogYXR0cmlidXRlIG9mIEB0eXBlLCBvcHRpb25hbGx5IEBuYW1lIGFuZCBAdmFsLgorICoKKyAqIElmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQsIG50ZnNfYXR0cl9maW5kKCkgcmV0dXJucyAwIGFuZCBAY3R4LT5hdHRyIHdpbGwKKyAqIHBvaW50IHRvIHRoZSBmb3VuZCBhdHRyaWJ1dGUuCisgKgorICogSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIG50ZnNfYXR0cl9maW5kKCkgcmV0dXJucyAtRU5PRU5UIGFuZAorICogQGN0eC0+YXR0ciB3aWxsIHBvaW50IHRvIHRoZSBhdHRyaWJ1dGUgYmVmb3JlIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVpbmcKKyAqIHNlYXJjaGVkIGZvciB3b3VsZCBuZWVkIHRvIGJlIGluc2VydGVkIGlmIHN1Y2ggYW4gYWN0aW9uIHdlcmUgdG8gYmUgZGVzaXJlZC4KKyAqCisgKiBPbiBhY3R1YWwgZXJyb3IsIG50ZnNfYXR0cl9maW5kKCkgcmV0dXJucyAtRUlPLiAgSW4gdGhpcyBjYXNlIEBjdHgtPmF0dHIgaXMKKyAqIHVuZGVmaW5lZCBhbmQgaW4gcGFydGljdWxhciBkbyBub3QgcmVseSBvbiBpdCBub3QgY2hhbmdpbmcuCisgKgorICogSWYgQGN0eC0+aXNfZmlyc3QgaXMgVFJVRSwgdGhlIHNlYXJjaCBiZWdpbnMgd2l0aCBAY3R4LT5hdHRyIGl0c2VsZi4gIElmIGl0CisgKiBpcyBGQUxTRSwgdGhlIHNlYXJjaCBiZWdpbnMgYWZ0ZXIgQGN0eC0+YXR0ci4KKyAqCisgKiBJZiBAaWMgaXMgSUdOT1JFX0NBU0UsIHRoZSBAbmFtZSBjb21wYXJpc3NvbiBpcyBub3QgY2FzZSBzZW5zaXRpdmUgYW5kCisgKiBAY3R4LT5udGZzX2lubyBtdXN0IGJlIHNldCB0byB0aGUgbnRmcyBpbm9kZSB0byB3aGljaCB0aGUgbWZ0IHJlY29yZAorICogQGN0eC0+bXJlYyBiZWxvbmdzLiAgVGhpcyBpcyBzbyB3ZSBjYW4gZ2V0IGF0IHRoZSBudGZzIHZvbHVtZSBhbmQgaGVuY2UgYXQKKyAqIHRoZSB1cGNhc2UgdGFibGUuICBJZiBAaWMgaXMgQ0FTRV9TRU5TSVRJVkUsIHRoZSBjb21wYXJpc29uIGlzIGNhc2UKKyAqIHNlbnNpdGl2ZS4gIFdoZW4gQG5hbWUgaXMgcHJlc2VudCwgQG5hbWVfbGVuIGlzIHRoZSBAbmFtZSBsZW5ndGggaW4gVW5pY29kZQorICogY2hhcmFjdGVycy4KKyAqCisgKiBJZiBAbmFtZSBpcyBub3QgcHJlc2VudCAoTlVMTCksIHdlIGFzc3VtZSB0aGF0IHRoZSB1bm5hbWVkIGF0dHJpYnV0ZSBpcworICogYmVpbmcgc2VhcmNoZWQgZm9yLgorICoKKyAqIEZpbmFsbHksIHRoZSByZXNpZGVudCBhdHRyaWJ1dGUgdmFsdWUgQHZhbCBpcyBsb29rZWQgZm9yLCBpZiBwcmVzZW50LiAgSWYKKyAqIEB2YWwgaXMgbm90IHByZXNlbnQgKE5VTEwpLCBAdmFsX2xlbiBpcyBpZ25vcmVkLgorICoKKyAqIG50ZnNfYXR0cl9maW5kKCkgb25seSBzZWFyY2hlcyB0aGUgc3BlY2lmaWVkIG1mdCByZWNvcmQgYW5kIGl0IGlnbm9yZXMgdGhlCisgKiBwcmVzZW5jZSBvZiBhbiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgKHVubGVzcyBpdCBpcyB0aGUgb25lIGJlaW5nIHNlYXJjaGVkCisgKiBmb3IsIG9idmlvdXNseSkuICBJZiB5b3UgbmVlZCB0byB0YWtlIGF0dHJpYnV0ZSBsaXN0cyBpbnRvIGNvbnNpZGVyYXRpb24sCisgKiB1c2UgbnRmc19hdHRyX2xvb2t1cCgpIGluc3RlYWQgKHNlZSBiZWxvdykuICBUaGlzIGFsc28gbWVhbnMgdGhhdCB5b3UgY2Fubm90CisgKiB1c2UgbnRmc19hdHRyX2ZpbmQoKSB0byBzZWFyY2ggZm9yIGV4dGVudCByZWNvcmRzIG9mIG5vbi1yZXNpZGVudAorICogYXR0cmlidXRlcywgYXMgZXh0ZW50cyB3aXRoIGxvd2VzdF92Y24gIT0gMCBhcmUgdXN1YWxseSBkZXNjcmliZWQgYnkgdGhlCisgKiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgb25seS4gLSBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZmlyc3QKKyAqIGV4dGVudCBpcyBvbmx5IGluIHRoZSBhdHRyaWJ1dGUgbGlzdCB3aGlsZSB0aGUgbGFzdCBleHRlbnQgaXMgaW4gdGhlIGJhc2UKKyAqIG1mdCByZWNvcmQsIHNvIGRvIG5vdCByZWx5IG9uIGJlaW5nIGFibGUgdG8gZmluZCB0aGUgZmlyc3QgZXh0ZW50IGluIHRoZQorICogYmFzZSBtZnQgcmVjb3JkLgorICoKKyAqIFdhcm5pbmc6IE5ldmVyIHVzZSBAdmFsIHdoZW4gbG9va2luZyBmb3IgYXR0cmlidXRlIHR5cGVzIHdoaWNoIGNhbiBiZQorICoJICAgIG5vbi1yZXNpZGVudCBhcyB0aGlzIG1vc3QgbGlrZWx5IHdpbGwgcmVzdWx0IGluIGEgY3Jhc2ghCisgKi8KK3N0YXRpYyBpbnQgbnRmc19hdHRyX2ZpbmQoY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IG50ZnNjaGFyICpuYW1lLAorCQljb25zdCB1MzIgbmFtZV9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IHU4ICp2YWwsIGNvbnN0IHUzMiB2YWxfbGVuLCBudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KQoreworCUFUVFJfUkVDT1JEICphOworCW50ZnNfdm9sdW1lICp2b2wgPSBjdHgtPm50ZnNfaW5vLT52b2w7CisJbnRmc2NoYXIgKnVwY2FzZSA9IHZvbC0+dXBjYXNlOworCXUzMiB1cGNhc2VfbGVuID0gdm9sLT51cGNhc2VfbGVuOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgYXR0cmlidXRlcyBpbiBtZnQgcmVjb3JkIHN0YXJ0aW5nIGF0IEBjdHgtPmF0dHIsIG9yIHRoZQorCSAqIGF0dHJpYnV0ZSBmb2xsb3dpbmcgdGhhdCwgaWYgQGN0eC0+aXNfZmlyc3QgaXMgVFJVRS4KKwkgKi8KKwlpZiAoY3R4LT5pc19maXJzdCkgeworCQlhID0gY3R4LT5hdHRyOworCQljdHgtPmlzX2ZpcnN0ID0gRkFMU0U7CisJfSBlbHNlCisJCWEgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWN0eC0+YXR0ciArCisJCQkJbGUzMl90b19jcHUoY3R4LT5hdHRyLT5sZW5ndGgpKTsKKwlmb3IgKDs7CWEgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWEgKyBsZTMyX3RvX2NwdShhLT5sZW5ndGgpKSkgeworCQlpZiAoKHU4KilhIDwgKHU4KiljdHgtPm1yZWMgfHwgKHU4KilhID4gKHU4KiljdHgtPm1yZWMgKworCQkJCWxlMzJfdG9fY3B1KGN0eC0+bXJlYy0+Ynl0ZXNfYWxsb2NhdGVkKSkKKwkJCWJyZWFrOworCQljdHgtPmF0dHIgPSBhOworCQlpZiAodW5saWtlbHkobGUzMl90b19jcHUoYS0+dHlwZSkgPiBsZTMyX3RvX2NwdSh0eXBlKSB8fAorCQkJCWEtPnR5cGUgPT0gQVRfRU5EKSkKKwkJCXJldHVybiAtRU5PRU5UOworCQlpZiAodW5saWtlbHkoIWEtPmxlbmd0aCkpCisJCQlicmVhazsKKwkJaWYgKGEtPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiBAbmFtZSBpcyBwcmVzZW50LCBjb21wYXJlIHRoZSB0d28gbmFtZXMuICBJZiBAbmFtZSBpcworCQkgKiBtaXNzaW5nLCBhc3N1bWUgd2Ugd2FudCBhbiB1bm5hbWVkIGF0dHJpYnV0ZS4KKwkJICovCisJCWlmICghbmFtZSkgeworCQkJLyogVGhlIHNlYXJjaCBmYWlsZWQgaWYgdGhlIGZvdW5kIGF0dHJpYnV0ZSBpcyBuYW1lZC4gKi8KKwkJCWlmIChhLT5uYW1lX2xlbmd0aCkKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfSBlbHNlIGlmICghbnRmc19hcmVfbmFtZXNfZXF1YWwobmFtZSwgbmFtZV9sZW4sCisJCQkgICAgKG50ZnNjaGFyKikoKHU4KilhICsgbGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpKSwKKwkJCSAgICBhLT5uYW1lX2xlbmd0aCwgaWMsIHVwY2FzZSwgdXBjYXNlX2xlbikpIHsKKwkJCXJlZ2lzdGVyIGludCByYzsKKworCQkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXMobmFtZSwgbmFtZV9sZW4sCisJCQkJCShudGZzY2hhciopKCh1OCopYSArCisJCQkJCWxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSksCisJCQkJCWEtPm5hbWVfbGVuZ3RoLCAxLCBJR05PUkVfQ0FTRSwKKwkJCQkJdXBjYXNlLCB1cGNhc2VfbGVuKTsKKwkJCS8qCisJCQkgKiBJZiBAbmFtZSBjb2xsYXRlcyBiZWZvcmUgYS0+bmFtZSwgdGhlcmUgaXMgbm8KKwkJCSAqIG1hdGNoaW5nIGF0dHJpYnV0ZS4KKwkJCSAqLworCQkJaWYgKHJjID09IC0xKQorCQkJCXJldHVybiAtRU5PRU5UOworCQkJLyogSWYgdGhlIHN0cmluZ3MgYXJlIG5vdCBlcXVhbCwgY29udGludWUgc2VhcmNoLiAqLworCQkJaWYgKHJjKQorCQkJCWNvbnRpbnVlOworCQkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXMobmFtZSwgbmFtZV9sZW4sCisJCQkJCShudGZzY2hhciopKCh1OCopYSArCisJCQkJCWxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSksCisJCQkJCWEtPm5hbWVfbGVuZ3RoLCAxLCBDQVNFX1NFTlNJVElWRSwKKwkJCQkJdXBjYXNlLCB1cGNhc2VfbGVuKTsKKwkJCWlmIChyYyA9PSAtMSkKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCWlmIChyYykKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgbmFtZXMgbWF0Y2ggb3IgQG5hbWUgbm90IHByZXNlbnQgYW5kIGF0dHJpYnV0ZSBpcworCQkgKiB1bm5hbWVkLiAgSWYgbm8gQHZhbCBzcGVjaWZpZWQsIHdlIGhhdmUgZm91bmQgdGhlIGF0dHJpYnV0ZQorCQkgKiBhbmQgYXJlIGRvbmUuCisJCSAqLworCQlpZiAoIXZhbCkKKwkJCXJldHVybiAwOworCQkvKiBAdmFsIGlzIHByZXNlbnQ7IGNvbXBhcmUgdmFsdWVzLiAqLworCQllbHNlIHsKKwkJCXJlZ2lzdGVyIGludCByYzsKKworCQkJcmMgPSBtZW1jbXAodmFsLCAodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJCQltaW5fdCh1MzIsIHZhbF9sZW4sIGxlMzJfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkpKTsKKwkJCS8qCisJCQkgKiBJZiBAdmFsIGNvbGxhdGVzIGJlZm9yZSB0aGUgY3VycmVudCBhdHRyaWJ1dGUncworCQkJICogdmFsdWUsIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGF0dHJpYnV0ZS4KKwkJCSAqLworCQkJaWYgKCFyYykgeworCQkJCXJlZ2lzdGVyIHUzMiBhdmw7CisKKwkJCQlhdmwgPSBsZTMyX3RvX2NwdSgKKwkJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJCQlpZiAodmFsX2xlbiA9PSBhdmwpCisJCQkJCXJldHVybiAwOworCQkJCWlmICh2YWxfbGVuIDwgYXZsKQorCQkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCX0gZWxzZSBpZiAocmMgPCAwKQorCQkJCXJldHVybiAtRU5PRU5UOworCQl9CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIklub2RlIGlzIGNvcnJ1cHQuICBSdW4gY2hrZHNrLiIpOworCU5Wb2xTZXRFcnJvcnModm9sKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqCisgKiBsb2FkX2F0dHJpYnV0ZV9saXN0IC0gbG9hZCBhbiBhdHRyaWJ1dGUgbGlzdCBpbnRvIG1lbW9yeQorICogQHZvbDoJCW50ZnMgdm9sdW1lIGZyb20gd2hpY2ggdG8gcmVhZAorICogQHJ1bmxpc3Q6CQlydW5saXN0IG9mIHRoZSBhdHRyaWJ1dGUgbGlzdAorICogQGFsX3N0YXJ0OgkJZGVzdGluYXRpb24gYnVmZmVyCisgKiBAc2l6ZToJCXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpbiBieXRlcworICogQGluaXRpYWxpemVkX3NpemU6CWluaXRpYWxpemVkIHNpemUgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0CisgKgorICogV2FsayB0aGUgcnVubGlzdCBAcnVubGlzdCBhbmQgbG9hZCBhbGwgY2x1c3RlcnMgZnJvbSBpdCBjb3B5aW5nIHRoZW0gaW50bworICogdGhlIGxpbmVhciBidWZmZXIgQGFsLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIEBhbCBpcyBAc2l6ZQorICogYnl0ZXMuIE5vdGUsIEBzaXplIGRvZXMgbm90IG5lZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2x1c3RlciBzaXplLiBJZgorICogQGluaXRpYWxpemVkX3NpemUgaXMgbGVzcyB0aGFuIEBzaXplLCB0aGUgcmVnaW9uIGluIEBhbCBiZXR3ZWVuCisgKiBAaW5pdGlhbGl6ZWRfc2l6ZSBhbmQgQHNpemUgd2lsbCBiZSB6ZXJvZWQgYW5kIG5vdCByZWFkIGZyb20gZGlzay4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IGxvYWRfYXR0cmlidXRlX2xpc3QobnRmc192b2x1bWUgKnZvbCwgcnVubGlzdCAqcnVubGlzdCwgdTggKmFsX3N0YXJ0LAorCQljb25zdCBzNjQgc2l6ZSwgY29uc3QgczY0IGluaXRpYWxpemVkX3NpemUpCit7CisJTENOIGxjbjsKKwl1OCAqYWwgPSBhbF9zdGFydDsKKwl1OCAqYWxfZW5kID0gYWwgKyBpbml0aWFsaXplZF9zaXplOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrLCBtYXhfYmxvY2s7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgY2hhciBibG9ja19zaXplX2JpdHM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAoIXZvbCB8fCAhcnVubGlzdCB8fCAhYWwgfHwgc2l6ZSA8PSAwIHx8IGluaXRpYWxpemVkX3NpemUgPCAwIHx8CisJCQlpbml0aWFsaXplZF9zaXplID4gc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFpbml0aWFsaXplZF9zaXplKSB7CisJCW1lbXNldChhbCwgMCwgc2l6ZSk7CisJCXJldHVybiAwOworCX0KKwlzYiA9IHZvbC0+c2I7CisJYmxvY2tfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlibG9ja19zaXplX2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKwlkb3duX3JlYWQoJnJ1bmxpc3QtPmxvY2spOworCXJsID0gcnVubGlzdC0+cmw7CisJLyogUmVhZCBhbGwgY2x1c3RlcnMgc3BlY2lmaWVkIGJ5IHRoZSBydW5saXN0IG9uZSBydW4gYXQgYSB0aW1lLiAqLworCXdoaWxlIChybC0+bGVuZ3RoKSB7CisJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgcmwtPnZjbik7CisJCW50ZnNfZGVidWcoIlJlYWRpbmcgdmNuID0gMHglbGx4LCBsY24gPSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJsLT52Y24sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24pOworCQkvKiBUaGUgYXR0cmlidXRlIGxpc3QgY2Fubm90IGJlIHNwYXJzZS4gKi8KKwkJaWYgKGxjbiA8IDApIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJudGZzX3JsX3Zjbl90b19sY24oKSBmYWlsZWQuICBDYW5ub3QgIgorCQkJCQkicmVhZCBhdHRyaWJ1dGUgbGlzdC4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlibG9jayA9IGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IGJsb2NrX3NpemVfYml0czsKKwkJLyogUmVhZCB0aGUgcnVuIGZyb20gZGV2aWNlIGluIGNodW5rcyBvZiBibG9ja19zaXplIGJ5dGVzLiAqLworCQltYXhfYmxvY2sgPSBibG9jayArIChybC0+bGVuZ3RoIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQlibG9ja19zaXplX2JpdHMpOworCQludGZzX2RlYnVnKCJtYXhfYmxvY2sgPSAweCVseC4iLCBtYXhfYmxvY2spOworCQlkbyB7CisJCQludGZzX2RlYnVnKCJSZWFkaW5nIGJsb2NrID0gMHglbHguIiwgYmxvY2spOworCQkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJzYl9icmVhZCgpIGZhaWxlZC4gQ2Fubm90ICIKKwkJCQkJCSJyZWFkIGF0dHJpYnV0ZSBsaXN0LiIpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCWlmIChhbCArIGJsb2NrX3NpemUgPj0gYWxfZW5kKQorCQkJCWdvdG8gZG9fZmluYWw7CisJCQltZW1jcHkoYWwsIGJoLT5iX2RhdGEsIGJsb2NrX3NpemUpOworCQkJYnJlbHNlKGJoKTsKKwkJCWFsICs9IGJsb2NrX3NpemU7CisJCX0gd2hpbGUgKCsrYmxvY2sgPCBtYXhfYmxvY2spOworCQlybCsrOworCX0KKwlpZiAoaW5pdGlhbGl6ZWRfc2l6ZSA8IHNpemUpIHsKK2luaXRpYWxpemU6CisJCW1lbXNldChhbF9zdGFydCArIGluaXRpYWxpemVkX3NpemUsIDAsIHNpemUgLSBpbml0aWFsaXplZF9zaXplKTsKKwl9Citkb25lOgorCXVwX3JlYWQoJnJ1bmxpc3QtPmxvY2spOworCXJldHVybiBlcnI7Citkb19maW5hbDoKKwlpZiAoYWwgPCBhbF9lbmQpIHsKKwkJLyoKKwkJICogUGFydGlhbCBibG9jay4KKwkJICoKKwkJICogTm90ZTogVGhlIGF0dHJpYnV0ZSBsaXN0IGNhbiBiZSBzbWFsbGVyIHRoYW4gaXRzIGFsbG9jYXRpb24KKwkJICogYnkgbXVsdGlwbGUgY2x1c3RlcnMuICBUaGlzIGhhcyBiZWVuIGVuY291bnRlcmVkIGJ5IGF0IGxlYXN0CisJCSAqIHR3byBwZW9wbGUgcnVubmluZyBXaW5kb3dzIFhQLCB0aHVzIHdlIGNhbm5vdCBkbyBhbnkKKwkJICogdHJ1bmNhdGlvbiBzYW5pdHkgY2hlY2tpbmcgaGVyZS4gKEFJQSkKKwkJICovCisJCW1lbWNweShhbCwgYmgtPmJfZGF0YSwgYWxfZW5kIC0gYWwpOworCQlicmVsc2UoYmgpOworCQlpZiAoaW5pdGlhbGl6ZWRfc2l6ZSA8IHNpemUpCisJCQlnb3RvIGluaXRpYWxpemU7CisJCWdvdG8gZG9uZTsKKwl9CisJYnJlbHNlKGJoKTsKKwkvKiBSZWFsIG92ZXJmbG93ISAqLworCW50ZnNfZXJyb3Ioc2IsICJBdHRyaWJ1dGUgbGlzdCBidWZmZXIgb3ZlcmZsb3cuIFJlYWQgYXR0cmlidXRlIGxpc3QgIgorCQkJImlzIHRydW5jYXRlZC4iKTsKK2Vycl9vdXQ6CisJZXJyID0gLUVJTzsKKwlnb3RvIGRvbmU7Cit9CisKKy8qKgorICogbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQgLSBmaW5kIGFuIGF0dHJpYnV0ZSBpbiB0aGUgYXR0cmlidXRlIGxpc3Qgb2YgYW4gaW5vZGUKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSB0byBmaW5kCisgKiBAbmFtZToJYXR0cmlidXRlIG5hbWUgdG8gZmluZCAob3B0aW9uYWwsIGkuZS4gTlVMTCBtZWFucyBkb24ndCBjYXJlKQorICogQG5hbWVfbGVuOglhdHRyaWJ1dGUgbmFtZSBsZW5ndGggKG9ubHkgbmVlZGVkIGlmIEBuYW1lIHByZXNlbnQpCisgKiBAaWM6CQlJR05PUkVfQ0FTRSBvciBDQVNFX1NFTlNJVElWRSAoaWdub3JlZCBpZiBAbmFtZSBub3QgcHJlc2VudCkKKyAqIEBsb3dlc3RfdmNuOglsb3dlc3QgdmNuIHRvIGZpbmQgKG9wdGlvbmFsLCBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBvbmx5KQorICogQHZhbDoJYXR0cmlidXRlIHZhbHVlIHRvIGZpbmQgKG9wdGlvbmFsLCByZXNpZGVudCBhdHRyaWJ1dGVzIG9ubHkpCisgKiBAdmFsX2xlbjoJYXR0cmlidXRlIHZhbHVlIGxlbmd0aAorICogQGN0eDoJc2VhcmNoIGNvbnRleHQgd2l0aCBtZnQgcmVjb3JkIGFuZCBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZyb20KKyAqCisgKiBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gIFVzZSBudGZzX2F0dHJfbG9va3VwKCkKKyAqIGluc3RlYWQuCisgKgorICogRmluZCBhbiBhdHRyaWJ1dGUgYnkgc2VhcmNoaW5nIHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGF0dHJpYnV0ZSBsaXN0IGVudHJ5LiAgSGF2aW5nIGZvdW5kIHRoZSBlbnRyeSwgbWFwIHRoZSBtZnQgcmVjb3JkIGlmIHRoZQorICogYXR0cmlidXRlIGlzIGluIGEgZGlmZmVyZW50IG1mdCByZWNvcmQvaW5vZGUsIG50ZnNfYXR0cl9maW5kKCkgdGhlIGF0dHJpYnV0ZQorICogaW4gdGhlcmUgYW5kIHJldHVybiBpdC4KKyAqCisgKiBPbiBmaXJzdCBzZWFyY2ggQGN0eC0+bnRmc19pbm8gbXVzdCBiZSB0aGUgYmFzZSBtZnQgcmVjb3JkIGFuZCBAY3R4IG11c3QKKyAqIGhhdmUgYmVlbiBvYnRhaW5lZCBmcm9tIGEgY2FsbCB0byBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoKS4gIE9uIHN1YnNlcXVlbnQKKyAqIGNhbGxzIEBjdHgtPm50ZnNfaW5vIGNhbiBiZSBhbnkgZXh0ZW50IGlub2RlLCB0b28gKEBjdHgtPmJhc2VfbnRmc19pbm8gaXMKKyAqIHRoZW4gdGhlIGJhc2UgaW5vZGUpLgorICoKKyAqIEFmdGVyIGZpbmlzaGluZyB3aXRoIHRoZSBhdHRyaWJ1dGUvbWZ0IHJlY29yZCB5b3UgbmVlZCB0byBjYWxsCisgKiBudGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoKSB0byBjbGVhbnVwIHRoZSBzZWFyY2ggY29udGV4dCAodW5tYXBwaW5nIGFueQorICogbWFwcGVkIGlub2RlcywgZXRjKS4KKyAqCisgKiBJZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kLCBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIHJldHVybnMgMCBhbmQKKyAqIEBjdHgtPmF0dHIgd2lsbCBwb2ludCB0byB0aGUgZm91bmQgYXR0cmlidXRlLiAgQGN0eC0+bXJlYyB3aWxsIHBvaW50IHRvIHRoZQorICogbWZ0IHJlY29yZCBpbiB3aGljaCBAY3R4LT5hdHRyIGlzIGxvY2F0ZWQgYW5kIEBjdHgtPmFsX2VudHJ5IHdpbGwgcG9pbnQgdG8KKyAqIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBmb3IgdGhlIGF0dHJpYnV0ZS4KKyAqCisgKiBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSByZXR1cm5zIC1FTk9FTlQgYW5kCisgKiBAY3R4LT5hdHRyIHdpbGwgcG9pbnQgdG8gdGhlIGF0dHJpYnV0ZSBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkIGJlZm9yZSB3aGljaAorICogdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZSBpbnNlcnRlZCBpZiBzdWNoIGFuIGFjdGlvbgorICogd2VyZSB0byBiZSBkZXNpcmVkLiAgQGN0eC0+bXJlYyB3aWxsIHBvaW50IHRvIHRoZSBtZnQgcmVjb3JkIGluIHdoaWNoCisgKiBAY3R4LT5hdHRyIGlzIGxvY2F0ZWQgYW5kIEBjdHgtPmFsX2VudHJ5IHdpbGwgcG9pbnQgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0CisgKiBlbnRyeSBvZiB0aGUgYXR0cmlidXRlIGJlZm9yZSB3aGljaCB0aGUgYXR0cmlidXRlIGJlaW5nIHNlYXJjaGVkIGZvciB3b3VsZAorICogbmVlZCB0byBiZSBpbnNlcnRlZCBpZiBzdWNoIGFuIGFjdGlvbiB3ZXJlIHRvIGJlIGRlc2lyZWQuCisgKgorICogVGh1cyB0byBpbnNlcnQgdGhlIG5vdCBmb3VuZCBhdHRyaWJ1dGUsIG9uZSB3YW50cyB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0bworICogQGN0eC0+bXJlYyAodGhlIGJhc2UgbWZ0IHJlY29yZCkgYW5kIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UsIHRoZQorICogYXR0cmlidXRlIHNob3VsZCBiZSBwbGFjZWQgaW4gYSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50IG1mdCByZWNvcmQuICBUaGUKKyAqIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGZvciB0aGUgaW5zZXJ0ZWQgYXR0cmlidXRlIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUKKyAqIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBhdCBAY3R4LT5hbF9lbnRyeS4KKyAqCisgKiBPbiBhY3R1YWwgZXJyb3IsIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgcmV0dXJucyAtRUlPLiAgSW4gdGhpcyBjYXNlCisgKiBAY3R4LT5hdHRyIGlzIHVuZGVmaW5lZCBhbmQgaW4gcGFydGljdWxhciBkbyBub3QgcmVseSBvbiBpdCBub3QgY2hhbmdpbmcuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoY29uc3QgQVRUUl9UWVBFIHR5cGUsCisJCWNvbnN0IG50ZnNjaGFyICpuYW1lLCBjb25zdCB1MzIgbmFtZV9sZW4sCisJCWNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsIGNvbnN0IFZDTiBsb3dlc3RfdmNuLAorCQljb25zdCB1OCAqdmFsLCBjb25zdCB1MzIgdmFsX2xlbiwgbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCkKK3sKKwludGZzX2lub2RlICpiYXNlX25pLCAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlBVFRSX0xJU1RfRU5UUlkgKmFsX2VudHJ5LCAqbmV4dF9hbF9lbnRyeTsKKwl1OCAqYWxfc3RhcnQsICphbF9lbmQ7CisJQVRUUl9SRUNPUkQgKmE7CisJbnRmc2NoYXIgKmFsX25hbWU7CisJdTMyIGFsX25hbWVfbGVuOworCWludCBlcnIgPSAwOworCXN0YXRpYyBjb25zdCBjaGFyICplcyA9ICIgVW5tb3VudCBhbmQgcnVuIGNoa2Rzay4iOworCisJbmkgPSBjdHgtPm50ZnNfaW5vOworCWJhc2VfbmkgPSBjdHgtPmJhc2VfbnRmc19pbm87CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCB0eXBlIDB4JXguIiwgbmktPm1mdF9ubywgdHlwZSk7CisJaWYgKCFiYXNlX25pKSB7CisJCS8qIEZpcnN0IGNhbGwgaGFwcGVucyB3aXRoIHRoZSBiYXNlIG1mdCByZWNvcmQuICovCisJCWJhc2VfbmkgPSBjdHgtPmJhc2VfbnRmc19pbm8gPSBjdHgtPm50ZnNfaW5vOworCQljdHgtPmJhc2VfbXJlYyA9IGN0eC0+bXJlYzsKKwl9CisJaWYgKG5pID09IGJhc2VfbmkpCisJCWN0eC0+YmFzZV9hdHRyID0gY3R4LT5hdHRyOworCWlmICh0eXBlID09IEFUX0VORCkKKwkJZ290byBub3RfZm91bmQ7CisJdm9sID0gYmFzZV9uaS0+dm9sOworCWFsX3N0YXJ0ID0gYmFzZV9uaS0+YXR0cl9saXN0OworCWFsX2VuZCA9IGFsX3N0YXJ0ICsgYmFzZV9uaS0+YXR0cl9saXN0X3NpemU7CisJaWYgKCFjdHgtPmFsX2VudHJ5KQorCQljdHgtPmFsX2VudHJ5ID0gKEFUVFJfTElTVF9FTlRSWSopYWxfc3RhcnQ7CisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgZW50cmllcyBpbiBhdHRyaWJ1dGUgbGlzdCBzdGFydGluZyBhdCBAY3R4LT5hbF9lbnRyeSwKKwkgKiBvciB0aGUgZW50cnkgZm9sbG93aW5nIHRoYXQsIGlmIEBjdHgtPmlzX2ZpcnN0IGlzIFRSVUUuCisJICovCisJaWYgKGN0eC0+aXNfZmlyc3QpIHsKKwkJYWxfZW50cnkgPSBjdHgtPmFsX2VudHJ5OworCQljdHgtPmlzX2ZpcnN0ID0gRkFMU0U7CisJfSBlbHNlCisJCWFsX2VudHJ5ID0gKEFUVFJfTElTVF9FTlRSWSopKCh1OCopY3R4LT5hbF9lbnRyeSArCisJCQkJbGUxNl90b19jcHUoY3R4LT5hbF9lbnRyeS0+bGVuZ3RoKSk7CisJZm9yICg7OyBhbF9lbnRyeSA9IG5leHRfYWxfZW50cnkpIHsKKwkJLyogT3V0IG9mIGJvdW5kcyBjaGVjay4gKi8KKwkJaWYgKCh1OCopYWxfZW50cnkgPCBiYXNlX25pLT5hdHRyX2xpc3QgfHwKKwkJCQkodTgqKWFsX2VudHJ5ID4gYWxfZW5kKQorCQkJYnJlYWs7CS8qIElub2RlIGlzIGNvcnJ1cHQuICovCisJCWN0eC0+YWxfZW50cnkgPSBhbF9lbnRyeTsKKwkJLyogQ2F0Y2ggdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCWlmICgodTgqKWFsX2VudHJ5ID09IGFsX2VuZCkKKwkJCWdvdG8gbm90X2ZvdW5kOworCQlpZiAoIWFsX2VudHJ5LT5sZW5ndGgpCisJCQlicmVhazsKKwkJaWYgKCh1OCopYWxfZW50cnkgKyA2ID4gYWxfZW5kIHx8ICh1OCopYWxfZW50cnkgKworCQkJCWxlMTZfdG9fY3B1KGFsX2VudHJ5LT5sZW5ndGgpID4gYWxfZW5kKQorCQkJYnJlYWs7CisJCW5leHRfYWxfZW50cnkgPSAoQVRUUl9MSVNUX0VOVFJZKikoKHU4KilhbF9lbnRyeSArCisJCQkJbGUxNl90b19jcHUoYWxfZW50cnktPmxlbmd0aCkpOworCQlpZiAobGUzMl90b19jcHUoYWxfZW50cnktPnR5cGUpID4gbGUzMl90b19jcHUodHlwZSkpCisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJaWYgKHR5cGUgIT0gYWxfZW50cnktPnR5cGUpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSWYgQG5hbWUgaXMgcHJlc2VudCwgY29tcGFyZSB0aGUgdHdvIG5hbWVzLiAgSWYgQG5hbWUgaXMKKwkJICogbWlzc2luZywgYXNzdW1lIHdlIHdhbnQgYW4gdW5uYW1lZCBhdHRyaWJ1dGUuCisJCSAqLworCQlhbF9uYW1lX2xlbiA9IGFsX2VudHJ5LT5uYW1lX2xlbmd0aDsKKwkJYWxfbmFtZSA9IChudGZzY2hhciopKCh1OCopYWxfZW50cnkgKyBhbF9lbnRyeS0+bmFtZV9vZmZzZXQpOworCQlpZiAoIW5hbWUpIHsKKwkJCWlmIChhbF9uYW1lX2xlbikKKwkJCQlnb3RvIG5vdF9mb3VuZDsKKwkJfSBlbHNlIGlmICghbnRmc19hcmVfbmFtZXNfZXF1YWwoYWxfbmFtZSwgYWxfbmFtZV9sZW4sIG5hbWUsCisJCQkJbmFtZV9sZW4sIGljLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworCQkJcmVnaXN0ZXIgaW50IHJjOworCisJCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyhuYW1lLCBuYW1lX2xlbiwgYWxfbmFtZSwKKwkJCQkJYWxfbmFtZV9sZW4sIDEsIElHTk9SRV9DQVNFLAorCQkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJCS8qCisJCQkgKiBJZiBAbmFtZSBjb2xsYXRlcyBiZWZvcmUgYWxfbmFtZSwgdGhlcmUgaXMgbm8KKwkJCSAqIG1hdGNoaW5nIGF0dHJpYnV0ZS4KKwkJCSAqLworCQkJaWYgKHJjID09IC0xKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJLyogSWYgdGhlIHN0cmluZ3MgYXJlIG5vdCBlcXVhbCwgY29udGludWUgc2VhcmNoLiAqLworCQkJaWYgKHJjKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIEZJWE1FOiBSZXZlcnNlIGVuZ2luZWVyaW5nIHNob3dlZCAwLCBJR05PUkVfQ0FTRSBidXQKKwkJCSAqIHRoYXQgaXMgaW5jb25zaXN0ZW50IHdpdGggbnRmc19hdHRyX2ZpbmQoKS4gIFRoZQorCQkJICogc3Vic2VxdWVudCByYyBjaGVja3Mgd2VyZSBhbHNvIGRpZmZlcmVudC4gIFBlcmhhcHMgSQorCQkJICogbWFkZSBhIG1pc3Rha2UgaW4gb25lIG9mIHRoZSB0d28uICBOZWVkIHRvIHJlY2hlY2sKKwkJCSAqIHdoaWNoIGlzIGNvcnJlY3Qgb3IgYXQgbGVhc3Qgc2VlIHdoYXQgaXMgZ29pbmcgb24uLi4KKwkJCSAqIChBSUEpCisJCQkgKi8KKwkJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKG5hbWUsIG5hbWVfbGVuLCBhbF9uYW1lLAorCQkJCQlhbF9uYW1lX2xlbiwgMSwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQkJaWYgKHJjID09IC0xKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJaWYgKHJjKQorCQkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFRoZSBuYW1lcyBtYXRjaCBvciBAbmFtZSBub3QgcHJlc2VudCBhbmQgYXR0cmlidXRlIGlzCisJCSAqIHVubmFtZWQuICBOb3cgY2hlY2sgQGxvd2VzdF92Y24uICBDb250aW51ZSBzZWFyY2ggaWYgdGhlCisJCSAqIG5leHQgYXR0cmlidXRlIGxpc3QgZW50cnkgc3RpbGwgZml0cyBAbG93ZXN0X3Zjbi4gIE90aGVyd2lzZQorCQkgKiB3ZSBoYXZlIHJlYWNoZWQgdGhlIHJpZ2h0IG9uZSBvciB0aGUgc2VhcmNoIGhhcyBmYWlsZWQuCisJCSAqLworCQlpZiAobG93ZXN0X3ZjbiAmJiAodTgqKW5leHRfYWxfZW50cnkgPj0gYWxfc3RhcnQJICAgICYmCisJCQkJKHU4KiluZXh0X2FsX2VudHJ5ICsgNiA8IGFsX2VuZAkJICAgICYmCisJCQkJKHU4KiluZXh0X2FsX2VudHJ5ICsgbGUxNl90b19jcHUoCisJCQkJCW5leHRfYWxfZW50cnktPmxlbmd0aCkgPD0gYWxfZW5kICAgICYmCisJCQkJc2xlNjRfdG9fY3B1KG5leHRfYWxfZW50cnktPmxvd2VzdF92Y24pIDw9CisJCQkJCWxvd2VzdF92Y24JCQkgICAgJiYKKwkJCQluZXh0X2FsX2VudHJ5LT50eXBlID09IGFsX2VudHJ5LT50eXBlCSAgICAmJgorCQkJCW5leHRfYWxfZW50cnktPm5hbWVfbGVuZ3RoID09IGFsX25hbWVfbGVuICAgJiYKKwkJCQludGZzX2FyZV9uYW1lc19lcXVhbCgobnRmc2NoYXIqKSgodTgqKQorCQkJCQluZXh0X2FsX2VudHJ5ICsKKwkJCQkJbmV4dF9hbF9lbnRyeS0+bmFtZV9vZmZzZXQpLAorCQkJCQluZXh0X2FsX2VudHJ5LT5uYW1lX2xlbmd0aCwKKwkJCQkJYWxfbmFtZSwgYWxfbmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLAorCQkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoTVJFRl9MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgPT0gbmktPm1mdF9ubykgeworCQkJaWYgKE1TRVFOT19MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgIT0gbmktPnNlcV9ubykgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZvdW5kIHN0YWxlIG1mdCAiCisJCQkJCQkicmVmZXJlbmNlIGluIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJCSJvZiBiYXNlIGlub2RlIDB4JWx4LiVzIiwKKwkJCQkJCWJhc2VfbmktPm1mdF9ubywgZXMpOworCQkJCWVyciA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7IC8qIE1mdCByZWZlcmVuY2VzIGRvIG5vdCBtYXRjaC4gKi8KKwkJCS8qIElmIHRoZXJlIGlzIGEgbWFwcGVkIHJlY29yZCB1bm1hcCBpdCBmaXJzdC4gKi8KKwkJCWlmIChuaSAhPSBiYXNlX25pKQorCQkJCXVubWFwX2V4dGVudF9tZnRfcmVjb3JkKG5pKTsKKwkJCS8qIERvIHdlIHdhbnQgdGhlIGJhc2UgcmVjb3JkIGJhY2s/ICovCisJCQlpZiAoTVJFRl9MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgPT0KKwkJCQkJYmFzZV9uaS0+bWZ0X25vKSB7CisJCQkJbmkgPSBjdHgtPm50ZnNfaW5vID0gYmFzZV9uaTsKKwkJCQljdHgtPm1yZWMgPSBjdHgtPmJhc2VfbXJlYzsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2Ugd2FudCBhbiBleHRlbnQgcmVjb3JkLiAqLworCQkJCWN0eC0+bXJlYyA9IG1hcF9leHRlbnRfbWZ0X3JlY29yZChiYXNlX25pLAorCQkJCQkJbGU2NF90b19jcHUoCisJCQkJCQlhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSksICZuaSk7CisJCQkJaWYgKElTX0VSUihjdHgtPm1yZWMpKSB7CisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgIgorCQkJCQkJCSJleHRlbnQgbWZ0IHJlY29yZCAiCisJCQkJCQkJIjB4JWx4IG9mIGJhc2UgaW5vZGUgIgorCQkJCQkJCSIweCVseC4lcyIsCisJCQkJCQkJTVJFRl9MRShhbF9lbnRyeS0+CisJCQkJCQkJbWZ0X3JlZmVyZW5jZSksCisJCQkJCQkJYmFzZV9uaS0+bWZ0X25vLCBlcyk7CisJCQkJCWVyciA9IFBUUl9FUlIoY3R4LT5tcmVjKTsKKwkJCQkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJCQkJZXJyID0gLUVJTzsKKwkJCQkJLyogQ2F1c2UgQGN0eCB0byBiZSBzYW5pdGl6ZWQgYmVsb3cuICovCisJCQkJCW5pID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWN0eC0+bnRmc19pbm8gPSBuaTsKKwkJCX0KKwkJCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopY3R4LT5tcmVjICsKKwkJCQkJbGUxNl90b19jcHUoY3R4LT5tcmVjLT5hdHRyc19vZmZzZXQpKTsKKwkJfQorCQkvKgorCQkgKiBjdHgtPnZmc19pbm8sIGN0eC0+bXJlYywgYW5kIGN0eC0+YXR0ciBub3cgcG9pbnQgdG8gdGhlCisJCSAqIG1mdCByZWNvcmQgY29udGFpbmluZyB0aGUgYXR0cmlidXRlIHJlcHJlc2VudGVkIGJ5IHRoZQorCQkgKiBjdXJyZW50IGFsX2VudHJ5LgorCQkgKi8KKwkJLyoKKwkJICogV2UgY291bGQgY2FsbCBpbnRvIG50ZnNfYXR0cl9maW5kKCkgdG8gZmluZCB0aGUgcmlnaHQKKwkJICogYXR0cmlidXRlIGluIHRoaXMgbWZ0IHJlY29yZCBidXQgdGhpcyB3b3VsZCBiZSBsZXNzCisJCSAqIGVmZmljaWVudCBhbmQgbm90IHF1aXRlIGFjY3VyYXRlIGFzIG50ZnNfYXR0cl9maW5kKCkgaWdub3JlcworCQkgKiB0aGUgYXR0cmlidXRlIGluc3RhbmNlIG51bWJlcnMgZm9yIGV4YW1wbGUgd2hpY2ggYmVjb21lCisJCSAqIGltcG9ydGFudCB3aGVuIG9uZSBwbGF5cyB3aXRoIGF0dHJpYnV0ZSBsaXN0cy4gIEFsc28sCisJCSAqIGJlY2F1c2UgYSBwcm9wZXIgbWF0Y2ggaGFzIGJlZW4gZm91bmQgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0CisJCSAqIGVudHJ5IGFib3ZlLCB0aGUgY29tcGFyaXNvbiBjYW4gbm93IGJlIG9wdGltaXplZC4gIFNvIGl0IGlzCisJCSAqIHdvcnRoIHJlLWltcGxlbWVudGluZyBhIHNpbXBsaWZpZWQgbnRmc19hdHRyX2ZpbmQoKSBoZXJlLgorCQkgKi8KKwkJYSA9IGN0eC0+YXR0cjsKKwkJLyoKKwkJICogVXNlIGEgbWFudWFsIGxvb3Agc28gd2UgY2FuIHN0aWxsIHVzZSBicmVhayBhbmQgY29udGludWUKKwkJICogd2l0aCB0aGUgc2FtZSBtZWFuaW5ncyBhcyBhYm92ZS4KKwkJICovCitkb19uZXh0X2F0dHJfbG9vcDoKKwkJaWYgKCh1OCopYSA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopYSA+ICh1OCopY3R4LT5tcmVjICsKKwkJCQlsZTMyX3RvX2NwdShjdHgtPm1yZWMtPmJ5dGVzX2FsbG9jYXRlZCkpCisJCQlicmVhazsKKwkJaWYgKGEtPnR5cGUgPT0gQVRfRU5EKQorCQkJY29udGludWU7CisJCWlmICghYS0+bGVuZ3RoKQorCQkJYnJlYWs7CisJCWlmIChhbF9lbnRyeS0+aW5zdGFuY2UgIT0gYS0+aW5zdGFuY2UpCisJCQlnb3RvIGRvX25leHRfYXR0cjsKKwkJLyoKKwkJICogSWYgdGhlIHR5cGUgYW5kL29yIHRoZSBuYW1lIGFyZSBtaXNtYXRjaGVkIGJldHdlZW4gdGhlCisJCSAqIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGFuZCB0aGUgYXR0cmlidXRlIHJlY29yZCwgdGhlcmUgaXMKKwkJICogY29ycnVwdGlvbiBzbyB3ZSBicmVhayBhbmQgcmV0dXJuIGVycm9yIEVJTy4KKwkJICovCisJCWlmIChhbF9lbnRyeS0+dHlwZSAhPSBhLT50eXBlKQorCQkJYnJlYWs7CisJCWlmICghbnRmc19hcmVfbmFtZXNfZXF1YWwoKG50ZnNjaGFyKikoKHU4KilhICsKKwkJCQlsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkpLCBhLT5uYW1lX2xlbmd0aCwKKwkJCQlhbF9uYW1lLCBhbF9uYW1lX2xlbiwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpCisJCQlicmVhazsKKwkJY3R4LT5hdHRyID0gYTsKKwkJLyoKKwkJICogSWYgbm8gQHZhbCBzcGVjaWZpZWQgb3IgQHZhbCBzcGVjaWZpZWQgYW5kIGl0IG1hdGNoZXMsIHdlCisJCSAqIGhhdmUgZm91bmQgaXQhCisJCSAqLworCQlpZiAoIXZhbCB8fCAoIWEtPm5vbl9yZXNpZGVudCAmJiBsZTMyX3RvX2NwdSgKKwkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPT0gdmFsX2xlbiAmJgorCQkJCSFtZW1jbXAoKHU4KilhICsKKwkJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCisJCQkJdmFsLCB2YWxfbGVuKSkpIHsKKwkJCW50ZnNfZGVidWcoIkRvbmUsIGZvdW5kLiIpOworCQkJcmV0dXJuIDA7CisJCX0KK2RvX25leHRfYXR0cjoKKwkJLyogUHJvY2VlZCB0byB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIGN1cnJlbnQgbWZ0IHJlY29yZC4gKi8KKwkJYSA9IChBVFRSX1JFQ09SRCopKCh1OCopYSArIGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkpOworCQlnb3RvIGRvX25leHRfYXR0cl9sb29wOworCX0KKwlpZiAoIWVycikgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJCYXNlIGlub2RlIDB4JWx4IGNvbnRhaW5zIGNvcnJ1cHQgIgorCQkJCSJhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUuJXMiLCBiYXNlX25pLT5tZnRfbm8sCisJCQkJZXMpOworCQllcnIgPSAtRUlPOworCX0KKwlpZiAobmkgIT0gYmFzZV9uaSkgeworCQlpZiAobmkpCisJCQl1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChuaSk7CisJCWN0eC0+bnRmc19pbm8gPSBiYXNlX25pOworCQljdHgtPm1yZWMgPSBjdHgtPmJhc2VfbXJlYzsKKwkJY3R4LT5hdHRyID0gY3R4LT5iYXNlX2F0dHI7CisJfQorCWlmIChlcnIgIT0gLUVOT01FTSkKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCXJldHVybiBlcnI7Citub3RfZm91bmQ6CisJLyoKKwkgKiBJZiB3ZSB3ZXJlIGxvb2tpbmcgZm9yIEFUX0VORCwgd2UgcmVzZXQgdGhlIHNlYXJjaCBjb250ZXh0IEBjdHggYW5kCisJICogdXNlIG50ZnNfYXR0cl9maW5kKCkgdG8gc2VlayB0byB0aGUgZW5kIG9mIHRoZSBiYXNlIG1mdCByZWNvcmQuCisJICovCisJaWYgKHR5cGUgPT0gQVRfRU5EKSB7CisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQlyZXR1cm4gbnRmc19hdHRyX2ZpbmQoQVRfRU5ELCBuYW1lLCBuYW1lX2xlbiwgaWMsIHZhbCwgdmFsX2xlbiwKKwkJCQljdHgpOworCX0KKwkvKgorCSAqIFRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBmb3VuZC4gIEJlZm9yZSB3ZSByZXR1cm4sIHdlIHdhbnQgdG8gZW5zdXJlCisJICogQGN0eC0+bXJlYyBhbmQgQGN0eC0+YXR0ciBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlCisJICogYXR0cmlidXRlIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkLiAgU2luY2Ugd2UgYWxzbworCSAqIHdhbnQgdG8gcHJlc2VydmUgQGN0eC0+YWxfZW50cnkgd2UgY2Fubm90IHJlaW5pdGlhbGl6ZSB0aGUgc2VhcmNoCisJICogY29udGV4dCB1c2luZyBudGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoKSBhcyB0aGlzIHdvdWxkIHNldAorCSAqIEBjdHgtPmFsX2VudHJ5IHRvIE5VTEwuICBUaHVzIHdlIGRvIHRoZSBuZWNlc3NhcnkgYml0cyBtYW51YWxseSAoc2VlCisJICogbnRmc19hdHRyX2luaXRfc2VhcmNoX2N0eCgpIGJlbG93KS4gIE5vdGUsIHdlIF9vbmx5XyBwcmVzZXJ2ZQorCSAqIEBjdHgtPmFsX2VudHJ5IGFzIHRoZSByZW1haW5pbmcgZmllbGRzIChiYXNlXyopIGFyZSBpZGVudGljYWwgdG8KKwkgKiB0aGVpciBub24gYmFzZV8gY291bnRlcnBhcnRzIGFuZCB3ZSBjYW5ub3Qgc2V0IEBjdHgtPmJhc2VfYXR0cgorCSAqIGNvcnJlY3RseSB5ZXQgYXMgd2UgZG8gbm90IGtub3cgd2hhdCBAY3R4LT5hdHRyIHdpbGwgYmUgc2V0IHRvIGJ5CisJICogdGhlIGNhbGwgdG8gbnRmc19hdHRyX2ZpbmQoKSBiZWxvdy4KKwkgKi8KKwlpZiAobmkgIT0gYmFzZV9uaSkKKwkJdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQobmkpOworCWN0eC0+bXJlYyA9IGN0eC0+YmFzZV9tcmVjOworCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopY3R4LT5tcmVjICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+bXJlYy0+YXR0cnNfb2Zmc2V0KSk7CisJY3R4LT5pc19maXJzdCA9IFRSVUU7CisJY3R4LT5udGZzX2lubyA9IGJhc2Vfbmk7CisJY3R4LT5iYXNlX250ZnNfaW5vID0gTlVMTDsKKwljdHgtPmJhc2VfbXJlYyA9IE5VTEw7CisJY3R4LT5iYXNlX2F0dHIgPSBOVUxMOworCS8qCisJICogSW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hlcyBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkLCBuZWVkIHRvCisJICoga2VlcCBlbnVtZXJhdGluZyB1bnRpbCB3ZSBnZXQgYW4gYXR0cmlidXRlIG5vdCBmb3VuZCByZXNwb25zZSAob3IKKwkgKiBhbm90aGVyIGVycm9yKSwgb3RoZXJ3aXNlIHdlIHdvdWxkIGtlZXAgcmV0dXJuaW5nIHRoZSBzYW1lIGF0dHJpYnV0ZQorCSAqIG92ZXIgYW5kIG92ZXIgYWdhaW4gYW5kIGFsbCBwcm9ncmFtcyB1c2luZyB1cyBmb3IgZW51bWVyYXRpb24gd291bGQKKwkgKiBsb2NrIHVwIGluIGEgdGlnaHQgbG9vcC4KKwkgKi8KKwlkbyB7CisJCWVyciA9IG50ZnNfYXR0cl9maW5kKHR5cGUsIG5hbWUsIG5hbWVfbGVuLCBpYywgdmFsLCB2YWxfbGVuLAorCQkJCWN0eCk7CisJfSB3aGlsZSAoIWVycik7CisJbnRmc19kZWJ1ZygiRG9uZSwgbm90IGZvdW5kLiIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19hdHRyX2xvb2t1cCAtIGZpbmQgYW4gYXR0cmlidXRlIGluIGFuIG50ZnMgaW5vZGUKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSB0byBmaW5kCisgKiBAbmFtZToJYXR0cmlidXRlIG5hbWUgdG8gZmluZCAob3B0aW9uYWwsIGkuZS4gTlVMTCBtZWFucyBkb24ndCBjYXJlKQorICogQG5hbWVfbGVuOglhdHRyaWJ1dGUgbmFtZSBsZW5ndGggKG9ubHkgbmVlZGVkIGlmIEBuYW1lIHByZXNlbnQpCisgKiBAaWM6CQlJR05PUkVfQ0FTRSBvciBDQVNFX1NFTlNJVElWRSAoaWdub3JlZCBpZiBAbmFtZSBub3QgcHJlc2VudCkKKyAqIEBsb3dlc3RfdmNuOglsb3dlc3QgdmNuIHRvIGZpbmQgKG9wdGlvbmFsLCBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBvbmx5KQorICogQHZhbDoJYXR0cmlidXRlIHZhbHVlIHRvIGZpbmQgKG9wdGlvbmFsLCByZXNpZGVudCBhdHRyaWJ1dGVzIG9ubHkpCisgKiBAdmFsX2xlbjoJYXR0cmlidXRlIHZhbHVlIGxlbmd0aAorICogQGN0eDoJc2VhcmNoIGNvbnRleHQgd2l0aCBtZnQgcmVjb3JkIGFuZCBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZyb20KKyAqCisgKiBGaW5kIGFuIGF0dHJpYnV0ZSBpbiBhbiBudGZzIGlub2RlLiAgT24gZmlyc3Qgc2VhcmNoIEBjdHgtPm50ZnNfaW5vIG11c3QKKyAqIGJlIHRoZSBiYXNlIG1mdCByZWNvcmQgYW5kIEBjdHggbXVzdCBoYXZlIGJlZW4gb2J0YWluZWQgZnJvbSBhIGNhbGwgdG8KKyAqIG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eCgpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNwYXJlbnRseSBoYW5kbGVzIGF0dHJpYnV0ZSBsaXN0cyBhbmQgQGN0eCBpcyB1c2VkIHRvCisgKiBjb250aW51ZSBzZWFyY2hlcyB3aGVyZSB0aGV5IHdlcmUgbGVmdCBvZmYgYXQuCisgKgorICogQWZ0ZXIgZmluaXNoaW5nIHdpdGggdGhlIGF0dHJpYnV0ZS9tZnQgcmVjb3JkIHlvdSBuZWVkIHRvIGNhbGwKKyAqIG50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eCgpIHRvIGNsZWFudXAgdGhlIHNlYXJjaCBjb250ZXh0ICh1bm1hcHBpbmcgYW55CisgKiBtYXBwZWQgaW5vZGVzLCBldGMpLgorICoKKyAqIFJldHVybiAwIGlmIHRoZSBzZWFyY2ggd2FzIHN1Y2Nlc3NmdWwgYW5kIC1lcnJubyBpZiBub3QuCisgKgorICogV2hlbiAwLCBAY3R4LT5hdHRyIGlzIHRoZSBmb3VuZCBhdHRyaWJ1dGUgYW5kIGl0IGlzIGluIG1mdCByZWNvcmQKKyAqIEBjdHgtPm1yZWMuICBJZiBhbiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgQGN0eC0+YWxfZW50cnkgaXMKKyAqIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBvZiB0aGUgZm91bmQgYXR0cmlidXRlLgorICoKKyAqIFdoZW4gLUVOT0VOVCwgQGN0eC0+YXR0ciBpcyB0aGUgYXR0cmlidXRlIHdoaWNoIGNvbGxhdGVzIGp1c3QgYWZ0ZXIgdGhlCisgKiBhdHRyaWJ1dGUgYmVpbmcgc2VhcmNoZWQgZm9yLCBpLmUuIGlmIG9uZSB3YW50cyB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUKKyAqIG1mdCByZWNvcmQgdGhpcyBpcyB0aGUgY29ycmVjdCBwbGFjZSB0byBpbnNlcnQgaXQgaW50by4gIElmIGFuIGF0dHJpYnV0ZQorICogbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgQGN0eC0+YWxfZW50cnkgaXMgdGhlIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IHdoaWNoCisgKiBjb2xsYXRlcyBqdXN0IGFmdGVyIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBvZiB0aGUgYXR0cmlidXRlIGJlaW5nIHNlYXJjaGVkCisgKiBmb3IsIGkuZS4gaWYgb25lIHdhbnRzIHRvIGFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSBtZnQgcmVjb3JkIHRoaXMgaXMgdGhlCisgKiBjb3JyZWN0IHBsYWNlIHRvIGluc2VydCBpdHMgYXR0cmlidXRlIGxpc3QgZW50cnkgaW50by4KKyAqCisgKiBXaGVuIC1lcnJubyAhPSAtRU5PRU5ULCBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgbG9va3VwLiAgQGN0eC0+YXR0ciBpcworICogdGhlbiB1bmRlZmluZWQgYW5kIGluIHBhcnRpY3VsYXIgeW91IHNob3VsZCBub3QgcmVseSBvbiBpdCBub3QgY2hhbmdpbmcuCisgKi8KK2ludCBudGZzX2F0dHJfbG9va3VwKGNvbnN0IEFUVFJfVFlQRSB0eXBlLCBjb25zdCBudGZzY2hhciAqbmFtZSwKKwkJY29uc3QgdTMyIG5hbWVfbGVuLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBWQ04gbG93ZXN0X3ZjbiwgY29uc3QgdTggKnZhbCwgY29uc3QgdTMyIHZhbF9sZW4sCisJCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpCit7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChjdHgtPmJhc2VfbnRmc19pbm8pCisJCWJhc2VfbmkgPSBjdHgtPmJhc2VfbnRmc19pbm87CisJZWxzZQorCQliYXNlX25pID0gY3R4LT5udGZzX2lubzsKKwkvKiBTYW5pdHkgY2hlY2ssIGp1c3QgZm9yIGRlYnVnZ2luZyByZWFsbHkuICovCisJQlVHX09OKCFiYXNlX25pKTsKKwlpZiAoIU5Jbm9BdHRyTGlzdChiYXNlX25pKSB8fCB0eXBlID09IEFUX0FUVFJJQlVURV9MSVNUKQorCQlyZXR1cm4gbnRmc19hdHRyX2ZpbmQodHlwZSwgbmFtZSwgbmFtZV9sZW4sIGljLCB2YWwsIHZhbF9sZW4sCisJCQkJY3R4KTsKKwlyZXR1cm4gbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQodHlwZSwgbmFtZSwgbmFtZV9sZW4sIGljLCBsb3dlc3RfdmNuLAorCQkJdmFsLCB2YWxfbGVuLCBjdHgpOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHggLSBpbml0aWFsaXplIGFuIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dAorICogQGN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IHRvIGluaXRpYWxpemUKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICogQG1yZWM6CW1mdCByZWNvcmQgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICoKKyAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCBAY3R4IHdpdGggQG5pIGFuZCBAbXJlYy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgobnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCwKKwkJbnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm1yZWMpCit7CisJY3R4LT5tcmVjID0gbXJlYzsKKwkvKiBTYW5pdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgZWxzZXdoZXJlLiAqLworCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopbXJlYyArIGxlMTZfdG9fY3B1KG1yZWMtPmF0dHJzX29mZnNldCkpOworCWN0eC0+aXNfZmlyc3QgPSBUUlVFOworCWN0eC0+bnRmc19pbm8gPSBuaTsKKwljdHgtPmFsX2VudHJ5ID0gTlVMTDsKKwljdHgtPmJhc2VfbnRmc19pbm8gPSBOVUxMOworCWN0eC0+YmFzZV9tcmVjID0gTlVMTDsKKwljdHgtPmJhc2VfYXR0ciA9IE5VTEw7Cit9CisKKy8qKgorICogbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4IC0gcmVpbml0aWFsaXplIGFuIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dAorICogQGN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IHRvIHJlaW5pdGlhbGl6ZQorICoKKyAqIFJlaW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IEBjdHgsIHVubWFwcGluZyBhbiBhc3NvY2lhdGVkCisgKiBleHRlbnQgbWZ0IHJlY29yZCBpZiBwcmVzZW50LCBhbmQgaW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGNvbnRleHQgYWdhaW4uCisgKgorICogVGhpcyBpcyB1c2VkIHdoZW4gYSBzZWFyY2ggZm9yIGEgbmV3IGF0dHJpYnV0ZSBpcyBiZWluZyBzdGFydGVkIHRvIHJlc2V0CisgKiB0aGUgc2VhcmNoIGNvbnRleHQgdG8gdGhlIGJlZ2lubmluZy4KKyAqLwordm9pZCBudGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgobnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCkKK3sKKwlpZiAobGlrZWx5KCFjdHgtPmJhc2VfbnRmc19pbm8pKSB7CisJCS8qIE5vIGF0dHJpYnV0ZSBsaXN0LiAqLworCQljdHgtPmlzX2ZpcnN0ID0gVFJVRTsKKwkJLyogU2FuaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGVsc2V3aGVyZS4gKi8KKwkJY3R4LT5hdHRyID0gKEFUVFJfUkVDT1JEKikoKHU4KiljdHgtPm1yZWMgKworCQkJCWxlMTZfdG9fY3B1KGN0eC0+bXJlYy0+YXR0cnNfb2Zmc2V0KSk7CisJCS8qCisJCSAqIFRoaXMgbmVlZHMgcmVzZXR0aW5nIGR1ZSB0byBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIHdoaWNoCisJCSAqIGNhbiBsZWF2ZSBpdCBzZXQgZGVzcGl0ZSBoYXZpbmcgemVyb2VkIGN0eC0+YmFzZV9udGZzX2luby4KKwkJICovCisJCWN0eC0+YWxfZW50cnkgPSBOVUxMOworCQlyZXR1cm47CisJfSAvKiBBdHRyaWJ1dGUgbGlzdC4gKi8KKwlpZiAoY3R4LT5udGZzX2lubyAhPSBjdHgtPmJhc2VfbnRmc19pbm8pCisJCXVubWFwX2V4dGVudF9tZnRfcmVjb3JkKGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgoY3R4LCBjdHgtPmJhc2VfbnRmc19pbm8sIGN0eC0+YmFzZV9tcmVjKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4IC0gYWxsb2NhdGUvaW5pdGlhbGl6ZSBhIG5ldyBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICogQG1yZWM6CW1mdCByZWNvcmQgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICoKKyAqIEFsbG9jYXRlIGEgbmV3IGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCwgaW5pdGlhbGl6ZSBpdCB3aXRoIEBuaSBhbmQgQG1yZWMsCisgKiBhbmQgcmV0dXJuIGl0LiBSZXR1cm4gTlVMTCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqLworbnRmc19hdHRyX3NlYXJjaF9jdHggKm50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbXJlYykKK3sKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCisJY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2F0dHJfY3R4X2NhY2hlLCBTTEFCX05PRlMpOworCWlmIChjdHgpCisJCW50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgoY3R4LCBuaSwgbXJlYyk7CisJcmV0dXJuIGN0eDsKK30KKworLyoqCisgKiBudGZzX2F0dHJfcHV0X3NlYXJjaF9jdHggLSByZWxlYXNlIGFuIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dAorICogQGN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IHRvIGZyZWUKKyAqCisgKiBSZWxlYXNlIHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQgQGN0eCwgdW5tYXBwaW5nIGFuIGFzc29jaWF0ZWQgZXh0ZW50CisgKiBtZnQgcmVjb3JkIGlmIHByZXNlbnQuCisgKi8KK3ZvaWQgbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+YmFzZV9udGZzX2lubyAmJiBjdHgtPm50ZnNfaW5vICE9IGN0eC0+YmFzZV9udGZzX2lubykKKwkJdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQoY3R4LT5udGZzX2lubyk7CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfYXR0cl9jdHhfY2FjaGUsIGN0eCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYgLSBmaW5kIGFuIGF0dHJpYnV0ZSBpbiB0aGUgJEF0dHJEZWYgc3lzdGVtIGZpbGUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncworICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHdoaWNoIHRvIGZpbmQKKyAqCisgKiBTZWFyY2ggZm9yIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiByZWNvcmQgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlCisgKiBAdHlwZSBpbiB0aGUgJEF0dHJEZWYgc3lzdGVtIGZpbGUuCisgKgorICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgdHlwZSBkZWZpbml0aW9uIHJlY29yZCBpZiBmb3VuZCBhbmQgTlVMTCBpZiBub3QgZm91bmQuCisgKi8KK3N0YXRpYyBBVFRSX0RFRiAqbnRmc19hdHRyX2ZpbmRfaW5fYXR0cmRlZihjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1RZUEUgdHlwZSkKK3sKKwlBVFRSX0RFRiAqYWQ7CisKKwlCVUdfT04oIXZvbC0+YXR0cmRlZik7CisJQlVHX09OKCF0eXBlKTsKKwlmb3IgKGFkID0gdm9sLT5hdHRyZGVmOyAodTgqKWFkIC0gKHU4Kil2b2wtPmF0dHJkZWYgPAorCQkJdm9sLT5hdHRyZGVmX3NpemUgJiYgYWQtPnR5cGU7ICsrYWQpIHsKKwkJLyogV2UgaGF2ZSBub3QgZm91bmQgaXQgeWV0LCBjYXJyeSBvbiBzZWFyY2hpbmcuICovCisJCWlmIChsaWtlbHkobGUzMl90b19jcHUoYWQtPnR5cGUpIDwgbGUzMl90b19jcHUodHlwZSkpKQorCQkJY29udGludWU7CisJCS8qIFdlIGZvdW5kIHRoZSBhdHRyaWJ1dGU7IHJldHVybiBpdC4gKi8KKwkJaWYgKGxpa2VseShhZC0+dHlwZSA9PSB0eXBlKSkKKwkJCXJldHVybiBhZDsKKwkJLyogV2UgaGF2ZSBnb25lIHRvbyBmYXIgYWxyZWFkeS4gIE5vIHBvaW50IGluIGNvbnRpbnVpbmcuICovCisJCWJyZWFrOworCX0KKwkvKiBBdHRyaWJ1dGUgbm90IGZvdW5kLiAqLworCW50ZnNfZGVidWcoIkF0dHJpYnV0ZSB0eXBlIDB4JXggbm90IGZvdW5kIGluICRBdHRyRGVmLiIsCisJCQlsZTMyX3RvX2NwdSh0eXBlKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogbnRmc19hdHRyX3NpemVfYm91bmRzX2NoZWNrIC0gY2hlY2sgYSBzaXplIG9mIGFuIGF0dHJpYnV0ZSB0eXBlIGZvciB2YWxpZGl0eQorICogQHZvbDoJbnRmcyB2b2x1bWUgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWxvbmdzCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgd2hpY2ggdG8gY2hlY2sKKyAqIEBzaXplOglzaXplIHdoaWNoIHRvIGNoZWNrCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgQHNpemUgaW4gYnl0ZXMgaXMgdmFsaWQgZm9yIGFuIGF0dHJpYnV0ZSBvZiBAdHlwZSBvbiB0aGUKKyAqIG50ZnMgdm9sdW1lIEB2b2wuICBUaGlzIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGZyb20gJEF0dHJEZWYgc3lzdGVtIGZpbGUuCisgKgorICogUmV0dXJuIDAgaWYgdmFsaWQsIC1FUkFOR0UgaWYgbm90IHZhbGlkLCBvciAtRU5PRU5UIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90CisgKiBsaXN0ZWQgaW4gJEF0dHJEZWYuCisgKi8KK2ludCBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUsCisJCWNvbnN0IHM2NCBzaXplKQoreworCUFUVFJfREVGICphZDsKKworCUJVR19PTihzaXplIDwgMCk7CisJLyoKKwkgKiAkQVRUUklCVVRFX0xJU1QgaGFzIGEgbWF4aW11bSBzaXplIG9mIDI1NmtpQiwgYnV0IHRoaXMgaXMgbm90CisJICogbGlzdGVkIGluICRBdHRyRGVmLgorCSAqLworCWlmICh1bmxpa2VseSh0eXBlID09IEFUX0FUVFJJQlVURV9MSVNUICYmIHNpemUgPiAyNTYgKiAxMDI0KSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJLyogR2V0IHRoZSAkQXR0ckRlZiBlbnRyeSBmb3IgdGhlIGF0dHJpYnV0ZSBAdHlwZS4gKi8KKwlhZCA9IG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYodm9sLCB0eXBlKTsKKwlpZiAodW5saWtlbHkoIWFkKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJLyogRG8gdGhlIGJvdW5kcyBjaGVjay4gKi8KKwlpZiAoKChzbGU2NF90b19jcHUoYWQtPm1pbl9zaXplKSA+IDApICYmCisJCQlzaXplIDwgc2xlNjRfdG9fY3B1KGFkLT5taW5fc2l6ZSkpIHx8CisJCQkoKHNsZTY0X3RvX2NwdShhZC0+bWF4X3NpemUpID4gMCkgJiYgc2l6ZSA+CisJCQlzbGU2NF90b19jcHUoYWQtPm1heF9zaXplKSkpCisJCXJldHVybiAtRVJBTkdFOworCXJldHVybiAwOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9jYW5fYmVfbm9uX3Jlc2lkZW50IC0gY2hlY2sgaWYgYW4gYXR0cmlidXRlIGNhbiBiZSBub24tcmVzaWRlbnQKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncworICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHdoaWNoIHRvIGNoZWNrCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgYXR0cmlidXRlIG9mIEB0eXBlIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sIGlzIGFsbG93ZWQgdG8KKyAqIGJlIG5vbi1yZXNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgb2J0YWluZWQgZnJvbSAkQXR0ckRlZiBzeXN0ZW0gZmlsZS4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgYXR0cmlidXRlIGlzIGFsbG93ZWQgdG8gYmUgbm9uLXJlc2lkZW50LCAtRVBFUk0gaWYgbm90LCBvcgorICogLUVOT0VOVCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBsaXN0ZWQgaW4gJEF0dHJEZWYuCisgKi8KK2ludCBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBBVFRSX1RZUEUgdHlwZSkKK3sKKwlBVFRSX0RFRiAqYWQ7CisKKwkvKgorCSAqICREQVRBIGlzIGFsd2F5cyBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudCBldmVuIGlmICRBdHRyRGVmIGRvZXMgbm90CisJICogc3BlY2lmeSB0aGlzIGluIHRoZSBmbGFncyBvZiB0aGUgJERBVEEgYXR0cmlidXRlIGRlZmluaXRpb24gcmVjb3JkLgorCSAqLworCWlmICh0eXBlID09IEFUX0RBVEEpCisJCXJldHVybiAwOworCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHJlY29yZCBpbiAkQXR0ckRlZi4gKi8KKwlhZCA9IG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYodm9sLCB0eXBlKTsKKwlpZiAodW5saWtlbHkoIWFkKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJLyogQ2hlY2sgdGhlIGZsYWdzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KKwlpZiAoYWQtPmZsYWdzICYgQ0FOX0JFX05PTl9SRVNJREVOVCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FUEVSTTsKK30KKworLyoqCisgKiBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50IC0gY2hlY2sgaWYgYW4gYXR0cmlidXRlIGNhbiBiZSByZXNpZGVudAorICogQHZvbDoJbnRmcyB2b2x1bWUgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWxvbmdzCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgd2hpY2ggdG8gY2hlY2sKKyAqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgb2YgQHR5cGUgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgaXMgYWxsb3dlZCB0bworICogYmUgcmVzaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSBvdXIgbnRmcyBrbm93bGVkZ2UgYW5kIG1heQorICogbm90IGJlIGNvbXBsZXRlbHkgYWNjdXJhdGUsIGVzcGVjaWFsbHkgd2hlbiB1c2VyIGRlZmluZWQgYXR0cmlidXRlcyBhcmUKKyAqIHByZXNlbnQuICBCYXNpY2FsbHkgd2UgYWxsb3cgZXZlcnl0aGluZyB0byBiZSByZXNpZGVudCBleGNlcHQgZm9yIGluZGV4CisgKiBhbGxvY2F0aW9uIGFuZCAkRUEgYXR0cmlidXRlcy4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgYXR0cmlidXRlIGlzIGFsbG93ZWQgdG8gYmUgbm9uLXJlc2lkZW50IGFuZCAtRVBFUk0gaWYgbm90LgorICoKKyAqIFdhcm5pbmc6IEluIHRoZSBzeXN0ZW0gZmlsZSAkTUZUIHRoZSBhdHRyaWJ1dGUgJEJpdG1hcCBtdXN0IGJlIG5vbi1yZXNpZGVudAorICoJICAgIG90aGVyd2lzZSB3aW5kb3dzIHdpbGwgbm90IGJvb3QgKGJsdWUgc2NyZWVuIG9mIGRlYXRoKSEgIFdlIGNhbm5vdAorICoJICAgIGNoZWNrIGZvciB0aGlzIGhlcmUgYXMgd2UgZG8gbm90IGtub3cgd2hpY2ggaW5vZGUncyAkQml0bWFwIGlzCisgKgkgICAgYmVpbmcgYXNrZWQgYWJvdXQgc28gdGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWFsIGNhc2UgdGhpcy4KKyAqLworaW50IG50ZnNfYXR0cl9jYW5fYmVfcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUpCit7CisJaWYgKHR5cGUgIT0gQVRfSU5ERVhfQUxMT0NBVElPTiAmJiB0eXBlICE9IEFUX0VBKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVQRVJNOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplIC0gcmVzaXplIGFuIGF0dHJpYnV0ZSByZWNvcmQKKyAqIEBtOgkJbWZ0IHJlY29yZCBjb250YWluaW5nIGF0dHJpYnV0ZSByZWNvcmQKKyAqIEBhOgkJYXR0cmlidXRlIHJlY29yZCB0byByZXNpemUKKyAqIEBuZXdfc2l6ZToJbmV3IHNpemUgaW4gYnl0ZXMgdG8gd2hpY2ggdG8gcmVzaXplIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIEBhCisgKgorICogUmVzaXplIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIEBhLCBpLmUuIHRoZSByZXNpZGVudCBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUsIGluCisgKiB0aGUgbWZ0IHJlY29yZCBAbSB0byBAbmV3X3NpemUgYnl0ZXMuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUKKyAqIGRlZmluZWQ6CisgKgktRU5PU1BDCS0gTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgbWZ0IHJlY29yZCBAbSB0byBwZXJmb3JtIHRoZSByZXNpemUuCisgKgorICogTm90ZTogT24gZXJyb3IsIG5vIG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZCB3aGF0c29ldmVyLgorICoKKyAqIFdhcm5pbmc6IElmIHlvdSBtYWtlIGEgcmVjb3JkIHNtYWxsZXIgd2l0aG91dCBoYXZpbmcgY29waWVkIGFsbCB0aGUgZGF0YSB5b3UKKyAqCSAgICBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGF0YSBtYXkgYmUgb3ZlcndyaXR0ZW4uCisgKi8KK2ludCBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShNRlRfUkVDT1JEICptLCBBVFRSX1JFQ09SRCAqYSwgdTMyIG5ld19zaXplKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBuZXdfc2l6ZSAldS4iLCBuZXdfc2l6ZSk7CisJLyogQWxpZ24gdG8gOCBieXRlcyBpZiBpdCBpcyBub3QgYWxyZWFkeSBkb25lLiAqLworCWlmIChuZXdfc2l6ZSAmIDcpCisJCW5ld19zaXplID0gKG5ld19zaXplICsgNykgJiB+NzsKKwkvKiBJZiB0aGUgYWN0dWFsIGF0dHJpYnV0ZSBsZW5ndGggaGFzIGNoYW5nZWQsIG1vdmUgdGhpbmdzIGFyb3VuZC4gKi8KKwlpZiAobmV3X3NpemUgIT0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKSkgeworCQl1MzIgbmV3X211c2UgPSBsZTMyX3RvX2NwdShtLT5ieXRlc19pbl91c2UpIC0KKwkJCQlsZTMyX3RvX2NwdShhLT5sZW5ndGgpICsgbmV3X3NpemU7CisJCS8qIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhpcyBtZnQgcmVjb3JkLiAqLworCQlpZiAobmV3X211c2UgPiBsZTMyX3RvX2NwdShtLT5ieXRlc19hbGxvY2F0ZWQpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCS8qIE1vdmUgYXR0cmlidXRlcyBmb2xsb3dpbmcgQGEgdG8gdGhlaXIgbmV3IGxvY2F0aW9uLiAqLworCQltZW1tb3ZlKCh1OCopYSArIG5ld19zaXplLCAodTgqKWEgKyBsZTMyX3RvX2NwdShhLT5sZW5ndGgpLAorCQkJCWxlMzJfdG9fY3B1KG0tPmJ5dGVzX2luX3VzZSkgLSAoKHU4KilhIC0KKwkJCQkodTgqKW0pIC0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKSk7CisJCS8qIEFkanVzdCBAbSB0byByZWZsZWN0IHRoZSBjaGFuZ2UgaW4gdXNlZCBzcGFjZS4gKi8KKwkJbS0+Ynl0ZXNfaW5fdXNlID0gY3B1X3RvX2xlMzIobmV3X211c2UpOworCQkvKiBBZGp1c3QgQGEgdG8gcmVmbGVjdCB0aGUgbmV3IHNpemUuICovCisJCWlmIChuZXdfc2l6ZSA+PSBvZmZzZXRvZihBVFRSX1JFQywgbGVuZ3RoKSArIHNpemVvZihhLT5sZW5ndGgpKQorCQkJYS0+bGVuZ3RoID0gY3B1X3RvX2xlMzIobmV3X3NpemUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudGZzX2F0dHJfc2V0IC0gZmlsbCAoYSBwYXJ0IG9mKSBhbiBhdHRyaWJ1dGUgd2l0aCBhIGJ5dGUKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlIHRvIGZpbGwKKyAqIEBvZnM6CW9mZnNldCBpbnNpZGUgdGhlIGF0dHJpYnV0ZSBhdCB3aGljaCB0byBzdGFydCB0byBmaWxsCisgKiBAY250OgludW1iZXIgb2YgYnl0ZXMgdG8gZmlsbAorICogQHZhbDoJdGhlIHVuc2lnbmVkIDgtYml0IHZhbHVlIHdpdGggd2hpY2ggdG8gZmlsbCB0aGUgYXR0cmlidXRlCisgKgorICogRmlsbCBAY250IGJ5dGVzIG9mIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IHRoZSBudGZzIGlub2RlIEBuaSBzdGFydGluZyBhdAorICogYnl0ZSBvZmZzZXQgQG9mcyBpbnNpZGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBjb25zdGFudCBieXRlIEB2YWwuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBlZmZlY3RpdmVseSBsaWtlIG1lbXNldCgpIGFwcGxpZWQgdG8gYW4gbnRmcyBhdHRyaWJ1dGUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgQW4gZXJyb3IgY29kZSBvZiAtRVNQSVBFIG1lYW5zCisgKiB0aGF0IEBvZnMgKyBAY250IHdlcmUgb3V0c2lkZSB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIG5vIHdyaXRlIHdhcworICogcGVyZm9ybWVkLgorICovCitpbnQgbnRmc19hdHRyX3NldChudGZzX2lub2RlICpuaSwgY29uc3QgczY0IG9mcywgY29uc3QgczY0IGNudCwgY29uc3QgdTggdmFsKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCXU4ICprYWRkcjsKKwlwZ29mZl90IGlkeCwgZW5kOworCXVuc2lnbmVkIGludCBzdGFydF9vZnMsIGVuZF9vZnMsIHNpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3Igb2ZzIDB4JWxseCwgY250IDB4JWxseCwgdmFsIDB4JWh4LiIsCisJCQkobG9uZyBsb25nKW9mcywgKGxvbmcgbG9uZyljbnQsIHZhbCk7CisJQlVHX09OKG9mcyA8IDApOworCUJVR19PTihjbnQgPCAwKTsKKwlpZiAoIWNudCkKKwkJZ290byBkb25lOworCW1hcHBpbmcgPSBWRlNfSShuaSktPmlfbWFwcGluZzsKKwkvKiBXb3JrIG91dCB0aGUgc3RhcnRpbmcgaW5kZXggYW5kIHBhZ2Ugb2Zmc2V0LiAqLworCWlkeCA9IG9mcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0YXJ0X29mcyA9IG9mcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogV29yayBvdXQgdGhlIGVuZGluZyBpbmRleCBhbmQgcGFnZSBvZmZzZXQuICovCisJZW5kID0gb2ZzICsgY250OworCWVuZF9vZnMgPSBlbmQgJiB+UEFHRV9DQUNIRV9NQVNLOworCS8qIElmIHRoZSBlbmQgaXMgb3V0c2lkZSB0aGUgaW5vZGUgc2l6ZSByZXR1cm4gLUVTUElQRS4gKi8KKwlpZiAodW5saWtlbHkoZW5kID4gVkZTX0kobmkpLT5pX3NpemUpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlJlcXVlc3QgZXhjZWVkcyBlbmQgb2YgYXR0cmlidXRlLiIpOworCQlyZXR1cm4gLUVTUElQRTsKKwl9CisJZW5kID4+PSBQQUdFX0NBQ0hFX1NISUZUOworCS8qIElmIHRoZXJlIGlzIGEgZmlyc3QgcGFydGlhbCBwYWdlLCBuZWVkIHRvIGRvIGl0IHRoZSBzbG93IHdheS4gKi8KKwlpZiAoc3RhcnRfb2ZzKSB7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaWR4LAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZmlyc3QgcGFydGlhbCAiCisJCQkJCSJwYWdlIChzeW5jIGVycm9yLCBpbmRleCAweCVseCkuIiwgaWR4KTsKKwkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCQl9CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCWlmICh1bmxpa2VseSghUGFnZVVwdG9kYXRlKHBhZ2UpKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZmlyc3QgcGFydGlhbCBwYWdlICIKKwkJCQkJIihhc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGUgbGFzdCBwYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBwYWdlLCBuZWVkIHRvCisJCSAqIGxpbWl0IHRoZSB3cml0ZSB0byB0aGUgZW5kIG9mZnNldC4KKwkJICovCisJCXNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlmIChpZHggPT0gZW5kKQorCQkJc2l6ZSA9IGVuZF9vZnM7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIgKyBzdGFydF9vZnMsIHZhbCwgc2l6ZSAtIHN0YXJ0X29mcyk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWlmIChpZHggPT0gZW5kKQorCQkJZ290byBkb25lOworCQlpZHgrKzsKKwl9CisJLyogRG8gdGhlIHdob2xlIHBhZ2VzIHRoZSBmYXN0IHdheS4gKi8KKwlmb3IgKDsgaWR4IDwgZW5kOyBpZHgrKykgeworCQkvKiBGaW5kIG9yIGNyZWF0ZSB0aGUgY3VycmVudCBwYWdlLiAgKFRoZSBwYWdlIGlzIGxvY2tlZC4pICovCisJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaWR4KTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBncmFiICIKKwkJCQkJInBhZ2UgKGluZGV4IDB4JWx4KS4iLCBpZHgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciwgdmFsLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkvKgorCQkgKiBJZiB0aGUgcGFnZSBoYXMgYnVmZmVycywgbWFyayB0aGVtIHVwdG9kYXRlIHNpbmNlIGJ1ZmZlcgorCQkgKiBzdGF0ZSBhbmQgbm90IHBhZ2Ugc3RhdGUgaXMgZGVmaW5pdGl2ZSBpbiAyLjYga2VybmVscy4KKwkJICovCisJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKworCQkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQkJZG8geworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwkJfQorCQkvKiBOb3cgdGhhdCBidWZmZXJzIGFyZSB1cHRvZGF0ZSwgc2V0IHRoZSBwYWdlIHVwdG9kYXRlLCB0b28uICovCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJLyoKKwkJICogU2V0IHRoZSBwYWdlIGFuZCBhbGwgaXRzIGJ1ZmZlcnMgZGlydHkgYW5kIG1hcmsgdGhlIGlub2RlCisJCSAqIGRpcnR5LCB0b28uICBUaGUgVk0gd2lsbCB3cml0ZSB0aGUgcGFnZSBsYXRlciBvbi4KKwkJICovCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQkvKiBGaW5hbGx5IHVubG9jayBhbmQgcmVsZWFzZSB0aGUgcGFnZS4gKi8KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJLyogSWYgdGhlcmUgaXMgYSBsYXN0IHBhcnRpYWwgcGFnZSwgbmVlZCB0byBkbyBpdCB0aGUgc2xvdyB3YXkuICovCisJaWYgKGVuZF9vZnMpIHsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpZHgsCisJCQkJKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBsYXN0IHBhcnRpYWwgcGFnZSAiCisJCQkJCSIoc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAodW5saWtlbHkoIVBhZ2VVcHRvZGF0ZShwYWdlKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGxhc3QgcGFydGlhbCBwYWdlICIKKwkJCQkJIihhc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyLCB2YWwsIGVuZF9vZnMpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KK2RvbmU6CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmggYi9mcy9udGZzL2F0dHJpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzJjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2F0dHJpYi5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogYXR0cmliLmggLSBEZWZpbmVzIGZvciBhdHRyaWJ1dGUgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgorICoJICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19BVFRSSUJfSAorI2RlZmluZSBfTElOVVhfTlRGU19BVFRSSUJfSAorCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgInJ1bmxpc3QuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKworLyoqCisgKiBudGZzX2F0dHJfc2VhcmNoX2N0eCAtIHVzZWQgaW4gYXR0cmlidXRlIHNlYXJjaCBmdW5jdGlvbnMKKyAqIEBtcmVjOglidWZmZXIgY29udGFpbmluZyBtZnQgcmVjb3JkIHRvIHNlYXJjaAorICogQGF0dHI6CWF0dHJpYnV0ZSByZWNvcmQgaW4gQG1yZWMgd2hlcmUgdG8gYmVnaW4vY29udGludWUgc2VhcmNoCisgKiBAaXNfZmlyc3Q6CWlmIHRydWUgbnRmc19hdHRyX2xvb2t1cCgpIGJlZ2lucyBzZWFyY2ggd2l0aCBAYXR0ciwgZWxzZSBhZnRlcgorICoKKyAqIFN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHplcm8gYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIG9uZSBvZiB0aGUKKyAqIGF0dHJpYnV0ZSBzZWFyY2ggZnVuY3Rpb25zLiBJbml0aWFsaXplIEBtcmVjIHRvIHBvaW50IHRvIHRoZSBtZnQgcmVjb3JkIHRvCisgKiBzZWFyY2gsIGFuZCBAYXR0ciB0byBwb2ludCB0byB0aGUgZmlyc3QgYXR0cmlidXRlIHdpdGhpbiBAbXJlYyAobm90IG5lY2Vzc2FyeQorICogaWYgY2FsbGluZyB0aGUgX2ZpcnN0KCkgZnVuY3Rpb25zKSwgYW5kIHNldCBAaXNfZmlyc3QgdG8gVFJVRSAobm90IG5lY2Vzc2FyeQorICogaWYgY2FsbGluZyB0aGUgX2ZpcnN0KCkgZnVuY3Rpb25zKS4KKyAqCisgKiBJZiBAaXNfZmlyc3QgaXMgVFJVRSwgdGhlIHNlYXJjaCBiZWdpbnMgd2l0aCBAYXR0ci4gSWYgQGlzX2ZpcnN0IGlzIEZBTFNFLAorICogdGhlIHNlYXJjaCBiZWdpbnMgYWZ0ZXIgQGF0dHIuIFRoaXMgaXMgc28gdGhhdCwgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gb25lCisgKiBvZiB0aGUgc2VhcmNoIGF0dHJpYnV0ZSBmdW5jdGlvbnMsIHdlIGNhbiBjYWxsIHRoZSBmdW5jdGlvbiBhZ2Fpbiwgd2l0aG91dAorICogYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgc2VhcmNoIGNvbnRleHQsIHRvIGF1dG9tYWdpY2FsbHkgZ2V0IHRoZSBuZXh0CisgKiBtYXRjaGluZyBhdHRyaWJ1dGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlNRlRfUkVDT1JEICptcmVjOworCUFUVFJfUkVDT1JEICphdHRyOworCUJPT0wgaXNfZmlyc3Q7CisJbnRmc19pbm9kZSAqbnRmc19pbm87CisJQVRUUl9MSVNUX0VOVFJZICphbF9lbnRyeTsKKwludGZzX2lub2RlICpiYXNlX250ZnNfaW5vOworCU1GVF9SRUNPUkQgKmJhc2VfbXJlYzsKKwlBVFRSX1JFQ09SRCAqYmFzZV9hdHRyOworfSBudGZzX2F0dHJfc2VhcmNoX2N0eDsKKworZXh0ZXJuIGludCBudGZzX21hcF9ydW5saXN0KG50ZnNfaW5vZGUgKm5pLCBWQ04gdmNuKTsKKworZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19maW5kX3ZjbihudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKKwkJY29uc3QgQk9PTCBuZWVkX3dyaXRlKTsKKworaW50IG50ZnNfYXR0cl9sb29rdXAoY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IG50ZnNjaGFyICpuYW1lLAorCQljb25zdCB1MzIgbmFtZV9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IFZDTiBsb3dlc3RfdmNuLCBjb25zdCB1OCAqdmFsLCBjb25zdCB1MzIgdmFsX2xlbiwKKwkJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCk7CisKK2V4dGVybiBpbnQgbG9hZF9hdHRyaWJ1dGVfbGlzdChudGZzX3ZvbHVtZSAqdm9sLCBydW5saXN0ICpybCwgdTggKmFsX3N0YXJ0LAorCQljb25zdCBzNjQgc2l6ZSwgY29uc3QgczY0IGluaXRpYWxpemVkX3NpemUpOworCitzdGF0aWMgaW5saW5lIHM2NCBudGZzX2F0dHJfc2l6ZShjb25zdCBBVFRSX1JFQ09SRCAqYSkKK3sKKwlpZiAoIWEtPm5vbl9yZXNpZGVudCkKKwkJcmV0dXJuIChzNjQpbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCXJldHVybiBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKK30KKworZXh0ZXJuIHZvaWQgbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpOworZXh0ZXJuIG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobnRmc19pbm9kZSAqbmksCisJCU1GVF9SRUNPUkQgKm1yZWMpOworZXh0ZXJuIHZvaWQgbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpOworCitleHRlcm4gaW50IG50ZnNfYXR0cl9zaXplX2JvdW5kc19jaGVjayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1RZUEUgdHlwZSwgY29uc3QgczY0IHNpemUpOworZXh0ZXJuIGludCBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1RZUEUgdHlwZSk7CitleHRlcm4gaW50IG50ZnNfYXR0cl9jYW5fYmVfcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgQVRUUl9UWVBFIHR5cGUpOworCitleHRlcm4gaW50IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKE1GVF9SRUNPUkQgKm0sIEFUVFJfUkVDT1JEICphLCB1MzIgbmV3X3NpemUpOworCitleHRlcm4gaW50IG50ZnNfYXR0cl9zZXQobnRmc19pbm9kZSAqbmksIGNvbnN0IHM2NCBvZnMsIGNvbnN0IHM2NCBjbnQsCisJCWNvbnN0IHU4IHZhbCk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19BVFRSSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9iaXRtYXAuYyBiL2ZzL250ZnMvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZjJlMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvYml0bWFwLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBiaXRtYXAuYyAtIE5URlMga2VybmVsIGJpdG1hcCBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1biAtIHNldCBhIHJ1biBvZiBiaXRzIGluIGEgYml0bWFwIHRvIGEgdmFsdWUKKyAqIEB2aToJCQl2ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYml0bWFwCisgKiBAc3RhcnRfYml0OgkJZmlyc3QgYml0IHRvIHNldAorICogQGNvdW50OgkJbnVtYmVyIG9mIGJpdHMgdG8gc2V0CisgKiBAdmFsdWU6CQl2YWx1ZSB0byBzZXQgdGhlIGJpdHMgdG8gKGkuZS4gMCBvciAxKQorICogQGlzX3JvbGxiYWNrOglpZiBUUlVFIHRoaXMgaXMgYSByb2xsYmFjayBvcGVyYXRpb24KKyAqCisgKiBTZXQgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpIHRvIEB2YWx1ZSwgd2hlcmUgQHZhbHVlIGlzIGVpdGhlciAwIG9yIDEuCisgKgorICogQGlzX3JvbGxiYWNrIHNob3VsZCBhbHdheXMgYmUgRkFMU0UsIGl0IGlzIGZvciBpbnRlcm5hbCB1c2UgdG8gcm9sbGJhY2sKKyAqIGVycm9ycy4gIFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4oKSBpbnN0ZWFkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IF9fbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IHM2NCBzdGFydF9iaXQsCisJCWNvbnN0IHM2NCBjb3VudCwgY29uc3QgdTggdmFsdWUsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spCit7CisJczY0IGNudCA9IGNvdW50OworCXBnb2ZmX3QgaW5kZXgsIGVuZF9pbmRleDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisJaW50IHBvcywgbGVuOworCXU4IGJpdDsKKworCUJVR19PTighdmkpOworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseCwgc3RhcnRfYml0IDB4JWxseCwgY291bnQgMHglbGx4LCAiCisJCQkidmFsdWUgJXUuJXMiLCB2aS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRfYml0LAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljbnQsICh1bnNpZ25lZCBpbnQpdmFsdWUsCisJCQlpc19yb2xsYmFjayA/ICIgKHJvbGxiYWNrKSIgOiAiIik7CisJQlVHX09OKHN0YXJ0X2JpdCA8IDApOworCUJVR19PTihjbnQgPCAwKTsKKwlCVUdfT04odmFsdWUgPiAxKTsKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgaW5kaWNlcyBmb3IgdGhlIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGFuZCBsYXN0CisJICogYml0cywgaS5lLiBAc3RhcnRfYml0IGFuZCBAc3RhcnRfYml0ICsgQGNudCAtIDEsIHJlc3BlY3RpdmVseS4KKwkgKi8KKwlpbmRleCA9IHN0YXJ0X2JpdCA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpOworCWVuZF9pbmRleCA9IChzdGFydF9iaXQgKyBjbnQgLSAxKSA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpOworCisJLyogR2V0IHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGJpdCAoQHN0YXJ0X2JpdCkuICovCisJbWFwcGluZyA9IHZpLT5pX21hcHBpbmc7CisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWFwcGluZywgaW5kZXgpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJaWYgKCFpc19yb2xsYmFjaykKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIGZpcnN0IHBhZ2UgKGVycm9yICIKKwkJCQkJIiVsaSksIGFib3J0aW5nLiIsIFBUUl9FUlIocGFnZSkpOworCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwl9CisJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkvKiBTZXQgQHBvcyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGJ5dGUgY29udGFpbmluZyBAc3RhcnRfYml0LiAqLworCXBvcyA9IChzdGFydF9iaXQgPj4gMykgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJLyogQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiBAc3RhcnRfYml0IGluIHRoZSBmaXJzdCBieXRlLiAqLworCWJpdCA9IHN0YXJ0X2JpdCAmIDc7CisKKwkvKiBJZiB0aGUgZmlyc3QgYnl0ZSBpcyBwYXJ0aWFsLCBtb2RpZnkgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gaXQuICovCisJaWYgKGJpdCkgeworCQl1OCAqYnl0ZSA9IGthZGRyICsgcG9zOworCQl3aGlsZSAoKGJpdCAmIDcpICYmIGNudC0tKSB7CisJCQlpZiAodmFsdWUpCisJCQkJKmJ5dGUgfD0gMSA8PCBiaXQrKzsKKwkJCWVsc2UKKwkJCQkqYnl0ZSAmPSB+KDEgPDwgYml0KyspOworCQl9CisJCS8qIElmIHdlIGFyZSBkb25lLCB1bm1hcCB0aGUgcGFnZSBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCisJCWlmICghY250KQorCQkJZ290byBkb25lOworCisJCS8qIFVwZGF0ZSBAcG9zIHRvIHRoZSBuZXcgcG9zaXRpb24uICovCisJCXBvcysrOworCX0KKwkvKgorCSAqIERlcGVuZGluZyBvbiBAdmFsdWUsIG1vZGlmeSBhbGwgcmVtYWluaW5nIHdob2xlIGJ5dGVzIGluIHRoZSBwYWdlIHVwCisJICogdG8gQGNudC4KKwkgKi8KKwlsZW4gPSBtaW5fdChzNjQsIGNudCA+PiAzLCBQQUdFX0NBQ0hFX1NJWkUgLSBwb3MpOworCW1lbXNldChrYWRkciArIHBvcywgdmFsdWUgPyAweGZmIDogMCwgbGVuKTsKKwljbnQgLT0gbGVuIDw8IDM7CisKKwkvKiBVcGRhdGUgQGxlbiB0byBwb2ludCB0byB0aGUgZmlyc3Qgbm90LWRvbmUgYnl0ZSBpbiB0aGUgcGFnZS4gKi8KKwlpZiAoY250IDwgOCkKKwkJbGVuICs9IHBvczsKKworCS8qIElmIHdlIGFyZSBub3QgaW4gdGhlIGxhc3QgcGFnZSwgZGVhbCB3aXRoIGFsbCBzdWJzZXF1ZW50IHBhZ2VzLiAqLworCXdoaWxlIChpbmRleCA8IGVuZF9pbmRleCkgeworCQlCVUdfT04oY250IDw9IDApOworCisJCS8qIFVwZGF0ZSBAaW5kZXggYW5kIGdldCB0aGUgbmV4dCBwYWdlLiAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWFwcGluZywgKytpbmRleCk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIHJvbGxiYWNrOworCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJLyoKKwkJICogRGVwZW5kaW5nIG9uIEB2YWx1ZSwgbW9kaWZ5IGFsbCByZW1haW5pbmcgd2hvbGUgYnl0ZXMgaW4gdGhlCisJCSAqIHBhZ2UgdXAgdG8gQGNudC4KKwkJICovCisJCWxlbiA9IG1pbl90KHM2NCwgY250ID4+IDMsIFBBR0VfQ0FDSEVfU0laRSk7CisJCW1lbXNldChrYWRkciwgdmFsdWUgPyAweGZmIDogMCwgbGVuKTsKKwkJY250IC09IGxlbiA8PCAzOworCX0KKwkvKgorCSAqIFRoZSBjdXJyZW50bHkgbWFwcGVkIHBhZ2UgaXMgdGhlIGxhc3Qgb25lLiAgSWYgdGhlIGxhc3QgYnl0ZSBpcworCSAqIHBhcnRpYWwsIG1vZGlmeSB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbiBpdC4gIE5vdGUsIEBsZW4gaXMgdGhlCisJICogcG9zaXRpb24gb2YgdGhlIGxhc3QgYnl0ZSBpbnNpZGUgdGhlIHBhZ2UuCisJICovCisJaWYgKGNudCkgeworCQl1OCAqYnl0ZTsKKworCQlCVUdfT04oY250ID4gNyk7CisKKwkJYml0ID0gY250OworCQlieXRlID0ga2FkZHIgKyBsZW47CisJCXdoaWxlIChiaXQtLSkgeworCQkJaWYgKHZhbHVlKQorCQkJCSpieXRlIHw9IDEgPDwgYml0OworCQkJZWxzZQorCQkJCSpieXRlICY9IH4oMSA8PCBiaXQpOworCQl9CisJfQorZG9uZToKKwkvKiBXZSBhcmUgZG9uZS4gIFVubWFwIHRoZSBwYWdlIGFuZCByZXR1cm4gc3VjY2Vzcy4gKi8KKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3JvbGxiYWNrOgorCS8qCisJICogQ3VycmVudCBzdGF0ZToKKwkgKgktIG5vIHBhZ2VzIGFyZSBtYXBwZWQKKwkgKgktIEBjb3VudCAtIEBjbnQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkCisJICovCisJaWYgKGlzX3JvbGxiYWNrKQorCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwlpZiAoY291bnQgIT0gY250KQorCQlwb3MgPSBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bih2aSwgc3RhcnRfYml0LCBjb3VudCAtIGNudCwKKwkJCQl2YWx1ZSA/IDAgOiAxLCBUUlVFKTsKKwllbHNlCisJCXBvcyA9IDA7CisJaWYgKCFwb3MpIHsKKwkJLyogUm9sbGJhY2sgd2FzIHN1Y2Nlc3NmdWwuICovCisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIHN1YnNlcXVlbnQgcGFnZSAoZXJyb3IgIgorCQkJCSIlbGkpLCBhYm9ydGluZy4iLCBQVFJfRVJSKHBhZ2UpKTsKKwl9IGVsc2UgeworCQkvKiBSb2xsYmFjayBmYWlsZWQuICovCisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIHN1YnNlcXVlbnQgcGFnZSAoZXJyb3IgIgorCQkJCSIlbGkpIGFuZCByb2xsYmFjayBmYWlsZWQgKGVycm9yICVpKS4gICIKKwkJCQkiQWJvcnRpbmcgYW5kIGxlYXZpbmcgaW5jb25zaXN0ZW50IG1ldGFkYXRhLiAgIgorCQkJCSJVbm1vdW50IGFuZCBydW4gY2hrZHNrLiIsIFBUUl9FUlIocGFnZSksIHBvcyk7CisJCU5Wb2xTZXRFcnJvcnMoTlRGU19TQih2aS0+aV9zYikpOworCX0KKwlyZXR1cm4gUFRSX0VSUihwYWdlKTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYml0bWFwLmggYi9mcy9udGZzL2JpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTBkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2JpdG1hcC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogYml0bWFwLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBiaXRtYXAgaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTCisgKgkgICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0JJVE1BUF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0JJVE1BUF9ICisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKworZXh0ZXJuIGludCBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgc3RhcnRfYml0LAorCQljb25zdCBzNjQgY291bnQsIGNvbnN0IHU4IHZhbHVlLCBjb25zdCBCT09MIGlzX3JvbGxiYWNrKTsKKworLyoqCisgKiBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4gLSBzZXQgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcCB0byBhIHZhbHVlCisgKiBAdmk6CQkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJCWZpcnN0IGJpdCB0byBzZXQKKyAqIEBjb3VudDoJCW51bWJlciBvZiBiaXRzIHRvIHNldAorICogQHZhbHVlOgkJdmFsdWUgdG8gc2V0IHRoZSBiaXRzIHRvIChpLmUuIDAgb3IgMSkKKyAqCisgKiBTZXQgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpIHRvIEB2YWx1ZSwgd2hlcmUgQHZhbHVlIGlzIGVpdGhlciAwIG9yIDEuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4oc3RydWN0IGlub2RlICp2aSwKKwkJY29uc3QgczY0IHN0YXJ0X2JpdCwgY29uc3QgczY0IGNvdW50LCBjb25zdCB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gX19udGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4odmksIHN0YXJ0X2JpdCwgY291bnQsIHZhbHVlLAorCQkJRkFMU0UpOworfQorCisvKioKKyAqIG50ZnNfYml0bWFwX3NldF9ydW4gLSBzZXQgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcAorICogQHZpOgkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJZmlyc3QgYml0IHRvIHNldAorICogQGNvdW50OgludW1iZXIgb2YgYml0cyB0byBzZXQKKyAqCisgKiBTZXQgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfc2V0X3J1bihzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgc3RhcnRfYml0LAorCQljb25zdCBzNjQgY291bnQpCit7CisJcmV0dXJuIG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bih2aSwgc3RhcnRfYml0LCBjb3VudCwgMSk7Cit9CisKKy8qKgorICogbnRmc19iaXRtYXBfY2xlYXJfcnVuIC0gY2xlYXIgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcAorICogQHZpOgkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJZmlyc3QgYml0IHRvIGNsZWFyCisgKiBAY291bnQ6CW51bWJlciBvZiBiaXRzIHRvIGNsZWFyCisgKgorICogQ2xlYXIgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfY2xlYXJfcnVuKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IHM2NCBzdGFydF9iaXQsCisJCWNvbnN0IHM2NCBjb3VudCkKK3sKKwlyZXR1cm4gbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKHZpLCBzdGFydF9iaXQsIGNvdW50LCAwKTsKK30KKworLyoqCisgKiBudGZzX2JpdG1hcF9zZXRfYml0IC0gc2V0IGEgYml0IGluIGEgYml0bWFwCisgKiBAdmk6CQl2ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYml0bWFwCisgKiBAYml0OgliaXQgdG8gc2V0CisgKgorICogU2V0IGJpdCBAYml0IGluIHRoZSBiaXRtYXAgZGVzY3JpYmVkIGJ5IHRoZSB2ZnMgaW5vZGUgQHZpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfc2V0X2JpdChzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgYml0KQoreworCXJldHVybiBudGZzX2JpdG1hcF9zZXRfcnVuKHZpLCBiaXQsIDEpOworfQorCisvKioKKyAqIG50ZnNfYml0bWFwX2NsZWFyX2JpdCAtIGNsZWFyIGEgYml0IGluIGEgYml0bWFwCisgKiBAdmk6CQl2ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYml0bWFwCisgKiBAYml0OgliaXQgdG8gY2xlYXIKKyAqCisgKiBDbGVhciBiaXQgQGJpdCBpbiB0aGUgYml0bWFwIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfYml0bWFwX2NsZWFyX2JpdChzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgYml0KQoreworCXJldHVybiBudGZzX2JpdG1hcF9jbGVhcl9ydW4odmksIGJpdCwgMSk7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIF9MSU5VWF9OVEZTX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2NvbGxhdGUuYyBiL2ZzL250ZnMvY29sbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjhhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2NvbGxhdGUuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIGNvbGxhdGUuYyAtIE5URlMga2VybmVsIGNvbGxhdGlvbiBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbGxhdGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworc3RhdGljIGludCBudGZzX2NvbGxhdGVfYmluYXJ5KG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbikKK3sKKwlpbnQgcmM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlyYyA9IG1lbWNtcChkYXRhMSwgZGF0YTIsIG1pbihkYXRhMV9sZW4sIGRhdGEyX2xlbikpOworCWlmICghcmMgJiYgKGRhdGExX2xlbiAhPSBkYXRhMl9sZW4pKSB7CisJCWlmIChkYXRhMV9sZW4gPCBkYXRhMl9sZW4pCisJCQlyYyA9IC0xOworCQllbHNlCisJCQlyYyA9IDE7CisJfQorCW50ZnNfZGVidWcoIkRvbmUsIHJldHVybmluZyAlaSIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbnRmc19jb2xsYXRlX250b2ZzX3Vsb25nKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbikKK3sKKwlpbnQgcmM7CisJdTMyIGQxLCBkMjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8vIEZJWE1FOiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gYnVnIGhlcmUuCisJQlVHX09OKGRhdGExX2xlbiAhPSBkYXRhMl9sZW4pOworCUJVR19PTihkYXRhMV9sZW4gIT0gNCk7CisJZDEgPSBsZTMyX3RvX2NwdXAoZGF0YTEpOworCWQyID0gbGUzMl90b19jcHVwKGRhdGEyKTsKKwlpZiAoZDEgPCBkMikKKwkJcmMgPSAtMTsKKwllbHNlIHsKKwkJaWYgKGQxID09IGQyKQorCQkJcmMgPSAwOworCQllbHNlCisJCQlyYyA9IDE7CisJfQorCW50ZnNfZGVidWcoIkRvbmUsIHJldHVybmluZyAlaSIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3R5cGVkZWYgaW50ICgqbnRmc19jb2xsYXRlX2Z1bmNfdCkobnRmc192b2x1bWUgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCBpbnQsCisJCWNvbnN0IHZvaWQgKiwgY29uc3QgaW50KTsKKworc3RhdGljIG50ZnNfY29sbGF0ZV9mdW5jX3QgbnRmc19kb19jb2xsYXRlMHgwWzNdID0geworCW50ZnNfY29sbGF0ZV9iaW5hcnksCisJTlVMTC8qbnRmc19jb2xsYXRlX2ZpbGVfbmFtZSovLAorCU5VTEwvKm50ZnNfY29sbGF0ZV91bmljb2RlX3N0cmluZyovLAorfTsKKworc3RhdGljIG50ZnNfY29sbGF0ZV9mdW5jX3QgbnRmc19kb19jb2xsYXRlMHgxWzRdID0geworCW50ZnNfY29sbGF0ZV9udG9mc191bG9uZywKKwlOVUxMLypudGZzX2NvbGxhdGVfbnRvZnNfc2lkKi8sCisJTlVMTC8qbnRmc19jb2xsYXRlX250b2ZzX3NlY3VyaXR5X2hhc2gqLywKKwlOVUxMLypudGZzX2NvbGxhdGVfbnRvZnNfdWxvbmdzKi8sCit9OworCisvKioKKyAqIG50ZnNfY29sbGF0ZSAtIGNvbGxhdGUgdHdvIGRhdGEgaXRlbXMgdXNpbmcgYSBzcGVjaWZpZWQgY29sbGF0aW9uIHJ1bGUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBkYXRhIGl0ZW1zIGJlbG9uZworICogQGNyOgkJY29sbGF0aW9uIHJ1bGUgdG8gdXNlIHdoZW4gY29tcGFyaW5nIHRoZSBpdGVtcworICogQGRhdGExOglmaXJzdCBkYXRhIGl0ZW0gdG8gY29sbGF0ZQorICogQGRhdGExX2xlbjoJbGVuZ3RoIGluIGJ5dGVzIG9mIEBkYXRhMQorICogQGRhdGEyOglzZWNvbmQgZGF0YSBpdGVtIHRvIGNvbGxhdGUKKyAqIEBkYXRhMl9sZW46CWxlbmd0aCBpbiBieXRlcyBvZiBAZGF0YTIKKyAqCisgKiBDb2xsYXRlIHRoZSB0d28gZGF0YSBpdGVtcyBAZGF0YTEgYW5kIEBkYXRhMiB1c2luZyB0aGUgY29sbGF0aW9uIHJ1bGUgQGNyCisgKiBhbmQgcmV0dXJuIC0xLCAwLCBpciAxIGlmIEBkYXRhMSBpcyBmb3VuZCwgcmVzcGVjdGl2ZWx5LCB0byBjb2xsYXRlIGJlZm9yZSwKKyAqIHRvIG1hdGNoLCBvciB0byBjb2xsYXRlIGFmdGVyIEBkYXRhMi4KKyAqCisgKiBGb3Igc3BlZWQgd2UgdXNlIHRoZSBjb2xsYXRpb24gcnVsZSBAY3IgYXMgYW4gaW5kZXggaW50byB0d28gdGFibGVzIG9mCisgKiBmdW5jdGlvbiBwb2ludGVycyB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZSBjb2xsYXRpb24gZnVuY3Rpb24uCisgKi8KK2ludCBudGZzX2NvbGxhdGUobnRmc192b2x1bWUgKnZvbCwgQ09MTEFUSU9OX1JVTEUgY3IsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbikgeworCWludCBpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyoKKwkgKiBGSVhNRTogIEF0IHRoZSBtb21lbnQgd2Ugb25seSBzdXBwb3J0IENPTExBVElPTl9CSU5BUlkgYW5kCisJICogQ09MTEFUSU9OX05UT0ZTX1VMT05HLCBzbyB3ZSBCVUcoKSBmb3IgZXZlcnl0aGluZyBlbHNlIGZvciBub3cuCisJICovCisJQlVHX09OKGNyICE9IENPTExBVElPTl9CSU5BUlkgJiYgY3IgIT0gQ09MTEFUSU9OX05UT0ZTX1VMT05HKTsKKwlpID0gbGUzMl90b19jcHUoY3IpOworCUJVR19PTihpIDwgMCk7CisJaWYgKGkgPD0gMHgwMikKKwkJcmV0dXJuIG50ZnNfZG9fY29sbGF0ZTB4MFtpXSh2b2wsIGRhdGExLCBkYXRhMV9sZW4sCisJCQkJZGF0YTIsIGRhdGEyX2xlbik7CisJQlVHX09OKGkgPCAweDEwKTsKKwlpIC09IDB4MTA7CisJaWYgKGxpa2VseShpIDw9IDMpKQorCQlyZXR1cm4gbnRmc19kb19jb2xsYXRlMHgxW2ldKHZvbCwgZGF0YTEsIGRhdGExX2xlbiwKKwkJCQlkYXRhMiwgZGF0YTJfbGVuKTsKKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvY29sbGF0ZS5oIGIvZnMvbnRmcy9jb2xsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyN2YzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvY29sbGF0ZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBjb2xsYXRlLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBjb2xsYXRpb24gaGFuZGxpbmcuICBQYXJ0IG9mIHRoZQorICoJICAgICAgIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19DT0xMQVRFX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfQ09MTEFURV9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorCitzdGF0aWMgaW5saW5lIEJPT0wgbnRmc19pc19jb2xsYXRpb25fcnVsZV9zdXBwb3J0ZWQoQ09MTEFUSU9OX1JVTEUgY3IpIHsKKwlpbnQgaTsKKworCS8qCisJICogRklYTUU6ICBBdCB0aGUgbW9tZW50IHdlIG9ubHkgc3VwcG9ydCBDT0xMQVRJT05fQklOQVJZIGFuZAorCSAqIENPTExBVElPTl9OVE9GU19VTE9ORywgc28gd2UgcmV0dXJuIGZhbHNlIGZvciBldmVyeXRoaW5nIGVsc2UgZm9yCisJICogbm93LgorCSAqLworCWlmICh1bmxpa2VseShjciAhPSBDT0xMQVRJT05fQklOQVJZICYmIGNyICE9IENPTExBVElPTl9OVE9GU19VTE9ORykpCisJCXJldHVybiBGQUxTRTsKKwlpID0gbGUzMl90b19jcHUoY3IpOworCWlmIChsaWtlbHkoKChpID49IDApICYmIChpIDw9IDB4MDIpKSB8fAorCQkJKChpID49IDB4MTApICYmIChpIDw9IDB4MTMpKSkpCisJCXJldHVybiBUUlVFOworCXJldHVybiBGQUxTRTsKK30KKworZXh0ZXJuIGludCBudGZzX2NvbGxhdGUobnRmc192b2x1bWUgKnZvbCwgQ09MTEFUSU9OX1JVTEUgY3IsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbik7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19DT0xMQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvY29tcHJlc3MuYyBiL2ZzL250ZnMvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVhZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9jb21wcmVzcy5jCkBAIC0wLDAgKzEsOTU3IEBACisvKioKKyAqIGNvbXByZXNzLmMgLSBOVEZTIGtlcm5lbCBjb21wcmVzc2VkIGF0dHJpYnV0ZXMgaGFuZGxpbmcuCisgKgkJUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfY29tcHJlc3Npb25fY29uc3RhbnRzIC0gZW51bSBvZiBjb25zdGFudHMgdXNlZCBpbiB0aGUgY29tcHJlc3Npb24gY29kZQorICovCit0eXBlZGVmIGVudW0geworCS8qIFRva2VuIHR5cGVzIGFuZCBhY2Nlc3MgbWFzay4gKi8KKwlOVEZTX1NZTUJPTF9UT0tFTgk9CTAsCisJTlRGU19QSFJBU0VfVE9LRU4JPQkxLAorCU5URlNfVE9LRU5fTUFTSwkJPQkxLAorCisJLyogQ29tcHJlc3Npb24gc3ViLWJsb2NrIGNvbnN0YW50cy4gKi8KKwlOVEZTX1NCX1NJWkVfTUFTSwk9CTB4MGZmZiwKKwlOVEZTX1NCX1NJWkUJCT0JMHgxMDAwLAorCU5URlNfU0JfSVNfQ09NUFJFU1NFRAk9CTB4ODAwMCwKKworCS8qCisJICogVGhlIG1heGltdW0gY29tcHJlc3Npb24gYmxvY2sgc2l6ZSBpcyBieSBkZWZpbml0aW9uIDE2ICogdGhlIGNsdXN0ZXIKKwkgKiBzaXplLCB3aXRoIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBjbHVzdGVyIHNpemUgYmVpbmcgNGtpQi4gVGh1cyB0aGUKKwkgKiBtYXhpbXVtIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIGlzIDY0a2lCLCBzbyB3ZSB1c2UgdGhpcyB3aGVuCisJICogaW5pdGlhbGl6aW5nIHRoZSBjb21wcmVzc2lvbiBidWZmZXIuCisJICovCisJTlRGU19NQVhfQ0JfU0laRQk9IDY0ICogMTAyNCwKK30gbnRmc19jb21wcmVzc2lvbl9jb25zdGFudHM7CisKKy8qKgorICogbnRmc19jb21wcmVzc2lvbl9idWZmZXIgLSBvbmUgYnVmZmVyIGZvciB0aGUgZGVjb21wcmVzc2lvbiBlbmdpbmUKKyAqLworc3RhdGljIHU4ICpudGZzX2NvbXByZXNzaW9uX2J1ZmZlciA9IE5VTEw7CisKKy8qKgorICogbnRmc19jYl9sb2NrIC0gc3BpbmxvY2sgd2hpY2ggcHJvdGVjdHMgbnRmc19jb21wcmVzc2lvbl9idWZmZXIKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhudGZzX2NiX2xvY2spOworCisvKioKKyAqIGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnMgLSBhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBidWZmZXJzCisgKgorICogQ2FsbGVyIGhhcyB0byBob2xkIHRoZSBudGZzX2xvY2sgc2VtYXBob3JlLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVOT01FTSBpZiB0aGUgYWxsb2NhdGlvbnMgZmFpbGVkLgorICovCitpbnQgYWxsb2NhdGVfY29tcHJlc3Npb25fYnVmZmVycyh2b2lkKQoreworCUJVR19PTihudGZzX2NvbXByZXNzaW9uX2J1ZmZlcik7CisKKwludGZzX2NvbXByZXNzaW9uX2J1ZmZlciA9IHZtYWxsb2MoTlRGU19NQVhfQ0JfU0laRSk7CisJaWYgKCFudGZzX2NvbXByZXNzaW9uX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnJlZV9jb21wcmVzc2lvbl9idWZmZXJzIC0gZnJlZSB0aGUgZGVjb21wcmVzc2lvbiBidWZmZXJzCisgKgorICogQ2FsbGVyIGhhcyB0byBob2xkIHRoZSBudGZzX2xvY2sgc2VtYXBob3JlLgorICovCit2b2lkIGZyZWVfY29tcHJlc3Npb25fYnVmZmVycyh2b2lkKQoreworCUJVR19PTighbnRmc19jb21wcmVzc2lvbl9idWZmZXIpOworCXZmcmVlKG50ZnNfY29tcHJlc3Npb25fYnVmZmVyKTsKKwludGZzX2NvbXByZXNzaW9uX2J1ZmZlciA9IE5VTEw7Cit9CisKKy8qKgorICogemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZSAtIHplcm8gb3V0IG9mIGJvdW5kcyBjb21wcmVzc2VkIHBhZ2UgcmVnaW9uCisgKi8KK3N0YXRpYyB2b2lkIHplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2UobnRmc19pbm9kZSAqbmksIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXU4ICprcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1bnNpZ25lZCBpbnQga3Bfb2ZzOworCisJbnRmc19kZWJ1ZygiWmVyb2luZyBwYWdlIHJlZ2lvbiBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUuIik7CisJaWYgKCgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IG5pLT5pbml0aWFsaXplZF9zaXplKSB7CisJCS8qCisJCSAqIEZJWE1FOiBVc2luZyBjbGVhcl9wYWdlKCkgd2lsbCBiZWNvbWUgd3Jvbmcgd2hlbiB3ZSBnZXQKKwkJICogUEFHRV9DQUNIRV9TSVpFICE9IFBBR0VfU0laRSBidXQgZm9yIG5vdyB0aGVyZSBpcyBubyBwcm9ibGVtLgorCQkgKi8KKwkJY2xlYXJfcGFnZShrcCk7CisJCXJldHVybjsKKwl9CisJa3Bfb2ZzID0gbmktPmluaXRpYWxpemVkX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCW1lbXNldChrcCArIGtwX29mcywgMCwgUEFHRV9DQUNIRV9TSVpFIC0ga3Bfb2ZzKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UgLSB0ZXN0IGZvciZoYW5kbGUgb3V0IG9mIGJvdW5kcyBjb21wcmVzc2VkIHBhZ2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKG50ZnNfaW5vZGUgKm5pLAorCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoKHBhZ2UtPmluZGV4ID49IChuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgJiYKKwkJCShuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8IFZGU19JKG5pKS0+aV9zaXplKSkKKwkJemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZShuaSwgcGFnZSk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfZGVjb21wcmVzcyAtIGRlY29tcHJlc3MgYSBjb21wcmVzc2lvbiBibG9jayBpbnRvIGFuIGFycmF5IG9mIHBhZ2VzCisgKiBAZGVzdF9wYWdlczoJCWRlc3RpbmF0aW9uIGFycmF5IG9mIHBhZ2VzCisgKiBAZGVzdF9pbmRleDoJCWN1cnJlbnQgaW5kZXggaW50byBAZGVzdF9wYWdlcyAoSU4vT1VUKQorICogQGRlc3Rfb2ZzOgkJY3VycmVudCBvZmZzZXQgd2l0aGluIEBkZXN0X3BhZ2VzW0BkZXN0X2luZGV4XSAoSU4vT1VUKQorICogQGRlc3RfbWF4X2luZGV4OgltYXhpbXVtIGluZGV4IGludG8gQGRlc3RfcGFnZXMgKElOKQorICogQGRlc3RfbWF4X29mczoJbWF4aW11bSBvZmZzZXQgd2l0aGluIEBkZXN0X3BhZ2VzW0BkZXN0X21heF9pbmRleF0gKElOKQorICogQHhwYWdlOgkJdGhlIHRhcmdldCBwYWdlICgtMSBpZiBub25lKSAoSU4pCisgKiBAeHBhZ2VfZG9uZToJCXNldCB0byAxIGlmIHhwYWdlIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IChJTi9PVVQpCisgKiBAY2Jfc3RhcnQ6CQljb21wcmVzc2lvbiBibG9jayB0byBkZWNvbXByZXNzIChJTikKKyAqIEBjYl9zaXplOgkJc2l6ZSBvZiBjb21wcmVzc2lvbiBibG9jayBAY2Jfc3RhcnQgaW4gYnl0ZXMgKElOKQorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIHByZWVtcHRpb24uIG50ZnNfZGVjb21wcmVzcygpIHJlZW5hYmxlcyBpdCB3aGVuCisgKiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyBmaW5pc2hlZC4KKyAqCisgKiBUaGlzIGRlY29tcHJlc3NlcyB0aGUgY29tcHJlc3Npb24gYmxvY2sgQGNiX3N0YXJ0IGludG8gdGhlIGFycmF5IG9mCisgKiBkZXN0aW5hdGlvbiBwYWdlcyBAZGVzdF9wYWdlcyBzdGFydGluZyBhdCBpbmRleCBAZGVzdF9pbmRleCBpbnRvIEBkZXN0X3BhZ2VzCisgKiBhbmQgYXQgb2Zmc2V0IEBkZXN0X3BvcyBpbnRvIHRoZSBwYWdlIEBkZXN0X3BhZ2VzW0BkZXN0X2luZGV4XS4KKyAqCisgKiBXaGVuIHRoZSBwYWdlIEBkZXN0X3BhZ2VzW0B4cGFnZV0gaXMgY29tcGxldGVkLCBAeHBhZ2VfZG9uZSBpcyBzZXQgdG8gMS4KKyAqIElmIHhwYWdlIGlzIC0xIG9yIEB4cGFnZSBoYXMgbm90IGJlZW4gY29tcGxldGVkLCBAeHBhZ2VfZG9uZSBpcyBub3QgbW9kaWZpZWQuCisgKgorICogQGNiX3N0YXJ0IGlzIGEgcG9pbnRlciB0byB0aGUgY29tcHJlc3Npb24gYmxvY2sgd2hpY2ggbmVlZHMgZGVjb21wcmVzc2luZworICogYW5kIEBjYl9zaXplIGlzIHRoZSBzaXplIG9mIEBjYl9zdGFydCBpbiBieXRlcyAoOC02NGtpQikuCisgKgorICogUmV0dXJuIDAgaWYgc3VjY2VzcyBvciAtRU9WRVJGTE9XIG9uIGVycm9yIGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4KKyAqIEB4cGFnZV9kb25lIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0YXJnZXQgcGFnZSAoQGRlc3RfcGFnZXNbQHhwYWdlXSkgd2FzCisgKiBjb21wbGV0ZWQgZHVyaW5nIHRoZSBkZWNvbXByZXNzaW9uIG9mIHRoZSBjb21wcmVzc2lvbiBibG9jayAoQGNiX3N0YXJ0KS4KKyAqCisgKiBXYXJuaW5nOiBUaGlzIGZ1bmN0aW9uICpSRVFVSVJFUyogUEFHRV9DQUNIRV9TSVpFID49IDQwOTYgb3IgaXQgd2lsbCBibG93IHVwCisgKiB1bnByZWRpY2F0Ymx5ISBZb3UgaGF2ZSBiZWVuIHdhcm5lZCEKKyAqCisgKiBOb3RlIHRvIGhhY2tlcnM6IFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBzbGVlcCB1bnRpbCBpdCBoYXMgZmluaXNoZWQgYWNjZXNzaW5nCisgKiB0aGUgY29tcHJlc3Npb24gYmxvY2sgQGNiX3N0YXJ0IGFzIGl0IGlzIGEgcGVyLUNQVSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19kZWNvbXByZXNzKHN0cnVjdCBwYWdlICpkZXN0X3BhZ2VzW10sIGludCAqZGVzdF9pbmRleCwKKwkJaW50ICpkZXN0X29mcywgY29uc3QgaW50IGRlc3RfbWF4X2luZGV4LCBjb25zdCBpbnQgZGVzdF9tYXhfb2ZzLAorCQljb25zdCBpbnQgeHBhZ2UsIGNoYXIgKnhwYWdlX2RvbmUsIHU4ICpjb25zdCBjYl9zdGFydCwKKwkJY29uc3QgdTMyIGNiX3NpemUpCit7CisJLyoKKwkgKiBQb2ludGVycyBpbnRvIHRoZSBjb21wcmVzc2VkIGRhdGEsIGkuZS4gdGhlIGNvbXByZXNzaW9uIGJsb2NrIChjYiksCisJICogYW5kIHRoZSB0aGVyZWluIGNvbnRhaW5lZCBzdWItYmxvY2tzIChzYikuCisJICovCisJdTggKmNiX2VuZCA9IGNiX3N0YXJ0ICsgY2Jfc2l6ZTsgLyogRW5kIG9mIGNiLiAqLworCXU4ICpjYiA9IGNiX3N0YXJ0OwkvKiBDdXJyZW50IHBvc2l0aW9uIGluIGNiLiAqLworCXU4ICpjYl9zYl9zdGFydCA9IGNiOwkvKiBCZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgc2IgaW4gdGhlIGNiLiAqLworCXU4ICpjYl9zYl9lbmQ7CQkvKiBFbmQgb2YgY3VycmVudCBzYiAvIGJlZ2lubmluZyBvZiBuZXh0IHNiLiAqLworCisJLyogVmFyaWFibGVzIGZvciB1bmNvbXByZXNzZWQgZGF0YSAvIGRlc3RpbmF0aW9uLiAqLworCXN0cnVjdCBwYWdlICpkcDsJLyogQ3VycmVudCBkZXN0aW5hdGlvbiBwYWdlIGJlaW5nIHdvcmtlZCBvbi4gKi8KKwl1OCAqZHBfYWRkcjsJCS8qIEN1cnJlbnQgcG9pbnRlciBpbnRvIGRwLiAqLworCXU4ICpkcF9zYl9zdGFydDsJLyogU3RhcnQgb2YgY3VycmVudCBzdWItYmxvY2sgaW4gZHAuICovCisJdTggKmRwX3NiX2VuZDsJCS8qIEVuZCBvZiBjdXJyZW50IHNiIGluIGRwIChkcF9zYl9zdGFydCArCisJCQkJICAgTlRGU19TQl9TSVpFKS4gKi8KKwl1MTYgZG9fc2Jfc3RhcnQ7CS8qIEBkZXN0X29mcyB3aGVuIHN0YXJ0aW5nIHRoaXMgc3ViLWJsb2NrLiAqLworCXUxNiBkb19zYl9lbmQ7CQkvKiBAZGVzdF9vZnMgb2YgZW5kIG9mIHRoaXMgc2IgKGRvX3NiX3N0YXJ0ICsKKwkJCQkgICBOVEZTX1NCX1NJWkUpLiAqLworCisJLyogVmFyaWFibGVzIGZvciB0YWcgYW5kIHRva2VuIHBhcnNpbmcuICovCisJdTggdGFnOwkJCS8qIEN1cnJlbnQgdGFnLiAqLworCWludCB0b2tlbjsJCS8qIExvb3AgY291bnRlciBmb3IgdGhlIGVpZ2h0IHRva2VucyBpbiB0YWcuICovCisKKwkvKiBOZWVkIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCBzbGVlcCwgc28gbmVlZCB0d28gc3RhZ2VzLiAqLworCWludCBjb21wbGV0ZWRfcGFnZXNbZGVzdF9tYXhfaW5kZXggLSAqZGVzdF9pbmRleCArIDFdOworCWludCBucl9jb21wbGV0ZWRfcGFnZXMgPSAwOworCisJLyogRGVmYXVsdCBlcnJvciBjb2RlLiAqLworCWludCBlcnIgPSAtRU9WRVJGTE9XOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcsIGNiX3NpemUgPSAweCV4LiIsIGNiX3NpemUpOworZG9fbmV4dF9zYjoKKwludGZzX2RlYnVnKCJCZWdpbm5pbmcgc3ViLWJsb2NrIGF0IG9mZnNldCA9IDB4JXp4IGluIHRoZSBjYi4iLAorCQkJY2IgLSBjYl9zdGFydCk7CisJLyoKKwkgKiBIYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3Npb24gYmxvY2sgb3IgdGhlIGVuZCBvZiB0aGUKKwkgKiBkZWNvbXByZXNzZWQgZGF0YT8gIFRoZSBsYXR0ZXIgY2FuIGhhcHBlbiBmb3IgZXhhbXBsZSBpZiB0aGUgY3VycmVudAorCSAqIHBvc2l0aW9uIGluIHRoZSBjb21wcmVzc2lvbiBibG9jayBpcyBvbmUgYnl0ZSBiZWZvcmUgaXRzIGVuZCBzbyB0aGUKKwkgKiBmaXJzdCB0d28gY2hlY2tzIGRvIG5vdCBkZXRlY3QgaXQuCisJICovCisJaWYgKGNiID09IGNiX2VuZCB8fCAhbGUxNl90b19jcHVwKChsZTE2KiljYikgfHwKKwkJCSgqZGVzdF9pbmRleCA9PSBkZXN0X21heF9pbmRleCAmJgorCQkJKmRlc3Rfb2ZzID09IGRlc3RfbWF4X29mcykpIHsKKwkJaW50IGk7CisKKwkJbnRmc19kZWJ1ZygiQ29tcGxldGVkLiBSZXR1cm5pbmcgc3VjY2VzcyAoMCkuIik7CisJCWVyciA9IDA7CityZXR1cm5fZXJyb3I6CisJCS8qIFdlIGNhbiBzbGVlcCBmcm9tIG5vdyBvbiwgc28gd2UgZHJvcCBsb2NrLiAqLworCQlzcGluX3VubG9jaygmbnRmc19jYl9sb2NrKTsKKwkJLyogU2Vjb25kIHN0YWdlOiBmaW5hbGl6ZSBjb21wbGV0ZWQgcGFnZXMuICovCisJCWlmIChucl9jb21wbGV0ZWRfcGFnZXMgPiAwKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGRlc3RfcGFnZXNbY29tcGxldGVkX3BhZ2VzWzBdXTsKKwkJCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfY29tcGxldGVkX3BhZ2VzOyBpKyspIHsKKwkJCQlpbnQgZGkgPSBjb21wbGV0ZWRfcGFnZXNbaV07CisKKwkJCQlkcCA9IGRlc3RfcGFnZXNbZGldOworCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIG91dHNpZGUgdGhlIGluaXRpYWxpemVkIHNpemUsIHplcm8KKwkJCQkgKiB0aGUgb3V0IG9mIGJvdW5kcyBwYWdlIHJhbmdlLgorCQkJCSAqLworCQkJCWhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKG5pLCBkcCk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoZHApOworCQkJCWt1bm1hcChkcCk7CisJCQkJU2V0UGFnZVVwdG9kYXRlKGRwKTsKKwkJCQl1bmxvY2tfcGFnZShkcCk7CisJCQkJaWYgKGRpID09IHhwYWdlKQorCQkJCQkqeHBhZ2VfZG9uZSA9IDE7CisJCQkJZWxzZQorCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZHApOworCQkJCWRlc3RfcGFnZXNbZGldID0gTlVMTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldHVwIG9mZnNldHMgZm9yIHRoZSBjdXJyZW50IHN1Yi1ibG9jayBkZXN0aW5hdGlvbi4gKi8KKwlkb19zYl9zdGFydCA9ICpkZXN0X29mczsKKwlkb19zYl9lbmQgPSBkb19zYl9zdGFydCArIE5URlNfU0JfU0laRTsKKworCS8qIENoZWNrIHRoYXQgd2UgYXJlIHN0aWxsIHdpdGhpbiBhbGxvd2VkIGJvdW5kYXJpZXMuICovCisJaWYgKCpkZXN0X2luZGV4ID09IGRlc3RfbWF4X2luZGV4ICYmIGRvX3NiX2VuZCA+IGRlc3RfbWF4X29mcykKKwkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkvKiBEb2VzIHRoZSBtaW5pbXVtIHNpemUgb2YgYSBjb21wcmVzc2VkIHNiIG92ZXJmbG93IHZhbGlkIHJhbmdlPyAqLworCWlmIChjYiArIDYgPiBjYl9lbmQpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogU2V0dXAgdGhlIGN1cnJlbnQgc3ViLWJsb2NrIHNvdXJjZSBwb2ludGVycyBhbmQgdmFsaWRhdGUgcmFuZ2UuICovCisJY2Jfc2Jfc3RhcnQgPSBjYjsKKwljYl9zYl9lbmQgPSBjYl9zYl9zdGFydCArIChsZTE2X3RvX2NwdXAoKGxlMTYqKWNiKSAmIE5URlNfU0JfU0laRV9NQVNLKQorCQkJKyAzOworCWlmIChjYl9zYl9lbmQgPiBjYl9lbmQpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogR2V0IHRoZSBjdXJyZW50IGRlc3RpbmF0aW9uIHBhZ2UuICovCisJZHAgPSBkZXN0X3BhZ2VzWypkZXN0X2luZGV4XTsKKwlpZiAoIWRwKSB7CisJCS8qIE5vIHBhZ2UgcHJlc2VudC4gU2tpcCBkZWNvbXByZXNzaW9uIG9mIHRoaXMgc3ViLWJsb2NrLiAqLworCQljYiA9IGNiX3NiX2VuZDsKKworCQkvKiBBZHZhbmNlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIHRvIG5leHQgc3ViLWJsb2NrLiAqLworCQkqZGVzdF9vZnMgPSAoKmRlc3Rfb2ZzICsgTlRGU19TQl9TSVpFKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWlmICghKmRlc3Rfb2ZzICYmICgrKypkZXN0X2luZGV4ID4gZGVzdF9tYXhfaW5kZXgpKQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisJCWdvdG8gZG9fbmV4dF9zYjsKKwl9CisKKwkvKiBXZSBoYXZlIGEgdmFsaWQgZGVzdGluYXRpb24gcGFnZS4gU2V0dXAgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXJzLiAqLworCWRwX2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhkcCkgKyBkb19zYl9zdGFydDsKKworCS8qIE5vdywgd2UgYXJlIHJlYWR5IHRvIHByb2Nlc3MgdGhlIGN1cnJlbnQgc3ViLWJsb2NrIChzYikuICovCisJaWYgKCEobGUxNl90b19jcHVwKChsZTE2KiljYikgJiBOVEZTX1NCX0lTX0NPTVBSRVNTRUQpKSB7CisJCW50ZnNfZGVidWcoIkZvdW5kIHVuY29tcHJlc3NlZCBzdWItYmxvY2suIik7CisJCS8qIFRoaXMgc2IgaXMgbm90IGNvbXByZXNzZWQsIGp1c3QgY29weSBpdCBpbnRvIGRlc3RpbmF0aW9uLiAqLworCisJCS8qIEFkdmFuY2Ugc291cmNlIHBvc2l0aW9uIHRvIGZpcnN0IGRhdGEgYnl0ZS4gKi8KKwkJY2IgKz0gMjsKKworCQkvKiBBbiB1bmNvbXByZXNzZWQgc2IgbXVzdCBiZSBmdWxsIHNpemUuICovCisJCWlmIChjYl9zYl9lbmQgLSBjYiAhPSBOVEZTX1NCX1NJWkUpCisJCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKworCQkvKiBDb3B5IHRoZSBibG9jayBhbmQgYWR2YW5jZSB0aGUgc291cmNlIHBvc2l0aW9uLiAqLworCQltZW1jcHkoZHBfYWRkciwgY2IsIE5URlNfU0JfU0laRSk7CisJCWNiICs9IE5URlNfU0JfU0laRTsKKworCQkvKiBBZHZhbmNlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIHRvIG5leHQgc3ViLWJsb2NrLiAqLworCQkqZGVzdF9vZnMgKz0gTlRGU19TQl9TSVpFOworCQlpZiAoISgqZGVzdF9vZnMgJj0gflBBR0VfQ0FDSEVfTUFTSykpIHsKK2ZpbmFsaXplX3BhZ2U6CisJCQkvKgorCQkJICogRmlyc3Qgc3RhZ2U6IGFkZCBjdXJyZW50IHBhZ2UgaW5kZXggdG8gYXJyYXkgb2YKKwkJCSAqIGNvbXBsZXRlZCBwYWdlcy4KKwkJCSAqLworCQkJY29tcGxldGVkX3BhZ2VzW25yX2NvbXBsZXRlZF9wYWdlcysrXSA9ICpkZXN0X2luZGV4OworCQkJaWYgKCsrKmRlc3RfaW5kZXggPiBkZXN0X21heF9pbmRleCkKKwkJCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKwkJfQorCQlnb3RvIGRvX25leHRfc2I7CisJfQorCW50ZnNfZGVidWcoIkZvdW5kIGNvbXByZXNzZWQgc3ViLWJsb2NrLiIpOworCS8qIFRoaXMgc2IgaXMgY29tcHJlc3NlZCwgZGVjb21wcmVzcyBpdCBpbnRvIGRlc3RpbmF0aW9uLiAqLworCisJLyogU2V0dXAgZGVzdGluYXRpb24gcG9pbnRlcnMuICovCisJZHBfc2Jfc3RhcnQgPSBkcF9hZGRyOworCWRwX3NiX2VuZCA9IGRwX3NiX3N0YXJ0ICsgTlRGU19TQl9TSVpFOworCisJLyogRm9yd2FyZCB0byB0aGUgZmlyc3QgdGFnIGluIHRoZSBzdWItYmxvY2suICovCisJY2IgKz0gMjsKK2RvX25leHRfdGFnOgorCWlmIChjYiA9PSBjYl9zYl9lbmQpIHsKKwkJLyogQ2hlY2sgaWYgdGhlIGRlY29tcHJlc3NlZCBzdWItYmxvY2sgd2FzIG5vdCBmdWxsLWxlbmd0aC4gKi8KKwkJaWYgKGRwX2FkZHIgPCBkcF9zYl9lbmQpIHsKKwkJCWludCBucl9ieXRlcyA9IGRvX3NiX2VuZCAtICpkZXN0X29mczsKKworCQkJbnRmc19kZWJ1ZygiRmlsbGluZyBpbmNvbXBsZXRlIHN1Yi1ibG9jayB3aXRoICIKKwkJCQkJInplcm9lcy4iKTsKKwkJCS8qIFplcm8gcmVtYWluZGVyIGFuZCB1cGRhdGUgZGVzdGluYXRpb24gcG9zaXRpb24uICovCisJCQltZW1zZXQoZHBfYWRkciwgMCwgbnJfYnl0ZXMpOworCQkJKmRlc3Rfb2ZzICs9IG5yX2J5dGVzOworCQl9CisJCS8qIFdlIGhhdmUgZmluaXNoZWQgdGhlIGN1cnJlbnQgc3ViLWJsb2NrLiAqLworCQlpZiAoISgqZGVzdF9vZnMgJj0gflBBR0VfQ0FDSEVfTUFTSykpCisJCQlnb3RvIGZpbmFsaXplX3BhZ2U7CisJCWdvdG8gZG9fbmV4dF9zYjsKKwl9CisKKwkvKiBDaGVjayB3ZSBhcmUgc3RpbGwgaW4gcmFuZ2UuICovCisJaWYgKGNiID4gY2Jfc2JfZW5kIHx8IGRwX2FkZHIgPiBkcF9zYl9lbmQpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogR2V0IHRoZSBuZXh0IHRhZyBhbmQgYWR2YW5jZSB0byBmaXJzdCB0b2tlbi4gKi8KKwl0YWcgPSAqY2IrKzsKKworCS8qIFBhcnNlIHRoZSBlaWdodCB0b2tlbnMgZGVzY3JpYmVkIGJ5IHRoZSB0YWcuICovCisJZm9yICh0b2tlbiA9IDA7IHRva2VuIDwgODsgdG9rZW4rKywgdGFnID4+PSAxKSB7CisJCXUxNiBsZywgcHQsIGxlbmd0aCwgbWF4X25vbl9vdmVybGFwOworCQlyZWdpc3RlciB1MTYgaTsKKwkJdTggKmRwX2JhY2tfYWRkcjsKKworCQkvKiBDaGVjayBpZiB3ZSBhcmUgZG9uZSAvIHN0aWxsIGluIHJhbmdlLiAqLworCQlpZiAoY2IgPj0gY2Jfc2JfZW5kIHx8IGRwX2FkZHIgPiBkcF9zYl9lbmQpCisJCQlicmVhazsKKworCQkvKiBEZXRlcm1pbmUgdG9rZW4gdHlwZSBhbmQgcGFyc2UgYXBwcm9wcmlhdGVseS4qLworCQlpZiAoKHRhZyAmIE5URlNfVE9LRU5fTUFTSykgPT0gTlRGU19TWU1CT0xfVE9LRU4pIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgc3ltYm9sIHRva2VuLCBjb3B5IHRoZSBzeW1ib2wgYWNyb3NzLCBhbmQKKwkJCSAqIGFkdmFuY2UgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9zaXRpb25zLgorCQkJICovCisJCQkqZHBfYWRkcisrID0gKmNiKys7CisJCQkrKypkZXN0X29mczsKKworCQkJLyogQ29udGludWUgd2l0aCB0aGUgbmV4dCB0b2tlbi4gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHBocmFzZSB0b2tlbi4gTWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgZmlyc3QgdGFnIGluCisJCSAqIHRoZSBzYiBhcyB0aGlzIGlzIGlsbGVnYWwgYW5kIHdvdWxkIGNvbmZ1c2UgdGhlIGNvZGUgYmVsb3cuCisJCSAqLworCQlpZiAoZHBfYWRkciA9PSBkcF9zYl9zdGFydCkKKwkJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJCS8qCisJCSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdvIGJhY2sgKHApIGFuZCB0aGUgbnVtYmVyCisJCSAqIG9mIGJ5dGVzIHRvIGNvcHkgKGwpLiBXZSB1c2UgYW4gb3B0aW1pemVkIGFsZ29yaXRobSBpbiB3aGljaAorCQkgKiB3ZSBmaXJzdCBjYWxjdWxhdGUgbG9nMihjdXJyZW50IGRlc3RpbmF0aW9uIHBvc2l0aW9uIGluIHNiKSwKKwkJICogd2hpY2ggYWxsb3dzIGRldGVybWluYXRpb24gb2YgbCBhbmQgcCBpbiBPKDEpIHJhdGhlciB0aGFuCisJCSAqIE8obikuIFdlIGp1c3QgbmVlZCBhbiBhcmNoLW9wdGltaXplZCBsb2cyKCkgZnVuY3Rpb24gbm93LgorCQkgKi8KKwkJbGcgPSAwOworCQlmb3IgKGkgPSAqZGVzdF9vZnMgLSBkb19zYl9zdGFydCAtIDE7IGkgPj0gMHgxMDsgaSA+Pj0gMSkKKwkJCWxnKys7CisKKwkJLyogR2V0IHRoZSBwaHJhc2UgdG9rZW4gaW50byBpLiAqLworCQlwdCA9IGxlMTZfdG9fY3B1cCgobGUxNiopY2IpOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgYnl0ZSBzZXF1ZW5jZSBpbgorCQkgKiB0aGUgZGVzdGluYXRpb24gdXNpbmcgdGhlIGZhY3QgdGhhdCBwID0gKHB0ID4+ICgxMiAtIGxnKSkgKyAxCisJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ28gdG9vIGZhciBiYWNrLgorCQkgKi8KKwkJZHBfYmFja19hZGRyID0gZHBfYWRkciAtIChwdCA+PiAoMTIgLSBsZykpIC0gMTsKKwkJaWYgKGRwX2JhY2tfYWRkciA8IGRwX3NiX3N0YXJ0KQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkJLyogTm93IGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIHNlcXVlbmNlLiAqLworCQlsZW5ndGggPSAocHQgJiAoMHhmZmYgPj4gbGcpKSArIDM7CisKKwkJLyogQWR2YW5jZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBhbmQgdmVyaWZ5IGl0IGlzIGluIHJhbmdlLiAqLworCQkqZGVzdF9vZnMgKz0gbGVuZ3RoOworCQlpZiAoKmRlc3Rfb2ZzID4gZG9fc2JfZW5kKQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkJLyogVGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgYnl0ZXMuICovCisJCW1heF9ub25fb3ZlcmxhcCA9IGRwX2FkZHIgLSBkcF9iYWNrX2FkZHI7CisKKwkJaWYgKGxlbmd0aCA8PSBtYXhfbm9uX292ZXJsYXApIHsKKwkJCS8qIFRoZSBieXRlIHNlcXVlbmNlIGRvZXNuJ3Qgb3ZlcmxhcCwganVzdCBjb3B5IGl0LiAqLworCQkJbWVtY3B5KGRwX2FkZHIsIGRwX2JhY2tfYWRkciwgbGVuZ3RoKTsKKworCQkJLyogQWR2YW5jZSBkZXN0aW5hdGlvbiBwb2ludGVyLiAqLworCQkJZHBfYWRkciArPSBsZW5ndGg7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIGJ5dGUgc2VxdWVuY2UgZG9lcyBvdmVybGFwLCBjb3B5IG5vbi1vdmVybGFwcGluZworCQkJICogcGFydCBhbmQgdGhlbiBkbyBhIHNsb3cgYnl0ZSBieSBieXRlIGNvcHkgZm9yIHRoZQorCQkJICogb3ZlcmxhcHBpbmcgcGFydC4gQWxzbywgYWR2YW5jZSB0aGUgZGVzdGluYXRpb24KKwkJCSAqIHBvaW50ZXIuCisJCQkgKi8KKwkJCW1lbWNweShkcF9hZGRyLCBkcF9iYWNrX2FkZHIsIG1heF9ub25fb3ZlcmxhcCk7CisJCQlkcF9hZGRyICs9IG1heF9ub25fb3ZlcmxhcDsKKwkJCWRwX2JhY2tfYWRkciArPSBtYXhfbm9uX292ZXJsYXA7CisJCQlsZW5ndGggLT0gbWF4X25vbl9vdmVybGFwOworCQkJd2hpbGUgKGxlbmd0aC0tKQorCQkJCSpkcF9hZGRyKysgPSAqZHBfYmFja19hZGRyKys7CisJCX0KKworCQkvKiBBZHZhbmNlIHNvdXJjZSBwb3NpdGlvbiBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCB0b2tlbi4gKi8KKwkJY2IgKz0gMjsKKwl9CisKKwkvKiBObyB0b2tlbnMgbGVmdCBpbiB0aGUgY3VycmVudCB0YWcuIENvbnRpbnVlIHdpdGggdGhlIG5leHQgdGFnLiAqLworCWdvdG8gZG9fbmV4dF90YWc7CisKK3JldHVybl9vdmVyZmxvdzoKKwludGZzX2Vycm9yKE5VTEwsICJGYWlsZWQuIFJldHVybmluZyAtRU9WRVJGTE9XLiIpOworCWdvdG8gcmV0dXJuX2Vycm9yOworfQorCisvKioKKyAqIG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrIC0gcmVhZCBhIGNvbXByZXNzZWQgYmxvY2sgaW50byB0aGUgcGFnZSBjYWNoZQorICogQHBhZ2U6CWxvY2tlZCBwYWdlIGluIHRoZSBjb21wcmVzc2lvbiBibG9jayhzKSB3ZSBuZWVkIHRvIHJlYWQKKyAqCisgKiBXaGVuIHdlIGFyZSBjYWxsZWQgdGhlIHBhZ2UgaGFzIGFscmVhZHkgYmVlbiB2ZXJpZmllZCB0byBiZSBsb2NrZWQgYW5kIHRoZQorICogYXR0cmlidXRlIGlzIGtub3duIHRvIGJlIG5vbi1yZXNpZGVudCwgbm90IGVuY3J5cHRlZCwgYnV0IGNvbXByZXNzZWQuCisgKgorICogMS4gRGV0ZXJtaW5lIHdoaWNoIGNvbXByZXNzaW9uIGJsb2NrKHMpIEBwYWdlIGlzIGluLgorICogMi4gR2V0IGhvbGQgb2YgYWxsIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcy90aGVzZSBjb21wcmVzc2lvbiBibG9jayhzKS4KKyAqIDMuIFJlYWQgdGhlIChmaXJzdCkgY29tcHJlc3Npb24gYmxvY2suCisgKiA0LiBEZWNvbXByZXNzIGl0IGludG8gdGhlIGNvcnJlc3BvbmRpbmcgcGFnZXMuCisgKiA1LiBUaHJvdyB0aGUgY29tcHJlc3NlZCBkYXRhIGF3YXkgYW5kIHByb2NlZWQgdG8gMy4gZm9yIHRoZSBuZXh0IGNvbXByZXNzaW9uCisgKiAgICBibG9jayBvciByZXR1cm4gc3VjY2VzcyBpZiBubyBtb3JlIGNvbXByZXNzaW9uIGJsb2NrcyBsZWZ0LgorICoKKyAqIFdhcm5pbmc6IFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGF0IHdlIGRvIGFib3V0IGV4aXN0aW5nIHBhZ2VzLiBUaGV5IG1pZ2h0CisgKiBoYXZlIGJlZW4gd3JpdHRlbiB0byBzbyB0aGF0IHdlIHdvdWxkIGxvc2UgZGF0YSBpZiB3ZSB3ZXJlIHRvIGp1c3Qgb3ZlcndyaXRlCisgKiB0aGVtIHdpdGggdGhlIG91dC1vZi1kYXRlIHVuY29tcHJlc3NlZCBkYXRhLgorICoKKyAqIEZJWE1FOiBGb3IgUEFHRV9DQUNIRV9TSVpFID4gY2Jfc2l6ZSB3ZSBhcmUgbm90IGRvaW5nIHRoZSBSaWdodCBUaGluZyhUTSkgYXQKKyAqIHRoZSBlbmQgb2YgdGhlIGZpbGUgSSB0aGluay4gV2UgbmVlZCB0byBkZXRlY3QgdGhpcyBjYXNlIGFuZCB6ZXJvIHRoZSBvdXQKKyAqIG9mIGJvdW5kcyByZW1haW5kZXIgb2YgdGhlIHBhZ2UgaW4gcXVlc3Rpb24gYW5kIG1hcmsgaXQgYXMgaGFuZGxlZC4gQXQgdGhlCisgKiBtb21lbnQgd2Ugd291bGQganVzdCByZXR1cm4gLUVJTyBvbiBzdWNoIGEgcGFnZS4gVGhpcyBidWcgd2lsbCBvbmx5IGJlY29tZQorICogYXBwYXJlbnQgaWYgcGFnZXMgYXJlIGFib3ZlIDhraUIgYW5kIHRoZSBOVEZTIHZvbHVtZSBvbmx5IHVzZXMgNTEyIGJ5dGUKKyAqIGNsdXN0ZXJzIHNvIGlzIHByb2JhYmx5IG5vdCBnb2luZyB0byBiZSBzZWVuIGJ5IGFueW9uZS4gU3RpbGwgdGhpcyBzaG91bGQKKyAqIGJlIGZpeGVkLiAoQUlBKQorICoKKyAqIEZJWE1FOiBBZ2FpbiBmb3IgUEFHRV9DQUNIRV9TSVpFID4gY2Jfc2l6ZSB3ZSBhcmUgc2NyZXdpbmcgdXAgYm90aCBpbgorICogaGFuZGxpbmcgc3BhcnNlIGFuZCBjb21wcmVzc2VkIGNicy4gKEFJQSkKKyAqCisgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBkbyBhbnkgemVyb2luZyBvdXQgaW4gdGhlIGNhc2UgdGhhdAorICogaW5pdGlhbGl6ZWRfc2l6ZSBpcyBsZXNzIHRoYW4gZGF0YV9zaXplLiBUaGlzIHNob3VsZCBiZSBzYWZlIGJlY2F1c2Ugb2YgdGhlCisgKiBuYXR1cmUgb2YgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSB1c2VkLiBKdXN0IGluIGNhc2Ugd2UgY2hlY2sgYW5kIG91dHB1dAorICogYW4gZXJyb3IgbWVzc2FnZSBpbiByZWFkIGlub2RlIGlmIHRoZSB0d28gc2l6ZXMgYXJlIG5vdCBlcXVhbCBmb3IgYQorICogY29tcHJlc3NlZCBmaWxlLiAoQUlBKQorICovCitpbnQgbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKG1hcHBpbmctPmhvc3QpOworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJdW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGNoYXIgYmxvY2tfc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdTggKmNiLCAqY2JfcG9zLCAqY2JfZW5kOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoczsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgaW5kZXggPSBwYWdlLT5pbmRleDsKKwl1MzIgY2Jfc2l6ZSA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemU7CisJdTY0IGNiX3NpemVfbWFzayA9IGNiX3NpemUgLSAxVUw7CisJVkNOIHZjbjsKKwlMQ04gbGNuOworCS8qIFRoZSBmaXJzdCB3YW50ZWQgdmNuIChtaW5pbXVtIGFsaWdubWVudCBpcyBQQUdFX0NBQ0hFX1NJWkUpLiAqLworCVZDTiBzdGFydF92Y24gPSAoKChzNjQpaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgJiB+Y2Jfc2l6ZV9tYXNrKSA+PgorCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkvKgorCSAqIFRoZSBmaXJzdCB2Y24gYWZ0ZXIgdGhlIGxhc3Qgd2FudGVkIHZjbiAobWludW11bSBhbGlnbm1lbnQgaXMgYWdhaW4KKwkgKiBQQUdFX0NBQ0hFX1NJWkUuCisJICovCisJVkNOIGVuZF92Y24gPSAoKCgoczY0KShpbmRleCArIDFVTCkgPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBjYl9zaXplIC0gMSkKKwkJCSYgfmNiX3NpemVfbWFzaykgPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkvKiBOdW1iZXIgb2YgY29tcHJlc3Npb24gYmxvY2tzIChjYnMpIGluIHRoZSB3YW50ZWQgdmNuIHJhbmdlLiAqLworCXVuc2lnbmVkIGludCBucl9jYnMgPSAoZW5kX3ZjbiAtIHN0YXJ0X3ZjbikgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cworCQkJPj4gbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzOworCS8qCisJICogTnVtYmVyIG9mIHBhZ2VzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIGFsbAorCSAqIGNvbXByZXNzaW9uIGJsb2NrcyAoY2JzKSBvdmVybGFwcGluZyBAcGFnZS4gRHVlIHRvIGFsaWdubWVudAorCSAqIGd1YXJhbnRlZXMgb2Ygc3RhcnRfdmNuIGFuZCBlbmRfdmNuLCBubyBuZWVkIHRvIHJvdW5kIHVwIGhlcmUuCisJICovCisJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gKGVuZF92Y24gLSBzdGFydF92Y24pIDw8CisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgaW50IHhwYWdlLCBtYXhfcGFnZSwgY3VyX3BhZ2UsIGN1cl9vZnMsIGk7CisJdW5zaWduZWQgaW50IGNiX2NsdXN0ZXJzLCBjYl9tYXhfb2ZzOworCWludCBibG9jaywgbWF4X2Jsb2NrLCBjYl9tYXhfcGFnZSwgYmhzX3NpemUsIG5yX2JocywgZXJyID0gMDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXVuc2lnbmVkIGNoYXIgeHBhZ2VfZG9uZSA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZywgcGFnZS0+aW5kZXggPSAweCVseCwgY2Jfc2l6ZSA9IDB4JXgsIG5yX3BhZ2VzID0gIgorCQkJIiVpLiIsIGluZGV4LCBjYl9zaXplLCBucl9wYWdlcyk7CisJLyoKKwkgKiBCYWQgdGhpbmdzIGhhcHBlbiBpZiB3ZSBnZXQgaGVyZSBmb3IgYW55dGhpbmcgdGhhdCBpcyBub3QgYW4KKwkgKiB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZS4KKwkgKi8KKwlCVUdfT04obmktPnR5cGUgIT0gQVRfREFUQSk7CisJQlVHX09OKG5pLT5uYW1lX2xlbik7CisKKwlwYWdlcyA9IGttYWxsb2MobnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9OT0ZTKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB0aGUgYnVmZmVyIGhlYWRzIHdlIG5lZWQuICovCisJYmhzX3NpemUgPSBjYl9zaXplIC8gYmxvY2tfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CisJYmhzID0ga21hbGxvYyhiaHNfc2l6ZSwgR0ZQX05PRlMpOworCisJaWYgKHVubGlrZWx5KCFwYWdlcyB8fCAhYmhzKSkgeworCQlrZnJlZShiaHMpOworCQlrZnJlZShwYWdlcyk7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzLiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmUgd2UgbXVzdCBkby4KKwkgKiBPbmNlIGFnYWluLCB0aGUgYWxpZ25tZW50IGd1YXJhbnRlZXMga2VlcCBpdCBzaW1wbGUuCisJICovCisJb2Zmc2V0ID0gc3RhcnRfdmNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl4cGFnZSA9IGluZGV4IC0gb2Zmc2V0OworCXBhZ2VzW3hwYWdlXSA9IHBhZ2U7CisJLyoKKwkgKiBUaGUgcmVtYWluaW5nIHBhZ2VzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBwYWdlCisJICogY2FjaGUsIGFsaWdubWVudCBndWFyYW50ZWVzIGtlZXAgYWxsIHRoZSBiZWxvdyBtdWNoIHNpbXBsZXIuICgtOAorCSAqLworCW1heF9wYWdlID0gKChWRlNfSShuaSktPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+CisJCQlQQUdFX0NBQ0hFX1NISUZUKSAtIG9mZnNldDsKKwlpZiAobnJfcGFnZXMgPCBtYXhfcGFnZSkKKwkJbWF4X3BhZ2UgPSBucl9wYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3BhZ2U7IGkrKywgb2Zmc2V0KyspIHsKKwkJaWYgKGkgIT0geHBhZ2UpCisJCQlwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgb2Zmc2V0KTsKKwkJcGFnZSA9IHBhZ2VzW2ldOworCQlpZiAocGFnZSkgeworCQkJLyoKKwkJCSAqIFdlIG9ubHkgKHJlKXJlYWQgdGhlIHBhZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeSByZWFkCisJCQkgKiBpbiBhbmQvb3IgZGlydHkgb3Igd2Ugd291bGQgYmUgbG9zaW5nIGRhdGEgb3IgYXQKKwkJCSAqIGxlYXN0IHdhc3Rpbmcgb3VyIHRpbWUuCisJCQkgKi8KKwkJCWlmICghUGFnZURpcnR5KHBhZ2UpICYmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8CisJCQkJCVBhZ2VFcnJvcihwYWdlKSkpIHsKKwkJCQlDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwkJCQlrbWFwKHBhZ2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlwYWdlc1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgdGhlIHJ1bmxpc3QsIGFuZCBhbGwgdGhlIGRlc3RpbmF0aW9uIHBhZ2VzIHdlIG5lZWQgdG8gZmlsbC4KKwkgKiBOb3cgcmVhZCB0aGUgZmlyc3QgY29tcHJlc3Npb24gYmxvY2suCisJICovCisJY3VyX3BhZ2UgPSAwOworCWN1cl9vZnMgPSAwOworCWNiX2NsdXN0ZXJzID0gbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfY2x1c3RlcnM7Citkb19uZXh0X2NiOgorCW5yX2Nicy0tOworCW5yX2JocyA9IDA7CisKKwkvKiBSZWFkIGFsbCBjYiBidWZmZXIgaGVhZHMgb25lIGNsdXN0ZXIgYXQgYSB0aW1lLiAqLworCXJsID0gTlVMTDsKKwlmb3IgKHZjbiA9IHN0YXJ0X3Zjbiwgc3RhcnRfdmNuICs9IGNiX2NsdXN0ZXJzOyB2Y24gPCBzdGFydF92Y247CisJCQl2Y24rKykgeworCQlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CisKKwkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQlybCA9IG5pLT5ydW5saXN0LnJsOworCQl9CisJCWlmIChsaWtlbHkocmwgIT0gTlVMTCkpIHsKKwkJCS8qIFNlZWsgdG8gZWxlbWVudCBjb250YWluaW5nIHRhcmdldCB2Y24uICovCisJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCXJsKys7CisJCQlsY24gPSBudGZzX3JsX3Zjbl90b19sY24ocmwsIHZjbik7CisJCX0gZWxzZQorCQkJbGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCW50ZnNfZGVidWcoIlJlYWRpbmcgdmNuID0gMHglbGx4LCBsY24gPSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbik7CisJCWlmIChsY24gPCAwKSB7CisJCQkvKgorCQkJICogV2hlbiB3ZSByZWFjaCB0aGUgZmlyc3Qgc3BhcnNlIGNsdXN0ZXIgd2UgaGF2ZQorCQkJICogZmluaXNoZWQgd2l0aCB0aGUgY2IuCisJCQkgKi8KKwkJCWlmIChsY24gPT0gTENOX0hPTEUpCisJCQkJYnJlYWs7CisJCQlpZiAoaXNfcmV0cnkgfHwgbGNuICE9IExDTl9STF9OT1RfTUFQUEVEKQorCQkJCWdvdG8gcmxfZXJyOworCQkJaXNfcmV0cnkgPSBUUlVFOworCQkJLyoKKwkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nIGxvY2sgZm9yIHRoZQorCQkJICogZHVyYXRpb24uCisJCQkgKi8KKwkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJaWYgKCFudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pKQorCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKKwkJCWdvdG8gbWFwX3JsX2VycjsKKwkJfQorCQlibG9jayA9IGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IGJsb2NrX3NpemVfYml0czsKKwkJLyogUmVhZCB0aGUgbGNuIGZyb20gZGV2aWNlIGluIGNodW5rcyBvZiBibG9ja19zaXplIGJ5dGVzLiAqLworCQltYXhfYmxvY2sgPSBibG9jayArICh2b2wtPmNsdXN0ZXJfc2l6ZSA+PiBibG9ja19zaXplX2JpdHMpOworCQlkbyB7CisJCQludGZzX2RlYnVnKCJibG9jayA9IDB4JXguIiwgYmxvY2spOworCQkJaWYgKHVubGlrZWx5KCEoYmhzW25yX2Joc10gPSBzYl9nZXRibGsoc2IsIGJsb2NrKSkpKQorCQkJCWdvdG8gZ2V0YmxrX2VycjsKKwkJCW5yX2JocysrOworCQl9IHdoaWxlICgrK2Jsb2NrIDwgbWF4X2Jsb2NrKTsKKwl9CisKKwkvKiBSZWxlYXNlIHRoZSBsb2NrIGlmIHdlIHRvb2sgaXQuICovCisJaWYgKHJsKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKworCS8qIFNldHVwIGFuZCBpbml0aWF0ZSBpbyBvbiBhbGwgYnVmZmVyIGhlYWRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoc1tpXTsKKworCQlpZiAodW5saWtlbHkodGVzdF9zZXRfYnVmZmVyX2xvY2tlZCh0YmgpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisJCQl1bmxvY2tfYnVmZmVyKHRiaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlnZXRfYmgodGJoKTsKKwkJdGJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9zeW5jOworCQlzdWJtaXRfYmgoUkVBRCwgdGJoKTsKKwl9CisKKwkvKiBXYWl0IGZvciBpbyBjb21wbGV0aW9uIG9uIGFsbCBidWZmZXIgaGVhZHMuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gYmhzW2ldOworCisJCWlmIChidWZmZXJfdXB0b2RhdGUodGJoKSkKKwkJCWNvbnRpbnVlOworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQkvKgorCQkgKiBXZSBuZWVkIGFuIG9wdGltaXphdGlvbiBiYXJyaWVyIGhlcmUsIG90aGVyd2lzZSB3ZSBzdGFydAorCQkgKiBoaXR0aW5nIHRoZSBiZWxvdyBmaXh1cCBjb2RlIHdoZW4gYWNjZXNzaW5nIGEgbG9vcGJhY2sKKwkJICogbW91bnRlZCBudGZzIHBhcnRpdGlvbi4gVGhpcyBpbmRpY2F0ZXMgZWl0aGVyIHRoZXJlIGlzIGEKKwkJICogcmFjZSBjb25kaXRpb24gaW4gdGhlIGxvb3AgZHJpdmVyIG9yLCBtb3JlIGxpa2VseSwgZ2NjCisJCSAqIG92ZXJvcHRpbWlzZXMgdGhlIGNvZGUgd2l0aG91dCB0aGUgYmFycmllciBhbmQgaXQgZG9lc24ndAorCQkgKiBkbyB0aGUgUmlnaHQgVGhpbmcoVE0pLgorCQkgKi8KKwkJYmFycmllcigpOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJCdWZmZXIgaXMgdW5sb2NrZWQgYnV0IG5vdCAiCisJCQkJCSJ1cHRvZGF0ZSEgVW5wbHVnZ2luZyB0aGUgZGlzayBxdWV1ZSAiCisJCQkJCSJhbmQgcmVzY2hlZHVsaW5nLiIpOworCQkJZ2V0X2JoKHRiaCk7CisJCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UobWFwcGluZyk7CisJCQlzY2hlZHVsZSgpOworCQkJcHV0X2JoKHRiaCk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkKKwkJCQlnb3RvIHJlYWRfZXJyOworCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJCdWZmZXIgaXMgbm93IHVwdG9kYXRlLiBHb29kLiIpOworCQl9CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlci4gV2UgbXVzdCBub3Qgc2xlZXAgYW55IG1vcmUKKwkgKiB1bnRpbCB3ZSBhcmUgZmluaXNoZWQgd2l0aCBpdC4KKwkgKi8KKwlzcGluX2xvY2soJm50ZnNfY2JfbG9jayk7CisJY2IgPSBudGZzX2NvbXByZXNzaW9uX2J1ZmZlcjsKKworCUJVR19PTighY2IpOworCisJY2JfcG9zID0gY2I7CisJY2JfZW5kID0gY2IgKyBjYl9zaXplOworCisJLyogQ29weSB0aGUgYnVmZmVyIGhlYWRzIGludG8gdGhlIGNvbnRpZ3VvdXMgYnVmZmVyLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQltZW1jcHkoY2JfcG9zLCBiaHNbaV0tPmJfZGF0YSwgYmxvY2tfc2l6ZSk7CisJCWNiX3BvcyArPSBibG9ja19zaXplOworCX0KKworCS8qIEp1c3QgYSBwcmVjYXV0aW9uLiAqLworCWlmIChjYl9wb3MgKyAyIDw9IGNiICsgY2Jfc2l6ZSkKKwkJKih1MTYqKWNiX3BvcyA9IDA7CisKKwkvKiBSZXNldCBjYl9wb3MgYmFjayB0byB0aGUgYmVnaW5uaW5nLiAqLworCWNiX3BvcyA9IGNiOworCisJLyogV2Ugbm93IGhhdmUgYm90aCBzb3VyY2UgKGlmIHByZXNlbnQpIGFuZCBkZXN0aW5hdGlvbi4gKi8KKwludGZzX2RlYnVnKCJTdWNjZXNzZnVsbHkgcmVhZCB0aGUgY29tcHJlc3Npb24gYmxvY2suIik7CisKKwkvKiBUaGUgbGFzdCBwYWdlIGFuZCBtYXhpbXVtIG9mZnNldCB3aXRoaW4gaXQgZm9yIHRoZSBjdXJyZW50IGNiLiAqLworCWNiX21heF9wYWdlID0gKGN1cl9wYWdlIDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgY3VyX29mcyArIGNiX3NpemU7CisJY2JfbWF4X29mcyA9IGNiX21heF9wYWdlICYgflBBR0VfQ0FDSEVfTUFTSzsKKwljYl9tYXhfcGFnZSA+Pj0gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIENhdGNoIGVuZCBvZiBmaWxlIGluc2lkZSBhIGNvbXByZXNzaW9uIGJsb2NrLiAqLworCWlmIChjYl9tYXhfcGFnZSA+IG1heF9wYWdlKQorCQljYl9tYXhfcGFnZSA9IG1heF9wYWdlOworCisJaWYgKHZjbiA9PSBzdGFydF92Y24gLSBjYl9jbHVzdGVycykgeworCQkvKiBTcGFyc2UgY2IsIHplcm8gb3V0IHBhZ2UgcmFuZ2Ugb3ZlcmxhcHBpbmcgdGhlIGNiLiAqLworCQludGZzX2RlYnVnKCJGb3VuZCBzcGFyc2UgY29tcHJlc3Npb24gYmxvY2suIik7CisJCS8qIFdlIGNhbiBzbGVlcCBmcm9tIG5vdyBvbiwgc28gd2UgZHJvcCBsb2NrLiAqLworCQlzcGluX3VubG9jaygmbnRmc19jYl9sb2NrKTsKKwkJaWYgKGNiX21heF9vZnMpCisJCQljYl9tYXhfcGFnZS0tOworCQlmb3IgKDsgY3VyX3BhZ2UgPCBjYl9tYXhfcGFnZTsgY3VyX3BhZ2UrKykgeworCQkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJCWlmIChwYWdlKSB7CisJCQkJLyoKKwkJCQkgKiBGSVhNRTogVXNpbmcgY2xlYXJfcGFnZSgpIHdpbGwgYmVjb21lIHdyb25nCisJCQkJICogd2hlbiB3ZSBnZXQgUEFHRV9DQUNIRV9TSVpFICE9IFBBR0VfU0laRSBidXQKKwkJCQkgKiBmb3Igbm93IHRoZXJlIGlzIG5vIHByb2JsZW0uCisJCQkJICovCisJCQkJaWYgKGxpa2VseSghY3VyX29mcykpCisJCQkJCWNsZWFyX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCQllbHNlCisJCQkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyBjdXJfb2ZzLCAwLAorCQkJCQkJCVBBR0VfQ0FDSEVfU0laRSAtCisJCQkJCQkJY3VyX29mcyk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJa3VubWFwKHBhZ2UpOworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQlpZiAoY3VyX3BhZ2UgPT0geHBhZ2UpCisJCQkJCXhwYWdlX2RvbmUgPSAxOworCQkJCWVsc2UKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCXBhZ2VzW2N1cl9wYWdlXSA9IE5VTEw7CisJCQl9CisJCQljYl9wb3MgKz0gUEFHRV9DQUNIRV9TSVpFIC0gY3VyX29mczsKKwkJCWN1cl9vZnMgPSAwOworCQkJaWYgKGNiX3BvcyA+PSBjYl9lbmQpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgd2UgaGF2ZSBhIHBhcnRpYWwgZmluYWwgcGFnZSwgZGVhbCB3aXRoIGl0IG5vdy4gKi8KKwkJaWYgKGNiX21heF9vZnMgJiYgY2JfcG9zIDwgY2JfZW5kKSB7CisJCQlwYWdlID0gcGFnZXNbY3VyX3BhZ2VdOworCQkJaWYgKHBhZ2UpCisJCQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwYWdlKSArIGN1cl9vZnMsIDAsCisJCQkJCQljYl9tYXhfb2ZzIC0gY3VyX29mcyk7CisJCQkvKgorCQkJICogTm8gbmVlZCB0byB1cGRhdGUgY2JfcG9zIGF0IHRoaXMgc3RhZ2U6CisJCQkgKgljYl9wb3MgKz0gY2JfbWF4X29mcyAtIGN1cl9vZnM7CisJCQkgKi8KKwkJCWN1cl9vZnMgPSBjYl9tYXhfb2ZzOworCQl9CisJfSBlbHNlIGlmICh2Y24gPT0gc3RhcnRfdmNuKSB7CisJCS8qIFdlIGNhbid0IHNsZWVwIHNvIHdlIG5lZWQgdHdvIHN0YWdlcy4gKi8KKwkJdW5zaWduZWQgaW50IGN1cjJfcGFnZSA9IGN1cl9wYWdlOworCQl1bnNpZ25lZCBpbnQgY3VyX29mczIgPSBjdXJfb2ZzOworCQl1OCAqY2JfcG9zMiA9IGNiX3BvczsKKworCQludGZzX2RlYnVnKCJGb3VuZCB1bmNvbXByZXNzZWQgY29tcHJlc3Npb24gYmxvY2suIik7CisJCS8qIFVuY29tcHJlc3NlZCBjYiwgY29weSBpdCB0byB0aGUgZGVzdGluYXRpb24gcGFnZXMuICovCisJCS8qCisJCSAqIFRPRE86IEFzIGEgYmlnIG9wdGltaXphdGlvbiwgd2UgY291bGQgZGV0ZWN0IHRoaXMgY2FzZQorCQkgKiBiZWZvcmUgd2UgcmVhZCBhbGwgdGhlIHBhZ2VzIGFuZCB1c2UgYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKQorCQkgKiBvbiBhbGwgZnVsbCBwYWdlcyBpbnN0ZWFkICh3ZSBzdGlsbCBoYXZlIHRvIHRyZWF0IHBhcnRpYWwKKwkJICogcGFnZXMgZXNwZWNpYWxseSBidXQgYXQgbGVhc3Qgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZQorCQkgKiBzeW5jaHJvbm91cyBpbyBmb3IgdGhlIG1ham9yaXR5IG9mIHBhZ2VzLgorCQkgKiBPciBpZiB3ZSBjaG9vc2Ugbm90IHRvIGRvIHRoZSByZWFkLWFoZWFkLy1iZWhpbmQgc3R1ZmYsIHdlCisJCSAqIGNvdWxkIGp1c3QgcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2VzW3hwYWdlXSkgYXMgbG9uZworCQkgKiBhcyBQQUdFX0NBQ0hFX1NJWkUgPD0gY2Jfc2l6ZS4KKwkJICovCisJCWlmIChjYl9tYXhfb2ZzKQorCQkJY2JfbWF4X3BhZ2UtLTsKKwkJLyogRmlyc3Qgc3RhZ2U6IGNvcHkgZGF0YSBpbnRvIGRlc3RpbmF0aW9uIHBhZ2VzLiAqLworCQlmb3IgKDsgY3VyX3BhZ2UgPCBjYl9tYXhfcGFnZTsgY3VyX3BhZ2UrKykgeworCQkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJCWlmIChwYWdlKQorCQkJCW1lbWNweShwYWdlX2FkZHJlc3MocGFnZSkgKyBjdXJfb2ZzLCBjYl9wb3MsCisJCQkJCQlQQUdFX0NBQ0hFX1NJWkUgLSBjdXJfb2ZzKTsKKwkJCWNiX3BvcyArPSBQQUdFX0NBQ0hFX1NJWkUgLSBjdXJfb2ZzOworCQkJY3VyX29mcyA9IDA7CisJCQlpZiAoY2JfcG9zID49IGNiX2VuZCkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBJZiB3ZSBoYXZlIGEgcGFydGlhbCBmaW5hbCBwYWdlLCBkZWFsIHdpdGggaXQgbm93LiAqLworCQlpZiAoY2JfbWF4X29mcyAmJiBjYl9wb3MgPCBjYl9lbmQpIHsKKwkJCXBhZ2UgPSBwYWdlc1tjdXJfcGFnZV07CisJCQlpZiAocGFnZSkKKwkJCQltZW1jcHkocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3VyX29mcywgY2JfcG9zLAorCQkJCQkJY2JfbWF4X29mcyAtIGN1cl9vZnMpOworCQkJY2JfcG9zICs9IGNiX21heF9vZnMgLSBjdXJfb2ZzOworCQkJY3VyX29mcyA9IGNiX21heF9vZnM7CisJCX0KKwkJLyogV2UgY2FuIHNsZWVwIGZyb20gbm93IG9uLCBzbyBkcm9wIGxvY2suICovCisJCXNwaW5fdW5sb2NrKCZudGZzX2NiX2xvY2spOworCQkvKiBTZWNvbmQgc3RhZ2U6IGZpbmFsaXplIHBhZ2VzLiAqLworCQlmb3IgKDsgY3VyMl9wYWdlIDwgY2JfbWF4X3BhZ2U7IGN1cjJfcGFnZSsrKSB7CisJCQlwYWdlID0gcGFnZXNbY3VyMl9wYWdlXTsKKwkJCWlmIChwYWdlKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBhcmUgb3V0c2lkZSB0aGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybworCQkJCSAqIHRoZSBvdXQgb2YgYm91bmRzIHBhZ2UgcmFuZ2UuCisJCQkJICovCisJCQkJaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UobmksIHBhZ2UpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJaWYgKGN1cjJfcGFnZSA9PSB4cGFnZSkKKwkJCQkJeHBhZ2VfZG9uZSA9IDE7CisJCQkJZWxzZQorCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJcGFnZXNbY3VyMl9wYWdlXSA9IE5VTEw7CisJCQl9CisJCQljYl9wb3MyICs9IFBBR0VfQ0FDSEVfU0laRSAtIGN1cl9vZnMyOworCQkJY3VyX29mczIgPSAwOworCQkJaWYgKGNiX3BvczIgPj0gY2JfZW5kKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogQ29tcHJlc3NlZCBjYiwgZGVjb21wcmVzcyBpdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwYWdlKHMpLiAqLworCQl1bnNpZ25lZCBpbnQgcHJldl9jdXJfcGFnZSA9IGN1cl9wYWdlOworCisJCW50ZnNfZGVidWcoIkZvdW5kIGNvbXByZXNzZWQgY29tcHJlc3Npb24gYmxvY2suIik7CisJCWVyciA9IG50ZnNfZGVjb21wcmVzcyhwYWdlcywgJmN1cl9wYWdlLCAmY3VyX29mcywKKwkJCQljYl9tYXhfcGFnZSwgY2JfbWF4X29mcywgeHBhZ2UsICZ4cGFnZV9kb25lLAorCQkJCWNiX3BvcywJY2Jfc2l6ZSAtIChjYl9wb3MgLSBjYikpOworCQkvKgorCQkgKiBXZSBjYW4gc2xlZXAgZnJvbSBub3cgb24sIGxvY2sgYWxyZWFkeSBkcm9wcGVkIGJ5CisJCSAqIG50ZnNfZGVjb21wcmVzcygpLgorCQkgKi8KKwkJaWYgKGVycikgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAibnRmc19kZWNvbXByZXNzKCkgZmFpbGVkIGluIGlub2RlICIKKwkJCQkJIjB4JWx4IHdpdGggZXJyb3IgY29kZSAlaS4gU2tpcHBpbmcgIgorCQkJCQkidGhpcyBjb21wcmVzc2lvbiBibG9jay4iLAorCQkJCQluaS0+bWZ0X25vLCAtZXJyKTsKKwkJCS8qIFJlbGVhc2UgdGhlIHVuZmluaXNoZWQgcGFnZXMuICovCisJCQlmb3IgKDsgcHJldl9jdXJfcGFnZSA8IGN1cl9wYWdlOyBwcmV2X2N1cl9wYWdlKyspIHsKKwkJCQlwYWdlID0gcGFnZXNbcHJldl9jdXJfcGFnZV07CisJCQkJaWYgKHBhZ2UpIHsKKwkJCQkJaWYgKHByZXZfY3VyX3BhZ2UgPT0geHBhZ2UgJiYKKwkJCQkJCQkheHBhZ2VfZG9uZSkKKwkJCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJCWlmIChwcmV2X2N1cl9wYWdlICE9IHhwYWdlKQorCQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlwYWdlc1twcmV2X2N1cl9wYWdlXSA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogUmVsZWFzZSB0aGUgYnVmZmVyIGhlYWRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisKKwkvKiBEbyB3ZSBoYXZlIG1vcmUgd29yayB0byBkbz8gKi8KKwlpZiAobnJfY2JzKQorCQlnb3RvIGRvX25leHRfY2I7CisKKwkvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgbGlzdCBvZiBidWZmZXIgaGVhZHMuICovCisJa2ZyZWUoYmhzKTsKKworCS8qIENsZWFuIHVwIGlmIHdlIGhhdmUgYW55IHBhZ2VzIGxlZnQuIFNob3VsZCBuZXZlciBoYXBwZW4uICovCisJZm9yIChjdXJfcGFnZSA9IDA7IGN1cl9wYWdlIDwgbWF4X3BhZ2U7IGN1cl9wYWdlKyspIHsKKwkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlN0aWxsIGhhdmUgcGFnZXMgbGVmdCEgIgorCQkJCQkiVGVybWluYXRpbmcgdGhlbSB3aXRoIGV4dHJlbWUgIgorCQkJCQkicHJlanVkaWNlLiAgSW5vZGUgMHglbHgsIHBhZ2UgaW5kZXggIgorCQkJCQkiMHglbHguIiwgbmktPm1mdF9ubywgcGFnZS0+aW5kZXgpOworCQkJaWYgKGN1cl9wYWdlID09IHhwYWdlICYmICF4cGFnZV9kb25lKQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAoY3VyX3BhZ2UgIT0geHBhZ2UpCisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJcGFnZXNbY3VyX3BhZ2VdID0gTlVMTDsKKwkJfQorCX0KKworCS8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBsaXN0IG9mIHBhZ2VzLiAqLworCWtmcmVlKHBhZ2VzKTsKKworCS8qIElmIHdlIGhhdmUgY29tcGxldGVkIHRoZSByZXF1ZXN0ZWQgcGFnZSwgd2UgcmV0dXJuIHN1Y2Nlc3MuICovCisJaWYgKGxpa2VseSh4cGFnZV9kb25lKSkKKwkJcmV0dXJuIDA7CisKKwludGZzX2RlYnVnKCJGYWlsZWQuIFJldHVybmluZyBlcnJvciBjb2RlICVzLiIsIGVyciA9PSAtRU9WRVJGTE9XID8KKwkJCSJFT1ZFUkZMT1ciIDogKCFlcnIgPyAiRUlPIiA6ICJ1bmtvd24gZXJyb3IiKSk7CisJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiAtRUlPOworCityZWFkX2VycjoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJJTyBlcnJvciB3aGlsZSByZWFkaW5nIGNvbXByZXNzZWQgZGF0YS4iKTsKKwkvKiBSZWxlYXNlIHRoZSBidWZmZXIgaGVhZHMuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKQorCQlicmVsc2UoYmhzW2ldKTsKKwlnb3RvIGVycl9vdXQ7CisKK21hcF9ybF9lcnI6CisJbnRmc19lcnJvcih2b2wtPnNiLCAibnRmc19tYXBfcnVubGlzdCgpIGZhaWxlZC4gQ2Fubm90IHJlYWQgIgorCQkJImNvbXByZXNzaW9uIGJsb2NrLiIpOworCWdvdG8gZXJyX291dDsKKworcmxfZXJyOgorCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCW50ZnNfZXJyb3Iodm9sLT5zYiwgIm50ZnNfcmxfdmNuX3RvX2xjbigpIGZhaWxlZC4gQ2Fubm90IHJlYWQgIgorCQkJImNvbXByZXNzaW9uIGJsb2NrLiIpOworCWdvdG8gZXJyX291dDsKKworZ2V0YmxrX2VycjoKKwl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJnZXRibGsoKSBmYWlsZWQuIENhbm5vdCByZWFkIGNvbXByZXNzaW9uIGJsb2NrLiIpOworCitlcnJfb3V0OgorCWtmcmVlKGJocyk7CisJZm9yIChpID0gY3VyX3BhZ2U7IGkgPCBtYXhfcGFnZTsgaSsrKSB7CisJCXBhZ2UgPSBwYWdlc1tpXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCWlmIChpID09IHhwYWdlICYmICF4cGFnZV9kb25lKQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAoaSAhPSB4cGFnZSkKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwl9CisJa2ZyZWUocGFnZXMpOworCXJldHVybiAtRUlPOworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kZWJ1Zy5jIGIvZnMvbnRmcy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjZiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2RlYnVnLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBkZWJ1Zy5jIC0gTlRGUyBrZXJuZWwgZGVidWcgc3VwcG9ydC4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKgorICogQSBzdGF0aWMgYnVmZmVyIHRvIGhvbGQgdGhlIGVycm9yIHN0cmluZyBiZWluZyBkaXNwbGF5ZWQgYW5kIGEgc3BpbmxvY2sKKyAqIHRvIHByb3RlY3QgY29uY3VycmVudCBhY2Nlc3NlcyB0byBpdC4KKyAqLworc3RhdGljIGNoYXIgZXJyX2J1ZlsxMDI0XTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZXJyX2J1Zl9sb2NrKTsKKworLyoqCisgKiBfX250ZnNfd2FybmluZyAtIG91dHB1dCBhIHdhcm5pbmcgdG8gdGhlIHN5c2xvZworICogQGZ1bmN0aW9uOgluYW1lIG9mIGZ1bmN0aW9uIG91dHB1dHRpbmcgdGhlIHdhcm5pbmcKKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtCisgKiBAZm10Ogl3YXJuaW5nIHN0cmluZyBjb250YWluaW5nIGZvcm1hdCBzcGVjaWZpY2F0aW9ucworICogQC4uLjoJYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHNwZWNpZmllZCBpbiBAZm10CisgKgorICogT3V0cHV0cyBhIHdhcm5pbmcgdG8gdGhlIHN5c2xvZyBmb3IgdGhlIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtIGRlc2NyaWJlZAorICogYnkgQHNiLgorICoKKyAqIEBmbXQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIEAuLi4gaXMgcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZworICogdGhlIHdhcm5pbmcgc3RyaW5nIGFuZCB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuCisgKgorICogQGZ1bmN0aW9uIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBmcm9tIHdoaWNoIF9fbnRmc193YXJuaW5nIGlzIGJlaW5nCisgKiBjYWxsZWQuCisgKgorICogTm90ZSwgeW91IHNob3VsZCBiZSB1c2luZyBkZWJ1Zy5oOjpudGZzX3dhcm5pbmcoQHNiLCBAZm10LCBALi4uKSBpbnN0ZWFkCisgKiBhcyB0aGlzIHByb3ZpZGVzIHRoZSBAZnVuY3Rpb24gcGFyYW1ldGVyIGF1dG9tYXRpY2FsbHkuCisgKi8KK3ZvaWQgX19udGZzX3dhcm5pbmcoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgZmxlbiA9IDA7CisKKyNpZm5kZWYgREVCVUcKKwlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwkJcmV0dXJuOworI2VuZGlmCisJaWYgKGZ1bmN0aW9uKQorCQlmbGVuID0gc3RybGVuKGZ1bmN0aW9uKTsKKwlzcGluX2xvY2soJmVycl9idWZfbG9jayk7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoZXJyX2J1Ziwgc2l6ZW9mKGVycl9idWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAoc2IpCisJCXByaW50ayhLRVJOX0VSUiAiTlRGUy1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlcygpOiAlc1xuIiwKKwkJCQlzYi0+c19pZCwgZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJOVEZTLWZzIHdhcm5pbmc6ICVzKCk6ICVzXG4iLAorCQkJCWZsZW4gPyBmdW5jdGlvbiA6ICIiLCBlcnJfYnVmKTsKKwlzcGluX3VubG9jaygmZXJyX2J1Zl9sb2NrKTsKK30KKworLyoqCisgKiBfX250ZnNfZXJyb3IgLSBvdXRwdXQgYW4gZXJyb3IgdG8gdGhlIHN5c2xvZworICogQGZ1bmN0aW9uOgluYW1lIG9mIGZ1bmN0aW9uIG91dHB1dHRpbmcgdGhlIGVycm9yCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbQorICogQGZtdDoJZXJyb3Igc3RyaW5nIGNvbnRhaW5pbmcgZm9ybWF0IHNwZWNpZmljYXRpb25zCisgKiBALi4uOglhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgc3BlY2lmaWVkIGluIEBmbXQKKyAqCisgKiBPdXRwdXRzIGFuIGVycm9yIHRvIHRoZSBzeXNsb2cgZm9yIHRoZSBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbSBkZXNjcmliZWQKKyAqIGJ5IEBzYi4KKyAqCisgKiBAZm10IGFuZCB0aGUgY29ycmVzcG9uZGluZyBALi4uIGlzIHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcKKyAqIHRoZSBlcnJvciBzdHJpbmcgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBhcmd1bWVudHMsIHJlc3BlY3RpdmVseS4KKyAqCisgKiBAZnVuY3Rpb24gaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGZyb20gd2hpY2ggX19udGZzX2Vycm9yIGlzIGJlaW5nCisgKiBjYWxsZWQuCisgKgorICogTm90ZSwgeW91IHNob3VsZCBiZSB1c2luZyBkZWJ1Zy5oOjpudGZzX2Vycm9yKEBzYiwgQGZtdCwgQC4uLikgaW5zdGVhZAorICogYXMgdGhpcyBwcm92aWRlcyB0aGUgQGZ1bmN0aW9uIHBhcmFtZXRlciBhdXRvbWF0aWNhbGx5LgorICovCit2b2lkIF9fbnRmc19lcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBmbGVuID0gMDsKKworI2lmbmRlZiBERUJVRworCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQorCQlyZXR1cm47CisjZW5kaWYKKwlpZiAoZnVuY3Rpb24pCisJCWZsZW4gPSBzdHJsZW4oZnVuY3Rpb24pOworCXNwaW5fbG9jaygmZXJyX2J1Zl9sb2NrKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBzaXplb2YoZXJyX2J1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChzYikKKwkJcHJpbnRrKEtFUk5fRVJSICJOVEZTLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlcygpOiAlc1xuIiwKKwkJCQlzYi0+c19pZCwgZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJOVEZTLWZzIGVycm9yOiAlcygpOiAlc1xuIiwKKwkJCQlmbGVuID8gZnVuY3Rpb24gOiAiIiwgZXJyX2J1Zik7CisJc3Bpbl91bmxvY2soJmVycl9idWZfbG9jayk7Cit9CisKKyNpZmRlZiBERUJVRworCisvKiBJZiAxLCBvdXRwdXQgZGVidWcgbWVzc2FnZXMsIGFuZCBpZiAwLCBkb24ndC4gKi8KK2ludCBkZWJ1Z19tc2dzID0gMDsKKwordm9pZCBfX250ZnNfZGVidWcgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBmbGVuID0gMDsKKworCWlmICghZGVidWdfbXNncykKKwkJcmV0dXJuOworCWlmIChmdW5jdGlvbikKKwkJZmxlbiA9IHN0cmxlbihmdW5jdGlvbik7CisJc3Bpbl9sb2NrKCZlcnJfYnVmX2xvY2spOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGVycl9idWYsIHNpemVvZihlcnJfYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIk5URlMtZnMgREVCVUcgKCVzLCAlZCk6ICVzKCk6ICVzXG4iLCBmaWxlLCBsaW5lLAorCQkJZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCXNwaW5fdW5sb2NrKCZlcnJfYnVmX2xvY2spOworfQorCisvKiBEdW1wIGEgcnVubGlzdC4gQ2FsbGVyIGhhcyB0byBwcm92aWRlIHN5bmNocm9uaXNhdGlvbiBmb3IgQHJsLiAqLwordm9pZCBudGZzX2RlYnVnX2R1bXBfcnVubGlzdChjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKmxjbl9zdHJbNV0gPSB7ICJMQ05fSE9MRSAgICAgICAgICIsICJMQ05fUkxfTk9UX01BUFBFRCIsCisJCQkJICAgIkxDTl9FTk9FTlQgICAgICAgIiwgIkxDTl91bmtub3duICAgICAgIiB9OworCisJaWYgKCFkZWJ1Z19tc2dzKQorCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fREVCVUcgIk5URlMtZnMgREVCVUc6IER1bXBpbmcgcnVubGlzdCAodmFsdWVzIGluIGhleCk6XG4iKTsKKwlpZiAoIXJsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJSdW4gbGlzdCBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJWQ04gICAgICAgICAgICAgIExDTiAgICAgICAgICAgICAgIFJ1biBsZW5ndGhcbiIpOworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCUxDTiBsY24gPSAocmwgKyBpKS0+bGNuOworCisJCWlmIChsY24gPCAoTENOKTApIHsKKwkJCWludCBpbmRleCA9IC1sY24gLSAxOworCisJCQlpZiAoaW5kZXggPiAtTENOX0VOT0VOVCAtIDEpCisJCQkJaW5kZXggPSAzOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUtMTZMeCAlcyAlLTE2THglc1xuIiwKKwkJCQkJKHJsICsgaSktPnZjbiwgbGNuX3N0cltpbmRleF0sCisJCQkJCShybCArIGkpLT5sZW5ndGgsIChybCArIGkpLT5sZW5ndGggPworCQkJCQkiIiA6ICIgKHJ1bmxpc3QgZW5kKSIpOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlLTE2THggJS0xNkx4ICAlLTE2THglc1xuIiwKKwkJCQkJKHJsICsgaSktPnZjbiwgKHJsICsgaSktPmxjbiwKKwkJCQkJKHJsICsgaSktPmxlbmd0aCwgKHJsICsgaSktPmxlbmd0aCA/CisJCQkJCSIiIDogIiAocnVubGlzdCBlbmQpIik7CisJCWlmICghKHJsICsgaSktPmxlbmd0aCkKKwkJCWJyZWFrOworCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9udGZzL2RlYnVnLmggYi9mcy9udGZzL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMzdjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZGVidWcuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogZGVidWcuaCAtIE5URlMga2VybmVsIGRlYnVnIHN1cHBvcnQuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0RFQlVHX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfREVCVUdfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgInJ1bmxpc3QuaCIKKworI2lmZGVmIERFQlVHCisKK2V4dGVybiBpbnQgZGVidWdfbXNnczsKKworI2lmIDAgLyogRm9vbCBrZXJuZWwtZG9jIHNpbmNlIGl0IGRvZXNuJ3QgZG8gbWFjcm9zIHlldCAqLworLyoqCisgKiBudGZzX2RlYnVnIC0gd3JpdGUgYSBkZWJ1ZyBsZXZlbCBtZXNzYWdlIHRvIHN5c2xvZworICogQGY6CQlhIHByaW50ZiBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKKyAqIEAuLi46CXRoZSB2YXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbnRvIEBmCisgKgorICogbnRmc19kZWJ1ZygpIHdyaXRlcyBhIERFQlVHIGxldmVsIG1lc3NhZ2UgdG8gdGhlIHN5c2xvZyBidXQgb25seSBpZiB0aGUKKyAqIGRyaXZlciB3YXMgY29tcGlsZWQgd2l0aCAtRERFQlVHLiBPdGhlcndpc2UsIHRoZSBjYWxsIHR1cm5zIGludG8gYSBOT1AuCisgKi8KK3N0YXRpYyB2b2lkIG50ZnNfZGVidWcoY29uc3QgY2hhciAqZiwgLi4uKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX250ZnNfZGVidWcgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwljb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworI2RlZmluZSBudGZzX2RlYnVnKGYsIGEuLi4pCQkJCQkJXAorCV9fbnRmc19kZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgZiwgIyNhKQorCitleHRlcm4gdm9pZCBudGZzX2RlYnVnX2R1bXBfcnVubGlzdChjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKTsKKworI2Vsc2UJLyogIURFQlVHICovCisKKyNkZWZpbmUgbnRmc19kZWJ1ZyhmLCBhLi4uKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG50ZnNfZGVidWdfZHVtcF9ydW5saXN0KHJsKQlkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCS8qICFERUJVRyAqLworCitleHRlcm4gdm9pZCBfX250ZnNfd2FybmluZyhjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKyNkZWZpbmUgbnRmc193YXJuaW5nKHNiLCBmLCBhLi4uKQlfX250ZnNfd2FybmluZyhfX0ZVTkNUSU9OX18sIHNiLCBmLCAjI2EpCisKK2V4dGVybiB2b2lkIF9fbnRmc19lcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKyNkZWZpbmUgbnRmc19lcnJvcihzYiwgZiwgYS4uLikJCV9fbnRmc19lcnJvcihfX0ZVTkNUSU9OX18sIHNiLCBmLCAjI2EpCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19ERUJVR19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2Rpci5jIGIvZnMvbnRmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU3NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9kaXIuYwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qKgorICogZGlyLmMgLSBOVEZTIGtlcm5lbCBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBUaGUgbGl0dGxlIGVuZGlhbiBVbmljb2RlIHN0cmluZyAkSTMwIGFzIGEgZ2xvYmFsIGNvbnN0YW50LgorICovCitudGZzY2hhciBJMzBbNV0gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksIGNvbnN0X2NwdV90b19sZTE2KCdJJyksCisJCWNvbnN0X2NwdV90b19sZTE2KCczJyksCWNvbnN0X2NwdV90b19sZTE2KCcwJyksIDAgfTsKKworLyoqCisgKiBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lIC0gZmluZCBhbiBpbm9kZSBpbiBhIGRpcmVjdG9yeSBnaXZlbiBpdHMgbmFtZQorICogQGRpcl9uaToJbnRmcyBpbm9kZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIG5hbWUKKyAqIEB1bmFtZToJVW5pY29kZSBuYW1lIGZvciB3aGljaCB0byBzZWFyY2ggaW4gdGhlIGRpcmVjdG9yeQorICogQHVuYW1lX2xlbjoJbGVuZ3RoIG9mIHRoZSBuYW1lIEB1bmFtZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMKKyAqIEByZXM6CXJldHVybiB0aGUgZm91bmQgZmlsZSBuYW1lIGlmIG5lY2Vzc2FyeSAoc2VlIGJlbG93KQorICoKKyAqIExvb2sgZm9yIGFuIGlub2RlIHdpdGggbmFtZSBAdW5hbWUgaW4gdGhlIGRpcmVjdG9yeSB3aXRoIGlub2RlIEBkaXJfbmkuCisgKiBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKCkgd2Fsa3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3IKKyAqIHRoZSBVbmljb2RlIG5hbWUuIElmIHRoZSBuYW1lIGlzIGZvdW5kIGluIHRoZSBkaXJlY3RvcnksIHRoZSBjb3JyZXNwb25kaW5nCisgKiBpbm9kZSBudW1iZXIgKD49IDApIGlzIHJldHVybmVkIGFzIGEgbWZ0IHJlZmVyZW5jZSBpbiBjcHUgZm9ybWF0LCBpLmUuIGl0CisgKiBpcyBhIDY0LWJpdCBudW1iZXIgY29udGFpbmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICoKKyAqIE9uIGVycm9yLCBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUuIEluCisgKiBwYXJ0aWN1bGFyIGlmIHRoZSBpbm9kZSBpcyBub3QgZm91bmQgLUVOT0VOVCBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHlvdQorICogY2FuJ3QganVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZvciBiZWluZyBuZWdhdGl2ZSwgeW91IGhhdmUgdG8gY2hlY2sgdGhlCisgKiBpbm9kZSBudW1iZXIgZm9yIGJlaW5nIG5lZ2F0aXZlIHdoaWNoIHlvdSBjYW4gZXh0cmFjdCB1c2luZyBNUkVDKHJldHVybgorICogdmFsdWUpLgorICoKKyAqIE5vdGUsIEB1bmFtZV9sZW4gZG9lcyBub3QgaW5jbHVkZSB0aGUgKG9wdGlvbmFsKSB0ZXJtaW5hdGluZyBOVUxMIGNoYXJhY3Rlci4KKyAqCisgKiBOb3RlLCB3ZSBsb29rIGZvciBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGZpcnN0IGJ1dCB3ZSBhbHNvIGxvb2sgZm9yIGEgY2FzZQorICogaW5zZW5zaXRpdmUgbWF0Y2ggYXQgdGhlIHNhbWUgdGltZS4gSWYgd2UgZmluZCBhIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2gsIHdlCisgKiBzYXZlIHRoYXQgZm9yIHRoZSBjYXNlIHRoYXQgd2UgZG9uJ3QgZmluZCBhbiBleGFjdCBtYXRjaCwgd2hlcmUgd2UgcmV0dXJuCisgKiB0aGUgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBhbmQgc2V0dXAgQHJlcyAod2hpY2ggd2UgYWxsb2NhdGUhKSB3aXRoIHRoZSBtZnQKKyAqIHJlZmVyZW5jZSwgdGhlIGZpbGUgbmFtZSB0eXBlLCBsZW5ndGggYW5kIHdpdGggYSBjb3B5IG9mIHRoZSBsaXR0bGUgZW5kaWFuCisgKiBVbmljb2RlIGZpbGUgbmFtZSBpdHNlbGYuIElmIHdlIG1hdGNoIGEgZmlsZSBuYW1lIHdoaWNoIGlzIGluIHRoZSBET1MgbmFtZQorICogc3BhY2UsIHdlIG9ubHkgcmV0dXJuIHRoZSBtZnQgcmVmZXJlbmNlIGFuZCBmaWxlIG5hbWUgdHlwZSBpbiBAcmVzLgorICogbnRmc19sb29rdXAoKSB0aGVuIHVzZXMgdGhpcyB0byBmaW5kIHRoZSBsb25nIGZpbGUgbmFtZSBpbiB0aGUgaW5vZGUgaXRzZWxmLgorICogVGhpcyBpcyB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGRjYWNoZSB3aXRoIHNob3J0IGZpbGUgbmFtZXMuIFdlIHdhbnQgdGhlbSB0bworICogd29yayBidXQgd2UgZG9uJ3QgY2FyZSBmb3IgaG93IHF1aWNrbHkgb25lIGNhbiBhY2Nlc3MgdGhlbS4gVGhpcyBhbHNvIGZpeGVzCisgKiB0aGUgZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKyAqCisgKiBMb2NraW5nOiAgLSBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBkaXJlY3RvcnkuCisgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCisgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CisgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaAorICoJICAgICAgIGFwcGxpZXMgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBiZWZvcmUgd3JpdGluZyBvdXQgYW5kIHRoZW4KKyAqCSAgICAgICByZW1vdmVzIHRoZW0gYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGlzIGNvbXBsZXRlIGFmdGVyIHdoaWNoIGl0IAorICoJICAgICAgIHVubG9ja3MgdGhlIHBhZ2UuCisgKi8KK01GVF9SRUYgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShudGZzX2lub2RlICpkaXJfbmksIGNvbnN0IG50ZnNjaGFyICp1bmFtZSwKKwkJY29uc3QgaW50IHVuYW1lX2xlbiwgbnRmc19uYW1lICoqcmVzKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBkaXJfbmktPnZvbDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlNRlRfUkVDT1JEICptOworCUlOREVYX1JPT1QgKmlyOworCUlOREVYX0VOVFJZICppZTsKKwlJTkRFWF9BTExPQ0FUSU9OICppYTsKKwl1OCAqaW5kZXhfZW5kOworCXU2NCBtcmVmOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJaW50IGVyciwgcmM7CisJVkNOIHZjbiwgb2xkX3ZjbjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisJbnRmc19uYW1lICpuYW1lID0gTlVMTDsKKworCUJVR19PTighU19JU0RJUihWRlNfSShkaXJfbmkpLT5pX21vZGUpKTsKKwlCVUdfT04oTklub0F0dHIoZGlyX25pKSk7CisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBkaXJlY3RvcnkuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQludGZzX2Vycm9yKHNiLCAibWFwX21mdF9yZWNvcmQoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4iLAorCQkJCS1QVFJfRVJSKG0pKTsKKwkJcmV0dXJuIEVSUl9NUkVGKFBUUl9FUlIobSkpOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoZGlyX25pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBGaW5kIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIEkzMCwgNCwgQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsCisJCQkwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IHJvb3QgYXR0cmlidXRlIG1pc3NpbmcgaW4gIgorCQkJCQkiZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdG8gdGhlIGluZGV4IHJvb3QgdmFsdWUgKGl0J3MgYmVlbiB2ZXJpZmllZCBpbiByZWFkX2lub2RlKS4gKi8KKwlpciA9IChJTkRFWF9ST09UKikoKHU4KiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArIGxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOworCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlyLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTgqKWllIDwgKHU4KiljdHgtPm1yZWMgfHwgKHU4KilpZSArCisJCQkJc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgPiBpbmRleF9lbmQgfHwKKwkJCQkodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlpbmRleF9lbmQpCisJCQlnb3RvIGRpcl9lcnJfb3V0OworCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIG5hbWUuIEl0IGNhbiBob3dldmVyIGNvbnRhaW4KKwkJICogYSBwb2ludGVyIHRvIGEgY2hpbGQgbm9kZSBpbiB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0LgorCQkgKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBXZSBwZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBhbmQgaWYgdGhhdCBtYXRjaGVzCisJCSAqIHdlIGFyZSBkb25lIGFuZCByZXR1cm4gdGhlIG1mdCByZWZlcmVuY2Ugb2YgdGhlIGlub2RlIChpLmUuCisJCSAqIHRoZSBpbm9kZSBudW1iZXIgdG9nZXRoZXIgd2l0aCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvcgorCQkgKiBjb25zaXN0ZW5jeSBjaGVja2luZykuIFdlIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUKKwkJICogcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDoKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgcGVyZmVjdCBtYXRjaCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlCisJCQkgKiBhYm91dCBoYXZpbmcgbWF0Y2hlZCBpbXBlcmZlY3RseSBiZWZvcmUsIHNvIHdlIGNhbgorCQkJICogZnJlZSBuYW1lIGFuZCBzZXQgKnJlcyB0byBOVUxMLgorCQkJICogSG93ZXZlciwgaWYgdGhlIHBlcmZlY3QgbWF0Y2ggaXMgYSBzaG9ydCBmaWxlIG5hbWUsCisJCQkgKiB3ZSBuZWVkIHRvIHNpZ25hbCB0aGlzIHRocm91Z2ggKnJlcywgc28gdGhhdAorCQkJICogbnRmc19sb29rdXAoKSBjYW4gZml4IGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCisJCQkgKiBBcyBhbiBvcHRpbWl6YXRpb24gd2UganVzdCByZXVzZSBhbiBleGlzdGluZworCQkJICogYWxsb2NhdGlvbiBvZiAqcmVzLgorCQkJICovCisJCQlpZiAoaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX3R5cGUgPT0gRklMRV9OQU1FX0RPUykgeworCQkJCWlmICghbmFtZSkgeworCQkJCQluYW1lID0ga21hbGxvYyhzaXplb2YobnRmc19uYW1lKSwKKwkJCQkJCQlHRlBfTk9GUyk7CisJCQkJCWlmICghbmFtZSkgeworCQkJCQkJZXJyID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gZXJyX291dDsKKwkJCQkJfQorCQkJCX0KKwkJCQluYW1lLT5tcmVmID0gbGU2NF90b19jcHUoCisJCQkJCQlpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCQluYW1lLT50eXBlID0gRklMRV9OQU1FX0RPUzsKKwkJCQluYW1lLT5sZW4gPSAwOworCQkJCSpyZXMgPSBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobmFtZSkKKwkJCQkJa2ZyZWUobmFtZSk7CisJCQkJKnJlcyA9IE5VTEw7CisJCQl9CisJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwkJCXJldHVybiBtcmVmOworCQl9CisJCS8qCisJCSAqIEZvciBhIGNhc2UgaW5zZW5zaXRpdmUgbW91bnQsIHdlIGFsc28gcGVyZm9ybSBhIGNhc2UKKwkJICogaW5zZW5zaXRpdmUgY29tcGFyaXNvbiAocHJvdmlkZWQgdGhlIGZpbGUgbmFtZSBpcyBub3QgaW4gdGhlCisJCSAqIFBPU0lYIG5hbWVzcGFjZSkuIElmIHRoZSBjb21wYXJpc29uIG1hdGNoZXMsIGFuZCB0aGUgbmFtZSBpcworCQkgKiBpbiB0aGUgV0lOMzIgbmFtZXNwYWNlLCB3ZSBjYWNoZSB0aGUgZmlsZW5hbWUgaW4gKnJlcyBzbworCQkgKiB0aGF0IHRoZSBjYWxsZXIsIG50ZnNfbG9va3VwKCksIGNhbiB3b3JrIG9uIGl0LiBJZiB0aGUKKwkJICogY29tcGFyaXNvbiBtYXRjaGVzLCBhbmQgdGhlIG5hbWUgaXMgaW4gdGhlIERPUyBuYW1lc3BhY2UsIHdlCisJCSAqIG9ubHkgY2FjaGUgdGhlIG1mdCByZWZlcmVuY2UgYW5kIHRoZSBmaWxlIG5hbWUgdHlwZSAod2Ugc2V0CisJCSAqIHRoZSBuYW1lIGxlbmd0aCB0byB6ZXJvIGZvciBzaW1wbGljaXR5KS4KKwkJICovCisJCWlmICghTlZvbENhc2VTZW5zaXRpdmUodm9sKSAmJgorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlICYmCisJCQkJbnRmc19hcmVfbmFtZXNfZXF1YWwodW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpIHsKKwkJCWludCBuYW1lX3NpemUgPSBzaXplb2YobnRmc19uYW1lKTsKKwkJCXU4IHR5cGUgPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZTsKKwkJCXU4IGxlbiA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGg7CisKKwkJCS8qIE9ubHkgb25lIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcgbmFtZSBhbGxvd2VkLiAqLworCQkJaWYgKG5hbWUpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRm91bmQgYWxyZWFkeSBhbGxvY2F0ZWQgbmFtZSAiCisJCQkJCQkiaW4gcGhhc2UgMS4gUGxlYXNlIHJ1biBjaGtkc2sgIgorCQkJCQkJImFuZCBpZiB0aGF0IGRvZXNuJ3QgZmluZCBhbnkgIgorCQkJCQkJImVycm9ycyBwbGVhc2UgcmVwb3J0IHlvdSBzYXcgIgorCQkJCQkJInRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldC4iKTsKKwkJCQlnb3RvIGRpcl9lcnJfb3V0OworCQkJfQorCisJCQlpZiAodHlwZSAhPSBGSUxFX05BTUVfRE9TKQorCQkJCW5hbWVfc2l6ZSArPSBsZW4gKiBzaXplb2YobnRmc2NoYXIpOworCQkJbmFtZSA9IGttYWxsb2MobmFtZV9zaXplLCBHRlBfTk9GUyk7CisJCQlpZiAoIW5hbWUpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCW5hbWUtPm1yZWYgPSBsZTY0X3RvX2NwdShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCW5hbWUtPnR5cGUgPSB0eXBlOworCQkJaWYgKHR5cGUgIT0gRklMRV9OQU1FX0RPUykgeworCQkJCW5hbWUtPmxlbiA9IGxlbjsKKwkJCQltZW1jcHkobmFtZS0+bmFtZSwgaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCQkJbGVuICogc2l6ZW9mKG50ZnNjaGFyKSk7CisJCQl9IGVsc2UKKwkJCQluYW1lLT5sZW4gPSAwOworCQkJKnJlcyA9IG5hbWU7CisJCX0KKwkJLyoKKwkJICogTm90IGEgcGVyZmVjdCBtYXRjaCwgbmVlZCB0byBkbyBmdWxsIGJsb3duIGNvbGxhdGlvbiBzbyB3ZQorCQkgKiBrbm93IHdoaWNoIHdheSBpbiB0aGUgQit0cmVlIHdlIGhhdmUgdG8gZ28uCisJCSAqLworCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCAxLAorCQkJCUlHTk9SRV9DQVNFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJLyoKKwkJICogSWYgdW5hbWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGVudHJ5LCB0aGVyZQorCQkgKiBpcyBkZWZpbml0ZWx5IG5vIHN1Y2ggbmFtZSBpbiB0aGlzIGluZGV4IGJ1dCB3ZSBtaWdodCBuZWVkIHRvCisJCSAqIGRlc2NlbmQgaW50byB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKHJjID09IC0xKQorCQkJYnJlYWs7CisJCS8qIFRoZSBuYW1lcyBhcmUgbm90IGVxdWFsLCBjb250aW51ZSB0aGUgc2VhcmNoLiAqLworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogTmFtZXMgbWF0Y2ggd2l0aCBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIG5vdyB0cnkgdGhlCisJCSAqIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIKKwkJICogY29sbGF0aW9uLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlDQVNFX1NFTlNJVElWRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogUGVyZmVjdCBtYXRjaCwgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBhcyB0aGUKKwkJICogbnRmc19hcmVfbmFtZXNfZXF1YWwoKSBjYWxsIHdpbGwgaGF2ZSBnb3R0ZW4gYSBtYXRjaCBidXQgd2UKKwkJICogc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJZ290byBmb3VuZF9pdDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvciB0aGUKKwkgKiBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUgYW5kIGlmIG5vdCBwcmVzZW50IHJldHVybiAtRU5PRU5ULCB1bmxlc3MKKwkgKiB3ZSBoYXZlIGdvdCBhIG1hdGNoaW5nIG5hbWUgY2FjaGVkIGluIG5hbWUgaW4gd2hpY2ggY2FzZSByZXR1cm4gdGhlCisJICogbWZ0IHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggaXQuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJaWYgKG5hbWUpIHsKKwkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQkJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCQkJcmV0dXJuIG5hbWUtPm1yZWY7CisJCX0KKwkJbnRmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kLiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9vdXQ7CisJfSAvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkvKiBDb25zaXN0ZW5jeSBjaGVjazogVmVyaWZ5IHRoYXQgYW4gaW5kZXggYWxsb2NhdGlvbiBleGlzdHMuICovCisJaWYgKCFOSW5vSW5kZXhBbGxvY1ByZXNlbnQoZGlyX25pKSkgeworCQludGZzX2Vycm9yKHNiLCAiTm8gaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgYnV0IGluZGV4IGVudHJ5ICIKKwkJCQkicmVxdWlyZXMgb25lLiBEaXJlY3RvcnkgaW5vZGUgMHglbHggaXMgIgorCQkJCSJjb3JydXB0IG9yIGRyaXZlciBidWcuIiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhcnRpbmcgdmNuIG9mIHRoZSBpbmRleF9ibG9jayBob2xkaW5nIHRoZSBjaGlsZCBub2RlLiAqLworCXZjbiA9IHNsZTY0X3RvX2NwdXAoKHNsZTY0KikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpIC0gOCkpOworCWlhX21hcHBpbmcgPSBWRlNfSShkaXJfbmkpLT5pX21hcHBpbmc7CisJLyoKKwkgKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBpbmRleCByb290IGFuZCB0aGUgbWZ0IHJlY29yZC4gUmVsZWFzZSB0aGVtLAorCSAqIG90aGVyd2lzZSB3ZSBkZWFkbG9jayB3aXRoIG50ZnNfbWFwX3BhZ2UoKS4KKwkgKi8KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJbSA9IE5VTEw7CisJY3R4ID0gTlVMTDsKK2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qCisJICogQ29udmVydCB2Y24gdG8gaW5kZXggaW50byB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgaW4gdW5pdHMKKwkgKiBvZiBQQUdFX0NBQ0hFX1NJWkUgYW5kIG1hcCB0aGUgcGFnZSBjYWNoZSBwYWdlLCByZWFkaW5nIGl0IGZyb20KKwkgKiBkaXNrIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShpYV9tYXBwaW5nLCB2Y24gPDwKKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbWFwIGRpcmVjdG9yeSBpbmRleCBwYWdlLCBlcnJvciAlbGQuIiwKKwkJCQktUFRSX0VSUihwYWdlKSk7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCWthZGRyID0gKHU4KilwYWdlX2FkZHJlc3MocGFnZSk7CitmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qIEdldCB0byB0aGUgaW5kZXggYWxsb2NhdGlvbiBibG9jay4gKi8KKwlpYSA9IChJTkRFWF9BTExPQ0FUSU9OKikoa2FkZHIgKyAoKHZjbiA8PAorCQkJZGlyX25pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0spKTsKKwkvKiBCb3VuZHMgY2hlY2tzLiAqLworCWlmICgodTgqKWlhIDwga2FkZHIgfHwgKHU4KilpYSA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJPdXQgb2YgYm91bmRzIGNoZWNrIGZhaWxlZC4gQ29ycnVwdCBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseCBvciBkcml2ZXIgYnVnLiIsIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwlpZiAodW5saWtlbHkoIW50ZnNfaXNfaW5keF9yZWNvcmQoaWEtPm1hZ2ljKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkRpcmVjdG9yeSBpbmRleCByZWNvcmQgd2l0aCB2Y24gMHglbGx4IGlzICIKKwkJCQkiY29ycnVwdC4gIENvcnJ1cHQgaW5vZGUgMHglbHguICBSdW4gY2hrZHNrLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKHNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSAhPSB2Y24pIHsKKwkJbnRmc19lcnJvcihzYiwgIkFjdHVhbCBWQ04gKDB4JWxseCkgb2YgaW5kZXggYnVmZmVyIGlzICIKKwkJCQkiZGlmZmVyZW50IGZyb20gZXhwZWN0ZWQgVkNOICgweCVsbHgpLiAiCisJCQkJIkRpcmVjdG9yeSBpbm9kZSAweCVseCBpcyBjb3JydXB0IG9yIGRyaXZlciAiCisJCQkJImJ1Zy4iLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCXNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAobGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTggIT0KKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBoYXMgYSBzaXplICgldSkgZGlmZmVyaW5nIGZyb20gdGhlICIKKwkJCQkiZGlyZWN0b3J5IHNwZWNpZmllZCBzaXplICgldSkuIERpcmVjdG9yeSAiCisJCQkJImlub2RlIGlzIGNvcnJ1cHQgb3IgZHJpdmVyIGJ1Zy4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubywKKwkJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCwKKwkJCQlkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKWlhICsgZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCWlmIChpbmRleF9lbmQgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBjcm9zc2VzIHBhZ2UgYm91bmRhcnkuIEltcG9zc2libGUhICIKKwkJCQkiQ2Fubm90IGFjY2VzcyEgVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiB0aGUgIgorCQkJCSJkcml2ZXIuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCisJCQkJZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKSZpYS0+aW5kZXggKyBsZTMyX3RvX2NwdShpYS0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwlpZiAoaW5kZXhfZW5kID4gKHU4KilpYSArIGRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgeworCQludGZzX2Vycm9yKHNiLCAiU2l6ZSBvZiBpbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4IGV4Y2VlZHMgbWF4aW11bSBzaXplLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5LiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaWEtPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogSXRlcmF0ZSBzaW1pbGFyIHRvIGFib3ZlIGJpZyBsb29wIGJ1dCBhcHBsaWVkIHRvIGluZGV4IGJ1ZmZlciwgdGh1cworCSAqIGxvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVjay4gKi8KKwkJaWYgKCh1OCopaWUgPCAodTgqKWlhIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSA+CisJCQkJaW5kZXhfZW5kKSB7CisJCQludGZzX2Vycm9yKHNiLCAiSW5kZXggZW50cnkgb3V0IG9mIGJvdW5kcyBpbiAiCisJCQkJCSJkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIG5hbWUuIEl0IGNhbiBob3dldmVyIGNvbnRhaW4KKwkJICogYSBwb2ludGVyIHRvIGEgY2hpbGQgbm9kZSBpbiB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0LgorCQkgKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBXZSBwZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBhbmQgaWYgdGhhdCBtYXRjaGVzCisJCSAqIHdlIGFyZSBkb25lIGFuZCByZXR1cm4gdGhlIG1mdCByZWZlcmVuY2Ugb2YgdGhlIGlub2RlIChpLmUuCisJCSAqIHRoZSBpbm9kZSBudW1iZXIgdG9nZXRoZXIgd2l0aCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvcgorCQkgKiBjb25zaXN0ZW5jeSBjaGVja2luZykuIFdlIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUKKwkJICogcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDI6CisJCQkvKgorCQkJICogV2UgaGF2ZSBhIHBlcmZlY3QgbWF0Y2gsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZQorCQkJICogYWJvdXQgaGF2aW5nIG1hdGNoZWQgaW1wZXJmZWN0bHkgYmVmb3JlLCBzbyB3ZSBjYW4KKwkJCSAqIGZyZWUgbmFtZSBhbmQgc2V0ICpyZXMgdG8gTlVMTC4KKwkJCSAqIEhvd2V2ZXIsIGlmIHRoZSBwZXJmZWN0IG1hdGNoIGlzIGEgc2hvcnQgZmlsZSBuYW1lLAorCQkJICogd2UgbmVlZCB0byBzaWduYWwgdGhpcyB0aHJvdWdoICpyZXMsIHNvIHRoYXQKKwkJCSAqIG50ZnNfbG9va3VwKCkgY2FuIGZpeCBkY2FjaGUgYWxpYXNpbmcgaXNzdWVzLgorCQkJICogQXMgYW4gb3B0aW1pemF0aW9uIHdlIGp1c3QgcmV1c2UgYW4gZXhpc3RpbmcKKwkJCSAqIGFsbG9jYXRpb24gb2YgKnJlcy4KKwkJCSAqLworCQkJaWYgKGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID09IEZJTEVfTkFNRV9ET1MpIHsKKwkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJbmFtZSA9IGttYWxsb2Moc2l6ZW9mKG50ZnNfbmFtZSksCisJCQkJCQkJR0ZQX05PRlMpOworCQkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCQl9CisJCQkJfQorCQkJCW5hbWUtPm1yZWYgPSBsZTY0X3RvX2NwdSgKKwkJCQkJCWllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCQkJCW5hbWUtPnR5cGUgPSBGSUxFX05BTUVfRE9TOworCQkJCW5hbWUtPmxlbiA9IDA7CisJCQkJKnJlcyA9IG5hbWU7CisJCQl9IGVsc2UgeworCQkJCWlmIChuYW1lKQorCQkJCQlrZnJlZShuYW1lKTsKKwkJCQkqcmVzID0gTlVMTDsKKwkJCX0KKwkJCW1yZWYgPSBsZTY0X3RvX2NwdShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJcmV0dXJuIG1yZWY7CisJCX0KKwkJLyoKKwkJICogRm9yIGEgY2FzZSBpbnNlbnNpdGl2ZSBtb3VudCwgd2UgYWxzbyBwZXJmb3JtIGEgY2FzZQorCQkgKiBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIChwcm92aWRlZCB0aGUgZmlsZSBuYW1lIGlzIG5vdCBpbiB0aGUKKwkJICogUE9TSVggbmFtZXNwYWNlKS4gSWYgdGhlIGNvbXBhcmlzb24gbWF0Y2hlcywgYW5kIHRoZSBuYW1lIGlzCisJCSAqIGluIHRoZSBXSU4zMiBuYW1lc3BhY2UsIHdlIGNhY2hlIHRoZSBmaWxlbmFtZSBpbiAqcmVzIHNvCisJCSAqIHRoYXQgdGhlIGNhbGxlciwgbnRmc19sb29rdXAoKSwgY2FuIHdvcmsgb24gaXQuIElmIHRoZQorCQkgKiBjb21wYXJpc29uIG1hdGNoZXMsIGFuZCB0aGUgbmFtZSBpcyBpbiB0aGUgRE9TIG5hbWVzcGFjZSwgd2UKKwkJICogb25seSBjYWNoZSB0aGUgbWZ0IHJlZmVyZW5jZSBhbmQgdGhlIGZpbGUgbmFtZSB0eXBlICh3ZSBzZXQKKwkJICogdGhlIG5hbWUgbGVuZ3RoIHRvIHplcm8gZm9yIHNpbXBsaWNpdHkpLgorCQkgKi8KKwkJaWYgKCFOVm9sQ2FzZVNlbnNpdGl2ZSh2b2wpICYmCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX3R5cGUgJiYKKwkJCQludGZzX2FyZV9uYW1lc19lcXVhbCh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLAorCQkJCUlHTk9SRV9DQVNFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworCQkJaW50IG5hbWVfc2l6ZSA9IHNpemVvZihudGZzX25hbWUpOworCQkJdTggdHlwZSA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlOworCQkJdTggbGVuID0gaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aDsKKworCQkJLyogT25seSBvbmUgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaGluZyBuYW1lIGFsbG93ZWQuICovCisJCQlpZiAobmFtZSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJGb3VuZCBhbHJlYWR5IGFsbG9jYXRlZCBuYW1lICIKKwkJCQkJCSJpbiBwaGFzZSAyLiBQbGVhc2UgcnVuIGNoa2RzayAiCisJCQkJCQkiYW5kIGlmIHRoYXQgZG9lc24ndCBmaW5kIGFueSAiCisJCQkJCQkiZXJyb3JzIHBsZWFzZSByZXBvcnQgeW91IHNhdyAiCisJCQkJCQkidGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0LiIpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCQlnb3RvIGRpcl9lcnJfb3V0OworCQkJfQorCisJCQlpZiAodHlwZSAhPSBGSUxFX05BTUVfRE9TKQorCQkJCW5hbWVfc2l6ZSArPSBsZW4gKiBzaXplb2YobnRmc2NoYXIpOworCQkJbmFtZSA9IGttYWxsb2MobmFtZV9zaXplLCBHRlBfTk9GUyk7CisJCQlpZiAoIW5hbWUpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQluYW1lLT5tcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQluYW1lLT50eXBlID0gdHlwZTsKKwkJCWlmICh0eXBlICE9IEZJTEVfTkFNRV9ET1MpIHsKKwkJCQluYW1lLT5sZW4gPSBsZW47CisJCQkJbWVtY3B5KG5hbWUtPm5hbWUsIGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQkJCWxlbiAqIHNpemVvZihudGZzY2hhcikpOworCQkJfSBlbHNlCisJCQkJbmFtZS0+bGVuID0gMDsKKwkJCSpyZXMgPSBuYW1lOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCS8qCisJCSAqIElmIHVuYW1lIGNvbGxhdGVzIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbnRyeSwgdGhlcmUKKwkJICogaXMgZGVmaW5pdGVseSBubyBzdWNoIG5hbWUgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKiBUaGUgbmFtZXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE5hbWVzIG1hdGNoIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCBub3cgdHJ5IHRoZQorCQkgKiBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgcHJvcGVyCisJCSAqIGNvbGxhdGlvbi4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFBlcmZlY3QgbWF0Y2gsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYXMgdGhlCisJCSAqIG50ZnNfYXJlX25hbWVzX2VxdWFsKCkgY2FsbCB3aWxsIGhhdmUgZ290dGVuIGEgbWF0Y2ggYnV0IHdlCisJCSAqIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWdvdG8gZm91bmRfaXQyOworCX0KKwkvKgorCSAqIFdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGlzIGluZGV4IGJ1ZmZlciB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvcgorCSAqIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpIHsKKwkJaWYgKChpYS0+aW5kZXguZmxhZ3MgJiBOT0RFX01BU0spID09IExFQUZfTk9ERSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IHdpdGggY2hpbGQgbm9kZSBmb3VuZCBpbiAiCisJCQkJCSJhIGxlYWYgbm9kZSBpbiBkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkJb2xkX3ZjbiA9IHZjbjsKKwkJdmNuID0gc2xlNjRfdG9fY3B1cCgoc2xlNjQqKSgodTgqKWllICsKKwkJCQlsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSAtIDgpKTsKKwkJaWYgKHZjbiA+PSAwKSB7CisJCQkvKiBJZiB2Y24gaXMgaW4gdGhlIHNhbWUgcGFnZSBjYWNoZSBwYWdlIGFzIG9sZF92Y24gd2UKKwkJCSAqIHJlY3ljbGUgdGhlIG1hcHBlZCBwYWdlLiAqLworCQkJaWYgKG9sZF92Y24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUID09IHZjbiA8PAorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQpCisJCQkJZ290byBmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIGRlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICJOZWdhdGl2ZSBjaGlsZCBub2RlIHZjbiBpbiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseC4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qCisJICogTm8gY2hpbGQgbm9kZSBwcmVzZW50LCByZXR1cm4gLUVOT0VOVCwgdW5sZXNzIHdlIGhhdmUgZ290IGEgbWF0Y2hpbmcKKwkgKiBuYW1lIGNhY2hlZCBpbiBuYW1lIGluIHdoaWNoIGNhc2UgcmV0dXJuIHRoZSBtZnQgcmVmZXJlbmNlCisJICogYXNzb2NpYXRlZCB3aXRoIGl0LgorCSAqLworCWlmIChuYW1lKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBuYW1lLT5tcmVmOworCX0KKwludGZzX2RlYnVnKCJFbnRyeSBub3QgZm91bmQuIik7CisJZXJyID0gLUVOT0VOVDsKK3VubV9lcnJfb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKK2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwlpZiAobmFtZSkgeworCQlrZnJlZShuYW1lKTsKKwkJKnJlcyA9IE5VTEw7CisJfQorCXJldHVybiBFUlJfTVJFRihlcnIpOworZGlyX2Vycl9vdXQ6CisJbnRmc19lcnJvcihzYiwgIkNvcnJ1cHQgZGlyZWN0b3J5LiAgQWJvcnRpbmcgbG9va3VwLiIpOworCWdvdG8gZXJyX291dDsKK30KKworI2lmIDAKKworLy8gVE9ETzogKEFJQSkKKy8vIFRoZSBhbGdvcml0aG0gZW1iZWRkZWQgaW4gdGhpcyBjb2RlIHdpbGwgYmUgcmVxdWlyZWQgZm9yIHRoZSB0aW1lIHdoZW4gd2UKKy8vIHdhbnQgdG8gc3VwcG9ydCBhZGRpbmcgb2YgZW50cmllcyB0byBkaXJlY3Rvcmllcywgd2hlcmUgd2UgcmVxdWlyZSBjb3JyZWN0CisvLyBjb2xsYXRpb24gb2YgZmlsZSBuYW1lcyBpbiBvcmRlciBub3QgdG8gY2F1c2UgY29ycnVwdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0uCisKKy8qKgorICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSAtIGZpbmQgYW4gaW5vZGUgaW4gYSBkaXJlY3RvcnkgZ2l2ZW4gaXRzIG5hbWUKKyAqIEBkaXJfbmk6CW50ZnMgaW5vZGUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBuYW1lCisgKiBAdW5hbWU6CVVuaWNvZGUgbmFtZSBmb3Igd2hpY2ggdG8gc2VhcmNoIGluIHRoZSBkaXJlY3RvcnkKKyAqIEB1bmFtZV9sZW46CWxlbmd0aCBvZiB0aGUgbmFtZSBAdW5hbWUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzCisgKgorICogTG9vayBmb3IgYW4gaW5vZGUgd2l0aCBuYW1lIEB1bmFtZSBpbiB0aGUgZGlyZWN0b3J5IHdpdGggaW5vZGUgQGRpcl9uaS4KKyAqIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSB3YWxrcyB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvcgorICogdGhlIFVuaWNvZGUgbmFtZS4gSWYgdGhlIG5hbWUgaXMgZm91bmQgaW4gdGhlIGRpcmVjdG9yeSwgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGlub2RlIG51bWJlciAoPj0gMCkgaXMgcmV0dXJuZWQgYXMgYSBtZnQgcmVmZXJlbmNlIGluIGNwdSBmb3JtYXQsIGkuZS4gaXQKKyAqIGlzIGEgNjQtYml0IG51bWJlciBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIuCisgKgorICogT24gZXJyb3IsIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgZXJyb3IgY29kZS4gSW4KKyAqIHBhcnRpY3VsYXIgaWYgdGhlIGlub2RlIGlzIG5vdCBmb3VuZCAtRU5PRU5UIGlzIHJldHVybmVkLiBOb3RlIHRoYXQgeW91CisgKiBjYW4ndCBqdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZm9yIGJlaW5nIG5lZ2F0aXZlLCB5b3UgaGF2ZSB0byBjaGVjayB0aGUKKyAqIGlub2RlIG51bWJlciBmb3IgYmVpbmcgbmVnYXRpdmUgd2hpY2ggeW91IGNhbiBleHRyYWN0IHVzaW5nIE1SRUMocmV0dXJuCisgKiB2YWx1ZSkuCisgKgorICogTm90ZSwgQHVuYW1lX2xlbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSAob3B0aW9uYWwpIHRlcm1pbmF0aW5nIE5VTEwgY2hhcmFjdGVyLgorICovCit1NjQgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShudGZzX2lub2RlICpkaXJfbmksIGNvbnN0IG50ZnNjaGFyICp1bmFtZSwKKwkJY29uc3QgaW50IHVuYW1lX2xlbikKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gZGlyX25pLT52b2w7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CisJTUZUX1JFQ09SRCAqbTsKKwlJTkRFWF9ST09UICppcjsKKwlJTkRFWF9FTlRSWSAqaWU7CisJSU5ERVhfQUxMT0NBVElPTiAqaWE7CisJdTggKmluZGV4X2VuZDsKKwl1NjQgbXJlZjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCWludCBlcnIsIHJjOworCUlHTk9SRV9DQVNFX0JPT0wgaWM7CisJVkNOIHZjbiwgb2xkX3ZjbjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisKKwkvKiBHZXQgaG9sZCBvZiB0aGUgbWZ0IHJlY29yZCBmb3IgdGhlIGRpcmVjdG9yeS4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJtYXBfbWZ0X3JlY29yZCgpIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWxkLiIsCisJCQkJLVBUUl9FUlIobSkpOworCQlyZXR1cm4gRVJSX01SRUYoUFRSX0VSUihtKSk7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChkaXJfbmksIG0pOworCWlmICghY3R4KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgaW4gdGhlIG1mdCByZWNvcmQuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBJMzAsIDQsIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLAorCQkJMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCByb290IGF0dHJpYnV0ZSBtaXNzaW5nIGluICIKKwkJCQkJImRpcmVjdG9yeSBpbm9kZSAweCVseC4iLAorCQkJCQlkaXJfbmktPm1mdF9ubyk7CisJCQllcnIgPSAtRUlPOworCQl9CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRvIHRoZSBpbmRleCByb290IHZhbHVlIChpdCdzIGJlZW4gdmVyaWZpZWQgaW4gcmVhZF9pbm9kZSkuICovCisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkvKiBUaGUgZmlyc3QgaW5kZXggZW50cnkuICovCisJaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKSZpci0+aW5kZXggKworCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmVudHJpZXNfb2Zmc2V0KSk7CisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHU4KilpZSA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSA+CisJCQkJaW5kZXhfZW5kKQorCQkJZ290byBkaXJfZXJyX291dDsKKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBuYW1lLiBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgZW50cnkgaGFzIGEgbmFtZSB0eXBlIG9mIFBPU0lYLCB0aGUgbmFtZSBpcworCQkgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbm90IG90aGVyd2lzZS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB1cworCQkgKiBub3QgYmVpbmcgYWJsZSB0byBhY2Nlc3MgYW55IFBPU0lYIGZpbGUgbmFtZXMgd2hpY2ggY29sbGF0ZQorCQkgKiBhZnRlciB0aGUgbm9uLVBPU0lYIG9uZSB3aGVuIHRoZXkgb25seSBkaWZmZXIgaW4gY2FzZSwgYnV0CisJCSAqIGFueW9uZSBkb2luZyBzY3Jld3kgc3R1ZmYgbGlrZSB0aGF0IGRlc2VydmVzIHRvIGJ1cm4gaW4KKwkJICogaGVsbC4uLiBEb2luZyB0aGF0IGtpbmQgb2Ygc3R1ZmYgb24gTlQ0IGFjdHVhbGx5IGNhdXNlcworCQkgKiBjb3JydXB0aW9uIG9uIHRoZSBwYXJ0aXRpb24gZXZlbiB3aGVuIHVzaW5nIFNQNmEgYW5kIExpbnV4CisJCSAqIGlzIG5vdCBpbnZvbHZlZCBhdCBhbGwuCisJCSAqLworCQlpYyA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID8gSUdOT1JFX0NBU0UgOgorCQkJCUNBU0VfU0VOU0lUSVZFOworCQkvKgorCQkgKiBJZiB0aGUgbmFtZXMgbWF0Y2ggcGVyZmVjdGx5LCB3ZSBhcmUgZG9uZSBhbmQgcmV0dXJuIHRoZQorCQkgKiBtZnQgcmVmZXJlbmNlIG9mIHRoZSBpbm9kZSAoaS5lLiB0aGUgaW5vZGUgbnVtYmVyIHRvZ2V0aGVyCisJCSAqIHdpdGggdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuIFdlCisJCSAqIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUgcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIGljLAorCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDoKKwkJCW1yZWYgPSBsZTY0X3RvX2NwdShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQkJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCQkJcmV0dXJuIG1yZWY7CisJCX0KKwkJLyoKKwkJICogTm90IGEgcGVyZmVjdCBtYXRjaCwgbmVlZCB0byBkbyBmdWxsIGJsb3duIGNvbGxhdGlvbiBzbyB3ZQorCQkgKiBrbm93IHdoaWNoIHdheSBpbiB0aGUgQit0cmVlIHdlIGhhdmUgdG8gZ28uCisJCSAqLworCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCAxLAorCQkJCUlHTk9SRV9DQVNFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJLyoKKwkJICogSWYgdW5hbWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGVudHJ5LCB0aGVyZQorCQkgKiBpcyBkZWZpbml0ZWx5IG5vIHN1Y2ggbmFtZSBpbiB0aGlzIGluZGV4IGJ1dCB3ZSBtaWdodCBuZWVkIHRvCisJCSAqIGRlc2NlbmQgaW50byB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKHJjID09IC0xKQorCQkJYnJlYWs7CisJCS8qIFRoZSBuYW1lcyBhcmUgbm90IGVxdWFsLCBjb250aW51ZSB0aGUgc2VhcmNoLiAqLworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogTmFtZXMgbWF0Y2ggd2l0aCBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIG5vdyB0cnkgdGhlCisJCSAqIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIKKwkJICogY29sbGF0aW9uLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlDQVNFX1NFTlNJVElWRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogUGVyZmVjdCBtYXRjaCwgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBhcyB0aGUKKwkJICogbnRmc19hcmVfbmFtZXNfZXF1YWwoKSBjYWxsIHdpbGwgaGF2ZSBnb3R0ZW4gYSBtYXRjaCBidXQgd2UKKwkJICogc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJZ290byBmb3VuZF9pdDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvciB0aGUKKwkgKiBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJLyogTm8gY2hpbGQgbm9kZSwgcmV0dXJuIC1FTk9FTlQuICovCisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX291dDsKKwl9IC8qIENoaWxkIG5vZGUgcHJlc2VudCwgZGVzY2VuZCBpbnRvIGl0LiAqLworCS8qIENvbnNpc3RlbmN5IGNoZWNrOiBWZXJpZnkgdGhhdCBhbiBpbmRleCBhbGxvY2F0aW9uIGV4aXN0cy4gKi8KKwlpZiAoIU5Jbm9JbmRleEFsbG9jUHJlc2VudChkaXJfbmkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJObyBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBidXQgaW5kZXggZW50cnkgIgorCQkJCSJyZXF1aXJlcyBvbmUuIERpcmVjdG9yeSBpbm9kZSAweCVseCBpcyAiCisJCQkJImNvcnJ1cHQgb3IgZHJpdmVyIGJ1Zy4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRoZSBzdGFydGluZyB2Y24gb2YgdGhlIGluZGV4X2Jsb2NrIGhvbGRpbmcgdGhlIGNoaWxkIG5vZGUuICovCisJdmNuID0gc2xlNjRfdG9fY3B1cCgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KTsKKwlpYV9tYXBwaW5nID0gVkZTX0koZGlyX25pKS0+aV9tYXBwaW5nOworCS8qCisJICogV2UgYXJlIGRvbmUgd2l0aCB0aGUgaW5kZXggcm9vdCBhbmQgdGhlIG1mdCByZWNvcmQuIFJlbGVhc2UgdGhlbSwKKwkgKiBvdGhlcndpc2Ugd2UgZGVhZGxvY2sgd2l0aCBudGZzX21hcF9wYWdlKCkuCisJICovCisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CitkZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKgorCSAqIENvbnZlcnQgdmNuIHRvIGluZGV4IGludG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGluIHVuaXRzCisJICogb2YgUEFHRV9DQUNIRV9TSVpFIGFuZCBtYXAgdGhlIHBhZ2UgY2FjaGUgcGFnZSwgcmVhZGluZyBpdCBmcm9tCisJICogZGlzayBpZiBuZWNlc3NhcnkuCisJICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaWFfbWFwcGluZywgdmNuIDw8CisJCQlkaXJfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIG1hcCBkaXJlY3RvcnkgaW5kZXggcGFnZSwgZXJyb3IgJWxkLiIsCisJCQkJLVBUUl9FUlIocGFnZSkpOworCQllcnIgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWxvY2tfcGFnZShwYWdlKTsKKwlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpOworZmFzdF9kZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKiBHZXQgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYmxvY2suICovCisJaWEgPSAoSU5ERVhfQUxMT0NBVElPTiopKGthZGRyICsgKCh2Y24gPDwKKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLKSk7CisJLyogQm91bmRzIGNoZWNrcy4gKi8KKwlpZiAoKHU4KilpYSA8IGthZGRyIHx8ICh1OCopaWEgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHNiLCAiT3V0IG9mIGJvdW5kcyBjaGVjayBmYWlsZWQuIENvcnJ1cHQgZGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgMHglbHggb3IgZHJpdmVyIGJ1Zy4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIENhdGNoIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBlcnJvcnMuICovCisJaWYgKHVubGlrZWx5KCFudGZzX2lzX2luZHhfcmVjb3JkKGlhLT5tYWdpYykpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJEaXJlY3RvcnkgaW5kZXggcmVjb3JkIHdpdGggdmNuIDB4JWxseCBpcyAiCisJCQkJImNvcnJ1cHQuICBDb3JydXB0IGlub2RlIDB4JWx4LiAgUnVuIGNoa2Rzay4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbikgIT0gdmNuKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJBY3R1YWwgVkNOICgweCVsbHgpIG9mIGluZGV4IGJ1ZmZlciBpcyAiCisJCQkJImRpZmZlcmVudCBmcm9tIGV4cGVjdGVkIFZDTiAoMHglbGx4KS4gIgorCQkJCSJEaXJlY3RvcnkgaW5vZGUgMHglbHggaXMgY29ycnVwdCBvciBkcml2ZXIgIgorCQkJCSJidWcuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbiksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4ICE9CisJCQlkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggaGFzIGEgc2l6ZSAoJXUpIGRpZmZlcmluZyBmcm9tIHRoZSAiCisJCQkJImRpcmVjdG9yeSBzcGVjaWZpZWQgc2l6ZSAoJXUpLiBEaXJlY3RvcnkgIgorCQkJCSJpbm9kZSBpcyBjb3JydXB0IG9yIGRyaXZlciBidWcuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8sCisJCQkJbGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTgsCisJCQkJZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KilpYSArIGRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZTsKKwlpZiAoaW5kZXhfZW5kID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5LiBJbXBvc3NpYmxlISAiCisJCQkJIkNhbm5vdCBhY2Nlc3MhIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlICIKKwkJCQkiZHJpdmVyLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKGluZGV4X2VuZCA+ICh1OCopaWEgKyBkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIlNpemUgb2YgaW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseCBleGNlZWRzIG1heGltdW0gc2l6ZS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlhLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIEl0ZXJhdGUgc2ltaWxhciB0byBhYm92ZSBiaWcgbG9vcCBidXQgYXBwbGllZCB0byBpbmRleCBidWZmZXIsIHRodXMKKwkgKiBsb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2suICovCisJCWlmICgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IG91dCBvZiBib3VuZHMgaW4gIgorCQkJCQkiZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBuYW1lLiBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgZW50cnkgaGFzIGEgbmFtZSB0eXBlIG9mIFBPU0lYLCB0aGUgbmFtZSBpcworCQkgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbm90IG90aGVyd2lzZS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB1cworCQkgKiBub3QgYmVpbmcgYWJsZSB0byBhY2Nlc3MgYW55IFBPU0lYIGZpbGUgbmFtZXMgd2hpY2ggY29sbGF0ZQorCQkgKiBhZnRlciB0aGUgbm9uLVBPU0lYIG9uZSB3aGVuIHRoZXkgb25seSBkaWZmZXIgaW4gY2FzZSwgYnV0CisJCSAqIGFueW9uZSBkb2luZyBzY3Jld3kgc3R1ZmYgbGlrZSB0aGF0IGRlc2VydmVzIHRvIGJ1cm4gaW4KKwkJICogaGVsbC4uLiBEb2luZyB0aGF0IGtpbmQgb2Ygc3R1ZmYgb24gTlQ0IGFjdHVhbGx5IGNhdXNlcworCQkgKiBjb3JydXB0aW9uIG9uIHRoZSBwYXJ0aXRpb24gZXZlbiB3aGVuIHVzaW5nIFNQNmEgYW5kIExpbnV4CisJCSAqIGlzIG5vdCBpbnZvbHZlZCBhdCBhbGwuCisJCSAqLworCQlpYyA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID8gSUdOT1JFX0NBU0UgOgorCQkJCUNBU0VfU0VOU0lUSVZFOworCQkvKgorCQkgKiBJZiB0aGUgbmFtZXMgbWF0Y2ggcGVyZmVjdGx5LCB3ZSBhcmUgZG9uZSBhbmQgcmV0dXJuIHRoZQorCQkgKiBtZnQgcmVmZXJlbmNlIG9mIHRoZSBpbm9kZSAoaS5lLiB0aGUgaW5vZGUgbnVtYmVyIHRvZ2V0aGVyCisJCSAqIHdpdGggdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuIFdlCisJCSAqIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUgcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIGljLAorCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDI6CisJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCXJldHVybiBtcmVmOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCS8qCisJCSAqIElmIHVuYW1lIGNvbGxhdGVzIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbnRyeSwgdGhlcmUKKwkJICogaXMgZGVmaW5pdGVseSBubyBzdWNoIG5hbWUgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKiBUaGUgbmFtZXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE5hbWVzIG1hdGNoIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCBub3cgdHJ5IHRoZQorCQkgKiBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgcHJvcGVyCisJCSAqIGNvbGxhdGlvbi4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFBlcmZlY3QgbWF0Y2gsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYXMgdGhlCisJCSAqIG50ZnNfYXJlX25hbWVzX2VxdWFsKCkgY2FsbCB3aWxsIGhhdmUgZ290dGVuIGEgbWF0Y2ggYnV0IHdlCisJCSAqIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWdvdG8gZm91bmRfaXQyOworCX0KKwkvKgorCSAqIFdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGlzIGluZGV4IGJ1ZmZlciB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvcgorCSAqIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpIHsKKwkJaWYgKChpYS0+aW5kZXguZmxhZ3MgJiBOT0RFX01BU0spID09IExFQUZfTk9ERSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IHdpdGggY2hpbGQgbm9kZSBmb3VuZCBpbiAiCisJCQkJCSJhIGxlYWYgbm9kZSBpbiBkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkJb2xkX3ZjbiA9IHZjbjsKKwkJdmNuID0gc2xlNjRfdG9fY3B1cCgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KTsKKwkJaWYgKHZjbiA+PSAwKSB7CisJCQkvKiBJZiB2Y24gaXMgaW4gdGhlIHNhbWUgcGFnZSBjYWNoZSBwYWdlIGFzIG9sZF92Y24gd2UKKwkJCSAqIHJlY3ljbGUgdGhlIG1hcHBlZCBwYWdlLiAqLworCQkJaWYgKG9sZF92Y24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUID09IHZjbiA8PAorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQpCisJCQkJZ290byBmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIGRlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICJOZWdhdGl2ZSBjaGlsZCBub2RlIHZjbiBpbiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseC4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIE5vIGNoaWxkIG5vZGUsIHJldHVybiAtRU5PRU5ULiAqLworCW50ZnNfZGVidWcoIkVudHJ5IG5vdCBmb3VuZC4iKTsKKwllcnIgPSAtRU5PRU5UOwordW5tX2Vycl9vdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCXJldHVybiBFUlJfTVJFRihlcnIpOworZGlyX2Vycl9vdXQ6CisJbnRmc19lcnJvcihzYiwgIkNvcnJ1cHQgZGlyZWN0b3J5LiBBYm9ydGluZyBsb29rdXAuIik7CisJZ290byBlcnJfb3V0OworfQorCisjZW5kaWYKKworLyoqCisgKiBudGZzX2ZpbGxkaXIgLSBudGZzIHNwZWNpZmljIGZpbGxkaXIgbWV0aG9kCisgKiBAdm9sOgljdXJyZW50IG50ZnMgdm9sdW1lCisgKiBAZnBvczoJcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeQorICogQG5kaXI6CW50ZnMgaW5vZGUgb2YgY3VycmVudCBkaXJlY3RvcnkKKyAqIEBpYV9wYWdlOglwYWdlIGluIHdoaWNoIHRoZSBpbmRleCBhbGxvY2F0aW9uIGJ1ZmZlciBAaWUgaXMgaW4gcmVzaWRlcworICogQGllOgkJY3VycmVudCBpbmRleCBlbnRyeQorICogQG5hbWU6CWJ1ZmZlciB0byB1c2UgZm9yIHRoZSBjb252ZXJ0ZWQgbmFtZQorICogQGRpcmVudDoJdmZzIGZpbGxkaXIgY2FsbGJhY2sgY29udGV4dAorICogQGZpbGxkaXI6CXZmcyBmaWxsZGlyIGNhbGxiYWNrCisgKgorICogQ29udmVydCB0aGUgVW5pY29kZSBAbmFtZSB0byB0aGUgbG9hZGVkIE5MUyBhbmQgcGFzcyBpdCB0byB0aGUgQGZpbGxkaXIKKyAqIGNhbGxiYWNrLgorICoKKyAqIElmIEBpYV9wYWdlIGlzIG5vdCBOVUxMIGl0IGlzIHRoZSBsb2NrZWQgcGFnZSBjb250YWluaW5nIHRoZSBpbmRleAorICogYWxsb2NhdGlvbiBibG9jayBjb250YWluaW5nIHRoZSBpbmRleCBlbnRyeSBAaWUuCisgKgorICogTm90ZSwgd2UgZHJvcCAoYW5kIHRoZW4gcmVhY3F1aXJlKSB0aGUgcGFnZSBsb2NrIG9uIEBpYV9wYWdlIGFjcm9zcyB0aGUKKyAqIEBmaWxsZGlyKCkgY2FsbCBvdGhlcndpc2Ugd2Ugd291bGQgZGVhZGxvY2sgd2l0aCBORlNkIHdoZW4gaXQgY2FsbHMgLT5sb29rdXAKKyAqIHNpbmNlIG50ZnNfbG9va3VwKCkgd2lsbCBsb2NrIHRoZSBzYW1lIHBhZ2UuICBBcyBhbiBvcHRpbWl6YXRpb24sIHdlIGRvIG5vdAorICogcmV0YWtlIHRoZSBsb2NrIGlmIHdlIGFyZSByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSBhcyBudGZzX3JlYWRkaXIoKQorICogd291bGQgbmVlZCB0byBkcm9wIHRoZSBsb2NrIGltbWVkaWF0ZWx5IGFueXdheS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19maWxsZGlyKG50ZnNfdm9sdW1lICp2b2wsIGxvZmZfdCBmcG9zLAorCQludGZzX2lub2RlICpuZGlyLCBzdHJ1Y3QgcGFnZSAqaWFfcGFnZSwgSU5ERVhfRU5UUlkgKmllLAorCQl1OCAqbmFtZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIG1yZWY7CisJaW50IG5hbWVfbGVuLCByYzsKKwl1bnNpZ25lZCBkdF90eXBlOworCUZJTEVfTkFNRV9UWVBFX0ZMQUdTIG5hbWVfdHlwZTsKKworCW5hbWVfdHlwZSA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlOworCWlmIChuYW1lX3R5cGUgPT0gRklMRV9OQU1FX0RPUykgeworCQludGZzX2RlYnVnKCJTa2lwcGluZyBET1MgbmFtZSBzcGFjZSBlbnRyeS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChNUkVGX0xFKGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpID09IEZJTEVfcm9vdCkgeworCQludGZzX2RlYnVnKCJTa2lwcGluZyByb290IGRpcmVjdG9yeSBzZWxmIHJlZmVyZW5jZSBlbnRyeS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChNUkVGX0xFKGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpIDwgRklMRV9maXJzdF91c2VyICYmCisJCQkhTlZvbFNob3dTeXN0ZW1GaWxlcyh2b2wpKSB7CisJCW50ZnNfZGVidWcoIlNraXBwaW5nIHN5c3RlbSBmaWxlLiIpOworCQlyZXR1cm4gMDsKKwl9CisJbmFtZV9sZW4gPSBudGZzX3Vjc3RvbmxzKHZvbCwgKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgJm5hbWUsCisJCQlOVEZTX01BWF9OQU1FX0xFTiAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFICsgMSk7CisJaWYgKG5hbWVfbGVuIDw9IDApIHsKKwkJbnRmc19kZWJ1ZygiU2tpcHBpbmcgdW5yZXByZXNlbnRhYmxlIGZpbGUuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoaWUtPmtleS5maWxlX25hbWUuZmlsZV9hdHRyaWJ1dGVzICYKKwkJCUZJTEVfQVRUUl9EVVBfRklMRV9OQU1FX0lOREVYX1BSRVNFTlQpCisJCWR0X3R5cGUgPSBEVF9ESVI7CisJZWxzZQorCQlkdF90eXBlID0gRFRfUkVHOworCW1yZWYgPSBNUkVGX0xFKGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCS8qCisJICogRHJvcCB0aGUgcGFnZSBsb2NrIG90aGVyd2lzZSB3ZSBkZWFkbG9jayB3aXRoIE5GUyB3aGVuIGl0IGNhbGxzCisJICogLT5sb29rdXAgc2luY2UgbnRmc19sb29rdXAoKSB3aWxsIGxvY2sgdGhlIHNhbWUgcGFnZS4KKwkgKi8KKwlpZiAoaWFfcGFnZSkKKwkJdW5sb2NrX3BhZ2UoaWFfcGFnZSk7CisJbnRmc19kZWJ1ZygiQ2FsbGluZyBmaWxsZGlyIGZvciAlcyB3aXRoIGxlbiAlaSwgZnBvcyAweCVsbHgsIGlub2RlICIKKwkJCSIweCVseCwgRFRfJXMuIiwgbmFtZSwgbmFtZV9sZW4sIGZwb3MsIG1yZWYsCisJCQlkdF90eXBlID09IERUX0RJUiA/ICJESVIiIDogIlJFRyIpOworCXJjID0gZmlsbGRpcihkaXJlbnQsIG5hbWUsIG5hbWVfbGVuLCBmcG9zLCBtcmVmLCBkdF90eXBlKTsKKwkvKiBSZWxvY2sgdGhlIHBhZ2UgYnV0IG5vdCBpZiB3ZSBhcmUgYWJvcnRpbmcgLT5yZWFkZGlyLiAqLworCWlmICghcmMgJiYgaWFfcGFnZSkKKwkJbG9ja19wYWdlKGlhX3BhZ2UpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFdlIHVzZSB0aGUgc2FtZSBiYXNpYyBhcHByb2FjaCBhcyB0aGUgb2xkIE5URlMgZHJpdmVyLCBpLmUuIHdlIHBhcnNlIHRoZQorICogaW5kZXggcm9vdCBlbnRyaWVzIGFuZCB0aGVuIHRoZSBpbmRleCBhbGxvY2F0aW9uIGVudHJpZXMgdGhhdCBhcmUgbWFya2VkCisgKiBhcyBpbiB1c2UgaW4gdGhlIGluZGV4IGJpdG1hcC4KKyAqCisgKiBXaGlsZSB0aGlzIHdpbGwgcmV0dXJuIHRoZSBuYW1lcyBpbiByYW5kb20gb3JkZXIgdGhpcyBkb2Vzbid0IG1hdHRlciBmb3IKKyAqIC0+cmVhZGRpciBidXQgT1RPSCByZXN1bHRzIGluIGEgZmFzdGVyIC0+cmVhZGRpci4KKyAqCisgKiBWRlMgY2FsbHMgLT5yZWFkZGlyIHdpdGhvdXQgQktMIGJ1dCB3aXRoIGlfc2VtIGhlbGQuIFRoaXMgcHJvdGVjdHMgdGhlIFZGUworICogcGFydHMgKGUuZy4gLT5mX3BvcyBhbmQgLT5pX3NpemUsIGFuZCBpdCBhbHNvIHByb3RlY3RzIGFnYWluc3QgZGlyZWN0b3J5CisgKiBtb2RpZmljYXRpb25zKS4KKyAqCisgKiBMb2NraW5nOiAgLSBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBkaXJlY3RvcnkuCisgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCisgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CisgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaAorICoJICAgICAgIGFwcGxpZXMgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBiZWZvcmUgd3JpdGluZyBvdXQgYW5kIHRoZW4KKyAqCSAgICAgICByZW1vdmVzIHRoZW0gYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGlzIGNvbXBsZXRlIGFmdGVyIHdoaWNoIGl0IAorICoJICAgICAgIHVubG9ja3MgdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXM2NCBpYV9wb3MsIGlhX3N0YXJ0LCBwcmV2X2lhX3BvcywgYm1wX3BvczsKKwlsb2ZmX3QgZnBvczsKKwlzdHJ1Y3QgaW5vZGUgKmJtcF92aSwgKnZkaXIgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdmRpci0+aV9zYjsKKwludGZzX2lub2RlICpuZGlyID0gTlRGU19JKHZkaXIpOworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKwlNRlRfUkVDT1JEICptOworCUlOREVYX1JPT1QgKmlyID0gTlVMTDsKKwlJTkRFWF9FTlRSWSAqaWU7CisJSU5ERVhfQUxMT0NBVElPTiAqaWE7CisJdTggKm5hbWUgPSBOVUxMOworCWludCByYywgZXJyLCBpcl9wb3MsIGN1cl9ibXBfcG9zOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICppYV9tYXBwaW5nLCAqYm1wX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKmJtcF9wYWdlID0gTlVMTCwgKmlhX3BhZ2UgPSBOVUxMOworCXU4ICprYWRkciwgKmJtcCwgKmluZGV4X2VuZDsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCisJZnBvcyA9IGZpbHAtPmZfcG9zOworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgZnBvcyAweCVsbHguIiwKKwkJCXZkaXItPmlfaW5vLCBmcG9zKTsKKwlyYyA9IGVyciA9IDA7CisJLyogQXJlIHdlIGF0IGVuZCBvZiBkaXIgeWV0PyAqLworCWlmIChmcG9zID49IHZkaXItPmlfc2l6ZSArIHZvbC0+bWZ0X3JlY29yZF9zaXplKQorCQlnb3RvIGRvbmU7CisJLyogRW11bGF0ZSAuIGFuZCAuLiBmb3IgYWxsIGRpcmVjdG9yaWVzLiAqLworCWlmICghZnBvcykgeworCQludGZzX2RlYnVnKCJDYWxsaW5nIGZpbGxkaXIgZm9yIC4gd2l0aCBsZW4gMSwgZnBvcyAweDAsICIKKwkJCQkiaW5vZGUgMHglbHgsIERUX0RJUi4iLCB2ZGlyLT5pX2lubyk7CisJCXJjID0gZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZnBvcywgdmRpci0+aV9pbm8sIERUX0RJUik7CisJCWlmIChyYykKKwkJCWdvdG8gZG9uZTsKKwkJZnBvcysrOworCX0KKwlpZiAoZnBvcyA9PSAxKSB7CisJCW50ZnNfZGVidWcoIkNhbGxpbmcgZmlsbGRpciBmb3IgLi4gd2l0aCBsZW4gMiwgZnBvcyAweDEsICIKKwkJCQkiaW5vZGUgMHglbHgsIERUX0RJUi4iLAorCQkJCXBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpKTsKKwkJcmMgPSBmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZnBvcywKKwkJCQlwYXJlbnRfaW5vKGZpbHAtPmZfZGVudHJ5KSwgRFRfRElSKTsKKwkJaWYgKHJjKQorCQkJZ290byBkb25lOworCQlmcG9zKys7CisJfQorCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CisJLyoKKwkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzdG9yZSB0aGUgY3VycmVudCBuYW1lIGJlaW5nIHByb2Nlc3NlZAorCSAqIGNvbnZlcnRlZCB0byBmb3JtYXQgZGV0ZXJtaW5lZCBieSBjdXJyZW50IE5MUy4KKwkgKi8KKwluYW1lID0gKHU4KilrbWFsbG9jKE5URlNfTUFYX05BTUVfTEVOICogTkxTX01BWF9DSEFSU0VUX1NJWkUgKyAxLAorCQkJR0ZQX05PRlMpOworCWlmICh1bmxpa2VseSghbmFtZSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBBcmUgd2UganVtcGluZyBzdHJhaWdodCBpbnRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZT8gKi8KKwlpZiAoZnBvcyA+PSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkKKwkJZ290byBza2lwX2luZGV4X3Jvb3Q7CisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBkaXJlY3RvcnkuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKG5kaXIpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5kaXIsIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLiAqLworCWlyX3BvcyA9IChzNjQpZnBvczsKKwkvKiBGaW5kIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIEkzMCwgNCwgQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsCisJCQkwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCByb290IGF0dHJpYnV0ZSBtaXNzaW5nIGluIGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4LiIsIHZkaXItPmlfaW5vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKgorCSAqIENvcHkgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIHZhbHVlIHRvIGEgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIHB1dAorCSAqIHRoZSBzZWFyY2ggY29udGV4dCBhbmQgdW5tYXAgdGhlIG1mdCByZWNvcmQgYmVmb3JlIGNhbGxpbmcgdGhlCisJICogZmlsbGRpcigpIGNhbGxiYWNrLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb2YgTkZTZCB3aGljaCBjYWxscworCSAqIC0+bG9va3VwKCkgZnJvbSBpdHMgZmlsbGRpciBjYWxsYmFjaygpIGFuZCB0aGlzIGNhdXNlcyBOVEZTIHRvCisJICogZGVhZGxvY2sgYXMgbnRmc19sb29rdXAoKSBtYXBzIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBkaXJlY3RvcnkgYW5kCisJICogd2UgaGF2ZSBnb3QgaXQgbWFwcGVkIGhlcmUgYWxyZWFkeS4gIFRoZSBvbmx5IHNvbHV0aW9uIGlzIGZvciB1cyB0bworCSAqIHVubWFwIHRoZSBtZnQgcmVjb3JkIGhlcmUgc28gdGhhdCBhIGNhbGwgdG8gbnRmc19sb29rdXAoKSBpcyBhYmxlIHRvCisJICogbWFwIHRoZSBtZnQgcmVjb3JkIHdpdGhvdXQgZGVhZGxvY2tpbmcuCisJICovCisJcmMgPSBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpciA9IChJTkRFWF9ST09UKilrbWFsbG9jKHJjLCBHRlBfTk9GUyk7CisJaWYgKHVubGlrZWx5KCFpcikpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBDb3B5IHRoZSBpbmRleCByb290IHZhbHVlIChpdCBoYXMgYmVlbiB2ZXJpZmllZCBpbiByZWFkX2lub2RlKS4gKi8KKwltZW1jcHkoaXIsICh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLCByYyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChuZGlyKTsKKwljdHggPSBOVUxMOworCW0gPSBOVUxMOworCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArIGxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOworCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlyLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5IG9yIHVudGlsIGZpbGxkaXIgdGVsbHMgdXMgaXQgaGFzIGhhZCBlbm91Z2gKKwkgKiBvciBzaWduYWxzIGFuIGVycm9yIChib3RoIGNvdmVyZWQgYnkgdGhlIHJjIHRlc3QpLgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCW50ZnNfZGVidWcoIkluIGluZGV4IHJvb3QsIG9mZnNldCAweCV6eC4iLCAodTgqKWllIC0gKHU4Kilpcik7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICh1bmxpa2VseSgodTgqKWllIDwgKHU4KilpciB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkpCisJCQlnb3RvIGVycl9vdXQ7CisJCS8qIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEgbmFtZS4gKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKiBTa2lwIGluZGV4IHJvb3QgZW50cnkgaWYgY29udGludWluZyBwcmV2aW91cyByZWFkZGlyLiAqLworCQlpZiAoaXJfcG9zID4gKHU4KilpZSAtICh1OCopaXIpCisJCQljb250aW51ZTsKKwkJLyogQWR2YW5jZSB0aGUgcG9zaXRpb24gZXZlbiBpZiBnb2luZyB0byBza2lwIHRoZSBlbnRyeS4gKi8KKwkJZnBvcyA9ICh1OCopaWUgLSAodTgqKWlyOworCQkvKiBTdWJtaXQgdGhlIG5hbWUgdG8gdGhlIGZpbGxkaXIgY2FsbGJhY2suICovCisJCXJjID0gbnRmc19maWxsZGlyKHZvbCwgZnBvcywgbmRpciwgTlVMTCwgaWUsIG5hbWUsIGRpcmVudCwKKwkJCQlmaWxsZGlyKTsKKwkJaWYgKHJjKSB7CisJCQlrZnJlZShpcik7CisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCS8qIFdlIGFyZSBkb25lIHdpdGggdGhlIGluZGV4IHJvb3QgYW5kIGNhbiBmcmVlIHRoZSBidWZmZXIuICovCisJa2ZyZWUoaXIpOworCWlyID0gTlVMTDsKKwkvKiBJZiB0aGVyZSBpcyBubyBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSB3ZSBhcmUgZmluaXNoZWQuICovCisJaWYgKCFOSW5vSW5kZXhBbGxvY1ByZXNlbnQobmRpcikpCisJCWdvdG8gRU9EOworCS8qIEFkdmFuY2UgZnBvcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmRleCBhbGxvY2F0aW9uLiAqLworCWZwb3MgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKK3NraXBfaW5kZXhfcm9vdDoKKwlrYWRkciA9IE5VTEw7CisJcHJldl9pYV9wb3MgPSAtMUxMOworCS8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCWlhX3BvcyA9IChzNjQpZnBvcyAtIHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWlhX21hcHBpbmcgPSB2ZGlyLT5pX21hcHBpbmc7CisJYm1wX3ZpID0gbmRpci0+aXR5cGUuaW5kZXguYm1wX2lubzsKKwlpZiAodW5saWtlbHkoIWJtcF92aSkpIHsKKwkJbnRmc19kZWJ1ZygiSW5vZGUgMHglbHgsIHJlZ2V0dGluZyBpbmRleCBiaXRtYXAuIiwgdmRpci0+aV9pbm8pOworCQlibXBfdmkgPSBudGZzX2F0dHJfaWdldCh2ZGlyLCBBVF9CSVRNQVAsIEkzMCwgNCk7CisJCWlmIChJU19FUlIoYm1wX3ZpKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJCWVyciA9IFBUUl9FUlIoYm1wX3ZpKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQluZGlyLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gYm1wX3ZpOworCX0KKwlibXBfbWFwcGluZyA9IGJtcF92aS0+aV9tYXBwaW5nOworCS8qIEdldCB0aGUgc3RhcnRpbmcgYml0bWFwIGJpdCBwb3NpdGlvbiBhbmQgc2FuaXR5IGNoZWNrIGl0LiAqLworCWJtcF9wb3MgPSBpYV9wb3MgPj4gbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzOworCWlmICh1bmxpa2VseShibXBfcG9zID4+IDMgPj0gYm1wX3ZpLT5pX3NpemUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJDdXJyZW50IGluZGV4IGFsbG9jYXRpb24gcG9zaXRpb24gZXhjZWVkcyAiCisJCQkJImluZGV4IGJpdG1hcCBzaXplLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhcnRpbmcgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJpdG1hcCBwYWdlLiAqLworCWN1cl9ibXBfcG9zID0gYm1wX3BvcyAmICgoUEFHRV9DQUNIRV9TSVpFICogOCkgLSAxKTsKKwlibXBfcG9zICY9IH4odTY0KSgoUEFHRV9DQUNIRV9TSVpFICogOCkgLSAxKTsKK2dldF9uZXh0X2JtcF9wYWdlOgorCW50ZnNfZGVidWcoIlJlYWRpbmcgYml0bWFwIHdpdGggcGFnZSBpbmRleCAweCVsbHgsIGJpdCBvZnMgMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcyA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zICYKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKChQQUdFX0NBQ0hFX1NJWkUgKiA4KSAtIDEpKTsKKwlibXBfcGFnZSA9IG50ZnNfbWFwX3BhZ2UoYm1wX21hcHBpbmcsCisJCQlibXBfcG9zID4+ICgzICsgUEFHRV9DQUNIRV9TSElGVCkpOworCWlmIChJU19FUlIoYm1wX3BhZ2UpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJSZWFkaW5nIGluZGV4IGJpdG1hcCBmYWlsZWQuIik7CisJCWVyciA9IFBUUl9FUlIoYm1wX3BhZ2UpOworCQlibXBfcGFnZSA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJYm1wID0gKHU4KilwYWdlX2FkZHJlc3MoYm1wX3BhZ2UpOworCS8qIEZpbmQgbmV4dCBpbmRleCBibG9jayBpbiB1c2UuICovCisJd2hpbGUgKCEoYm1wW2N1cl9ibXBfcG9zID4+IDNdICYgKDEgPDwgKGN1cl9ibXBfcG9zICYgNykpKSkgeworZmluZF9uZXh0X2luZGV4X2J1ZmZlcjoKKwkJY3VyX2JtcF9wb3MrKzsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJpdG1hcCBwYWdlLCBnZXQgdGhlIG5leHQKKwkJICogcGFnZSwgYW5kIHB1dCBhd2F5IHRoZSBvbGQgb25lLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KChjdXJfYm1wX3BvcyA+PiAzKSA+PSBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJCQludGZzX3VubWFwX3BhZ2UoYm1wX3BhZ2UpOworCQkJYm1wX3BvcyArPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY3VyX2JtcF9wb3MgPSAwOworCQkJZ290byBnZXRfbmV4dF9ibXBfcGFnZTsKKwkJfQorCQkvKiBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYml0bWFwLCB3ZSBhcmUgZG9uZS4gKi8KKwkJaWYgKHVubGlrZWx5KCgoYm1wX3BvcyArIGN1cl9ibXBfcG9zKSA+PiAzKSA+PSB2ZGlyLT5pX3NpemUpKQorCQkJZ290byB1bm1fRU9EOworCQlpYV9wb3MgPSAoYm1wX3BvcyArIGN1cl9ibXBfcG9zKSA8PAorCQkJCW5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0czsKKwl9CisJbnRmc19kZWJ1ZygiSGFuZGxpbmcgaW5kZXggYnVmZmVyIDB4JWxseC4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zICsgY3VyX2JtcF9wb3MpOworCS8qIElmIHRoZSBjdXJyZW50IGluZGV4IGJ1ZmZlciBpcyBpbiB0aGUgc2FtZSBwYWdlIHdlIHJldXNlIHRoZSBwYWdlLiAqLworCWlmICgocHJldl9pYV9wb3MgJiBQQUdFX0NBQ0hFX01BU0spICE9IChpYV9wb3MgJiBQQUdFX0NBQ0hFX01BU0spKSB7CisJCXByZXZfaWFfcG9zID0gaWFfcG9zOworCQlpZiAobGlrZWx5KGlhX3BhZ2UgIT0gTlVMTCkpIHsKKwkJCXVubG9ja19wYWdlKGlhX3BhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOworCQl9CisJCS8qCisJCSAqIE1hcCB0aGUgcGFnZSBjYWNoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgaWFfcG9zLAorCQkgKiByZWFkaW5nIGl0IGZyb20gZGlzayBpZiBuZWNlc3NhcnkuCisJCSAqLworCQlpYV9wYWdlID0gbnRmc19tYXBfcGFnZShpYV9tYXBwaW5nLCBpYV9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCWlmIChJU19FUlIoaWFfcGFnZSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJSZWFkaW5nIGluZGV4IGFsbG9jYXRpb24gZGF0YSBmYWlsZWQuIik7CisJCQllcnIgPSBQVFJfRVJSKGlhX3BhZ2UpOworCQkJaWFfcGFnZSA9IE5VTEw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJbG9ja19wYWdlKGlhX3BhZ2UpOworCQlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKGlhX3BhZ2UpOworCX0KKwkvKiBHZXQgdGhlIGN1cnJlbnQgaW5kZXggYnVmZmVyLiAqLworCWlhID0gKElOREVYX0FMTE9DQVRJT04qKShrYWRkciArIChpYV9wb3MgJiB+UEFHRV9DQUNIRV9NQVNLICYKKwkJCX4oczY0KShuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSkpKTsKKwkvKiBCb3VuZHMgY2hlY2tzLiAqLworCWlmICh1bmxpa2VseSgodTgqKWlhIDwga2FkZHIgfHwgKHU4KilpYSA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSkgeworCQludGZzX2Vycm9yKHNiLCAiT3V0IG9mIGJvdW5kcyBjaGVjayBmYWlsZWQuIENvcnJ1cHQgZGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgMHglbHggb3IgZHJpdmVyIGJ1Zy4iLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwlpZiAodW5saWtlbHkoIW50ZnNfaXNfaW5keF9yZWNvcmQoaWEtPm1hZ2ljKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkRpcmVjdG9yeSBpbmRleCByZWNvcmQgd2l0aCB2Y24gMHglbGx4IGlzICIKKwkJCQkiY29ycnVwdC4gIENvcnJ1cHQgaW5vZGUgMHglbHguICBSdW4gY2hrZHNrLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKHVubGlrZWx5KHNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSAhPSAoaWFfcG9zICYKKwkJCX4oczY0KShuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSkpID4+CisJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzKSkgeworCQludGZzX2Vycm9yKHNiLCAiQWN0dWFsIFZDTiAoMHglbGx4KSBvZiBpbmRleCBidWZmZXIgaXMgIgorCQkJCSJkaWZmZXJlbnQgZnJvbSBleHBlY3RlZCBWQ04gKDB4JWxseCkuICIKKwkJCQkiRGlyZWN0b3J5IGlub2RlIDB4JWx4IGlzIGNvcnJ1cHQgb3IgZHJpdmVyICIKKwkJCQkiYnVnLiAiLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCXNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWlhX3BvcyA+PgorCQkJCW5kaXItPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMsIHZkaXItPmlfaW5vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAodW5saWtlbHkobGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTggIT0KKwkJCW5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJIjB4JWx4IGhhcyBhIHNpemUgKCV1KSBkaWZmZXJpbmcgZnJvbSB0aGUgIgorCQkJCSJkaXJlY3Rvcnkgc3BlY2lmaWVkIHNpemUgKCV1KS4gRGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgaXMgY29ycnVwdCBvciBkcml2ZXIgYnVnLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubywKKwkJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCwKKwkJCQluZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKWlhICsgbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZTsKKwlpZiAodW5saWtlbHkoaW5kZXhfZW5kID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJIjB4JWx4IGNyb3NzZXMgcGFnZSBib3VuZGFyeS4gSW1wb3NzaWJsZSEgIgorCQkJCSJDYW5ub3QgYWNjZXNzISBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoZSAiCisJCQkJImRyaXZlci4iLCAodW5zaWduZWQgbG9uZyBsb25nKWlhX3BvcyA+PgorCQkJCW5kaXItPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMsIHZkaXItPmlfaW5vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpYV9zdGFydCA9IGlhX3BvcyAmIH4oczY0KShuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSk7CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKHVubGlrZWx5KGluZGV4X2VuZCA+ICh1OCopaWEgKyBuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSkgeworCQludGZzX2Vycm9yKHNiLCAiU2l6ZSBvZiBpbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4IGV4Y2VlZHMgbWF4aW11bSBzaXplLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5IGluIHRoaXMgaW5kZXggYnVmZmVyLiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaWEtPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogTG9vcCB1bnRpbCB3ZSBleGNlZWQgdmFsaWQgbWVtb3J5IChjb3JydXB0aW9uIGNhc2UpIG9yIHVudGlsIHdlCisJICogcmVhY2ggdGhlIGxhc3QgZW50cnkgb3IgdW50aWwgZmlsbGRpciB0ZWxscyB1cyBpdCBoYXMgaGFkIGVub3VnaAorCSAqIG9yIHNpZ25hbHMgYW4gZXJyb3IgKGJvdGggY292ZXJlZCBieSB0aGUgcmMgdGVzdCkuCisJICovCisJZm9yICg7OyBpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkpIHsKKwkJbnRmc19kZWJ1ZygiSW4gaW5kZXggYWxsb2NhdGlvbiwgb2Zmc2V0IDB4JWxseC4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWFfc3RhcnQgKworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKCh1OCopaWUgLSAodTgqKWlhKSk7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICh1bmxpa2VseSgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkpCisJCQlnb3RvIGVycl9vdXQ7CisJCS8qIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEgbmFtZS4gKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKiBTa2lwIGluZGV4IGJsb2NrIGVudHJ5IGlmIGNvbnRpbnVpbmcgcHJldmlvdXMgcmVhZGRpci4gKi8KKwkJaWYgKGlhX3BvcyAtIGlhX3N0YXJ0ID4gKHU4KilpZSAtICh1OCopaWEpCisJCQljb250aW51ZTsKKwkJLyogQWR2YW5jZSB0aGUgcG9zaXRpb24gZXZlbiBpZiBnb2luZyB0byBza2lwIHRoZSBlbnRyeS4gKi8KKwkJZnBvcyA9ICh1OCopaWUgLSAodTgqKWlhICsKKwkJCQkoc2xlNjRfdG9fY3B1KGlhLT5pbmRleF9ibG9ja192Y24pIDw8CisJCQkJbmRpci0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cykgKworCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplOworCQkvKgorCQkgKiBTdWJtaXQgdGhlIG5hbWUgdG8gdGhlIEBmaWxsZGlyIGNhbGxiYWNrLiAgTm90ZSwKKwkJICogbnRmc19maWxsZGlyKCkgZHJvcHMgdGhlIGxvY2sgb24gQGlhX3BhZ2UgYnV0IGl0IHJldGFrZXMgaXQKKwkJICogYmVmb3JlIHJldHVybmluZywgdW5sZXNzIGEgbm9uLXplcm8gdmFsdWUgaXMgcmV0dXJuZWQgaW4KKwkJICogd2hpY2ggY2FzZSB0aGUgcGFnZSBpcyBsZWZ0IHVubG9ja2VkLgorCQkgKi8KKwkJcmMgPSBudGZzX2ZpbGxkaXIodm9sLCBmcG9zLCBuZGlyLCBpYV9wYWdlLCBpZSwgbmFtZSwgZGlyZW50LAorCQkJCWZpbGxkaXIpOworCQlpZiAocmMpIHsKKwkJCS8qIEBpYV9wYWdlIGlzIGFscmVhZHkgdW5sb2NrZWQgaW4gdGhpcyBjYXNlLiAqLworCQkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKGJtcF9wYWdlKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwl9CisJZ290byBmaW5kX25leHRfaW5kZXhfYnVmZmVyOwordW5tX0VPRDoKKwlpZiAoaWFfcGFnZSkgeworCQl1bmxvY2tfcGFnZShpYV9wYWdlKTsKKwkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOworCX0KKwludGZzX3VubWFwX3BhZ2UoYm1wX3BhZ2UpOworRU9EOgorCS8qIFdlIGFyZSBmaW5pc2hlZCwgc2V0IGZwb3MgdG8gRU9ELiAqLworCWZwb3MgPSB2ZGlyLT5pX3NpemUgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKK2Fib3J0OgorCWtmcmVlKG5hbWUpOworZG9uZToKKyNpZmRlZiBERUJVRworCWlmICghcmMpCisJCW50ZnNfZGVidWcoIkVPRCwgZnBvcyAweCVsbHgsIHJldHVybmluZyAwLiIsIGZwb3MpOworCWVsc2UKKwkJbnRmc19kZWJ1ZygiZmlsbGRpciByZXR1cm5lZCAlaSwgZnBvcyAweCVsbHgsIHJldHVybmluZyAwLiIsCisJCQkJcmMsIGZwb3MpOworI2VuZGlmCisJZmlscC0+Zl9wb3MgPSBmcG9zOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoYm1wX3BhZ2UpCisJCW50ZnNfdW5tYXBfcGFnZShibXBfcGFnZSk7CisJaWYgKGlhX3BhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UoaWFfcGFnZSk7CisJCW50ZnNfdW5tYXBfcGFnZShpYV9wYWdlKTsKKwl9CisJaWYgKGlyKQorCQlrZnJlZShpcik7CisJaWYgKG5hbWUpCisJCWtmcmVlKG5hbWUpOworCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKG5kaXIpOworCWlmICghZXJyKQorCQllcnIgPSAtRUlPOworCW50ZnNfZGVidWcoIkZhaWxlZC4gUmV0dXJuaW5nIGVycm9yIGNvZGUgJWkuIiwgLWVycik7CisJZmlscC0+Zl9wb3MgPSBmcG9zOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19kaXJfb3BlbiAtIGNhbGxlZCB3aGVuIGFuIGlub2RlIGlzIGFib3V0IHRvIGJlIG9wZW5lZAorICogQHZpOgkJaW5vZGUgdG8gYmUgb3BlbmVkCisgKiBAZmlscDoJZmlsZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgaW5vZGUKKyAqCisgKiBMaW1pdCBkaXJlY3Rvcnkgc2l6ZSB0byB0aGUgcGFnZSBjYWNoZSBsaW1pdCBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlIHVuc2lnbmVkCisgKiBsb25nIGlzIDMyLWJpdHMuIFRoaXMgaXMgdGhlIG1vc3Qgd2UgY2FuIGRvIGZvciBub3cgd2l0aG91dCBvdmVyZmxvd2luZyB0aGUKKyAqIHBhZ2UgY2FjaGUgcGFnZSBpbmRleC4gRG9pbmcgaXQgdGhpcyB3YXkgbWVhbnMgd2UgZG9uJ3QgcnVuIGludG8gcHJvYmxlbXMKKyAqIGJlY2F1c2Ugb2YgZXhpc3RpbmcgdG9vIGxhcmdlIGRpcmVjdG9yaWVzLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb3cgdGhlCisgKiB1c2VyIHRvIHJlYWQgdGhlIGFjY2Vzc2libGUgcGFydCBvZiB0aGUgZGlyZWN0b3J5IGJ1dCBJIGRvdWJ0IHZlcnkgbXVjaAorICogYW55b25lIGlzIGdvaW5nIHRvIGhpdCB0aGlzIGNoZWNrIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gdGhlcmUgaXMgbm8KKyAqIHBvaW50IGluIGFkZGluZyB0aGUgZXh0cmEgY29tcGxleGl0eSByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMuCisgKgorICogT24gNjQtYml0IGFyY2hpdGVjdHVyZXMsIHRoZSBjaGVjayBpcyBob3BlZnVsbHkgb3B0aW1pemVkIGF3YXkgYnkgdGhlCisgKiBjb21waWxlci4KKyAqLworc3RhdGljIGludCBudGZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqdmksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPCA4KSB7CisJCWlmICh2aS0+aV9zaXplID4gTUFYX0xGU19GSUxFU0laRSkKKwkJCXJldHVybiAtRUZCSUc7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIG50ZnNfZGlyX2ZzeW5jIC0gc3luYyBhIGRpcmVjdG9yeSB0byBkaXNrCisgKiBAZmlscDoJZGlyZWN0b3J5IHRvIGJlIHN5bmNlZAorICogQGRlbnRyeToJZGVudHJ5IGRlc2NyaWJpbmcgdGhlIGRpcmVjdG9yeSB0byBzeW5jCisgKiBAZGF0YXN5bmM6CWlmIG5vbi16ZXJvIG9ubHkgZmx1c2ggdXNlciBkYXRhIGFuZCBub3QgbWV0YWRhdGEKKyAqCisgKiBEYXRhIGludGVncml0eSBzeW5jIG9mIGEgZGlyZWN0b3J5IHRvIGRpc2suICBVc2VkIGZvciBmc3luYywgZmRhdGFzeW5jLCBhbmQKKyAqIG1zeW5jIHN5c3RlbSBjYWxscy4gIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gZmlsZS5jOjpudGZzX2ZpbGVfZnN5bmMoKS4KKyAqCisgKiBXcml0ZSB0aGUgbWZ0IHJlY29yZCBhbmQgYWxsIGFzc29jaWF0ZWQgZXh0ZW50IG1mdCByZWNvcmRzIGFzIHdlbGwgYXMgdGhlCisgKiAkSU5ERVhfQUxMT0NBVElPTiBhbmQgJEJJVE1BUCBhdHRyaWJ1dGVzIGFuZCB0aGVuIHN5bmMgdGhlIGJsb2NrIGRldmljZS4KKyAqCisgKiBJZiBAZGF0YXN5bmMgaXMgdHJ1ZSwgd2UgZG8gbm90IHdhaXQgb24gdGhlIGlub2RlKHMpIHRvIGJlIHdyaXR0ZW4gb3V0CisgKiBidXQgd2UgYWx3YXlzIHdhaXQgb24gdGhlIHBhZ2UgY2FjaGUgcGFnZXMgdG8gYmUgd3JpdHRlbiBvdXQuCisgKgorICogTm90ZTogSW4gdGhlIHBhc3QgQGZpbHAgY291bGQgYmUgTlVMTCBzbyB3ZSBpZ25vcmUgaXQgYXMgd2UgZG9uJ3QgbmVlZCBpdAorICogYW55d2F5LgorICoKKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGlub2RlLgorICoKKyAqIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHNvIHdyaXRlIGFsbCBhdHRyaWJ1dGUvaW5kZXggaW5vZGVzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBpbm9kZSBidXQgc2luY2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mIGdldHRpbmcgdG8gdGhlbSB3ZSBpZ25vcmUKKyAqIHRoaXMgcHJvYmxlbSBmb3Igbm93LiAgV2UgZG8gd3JpdGUgdGhlICRCSVRNQVAgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQKKyAqIHdoaWNoIGlzIHRoZSBpbXBvcnRhbnQgb25lIGZvciBhIGRpcmVjdG9yeSBzbyB0aGluZ3MgYXJlIG5vdCB0b28gYmFkLgorICovCitzdGF0aWMgaW50IG50ZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCWludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gZGVudHJ5LT5kX2lub2RlOworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwlpbnQgZXJyLCByZXQ7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHguIiwgdmktPmlfaW5vKTsKKwlCVUdfT04oIVNfSVNESVIodmktPmlfbW9kZSkpOworCWlmIChOSW5vSW5kZXhBbGxvY1ByZXNlbnQobmkpICYmIG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vKQorCQl3cml0ZV9pbm9kZV9ub3cobmktPml0eXBlLmluZGV4LmJtcF9pbm8sICFkYXRhc3luYyk7CisJcmV0ID0gbnRmc193cml0ZV9pbm9kZSh2aSwgMSk7CisJd3JpdGVfaW5vZGVfbm93KHZpLCAhZGF0YXN5bmMpOworCWVyciA9IHN5bmNfYmxvY2tkZXYodmktPmlfc2ItPnNfYmRldik7CisJaWYgKHVubGlrZWx5KGVyciAmJiAhcmV0KSkKKwkJcmV0ID0gZXJyOworCWlmIChsaWtlbHkoIXJldCkpCisJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJZWxzZQorCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJGYWlsZWQgdG8gZiVzc3luYyBpbm9kZSAweCVseC4gIEVycm9yICIKKwkJCQkiJXUuIiwgZGF0YXN5bmMgPyAiZGF0YSIgOiAiIiwgdmktPmlfaW5vLCAtcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG50ZnNfZGlyX29wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCS8qIFNlZWsgaW5zaWRlIGRpcmVjdG9yeS4gKi8KKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAkvKiBSZXR1cm4gLUVJU0RJUi4gKi8KKwkucmVhZGRpcgk9IG50ZnNfcmVhZGRpciwJCS8qIFJlYWQgZGlyZWN0b3J5IGNvbnRlbnRzLiAqLworI2lmZGVmIE5URlNfUlcKKwkuZnN5bmMJCT0gbnRmc19kaXJfZnN5bmMsCS8qIFN5bmMgYSBkaXJlY3RvcnkgdG8gZGlzay4gKi8KKwkvKi5haW9fZnN5bmMJPSAsKi8JCQkvKiBTeW5jIGFsbCBvdXRzdGFuZGluZyBhc3luYworCQkJCQkJICAgaS9vIG9wZXJhdGlvbnMgb24gYSBraW9jYi4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyouaW9jdGwJPSAsKi8JCQkvKiBQZXJmb3JtIGZ1bmN0aW9uIG9uIHRoZQorCQkJCQkJICAgbW91bnRlZCBmaWxlc3lzdGVtLiAqLworCS5vcGVuCQk9IG50ZnNfZGlyX29wZW4sCS8qIE9wZW4gZGlyZWN0b3J5LiAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGlyLmggYi9mcy9udGZzL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTc1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2Rpci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBkaXIuaCAtIERlZmluZXMgZm9yIGRpcmVjdG9yeSBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YKKyAqCSAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19ESVJfSAorI2RlZmluZSBfTElOVVhfTlRGU19ESVJfSAorCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKgorICogbnRmc19uYW1lIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBmaWxlIG5hbWUgdG8gdGhlIGNhbGxlciBvZgorICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIGluIG9yZGVyIGZvciB0aGUgY2FsbGVyIChuYW1laS5jOjpudGZzX2xvb2t1cCgpKQorICogdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU1GVF9SRUYgbXJlZjsKKwlGSUxFX05BTUVfVFlQRV9GTEFHUyB0eXBlOworCXU4IGxlbjsKKwludGZzY2hhciBuYW1lWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIG50ZnNfbmFtZTsKKworLyogVGhlIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmcgJEkzMCBhcyBhIGdsb2JhbCBjb25zdGFudC4gKi8KK2V4dGVybiBudGZzY2hhciBJMzBbNV07CisKK2V4dGVybiBNRlRfUkVGIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUobnRmc19pbm9kZSAqZGlyX25pLAorCQljb25zdCBudGZzY2hhciAqdW5hbWUsIGNvbnN0IGludCB1bmFtZV9sZW4sIG50ZnNfbmFtZSAqKnJlcyk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19GU19ESVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9lbmRpYW4uaCBiL2ZzL250ZnMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YjViZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZW5kaWFuLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGVuZGlhbi5oIC0gRGVmaW5lcyBmb3IgZW5kaWFubmVzcyBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuCisgKgkgICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfTlRGU19FTkRJQU5fSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisKKy8qCisgKiBTaWduZWQgZW5kaWFubmVzcyBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHMxNiBzbGUxNl90b19jcHUoc2xlMTYgeCkKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKF9fZm9yY2UgbGUxNil4KTsKK30KKworc3RhdGljIGlubGluZSBzMzIgc2xlMzJfdG9fY3B1KHNsZTMyIHgpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KChfX2ZvcmNlIGxlMzIpeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczY0IHNsZTY0X3RvX2NwdShzbGU2NCB4KQoreworCXJldHVybiBsZTY0X3RvX2NwdSgoX19mb3JjZSBsZTY0KXgpOworfQorCitzdGF0aWMgaW5saW5lIHMxNiBzbGUxNl90b19jcHVwKHNsZTE2ICp4KQoreworCXJldHVybiBsZTE2X3RvX2NwdSgqKF9fZm9yY2UgbGUxNiopeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyIHNsZTMyX3RvX2NwdXAoc2xlMzIgKngpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KCooX19mb3JjZSBsZTMyKil4KTsKK30KKworc3RhdGljIGlubGluZSBzNjQgc2xlNjRfdG9fY3B1cChzbGU2NCAqeCkKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUoKihfX2ZvcmNlIGxlNjQqKXgpOworfQorCitzdGF0aWMgaW5saW5lIHNsZTE2IGNwdV90b19zbGUxNihzMTYgeCkKK3sKKwlyZXR1cm4gKF9fZm9yY2Ugc2xlMTYpY3B1X3RvX2xlMTYoeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2xlMzIgY3B1X3RvX3NsZTMyKHMzMiB4KQoreworCXJldHVybiAoX19mb3JjZSBzbGUzMiljcHVfdG9fbGUzMih4KTsKK30KKworc3RhdGljIGlubGluZSBzbGU2NCBjcHVfdG9fc2xlNjQoczY0IHgpCit7CisJcmV0dXJuIChfX2ZvcmNlIHNsZTY0KWNwdV90b19sZTY0KHgpOworfQorCitzdGF0aWMgaW5saW5lIHNsZTE2IGNwdV90b19zbGUxNnAoczE2ICp4KQoreworCXJldHVybiAoX19mb3JjZSBzbGUxNiljcHVfdG9fbGUxNigqeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2xlMzIgY3B1X3RvX3NsZTMycChzMzIgKngpCit7CisJcmV0dXJuIChfX2ZvcmNlIHNsZTMyKWNwdV90b19sZTMyKCp4KTsKK30KKworc3RhdGljIGlubGluZSBzbGU2NCBjcHVfdG9fc2xlNjRwKHM2NCAqeCkKK3sKKwlyZXR1cm4gKF9fZm9yY2Ugc2xlNjQpY3B1X3RvX2xlNjQoKngpOworfQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvZmlsZS5jIGIvZnMvbnRmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4NzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogZmlsZS5jIC0gTlRGUyBrZXJuZWwgZmlsZSBvcGVyYXRpb25zLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2ZpbGVfb3BlbiAtIGNhbGxlZCB3aGVuIGFuIGlub2RlIGlzIGFib3V0IHRvIGJlIG9wZW5lZAorICogQHZpOgkJaW5vZGUgdG8gYmUgb3BlbmVkCisgKiBAZmlscDoJZmlsZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgaW5vZGUKKyAqCisgKiBMaW1pdCBmaWxlIHNpemUgdG8gdGhlIHBhZ2UgY2FjaGUgbGltaXQgb24gYXJjaGl0ZWN0dXJlcyB3aGVyZSB1bnNpZ25lZCBsb25nCisgKiBpcyAzMi1iaXRzLiBUaGlzIGlzIHRoZSBtb3N0IHdlIGNhbiBkbyBmb3Igbm93IHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlIHBhZ2UKKyAqIGNhY2hlIHBhZ2UgaW5kZXguIERvaW5nIGl0IHRoaXMgd2F5IG1lYW5zIHdlIGRvbid0IHJ1biBpbnRvIHByb2JsZW1zIGJlY2F1c2UKKyAqIG9mIGV4aXN0aW5nIHRvbyBsYXJnZSBmaWxlcy4gSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG93IHRoZSB1c2VyIHRvIHJlYWQKKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYnV0IEkgZG91YnQgdmVyeSBtdWNoIGFueW9uZSBpcyBnb2luZyB0byBoaXQgdGhpcworICogY2hlY2sgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBhZGRpbmcgdGhlIGV4dHJhCisgKiBjb21wbGV4aXR5IHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcy4KKyAqCisgKiBPbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgdGhlIGNoZWNrIGlzIGhvcGVmdWxseSBvcHRpbWl6ZWQgYXdheSBieSB0aGUKKyAqIGNvbXBpbGVyLgorICoKKyAqIEFmdGVyIHRoZSBjaGVjayBwYXNzZXMsIGp1c3QgY2FsbCBnZW5lcmljX2ZpbGVfb3BlbigpIHRvIGRvIGl0cyB3b3JrLgorICovCitzdGF0aWMgaW50IG50ZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqdmksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPCA4KSB7CisJCWlmICh2aS0+aV9zaXplID4gTUFYX0xGU19GSUxFU0laRSkKKwkJCXJldHVybiAtRUZCSUc7CisJfQorCXJldHVybiBnZW5lcmljX2ZpbGVfb3Blbih2aSwgZmlscCk7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc19maWxlX2ZzeW5jIC0gc3luYyBhIGZpbGUgdG8gZGlzaworICogQGZpbHA6CWZpbGUgdG8gYmUgc3luY2VkCisgKiBAZGVudHJ5OglkZW50cnkgZGVzY3JpYmluZyB0aGUgZmlsZSB0byBzeW5jCisgKiBAZGF0YXN5bmM6CWlmIG5vbi16ZXJvIG9ubHkgZmx1c2ggdXNlciBkYXRhIGFuZCBub3QgbWV0YWRhdGEKKyAqCisgKiBEYXRhIGludGVncml0eSBzeW5jIG9mIGEgZmlsZSB0byBkaXNrLiAgVXNlZCBmb3IgZnN5bmMsIGZkYXRhc3luYywgYW5kIG1zeW5jCisgKiBzeXN0ZW0gY2FsbHMuICBUaGlzIGZ1bmN0aW9uIGlzIGluc3BpcmVkIGJ5IGZzL2J1ZmZlci5jOjpmaWxlX2ZzeW5jKCkuCisgKgorICogSWYgQGRhdGFzeW5jIGlzIGZhbHNlLCB3cml0ZSB0aGUgbWZ0IHJlY29yZCBhbmQgYWxsIGFzc29jaWF0ZWQgZXh0ZW50IG1mdAorICogcmVjb3JkcyBhcyB3ZWxsIGFzIHRoZSAkREFUQSBhdHRyaWJ1dGUgYW5kIHRoZW4gc3luYyB0aGUgYmxvY2sgZGV2aWNlLgorICoKKyAqIElmIEBkYXRhc3luYyBpcyB0cnVlIGFuZCB0aGUgYXR0cmlidXRlIGlzIG5vbi1yZXNpZGVudCwgd2Ugc2tpcCB0aGUgd3JpdGluZworICogb2YgdGhlIG1mdCByZWNvcmQgYW5kIGFsbCBhc3NvY2lhdGVkIGV4dGVudCBtZnQgcmVjb3JkcyAodGhpcyBtaWdodCBzdGlsbAorICogaGFwcGVuIGR1ZSB0byB0aGUgd3JpdGVfaW5vZGVfbm93KCkgY2FsbCkuCisgKgorICogQWxzbywgaWYgQGRhdGFzeW5jIGlzIHRydWUsIHdlIGRvIG5vdCB3YWl0IG9uIHRoZSBpbm9kZSB0byBiZSB3cml0dGVuIG91dAorICogYnV0IHdlIGFsd2F5cyB3YWl0IG9uIHRoZSBwYWdlIGNhY2hlIHBhZ2VzIHRvIGJlIHdyaXR0ZW4gb3V0LgorICoKKyAqIE5vdGU6IEluIHRoZSBwYXN0IEBmaWxwIGNvdWxkIGJlIE5VTEwgc28gd2UgaWdub3JlIGl0IGFzIHdlIGRvbid0IG5lZWQgaXQKKyAqIGFueXdheS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbm9kZS4KKyAqCisgKiBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWxzbyB3cml0ZSBhbGwgYXR0cmlidXRlL2luZGV4IGlub2RlcyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoaXMgaW5vZGUgYnV0IHNpbmNlIHdlIGhhdmUgbm8gc2ltcGxlIHdheSBvZiBnZXR0aW5nIHRvIHRoZW0gd2UgaWdub3JlCisgKiB0aGlzIHByb2JsZW0gZm9yIG5vdy4KKyAqLworc3RhdGljIGludCBudGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqdmkgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVyciwgcmV0ID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOworCUJVR19PTihTX0lTRElSKHZpLT5pX21vZGUpKTsKKwlpZiAoIWRhdGFzeW5jIHx8ICFOSW5vTm9uUmVzaWRlbnQoTlRGU19JKHZpKSkpCisJCXJldCA9IG50ZnNfd3JpdGVfaW5vZGUodmksIDEpOworCXdyaXRlX2lub2RlX25vdyh2aSwgIWRhdGFzeW5jKTsKKwllcnIgPSBzeW5jX2Jsb2NrZGV2KHZpLT5pX3NiLT5zX2JkZXYpOworCWlmICh1bmxpa2VseShlcnIgJiYgIXJldCkpCisJCXJldCA9IGVycjsKKwlpZiAobGlrZWx5KCFyZXQpKQorCQludGZzX2RlYnVnKCJEb25lLiIpOworCWVsc2UKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGYlc3N5bmMgaW5vZGUgMHglbHguICBFcnJvciAiCisJCQkJIiV1LiIsIGRhdGFzeW5jID8gImRhdGEiIDogIiIsIHZpLT5pX2lubywgLXJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudGZzX2ZpbGVfb3BzID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywJICAvKiBTZWVrIGluc2lkZSBmaWxlLiAqLworCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAkgIC8qIFJlYWQgZnJvbSBmaWxlLiAqLworCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwgIC8qIEFzeW5jIHJlYWQgZnJvbSBmaWxlLiAqLworCS5yZWFkdgkJPSBnZW5lcmljX2ZpbGVfcmVhZHYsCSAgLyogUmVhZCBmcm9tIGZpbGUuICovCisjaWZkZWYgTlRGU19SVworCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCSAgLyogV3JpdGUgdG8gZmlsZS4gKi8KKwkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwgLyogQXN5bmMgd3JpdGUgdG8gZmlsZS4gKi8KKwkud3JpdGV2CQk9IGdlbmVyaWNfZmlsZV93cml0ZXYsCSAgLyogV3JpdGUgdG8gZmlsZS4gKi8KKwkvKi5yZWxlYXNlCT0gLCovCQkJICAvKiBMYXN0IGZpbGUgaXMgY2xvc2VkLiAgU2VlCisJCQkJCQkgICAgIGZzL2V4dDIvZmlsZS5jOjoKKwkJCQkJCSAgICAgZXh0Ml9yZWxlYXNlX2ZpbGUoKSBmb3IKKwkJCQkJCSAgICAgaG93IHRvIHVzZSB0aGlzIHRvIGRpc2NhcmQKKwkJCQkJCSAgICAgcHJlYWxsb2NhdGVkIHNwYWNlIGZvcgorCQkJCQkJICAgICB3cml0ZSBvcGVuZWQgZmlsZXMuICovCisJLmZzeW5jCQk9IG50ZnNfZmlsZV9mc3luYywJICAvKiBTeW5jIGEgZmlsZSB0byBkaXNrLiAqLworCS8qLmFpb19mc3luYwk9ICwqLwkJCSAgLyogU3luYyBhbGwgb3V0c3RhbmRpbmcgYXN5bmMKKwkJCQkJCSAgICAgaS9vIG9wZXJhdGlvbnMgb24gYQorCQkJCQkJICAgICBraW9jYi4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyouaW9jdGwJPSAsKi8JCQkgIC8qIFBlcmZvcm0gZnVuY3Rpb24gb24gdGhlCisJCQkJCQkgICAgIG1vdW50ZWQgZmlsZXN5c3RlbS4gKi8KKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwJICAvKiBNbWFwIGZpbGUuICovCisJLm9wZW4JCT0gbnRmc19maWxlX29wZW4sCSAgLyogT3BlbiBmaWxlLiAqLworCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwgIC8qIFplcm8tY29weSBkYXRhIHNlbmQgd2l0aAorCQkJCQkJICAgICB0aGUgZGF0YSBzb3VyY2UgYmVpbmcgb24KKwkJCQkJCSAgICAgdGhlIG50ZnMgcGFydGl0aW9uLiAgV2UKKwkJCQkJCSAgICAgZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dAorCQkJCQkJICAgICB0aGUgZGF0YSBkZXN0aW5hdGlvbi4gKi8KKwkvKi5zZW5kcGFnZQk9ICwqLwkJCSAgLyogWmVyby1jb3B5IGRhdGEgc2VuZCB3aXRoCisJCQkJCQkgICAgIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGJlaW5nCisJCQkJCQkgICAgIG9uIHRoZSBudGZzIHBhcnRpdGlvbi4gIFdlCisJCQkJCQkgICAgIGRvIG5vdCBuZWVkIHRvIGNhcmUgYWJvdXQKKwkJCQkJCSAgICAgdGhlIGRhdGEgc291cmNlLiAqLworfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19maWxlX2lub2RlX29wcyA9IHsKKyNpZmRlZiBOVEZTX1JXCisJLnRydW5jYXRlCT0gbnRmc190cnVuY2F0ZV92ZnMsCisJLnNldGF0dHIJPSBudGZzX3NldGF0dHIsCisjZW5kaWYgLyogTlRGU19SVyAqLworfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudGZzX2VtcHR5X2ZpbGVfb3BzID0ge307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZW1wdHlfaW5vZGVfb3BzID0ge307CmRpZmYgLS1naXQgYS9mcy9udGZzL2luZGV4LmMgYi9mcy9udGZzL2luZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiZDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5kZXguYwpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIGluZGV4LmMgLSBOVEZTIGtlcm5lbCBpbmRleCBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJjb2xsYXRlLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJpbmRleC5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2luZGV4X2N0eF9nZXQgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbmRleCBjb250ZXh0CisgKiBAaWR4X25pOgludGZzIGluZGV4IGlub2RlIHdpdGggd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGUgY29udGV4dAorICoKKyAqIEFsbG9jYXRlIGEgbmV3IGluZGV4IGNvbnRleHQsIGluaXRpYWxpemUgaXQgd2l0aCBAaWR4X25pIGFuZCByZXR1cm4gaXQuCisgKiBSZXR1cm4gTlVMTCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqCisgKiBMb2NraW5nOiAgQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5kZXggaW5vZGUuCisgKi8KK250ZnNfaW5kZXhfY29udGV4dCAqbnRmc19pbmRleF9jdHhfZ2V0KG50ZnNfaW5vZGUgKmlkeF9uaSkKK3sKKwludGZzX2luZGV4X2NvbnRleHQgKmljdHg7CisKKwlpY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2luZGV4X2N0eF9jYWNoZSwgU0xBQl9OT0ZTKTsKKwlpZiAoaWN0eCkgeworCQlpY3R4LT5pZHhfbmkgPSBpZHhfbmk7CisJCWljdHgtPmVudHJ5ID0gTlVMTDsKKwkJaWN0eC0+ZGF0YSA9IE5VTEw7CisJCWljdHgtPmRhdGFfbGVuID0gMDsKKwkJaWN0eC0+aXNfaW5fcm9vdCA9IDA7CisJCWljdHgtPmlyID0gTlVMTDsKKwkJaWN0eC0+YWN0eCA9IE5VTEw7CisJCWljdHgtPmJhc2VfbmkgPSBOVUxMOworCQlpY3R4LT5pYSA9IE5VTEw7CisJCWljdHgtPnBhZ2UgPSBOVUxMOworCX0KKwlyZXR1cm4gaWN0eDsKK30KKworLyoqCisgKiBudGZzX2luZGV4X2N0eF9wdXQgLSByZWxlYXNlIGFuIGluZGV4IGNvbnRleHQKKyAqIEBpY3R4OglpbmRleCBjb250ZXh0IHRvIGZyZWUKKyAqCisgKiBSZWxlYXNlIHRoZSBpbmRleCBjb250ZXh0IEBpY3R4LCByZWxlYXNpbmcgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIExvY2tpbmc6ICBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbmRleCBpbm9kZS4KKyAqLwordm9pZCBudGZzX2luZGV4X2N0eF9wdXQobnRmc19pbmRleF9jb250ZXh0ICppY3R4KQoreworCWlmIChpY3R4LT5lbnRyeSkgeworCQlpZiAoaWN0eC0+aXNfaW5fcm9vdCkgeworCQkJaWYgKGljdHgtPmFjdHgpCisJCQkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGljdHgtPmFjdHgpOworCQkJaWYgKGljdHgtPmJhc2VfbmkpCisJCQkJdW5tYXBfbWZ0X3JlY29yZChpY3R4LT5iYXNlX25pKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gaWN0eC0+cGFnZTsKKwkJCWlmIChwYWdlKSB7CisJCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQl9CisJCX0KKwl9CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfaW5kZXhfY3R4X2NhY2hlLCBpY3R4KTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbnRmc19pbmRleF9sb29rdXAgLSBmaW5kIGEga2V5IGluIGFuIGluZGV4IGFuZCByZXR1cm4gaXRzIGluZGV4IGVudHJ5CisgKiBAa2V5OglbSU5dIGtleSBmb3Igd2hpY2ggdG8gc2VhcmNoIGluIHRoZSBpbmRleAorICogQGtleV9sZW46CVtJTl0gbGVuZ3RoIG9mIEBrZXkgaW4gYnl0ZXMKKyAqIEBpY3R4OglbSU4vT1VUXSBjb250ZXh0IGRlc2NyaWJpbmcgdGhlIGluZGV4IGFuZCB0aGUgcmV0dXJuZWQgZW50cnkKKyAqCisgKiBCZWZvcmUgY2FsbGluZyBudGZzX2luZGV4X2xvb2t1cCgpLCBAaWN0eCBtdXN0IGhhdmUgYmVlbiBvYnRhaW5lZCBmcm9tIGEKKyAqIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfZ2V0KCkuCisgKgorICogTG9vayBmb3IgdGhlIEBrZXkgaW4gdGhlIGluZGV4IHNwZWNpZmllZCBieSB0aGUgaW5kZXggbG9va3VwIGNvbnRleHQgQGljdHguCisgKiBudGZzX2luZGV4X2xvb2t1cCgpIHdhbGtzIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kZXggbG9va2luZyBmb3IgdGhlIEBrZXkuCisgKgorICogSWYgdGhlIEBrZXkgaXMgZm91bmQgaW4gdGhlIGluZGV4LCAwIGlzIHJldHVybmVkIGFuZCBAaWN0eCBpcyBzZXR1cCB0bworICogZGVzY3JpYmUgdGhlIGluZGV4IGVudHJ5IGNvbnRhaW5pbmcgdGhlIG1hdGNoaW5nIEBrZXkuICBAaWN0eC0+ZW50cnkgaXMgdGhlCisgKiBpbmRleCBlbnRyeSBhbmQgQGljdHgtPmRhdGEgYW5kIEBpY3R4LT5kYXRhX2xlbiBhcmUgdGhlIGluZGV4IGVudHJ5IGRhdGEgYW5kCisgKiBpdHMgbGVuZ3RoIGluIGJ5dGVzLCByZXNwZWN0aXZlbHkuCisgKgorICogSWYgdGhlIEBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSBpbmRleCwgLUVOT0VOVCBpcyByZXR1cm5lZCBhbmQgQGljdHggaXMKKyAqIHNldHVwIHRvIGRlc2NyaWJlIHRoZSBpbmRleCBlbnRyeSB3aG9zZSBrZXkgY29sbGF0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgKiBzZWFyY2ggQGtleSwgaS5lLiB0aGlzIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW5kZXggYXQgd2hpY2ggYW4gaW5kZXggZW50cnkKKyAqIHdpdGggYSBrZXkgb2YgQGtleSB3b3VsZCBuZWVkIHRvIGJlIGluc2VydGVkLgorICoKKyAqIElmIGFuIGVycm9yIG9jY3VycyByZXR1cm4gdGhlIG5lZ2F0aXZlIGVycm9yIGNvZGUgYW5kIEBpY3R4IGlzIGxlZnQKKyAqIHVudG91Y2hlZC4KKyAqCisgKiBXaGVuIGZpbmlzaGVkIHdpdGggdGhlIGVudHJ5IGFuZCBpdHMgZGF0YSwgY2FsbCBudGZzX2luZGV4X2N0eF9wdXQoKSB0byBmcmVlCisgKiB0aGUgY29udGV4dCBhbmQgb3RoZXIgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IHdhcyBtb2RpZmllZCwgY2FsbCBmbHVzaF9kY2FjaGVfaW5kZXhfZW50cnlfcGFnZSgpCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGFuZCBlaXRoZXIgbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkKKyAqIG9yIG50ZnNfaW5kZXhfZW50cnlfd3JpdGUoKSBiZWZvcmUgdGhlIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfcHV0KCkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIHRvIGRpc2suCisgKgorICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5kZXggaW5vZGUuCisgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCisgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CisgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaAorICoJICAgICAgIGFwcGxpZXMgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBiZWZvcmUgd3JpdGluZyBvdXQgYW5kIHRoZW4KKyAqCSAgICAgICByZW1vdmVzIHRoZW0gYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGlzIGNvbXBsZXRlIGFmdGVyIHdoaWNoIGl0IAorICoJICAgICAgIHVubG9ja3MgdGhlIHBhZ2UuCisgKi8KK2ludCBudGZzX2luZGV4X2xvb2t1cChjb25zdCB2b2lkICprZXksIGNvbnN0IGludCBrZXlfbGVuLAorCQludGZzX2luZGV4X2NvbnRleHQgKmljdHgpCit7CisJVkNOIHZjbiwgb2xkX3ZjbjsKKwludGZzX2lub2RlICppZHhfbmkgPSBpY3R4LT5pZHhfbmk7CisJbnRmc192b2x1bWUgKnZvbCA9IGlkeF9uaS0+dm9sOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCW50ZnNfaW5vZGUgKmJhc2VfbmkgPSBpZHhfbmktPmV4dC5iYXNlX250ZnNfaW5vOworCU1GVF9SRUNPUkQgKm07CisJSU5ERVhfUk9PVCAqaXI7CisJSU5ERVhfRU5UUlkgKmllOworCUlOREVYX0FMTE9DQVRJT04gKmlhOworCXU4ICppbmRleF9lbmQsICprYWRkcjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqYWN0eDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcmMsIGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlCVUdfT04oIU5Jbm9BdHRyKGlkeF9uaSkpOworCUJVR19PTihpZHhfbmktPnR5cGUgIT0gQVRfSU5ERVhfQUxMT0NBVElPTik7CisJQlVHX09OKGlkeF9uaS0+bnJfZXh0ZW50cyAhPSAtMSk7CisJQlVHX09OKCFiYXNlX25pKTsKKwlCVUdfT04oIWtleSk7CisJQlVHX09OKGtleV9sZW4gPD0gMCk7CisJaWYgKCFudGZzX2lzX2NvbGxhdGlvbl9ydWxlX3N1cHBvcnRlZCgKKwkJCWlkeF9uaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCB1c2VzIHVuc3VwcG9ydGVkIGNvbGxhdGlvbiBydWxlIDB4JXguICAiCisJCQkJIkFib3J0aW5nIGxvb2t1cC4iLCBsZTMyX3RvX2NwdSgKKwkJCQlpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlKSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBpbmRleCBpbm9kZS4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQludGZzX2Vycm9yKHNiLCAibWFwX21mdF9yZWNvcmQoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4iLAorCQkJCS1QVFJfRVJSKG0pKTsKKwkJcmV0dXJuIFBUUl9FUlIobSk7CisJfQorCWFjdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFhY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEZpbmQgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIGluIHRoZSBtZnQgcmVjb3JkLiAqLworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfUk9PVCwgaWR4X25pLT5uYW1lLCBpZHhfbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGFjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IHJvb3QgYXR0cmlidXRlIG1pc3NpbmcgaW4gaW5vZGUgIgorCQkJCQkiMHglbHguIiwgaWR4X25pLT5tZnRfbm8pOworCQkJZXJyID0gLUVJTzsKKwkJfQorCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0byB0aGUgaW5kZXggcm9vdCB2YWx1ZSAoaXQgaGFzIGJlZW4gdmVyaWZpZWQgaW4gcmVhZF9pbm9kZSkuICovCisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopYWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShhY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArIGxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOworCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlyLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTgqKWllIDwgKHU4KilhY3R4LT5tcmVjIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpID4gaW5kZXhfZW5kKQorCQkJZ290byBpZHhfZXJyX291dDsKKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBrZXkuICBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyogRnVydGhlciBib3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHUzMilzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSArCisJCQkJbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX29mZnNldCkgfHwKKwkJCQkodTMyKWxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfb2Zmc2V0KSArCisJCQkJbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9sZW5ndGgpID4KKwkJCQlsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkKKwkJCWdvdG8gaWR4X2Vycl9vdXQ7CisJCS8qIElmIHRoZSBrZXlzIG1hdGNoIHBlcmZlY3RseSwgd2Ugc2V0dXAgQGljdHggYW5kIHJldHVybiAwLiAqLworCQlpZiAoKGtleV9sZW4gPT0gbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpKSAmJiAhbWVtY21wKGtleSwKKwkJCQkmaWUtPmtleSwga2V5X2xlbikpIHsKK2lyX2RvbmU6CisJCQlpY3R4LT5pc19pbl9yb290ID0gVFJVRTsKKwkJCWljdHgtPmFjdHggPSBhY3R4OworCQkJaWN0eC0+YmFzZV9uaSA9IGJhc2Vfbmk7CisJCQlpY3R4LT5pYSA9IE5VTEw7CisJCQlpY3R4LT5wYWdlID0gTlVMTDsKK2RvbmU6CisJCQlpY3R4LT5lbnRyeSA9IGllOworCQkJaWN0eC0+ZGF0YSA9ICh1OCopaWUgKworCQkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX29mZnNldCk7CisJCQlpY3R4LT5kYXRhX2xlbiA9IGxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfbGVuZ3RoKTsKKwkJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGUodm9sLCBpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlLCBrZXksCisJCQkJa2V5X2xlbiwgJmllLT5rZXksIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSk7CisJCS8qCisJCSAqIElmIEBrZXkgY29sbGF0ZXMgYmVmb3JlIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgZW50cnksIHRoZXJlCisJCSAqIGlzIGRlZmluaXRlbHkgbm8gc3VjaCBrZXkgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIG1hdGNoIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlIG1lbWNtcCgpIGNhbGwgc2hvdWxkIGhhdmUKKwkJICogY291Z2h0IGl0LCBidXQgd2Ugc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJaWYgKCFyYykKKwkJCWdvdG8gaXJfZG9uZTsKKwkJLyogVGhlIGtleXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCB3aXRob3V0IHN1Y2Nlc3MuICBDaGVjayBmb3IgdGhlCisJICogcHJlc2VuY2Ugb2YgYSBjaGlsZCBub2RlIGFuZCBpZiBub3QgcHJlc2VudCBzZXR1cCBAaWN0eCBhbmQgcmV0dXJuCisJICogLUVOT0VOVC4KKwkgKi8KKwlpZiAoIShpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9OT0RFKSkgeworCQludGZzX2RlYnVnKCJFbnRyeSBub3QgZm91bmQuIik7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gaXJfZG9uZTsKKwl9IC8qIENoaWxkIG5vZGUgcHJlc2VudCwgZGVzY2VuZCBpbnRvIGl0LiAqLworCS8qIENvbnNpc3RlbmN5IGNoZWNrOiBWZXJpZnkgdGhhdCBhbiBpbmRleCBhbGxvY2F0aW9uIGV4aXN0cy4gKi8KKwlpZiAoIU5Jbm9JbmRleEFsbG9jUHJlc2VudChpZHhfbmkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJObyBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBidXQgaW5kZXggZW50cnkgIgorCQkJCSJyZXF1aXJlcyBvbmUuICBJbm9kZSAweCVseCBpcyBjb3JydXB0IG9yICIKKwkJCQkiZHJpdmVyIGJ1Zy4iLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRoZSBzdGFydGluZyB2Y24gb2YgdGhlIGluZGV4X2Jsb2NrIGhvbGRpbmcgdGhlIGNoaWxkIG5vZGUuICovCisJdmNuID0gc2xlNjRfdG9fY3B1cCgoc2xlNjQqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KSk7CisJaWFfbWFwcGluZyA9IFZGU19JKGlkeF9uaSktPmlfbWFwcGluZzsKKwkvKgorCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIGluZGV4IHJvb3QgYW5kIHRoZSBtZnQgcmVjb3JkLiAgUmVsZWFzZSB0aGVtLAorCSAqIG90aGVyd2lzZSB3ZSBkZWFkbG9jayB3aXRoIG50ZnNfbWFwX3BhZ2UoKS4KKwkgKi8KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoYWN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwltID0gTlVMTDsKKwlhY3R4ID0gTlVMTDsKK2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qCisJICogQ29udmVydCB2Y24gdG8gaW5kZXggaW50byB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgaW4gdW5pdHMKKwkgKiBvZiBQQUdFX0NBQ0hFX1NJWkUgYW5kIG1hcCB0aGUgcGFnZSBjYWNoZSBwYWdlLCByZWFkaW5nIGl0IGZyb20KKwkgKiBkaXNrIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShpYV9tYXBwaW5nLCB2Y24gPDwKKwkJCWlkeF9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbWFwIGluZGV4IHBhZ2UsIGVycm9yICVsZC4iLAorCQkJCS1QVFJfRVJSKHBhZ2UpKTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJa2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKK2Zhc3RfZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU6CisJLyogR2V0IHRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGJsb2NrLiAqLworCWlhID0gKElOREVYX0FMTE9DQVRJT04qKShrYWRkciArICgodmNuIDw8CisJCQlpZHhfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSykpOworCS8qIEJvdW5kcyBjaGVja3MuICovCisJaWYgKCh1OCopaWEgPCBrYWRkciB8fCAodTgqKWlhID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcihzYiwgIk91dCBvZiBib3VuZHMgY2hlY2sgZmFpbGVkLiAgQ29ycnVwdCBpbm9kZSAiCisJCQkJIjB4JWx4IG9yIGRyaXZlciBidWcuIiwgaWR4X25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBDYXRjaCBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZml4dXAgZXJyb3JzLiAqLworCWlmICh1bmxpa2VseSghbnRmc19pc19pbmR4X3JlY29yZChpYS0+bWFnaWMpKSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggcmVjb3JkIHdpdGggdmNuIDB4JWxseCBpcyBjb3JydXB0LiAgIgorCQkJCSJDb3JydXB0IGlub2RlIDB4JWx4LiAgUnVuIGNoa2Rzay4iLAorCQkJCShsb25nIGxvbmcpdmNuLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbikgIT0gdmNuKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJBY3R1YWwgVkNOICgweCVsbHgpIG9mIGluZGV4IGJ1ZmZlciBpcyAiCisJCQkJImRpZmZlcmVudCBmcm9tIGV4cGVjdGVkIFZDTiAoMHglbGx4KS4gIElub2RlICIKKwkJCQkiMHglbHggaXMgY29ycnVwdCBvciBkcml2ZXIgYnVnLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbiksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4ICE9CisJCQlpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgaW5vZGUgMHglbHggaGFzICIKKwkJCQkiYSBzaXplICgldSkgZGlmZmVyaW5nIGZyb20gdGhlIGluZGV4ICIKKwkJCQkic3BlY2lmaWVkIHNpemUgKCV1KS4gIElub2RlIGlzIGNvcnJ1cHQgb3IgIgorCQkJCSJkcml2ZXIgYnVnLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWlkeF9uaS0+bWZ0X25vLAorCQkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4LAorCQkJCWlkeF9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWluZGV4X2VuZCA9ICh1OCopaWEgKyBpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJaWYgKGluZGV4X2VuZCA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGlub2RlIDB4JWx4ICIKKwkJCQkiY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5LiAgSW1wb3NzaWJsZSEgIENhbm5vdCAiCisJCQkJImFjY2VzcyEgIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlICIKKwkJCQkiZHJpdmVyLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKGluZGV4X2VuZCA+ICh1OCopaWEgKyBpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIlNpemUgb2YgaW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBpbm9kZSAiCisJCQkJIjB4JWx4IGV4Y2VlZHMgbWF4aW11bSBzaXplLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5LiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaWEtPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogSXRlcmF0ZSBzaW1pbGFyIHRvIGFib3ZlIGJpZyBsb29wIGJ1dCBhcHBsaWVkIHRvIGluZGV4IGJ1ZmZlciwgdGh1cworCSAqIGxvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSA+IGluZGV4X2VuZCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IG91dCBvZiBib3VuZHMgaW4gaW5vZGUgIgorCQkJCQkiMHglbHguIiwgaWR4X25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIGtleS4gIEl0IGNhbiBob3dldmVyIGNvbnRhaW4KKwkJICogYSBwb2ludGVyIHRvIGEgY2hpbGQgbm9kZSBpbiB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0LgorCQkgKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKiBGdXJ0aGVyIGJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTMyKXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpICsKKwkJCQlsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfb2Zmc2V0KSB8fAorCQkJCSh1MzIpbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9vZmZzZXQpICsKKwkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX2xlbmd0aCkgPgorCQkJCWxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiSW5kZXggZW50cnkgb3V0IG9mIGJvdW5kcyBpbiBpbm9kZSAiCisJCQkJCSIweCVseC4iLCBpZHhfbmktPm1mdF9ubyk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCS8qIElmIHRoZSBrZXlzIG1hdGNoIHBlcmZlY3RseSwgd2Ugc2V0dXAgQGljdHggYW5kIHJldHVybiAwLiAqLworCQlpZiAoKGtleV9sZW4gPT0gbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpKSAmJiAhbWVtY21wKGtleSwKKwkJCQkmaWUtPmtleSwga2V5X2xlbikpIHsKK2lhX2RvbmU6CisJCQlpY3R4LT5pc19pbl9yb290ID0gRkFMU0U7CisJCQlpY3R4LT5hY3R4ID0gTlVMTDsKKwkJCWljdHgtPmJhc2VfbmkgPSBOVUxMOworCQkJaWN0eC0+aWEgPSBpYTsKKwkJCWljdHgtPnBhZ2UgPSBwYWdlOworCQkJZ290byBkb25lOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGUodm9sLCBpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlLCBrZXksCisJCQkJa2V5X2xlbiwgJmllLT5rZXksIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSk7CisJCS8qCisJCSAqIElmIEBrZXkgY29sbGF0ZXMgYmVmb3JlIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgZW50cnksIHRoZXJlCisJCSAqIGlzIGRlZmluaXRlbHkgbm8gc3VjaCBrZXkgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIG1hdGNoIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlIG1lbWNtcCgpIGNhbGwgc2hvdWxkIGhhdmUKKwkJICogY291Z2h0IGl0LCBidXQgd2Ugc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJaWYgKCFyYykKKwkJCWdvdG8gaWFfZG9uZTsKKwkJLyogVGhlIGtleXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCBidWZmZXIgd2l0aG91dCBzdWNjZXNzLiAgQ2hlY2sgZm9yCisJICogdGhlIHByZXNlbmNlIG9mIGEgY2hpbGQgbm9kZSBhbmQgaWYgbm90IHByZXNlbnQgcmV0dXJuIC1FTk9FTlQuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJbnRmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kLiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGlhX2RvbmU7CisJfQorCWlmICgoaWEtPmluZGV4LmZsYWdzICYgTk9ERV9NQVNLKSA9PSBMRUFGX05PREUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IHdpdGggY2hpbGQgbm9kZSBmb3VuZCBpbiBhIGxlYWYgIgorCQkJCSJub2RlIGluIGlub2RlIDB4JWx4LiIsIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ2hpbGQgbm9kZSBwcmVzZW50LCBkZXNjZW5kIGludG8gaXQuICovCisJb2xkX3ZjbiA9IHZjbjsKKwl2Y24gPSBzbGU2NF90b19jcHVwKChzbGU2NCopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSAtIDgpKTsKKwlpZiAodmNuID49IDApIHsKKwkJLyoKKwkJICogSWYgdmNuIGlzIGluIHRoZSBzYW1lIHBhZ2UgY2FjaGUgcGFnZSBhcyBvbGRfdmNuIHdlIHJlY3ljbGUKKwkJICogdGhlIG1hcHBlZCBwYWdlLgorCQkgKi8KKwkJaWYgKG9sZF92Y24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQgPT0gdmNuIDw8CisJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQpCisJCQlnb3RvIGZhc3RfZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCWdvdG8gZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU7CisJfQorCW50ZnNfZXJyb3Ioc2IsICJOZWdhdGl2ZSBjaGlsZCBub2RlIHZjbiBpbiBpbm9kZSAweCVseC4iLAorCQkJaWR4X25pLT5tZnRfbm8pOwordW5tX2Vycl9vdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoYWN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGFjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7CitpZHhfZXJyX291dDoKKwludGZzX2Vycm9yKHNiLCAiQ29ycnVwdCBpbmRleC4gIEFib3J0aW5nIGxvb2t1cC4iKTsKKwlnb3RvIGVycl9vdXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL2luZGV4LmggYi9mcy9udGZzL2luZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2YTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5kZXguaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIGluZGV4LmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBpbmRleCBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19JTkRFWF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0lOREVYX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAiYW9wcy5oIgorCisvKioKKyAqIEBpZHhfbmk6CWluZGV4IGlub2RlIGNvbnRhaW5pbmcgdGhlIEBlbnRyeSBkZXNjcmliZWQgYnkgdGhpcyBjb250ZXh0CisgKiBAZW50cnk6CWluZGV4IGVudHJ5IChwb2ludHMgaW50byBAaXIgb3IgQGlhKQorICogQGRhdGE6CWluZGV4IGVudHJ5IGRhdGEgKHBvaW50cyBpbnRvIEBlbnRyeSkKKyAqIEBkYXRhX2xlbjoJbGVuZ3RoIGluIGJ5dGVzIG9mIEBkYXRhCisgKiBAaXNfaW5fcm9vdDoJVFJVRSBpZiBAZW50cnkgaXMgaW4gQGlyIGFuZCBGQUxTRSBpZiBpdCBpcyBpbiBAaWEKKyAqIEBpcjoJCWluZGV4IHJvb3QgaWYgQGlzX2luX3Jvb3QgYW5kIE5VTEwgb3RoZXJ3aXNlCisgKiBAYWN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IGlmIEBpc19pbl9yb290IGFuZCBOVUxMIG90aGVyd2lzZQorICogQGJhc2Vfbmk6CWJhc2UgaW5vZGUgaWYgQGlzX2luX3Jvb3QgYW5kIE5VTEwgb3RoZXJ3aXNlCisgKiBAaWE6CQlpbmRleCBibG9jayBpZiBAaXNfaW5fcm9vdCBpcyBGQUxTRSBhbmQgTlVMTCBvdGhlcndpc2UKKyAqIEBwYWdlOglwYWdlIGlmIEBpc19pbl9yb290IGlzIEZBTFNFIGFuZCBOVUxMIG90aGVyd2lzZQorICoKKyAqIEBpZHhfbmkgaXMgdGhlIGluZGV4IGlub2RlIHRoaXMgY29udGV4dCBiZWxvbmdzIHRvLgorICoKKyAqIEBlbnRyeSBpcyB0aGUgaW5kZXggZW50cnkgZGVzY3JpYmVkIGJ5IHRoaXMgY29udGV4dC4gIEBkYXRhIGFuZCBAZGF0YV9sZW4KKyAqIGFyZSB0aGUgaW5kZXggZW50cnkgZGF0YSBhbmQgaXRzIGxlbmd0aCBpbiBieXRlcywgcmVzcGVjdGl2ZWx5LiAgQGRhdGEKKyAqIHNpbXBseSBwb2ludHMgaW50byBAZW50cnkuICBUaGlzIGlzIHByb2JhYmx5IHdoYXQgdGhlIHVzZXIgaXMgaW50ZXJlc3RlZCBpbi4KKyAqCisgKiBJZiBAaXNfaW5fcm9vdCBpcyBUUlVFLCBAZW50cnkgaXMgaW4gdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIEBpciBkZXNjcmliZWQKKyAqIGJ5IHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQgQGFjdHggYW5kIHRoZSBiYXNlIGlub2RlIEBiYXNlX25pLiAgQGlhIGFuZAorICogQHBhZ2UgYXJlIE5VTEwgaW4gdGhpcyBjYXNlLgorICoKKyAqIElmIEBpc19pbl9yb290IGlzIEZBTFNFLCBAZW50cnkgaXMgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGFuZCBAaWEKKyAqIGFuZCBAcGFnZSBwb2ludCB0byB0aGUgaW5kZXggYWxsb2NhdGlvbiBibG9jayBhbmQgdGhlIG1hcHBlZCwgbG9ja2VkIHBhZ2UgaXQKKyAqIGlzIGluLCByZXNwZWN0aXZlbHkuICBAaXIsIEBhY3R4IGFuZCBAYmFzZV9uaSBhcmUgTlVMTCBpbiB0aGlzIGNhc2UuCisgKgorICogVG8gb2J0YWluIGEgY29udGV4dCBjYWxsIG50ZnNfaW5kZXhfY3R4X2dldCgpLgorICoKKyAqIFdlIHVzZSB0aGlzIGNvbnRleHQgdG8gYWxsb3cgbnRmc19pbmRleF9sb29rdXAoKSB0byByZXR1cm4gdGhlIGZvdW5kIGluZGV4CisgKiBAZW50cnkgYW5kIGl0cyBAZGF0YSB3aXRob3V0IGhhdmluZyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBhbmQgY29weSB0aGUgQGVudHJ5CisgKiBhbmQvb3IgaXRzIEBkYXRhIGludG8gaXQuCisgKgorICogV2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBAZW50cnkgYW5kIGl0cyBAZGF0YSwgY2FsbCBudGZzX2luZGV4X2N0eF9wdXQoKSB0bworICogZnJlZSB0aGUgY29udGV4dCBhbmQgb3RoZXIgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IHdhcyBtb2RpZmllZCwgY2FsbCBmbHVzaF9kY2FjaGVfaW5kZXhfZW50cnlfcGFnZSgpCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGFuZCBlaXRoZXIgbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkKKyAqIG9yIG50ZnNfaW5kZXhfZW50cnlfd3JpdGUoKSBiZWZvcmUgdGhlIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfcHV0KCkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIHRvIGRpc2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwludGZzX2lub2RlICppZHhfbmk7CisJSU5ERVhfRU5UUlkgKmVudHJ5OworCXZvaWQgKmRhdGE7CisJdTE2IGRhdGFfbGVuOworCUJPT0wgaXNfaW5fcm9vdDsKKwlJTkRFWF9ST09UICppcjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqYWN0eDsKKwludGZzX2lub2RlICpiYXNlX25pOworCUlOREVYX0FMTE9DQVRJT04gKmlhOworCXN0cnVjdCBwYWdlICpwYWdlOworfSBudGZzX2luZGV4X2NvbnRleHQ7CisKK2V4dGVybiBudGZzX2luZGV4X2NvbnRleHQgKm50ZnNfaW5kZXhfY3R4X2dldChudGZzX2lub2RlICppZHhfbmkpOworZXh0ZXJuIHZvaWQgbnRmc19pbmRleF9jdHhfcHV0KG50ZnNfaW5kZXhfY29udGV4dCAqaWN0eCk7CisKK2V4dGVybiBpbnQgbnRmc19pbmRleF9sb29rdXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBpbnQga2V5X2xlbiwKKwkJbnRmc19pbmRleF9jb250ZXh0ICppY3R4KTsKKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX2luZGV4X2VudHJ5X2ZsdXNoX2RjYWNoZV9wYWdlIC0gZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb3IgaW5kZXggZW50cmllcworICogQGljdHg6CW50ZnMgaW5kZXggY29udGV4dCBkZXNjcmliaW5nIHRoZSBpbmRleCBlbnRyeQorICoKKyAqIENhbGwgZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb3IgdGhlIHBhZ2UgaW4gd2hpY2ggYW4gaW5kZXggZW50cnkgcmVzaWRlcy4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYW4gaW5kZXggZW50cnkgaXMgbW9kaWZpZWQsIGp1c3QgYWZ0ZXIgdGhlCisgKiBtb2RpZmljYXRpb24uCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IGlzIGluIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSwgc2ltcGx5IGZsdXNoIHRoZSBwYWdlCisgKiBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSBpcyBpbiBhbiBpbmRleCBibG9jayBiZWxvbmdpbmcgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24KKyAqIGF0dHJpYnV0ZSwgc2ltcGx5IGZsdXNoIHRoZSBwYWdlIGNhY2hlIHBhZ2UgY29udGFpbmluZyB0aGUgaW5kZXggYmxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2luZGV4X2VudHJ5X2ZsdXNoX2RjYWNoZV9wYWdlKG50ZnNfaW5kZXhfY29udGV4dCAqaWN0eCkKK3sKKwlpZiAoaWN0eC0+aXNfaW5fcm9vdCkKKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShpY3R4LT5hY3R4LT5udGZzX2lubyk7CisJZWxzZQorCQlmbHVzaF9kY2FjaGVfcGFnZShpY3R4LT5wYWdlKTsKK30KKworLyoqCisgKiBudGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkgLSBtYXJrIGFuIGluZGV4IGVudHJ5IGRpcnR5CisgKiBAaWN0eDoJbnRmcyBpbmRleCBjb250ZXh0IGRlc2NyaWJpbmcgdGhlIGluZGV4IGVudHJ5CisgKgorICogTWFyayB0aGUgaW5kZXggZW50cnkgZGVzY3JpYmVkIGJ5IHRoZSBpbmRleCBlbnRyeSBjb250ZXh0IEBpY3R4IGRpcnR5LgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSBpcyBpbiB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHNpbXBseSBtYXJrIHRoZSBtZnQKKyAqIHJlY29yZCBjb250YWluaW5nIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBkaXJ0eS4gIFRoaXMgZW5zdXJlcyB0aGUgbWZ0CisgKiByZWNvcmQsIGFuZCBoZW5jZSB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gZGlzaworICogbGF0ZXIuCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IGlzIGluIGFuIGluZGV4IGJsb2NrIGJlbG9uZ2luZyB0byB0aGUgaW5kZXggYWxsb2NhdGlvbgorICogYXR0cmlidXRlLCBtYXJrIHRoZSBidWZmZXJzIGJlbG9uZ2luZyB0byB0aGUgaW5kZXggcmVjb3JkIGFzIHdlbGwgYXMgdGhlCisgKiBwYWdlIGNhY2hlIHBhZ2UgdGhlIGluZGV4IGJsb2NrIGlzIGluIGRpcnR5LiAgVGhpcyBhdXRvbWF0aWNhbGx5IG1hcmtzIHRoZQorICogVkZTIGlub2RlIG9mIHRoZSBudGZzIGluZGV4IGlub2RlIHRvIHdoaWNoIHRoZSBpbmRleCBlbnRyeSBiZWxvbmdzIGRpcnR5LAorICogdG9vIChJX0RJUlRZX1BBR0VTKSBhbmQgdGhpcyBpbiB0dXJuIGVuc3VyZXMgdGhlIHBhZ2UgYnVmZmVycywgYW5kIGhlbmNlIHRoZQorICogZGlydHkgaW5kZXggYmxvY2ssIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gZGlzayBsYXRlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eShudGZzX2luZGV4X2NvbnRleHQgKmljdHgpCit7CisJaWYgKGljdHgtPmlzX2luX3Jvb3QpCisJCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShpY3R4LT5hY3R4LT5udGZzX2lubyk7CisJZWxzZQorCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KGljdHgtPnBhZ2UsCisJCQkJKHU4KilpY3R4LT5pYSAtICh1OCopcGFnZV9hZGRyZXNzKGljdHgtPnBhZ2UpKTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0lOREVYX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5vZGUuYyBiL2ZzL250ZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg0MGJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjYxNiBAQAorLyoqCisgKiBpbm9kZS5jIC0gTlRGUyBrZXJuZWwgaW5vZGUgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgIm1hbGxvYy5oIgorI2luY2x1ZGUgIm1mdC5oIgorI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc190ZXN0X2lub2RlIC0gY29tcGFyZSB0d28gKHBvc3NpYmx5IGZha2UpIGlub2RlcyBmb3IgZXF1YWxpdHkKKyAqIEB2aToJCXZmcyBpbm9kZSB3aGljaCB0byB0ZXN0CisgKiBAbmE6CQludGZzIGF0dHJpYnV0ZSB3aGljaCBpcyBiZWluZyB0ZXN0ZWQgd2l0aAorICoKKyAqIENvbXBhcmUgdGhlIG50ZnMgYXR0cmlidXRlIGVtYmVkZGVkIGluIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgdGhlIHZmcworICogaW5vZGUgQHZpIGZvciBlcXVhbGl0eSB3aXRoIHRoZSBudGZzIGF0dHJpYnV0ZSBAbmEuCisgKgorICogSWYgc2VhcmNoaW5nIGZvciB0aGUgbm9ybWFsIGZpbGUvZGlyZWN0b3J5IGlub2RlLCBzZXQgQG5hLT50eXBlIHRvIEFUX1VOVVNFRC4KKyAqIEBuYS0+bmFtZSBhbmQgQG5hLT5uYW1lX2xlbiBhcmUgdGhlbiBpZ25vcmVkLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBhdHRyaWJ1dGVzIG1hdGNoIGFuZCAwIGlmIG5vdC4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHJ1bnMgd2l0aCB0aGUgaW5vZGVfbG9jayBzcGluIGxvY2sgaGVsZCBzbyBpdCBpcyBub3QKKyAqIGFsbG93ZWQgdG8gc2xlZXAuCisgKi8KK2ludCBudGZzX3Rlc3RfaW5vZGUoc3RydWN0IGlub2RlICp2aSwgbnRmc19hdHRyICpuYSkKK3sKKwludGZzX2lub2RlICpuaTsKKworCWlmICh2aS0+aV9pbm8gIT0gbmEtPm1mdF9ubykKKwkJcmV0dXJuIDA7CisJbmkgPSBOVEZTX0kodmkpOworCS8qIElmICFOSW5vQXR0cihuaSksIEB2aSBpcyBhIG5vcm1hbCBmaWxlIG9yIGRpcmVjdG9yeSBpbm9kZS4gKi8KKwlpZiAobGlrZWx5KCFOSW5vQXR0cihuaSkpKSB7CisJCS8qIElmIG5vdCBsb29raW5nIGZvciBhIG5vcm1hbCBpbm9kZSB0aGlzIGlzIGEgbWlzbWF0Y2guICovCisJCWlmICh1bmxpa2VseShuYS0+dHlwZSAhPSBBVF9VTlVTRUQpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogQSBmYWtlIGlub2RlIGRlc2NyaWJpbmcgYW4gYXR0cmlidXRlLiAqLworCQlpZiAobmktPnR5cGUgIT0gbmEtPnR5cGUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5pLT5uYW1lX2xlbiAhPSBuYS0+bmFtZV9sZW4pCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5hLT5uYW1lX2xlbiAmJiBtZW1jbXAobmktPm5hbWUsIG5hLT5uYW1lLAorCQkJCW5hLT5uYW1lX2xlbiAqIHNpemVvZihudGZzY2hhcikpKQorCQkJcmV0dXJuIDA7CisJfQorCS8qIE1hdGNoISAqLworCXJldHVybiAxOworfQorCisvKioKKyAqIG50ZnNfaW5pdF9sb2NrZWRfaW5vZGUgLSBpbml0aWFsaXplIGFuIGlub2RlCisgKiBAdmk6CQl2ZnMgaW5vZGUgdG8gaW5pdGlhbGl6ZQorICogQG5hOgkJbnRmcyBhdHRyaWJ1dGUgd2hpY2ggdG8gaW5pdGlhbGl6ZSBAdmkgdG8KKyAqCisgKiBJbml0aWFsaXplIHRoZSB2ZnMgaW5vZGUgQHZpIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBudGZzIGF0dHJpYnV0ZSBAbmEgaW4KKyAqIG9yZGVyIHRvIGVuYWJsZSBudGZzX3Rlc3RfaW5vZGUoKSB0byBkbyBpdHMgd29yay4KKyAqCisgKiBJZiBpbml0aWFsaXppbmcgdGhlIG5vcm1hbCBmaWxlL2RpcmVjdG9yeSBpbm9kZSwgc2V0IEBuYS0+dHlwZSB0byBBVF9VTlVTRUQuCisgKiBJbiB0aGF0IGNhc2UsIEBuYS0+bmFtZSBhbmQgQG5hLT5uYW1lX2xlbiBzaG91bGQgYmUgc2V0IHRvIE5VTEwgYW5kIDAsCisgKiByZXNwZWN0aXZlbHkuIEFsdGhvdWdoIHRoYXQgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBhcworICogbnRmc19yZWFkX2lub2RlX2xvY2tlZCgpIHdpbGwgZmlsbCB0aGVtIGluIGxhdGVyLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHJ1bnMgd2l0aCB0aGUgaW5vZGVfbG9jayBzcGluIGxvY2sgaGVsZCBzbyBpdCBpcyBub3QKKyAqIGFsbG93ZWQgdG8gc2xlZXAuIChIZW5jZSB0aGUgR0ZQX0FUT01JQyBhbGxvY2F0aW9uLikKKyAqLworc3RhdGljIGludCBudGZzX2luaXRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIG50ZnNfYXR0ciAqbmEpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCisJdmktPmlfaW5vID0gbmEtPm1mdF9ubzsKKworCW5pLT50eXBlID0gbmEtPnR5cGU7CisJaWYgKG5hLT50eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pCisJCU5Jbm9TZXRNc3RQcm90ZWN0ZWQobmkpOworCisJbmktPm5hbWUgPSBuYS0+bmFtZTsKKwluaS0+bmFtZV9sZW4gPSBuYS0+bmFtZV9sZW47CisKKwkvKiBJZiBpbml0aWFsaXppbmcgYSBub3JtYWwgaW5vZGUsIHdlIGFyZSBkb25lLiAqLworCWlmIChsaWtlbHkobmEtPnR5cGUgPT0gQVRfVU5VU0VEKSkgeworCQlCVUdfT04obmEtPm5hbWUpOworCQlCVUdfT04obmEtPm5hbWVfbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSXQgaXMgYSBmYWtlIGlub2RlLiAqLworCU5Jbm9TZXRBdHRyKG5pKTsKKworCS8qCisJICogV2UgaGF2ZSBJMzAgZ2xvYmFsIGNvbnN0YW50IGFzIGFuIG9wdGltaXphdGlvbiBhcyBpdCBpcyB0aGUgbmFtZQorCSAqIGluID45OS45JSBvZiBuYW1lZCBhdHRyaWJ1dGVzISBUaGUgb3RoZXIgPDAuMSUgaW5jdXIgYSBHRlBfQVRPTUlDCisJICogYWxsb2NhdGlvbiBidXQgdGhhdCBpcyBvay4gQW5kIG1vc3QgYXR0cmlidXRlcyBhcmUgdW5uYW1lZCBhbnl3YXksCisJICogdGh1cyB0aGUgZnJhY3Rpb24gb2YgbmFtZWQgYXR0cmlidXRlcyB3aXRoIG5hbWUgIT0gSTMwIGlzIGFjdHVhbGx5CisJICogYWJzb2x1dGVseSB0aW55LgorCSAqLworCWlmIChuYS0+bmFtZV9sZW4gJiYgbmEtPm5hbWUgIT0gSTMwKSB7CisJCXVuc2lnbmVkIGludCBpOworCisJCUJVR19PTighbmEtPm5hbWUpOworCQlpID0gbmEtPm5hbWVfbGVuICogc2l6ZW9mKG50ZnNjaGFyKTsKKwkJbmktPm5hbWUgPSAobnRmc2NoYXIqKWttYWxsb2MoaSArIHNpemVvZihudGZzY2hhciksIEdGUF9BVE9NSUMpOworCQlpZiAoIW5pLT5uYW1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweShuaS0+bmFtZSwgbmEtPm5hbWUsIGkpOworCQluaS0+bmFtZVtpXSA9IDA7CisJfQorCXJldHVybiAwOworfQorCit0eXBlZGVmIGludCAoKnNldF90KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKnZpKTsKK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgc3RydWN0IGlub2RlICp2aSk7CitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoc3RydWN0IGlub2RlICpiYXNlX3ZpLAorCQlzdHJ1Y3QgaW5vZGUgKnZpKTsKKworLyoqCisgKiBudGZzX2lnZXQgLSBvYnRhaW4gYSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIG5vcm1hbCBpbm9kZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCB2b2x1bWUKKyAqIEBtZnRfbm86CW1mdCByZWNvcmQgbnVtYmVyIC8gaW5vZGUgbnVtYmVyIHRvIG9idGFpbgorICoKKyAqIE9idGFpbiB0aGUgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBub3JtYWwgaW5vZGUgKGkuZS4gYQorICogZmlsZSBvciBkaXJlY3RvcnkpLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBpbiB0aGUgY2FjaGUsIGl0IGlzIGp1c3QgcmV0dXJuZWQgd2l0aCBhbiBpbmNyZWFzZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4gT3RoZXJ3aXNlLCBhIG5ldyBzdHJ1Y3QgaW5vZGUgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCwKKyAqIGFuZCBmaW5hbGx5IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBpcyBjYWxsZWQgdG8gcmVhZCBpbiB0aGUgaW5vZGUgYW5kCisgKiBmaWxsIGluIHRoZSByZW1haW5kZXIgb2YgdGhlIGlub2RlIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm4gdGhlIHN0cnVjdCBpbm9kZSBvbiBzdWNjZXNzLiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIHdpdGggSVNfRVJSKCkgYW5kCisgKiBpZiB0cnVlLCB0aGUgZnVuY3Rpb24gZmFpbGVkIGFuZCB0aGUgZXJyb3IgY29kZSBpcyBvYnRhaW5lZCBmcm9tIFBUUl9FUlIoKS4KKyAqLworc3RydWN0IGlub2RlICpudGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBtZnRfbm8pCit7CisJc3RydWN0IGlub2RlICp2aTsKKwludGZzX2F0dHIgbmE7CisJaW50IGVycjsKKworCW5hLm1mdF9ubyA9IG1mdF9ubzsKKwluYS50eXBlID0gQVRfVU5VU0VEOworCW5hLm5hbWUgPSBOVUxMOworCW5hLm5hbWVfbGVuID0gMDsKKworCXZpID0gaWdldDVfbG9ja2VkKHNiLCBtZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLAorCQkJKHNldF90KW50ZnNfaW5pdF9sb2NrZWRfaW5vZGUsICZuYSk7CisJaWYgKCF2aSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSAwOworCisJLyogSWYgdGhpcyBpcyBhIGZyZXNobHkgYWxsb2NhdGVkIGlub2RlLCBuZWVkIHRvIHJlYWQgaXQgbm93LiAqLworCWlmICh2aS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCWVyciA9IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUodmkpOworCQl1bmxvY2tfbmV3X2lub2RlKHZpKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBrZWVwaW5nIGJhZCBpbm9kZXMgYXJvdW5kIGlmIHRoZSBmYWlsdXJlIHdhcworCSAqIGR1ZSB0byBFTk9NRU0uIFdlIHdhbnQgdG8gYmUgYWJsZSB0byByZXRyeSBhZ2FpbiBsYXRlci4KKwkgKi8KKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJaXB1dCh2aSk7CisJCXZpID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gdmk7Cit9CisKKy8qKgorICogbnRmc19hdHRyX2lnZXQgLSBvYnRhaW4gYSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byBhbiBhdHRyaWJ1dGUKKyAqIEBiYXNlX3ZpOgl2ZnMgYmFzZSBpbm9kZSBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGUKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZQorICogQG5hbWU6CVVuaWNvZGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIChOVUxMIGlmIHVubmFtZWQpCisgKiBAbmFtZV9sZW46CWxlbmd0aCBvZiBAbmFtZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMgKDAgaWYgdW5uYW1lZCkKKyAqCisgKiBPYnRhaW4gdGhlIChmYWtlKSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlIHNwZWNpZmllZCBieQorICogQHR5cGUsIEBuYW1lLCBhbmQgQG5hbWVfbGVuLCB3aGljaCBpcyBwcmVzZW50IGluIHRoZSBiYXNlIG1mdCByZWNvcmQKKyAqIHNwZWNpZmllZCBieSB0aGUgdmZzIGlub2RlIEBiYXNlX3ZpLgorICoKKyAqIElmIHRoZSBhdHRyaWJ1dGUgaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCBpdCBpcyBqdXN0IHJldHVybmVkIHdpdGggYW4KKyAqIGluY3JlYXNlZCByZWZlcmVuY2UgY291bnQuIE90aGVyd2lzZSwgYSBuZXcgc3RydWN0IGlub2RlIGlzIGFsbG9jYXRlZCBhbmQKKyAqIGluaXRpYWxpemVkLCBhbmQgZmluYWxseSBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoKSBpcyBjYWxsZWQgdG8gcmVhZCB0aGUKKyAqIGF0dHJpYnV0ZSBhbmQgZmlsbCBpbiB0aGUgaW5vZGUgc3RydWN0dXJlLgorICoKKyAqIE5vdGUsIGZvciBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZXMsIHlvdSBuZWVkIHRvIHVzZSBudGZzX2luZGV4X2lnZXQoKQorICogaW5zdGVhZCBvZiBudGZzX2F0dHJfaWdldCgpIGFzIHdvcmtpbmcgd2l0aCBpbmRpY2VzIGlzIGEgbG90IG1vcmUgY29tcGxleC4KKyAqCisgKiBSZXR1cm4gdGhlIHN0cnVjdCBpbm9kZSBvZiB0aGUgYXR0cmlidXRlIGlub2RlIG9uIHN1Y2Nlc3MuIENoZWNrIHRoZSByZXR1cm4KKyAqIHZhbHVlIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kIHRoZSBlcnJvciBjb2RlIGlzCisgKiBvYnRhaW5lZCBmcm9tIFBUUl9FUlIoKS4KKyAqLworc3RydWN0IGlub2RlICpudGZzX2F0dHJfaWdldChzdHJ1Y3QgaW5vZGUgKmJhc2VfdmksIEFUVFJfVFlQRSB0eXBlLAorCQludGZzY2hhciAqbmFtZSwgdTMyIG5hbWVfbGVuKQoreworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19hdHRyIG5hOworCWludCBlcnI7CisKKwkvKiBNYWtlIHN1cmUgbm8gb25lIGNhbGxzIG50ZnNfYXR0cl9pZ2V0KCkgZm9yIGluZGljZXMuICovCisJQlVHX09OKHR5cGUgPT0gQVRfSU5ERVhfQUxMT0NBVElPTik7CisKKwluYS5tZnRfbm8gPSBiYXNlX3ZpLT5pX2lubzsKKwluYS50eXBlID0gdHlwZTsKKwluYS5uYW1lID0gbmFtZTsKKwluYS5uYW1lX2xlbiA9IG5hbWVfbGVuOworCisJdmkgPSBpZ2V0NV9sb2NrZWQoYmFzZV92aS0+aV9zYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKKwkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOworCWlmICghdmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gMDsKKworCS8qIElmIHRoaXMgaXMgYSBmcmVzaGx5IGFsbG9jYXRlZCBpbm9kZSwgbmVlZCB0byByZWFkIGl0IG5vdy4gKi8KKwlpZiAodmktPmlfc3RhdGUgJiBJX05FVykgeworCQllcnIgPSBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoYmFzZV92aSwgdmkpOworCQl1bmxvY2tfbmV3X2lub2RlKHZpKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBrZWVwaW5nIGJhZCBhdHRyaWJ1dGUgaW5vZGVzIGFyb3VuZC4gVGhpcyBhbHNvCisJICogc2ltcGxpZmllcyB0aGluZ3MgaW4gdGhhdCB3ZSBuZXZlciBuZWVkIHRvIGNoZWNrIGZvciBiYWQgYXR0cmlidXRlCisJICogaW5vZGVzIGVsc2V3aGVyZS4KKwkgKi8KKwlpZiAoZXJyKSB7CisJCWlwdXQodmkpOworCQl2aSA9IEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIHZpOworfQorCisvKioKKyAqIG50ZnNfaW5kZXhfaWdldCAtIG9idGFpbiBhIHN0cnVjdCBpbm9kZSBjb3JyZXNwb25kaW5nIHRvIGFuIGluZGV4CisgKiBAYmFzZV92aToJdmZzIGJhc2UgaW5vZGUgY29udGFpbmluZyB0aGUgaW5kZXggcmVsYXRlZCBhdHRyaWJ1dGVzCisgKiBAbmFtZToJVW5pY29kZSBuYW1lIG9mIHRoZSBpbmRleAorICogQG5hbWVfbGVuOglsZW5ndGggb2YgQG5hbWUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzCisgKgorICogT2J0YWluIHRoZSAoZmFrZSkgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4IHNwZWNpZmllZCBieSBAbmFtZQorICogYW5kIEBuYW1lX2xlbiwgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkIHNwZWNpZmllZCBieSB0aGUgdmZzCisgKiBpbm9kZSBAYmFzZV92aS4KKyAqCisgKiBJZiB0aGUgaW5kZXggaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCBpdCBpcyBqdXN0IHJldHVybmVkIHdpdGggYW4gaW5jcmVhc2VkCisgKiByZWZlcmVuY2UgY291bnQuICBPdGhlcndpc2UsIGEgbmV3IHN0cnVjdCBpbm9kZSBpcyBhbGxvY2F0ZWQgYW5kCisgKiBpbml0aWFsaXplZCwgYW5kIGZpbmFsbHkgbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZSgpIGlzIGNhbGxlZCB0byByZWFkCisgKiB0aGUgaW5kZXggcmVsYXRlZCBhdHRyaWJ1dGVzIGFuZCBmaWxsIGluIHRoZSBpbm9kZSBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuIHRoZSBzdHJ1Y3QgaW5vZGUgb2YgdGhlIGluZGV4IGlub2RlIG9uIHN1Y2Nlc3MuIENoZWNrIHRoZSByZXR1cm4KKyAqIHZhbHVlIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kIHRoZSBlcnJvciBjb2RlIGlzCisgKiBvYnRhaW5lZCBmcm9tIFBUUl9FUlIoKS4KKyAqLworc3RydWN0IGlub2RlICpudGZzX2luZGV4X2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBudGZzY2hhciAqbmFtZSwKKwkJdTMyIG5hbWVfbGVuKQoreworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19hdHRyIG5hOworCWludCBlcnI7CisKKwluYS5tZnRfbm8gPSBiYXNlX3ZpLT5pX2lubzsKKwluYS50eXBlID0gQVRfSU5ERVhfQUxMT0NBVElPTjsKKwluYS5uYW1lID0gbmFtZTsKKwluYS5uYW1lX2xlbiA9IG5hbWVfbGVuOworCisJdmkgPSBpZ2V0NV9sb2NrZWQoYmFzZV92aS0+aV9zYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKKwkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOworCWlmICghdmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gMDsKKworCS8qIElmIHRoaXMgaXMgYSBmcmVzaGx5IGFsbG9jYXRlZCBpbm9kZSwgbmVlZCB0byByZWFkIGl0IG5vdy4gKi8KKwlpZiAodmktPmlfc3RhdGUgJiBJX05FVykgeworCQllcnIgPSBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlKGJhc2VfdmksIHZpKTsKKwkJdW5sb2NrX25ld19pbm9kZSh2aSk7CisJfQorCS8qCisJICogVGhlcmUgaXMgbm8gcG9pbnQgaW4ga2VlcGluZyBiYWQgaW5kZXggaW5vZGVzIGFyb3VuZC4gIFRoaXMgYWxzbworCSAqIHNpbXBsaWZpZXMgdGhpbmdzIGluIHRoYXQgd2UgbmV2ZXIgbmVlZCB0byBjaGVjayBmb3IgYmFkIGluZGV4CisJICogaW5vZGVzIGVsc2V3aGVyZS4KKwkgKi8KKwlpZiAoZXJyKSB7CisJCWlwdXQodmkpOworCQl2aSA9IEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIHZpOworfQorCitzdHJ1Y3QgaW5vZGUgKm50ZnNfYWxsb2NfYmlnX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJbnRmc19pbm9kZSAqbmk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwluaSA9IChudGZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhudGZzX2JpZ19pbm9kZV9jYWNoZSwKKwkJCVNMQUJfTk9GUyk7CisJaWYgKGxpa2VseShuaSAhPSBOVUxMKSkgeworCQluaS0+c3RhdGUgPSAwOworCQlyZXR1cm4gVkZTX0kobmkpOworCX0KKwludGZzX2Vycm9yKHNiLCAiQWxsb2NhdGlvbiBvZiBOVEZTIGJpZyBpbm9kZSBzdHJ1Y3R1cmUgZmFpbGVkLiIpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIG50ZnNfZGVzdHJveV9iaWdfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShpbm9kZSk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlCVUdfT04obmktPnBhZ2UpOworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmbmktPmNvdW50KSkKKwkJQlVHKCk7CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfYmlnX2lub2RlX2NhY2hlLCBOVEZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIGlubGluZSBudGZzX2lub2RlICpudGZzX2FsbG9jX2V4dGVudF9pbm9kZSh2b2lkKQoreworCW50ZnNfaW5vZGUgKm5pOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJbmkgPSAobnRmc19pbm9kZSAqKWttZW1fY2FjaGVfYWxsb2MobnRmc19pbm9kZV9jYWNoZSwgU0xBQl9OT0ZTKTsKKwlpZiAobGlrZWx5KG5pICE9IE5VTEwpKSB7CisJCW5pLT5zdGF0ZSA9IDA7CisJCXJldHVybiBuaTsKKwl9CisJbnRmc19lcnJvcihOVUxMLCAiQWxsb2NhdGlvbiBvZiBOVEZTIGlub2RlIHN0cnVjdHVyZSBmYWlsZWQuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG50ZnNfZGVzdHJveV9leHRlbnRfaW5vZGUobnRmc19pbm9kZSAqbmkpCit7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJQlVHX09OKG5pLT5wYWdlKTsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJm5pLT5jb3VudCkpCisJCUJVRygpOworCWttZW1fY2FjaGVfZnJlZShudGZzX2lub2RlX2NhY2hlLCBuaSk7Cit9CisKKy8qKgorICogX19udGZzX2luaXRfaW5vZGUgLSBpbml0aWFsaXplIG50ZnMgc3BlY2lmaWMgcGFydCBvZiBhbiBpbm9kZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCB2b2x1bWUKKyAqIEBuaToJCWZyZXNobHkgYWxsb2NhdGVkIG50ZnMgaW5vZGUgd2hpY2ggdG8gaW5pdGlhbGl6ZQorICoKKyAqIEluaXRpYWxpemUgYW4gbnRmcyBpbm9kZSB0byBkZWZhdWx0cy4KKyAqCisgKiBOT1RFOiBuaS0+bWZ0X25vLCBuaS0+c3RhdGUsIG5pLT50eXBlLCBuaS0+bmFtZSwgYW5kIG5pLT5uYW1lX2xlbiBhcmUgbGVmdAorICogdW50b3VjaGVkLiBNYWtlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGVtIGVsc2V3aGVyZS4KKyAqCisgKiBSZXR1cm4gemVybyBvbiBzdWNjZXNzIGFuZCAtRU5PTUVNIG9uIGVycm9yLgorICovCit2b2lkIF9fbnRmc19pbml0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIG50ZnNfaW5vZGUgKm5pKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCW5pLT5pbml0aWFsaXplZF9zaXplID0gbmktPmFsbG9jYXRlZF9zaXplID0gMDsKKwluaS0+c2VxX25vID0gMDsKKwlhdG9taWNfc2V0KCZuaS0+Y291bnQsIDEpOworCW5pLT52b2wgPSBOVEZTX1NCKHNiKTsKKwludGZzX2luaXRfcnVubGlzdCgmbmktPnJ1bmxpc3QpOworCWluaXRfTVVURVgoJm5pLT5tcmVjX2xvY2spOworCW5pLT5wYWdlID0gTlVMTDsKKwluaS0+cGFnZV9vZnMgPSAwOworCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9IDA7CisJbmktPmF0dHJfbGlzdCA9IE5VTEw7CisJbnRmc19pbml0X3J1bmxpc3QoJm5pLT5hdHRyX2xpc3RfcmwpOworCW5pLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gTlVMTDsKKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IDA7CisJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gMDsKKwluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSAwOworCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSAwOworCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0gMDsKKwlpbml0X01VVEVYKCZuaS0+ZXh0ZW50X2xvY2spOworCW5pLT5ucl9leHRlbnRzID0gMDsKKwluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBOVUxMOworfQorCitpbmxpbmUgbnRmc19pbm9kZSAqbnRmc19uZXdfZXh0ZW50X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCXVuc2lnbmVkIGxvbmcgbWZ0X25vKQoreworCW50ZnNfaW5vZGUgKm5pID0gbnRmc19hbGxvY19leHRlbnRfaW5vZGUoKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChsaWtlbHkobmkgIT0gTlVMTCkpIHsKKwkJX19udGZzX2luaXRfaW5vZGUoc2IsIG5pKTsKKwkJbmktPm1mdF9ubyA9IG1mdF9ubzsKKwkJbmktPnR5cGUgPSBBVF9VTlVTRUQ7CisJCW5pLT5uYW1lID0gTlVMTDsKKwkJbmktPm5hbWVfbGVuID0gMDsKKwl9CisJcmV0dXJuIG5pOworfQorCisvKioKKyAqIG50ZnNfaXNfZXh0ZW5kZWRfc3lzdGVtX2ZpbGUgLSBjaGVjayBpZiBhIGZpbGUgaXMgaW4gdGhlICRFeHRlbmQgZGlyZWN0b3J5CisgKiBAY3R4Oglpbml0aWFsaXplZCBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqCisgKiBTZWFyY2ggYWxsIGZpbGUgbmFtZSBhdHRyaWJ1dGVzIGluIHRoZSBpbm9kZSBkZXNjcmliZWQgYnkgdGhlIGF0dHJpYnV0ZQorICogc2VhcmNoIGNvbnRleHQgQGN0eCBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZSBuYW1lcyBhcmUgaW4gdGhlICRFeHRlbmQgc3lzdGVtCisgKiBkaXJlY3RvcnkuCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqCSAgIDE6IGZpbGUgaXMgaW4gJEV4dGVuZCBkaXJlY3RvcnkKKyAqCSAgIDA6IGZpbGUgaXMgbm90IGluICRFeHRlbmQgZGlyZWN0b3J5CisgKiAgICAtZXJybm86IGZhaWxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZpbGUgaXMgaW4gdGhlICRFeHRlbmQgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgbnRmc19pc19leHRlbmRlZF9zeXN0ZW1fZmlsZShudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KQoreworCWludCBucl9saW5rcywgZXJyOworCisJLyogUmVzdGFydCBzZWFyY2guICovCisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisKKwkvKiBHZXQgbnVtYmVyIG9mIGhhcmQgbGlua3MuICovCisJbnJfbGlua3MgPSBsZTE2X3RvX2NwdShjdHgtPm1yZWMtPmxpbmtfY291bnQpOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCBoYXJkIGxpbmtzLiAqLworCXdoaWxlICghKGVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfRklMRV9OQU1FLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLAorCQkJY3R4KSkpIHsKKwkJRklMRV9OQU1FX0FUVFIgKmZpbGVfbmFtZV9hdHRyOworCQlBVFRSX1JFQ09SRCAqYXR0ciA9IGN0eC0+YXR0cjsKKwkJdTggKnAsICpwMjsKKworCQlucl9saW5rcy0tOworCQkvKgorCQkgKiBNYXhpbXVtIHNhbml0eSBjaGVja2luZyBhcyB3ZSBhcmUgY2FsbGVkIG9uIGFuIGlub2RlIHRoYXQKKwkJICogd2Ugc3VzcGVjdCBtaWdodCBiZSBjb3JydXB0LgorCQkgKi8KKwkJcCA9ICh1OCopYXR0ciArIGxlMzJfdG9fY3B1KGF0dHItPmxlbmd0aCk7CisJCWlmIChwIDwgKHU4KiljdHgtPm1yZWMgfHwgKHU4KilwID4gKHU4KiljdHgtPm1yZWMgKworCQkJCWxlMzJfdG9fY3B1KGN0eC0+bXJlYy0+Ynl0ZXNfaW5fdXNlKSkgeworZXJyX2NvcnJ1cHRfYXR0cjoKKwkJCW50ZnNfZXJyb3IoY3R4LT5udGZzX2luby0+dm9sLT5zYiwgIkNvcnJ1cHQgZmlsZSBuYW1lICIKKwkJCQkJImF0dHJpYnV0ZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJbnRmc19lcnJvcihjdHgtPm50ZnNfaW5vLT52b2wtPnNiLCAiTm9uLXJlc2lkZW50IGZpbGUgIgorCQkJCQkibmFtZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGF0dHItPmZsYWdzKSB7CisJCQludGZzX2Vycm9yKGN0eC0+bnRmc19pbm8tPnZvbC0+c2IsICJGaWxlIG5hbWUgd2l0aCAiCisJCQkJCSJpbnZhbGlkIGZsYWdzLiBZb3Ugc2hvdWxkIHJ1biAiCisJCQkJCSJjaGtkc2suIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoIShhdHRyLT5kYXRhLnJlc2lkZW50LmZsYWdzICYgUkVTSURFTlRfQVRUUl9JU19JTkRFWEVEKSkgeworCQkJbnRmc19lcnJvcihjdHgtPm50ZnNfaW5vLT52b2wtPnNiLCAiVW5pbmRleGVkIGZpbGUgIgorCQkJCQkibmFtZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZmlsZV9uYW1lX2F0dHIgPSAoRklMRV9OQU1FX0FUVFIqKSgodTgqKWF0dHIgKworCQkJCWxlMTZfdG9fY3B1KGF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJCXAyID0gKHU4KilhdHRyICsgbGUzMl90b19jcHUoYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQlpZiAocDIgPCAodTgqKWF0dHIgfHwgcDIgPiBwKQorCQkJZ290byBlcnJfY29ycnVwdF9hdHRyOworCQkvKiBUaGlzIGF0dHJpYnV0ZSBpcyBvaywgYnV0IGlzIGl0IGluIHRoZSAkRXh0ZW5kIGRpcmVjdG9yeT8gKi8KKwkJaWYgKE1SRUZfTEUoZmlsZV9uYW1lX2F0dHItPnBhcmVudF9kaXJlY3RvcnkpID09IEZJTEVfRXh0ZW5kKQorCQkJcmV0dXJuIDE7CS8qIFlFUywgaXQncyBhbiBleHRlbmRlZCBzeXN0ZW0gZmlsZS4gKi8KKwl9CisJaWYgKHVubGlrZWx5KGVyciAhPSAtRU5PRU5UKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAodW5saWtlbHkobnJfbGlua3MpKSB7CisJCW50ZnNfZXJyb3IoY3R4LT5udGZzX2luby0+dm9sLT5zYiwgIklub2RlIGhhcmQgbGluayBjb3VudCAiCisJCQkJImRvZXNuJ3QgbWF0Y2ggbnVtYmVyIG9mIG5hbWUgYXR0cmlidXRlcy4gWW91ICIKKwkJCQkic2hvdWxkIHJ1biBjaGtkc2suIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsJLyogTk8sIGl0IGlzIG5vdCBhbiBleHRlbmRlZCBzeXN0ZW0gZmlsZS4gKi8KK30KKworLyoqCisgKiBudGZzX3JlYWRfbG9ja2VkX2lub2RlIC0gcmVhZCBhbiBpbm9kZSBmcm9tIGl0cyBkZXZpY2UKKyAqIEB2aToJCWlub2RlIHRvIHJlYWQKKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgaXMgY2FsbGVkIGZyb20gbnRmc19pZ2V0KCkgdG8gcmVhZCB0aGUgaW5vZGUKKyAqIGRlc2NyaWJlZCBieSBAdmkgaW50byBtZW1vcnkgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIFRoZSBvbmx5IGZpZWxkcyBpbiBAdmkgdGhhdCB3ZSBuZWVkIHRvL2NhbiBsb29rIGF0IHdoZW4gdGhlIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgYXJlIGlfc2IsIHBvaW50aW5nIHRvIHRoZSBtb3VudGVkIGRldmljZSdzIHN1cGVyIGJsb2NrLCBhbmQgaV9pbm8sCisgKiB0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB0byBsb2FkLgorICoKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBtYXBzLCBwaW5zIGFuZCBsb2NrcyB0aGUgbWZ0IHJlY29yZCBudW1iZXIgaV9pbm8KKyAqIGZvciByZWFkaW5nIGFuZCBzZXRzIHVwIHRoZSBuZWNlc3NhcnkgQHZpIGZpZWxkcyBhcyB3ZWxsIGFzIGluaXRpYWxpemluZworICogdGhlIG50ZnMgaW5vZGUuCisgKgorICogUTogV2hhdCBsb2NrcyBhcmUgaGVsZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQ/CisgKiBBOiBpX3N0YXRlIGhhcyBJX0xPQ0sgc2V0LCBoZW5jZSB0aGUgaW5vZGUgaXMgbG9ja2VkLCBhbHNvCisgKiAgICBpX2NvdW50IGlzIHNldCB0byAxLCBzbyBpdCBpcyBub3QgZ29pbmcgdG8gZ28gYXdheQorICogICAgaV9mbGFncyBpcyBzZXQgdG8gMCBhbmQgd2UgaGF2ZSBubyBidXNpbmVzcyB0b3VjaGluZyBpdC4gIE9ubHkgYW4gaW9jdGwoKQorICogICAgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGVtLiBXZSBzaG91bGQgb2YgY291cnNlIGJlIGhvbm91cmluZyB0aGVtIGJ1dAorICogICAgd2UgbmVlZCB0byBkbyB0aGF0IHVzaW5nIHRoZSBJU18qIG1hY3JvcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvZnMuaC4KKyAqICAgIEluIGFueSBjYXNlIG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBoYXMgbm90aGluZyB0byBkbyB3aXRoIGlfZmxhZ3MuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgSW4gdGhlIGVycm9yIGNhc2UsIHRoZSBpbm9kZSB3aWxsCisgKiBoYXZlIGhhZCBtYWtlX2JhZF9pbm9kZSgpIGV4ZWN1dGVkIG9uIGl0LgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQih2aS0+aV9zYik7CisJbnRmc19pbm9kZSAqbmk7CisJTUZUX1JFQ09SRCAqbTsKKwlTVEFOREFSRF9JTkZPUk1BVElPTiAqc2k7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseC4iLCB2aS0+aV9pbm8pOworCisJLyogU2V0dXAgdGhlIGdlbmVyaWMgdmZzIGlub2RlIHBhcnRzIG5vdy4gKi8KKworCS8qIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpLCBub3QgdGhlIGZzIGJsb2NrIHNpemUuICovCisJdmktPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkvKgorCSAqIFRoaXMgaXMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaW5vZGUgaGFzIGNoYW5nZWQgdy5yLnQuIGEgZmlsZSBzbworCSAqIHRoYXQgdGhlIGZpbGUgY2FuIGJlIHVwZGF0ZWQgaWYgbmVjZXNzYXJ5IChjb21wYXJlIHdpdGggZl92ZXJzaW9uKS4KKwkgKi8KKwl2aS0+aV92ZXJzaW9uID0gMTsKKworCXZpLT5pX3VpZCA9IHZvbC0+dWlkOworCXZpLT5pX2dpZCA9IHZvbC0+Z2lkOworCXZpLT5pX21vZGUgPSAwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgQHZpIHNwZWNpYWwgY2FzaW5nCisJICogRklMRV9NRlQgd2hpY2ggd2UgbmVlZCB0byBkbyBhdCBtb3VudCB0aW1lLgorCSAqLworCWlmICh2aS0+aV9pbm8gIT0gRklMRV9NRlQpCisJCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCW5pID0gTlRGU19JKHZpKTsKKworCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisKKwlpZiAoIShtLT5mbGFncyAmIE1GVF9SRUNPUkRfSU5fVVNFKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5vZGUgaXMgbm90IGluIHVzZSEiKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKG0tPmJhc2VfbWZ0X3JlY29yZCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5vZGUgaXMgYW4gZXh0ZW50IGlub2RlISIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKworCS8qIFRyYW5zZmVyIGluZm9ybWF0aW9uIGZyb20gbWZ0IHJlY29yZCBpbnRvIHZmcyBhbmQgbnRmcyBpbm9kZXMuICovCisJdmktPmlfZ2VuZXJhdGlvbiA9IG5pLT5zZXFfbm8gPSBsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpOworCisJLyoKKwkgKiBGSVhNRTogS2VlcCBpbiBtaW5kIHRoYXQgbGlua19jb3VudCBpcyB0d28gZm9yIGZpbGVzIHdoaWNoIGhhdmUgYm90aAorCSAqIGEgbG9uZyBmaWxlIG5hbWUgYW5kIGEgc2hvcnQgZmlsZSBuYW1lIGFzIHNlcGFyYXRlIGVudHJpZXMsIHNvIGlmCisJICogd2UgYXJlIGhpZGluZyBzaG9ydCBmaWxlIG5hbWVzIHRoaXMgd2lsbCBiZSB0b28gaGlnaC4gRWl0aGVyIHdlIG5lZWQKKwkgKiB0byBhY2NvdW50IGZvciB0aGUgc2hvcnQgZmlsZSBuYW1lcyBieSBzdWJ0cmFjdGluZyB0aGVtIG9yIHdlIG5lZWQKKwkgKiB0byBtYWtlIHN1cmUgd2UgZGVsZXRlIGZpbGVzIGV2ZW4gdGhvdWdoIGlfbmxpbmsgaXMgbm90IHplcm8gd2hpY2gKKwkgKiBtaWdodCBiZSB0cmlja3kgZHVlIHRvIHZmcyBpbnRlcmFjdGlvbnMuIE5lZWQgdG8gdGhpbmsgYWJvdXQgdGhpcworCSAqIHNvbWUgbW9yZSB3aGVuIGltcGxlbWVudGluZyB0aGUgdW5saW5rIGNvbW1hbmQuCisJICovCisJdmktPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShtLT5saW5rX2NvdW50KTsKKwkvKgorCSAqIEZJWE1FOiBSZXBhcnNlIHBvaW50cyBjYW4gaGF2ZSB0aGUgZGlyZWN0b3J5IGJpdCBzZXQgZXZlbiB0aG91Z2gKKwkgKiB0aGV5IHdvdWxkIGJlIFNfSUZMTksuIE5lZWQgdG8gZGVhbCB3aXRoIHRoaXMgZnVydGhlciBiZWxvdyB3aGVuIHdlCisJICogaW1wbGVtZW50IHJlcGFyc2UgcG9pbnRzIC8gc3ltYm9saWMgbGlua3MgYnV0IGl0IHdpbGwgZG8gZm9yIG5vdy4KKwkgKiBBbHNvIGlmIG5vdCBhIGRpcmVjdG9yeSwgaXQgY291bGQgYmUgc29tZXRoaW5nIGVsc2UsIHJhdGhlciB0aGFuCisJICogYSByZWd1bGFyIGZpbGUuIEJ1dCBhZ2Fpbiwgd2lsbCBkbyBmb3Igbm93LgorCSAqLworCS8qIEV2ZXJ5b25lIGdldHMgYWxsIHBlcm1pc3Npb25zLiAqLworCXZpLT5pX21vZGUgfD0gU19JUldYVUdPOworCS8qIElmIHJlYWQtb25seSwgbm9vbmUgZ2V0cyB3cml0ZSBwZXJtaXNzaW9ucy4gKi8KKwlpZiAoSVNfUkRPTkxZKHZpKSkKKwkJdmktPmlfbW9kZSAmPSB+U19JV1VHTzsKKwlpZiAobS0+ZmxhZ3MgJiBNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWSkgeworCQl2aS0+aV9tb2RlIHw9IFNfSUZESVI7CisJCS8qCisJCSAqIEFwcGx5IHRoZSBkaXJlY3RvcnkgcGVybWlzc2lvbnMgbWFzayBzZXQgaW4gdGhlIG1vdW50CisJCSAqIG9wdGlvbnMuCisJCSAqLworCQl2aS0+aV9tb2RlICY9IH52b2wtPmRtYXNrOworCQkvKiBUaGluZ3MgYnJlYWsgd2l0aG91dCB0aGlzIGtsdWRnZSEgKi8KKwkJaWYgKHZpLT5pX25saW5rID4gMSkKKwkJCXZpLT5pX25saW5rID0gMTsKKwl9IGVsc2UgeworCQl2aS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCS8qIEFwcGx5IHRoZSBmaWxlIHBlcm1pc3Npb25zIG1hc2sgc2V0IGluIHRoZSBtb3VudCBvcHRpb25zLiAqLworCQl2aS0+aV9tb2RlICY9IH52b2wtPmZtYXNrOworCX0KKwkvKgorCSAqIEZpbmQgdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gQXQgdGhpcworCSAqIHN0YWdlIHdlIGhhdmVuJ3Qgc2V0dXAgdGhlIGF0dHJpYnV0ZSBsaXN0IHN0dWZmIHlldCwgc28gdGhpcyBjb3VsZAorCSAqIGluIGZhY3QgZmFpbCBpZiB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gaXMgaW4gYW4gZXh0ZW50IHJlY29yZCwgYnV0CisJICogSSBkb24ndCB0aGluayB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVucy4KKwkgKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX1NUQU5EQVJEX0lORk9STUFUSU9OLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLAorCQkJY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCS8qCisJCQkgKiBUT0RPOiBXZSBzaG91bGQgYmUgcGVyZm9ybWluZyBhIGhvdCBmaXggaGVyZSAoaWYgdGhlCisJCQkgKiByZWNvdmVyIG1vdW50IG9wdGlvbiBpcyBzZXQpIGJ5IGNyZWF0aW5nIGEgbmV3CisJCQkgKiBhdHRyaWJ1dGUuCisJCQkgKi8KKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkU1RBTkRBUkRfSU5GT1JNQVRJT04gYXR0cmlidXRlICIKKwkJCQkJImlzIG1pc3NpbmcuIik7CisJCX0KKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogR2V0IHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgdmFsdWUuICovCisJc2kgPSAoU1RBTkRBUkRfSU5GT1JNQVRJT04qKSgoY2hhciopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKworCS8qIFRyYW5zZmVyIGluZm9ybWF0aW9uIGZyb20gdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdmkuICovCisJLyoKKwkgKiBOb3RlOiBUaGUgaV8/dGltZXMgZG8gbm90IHF1aXRlIG1hcCBwZXJmZWN0bHkgb250byB0aGUgTlRGUyB0aW1lcywKKwkgKiBidXQgdGhleSBhcmUgY2xvc2UgZW5vdWdoLCBhbmQgaW4gdGhlIGVuZCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIKKwkgKiB0aGF0IG11Y2guLi4KKwkgKi8KKwkvKgorCSAqIG10aW1lIGlzIHRoZSBsYXN0IGNoYW5nZSBvZiB0aGUgZGF0YSB3aXRoaW4gdGhlIGZpbGUuIE5vdCBjaGFuZ2VkCisJICogd2hlbiBvbmx5IG1ldGFkYXRhIGlzIGNoYW5nZWQsIGUuZy4gYSByZW5hbWUgZG9lc24ndCBhZmZlY3QgbXRpbWUuCisJICovCisJdmktPmlfbXRpbWUgPSBudGZzMnV0YyhzaS0+bGFzdF9kYXRhX2NoYW5nZV90aW1lKTsKKwkvKgorCSAqIGN0aW1lIGlzIHRoZSBsYXN0IGNoYW5nZSBvZiB0aGUgbWV0YWRhdGEgb2YgdGhlIGZpbGUuIFRoaXMgb2J2aW91c2x5CisJICogYWx3YXlzIGNoYW5nZXMsIHdoZW4gbXRpbWUgaXMgY2hhbmdlZC4gY3RpbWUgY2FuIGJlIGNoYW5nZWQgb24gaXRzCisJICogb3duLCBtdGltZSBpcyB0aGVuIG5vdCBjaGFuZ2VkLCBlLmcuIHdoZW4gYSBmaWxlIGlzIHJlbmFtZWQuCisJICovCisJdmktPmlfY3RpbWUgPSBudGZzMnV0YyhzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUpOworCS8qCisJICogTGFzdCBhY2Nlc3MgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBmaWxlLiBOb3QgY2hhbmdlZCBkdXJpbmcgYSByZW5hbWUKKwkgKiBmb3IgZXhhbXBsZSBidXQgY2hhbmdlZCB3aGVuZXZlciB0aGUgZmlsZSBpcyB3cml0dGVuIHRvLgorCSAqLworCXZpLT5pX2F0aW1lID0gbnRmczJ1dGMoc2ktPmxhc3RfYWNjZXNzX3RpbWUpOworCisJLyogRmluZCB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlmIHByZXNlbnQuICovCisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9BVFRSSUJVVEVfTElTVCwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAoZXJyKSB7CisJCWlmICh1bmxpa2VseShlcnIgIT0gLUVOT0VOVCkpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9va3VwIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJImF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwl9IGVsc2UgLyogaWYgKCFlcnIpICovIHsKKwkJaWYgKHZpLT5pX2lubyA9PSBGSUxFX01GVCkKKwkJCWdvdG8gc2tpcF9hdHRyX2xpc3RfbG9hZDsKKwkJbnRmc19kZWJ1ZygiQXR0cmlidXRlIGxpc3QgZm91bmQgaW4gaW5vZGUgMHglbHguIiwgdmktPmlfaW5vKTsKKwkJTklub1NldEF0dHJMaXN0KG5pKTsKKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0sgfHwKKwkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgIgorCQkJCQkiY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBOb3cgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9ICh1MzIpbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKTsKKwkJbmktPmF0dHJfbGlzdCA9IG50ZnNfbWFsbG9jX25vZnMobmktPmF0dHJfbGlzdF9zaXplKTsKKwkJaWYgKCFuaS0+YXR0cl9saXN0KSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgIgorCQkJCQkiYnVmZmVyIGZvciBhdHRyaWJ1dGUgbGlzdC4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJTklub1NldEF0dHJMaXN0Tm9uUmVzaWRlbnQobmkpOworCQkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJBdHRyaWJ1dGUgbGlzdCBoYXMgbm9uICIKKwkJCQkJCSJ6ZXJvIGxvd2VzdF92Y24uIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCS8qCisJCQkgKiBTZXR1cCB0aGUgcnVubGlzdC4gTm8gbmVlZCBmb3IgbG9ja2luZyBhcyB3ZSBoYXZlCisJCQkgKiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBpbm9kZSBhdCB0aGlzIHRpbWUuCisJCQkgKi8KKwkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsCisJCQkJCWN0eC0+YXR0ciwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpKSB7CisJCQkJZXJyID0gUFRSX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKTsKKwkJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gTlVMTDsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTWFwcGluZyBwYWlycyAiCisJCQkJCQkiZGVjb21wcmVzc2lvbiBmYWlsZWQuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCS8qIE5vdyBsb2FkIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJCWlmICgoZXJyID0gbG9hZF9hdHRyaWJ1dGVfbGlzdCh2b2wsICZuaS0+YXR0cl9saXN0X3JsLAorCQkJCQluaS0+YXR0cl9saXN0LCBuaS0+YXR0cl9saXN0X3NpemUsCisJCQkJCXNsZTY0X3RvX2NwdShjdHgtPmF0dHItPmRhdGEuCisJCQkJCW5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKSkpKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb2FkICIKKwkJCQkJCSJhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJfSBlbHNlIC8qIGlmICghY3R4LmF0dHItPm5vbl9yZXNpZGVudCkgKi8geworCQkJaWYgKCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCQkJKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJDb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJCSJpbiBpbm9kZS4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJLyogTm93IGNvcHkgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQkJbWVtY3B5KG5pLT5hdHRyX2xpc3QsICh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJCQlsZTMyX3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkpOworCQl9CisJfQorc2tpcF9hdHRyX2xpc3RfbG9hZDoKKwkvKgorCSAqIElmIGFuIGF0dHJpYnV0ZSBsaXN0IGlzIHByZXNlbnQgd2Ugbm93IGhhdmUgdGhlIGF0dHJpYnV0ZSBsaXN0IHZhbHVlCisJICogaW4gbnRmc19pbm8tPmF0dHJfbGlzdCBhbmQgaXQgaXMgbnRmc19pbm8tPmF0dHJfbGlzdF9zaXplIGJ5dGVzLgorCSAqLworCWlmIChTX0lTRElSKHZpLT5pX21vZGUpKSB7CisJCXN0cnVjdCBpbm9kZSAqYnZpOworCQludGZzX2lub2RlICpibmk7CisJCUlOREVYX1JPT1QgKmlyOworCQljaGFyICppcl9lbmQsICppbmRleF9lbmQ7CisKKwkJLyogSXQgaXMgYSBkaXJlY3RvcnksIGZpbmQgaW5kZXggcm9vdCBhdHRyaWJ1dGUuICovCisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIEkzMCwgNCwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJMCwgTlVMTCwgMCwgY3R4KTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJCS8vIEZJWE1FOiBGaWxlIGlzIGNvcnJ1cHQhIEhvdC1maXggd2l0aCBlbXB0eQorCQkJCS8vIGluZGV4IHJvb3QgYXR0cmlidXRlIGlmIHJlY292ZXJ5IG9wdGlvbiBpcworCQkJCS8vIHNldC4KKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlICIKKwkJCQkJCSJpcyBtaXNzaW5nLiIpOworCQkJfQorCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBTZXQgdXAgdGhlIHN0YXRlLiAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgbm90ICIKKwkJCQkJInJlc2lkZW50LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIHZhbHVlLiAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC4KKwkJCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBuYW1lIGlzICIKKwkJCQkJInBsYWNlZCBhZnRlciB0aGUgYXR0cmlidXRlIHZhbHVlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBDb21wcmVzc2VkL2VuY3J5cHRlZCBpbmRleCByb290IGp1c3QgbWVhbnMgdGhhdCB0aGUgbmV3bHkKKwkJICogY3JlYXRlZCBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeSBzaG91bGQgYmUgY3JlYXRlZCBjb21wcmVzc2VkLworCQkgKiBlbmNyeXB0ZWQuIEhvd2V2ZXIgaW5kZXggcm9vdCBjYW5ub3QgYmUgYm90aCBjb21wcmVzc2VkIGFuZAorCQkgKiBlbmNyeXB0ZWQuCisJCSAqLworCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkIGFuZCAiCisJCQkJCQkiY29tcHJlc3NlZCBhdHRyaWJ1dGUuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJaXIgPSAoSU5ERVhfUk9PVCopKChjaGFyKiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJCWlyX2VuZCA9IChjaGFyKilpciArIGxlMzJfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQlpZiAoaXJfZW5kID4gKGNoYXIqKWN0eC0+bXJlYyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzICIKKwkJCQkJImNvcnJ1cHQuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWluZGV4X2VuZCA9IChjaGFyKikmaXItPmluZGV4ICsKKwkJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkJaWYgKGluZGV4X2VuZCA+IGlyX2VuZCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkRpcmVjdG9yeSBpbmRleCBpcyBjb3JydXB0LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoaXItPnR5cGUgIT0gQVRfRklMRV9OQU1FKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXhlZCBhdHRyaWJ1dGUgaXMgbm90ICIKKwkJCQkJIiRGSUxFX05BTUUuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChpci0+Y29sbGF0aW9uX3J1bGUgIT0gQ09MTEFUSU9OX0ZJTEVfTkFNRSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGNvbGxhdGlvbiBydWxlIGlzIG5vdCAiCisJCQkJCSJDT0xMQVRJT05fRklMRV9OQU1FLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSBpci0+Y29sbGF0aW9uX3J1bGU7CisJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gbGUzMl90b19jcHUoaXItPmluZGV4X2Jsb2NrX3NpemUpOworCQlpZiAobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgJgorCQkJCShuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAtIDEpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYmxvY2sgc2l6ZSAoJXUpIGlzIG5vdCBhICIKKwkJCQkJInBvd2VyIG9mIHR3by4iLAorCQkJCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSA+ICIKKwkJCQkJIlBBR0VfQ0FDSEVfU0laRSAoJWxkKSBpcyBub3QgIgorCQkJCQkic3VwcG9ydGVkLiAgU29ycnkuIiwKKwkJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUsCisJCQkJCVBBR0VfQ0FDSEVfU0laRSk7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIDwgTlRGU19CTE9DS19TSVpFKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYmxvY2sgc2l6ZSAoJXUpIDwgIgorCQkJCQkiTlRGU19CTE9DS19TSVpFICglaSkgaXMgbm90ICIKKwkJCQkJInN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplLAorCQkJCQlOVEZTX0JMT0NLX1NJWkUpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPQorCQkJCWZmcyhuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgLSAxOworCQkvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSB2Y24gaW4gdGhlIGRpcmVjdG9yeSBpbmRleC4gKi8KKwkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZTsKKwkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJfSBlbHNlIHsKKwkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZSA9IHZvbC0+c2VjdG9yX3NpemU7CisJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IHZvbC0+c2VjdG9yX3NpemVfYml0czsKKwkJfQorCisJCS8qIFNldHVwIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSwgZXZlbiBpZiBub3QgcHJlc2VudC4gKi8KKwkJTklub1NldE1zdFByb3RlY3RlZChuaSk7CisJCW5pLT50eXBlID0gQVRfSU5ERVhfQUxMT0NBVElPTjsKKwkJbmktPm5hbWUgPSBJMzA7CisJCW5pLT5uYW1lX2xlbiA9IDQ7CisKKwkJaWYgKCEoaXItPmluZGV4LmZsYWdzICYgTEFSR0VfSU5ERVgpKSB7CisJCQkvKiBObyBpbmRleCBhbGxvY2F0aW9uLiAqLworCQkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0KKwkJCQkJbmktPmFsbG9jYXRlZF9zaXplID0gMDsKKwkJCS8qIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICovCisJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQkJbSA9IE5VTEw7CisJCQljdHggPSBOVUxMOworCQkJZ290byBza2lwX2xhcmdlX2Rpcl9zdHVmZjsKKwkJfSAvKiBMQVJHRV9JTkRFWDogSW5kZXggYWxsb2NhdGlvbiBwcmVzZW50LiBTZXR1cCBzdGF0ZS4gKi8KKwkJTklub1NldEluZGV4QWxsb2NQcmVzZW50KG5pKTsKKwkJLyogRmluZCBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4gKi8KKwkJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisJCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfQUxMT0NBVElPTiwgSTMwLCA0LAorCQkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiAiCisJCQkJCQkiYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGJ1dCAiCisJCQkJCQkiJElOREVYX1JPT1QgaW5kaWNhdGVkIGl0IGlzLiIpOworCQkJZWxzZQorCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9va3VwICIKKwkJCQkJCSIkSU5ERVhfQUxMT0NBVElPTiAiCisJCQkJCQkiYXR0cmlidXRlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlICIKKwkJCQkJImlzIHJlc2lkZW50LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMKKwkJICogYXJyYXkuCisJCSAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJbWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBuYW1lICIKKwkJCQkJImlzIHBsYWNlZCBhZnRlciB0aGUgbWFwcGluZyBwYWlycyAiCisJCQkJCSJhcnJheS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCisJCQkJCSJpcyBlbmNyeXB0ZWQuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgorCQkJCQkiaXMgc3BhcnNlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCisJCQkJCSJpcyBjb21wcmVzc2VkLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICIKKwkJCQkJIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBoYXMgbm9uICIKKwkJCQkJInplcm8gbG93ZXN0X3Zjbi4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkJLyoKKwkJICogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gT3RoZXJ3aXNlCisJCSAqIHdlIHdvdWxkIGRlYWRsb2NrIGluIG50ZnNfYXR0cl9pZ2V0KCkuCisJCSAqLworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJCW0gPSBOVUxMOworCQljdHggPSBOVUxMOworCQkvKiBHZXQgdGhlIGluZGV4IGJpdG1hcCBhdHRyaWJ1dGUgaW5vZGUuICovCisJCWJ2aSA9IG50ZnNfYXR0cl9pZ2V0KHZpLCBBVF9CSVRNQVAsIEkzMCwgNCk7CisJCWlmIChJU19FUlIoYnZpKSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJCWVyciA9IFBUUl9FUlIoYnZpKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJbmktPml0eXBlLmluZGV4LmJtcF9pbm8gPSBidmk7CisJCWJuaSA9IE5URlNfSShidmkpOworCQlpZiAoTklub0NvbXByZXNzZWQoYm5pKSB8fCBOSW5vRW5jcnlwdGVkKGJuaSkgfHwKKwkJCQlOSW5vU3BhcnNlKGJuaSkpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkQklUTUFQIGF0dHJpYnV0ZSBpcyBjb21wcmVzc2VkICIKKwkJCQkJImFuZC9vciBlbmNyeXB0ZWQgYW5kL29yIHNwYXJzZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogQ29uc2lzdGVuY3kgY2hlY2sgYml0bWFwIHNpemUgdnMuIGluZGV4IGFsbG9jYXRpb24gc2l6ZS4gKi8KKwkJaWYgKChidmktPmlfc2l6ZSA8PCAzKSA8ICh2aS0+aV9zaXplID4+CisJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBiaXRtYXAgdG9vIHNtYWxsICgweCVsbHgpICIKKwkJCQkJImZvciBpbmRleCBhbGxvY2F0aW9uICgweCVsbHgpLiIsCisJCQkJCWJ2aS0+aV9zaXplIDw8IDMsIHZpLT5pX3NpemUpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorc2tpcF9sYXJnZV9kaXJfc3R1ZmY6CisJCS8qIFNldHVwIHRoZSBvcGVyYXRpb25zIGZvciB0aGlzIGlub2RlLiAqLworCQl2aS0+aV9vcCA9ICZudGZzX2Rpcl9pbm9kZV9vcHM7CisJCXZpLT5pX2ZvcCA9ICZudGZzX2Rpcl9vcHM7CisJfSBlbHNlIHsKKwkJLyogSXQgaXMgYSBmaWxlLiAqLworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKworCQkvKiBTZXR1cCB0aGUgZGF0YSBhdHRyaWJ1dGUsIGV2ZW4gaWYgbm90IHByZXNlbnQuICovCisJCW5pLT50eXBlID0gQVRfREFUQTsKKwkJbmktPm5hbWUgPSBOVUxMOworCQluaS0+bmFtZV9sZW4gPSAwOworCisJCS8qIEZpbmQgZmlyc3QgZXh0ZW50IG9mIHRoZSB1bm5hbWVkIGRhdGEgYXR0cmlidXRlLiAqLworCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0RBVEEsIE5VTEwsIDAsIDAsIDAsIE5VTEwsIDAsIGN0eCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPQorCQkJCQluaS0+YWxsb2NhdGVkX3NpemUgPSAwOworCQkJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb29rdXAgJERBVEEgIgorCQkJCQkJImF0dHJpYnV0ZS4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJLyoKKwkJCSAqIEZJTEVfU2VjdXJlIGRvZXMgbm90IGhhdmUgYW4gdW5uYW1lZCAkREFUQQorCQkJICogYXR0cmlidXRlLCBzbyB3ZSBzcGVjaWFsIGNhc2UgaXQgaGVyZS4KKwkJCSAqLworCQkJaWYgKHZpLT5pX2lubyA9PSBGSUxFX1NlY3VyZSkKKwkJCQlnb3RvIG5vX2RhdGFfYXR0cl9zcGVjaWFsX2Nhc2U7CisJCQkvKgorCQkJICogTW9zdCBpZiBub3QgYWxsIHRoZSBzeXN0ZW0gZmlsZXMgaW4gdGhlICRFeHRlbmQKKwkJCSAqIHN5c3RlbSBkaXJlY3RvcnkgZG8gbm90IGhhdmUgdW5uYW1lZCBkYXRhCisJCQkgKiBhdHRyaWJ1dGVzIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHBhcmVudAorCQkJICogZGlyZWN0b3J5IG9mIHRoZSBmaWxlIGlzIEZJTEVfRXh0ZW5kIGFuZCBpZiBpdCBpcworCQkJICogaWdub3JlIHRoaXMgZXJyb3IuIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBnZXQgdGhlCisJCQkgKiBuYW1lIG9mIHRoaXMgaW5vZGUgZnJvbSB0aGUgbWZ0IHJlY29yZCBhcyB0aGUgbmFtZQorCQkJICogY29udGFpbnMgdGhlIGJhY2sgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorCQkJICovCisJCQlpZiAobnRmc19pc19leHRlbmRlZF9zeXN0ZW1fZmlsZShjdHgpID4gMCkKKwkJCQlnb3RvIG5vX2RhdGFfYXR0cl9zcGVjaWFsX2Nhc2U7CisJCQkvLyBGSVhNRTogRmlsZSBpcyBjb3JydXB0ISBIb3QtZml4IHdpdGggZW1wdHkgZGF0YQorCQkJLy8gYXR0cmlidXRlIGlmIHJlY292ZXJ5IG9wdGlvbiBpcyBzZXQuCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJERBVEEgYXR0cmlidXRlIGlzIG1pc3NpbmcuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCS8qIFNldHVwIHRoZSBzdGF0ZS4gKi8KKwkJaWYgKGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCQlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOworCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJImNvbXByZXNzZWQgZGF0YSBidXQgIgorCQkJCQkJImNvbXByZXNzaW9uIGlzIGRpc2FibGVkIGR1ZSAiCisJCQkJCQkidG8gY2x1c3RlciBzaXplICglaSkgPiA0a2lCLiIsCisJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSk7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCWlmICgoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIG9yICIKKwkJCQkJCSJjb3JydXB0IGZpbGUuIik7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2lvbl91bml0OworCQkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdCAhPSA0KSB7CisJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCAiCisJCQkJCQkibm9uc3RhbmRhcmQgY29tcHJlc3Npb24gdW5pdCAiCisJCQkJCQkiKCV1IGluc3RlYWQgb2YgNCkuICBDYW5ub3QgIgorCQkJCQkJImhhbmRsZSB0aGlzLiIsCisJCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdCk7CisJCQkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplID0gMVUgPDwgKAorCQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWNvbXByZXNzaW9uX3VuaXQgKworCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CisJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0gZmZzKAorCQkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplKSAtIDE7CisJCQl9CisJCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCAiCisJCQkJCQkJImFuZCBjb21wcmVzc2VkIGRhdGEuIik7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQkJfQorCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkKKwkJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICREQVRBICIKKwkJCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvICIKKwkJCQkJCSJsb3dlc3RfdmNuLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQkvKiBTZXR1cCBhbGwgdGhlIHNpemVzLiAqLworCQkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCWluaXRpYWxpemVkX3NpemUpOworCQkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQlhbGxvY2F0ZWRfc2l6ZSk7CisJCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2VkX3NpemUpOworCQkJfQorCQl9IGVsc2UgeyAvKiBSZXNpZGVudCBhdHRyaWJ1dGUuICovCisJCQkvKgorCQkJICogTWFrZSBhbGwgc2l6ZXMgZXF1YWwgZm9yIHNpbXBsaWNpdHkgaW4gcmVhZCBjb2RlCisJCQkgKiBwYXRocy4gRklYTUU6IE5lZWQgdG8ga2VlcCB0aGlzIGluIG1pbmQgd2hlbgorCQkJICogY29udmVydGluZyB0byBub24tcmVzaWRlbnQgYXR0cmlidXRlIGluIHdyaXRlIGNvZGUKKwkJCSAqIHBhdGguIChQcm9iYWJseSBvbmx5IGFmZmVjdHMgdHJ1bmNhdGUoKS4pCisJCQkgKi8KKwkJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9CisJCQkJCWxlMzJfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJfQorbm9fZGF0YV9hdHRyX3NwZWNpYWxfY2FzZToKKwkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gKi8KKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQltID0gTlVMTDsKKwkJY3R4ID0gTlVMTDsKKwkJLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgaW5vZGUuICovCisJCXZpLT5pX29wID0gJm50ZnNfZmlsZV9pbm9kZV9vcHM7CisJCXZpLT5pX2ZvcCA9ICZudGZzX2ZpbGVfb3BzOworCX0KKwlpZiAoTklub01zdFByb3RlY3RlZChuaSkpCisJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CisJZWxzZQorCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX2FvcHM7CisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIDUxMi1ieXRlIGJsb2NrcyB1c2VkIG9uIGRpc2sgKGZvciBzdGF0KS4gVGhpcyBpcyBpbiBzbworCSAqIGZhciBpbmFjY3VyYXRlIGFzIGl0IGRvZXNuJ3QgYWNjb3VudCBmb3IgYW55IG5hbWVkIHN0cmVhbXMgb3Igb3RoZXIKKwkgKiBzcGVjaWFsIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLCBidXQgdGhhdCBpcyBob3cgV2luZG93cyB3b3JrcywgdG9vLAorCSAqIHNvIHdlIGFyZSBhdCBsZWFzdCBjb25zaXN0ZW50IHdpdGggV2luZG93cywgaWYgbm90IGVudGlyZWx5CisJICogY29uc2lzdGVudCB3aXRoIHRoZSBMaW51eCBXYXkuIERvaW5nIGl0IHRoZSBMaW51eCBXYXkgd291bGQgY2F1c2UgYQorCSAqIHNpZ25pZmljYW50IHNsb3dkb3duIGFzIGl0IHdvdWxkIGludm9sdmUgaXRlcmF0aW5nIG92ZXIgYWxsCisJICogYXR0cmlidXRlcyBpbiB0aGUgbWZ0IHJlY29yZCBhbmQgYWRkaW5nIHRoZSBhbGxvY2F0ZWQvY29tcHJlc3NlZAorCSAqIHNpemVzIG9mIGFsbCBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBwcmVzZW50IHRvIGdpdmUgdXMgdGhlIExpbnV4CisJICogY29ycmVjdCBzaXplIHRoYXQgc2hvdWxkIGdvIGludG8gaV9ibG9ja3MgKGFmdGVyIGRpdmlzaW9uIGJ5IDUxMikuCisJICovCisJaWYgKFNfSVNESVIodmktPmlfbW9kZSkgfHwgIU5Jbm9Db21wcmVzc2VkKG5pKSkKKwkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7CisJZWxzZQorCQl2aS0+aV9ibG9ja3MgPSBuaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID4+IDk7CisKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworCit1bm1fZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuICBNYXJraW5nIGNvcnJ1cHQgIgorCQkJImlub2RlIDB4JWx4IGFzIGJhZC4gIFJ1biBjaGtkc2suIiwgZXJyLCB2aS0+aV9pbm8pOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQICYmIGVyciAhPSAtRU5PTUVNKQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUgLSByZWFkIGFuIGF0dHJpYnV0ZSBpbm9kZSBmcm9tIGl0cyBiYXNlIGlub2RlCisgKiBAYmFzZV92aToJYmFzZSBpbm9kZQorICogQHZpOgkJYXR0cmlidXRlIGlub2RlIHRvIHJlYWQKKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoKSBpcyBjYWxsZWQgZnJvbSBudGZzX2F0dHJfaWdldCgpIHRvIHJlYWQgdGhlCisgKiBhdHRyaWJ1dGUgaW5vZGUgZGVzY3JpYmVkIGJ5IEB2aSBpbnRvIG1lbW9yeSBmcm9tIHRoZSBiYXNlIG1mdCByZWNvcmQKKyAqIGRlc2NyaWJlZCBieSBAYmFzZV9uaS4KKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoKSBtYXBzLCBwaW5zIGFuZCBsb2NrcyB0aGUgYmFzZSBpbm9kZSBmb3IKKyAqIHJlYWRpbmcgYW5kIGxvb2tzIHVwIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IEB2aSBiZWZvcmUgc2V0dGluZyB1cCB0aGUKKyAqIG5lY2Vzc2FyeSBmaWVsZHMgaW4gQHZpIGFzIHdlbGwgYXMgaW5pdGlhbGl6aW5nIHRoZSBudGZzIGlub2RlLgorICoKKyAqIFE6IFdoYXQgbG9ja3MgYXJlIGhlbGQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkPworICogQTogaV9zdGF0ZSBoYXMgSV9MT0NLIHNldCwgaGVuY2UgdGhlIGlub2RlIGlzIGxvY2tlZCwgYWxzbworICogICAgaV9jb3VudCBpcyBzZXQgdG8gMSwgc28gaXQgaXMgbm90IGdvaW5nIHRvIGdvIGF3YXkKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlIGlub2RlIHdpbGwKKyAqIGhhdmUgaGFkIG1ha2VfYmFkX2lub2RlKCkgZXhlY3V0ZWQgb24gaXQuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgc3RydWN0IGlub2RlICp2aSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQih2aS0+aV9zYik7CisJbnRmc19pbm9kZSAqbmksICpiYXNlX25pOworCU1GVF9SRUNPUkQgKm07CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseC4iLCB2aS0+aV9pbm8pOworCisJbnRmc19pbml0X2JpZ19pbm9kZSh2aSk7CisKKwluaQk9IE5URlNfSSh2aSk7CisJYmFzZV9uaSA9IE5URlNfSShiYXNlX3ZpKTsKKworCS8qIEp1c3QgbWlycm9yIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYmFzZSBpbm9kZS4gKi8KKwl2aS0+aV9ibGtzaXplCT0gYmFzZV92aS0+aV9ibGtzaXplOworCXZpLT5pX3ZlcnNpb24JPSBiYXNlX3ZpLT5pX3ZlcnNpb247CisJdmktPmlfdWlkCT0gYmFzZV92aS0+aV91aWQ7CisJdmktPmlfZ2lkCT0gYmFzZV92aS0+aV9naWQ7CisJdmktPmlfbmxpbmsJPSBiYXNlX3ZpLT5pX25saW5rOworCXZpLT5pX210aW1lCT0gYmFzZV92aS0+aV9tdGltZTsKKwl2aS0+aV9jdGltZQk9IGJhc2VfdmktPmlfY3RpbWU7CisJdmktPmlfYXRpbWUJPSBiYXNlX3ZpLT5pX2F0aW1lOworCXZpLT5pX2dlbmVyYXRpb24gPSBuaS0+c2VxX25vID0gYmFzZV9uaS0+c2VxX25vOworCisJLyogU2V0IGlub2RlIHR5cGUgdG8gemVybyBidXQgcHJlc2VydmUgcGVybWlzc2lvbnMuICovCisJdmktPmlfbW9kZQk9IGJhc2VfdmktPmlfbW9kZSAmIH5TX0lGTVQ7CisKKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKworCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZS4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gdW5tX2Vycl9vdXQ7CisKKwlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCS8qIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgdmFsdWUuICovCisJCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmCisJCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49CisJCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LgorCQkJCXZhbHVlX29mZnNldCkpKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGFmdGVyICIKKwkJCQkJInRoZSBhdHRyaWJ1dGUgdmFsdWUuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSB8fCBjdHgtPmF0dHItPmZsYWdzKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGUgIgorCQkJCQkib3IgYXR0cmlidXRlIHdpdGggbm9uLXplcm8gZmxhZ3MgYnV0ICIKKwkJCQkJInRoZSBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQuICBQbGVhc2UgIgorCQkJCQkicmVwb3J0IHlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBSZXNpZGVudCBhdHRyaWJ1dGUuIE1ha2UgYWxsIHNpemVzIGVxdWFsIGZvciBzaW1wbGljaXR5IGluCisJCSAqIHJlYWQgY29kZSBwYXRocy4KKwkJICovCisJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9CisJCQlsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOworCQkvKgorCQkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMKKwkJICogYXJyYXkuCisJCSAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJbWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBhZnRlciAiCisJCQkJCSJ0aGUgbWFwcGluZyBwYWlycyBhcnJheS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIGNvbXByZXNzZWQuICBQbGVhc2UgcmVwb3J0ICIKKwkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQlpZiAoKG5pLT50eXBlICE9IEFUX0RBVEEpIHx8IChuaS0+dHlwZSA9PSBBVF9EQVRBICYmCisJCQkJCW5pLT5uYW1lX2xlbikpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkibm9uLWRhdGEgb3IgbmFtZWQgZGF0YSAiCisJCQkJCQkiYXR0cmlidXRlLiAgUGxlYXNlIHJlcG9ydCAiCisJCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IGNvbXByZXNzaW9uIGlzICIKKwkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gY2x1c3RlciBzaXplICIKKwkJCQkJCSIoJWkpID4gNGtpQi4iLAorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlpZiAoKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCisJCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCB1bmtub3duICIKKwkJCQkJCSJjb21wcmVzc2lvbiBtZXRob2QuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJY29tcHJlc3Npb25fdW5pdDsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgIT0KKwkJCQkJNCkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBub25zdGFuZGFyZCAiCisJCQkJCQkiY29tcHJlc3Npb24gdW5pdCAoJXUgaW5zdGVhZCAiCisJCQkJCQkib2YgNCkuICBDYW5ub3QgaGFuZGxlIHRoaXMuIiwKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2lvbl91bml0KTsKKwkJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSA9IDFVIDw8ICgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJY29tcHJlc3Npb25fdW5pdCArCisJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpOworCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0gZmZzKAorCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUpIC0gMTsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgIgorCQkJCQkJImFuZCBjb21wcmVzc2VkIGRhdGEuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIGVuY3J5cHRlZC4gIFBsZWFzZSByZXBvcnQgIgorCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIHNwYXJzZS4gIFBsZWFzZSByZXBvcnQgIgorCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRTcGFyc2UobmkpOworCQl9CisJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgYXR0cmlidXRlIGhhcyAiCisJCQkJCSJub24temVybyBsb3dlc3RfdmNuLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBTZXR1cCBhbGwgdGhlIHNpemVzLiAqLworCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOworCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQljb21wcmVzc2VkX3NpemUpOworCQl9CisJfQorCisJLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgYXR0cmlidXRlIGlub2RlLiAqLworCXZpLT5pX29wID0gTlVMTDsKKwl2aS0+aV9mb3AgPSBOVUxMOworCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkKKwkJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKKwllbHNlCisJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfYW9wczsKKworCWlmICghTklub0NvbXByZXNzZWQobmkpKQorCQl2aS0+aV9ibG9ja3MgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gOTsKKwllbHNlCisJCXZpLT5pX2Jsb2NrcyA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPj4gOTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXNuJ3QgZ28gYXdheSBhbmQgYXR0YWNoIGl0IHRvIHRoZQorCSAqIGF0dHJpYnV0ZSBpbm9kZS4KKwkgKi8KKwlpZ3JhYihiYXNlX3ZpKTsKKwluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBiYXNlX25pOworCW5pLT5ucl9leHRlbnRzID0gLTE7CisKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKKwordW5tX2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKK2Vycl9vdXQ6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlaSB3aGlsZSByZWFkaW5nIGF0dHJpYnV0ZSAiCisJCQkiaW5vZGUgKG1mdF9ubyAweCVseCwgdHlwZSAweCV4LCBuYW1lX2xlbiAlaSkuICAiCisJCQkiTWFya2luZyBjb3JydXB0IGlub2RlIGFuZCBiYXNlIGlub2RlIDB4JWx4IGFzIGJhZC4gICIKKwkJCSJSdW4gY2hrZHNrLiIsIGVyciwgdmktPmlfaW5vLCBuaS0+dHlwZSwgbmktPm5hbWVfbGVuLAorCQkJYmFzZV92aS0+aV9pbm8pOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwltYWtlX2JhZF9pbm9kZShiYXNlX3ZpKTsKKwlpZiAoZXJyICE9IC1FTk9NRU0pCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUgLSByZWFkIGFuIGluZGV4IGlub2RlIGZyb20gaXRzIGJhc2UgaW5vZGUKKyAqIEBiYXNlX3ZpOgliYXNlIGlub2RlCisgKiBAdmk6CQlpbmRleCBpbm9kZSB0byByZWFkCisgKgorICogbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZSgpIGlzIGNhbGxlZCBmcm9tIG50ZnNfaW5kZXhfaWdldCgpIHRvIHJlYWQgdGhlCisgKiBpbmRleCBpbm9kZSBkZXNjcmliZWQgYnkgQHZpIGludG8gbWVtb3J5IGZyb20gdGhlIGJhc2UgbWZ0IHJlY29yZCBkZXNjcmliZWQKKyAqIGJ5IEBiYXNlX25pLgorICoKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoKSBtYXBzLCBwaW5zIGFuZCBsb2NrcyB0aGUgYmFzZSBpbm9kZSBmb3IKKyAqIHJlYWRpbmcgYW5kIGxvb2tzIHVwIHRoZSBhdHRyaWJ1dGVzIHJlbGF0aW5nIHRvIHRoZSBpbmRleCBkZXNjcmliZWQgYnkgQHZpCisgKiBiZWZvcmUgc2V0dGluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBpbiBAdmkgYXMgd2VsbCBhcyBpbml0aWFsaXppbmcgdGhlCisgKiBudGZzIGlub2RlLgorICoKKyAqIE5vdGUsIGluZGV4IGlub2RlcyBhcmUgZXNzZW50aWFsbHkgYXR0cmlidXRlIGlub2RlcyAoTklub0F0dHIoKSBpcyB0cnVlKQorICogd2l0aCB0aGUgYXR0cmlidXRlIHR5cGUgc2V0IHRvIEFUX0lOREVYX0FMTE9DQVRJT04uICBBcGFydCBmcm9tIHRoYXQsIHRoZXkKKyAqIGFyZSBzZXR1cCBsaWtlIGRpcmVjdG9yeSBpbm9kZXMgc2luY2UgZGlyZWN0b3JpZXMgYXJlIGEgc3BlY2lhbCBjYXNlIG9mCisgKiBpbmRpY2VzIGFvIHRoZXkgbmVlZCB0byBiZSB0cmVhdGVkIGluIG11Y2ggdGhlIHNhbWUgd2F5LiAgTW9zdCBpbXBvcnRhbnRseSwKKyAqIGZvciBzbWFsbCBpbmRpY2VzIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBtaWdodCBub3QgYWN0dWFsbHkgZXhpc3QuCisgKiBIb3dldmVyLCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgYWx3YXlzIGV4aXN0cyBidXQgdGhpcyBkb2VzIG5vdCBuZWVkIHRvCisgKiBoYXZlIGFuIGlub2RlIGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgdGhpcyBpcyB3aHkgd2UgZGVmaW5lIGEgbmV3IGlub2RlIHR5cGUKKyAqIGluZGV4LiAgQWxzbywgbGlrZSBmb3IgZGlyZWN0b3JpZXMsIHdlIG5lZWQgdG8gaGF2ZSBhbiBhdHRyaWJ1dGUgaW5vZGUgZm9yCisgKiB0aGUgYml0bWFwIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBhbmQgd2UKKyAqIGNhbiBzdG9yZSB0aGlzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBvZiB0aGUgaW5vZGUsIGp1c3QgbGlrZSB3ZSBkbyBmb3IKKyAqIG5vcm1hbCBkaXJlY3RvcnkgaW5vZGVzLgorICoKKyAqIFE6IFdoYXQgbG9ja3MgYXJlIGhlbGQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkPworICogQTogaV9zdGF0ZSBoYXMgSV9MT0NLIHNldCwgaGVuY2UgdGhlIGlub2RlIGlzIGxvY2tlZCwgYWxzbworICogICAgaV9jb3VudCBpcyBzZXQgdG8gMSwgc28gaXQgaXMgbm90IGdvaW5nIHRvIGdvIGF3YXkKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlIGlub2RlIHdpbGwKKyAqIGhhdmUgaGFkIG1ha2VfYmFkX2lub2RlKCkgZXhlY3V0ZWQgb24gaXQuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmJhc2VfdmksIHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IodmktPmlfc2IpOworCW50ZnNfaW5vZGUgKm5pLCAqYmFzZV9uaSwgKmJuaTsKKwlzdHJ1Y3QgaW5vZGUgKmJ2aTsKKwlNRlRfUkVDT1JEICptOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJSU5ERVhfUk9PVCAqaXI7CisJdTggKmlyX2VuZCwgKmluZGV4X2VuZDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseC4iLCB2aS0+aV9pbm8pOworCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCW5pCT0gTlRGU19JKHZpKTsKKwliYXNlX25pID0gTlRGU19JKGJhc2VfdmkpOworCS8qIEp1c3QgbWlycm9yIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYmFzZSBpbm9kZS4gKi8KKwl2aS0+aV9ibGtzaXplCT0gYmFzZV92aS0+aV9ibGtzaXplOworCXZpLT5pX3ZlcnNpb24JPSBiYXNlX3ZpLT5pX3ZlcnNpb247CisJdmktPmlfdWlkCT0gYmFzZV92aS0+aV91aWQ7CisJdmktPmlfZ2lkCT0gYmFzZV92aS0+aV9naWQ7CisJdmktPmlfbmxpbmsJPSBiYXNlX3ZpLT5pX25saW5rOworCXZpLT5pX210aW1lCT0gYmFzZV92aS0+aV9tdGltZTsKKwl2aS0+aV9jdGltZQk9IGJhc2VfdmktPmlfY3RpbWU7CisJdmktPmlfYXRpbWUJPSBiYXNlX3ZpLT5pX2F0aW1lOworCXZpLT5pX2dlbmVyYXRpb24gPSBuaS0+c2VxX25vID0gYmFzZV9uaS0+c2VxX25vOworCS8qIFNldCBpbm9kZSB0eXBlIHRvIHplcm8gYnV0IHByZXNlcnZlIHBlcm1pc3Npb25zLiAqLworCXZpLT5pX21vZGUJPSBiYXNlX3ZpLT5pX21vZGUgJiB+U19JRk1UOworCS8qIE1hcCB0aGUgbWZ0IHJlY29yZCBmb3IgdGhlIGJhc2UgaW5vZGUuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyAiCisJCQkJCSJtaXNzaW5nLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBTZXQgdXAgdGhlIHN0YXRlLiAqLworCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzIG5vdCByZXNpZGVudC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSB2YWx1ZS4gKi8KKwlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49CisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQuCisJCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkICIKKwkJCQkiYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4IHJvb3QgaXMgbm90IGFsbG93ZWQuICovCisJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19FTkNSWVBURUQgfAorCQkJQVRUUl9JU19TUEFSU0UpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkL2VuY3J5cHRlZC9zcGFyc2UgaW5kZXggIgorCQkJCSJyb290IGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpcl9lbmQgPSAodTgqKWlyICsgbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJaWYgKGlyX2VuZCA+ICh1OCopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyBjb3JydXB0LiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwlpZiAoaW5kZXhfZW5kID4gaXJfZW5kKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBpcyBjb3JydXB0LiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoaXItPnR5cGUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IHR5cGUgaXMgbm90IDAgKHR5cGUgaXMgMHgleCkuIiwKKwkJCQlsZTMyX3RvX2NwdShpci0+dHlwZSkpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSBpci0+Y29sbGF0aW9uX3J1bGU7CisJbnRmc19kZWJ1ZygiSW5kZXggY29sbGF0aW9uIHJ1bGUgaXMgMHgleC4iLAorCQkJbGUzMl90b19jcHUoaXItPmNvbGxhdGlvbl9ydWxlKSk7CisJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPSBsZTMyX3RvX2NwdShpci0+aW5kZXhfYmxvY2tfc2l6ZSk7CisJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplICYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSBpcyBub3QgYSBwb3dlciBvZiAiCisJCQkJInR3by4iLCBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYmxvY2sgc2l6ZSAoJXUpID4gUEFHRV9DQUNIRV9TSVpFICIKKwkJCQkiKCVsZCkgaXMgbm90IHN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUsIFBBR0VfQ0FDSEVfU0laRSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPCBOVEZTX0JMT0NLX1NJWkUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSA8IE5URlNfQkxPQ0tfU0laRSAiCisJCQkJIiglaSkgaXMgbm90IHN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUsIE5URlNfQkxPQ0tfU0laRSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0gZmZzKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSAtIDE7CisJLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgdmNuIGluIHRoZSBpbmRleC4gKi8KKwlpZiAodm9sLT5jbHVzdGVyX3NpemUgPD0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5jbHVzdGVyX3NpemU7CisJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwl9IGVsc2UgeworCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemUgPSB2b2wtPnNlY3Rvcl9zaXplOworCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IHZvbC0+c2VjdG9yX3NpemVfYml0czsKKwl9CisJLyogQ2hlY2sgZm9yIHByZXNlbmNlIG9mIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCWlmICghKGlyLT5pbmRleC5mbGFncyAmIExBUkdFX0lOREVYKSkgeworCQkvKiBObyBpbmRleCBhbGxvY2F0aW9uLiAqLworCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBuaS0+YWxsb2NhdGVkX3NpemUgPSAwOworCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBtZnQgcmVjb3JkLCBzbyB3ZSByZWxlYXNlIGl0LiAqLworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gc2tpcF9sYXJnZV9pbmRleF9zdHVmZjsKKwl9IC8qIExBUkdFX0lOREVYOiAgSW5kZXggYWxsb2NhdGlvbiBwcmVzZW50LiAgU2V0dXAgc3RhdGUuICovCisJTklub1NldEluZGV4QWxsb2NQcmVzZW50KG5pKTsKKwkvKiBGaW5kIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfQUxMT0NBVElPTiwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCQkibm90IHByZXNlbnQgYnV0ICRJTkRFWF9ST09UICIKKwkJCQkJImluZGljYXRlZCBpdCBpcy4iKTsKKwkJZWxzZQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb29rdXAgIgorCQkJCQkiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCSJyZXNpZGVudC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyoKKwkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuCisJICovCisJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KAorCQkJY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0gbGUxNl90b19jcHUoCisJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBuYW1lIGlzICIKKwkJCQkicGxhY2VkIGFmdGVyIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCSJlbmNyeXB0ZWQuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBpcyBzcGFyc2UuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCSJjb21wcmVzc2VkLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgJElOREVYX0FMTE9DQVRJT04gIgorCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvIGxvd2VzdF92Y24uIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwluaS0+YWxsb2NhdGVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkvKgorCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICBPdGhlcndpc2UKKwkgKiB3ZSB3b3VsZCBkZWFkbG9jayBpbiBudGZzX2F0dHJfaWdldCgpLgorCSAqLworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJbSA9IE5VTEw7CisJY3R4ID0gTlVMTDsKKwkvKiBHZXQgdGhlIGluZGV4IGJpdG1hcCBhdHRyaWJ1dGUgaW5vZGUuICovCisJYnZpID0gbnRmc19hdHRyX2lnZXQoYmFzZV92aSwgQVRfQklUTUFQLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuKTsKKwlpZiAoSVNfRVJSKGJ2aSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJZXJyID0gUFRSX0VSUihidmkpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlibmkgPSBOVEZTX0koYnZpKTsKKwlpZiAoTklub0NvbXByZXNzZWQoYm5pKSB8fCBOSW5vRW5jcnlwdGVkKGJuaSkgfHwKKwkJCU5Jbm9TcGFyc2UoYm5pKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJEJJVE1BUCBhdHRyaWJ1dGUgaXMgY29tcHJlc3NlZCBhbmQvb3IgIgorCQkJCSJlbmNyeXB0ZWQgYW5kL29yIHNwYXJzZS4iKTsKKwkJZ290byBpcHV0X3VubV9lcnJfb3V0OworCX0KKwkvKiBDb25zaXN0ZW5jeSBjaGVjayBiaXRtYXAgc2l6ZSB2cy4gaW5kZXggYWxsb2NhdGlvbiBzaXplLiAqLworCWlmICgoYnZpLT5pX3NpemUgPDwgMykgPCAodmktPmlfc2l6ZSA+PgorCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJpdG1hcCB0b28gc21hbGwgKDB4JWxseCkgZm9yICIKKwkJCQkiaW5kZXggYWxsb2NhdGlvbiAoMHglbGx4KS4iLCBidmktPmlfc2l6ZSA8PCAzLAorCQkJCXZpLT5pX3NpemUpOworCQlnb3RvIGlwdXRfdW5tX2Vycl9vdXQ7CisJfQorCW5pLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gYnZpOworc2tpcF9sYXJnZV9pbmRleF9zdHVmZjoKKwkvKiBTZXR1cCB0aGUgb3BlcmF0aW9ucyBmb3IgdGhpcyBpbmRleCBpbm9kZS4gKi8KKwl2aS0+aV9vcCA9IE5VTEw7CisJdmktPmlfZm9wID0gTlVMTDsKKwl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGJhc2UgaW5vZGUgZG9lc24ndCBnbyBhd2F5IGFuZCBhdHRhY2ggaXQgdG8gdGhlCisJICogaW5kZXggaW5vZGUuCisJICovCisJaWdyYWIoYmFzZV92aSk7CisJbmktPmV4dC5iYXNlX250ZnNfaW5vID0gYmFzZV9uaTsKKwluaS0+bnJfZXh0ZW50cyA9IC0xOworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKKworaXB1dF91bm1fZXJyX291dDoKKwlpcHV0KGJ2aSk7Cit1bm1fZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKK2Vycl9vdXQ6CisJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkgd2hpbGUgcmVhZGluZyBpbmRleCAiCisJCQkiaW5vZGUgKG1mdF9ubyAweCVseCwgbmFtZV9sZW4gJWkuIiwgZXJyLCB2aS0+aV9pbm8sCisJCQluaS0+bmFtZV9sZW4pOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQICYmIGVyciAhPSAtRU5PTUVNKQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfaW5vZGVfbW91bnQgLSBzcGVjaWFsIHJlYWRfaW5vZGUgZm9yIG1vdW50IHRpbWUgdXNlIG9ubHkKKyAqIEB2aToJCWlub2RlIHRvIHJlYWQKKyAqCisgKiBSZWFkIGlub2RlIEZJTEVfTUZUIGF0IG1vdW50IHRpbWUsIG9ubHkgY2FsbGVkIHdpdGggc3VwZXJfYmxvY2sgbG9jaworICogaGVsZCBmcm9tIHdpdGhpbiB0aGUgcmVhZF9zdXBlcigpIGNvZGUgcGF0aC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIHdoZW4gaXQgaXMgY2FsbGVkIHRoZSBwYWdlIGNhY2hlIGZvciAkTUZULyREQVRBCisgKiBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIGhlbmNlIHdlIGNhbm5vdCBnZXQgYXQgdGhlIGNvbnRlbnRzIG9mIG1mdCByZWNvcmRzCisgKiBieSBjYWxsaW5nIG1hcF9tZnRfcmVjb3JkKigpLgorICoKKyAqIEZ1cnRoZXIgaXQgbmVlZHMgdG8gY29wZSB3aXRoIHRoZSBjaXJjdWxhciByZWZlcmVuY2VzIHByb2JsZW0sIGkuZS4gY2Fubm90CisgKiBsb2FkIGFueSBhdHRyaWJ1dGVzIG90aGVyIHRoYW4gJEFUVFJJQlVURV9MSVNUIHVudGlsICREQVRBIGlzIGxvYWRlZCwgYmVjYXVzZQorICogd2UgZG8gbm90IGtub3cgd2hlcmUgdGhlIG90aGVyIGV4dGVudCBtZnQgcmVjb3JkcyBhcmUgeWV0IGFuZCBhZ2FpbiwgYmVjYXVzZQorICogd2UgY2Fubm90IGNhbGwgbWFwX21mdF9yZWNvcmQqKCkgeWV0LiAgT2J2aW91c2x5IHRoaXMgYXBwbGllcyBvbmx5IHdoZW4gYW4KKyAqIGF0dHJpYnV0ZSBsaXN0IGlzIGFjdHVhbGx5IHByZXNlbnQgaW4gJE1GVCBpbm9kZS4KKyAqCisgKiBXZSBzb2x2ZSB0aGVzZSBwcm9ibGVtcyBieSBzdGFydGluZyB3aXRoIHRoZSAkREFUQSBhdHRyaWJ1dGUgYmVmb3JlIGFueXRoaW5nCisgKiBlbHNlIGFuZCBpdGVyYXRpbmcgdXNpbmcgbnRmc19hdHRyX2xvb2t1cCgkREFUQSkgb3ZlciBhbGwgZXh0ZW50cy4gIEFzIGVhY2gKKyAqIGV4dGVudCBpcyBmb3VuZCwgd2UgbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSBpbmNsdWRpbmcgdGhlIGltcGxpZWQKKyAqIG50ZnNfcnVubGlzdHNfbWVyZ2UoKS4gIEVhY2ggc3RlcCBvZiB0aGUgaXRlcmF0aW9uIG5lY2Vzc2FyaWx5IHByb3ZpZGVzCisgKiBzdWZmaWNpZW50IGluZm9ybWF0aW9uIGZvciB0aGUgbmV4dCBzdGVwIHRvIGNvbXBsZXRlLgorICoKKyAqIFRoaXMgc2hvdWxkIHdvcmsgYnV0IHRoZXJlIGFyZSB0d28gcG9zc2libGUgcGl0IGZhbGxzIChzZWUgaW5saW5lIGNvbW1lbnRzCisgKiBiZWxvdyksIGJ1dCBvbmx5IHRpbWUgd2lsbCB0ZWxsIGlmIHRoZXkgYXJlIHJlYWwgcGl0cyBvciBqdXN0IHNtb2tlLi4uCisgKi8KK2ludCBudGZzX3JlYWRfaW5vZGVfbW91bnQoc3RydWN0IGlub2RlICp2aSkKK3sKKwlWQ04gbmV4dF92Y24sIGxhc3RfdmNuLCBoaWdoZXN0X3ZjbjsKKwlzNjQgYmxvY2s7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZpLT5pX3NiOworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCW50ZnNfaW5vZGUgKm5pOworCU1GVF9SRUNPUkQgKm0gPSBOVUxMOworCUFUVFJfUkVDT1JEICphdHRyOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJdW5zaWduZWQgaW50IGksIG5yX2Jsb2NrczsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgQHZpLiAqLworCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCisJbmkgPSBOVEZTX0kodmkpOworCisJLyogU2V0dXAgdGhlIGRhdGEgYXR0cmlidXRlLiBJdCBpcyBzcGVjaWFsIGFzIGl0IGlzIG1zdCBwcm90ZWN0ZWQuICovCisJTklub1NldE5vblJlc2lkZW50KG5pKTsKKwlOSW5vU2V0TXN0UHJvdGVjdGVkKG5pKTsKKwluaS0+dHlwZSA9IEFUX0RBVEE7CisJbmktPm5hbWUgPSBOVUxMOworCW5pLT5uYW1lX2xlbiA9IDA7CisKKwkvKgorCSAqIFRoaXMgc2V0cyB1cCBvdXIgbGl0dGxlIGNoZWF0IGFsbG93aW5nIHVzIHRvIHJldXNlIHRoZSBhc3luYyByZWFkIGlvCisJICogY29tcGxldGlvbiBoYW5kbGVyIGZvciBkaXJlY3Rvcmllcy4KKwkgKi8KKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCisJLyogVmVyeSBpbXBvcnRhbnQhIE5lZWRlZCB0byBiZSBhYmxlIHRvIGNhbGwgbWFwX21mdF9yZWNvcmQqKCkuICovCisJdm9sLT5tZnRfaW5vID0gdmk7CisKKwkvKiBBbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgdGhlIGZpcnN0IG1mdCByZWNvcmQuICovCisJaWYgKHZvbC0+bWZ0X3JlY29yZF9zaXplID4gNjQgKiAxMDI0KSB7CisJCW50ZnNfZXJyb3Ioc2IsICJVbnN1cHBvcnRlZCBtZnQgcmVjb3JkIHNpemUgJWkgKG1heCA2NGtpQikuIiwKKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaSA9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWlmIChpIDwgc2ItPnNfYmxvY2tzaXplKQorCQlpID0gc2ItPnNfYmxvY2tzaXplOworCW0gPSAoTUZUX1JFQ09SRCopbnRmc19tYWxsb2Nfbm9mcyhpKTsKKwlpZiAoIW0pIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yICRNRlQgcmVjb3JkIDAuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSAkTUZULyREQVRBIGF0dHJpYnV0ZS4gKi8KKwlibG9jayA9IHZvbC0+bWZ0X2xjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQlzYi0+c19ibG9ja3NpemVfYml0czsKKwlucl9ibG9ja3MgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpZiAoIW5yX2Jsb2NrcykKKwkJbnJfYmxvY2tzID0gMTsKKworCS8qIExvYWQgJE1GVC8kREFUQSdzIGZpcnN0IG1mdCByZWNvcmQuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2Jsb2NrczsgaSsrKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKyspOworCQlpZiAoIWJoKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRGV2aWNlIHJlYWQgZmFpbGVkLiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCW1lbWNweSgoY2hhciopbSArIChpIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSwgYmgtPmJfZGF0YSwKKwkJCQlzYi0+c19ibG9ja3NpemUpOworCQlicmVsc2UoYmgpOworCX0KKworCS8qIEFwcGx5IHRoZSBtc3QgZml4dXBzLiAqLworCWlmIChwb3N0X3JlYWRfbXN0X2ZpeHVwKChOVEZTX1JFQ09SRCopbSwgdm9sLT5tZnRfcmVjb3JkX3NpemUpKSB7CisJCS8qIEZJWE1FOiBUcnkgdG8gdXNlIHRoZSAkTUZUTWlyciBub3cuICovCisJCW50ZnNfZXJyb3Ioc2IsICJNU1QgZml4dXAgZmFpbGVkLiAkTUZUIGlzIGNvcnJ1cHQuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBOZWVkIHRoaXMgdG8gc2FuaXR5IGNoZWNrIGF0dHJpYnV0ZSBsaXN0IHJlZmVyZW5jZXMgdG8gJE1GVC4gKi8KKwl2aS0+aV9nZW5lcmF0aW9uID0gbmktPnNlcV9ubyA9IGxlMTZfdG9fY3B1KG0tPnNlcXVlbmNlX251bWJlcik7CisKKwkvKiBQcm92aWRlcyByZWFkcGFnZSgpIGFuZCBzeW5jX3BhZ2UoKSBmb3IgbWFwX21mdF9yZWNvcmQoKS4gKi8KKwl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogRmluZCB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlmIHByZXNlbnQuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9BVFRSSUJVVEVfTElTVCwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAoZXJyKSB7CisJCWlmICh1bmxpa2VseShlcnIgIT0gLUVOT0VOVCkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9va3VwIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJImF0dHJpYnV0ZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCX0gZWxzZSAvKiBpZiAoIWVycikgKi8geworCQlBVFRSX0xJU1RfRU5UUlkgKmFsX2VudHJ5LCAqbmV4dF9hbF9lbnRyeTsKKwkJdTggKmFsX2VuZDsKKworCQludGZzX2RlYnVnKCJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgZm91bmQgaW4gJE1GVC4iKTsKKwkJTklub1NldEF0dHJMaXN0KG5pKTsKKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0sgfHwKKwkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgIgorCQkJCQkiY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlLiBOb3QgIgorCQkJCQkiYWxsb3dlZC4gJE1GVCBpcyBjb3JydXB0LiBZb3Ugc2hvdWxkICIKKwkJCQkJInJ1biBjaGtkc2suIik7CisJCQlnb3RvIHB1dF9lcnJfb3V0OworCQl9CisJCS8qIE5vdyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJbmktPmF0dHJfbGlzdF9zaXplID0gKHUzMiludGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpOworCQluaS0+YXR0cl9saXN0ID0gbnRmc19tYWxsb2Nfbm9mcyhuaS0+YXR0cl9saXN0X3NpemUpOworCQlpZiAoIW5pLT5hdHRyX2xpc3QpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBidWZmZXIgIgorCQkJCQkiZm9yIGF0dHJpYnV0ZSBsaXN0LiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJCU5Jbm9TZXRBdHRyTGlzdE5vblJlc2lkZW50KG5pKTsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiQXR0cmlidXRlIGxpc3QgaGFzIG5vbiB6ZXJvICIKKwkJCQkJCSJsb3dlc3RfdmNuLiAkTUZUIGlzIGNvcnJ1cHQuICIKKwkJCQkJCSJZb3Ugc2hvdWxkIHJ1biBjaGtkc2suIik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJCS8qIFNldHVwIHRoZSBydW5saXN0LiAqLworCQkJbmktPmF0dHJfbGlzdF9ybC5ybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKHZvbCwKKwkJCQkJY3R4LT5hdHRyLCBOVUxMKTsKKwkJCWlmIChJU19FUlIobmktPmF0dHJfbGlzdF9ybC5ybCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpOworCQkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBOVUxMOworCQkJCW50ZnNfZXJyb3Ioc2IsICJNYXBwaW5nIHBhaXJzIGRlY29tcHJlc3Npb24gIgorCQkJCQkJImZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuIiwKKwkJCQkJCS1lcnIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKiBOb3cgbG9hZCB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCQlpZiAoKGVyciA9IGxvYWRfYXR0cmlidXRlX2xpc3Qodm9sLCAmbmktPmF0dHJfbGlzdF9ybCwKKwkJCQkJbmktPmF0dHJfbGlzdCwgbmktPmF0dHJfbGlzdF9zaXplLAorCQkJCQlzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLgorCQkJCQlub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSkpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCQkiYXR0cmlidXRlIHdpdGggZXJyb3IgY29kZSAlaS4iLAorCQkJCQkJLWVycik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJfSBlbHNlIC8qIGlmICghY3R4LmF0dHItPm5vbl9yZXNpZGVudCkgKi8geworCQkJaWYgKCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCQkJKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJDb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJCSJhdHRyaWJ1dGUuIik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJCS8qIE5vdyBjb3B5IHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJCW1lbWNweShuaS0+YXR0cl9saXN0LCAodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpKTsKKwkJfQorCQkvKiBUaGUgYXR0cmlidXRlIGxpc3QgaXMgbm93IHNldHVwIGluIG1lbW9yeS4gKi8KKwkJLyoKKwkJICogRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGNhc2UgaXMgYWN0dWFsbHkgcG9zc2libGUuCisJCSAqIEFjY29yZGluZyB0byBsb2dpYyBpdCBpcyBub3QgcG9zc2libGUgYnV0IEkgaGF2ZSBzZWVuIHRvbworCQkgKiBtYW55IHdlaXJkIHRoaW5ncyBpbiBNUyBzb2Z0d2FyZSB0byByZWx5IG9uIGxvZ2ljLi4uIFRodXMgd2UKKwkJICogcGVyZm9ybSBhIG1hbnVhbCBzZWFyY2ggYW5kIG1ha2Ugc3VyZSB0aGUgZmlyc3QgJE1GVC8kREFUQQorCQkgKiBleHRlbnQgaXMgaW4gdGhlIGJhc2UgaW5vZGUuIElmIGl0IGlzIG5vdCB3ZSBhYm9ydCB3aXRoIGFuCisJCSAqIGVycm9yIGFuZCBpZiB3ZSBldmVyIHNlZSBhIHJlcG9ydCBvZiB0aGlzIGVycm9yIHdlIHdpbGwgbmVlZAorCQkgKiB0byBkbyBzb21lIG1hZ2ljIGluIG9yZGVyIHRvIGhhdmUgdGhlIG5lY2Vzc2FyeSBtZnQgcmVjb3JkCisJCSAqIGxvYWRlZCBhbmQgaW4gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBwYWdlIGNhY2hlLiBCdXQKKwkJICogaG9wZWZ1bGx5IGxvZ2ljIHdpbGwgcHJldmFpbCBhbmQgdGhpcyBuZXZlciBoYXBwZW5zLi4uCisJCSAqLworCQlhbF9lbnRyeSA9IChBVFRSX0xJU1RfRU5UUlkqKW5pLT5hdHRyX2xpc3Q7CisJCWFsX2VuZCA9ICh1OCopYWxfZW50cnkgKyBuaS0+YXR0cl9saXN0X3NpemU7CisJCWZvciAoOzsgYWxfZW50cnkgPSBuZXh0X2FsX2VudHJ5KSB7CisJCQkvKiBPdXQgb2YgYm91bmRzIGNoZWNrLiAqLworCQkJaWYgKCh1OCopYWxfZW50cnkgPCBuaS0+YXR0cl9saXN0IHx8CisJCQkJCSh1OCopYWxfZW50cnkgPiBhbF9lbmQpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCS8qIENhdGNoIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQkJaWYgKCh1OCopYWxfZW50cnkgPT0gYWxfZW5kKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQlpZiAoIWFsX2VudHJ5LT5sZW5ndGgpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCWlmICgodTgqKWFsX2VudHJ5ICsgNiA+IGFsX2VuZCB8fCAodTgqKWFsX2VudHJ5ICsKKwkJCQkJbGUxNl90b19jcHUoYWxfZW50cnktPmxlbmd0aCkgPiBhbF9lbmQpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCW5leHRfYWxfZW50cnkgPSAoQVRUUl9MSVNUX0VOVFJZKikoKHU4KilhbF9lbnRyeSArCisJCQkJCWxlMTZfdG9fY3B1KGFsX2VudHJ5LT5sZW5ndGgpKTsKKwkJCWlmIChsZTMyX3RvX2NwdShhbF9lbnRyeS0+dHlwZSkgPgorCQkJCQljb25zdF9sZTMyX3RvX2NwdShBVF9EQVRBKSkKKwkJCQlnb3RvIGVtX3B1dF9lcnJfb3V0OworCQkJaWYgKEFUX0RBVEEgIT0gYWxfZW50cnktPnR5cGUpCisJCQkJY29udGludWU7CisJCQkvKiBXZSB3YW50IGFuIHVubmFtZWQgYXR0cmlidXRlLiAqLworCQkJaWYgKGFsX2VudHJ5LT5uYW1lX2xlbmd0aCkKKwkJCQlnb3RvIGVtX3B1dF9lcnJfb3V0OworCQkJLyogV2FudCB0aGUgZmlyc3QgZW50cnksIGkuZS4gbG93ZXN0X3ZjbiA9PSAwLiAqLworCQkJaWYgKGFsX2VudHJ5LT5sb3dlc3RfdmNuKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQkvKiBGaXJzdCBlbnRyeSBoYXMgdG8gYmUgaW4gdGhlIGJhc2UgbWZ0IHJlY29yZC4gKi8KKwkJCWlmIChNUkVGX0xFKGFsX2VudHJ5LT5tZnRfcmVmZXJlbmNlKSAhPSB2aS0+aV9pbm8pIHsKKwkJCQkvKiBNRlQgcmVmZXJlbmNlcyBkbyBub3QgbWF0Y2gsIGxvZ2ljIGZhaWxzLiAqLworCQkJCW50ZnNfZXJyb3Ioc2IsICJCVUc6IFRoZSBmaXJzdCAkREFUQSBleHRlbnQgIgorCQkJCQkJIm9mICRNRlQgaXMgbm90IGluIHRoZSBiYXNlICIKKwkJCQkJCSJtZnQgcmVjb3JkLiBQbGVhc2UgcmVwb3J0ICIKKwkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9IGVsc2UgeworCQkJCS8qIFNlcXVlbmNlIG51bWJlcnMgbXVzdCBtYXRjaC4gKi8KKwkJCQlpZiAoTVNFUU5PX0xFKGFsX2VudHJ5LT5tZnRfcmVmZXJlbmNlKSAhPQorCQkJCQkJbmktPnNlcV9ubykKKwkJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCQkvKiBHb3QgaXQuIEFsbCBpcyBvay4gV2UgY2FuIHN0b3Agbm93LiAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisKKwkvKiBOb3cgbG9hZCBhbGwgYXR0cmlidXRlIGV4dGVudHMuICovCisJYXR0ciA9IE5VTEw7CisJbmV4dF92Y24gPSBsYXN0X3ZjbiA9IGhpZ2hlc3RfdmNuID0gMDsKKwl3aGlsZSAoIShlcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0RBVEEsIE5VTEwsIDAsIDAsIG5leHRfdmNuLCBOVUxMLCAwLAorCQkJY3R4KSkpIHsKKwkJcnVubGlzdF9lbGVtZW50ICpucmw7CisKKwkJLyogQ2FjaGUgdGhlIGN1cnJlbnQgYXR0cmlidXRlLiAqLworCQlhdHRyID0gY3R4LT5hdHRyOworCQkvKiAkTUZUIG11c3QgYmUgbm9uLXJlc2lkZW50LiAqLworCQlpZiAoIWF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJbnRmc19lcnJvcihzYiwgIiRNRlQgbXVzdCBiZSBub24tcmVzaWRlbnQgYnV0IGEgIgorCQkJCQkicmVzaWRlbnQgZXh0ZW50IHdhcyBmb3VuZC4gJE1GVCBpcyAiCisJCQkJCSJjb3JydXB0LiBSdW4gY2hrZHNrLiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQkvKiAkTUZUIG11c3QgYmUgdW5jb21wcmVzc2VkIGFuZCB1bmVuY3J5cHRlZC4gKi8KKwkJaWYgKGF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJYXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIG11c3QgYmUgdW5jb21wcmVzc2VkLCAiCisJCQkJCSJub24tc3BhcnNlLCBhbmQgdW5lbmNyeXB0ZWQgYnV0IGEgIgorCQkJCQkiY29tcHJlc3NlZC9zcGFyc2UvZW5jcnlwdGVkIGV4dGVudCAiCisJCQkJCSJ3YXMgZm91bmQuICRNRlQgaXMgY29ycnVwdC4gUnVuICIKKwkJCQkJImNoa2Rzay4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogRGVjb21wcmVzcyB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBvZiB0aGlzIGV4dGVudCBhbmQgbWVyZ2UKKwkJICogdGhlIHJlc3VsdCBpbnRvIHRoZSBleGlzdGluZyBydW5saXN0LiBObyBuZWVkIGZvciBsb2NraW5nCisJCSAqIGFzIHdlIGhhdmUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgaW5vZGUgYXQgdGhpcyB0aW1lIGFuZCB3ZQorCQkgKiBhcmUgYSBtb3VudCBpbiBwcm9ncmVzcyB0YXNrLCB0b28uCisJCSAqLworCQlucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsIGF0dHIsIG5pLT5ydW5saXN0LnJsKTsKKwkJaWYgKElTX0VSUihucmwpKSB7CisJCQludGZzX2Vycm9yKHNiLCAibnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSAiCisJCQkJCSJmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4gICRNRlQgaXMgIgorCQkJCQkiY29ycnVwdC4iLCBQVFJfRVJSKG5ybCkpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQluaS0+cnVubGlzdC5ybCA9IG5ybDsKKworCQkvKiBBcmUgd2UgaW4gdGhlIGZpcnN0IGV4dGVudD8gKi8KKwkJaWYgKCFuZXh0X3ZjbikgeworCQkJaWYgKGF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmlyc3QgZXh0ZW50IG9mICREQVRBICIKKwkJCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvICIKKwkJCQkJCSJsb3dlc3RfdmNuLiAkTUZUIGlzIGNvcnJ1cHQuICIKKwkJCQkJCSJZb3Ugc2hvdWxkIHJ1biBjaGtkc2suIik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJCS8qIEdldCB0aGUgbGFzdCB2Y24gaW4gdGhlICREQVRBIGF0dHJpYnV0ZS4gKi8KKwkJCWxhc3RfdmNuID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSkKKwkJCQkJPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCS8qIEZpbGwgaW4gdGhlIGlub2RlIHNpemUuICovCisJCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoYXR0ci0+ZGF0YS4KKwkJCQkJbm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOworCQkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CisJCQkvKgorCQkJICogVmVyaWZ5IHRoZSBudW1iZXIgb2YgbWZ0IHJlY29yZHMgZG9lcyBub3QgZXhjZWVkCisJCQkgKiAyXjMyIC0gMS4KKwkJCSAqLworCQkJaWYgKCh2aS0+aV9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpID49CisJCQkJCSgxVUxMIDw8IDMyKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIGlzIHRvbyBiaWchIEFib3J0aW5nLiIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKgorCQkJICogV2UgaGF2ZSBnb3QgdGhlIGZpcnN0IGV4dGVudCBvZiB0aGUgcnVubGlzdCBmb3IKKwkJCSAqICRNRlQgd2hpY2ggbWVhbnMgaXQgaXMgbm93IHJlbGF0aXZlbHkgc2FmZSB0byBjYWxsCisJCQkgKiB0aGUgbm9ybWFsIG50ZnNfcmVhZF9pbm9kZSgpIGZ1bmN0aW9uLgorCQkJICogQ29tcGxldGUgcmVhZGluZyB0aGUgaW5vZGUsIHRoaXMgd2lsbCBhY3R1YWxseQorCQkJICogcmUtcmVhZCB0aGUgbWZ0IHJlY29yZCBmb3IgJE1GVCwgdGhpcyB0aW1lIGVudGVyaW5nCisJCQkgKiBpdCBpbnRvIHRoZSBwYWdlIGNhY2hlIHdpdGggd2hpY2ggd2UgY29tcGxldGUgdGhlCisJCQkgKiBraWNrIHN0YXJ0IG9mIHRoZSB2b2x1bWUuIEl0IHNob3VsZCBiZSBzYWZlIHRvIGRvCisJCQkgKiB0aGlzIG5vdyBhcyB0aGUgZmlyc3QgZXh0ZW50IG9mICRNRlQvJERBVEEgaXMKKwkJCSAqIGFscmVhZHkga25vd24gYW5kIHdlIHdvdWxkIGhvcGUgdGhhdCB3ZSBkb24ndCBuZWVkCisJCQkgKiBmdXJ0aGVyIGV4dGVudHMgaW4gb3JkZXIgdG8gZmluZCB0aGUgb3RoZXIKKwkJCSAqIGF0dHJpYnV0ZXMgYmVsb25naW5nIHRvICRNRlQuIE9ubHkgdGltZSB3aWxsIHRlbGwgaWYKKwkJCSAqIHRoaXMgaXMgcmVhbGx5IHRoZSBjYXNlLiBJZiBub3Qgd2Ugd2lsbCBoYXZlIHRvIHBsYXkKKwkJCSAqIG1hZ2ljIGF0IHRoaXMgcG9pbnQsIHBvc3NpYmx5IGR1cGxpY2F0aW5nIGEgbG90IG9mCisJCQkgKiBudGZzX3JlYWRfaW5vZGUoKSBhdCB0aGlzIHBvaW50LiBXZSB3aWxsIG5lZWQgdG8KKwkJCSAqIGVuc3VyZSB3ZSBkbyBlbm91Z2ggb2YgaXRzIHdvcmsgdG8gYmUgYWJsZSB0byBjYWxsCisJCQkgKiBudGZzX3JlYWRfaW5vZGUoKSBvbiBleHRlbnRzIG9mICRNRlQvJERBVEEuIEJ1dCBsZXRzCisJCQkgKiBob3BlIHRoaXMgbmV2ZXIgaGFwcGVucy4uLgorCQkJICovCisJCQludGZzX3JlYWRfbG9ja2VkX2lub2RlKHZpKTsKKwkJCWlmIChpc19iYWRfaW5vZGUodmkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIm50ZnNfcmVhZF9pbm9kZSgpIG9mICRNRlQgIgorCQkJCQkJImZhaWxlZC4gQlVHIG9yIGNvcnJ1cHQgJE1GVC4gIgorCQkJCQkJIlJ1biBjaGtkc2sgYW5kIGlmIG5vIGVycm9ycyAiCisJCQkJCQkiYXJlIGZvdW5kLCBwbGVhc2UgcmVwb3J0IHlvdSAiCisJCQkJCQkic2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQkJCS8qIFJldmVydCB0byB0aGUgc2FmZSBzdXBlciBvcGVyYXRpb25zLiAqLworCQkJCW50ZnNfZnJlZShtKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkvKgorCQkJICogUmUtaW5pdGlhbGl6ZSBzb21lIHNwZWNpZmljcyBhYm91dCAkTUZUJ3MgaW5vZGUgYXMKKwkJCSAqIG50ZnNfcmVhZF9pbm9kZSgpIHdpbGwgaGF2ZSBzZXQgdXAgdGhlIGRlZmF1bHQgb25lcy4KKwkJCSAqLworCQkJLyogU2V0IHVpZCBhbmQgZ2lkIHRvIHJvb3QuICovCisJCQl2aS0+aV91aWQgPSB2aS0+aV9naWQgPSAwOworCQkJLyogUmVndWxhciBmaWxlLiBObyBhY2Nlc3MgZm9yIGFueW9uZS4gKi8KKwkJCXZpLT5pX21vZGUgPSBTX0lGUkVHOworCQkJLyogTm8gVkZTIGluaXRpYXRlZCBvcGVyYXRpb25zIGFsbG93ZWQgZm9yICRNRlQuICovCisJCQl2aS0+aV9vcCA9ICZudGZzX2VtcHR5X2lub2RlX29wczsKKwkJCXZpLT5pX2ZvcCA9ICZudGZzX2VtcHR5X2ZpbGVfb3BzOworCQl9CisKKwkJLyogR2V0IHRoZSBsb3dlc3QgdmNuIGZvciB0aGUgbmV4dCBleHRlbnQuICovCisJCWhpZ2hlc3RfdmNuID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKTsKKwkJbmV4dF92Y24gPSBoaWdoZXN0X3ZjbiArIDE7CisKKwkJLyogT25seSBvbmUgZXh0ZW50IG9yIGVycm9yLCB3aGljaCB3ZSBjYXRjaCBiZWxvdy4gKi8KKwkJaWYgKG5leHRfdmNuIDw9IDApCisJCQlicmVhazsKKworCQkvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIGR1ZSB0byBjb3JydXB0aW9uLiAqLworCQlpZiAobmV4dF92Y24gPCBzbGU2NF90b19jcHUoCisJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIGhhcyBjb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJImF0dHJpYnV0ZS4gUnVuIGNoa2Rzay4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwl9CisJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9va3VwICRNRlQvJERBVEEgYXR0cmlidXRlIGV4dGVudC4gIgorCQkJCSIkTUZUIGlzIGNvcnJ1cHQuIFJ1biBjaGtkc2suIik7CisJCWdvdG8gcHV0X2Vycl9vdXQ7CisJfQorCWlmICghYXR0cikgeworCQludGZzX2Vycm9yKHNiLCAiJE1GVC8kREFUQSBhdHRyaWJ1dGUgbm90IGZvdW5kLiAkTUZUIGlzICIKKwkJCQkiY29ycnVwdC4gUnVuIGNoa2Rzay4iKTsKKwkJZ290byBwdXRfZXJyX291dDsKKwl9CisJaWYgKGhpZ2hlc3RfdmNuICYmIGhpZ2hlc3RfdmNuICE9IGxhc3RfdmNuIC0gMSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgdGhlIGNvbXBsZXRlIHJ1bmxpc3QgZm9yICIKKwkJCQkiJE1GVC8kREFUQS4gRHJpdmVyIGJ1ZyBvciBjb3JydXB0ICRNRlQuICIKKwkJCQkiUnVuIGNoa2Rzay4iKTsKKwkJbnRmc19kZWJ1ZygiaGlnaGVzdF92Y24gPSAweCVsbHgsIGxhc3RfdmNuIC0gMSA9IDB4JWxseCIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyloaWdoZXN0X3ZjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdmNuIC0gMSk7CisJCWdvdG8gcHV0X2Vycl9vdXQ7CisJfQorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJbnRmc19mcmVlKG0pOworCXJldHVybiAwOworCitlbV9wdXRfZXJyX291dDoKKwludGZzX2Vycm9yKHNiLCAiQ291bGRuJ3QgZmluZCBmaXJzdCBleHRlbnQgb2YgJERBVEEgYXR0cmlidXRlIGluICIKKwkJCSJhdHRyaWJ1dGUgbGlzdC4gJE1GVCBpcyBjb3JydXB0LiBSdW4gY2hrZHNrLiIpOworcHV0X2Vycl9vdXQ6CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQuIE1hcmtpbmcgaW5vZGUgYXMgYmFkLiIpOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwludGZzX2ZyZWUobSk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIG50ZnNfcHV0X2lub2RlIC0gaGFuZGxlciBmb3Igd2hlbiB0aGUgaW5vZGUgcmVmZXJlbmNlIGNvdW50IGlzIGRlY3JlbWVudGVkCisgKiBAdmk6CQl2ZnMgaW5vZGUKKyAqCisgKiBUaGUgVkZTIGNhbGxzIG50ZnNfcHV0X2lub2RlKCkgZXZlcnkgdGltZSB0aGUgaW5vZGUgcmVmZXJlbmNlIGNvdW50IChpX2NvdW50KQorICogaXMgYWJvdXQgdG8gYmUgZGVjcmVtZW50ZWQgKGJ1dCBiZWZvcmUgdGhlIGRlY3JlbWVudCBpdHNlbGYuCisgKgorICogSWYgdGhlIGlub2RlIEB2aSBpcyBhIGRpcmVjdG9yeSB3aXRoIHR3byByZWZlcmVuY2VzLCBvbmUgb2Ygd2hpY2ggaXMgYmVpbmcKKyAqIGRyb3BwZWQsIHdlIG5lZWQgdG8gcHV0IHRoZSBhdHRyaWJ1dGUgaW5vZGUgZm9yIHRoZSBkaXJlY3RvcnkgaW5kZXggYml0bWFwLAorICogaWYgaXQgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBkaXJlY3RvcnkgaW5vZGUgd291bGQgcmVtYWluIHBpbm5lZCBmb3IKKyAqIGV2ZXIuCisgKi8KK3ZvaWQgbnRmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwlpZiAoU19JU0RJUih2aS0+aV9tb2RlKSAmJiBhdG9taWNfcmVhZCgmdmktPmlfY291bnQpID09IDIpIHsKKwkJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCQlpZiAoTklub0luZGV4QWxsb2NQcmVzZW50KG5pKSkgeworCQkJc3RydWN0IGlub2RlICpidmkgPSBOVUxMOworCQkJZG93bigmdmktPmlfc2VtKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmdmktPmlfY291bnQpID09IDIpIHsKKwkJCQlidmkgPSBuaS0+aXR5cGUuaW5kZXguYm1wX2lubzsKKwkJCQlpZiAoYnZpKQorCQkJCQluaS0+aXR5cGUuaW5kZXguYm1wX2lubyA9IE5VTEw7CisJCQl9CisJCQl1cCgmdmktPmlfc2VtKTsKKwkJCWlmIChidmkpCisJCQkJaXB1dChidmkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX250ZnNfY2xlYXJfaW5vZGUobnRmc19pbm9kZSAqbmkpCit7CisJLyogRnJlZSBhbGwgYWxvY2F0ZWQgbWVtb3J5LiAqLworCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCWlmIChuaS0+cnVubGlzdC5ybCkgeworCQludGZzX2ZyZWUobmktPnJ1bmxpc3QucmwpOworCQluaS0+cnVubGlzdC5ybCA9IE5VTEw7CisJfQorCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKworCWlmIChuaS0+YXR0cl9saXN0KSB7CisJCW50ZnNfZnJlZShuaS0+YXR0cl9saXN0KTsKKwkJbmktPmF0dHJfbGlzdCA9IE5VTEw7CisJfQorCisJZG93bl93cml0ZSgmbmktPmF0dHJfbGlzdF9ybC5sb2NrKTsKKwlpZiAobmktPmF0dHJfbGlzdF9ybC5ybCkgeworCQludGZzX2ZyZWUobmktPmF0dHJfbGlzdF9ybC5ybCk7CisJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBOVUxMOworCX0KKwl1cF93cml0ZSgmbmktPmF0dHJfbGlzdF9ybC5sb2NrKTsKKworCWlmIChuaS0+bmFtZV9sZW4gJiYgbmktPm5hbWUgIT0gSTMwKSB7CisJCS8qIENhdGNoIGJ1Z3MuLi4gKi8KKwkJQlVHX09OKCFuaS0+bmFtZSk7CisJCWtmcmVlKG5pLT5uYW1lKTsKKwl9Cit9CisKK3ZvaWQgbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobnRmc19pbm9kZSAqbmkpCit7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCisJQlVHX09OKE5Jbm9BdHRyKG5pKSk7CisJQlVHX09OKG5pLT5ucl9leHRlbnRzICE9IC0xKTsKKworI2lmZGVmIE5URlNfUlcKKwlpZiAoTklub0RpcnR5KG5pKSkgeworCQlpZiAoIWlzX2JhZF9pbm9kZShWRlNfSShuaS0+ZXh0LmJhc2VfbnRmc19pbm8pKSkKKwkJCW50ZnNfZXJyb3IobmktPnZvbC0+c2IsICJDbGVhcmluZyBkaXJ0eSBleHRlbnQgaW5vZGUhICAiCisJCQkJCSJMb3NpbmcgZGF0YSEgIFRoaXMgaXMgYSBCVUchISEiKTsKKwkJLy8gRklYTUU6ICBEbyBzb21ldGhpbmchISEKKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJX19udGZzX2NsZWFyX2lub2RlKG5pKTsKKworCS8qIEJ5ZSwgYnllLi4uICovCisJbnRmc19kZXN0cm95X2V4dGVudF9pbm9kZShuaSk7Cit9CisKKy8qKgorICogbnRmc19jbGVhcl9iaWdfaW5vZGUgLSBjbGVhbiB1cCB0aGUgbnRmcyBzcGVjaWZpYyBwYXJ0IG9mIGFuIGlub2RlCisgKiBAdmk6CQl2ZnMgaW5vZGUgcGVuZGluZyBhbm5paGlsYXRpb24KKyAqCisgKiBXaGVuIHRoZSBWRlMgaXMgZ29pbmcgdG8gcmVtb3ZlIGFuIGlub2RlIGZyb20gbWVtb3J5LCBudGZzX2NsZWFyX2JpZ19pbm9kZSgpCisgKiBpcyBjYWxsZWQsIHdoaWNoIGRlYWxsb2NhdGVzIGFsbCBtZW1vcnkgYmVsb25naW5nIHRvIHRoZSBOVEZTIHNwZWNpZmljIHBhcnQKKyAqIG9mIHRoZSBpbm9kZSBhbmQgcmV0dXJucy4KKyAqCisgKiBJZiB0aGUgTUZUIHJlY29yZCBpcyBkaXJ0eSwgd2UgY29tbWl0IGl0IGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLgorICovCit2b2lkIG50ZnNfY2xlYXJfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgQHZpIGlzIGFuIGluZGV4IGlub2RlIHdlIG5lZWQgdG8gcHV0IHRoZSBhdHRyaWJ1dGUKKwkgKiBpbm9kZSBmb3IgdGhlIGluZGV4IGJpdG1hcCwgaWYgaXQgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBpbmRleAorCSAqIGlub2RlIHdvdWxkIGRpc2FwcGVhciBhbmQgdGhlIGF0dHJpYnV0ZSBpbm9kZSBmb3IgdGhlIGluZGV4IGJpdG1hcAorCSAqIHdvdWxkIG5vIGxvbmdlciBiZSByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUgYW5kIHRodXMgaXQgd291bGQgcmVtYWluCisJICogcGlubmVkIGZvciBldmVyLgorCSAqLworCWlmIChOSW5vQXR0cihuaSkgJiYgKG5pLT50eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pICYmCisJCQlOSW5vSW5kZXhBbGxvY1ByZXNlbnQobmkpICYmIG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vKSB7CisJCWlwdXQobmktPml0eXBlLmluZGV4LmJtcF9pbm8pOworCQluaS0+aXR5cGUuaW5kZXguYm1wX2lubyA9IE5VTEw7CisJfQorI2lmZGVmIE5URlNfUlcKKwlpZiAoTklub0RpcnR5KG5pKSkgeworCQlCT09MIHdhc19iYWQgPSAoaXNfYmFkX2lub2RlKHZpKSk7CisKKwkJLyogQ29tbWl0dGluZyB0aGUgaW5vZGUgYWxzbyBjb21taXRzIGFsbCBleHRlbnQgaW5vZGVzLiAqLworCQludGZzX2NvbW1pdF9pbm9kZSh2aSk7CisKKwkJaWYgKCF3YXNfYmFkICYmIChpc19iYWRfaW5vZGUodmkpIHx8IE5Jbm9EaXJ0eShuaSkpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGNvbW1pdCBkaXJ0eSBpbm9kZSAiCisJCQkJCSIweCVseC4gIExvc2luZyBkYXRhISIsIHZpLT5pX2lubyk7CisJCQkvLyBGSVhNRTogIERvIHNvbWV0aGluZyEhIQorCQl9CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCS8qIE5vIG5lZWQgdG8gbG9jayBhdCB0aGlzIHN0YWdlIGFzIG5vIG9uZSBlbHNlIGhhcyBhIHJlZmVyZW5jZS4gKi8KKwlpZiAobmktPm5yX2V4dGVudHMgPiAwKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBuaS0+bnJfZXh0ZW50czsgaSsrKQorCQkJbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobmktPmV4dC5leHRlbnRfbnRmc19pbm9zW2ldKTsKKwkJa2ZyZWUobmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwl9CisKKwlfX250ZnNfY2xlYXJfaW5vZGUobmkpOworCisJaWYgKE5Jbm9BdHRyKG5pKSkgeworCQkvKiBSZWxlYXNlIHRoZSBiYXNlIGlub2RlIGlmIHdlIGFyZSBob2xkaW5nIGl0LiAqLworCQlpZiAobmktPm5yX2V4dGVudHMgPT0gLTEpIHsKKwkJCWlwdXQoVkZTX0kobmktPmV4dC5iYXNlX250ZnNfaW5vKSk7CisJCQluaS0+bnJfZXh0ZW50cyA9IDA7CisJCQluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBOVUxMOworCQl9CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBudGZzX3Nob3dfb3B0aW9ucyAtIHNob3cgbW91bnQgb3B0aW9ucyBpbiAvcHJvYy9tb3VudHMKKyAqIEBzZjoJCXNlcV9maWxlIGluIHdoaWNoIHRvIHdyaXRlIG91ciBtb3VudCBvcHRpb25zCisgKiBAbW50Ogl2ZnMgbW91bnQgd2hvc2UgbW91bnQgb3B0aW9ucyB0byBkaXNwbGF5CisgKgorICogQ2FsbGVkIGJ5IHRoZSBWRlMgb25jZSBmb3IgZWFjaCBtb3VudGVkIG50ZnMgdm9sdW1lIHdoZW4gc29tZW9uZSByZWFkcworICogL3Byb2MvbW91bnRzIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIE5URlMgc3BlY2lmaWMgbW91bnQgb3B0aW9ucyBvZiBlYWNoCisgKiBtb3VudC4gVGhlIG1vdW50IG9wdGlvbnMgb2YgdGhlIHZmcyBtb3VudCBAbW50IGFyZSB3cml0dGVuIHRvIHRoZSBzZXEgZmlsZQorICogQHNmIGFuZCBzdWNjZXNzIGlzIHJldHVybmVkLgorICovCitpbnQgbnRmc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobW50LT5tbnRfc2IpOworCWludCBpOworCisJc2VxX3ByaW50ZihzZiwgIix1aWQ9JWkiLCB2b2wtPnVpZCk7CisJc2VxX3ByaW50ZihzZiwgIixnaWQ9JWkiLCB2b2wtPmdpZCk7CisJaWYgKHZvbC0+Zm1hc2sgPT0gdm9sLT5kbWFzaykKKwkJc2VxX3ByaW50ZihzZiwgIix1bWFzaz0wJW8iLCB2b2wtPmZtYXNrKTsKKwllbHNlIHsKKwkJc2VxX3ByaW50ZihzZiwgIixmbWFzaz0wJW8iLCB2b2wtPmZtYXNrKTsKKwkJc2VxX3ByaW50ZihzZiwgIixkbWFzaz0wJW8iLCB2b2wtPmRtYXNrKTsKKwl9CisJc2VxX3ByaW50ZihzZiwgIixubHM9JXMiLCB2b2wtPm5sc19tYXAtPmNoYXJzZXQpOworCWlmIChOVm9sQ2FzZVNlbnNpdGl2ZSh2b2wpKQorCQlzZXFfcHJpbnRmKHNmLCAiLGNhc2Vfc2Vuc2l0aXZlIik7CisJaWYgKE5Wb2xTaG93U3lzdGVtRmlsZXModm9sKSkKKwkJc2VxX3ByaW50ZihzZiwgIixzaG93X3N5c19maWxlcyIpOworCWZvciAoaSA9IDA7IG9uX2Vycm9yc19hcnJbaV0udmFsOyBpKyspIHsKKwkJaWYgKG9uX2Vycm9yc19hcnJbaV0udmFsICYgdm9sLT5vbl9lcnJvcnMpCisJCQlzZXFfcHJpbnRmKHNmLCAiLGVycm9ycz0lcyIsIG9uX2Vycm9yc19hcnJbaV0uc3RyKTsKKwl9CisJc2VxX3ByaW50ZihzZiwgIixtZnRfem9uZV9tdWx0aXBsaWVyPSVpIiwgdm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX3RydW5jYXRlIC0gY2FsbGVkIHdoZW4gdGhlIGlfc2l6ZSBvZiBhbiBudGZzIGlub2RlIGlzIGNoYW5nZWQKKyAqIEB2aToJCWlub2RlIGZvciB3aGljaCB0aGUgaV9zaXplIHdhcyBjaGFuZ2VkCisgKgorICogV2UgZG8gbm90IHN1cHBvcnQgaV9zaXplIGNoYW5nZXMgeWV0LgorICoKKyAqIFRoZSBrZXJuZWwgZ3VhcmFudGVlcyB0aGF0IEB2aSBpcyBhIHJlZ3VsYXIgZmlsZSAoU19JU1JFRygpIGlzIHRydWUpIGFuZAorICogdGhhdCB0aGUgY2hhbmdlIGlzIGFsbG93ZWQuCisgKgorICogVGhpcyBpbXBsaWVzIGZvciB1cyB0aGF0IEB2aSBpcyBhIGZpbGUgaW5vZGUgcmF0aGVyIHRoYW4gYSBkaXJlY3RvcnksIGluZGV4LAorICogb3IgYXR0cmlidXRlIGlub2RlIGFzIHdlbGwgYXMgdGhhdCBAdmkgaXMgYSBiYXNlIGlub2RlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBDYWxsZWQgd2l0aCAtPmlfc2VtIGhlbGQuICBJbiBhbGwgYnV0IG9uZSBjYXNlIC0+aV9hbGxvY19zZW0gaXMgaGVsZCBmb3IKKyAqIHdyaXRpbmcuICBUaGUgb25seSBjYXNlIHdoZXJlIC0+aV9hbGxvY19zZW0gaXMgbm90IGhlbGQgaXMKKyAqIG1tL2ZpbGVtYXAuYzo6Z2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKCkgd2hlcmUgdm10cnVuY2F0ZSgpIGlzIGNhbGxlZAorICogd2l0aCB0aGUgY3VycmVudCBpX3NpemUgYXMgdGhlIG9mZnNldCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGEgbm9vcCBhcyBmYXIKKyAqIGFzIG50ZnNfdHJ1bmNhdGUoKSBpcyBjb25jZXJuZWQuCisgKi8KK2ludCBudGZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbTsKKwljb25zdCBjaGFyICp0ZSA9ICIgIExlYXZpbmcgZmlsZSBsZW5ndGggb3V0IG9mIHN5bmMgd2l0aCBpX3NpemUuIjsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJQlVHX09OKE5Jbm9BdHRyKG5pKSk7CisJQlVHX09OKG5pLT5ucl9leHRlbnRzIDwgMCk7CisJbSA9IG1hcF9tZnRfcmVjb3JkKG5pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQgZm9yIGlub2RlIDB4JWx4ICIKKwkJCQkiKGVycm9yIGNvZGUgJWQpLiVzIiwgdmktPmlfaW5vLCBlcnIsIHRlKTsKKwkJY3R4ID0gTlVMTDsKKwkJbSA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIHNlYXJjaCBjb250ZXh0IGZvciAiCisJCQkJImlub2RlIDB4JWx4IChub3QgZW5vdWdoIG1lbW9yeSkuJXMiLAorCQkJCXZpLT5pX2lubywgdGUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiT3BlbiBhdHRyaWJ1dGUgaXMgbWlzc2luZyBmcm9tICIKKwkJCQkJIm1mdCByZWNvcmQuICBJbm9kZSAweCVseCBpcyBjb3JydXB0LiAgIgorCQkJCQkiUnVuIGNoa2Rzay4iLCB2aS0+aV9pbm8pOworCQllbHNlCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGxvb2t1cCBhdHRyaWJ1dGUgaW4gIgorCQkJCQkiaW5vZGUgMHglbHggKGVycm9yIGNvZGUgJWQpLiIsCisJCQkJCXZpLT5pX2lubywgZXJyKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBJZiB0aGUgc2l6ZSBoYXMgbm90IGNoYW5nZWQgdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KKwlpZiAobnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKSA9PSBpX3NpemVfcmVhZCh2aSkpCisJCWdvdG8gZG9uZTsKKwkvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIHRydW5jYXRlLi4uCisJbnRmc19lcnJvcih2aS0+aV9zYiwgIklub2RlIHNpemUgaGFzIGNoYW5nZWQgYnV0IHRoaXMgaXMgbm90ICIKKwkJCSJpbXBsZW1lbnRlZCB5ZXQuICBSZXNldHRpbmcgaW5vZGUgc2l6ZSB0byBvbGQgdmFsdWUuICIKKwkJCSIgVGhpcyBpcyBtb3N0IGxpa2VseSBhIGJ1ZyBpbiB0aGUgbnRmcyBkcml2ZXIhIik7CisJaV9zaXplX3dyaXRlKHZpLCBudGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpKTsgCitkb25lOgorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmkpOworCU5Jbm9DbGVhclRydW5jYXRlRmFpbGVkKG5pKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyICE9IC1FTk9NRU0pIHsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCQltYWtlX2JhZF9pbm9kZSh2aSk7CisJfQorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwlOSW5vU2V0VHJ1bmNhdGVGYWlsZWQobmkpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc190cnVuY2F0ZV92ZnMgLSB3cmFwcGVyIGZvciBudGZzX3RydW5jYXRlKCkgdGhhdCBoYXMgbm8gcmV0dXJuIHZhbHVlCisgKiBAdmk6CQlpbm9kZSBmb3Igd2hpY2ggdGhlIGlfc2l6ZSB3YXMgY2hhbmdlZAorICoKKyAqIFdyYXBwZXIgZm9yIG50ZnNfdHJ1bmNhdGUoKSB0aGF0IGhhcyBubyByZXR1cm4gdmFsdWUuCisgKgorICogU2VlIG50ZnNfdHJ1bmNhdGUoKSBkZXNjcmlwdGlvbiBhYm92ZSBmb3IgZGV0YWlscy4KKyAqLwordm9pZCBudGZzX3RydW5jYXRlX3ZmcyhzdHJ1Y3QgaW5vZGUgKnZpKSB7CisJbnRmc190cnVuY2F0ZSh2aSk7Cit9CisKKy8qKgorICogbnRmc19zZXRhdHRyIC0gY2FsbGVkIGZyb20gbm90aWZ5X2NoYW5nZSgpIHdoZW4gYW4gYXR0cmlidXRlIGlzIGJlaW5nIGNoYW5nZWQKKyAqIEBkZW50cnk6CWRlbnRyeSB3aG9zZSBhdHRyaWJ1dGVzIHRvIGNoYW5nZQorICogQGF0dHI6CXN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGVzIGFuZCB0aGUgY2hhbmdlcworICoKKyAqIFdlIGhhdmUgdG8gdHJhcCBWRlMgYXR0ZW1wdHMgdG8gdHJ1bmNhdGUgdGhlIGZpbGUgZGVzY3JpYmVkIGJ5IEBkZW50cnkgYXMKKyAqIHNvb24gYXMgcG9zc2libGUsIGJlY2F1c2Ugd2UgZG8gbm90IGltcGxlbWVudCBjaGFuZ2VzIGluIGlfc2l6ZSB5ZXQuICBTbyB3ZQorICogYWJvcnQgYWxsIGlfc2l6ZSBjaGFuZ2VzIGhlcmUuCisgKgorICogV2UgYWxzbyBhYm9ydCBhbGwgY2hhbmdlcyBvZiB1c2VyLCBncm91cCwgYW5kIG1vZGUgYXMgd2UgZG8gbm90IGltcGxlbWVudAorICogdGhlIE5URlMgQUNMcyB5ZXQuCisgKgorICogQ2FsbGVkIHdpdGggLT5pX3NlbSBoZWxkLiAgRm9yIHRoZSBBVFRSX1NJWkUgKGkuZS4gLT50cnVuY2F0ZSkgY2FzZSwgYWxzbworICogY2FsbGVkIHdpdGggLT5pX2FsbG9jX3NlbSBoZWxkIGZvciB3cml0aW5nLgorICoKKyAqIEJhc2ljYWxseSB0aGlzIGlzIGEgY29weSBvZiBnZW5lcmljIG5vdGlmeV9jaGFuZ2UoKSBhbmQgaW5vZGVfc2V0YXR0cigpCisgKiBmdW5jdGlvbmFsaXR5LCBleGNlcHQgd2UgaW50ZXJjZXB0IGFuZCBhYm9ydCBjaGFuZ2VzIGluIGlfc2l6ZS4KKyAqLworaW50IG50ZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisKKwllcnIgPSBpbm9kZV9jaGFuZ2Vfb2sodmksIGF0dHIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBXZSBkbyBub3Qgc3VwcG9ydCBOVEZTIEFDTHMgeWV0LiAqLworCWlmIChpYV92YWxpZCAmIChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9NT0RFKSkgeworCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJDaGFuZ2VzIGluIHVzZXIvZ3JvdXAvbW9kZSBhcmUgbm90ICIKKwkJCQkic3VwcG9ydGVkIHlldCwgaWdub3JpbmcuIik7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQodmkpKSB7CisJCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJDaGFuZ2VzIGluIGlub2RlIHNpemUgYXJlIG5vdCAiCisJCQkJCSJzdXBwb3J0ZWQgeWV0LCBpZ25vcmluZy4iKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJLy8gVE9ETzogSW1wbGVtZW50Li4uCisJCQkvLyBlcnIgPSB2bXRydW5jYXRlKHZpLCBhdHRyLT5pYV9zaXplKTsKKwkJCWlmIChlcnIgfHwgaWFfdmFsaWQgPT0gQVRUUl9TSVpFKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIHNraXBwZWQgdGhlIHRydW5jYXRlIGJ1dCBtdXN0IHN0aWxsIHVwZGF0ZQorCQkJICogdGltZXN0YW1wcy4KKwkJCSAqLworCQkJaWFfdmFsaWQgfD0gQVRUUl9NVElNRXxBVFRSX0NUSU1FOworCQl9CisJfQorCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKKwkJdmktPmlfYXRpbWUgPSBhdHRyLT5pYV9hdGltZTsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKQorCQl2aS0+aV9tdGltZSA9IGF0dHItPmlhX210aW1lOworCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpCisJCXZpLT5pX2N0aW1lID0gYXR0ci0+aWFfY3RpbWU7CisJbWFya19pbm9kZV9kaXJ0eSh2aSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3dyaXRlX2lub2RlIC0gd3JpdGUgb3V0IGEgZGlydHkgaW5vZGUKKyAqIEB2aToJCWlub2RlIHRvIHdyaXRlIG91dAorICogQHN5bmM6CWlmIHRydWUsIHdyaXRlIG91dCBzeW5jaHJvbm91c2x5CisgKgorICogV3JpdGUgb3V0IGEgZGlydHkgaW5vZGUgdG8gZGlzayBpbmNsdWRpbmcgYW55IGV4dGVudCBpbm9kZXMgaWYgcHJlc2VudC4KKyAqCisgKiBJZiBAc3luYyBpcyB0cnVlLCBjb21taXQgdGhlIGlub2RlIHRvIGRpc2sgYW5kIHdhaXQgZm9yIGlvIGNvbXBsZXRpb24uICBUaGlzCisgKiBpcyBkb25lIHVzaW5nIHdyaXRlX21mdF9yZWNvcmQoKS4KKyAqCisgKiBJZiBAc3luYyBpcyBmYWxzZSwganVzdCBzY2hlZHVsZSB0aGUgd3JpdGUgdG8gaGFwcGVuIGJ1dCBkbyBub3Qgd2FpdCBmb3IgaS9vCisgKiBjb21wbGV0aW9uLiAgSW4gMi42IGtlcm5lbHMsIHNjaGVkdWxpbmcgdXN1YWxseSBoYXBwZW5zIGp1c3QgYnkgdmlydHVlIG9mCisgKiBtYXJraW5nIHRoZSBwYWdlIChhbmQgaW4gdGhpcyBjYXNlIG1mdCByZWNvcmQpIGRpcnR5IGJ1dCB3ZSBkbyBub3QgaW1wbGVtZW50CisgKiB0aGlzIHlldCBhcyB3cml0ZV9tZnRfcmVjb3JkKCkgbGFyZ2VseSBpZ25vcmVzIHRoZSBAc3luYyBwYXJhbWV0ZXIgYW5kCisgKiBhbHdheXMgcGVyZm9ybXMgc3luY2hyb25vdXMgd3JpdGVzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IG50ZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICp2aSwgaW50IHN5bmMpCit7CisJc2xlNjQgbnQ7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbTsKKwlTVEFOREFSRF9JTkZPUk1BVElPTiAqc2k7CisJaW50IGVyciA9IDA7CisJQk9PTCBtb2RpZmllZCA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yICVzaW5vZGUgMHglbHguIiwgTklub0F0dHIobmkpID8gImF0dHIgIiA6ICIiLAorCQkJdmktPmlfaW5vKTsKKwkvKgorCSAqIERpcnR5IGF0dHJpYnV0ZSBpbm9kZXMgYXJlIHdyaXR0ZW4gdmlhIHRoZWlyIHJlYWwgaW5vZGVzIHNvIGp1c3QKKwkgKiBjbGVhbiB0aGVtIGhlcmUuICBBY2Nlc3MgdGltZSB1cGRhdGVzIGFyZSB0YWtlbiBjYXJlIG9mZiB3aGVuIHRoZQorCSAqIHJlYWwgaW5vZGUgaXMgd3JpdHRlbi4KKwkgKi8KKwlpZiAoTklub0F0dHIobmkpKSB7CisJCU5Jbm9DbGVhckRpcnR5KG5pKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE1hcCwgcGluLCBhbmQgbG9jayB0aGUgbWZ0IHJlY29yZCBiZWxvbmdpbmcgdG8gdGhlIGlub2RlLiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFVwZGF0ZSB0aGUgYWNjZXNzIHRpbWVzIGluIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUuICovCisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9TVEFOREFSRF9JTkZPUk1BVElPTiwgTlVMTCwgMCwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlzaSA9IChTVEFOREFSRF9JTkZPUk1BVElPTiopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwkvKiBVcGRhdGUgdGhlIGFjY2VzcyB0aW1lcyBpZiB0aGV5IGhhdmUgY2hhbmdlZC4gKi8KKwludCA9IHV0YzJudGZzKHZpLT5pX210aW1lKTsKKwlpZiAoc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSAhPSBudCkgeworCQludGZzX2RlYnVnKCJVcGRhdGluZyBtdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X2RhdGFfY2hhbmdlX3RpbWUpLAorCQkJCXNsZTY0X3RvX2NwdShudCkpOworCQlzaS0+bGFzdF9kYXRhX2NoYW5nZV90aW1lID0gbnQ7CisJCW1vZGlmaWVkID0gVFJVRTsKKwl9CisJbnQgPSB1dGMybnRmcyh2aS0+aV9jdGltZSk7CisJaWYgKHNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSAhPSBudCkgeworCQludGZzX2RlYnVnKCJVcGRhdGluZyBjdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSksCisJCQkJc2xlNjRfdG9fY3B1KG50KSk7CisJCXNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSA9IG50OworCQltb2RpZmllZCA9IFRSVUU7CisJfQorCW50ID0gdXRjMm50ZnModmktPmlfYXRpbWUpOworCWlmIChzaS0+bGFzdF9hY2Nlc3NfdGltZSAhPSBudCkgeworCQludGZzX2RlYnVnKCJVcGRhdGluZyBhdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X2FjY2Vzc190aW1lKSwKKwkJCQlzbGU2NF90b19jcHUobnQpKTsKKwkJc2ktPmxhc3RfYWNjZXNzX3RpbWUgPSBudDsKKwkJbW9kaWZpZWQgPSBUUlVFOworCX0KKwkvKgorCSAqIElmIHdlIGp1c3QgbW9kaWZpZWQgdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSB3ZSBuZWVkIHRvCisJICogbWFyayB0aGUgbWZ0IHJlY29yZCBpdCBpcyBpbiBkaXJ0eS4gIFdlIGRvIHRoaXMgbWFudWFsbHkgc28gdGhhdAorCSAqIG1hcmtfaW5vZGVfZGlydHkoKSBpcyBub3QgY2FsbGVkIHdoaWNoIHdvdWxkIHJlZGlydHkgdGhlIGlub2RlIGFuZAorCSAqIGhlbmNlIHJlc3VsdCBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIHRyeWluZyB0byB3cml0ZSB0aGUgaW5vZGUuCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBtYXJrIHRoZSBiYXNlIGlub2RlIG5vciB0aGUgYmFzZSBtZnQgcmVjb3JkCisJICogZGlydHksIHNpbmNlIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGlzIG1mdCByZWNvcmQgYmVsb3cgaW4gYW55IGNhc2UKKwkgKiBhbmQgdGhlIGJhc2UgbWZ0IHJlY29yZCBtYXkgYWN0dWFsbHkgbm90IGhhdmUgYmVlbiBtb2RpZmllZCBzbyBpdAorCSAqIG1pZ2h0IG5vdCBuZWVkIHRvIGJlIHdyaXR0ZW4gb3V0LgorCSAqIE5PVEU6IEl0IGlzIG5vdCBhIHByb2JsZW0gd2hlbiB0aGUgaW5vZGUgZm9yICRNRlQgaXRzZWxmIGlzIGJlaW5nCisJICogd3JpdHRlbiBvdXQgYXMgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHdpbGwgb25seSBzZXQgSV9ESVJUWV9QQUdFUworCSAqIG9uIHRoZSAkTUZUIGlub2RlIGFuZCBoZW5jZSBudGZzX3dyaXRlX2lub2RlKCkgd2lsbCBub3QgYmUKKwkgKiByZS1pbnZva2VkIGJlY2F1c2Ugb2YgaXQgd2hpY2ggaW4gdHVybiBpcyBvayBzaW5jZSB0aGUgZGlydGllZCBtZnQKKwkgKiByZWNvcmQgd2lsbCBiZSBjbGVhbmVkIGFuZCB3cml0dGVuIG91dCB0byBkaXNrIGJlbG93LCBpLmUuIGJlZm9yZQorCSAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKwkgKi8KKwlpZiAobW9kaWZpZWQgJiYgIU5Jbm9UZXN0U2V0RGlydHkoY3R4LT5udGZzX2lubykpCisJCW1hcmtfbnRmc19yZWNvcmRfZGlydHkoY3R4LT5udGZzX2luby0+cGFnZSwKKwkJCQljdHgtPm50ZnNfaW5vLT5wYWdlX29mcyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJLyogTm93IHRoZSBhY2Nlc3MgdGltZXMgYXJlIHVwZGF0ZWQsIHdyaXRlIHRoZSBiYXNlIG1mdCByZWNvcmQuICovCisJaWYgKE5Jbm9EaXJ0eShuaSkpCisJCWVyciA9IHdyaXRlX21mdF9yZWNvcmQobmksIG0sIHN5bmMpOworCS8qIFdyaXRlIGFsbCBhdHRhY2hlZCBleHRlbnQgbWZ0IHJlY29yZHMuICovCisJZG93bigmbmktPmV4dGVudF9sb2NrKTsKKwlpZiAobmktPm5yX2V4dGVudHMgPiAwKSB7CisJCW50ZnNfaW5vZGUgKipleHRlbnRfbmlzID0gbmktPmV4dC5leHRlbnRfbnRmc19pbm9zOworCQlpbnQgaTsKKworCQludGZzX2RlYnVnKCJXcml0aW5nICVpIGV4dGVudCBpbm9kZXMuIiwgbmktPm5yX2V4dGVudHMpOworCQlmb3IgKGkgPSAwOyBpIDwgbmktPm5yX2V4dGVudHM7IGkrKykgeworCQkJbnRmc19pbm9kZSAqdG5pID0gZXh0ZW50X25pc1tpXTsKKworCQkJaWYgKE5Jbm9EaXJ0eSh0bmkpKSB7CisJCQkJTUZUX1JFQ09SRCAqdG0gPSBtYXBfbWZ0X3JlY29yZCh0bmkpOworCQkJCWludCByZXQ7CisKKwkJCQlpZiAoSVNfRVJSKHRtKSkgeworCQkJCQlpZiAoIWVyciB8fCBlcnIgPT0gLUVOT01FTSkKKwkJCQkJCWVyciA9IFBUUl9FUlIodG0pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0ID0gd3JpdGVfbWZ0X3JlY29yZCh0bmksIHRtLCBzeW5jKTsKKwkJCQl1bm1hcF9tZnRfcmVjb3JkKHRuaSk7CisJCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJCQllcnIgPSByZXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCXVubWFwX21mdF9yZWNvcmQobmkpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIGVycl9vdXQ7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3VubV9lcnJfb3V0OgorCXVubWFwX21mdF9yZWNvcmQobmkpOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgaW5vZGUuICAiCisJCQkJIk1hcmtpbmcgdGhlIGlub2RlIGRpcnR5IGFnYWluLCBzbyB0aGUgVkZTICIKKwkJCQkicmV0cmllcyBsYXRlci4iKTsKKwkJbWFya19pbm9kZV9kaXJ0eSh2aSk7CisJfSBlbHNlIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCAoZXJyb3IgY29kZSAlaSk6ICBNYXJraW5nIGlub2RlICIKKwkJCQkiYXMgYmFkLiAgWW91IHNob3VsZCBydW4gY2hrZHNrLiIsIC1lcnIpOworCQltYWtlX2JhZF9pbm9kZSh2aSk7CisJCU5Wb2xTZXRFcnJvcnMobmktPnZvbCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmggYi9mcy9udGZzL2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ODA0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5vZGUuaApAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIGlub2RlLmggLSBEZWZpbmVzIGZvciBpbm9kZSBzdHJ1Y3R1cmVzIE5URlMgTGludXgga2VybmVsIGRyaXZlci4gUGFydCBvZgorICoJICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19JTk9ERV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0lOT0RFX0gKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJydW5saXN0LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX250ZnNfaW5vZGUgbnRmc19pbm9kZTsKKworLyoKKyAqIFRoZSBOVEZTIGluLW1lbW9yeSBpbm9kZSBzdHJ1Y3R1cmUuIEl0IGlzIGp1c3QgdXNlZCBhcyBhbiBleHRlbnNpb24gdG8gdGhlCisgKiBmaWVsZHMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgVkZTIGlub2RlLgorICovCitzdHJ1Y3QgX250ZnNfaW5vZGUgeworCXM2NCBpbml0aWFsaXplZF9zaXplOwkvKiBDb3B5IGZyb20gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJczY0IGFsbG9jYXRlZF9zaXplOwkvKiBDb3B5IGZyb20gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJdW5zaWduZWQgbG9uZyBzdGF0ZTsJLyogTlRGUyBzcGVjaWZpYyBmbGFncyBkZXNjcmliaW5nIHRoaXMgaW5vZGUuCisJCQkJICAgU2VlIG50ZnNfaW5vZGVfc3RhdGVfYml0cyBiZWxvdy4gKi8KKwl1bnNpZ25lZCBsb25nIG1mdF9ubzsJLyogTnVtYmVyIG9mIHRoZSBtZnQgcmVjb3JkIC8gaW5vZGUuICovCisJdTE2IHNlcV9ubzsJCS8qIFNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWZ0IHJlY29yZC4gKi8KKwlhdG9taWNfdCBjb3VudDsJCS8qIElub2RlIHJlZmVyZW5jZSBjb3VudCBmb3IgYm9vayBrZWVwaW5nLiAqLworCW50ZnNfdm9sdW1lICp2b2w7CS8qIFBvaW50ZXIgdG8gdGhlIG50ZnMgdm9sdW1lIG9mIHRoaXMgaW5vZGUuICovCisJLyoKKwkgKiBJZiBOSW5vQXR0cigpIGlzIHRydWUsIHRoZSBiZWxvdyBmaWVsZHMgZGVzY3JpYmUgdGhlIGF0dHJpYnV0ZSB3aGljaAorCSAqIHRoaXMgZmFrZSBpbm9kZSBiZWxvbmdzIHRvLiBUaGUgYWN0dWFsIGlub2RlIG9mIHRoaXMgYXR0cmlidXRlIGlzCisJICogcG9pbnRlZCB0byBieSBiYXNlX250ZnNfaW5vIGFuZCBucl9leHRlbnRzIGlzIGFsd2F5cyBzZXQgdG8gLTEgKHNlZQorCSAqIGJlbG93KS4gRm9yIHJlYWwgaW5vZGVzLCB3ZSBhbHNvIHNldCB0aGUgdHlwZSAoQVRfREFUQSBmb3IgZmlsZXMgYW5kCisJICogQVRfSU5ERVhfQUxMT0NBVElPTiBmb3IgZGlyZWN0b3JpZXMpLCB3aXRoIHRoZSBuYW1lID0gTlVMTCBhbmQKKwkgKiBuYW1lX2xlbiA9IDAgZm9yIGZpbGVzIGFuZCBuYW1lID0gSTMwIChnbG9iYWwgY29uc3RhbnQpIGFuZAorCSAqIG5hbWVfbGVuID0gNCBmb3IgZGlyZWN0b3JpZXMuCisJICovCisJQVRUUl9UWVBFIHR5cGU7CS8qIEF0dHJpYnV0ZSB0eXBlIG9mIHRoaXMgZmFrZSBpbm9kZS4gKi8KKwludGZzY2hhciAqbmFtZTsJCS8qIEF0dHJpYnV0ZSBuYW1lIG9mIHRoaXMgZmFrZSBpbm9kZS4gKi8KKwl1MzIgbmFtZV9sZW47CQkvKiBBdHRyaWJ1dGUgbmFtZSBsZW5ndGggb2YgdGhpcyBmYWtlIGlub2RlLiAqLworCXJ1bmxpc3QgcnVubGlzdDsJLyogSWYgc3RhdGUgaGFzIHRoZSBOSV9Ob25SZXNpZGVudCBiaXQgc2V0LAorCQkJCSAgIHRoZSBydW5saXN0IG9mIHRoZSB1bm5hbWVkIGRhdGEgYXR0cmlidXRlCisJCQkJICAgKGlmIGEgZmlsZSkgb3Igb2YgdGhlIGluZGV4IGFsbG9jYXRpb24KKwkJCQkgICBhdHRyaWJ1dGUgKGRpcmVjdG9yeSkgb3Igb2YgdGhlIGF0dHJpYnV0ZQorCQkJCSAgIGRlc2NyaWJlZCBieSB0aGUgZmFrZSBpbm9kZSAoaWYgTklub0F0dHIoKSkuCisJCQkJICAgSWYgcnVubGlzdC5ybCBpcyBOVUxMLCB0aGUgcnVubGlzdCBoYXMgbm90CisJCQkJICAgYmVlbiByZWFkIGluIHlldCBvciBoYXMgYmVlbiB1bm1hcHBlZC4gSWYKKwkJCQkgICBOSV9Ob25SZXNpZGVudCBpcyBjbGVhciwgdGhlIGF0dHJpYnV0ZSBpcworCQkJCSAgIHJlc2lkZW50IChmaWxlIGFuZCBmYWtlIGlub2RlKSBvciB0aGVyZSBpcworCQkJCSAgIG5vICRJMzAgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUKKwkJCQkgICAoc21hbGwgZGlyZWN0b3J5KS4gSW4gdGhlIGxhdHRlciBjYXNlCisJCQkJICAgcnVubGlzdC5ybCBpcyBhbHdheXMgTlVMTC4qLworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdmFsaWQgZm9yIHJlYWwgaW5vZGVzIGFuZCBleHRlbnQKKwkgKiBpbm9kZXMuCisJICovCisJc3RydWN0IHNlbWFwaG9yZSBtcmVjX2xvY2s7IC8qIExvY2sgZm9yIHNlcmlhbGl6aW5nIGFjY2VzcyB0byB0aGUKKwkJCQkgICBtZnQgcmVjb3JkIGJlbG9uZ2luZyB0byB0aGlzIGlub2RlLiAqLworCXN0cnVjdCBwYWdlICpwYWdlOwkvKiBUaGUgcGFnZSBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkIG9mIHRoZQorCQkJCSAgIGlub2RlLiBUaGlzIHNob3VsZCBvbmx5IGJlIHRvdWNoZWQgYnkgdGhlCisJCQkJICAgKHVuKW1hcF9tZnRfcmVjb3JkKigpIGZ1bmN0aW9ucy4gKi8KKwlpbnQgcGFnZV9vZnM7CQkvKiBPZmZzZXQgaW50byB0aGUgcGFnZSBhdCB3aGljaCB0aGUgbWZ0IHJlY29yZAorCQkJCSAgIGJlZ2lucy4gVGhpcyBzaG91bGQgb25seSBiZSB0b3VjaGVkIGJ5IHRoZQorCQkJCSAgICh1biltYXBfbWZ0X3JlY29yZCooKSBmdW5jdGlvbnMuICovCisJLyoKKwkgKiBBdHRyaWJ1dGUgbGlzdCBzdXBwb3J0IChvbmx5IGZvciB1c2UgYnkgdGhlIGF0dHJpYnV0ZSBsb29rdXAKKwkgKiBmdW5jdGlvbnMpLiBTZXR1cCBkdXJpbmcgcmVhZF9pbm9kZSBmb3IgYWxsIGlub2RlcyB3aXRoIGF0dHJpYnV0ZQorCSAqIGxpc3RzLiBPbmx5IHZhbGlkIGlmIE5JX0F0dHJMaXN0IGlzIHNldCBpbiBzdGF0ZSwgYW5kIGF0dHJfbGlzdF9ybCBpcworCSAqIGZ1cnRoZXIgb25seSB2YWxpZCBpZiBOSV9BdHRyTGlzdE5vblJlc2lkZW50IGlzIHNldC4KKwkgKi8KKwl1MzIgYXR0cl9saXN0X3NpemU7CS8qIExlbmd0aCBvZiBhdHRyaWJ1dGUgbGlzdCB2YWx1ZSBpbiBieXRlcy4gKi8KKwl1OCAqYXR0cl9saXN0OwkJLyogQXR0cmlidXRlIGxpc3QgdmFsdWUgaXRzZWxmLiAqLworCXJ1bmxpc3QgYXR0cl9saXN0X3JsOwkvKiBSdW4gbGlzdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0IHZhbHVlLiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsgLyogSXQgaXMgYSBkaXJlY3RvcnksICRNRlQsIG9yIGFuIGluZGV4IGlub2RlLiAqLworCQkJc3RydWN0IGlub2RlICpibXBfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yIHRoZQorCQkJCQkJICAgaW5kZXggJEJJVE1BUC4gKi8KKwkJCXUzMiBibG9ja19zaXplOwkJLyogU2l6ZSBvZiBhbiBpbmRleCBibG9jay4gKi8KKwkJCXUzMiB2Y25fc2l6ZTsJCS8qIFNpemUgb2YgYSB2Y24gaW4gdGhpcworCQkJCQkJICAgaW5kZXguICovCisJCQlDT0xMQVRJT05fUlVMRSBjb2xsYXRpb25fcnVsZTsgLyogVGhlIGNvbGxhdGlvbiBydWxlCisJCQkJCQkgICBmb3IgdGhlIGluZGV4LiAqLworCQkJdTggYmxvY2tfc2l6ZV9iaXRzOyAJLyogTG9nMiBvZiB0aGUgYWJvdmUuICovCisJCQl1OCB2Y25fc2l6ZV9iaXRzOwkvKiBMb2cyIG9mIHRoZSBhYm92ZS4gKi8KKwkJfSBpbmRleDsKKwkJc3RydWN0IHsgLyogSXQgaXMgYSBjb21wcmVzc2VkIGZpbGUgb3IgYW4gYXR0cmlidXRlIGlub2RlLiAqLworCQkJczY0IHNpemU7CQkvKiBDb3B5IG9mIGNvbXByZXNzZWRfc2l6ZSBmcm9tCisJCQkJCQkgICAkREFUQS4gKi8KKwkJCXUzMiBibG9ja19zaXplOwkJLyogU2l6ZSBvZiBhIGNvbXByZXNzaW9uIGJsb2NrCisJCQkJCQkgICAoY2IpLiAqLworCQkJdTggYmxvY2tfc2l6ZV9iaXRzOwkvKiBMb2cyIG9mIHRoZSBzaXplIG9mIGEgY2IuICovCisJCQl1OCBibG9ja19jbHVzdGVyczsJLyogTnVtYmVyIG9mIGNsdXN0ZXJzIHBlciBjYi4gKi8KKwkJfSBjb21wcmVzc2VkOworCX0gaXR5cGU7CisJc3RydWN0IHNlbWFwaG9yZSBleHRlbnRfbG9jazsJLyogTG9jayBmb3IgYWNjZXNzaW5nL21vZGlmeWluZyB0aGUKKwkJCQkJICAgYmVsb3cgLiAqLworCXMzMiBucl9leHRlbnRzOwkvKiBGb3IgYSBiYXNlIG1mdCByZWNvcmQsIHRoZSBudW1iZXIgb2YgYXR0YWNoZWQgZXh0ZW50CisJCQkgICBpbm9kZXMgKDAgaWYgbm9uZSksIGZvciBleHRlbnQgcmVjb3JkcyBhbmQgZm9yIGZha2UKKwkJCSAgIGlub2RlcyBkZXNjcmliaW5nIGFuIGF0dHJpYnV0ZSB0aGlzIGlzIC0xLiAqLworCXVuaW9uIHsJCS8qIFRoaXMgdW5pb24gaXMgb25seSB1c2VkIGlmIG5yX2V4dGVudHMgIT0gMC4gKi8KKwkJbnRmc19pbm9kZSAqKmV4dGVudF9udGZzX2lub3M7CS8qIEZvciBucl9leHRlbnRzID4gMCwgYXJyYXkgb2YKKwkJCQkJCSAgIHRoZSBudGZzIGlub2RlcyBvZiB0aGUgZXh0ZW50CisJCQkJCQkgICBtZnQgcmVjb3JkcyBiZWxvbmdpbmcgdG8KKwkJCQkJCSAgIHRoaXMgYmFzZSBpbm9kZSB3aGljaCBoYXZlCisJCQkJCQkgICBiZWVuIGxvYWRlZC4gKi8KKwkJbnRmc19pbm9kZSAqYmFzZV9udGZzX2lubzsJLyogRm9yIG5yX2V4dGVudHMgPT0gLTEsIHRoZQorCQkJCQkJICAgbnRmcyBpbm9kZSBvZiB0aGUgYmFzZSBtZnQKKwkJCQkJCSAgIHJlY29yZC4gRm9yIGZha2UgaW5vZGVzLCB0aGUKKwkJCQkJCSAgIHJlYWwgKGJhc2UpIGlub2RlIHRvIHdoaWNoCisJCQkJCQkgICB0aGUgYXR0cmlidXRlIGJlbG9uZ3MuICovCisJfSBleHQ7Cit9OworCisvKgorICogRGVmaW5lZCBiaXRzIGZvciB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIG50ZnNfaW5vZGUgc3RydWN0dXJlLgorICogKGYpID0gZmlsZXMgb25seSwgKGQpID0gZGlyZWN0b3JpZXMgb25seSwgKGEpID0gYXR0cmlidXRlcy9mYWtlIGlub2RlcyBvbmx5CisgKi8KK3R5cGVkZWYgZW51bSB7CisJTklfRGlydHksCQkvKiAxOiBNZnQgcmVjb3JkIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4gKi8KKwlOSV9BdHRyTGlzdCwJCS8qIDE6IE1mdCByZWNvcmQgY29udGFpbnMgYW4gYXR0cmlidXRlIGxpc3QuICovCisJTklfQXR0ckxpc3ROb25SZXNpZGVudCwJLyogMTogQXR0cmlidXRlIGxpc3QgaXMgbm9uLXJlc2lkZW50LiBJbXBsaWVzCisJCQkJICAgICAgTklfQXR0ckxpc3QgaXMgc2V0LiAqLworCisJTklfQXR0ciwJCS8qIDE6IEZha2UgaW5vZGUgZm9yIGF0dHJpYnV0ZSBpL28uCisJCQkJICAgMDogUmVhbCBpbm9kZSBvciBleHRlbnQgaW5vZGUuICovCisKKwlOSV9Nc3RQcm90ZWN0ZWQsCS8qIDE6IEF0dHJpYnV0ZSBpcyBwcm90ZWN0ZWQgYnkgTVNUIGZpeHVwcy4KKwkJCQkgICAwOiBBdHRyaWJ1dGUgaXMgbm90IHByb3RlY3RlZCBieSBmaXh1cHMuICovCisJTklfTm9uUmVzaWRlbnQsCQkvKiAxOiBVbm5hbWVkIGRhdGEgYXR0ciBpcyBub24tcmVzaWRlbnQgKGYpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBub24tcmVzaWRlbnQgKGEpLiAqLworCU5JX0luZGV4QWxsb2NQcmVzZW50ID0gTklfTm9uUmVzaWRlbnQsCS8qIDE6ICRJMzAgaW5kZXggYWxsb2MgYXR0ciBpcworCQkJCQkJICAgcHJlc2VudCAoZCkuICovCisJTklfQ29tcHJlc3NlZCwJCS8qIDE6IFVubmFtZWQgZGF0YSBhdHRyIGlzIGNvbXByZXNzZWQgKGYpLgorCQkJCSAgIDE6IENyZWF0ZSBjb21wcmVzc2VkIGZpbGVzIGJ5IGRlZmF1bHQgKGQpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBjb21wcmVzc2VkIChhKS4gKi8KKwlOSV9FbmNyeXB0ZWQsCQkvKiAxOiBVbm5hbWVkIGRhdGEgYXR0ciBpcyBlbmNyeXB0ZWQgKGYpLgorCQkJCSAgIDE6IENyZWF0ZSBlbmNyeXB0ZWQgZmlsZXMgYnkgZGVmYXVsdCAoZCkuCisJCQkJICAgMTogQXR0cmlidXRlIGlzIGVuY3J5cHRlZCAoYSkuICovCisJTklfU3BhcnNlLAkJLyogMTogVW5uYW1lZCBkYXRhIGF0dHIgaXMgc3BhcnNlIChmKS4KKwkJCQkgICAxOiBDcmVhdGUgc3BhcnNlIGZpbGVzIGJ5IGRlZmF1bHQgKGQpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBzcGFyc2UgKGEpLiAqLworCU5JX1RydW5jYXRlRmFpbGVkLAkvKiAxOiBMYXN0IG50ZnNfdHJ1bmNhdGUoKSBjYWxsIGZhaWxlZC4gKi8KK30gbnRmc19pbm9kZV9zdGF0ZV9iaXRzOworCisvKgorICogTk9URTogV2Ugc2hvdWxkIGJlIGFkZGluZyBkaXJ0eSBtZnQgcmVjb3JkcyB0byBhIGxpc3Qgc29tZXdoZXJlIGFuZCB0aGV5CisgKiBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2YgdGhlIChudGZzL3ZmcykgaW5vZGUgc3RydWN0dXJlIHNvIHRoYXQgYW4gaW5vZGUgY2FuCisgKiBiZSByZW1vdmVkIGJ1dCB0aGUgcmVjb3JkIGNhbiBiZSBsZWZ0IGRpcnR5IGZvciBzeW5jaW5nIGxhdGVyLgorICovCisKKy8qCisgKiBNYWNybyB0cmlja3MgdG8gZXhwYW5kIHRoZSBOSW5vRm9vKCksIE5Jbm9TZXRGb28oKSwgYW5kIE5Jbm9DbGVhckZvbygpCisgKiBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgTklOT19GTlMoZmxhZykJCQkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IE5Jbm8jI2ZsYWcobnRmc19pbm9kZSAqbmkpCQlcCit7CQkJCQkJCVwKKwlyZXR1cm4gdGVzdF9iaXQoTklfIyNmbGFnLCAmKG5pKS0+c3RhdGUpOwlcCit9CQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBOSW5vU2V0IyNmbGFnKG50ZnNfaW5vZGUgKm5pKQlcCit7CQkJCQkJCVwKKwlzZXRfYml0KE5JXyMjZmxhZywgJihuaSktPnN0YXRlKTsJCVwKK30JCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIE5Jbm9DbGVhciMjZmxhZyhudGZzX2lub2RlICpuaSkJXAorewkJCQkJCQlcCisJY2xlYXJfYml0KE5JXyMjZmxhZywgJihuaSktPnN0YXRlKTsJCVwKK30KKworLyoKKyAqIEFzIGFib3ZlIGZvciBOSW5vVGVzdFNldEZvbygpIGFuZCBOSW5vVGVzdENsZWFyRm9vKCkuCisgKi8KKyNkZWZpbmUgVEFTX05JTk9fRk5TKGZsYWcpCQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBOSW5vVGVzdFNldCMjZmxhZyhudGZzX2lub2RlICpuaSkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdChOSV8jI2ZsYWcsICYobmkpLT5zdGF0ZSk7CVwKK30JCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IE5Jbm9UZXN0Q2xlYXIjI2ZsYWcobnRmc19pbm9kZSAqbmkpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChOSV8jI2ZsYWcsICYobmkpLT5zdGF0ZSk7CVwKK30KKworLyogRW1pdCB0aGUgbnRmcyBpbm9kZSBiaXRvcHMgZnVuY3Rpb25zLiAqLworTklOT19GTlMoRGlydHkpCitUQVNfTklOT19GTlMoRGlydHkpCitOSU5PX0ZOUyhBdHRyTGlzdCkKK05JTk9fRk5TKEF0dHJMaXN0Tm9uUmVzaWRlbnQpCitOSU5PX0ZOUyhBdHRyKQorTklOT19GTlMoTXN0UHJvdGVjdGVkKQorTklOT19GTlMoTm9uUmVzaWRlbnQpCitOSU5PX0ZOUyhJbmRleEFsbG9jUHJlc2VudCkKK05JTk9fRk5TKENvbXByZXNzZWQpCitOSU5PX0ZOUyhFbmNyeXB0ZWQpCitOSU5PX0ZOUyhTcGFyc2UpCitOSU5PX0ZOUyhUcnVuY2F0ZUZhaWxlZCkKKworLyoKKyAqIFRoZSBmdWxsIHN0cnVjdHVyZSBjb250YWluaW5nIGEgbnRmc19pbm9kZSBhbmQgYSB2ZnMgc3RydWN0IGlub2RlLiBVc2VkIGZvcgorICogYWxsIHJlYWwgYW5kIGZha2UgaW5vZGVzIGJ1dCBub3QgZm9yIGV4dGVudCBpbm9kZXMgd2hpY2ggbGFjayB0aGUgdmZzIHN0cnVjdAorICogaW5vZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwludGZzX2lub2RlIG50ZnNfaW5vZGU7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsJCS8qIFRoZSB2ZnMgaW5vZGUgc3RydWN0dXJlLiAqLworfSBiaWdfbnRmc19pbm9kZTsKKworLyoqCisgKiBOVEZTX0kgLSByZXR1cm4gdGhlIG50ZnMgaW5vZGUgZ2l2ZW4gYSB2ZnMgaW5vZGUKKyAqIEBpbm9kZToJVkZTIGlub2RlCisgKgorICogTlRGU19JKCkgcmV0dXJucyB0aGUgbnRmcyBpbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZGUyBAaW5vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgbnRmc19pbm9kZSAqTlRGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChudGZzX2lub2RlICopbGlzdF9lbnRyeShpbm9kZSwgYmlnX250ZnNfaW5vZGUsIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpWRlNfSShudGZzX2lub2RlICpuaSkKK3sKKwlyZXR1cm4gJigoYmlnX250ZnNfaW5vZGUgKiluaSktPnZmc19pbm9kZTsKK30KKworLyoqCisgKiBudGZzX2F0dHIgLSBudGZzIGluIG1lbW9yeSBhdHRyaWJ1dGUgc3RydWN0dXJlCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciBvZiB0aGUgYmFzZSBtZnQgcmVjb3JkIG9mIHRoaXMgYXR0cmlidXRlCisgKiBAbmFtZToJVW5pY29kZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKE5VTEwgaWYgdW5uYW1lZCkKKyAqIEBuYW1lX2xlbjoJbGVuZ3RoIG9mIEBuYW1lIGluIFVuaWNvZGUgY2hhcmFjdGVycyAoMCBpZiB1bm5hbWVkKQorICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIChzZWUgbGF5b3V0LmgpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgdG8gcHJvdmlkZSBhIHNtYWxsIHN0cnVjdHVyZSBmb3IgdGhlCisgKiBudGZzX3thdHRyX31pZ2V0KCkvbnRmc190ZXN0X2lub2RlKCkvbnRmc19pbml0X2xvY2tlZF9pbm9kZSgpIG1lY2hhbmlzbS4KKyAqCisgKiBOT1RFOiBFbGVtZW50cyBhcmUgb3JkZXJlZCBieSBzaXplIHRvIG1ha2UgdGhlIHN0cnVjdHVyZSBhcyBjb21wYWN0IGFzCisgKiBwb3NzaWJsZSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbWZ0X25vOworCW50ZnNjaGFyICpuYW1lOworCXUzMiBuYW1lX2xlbjsKKwlBVFRSX1RZUEUgdHlwZTsKK30gbnRmc19hdHRyOworCit0eXBlZGVmIGludCAoKnRlc3RfdCkoc3RydWN0IGlub2RlICosIHZvaWQgKik7CisKK2V4dGVybiBpbnQgbnRmc190ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIG50ZnNfYXR0ciAqbmEpOworCitleHRlcm4gc3RydWN0IGlub2RlICpudGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBtZnRfbm8pOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbnRmc19hdHRyX2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBBVFRSX1RZUEUgdHlwZSwKKwkJbnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbik7CitleHRlcm4gc3RydWN0IGlub2RlICpudGZzX2luZGV4X2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBudGZzY2hhciAqbmFtZSwKKwkJdTMyIG5hbWVfbGVuKTsKKworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbnRmc19hbGxvY19iaWdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBudGZzX2Rlc3Ryb3lfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgbnRmc19jbGVhcl9iaWdfaW5vZGUoc3RydWN0IGlub2RlICp2aSk7CisKK2V4dGVybiB2b2lkIF9fbnRmc19pbml0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIG50ZnNfaW5vZGUgKm5pKTsKKworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfaW5pdF9iaWdfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwludGZzX2lub2RlICpuaSA9IE5URlNfSSh2aSk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlfX250ZnNfaW5pdF9pbm9kZSh2aS0+aV9zYiwgbmkpOworCW5pLT5tZnRfbm8gPSB2aS0+aV9pbm87Cit9CisKK2V4dGVybiBudGZzX2lub2RlICpudGZzX25ld19leHRlbnRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgbG9uZyBtZnRfbm8pOworZXh0ZXJuIHZvaWQgbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobnRmc19pbm9kZSAqbmkpOworCitleHRlcm4gaW50IG50ZnNfcmVhZF9pbm9kZV9tb3VudChzdHJ1Y3QgaW5vZGUgKnZpKTsKKworZXh0ZXJuIHZvaWQgbnRmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICp2aSk7CisKK2V4dGVybiBpbnQgbnRmc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IHZmc21vdW50ICptbnQpOworCisjaWZkZWYgTlRGU19SVworCitleHRlcm4gaW50IG50ZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICp2aSk7CitleHRlcm4gdm9pZCBudGZzX3RydW5jYXRlX3ZmcyhzdHJ1Y3QgaW5vZGUgKnZpKTsKKworZXh0ZXJuIGludCBudGZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOworCitleHRlcm4gaW50IG50ZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICp2aSwgaW50IHN5bmMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwlpZiAoIWlzX2JhZF9pbm9kZSh2aSkpCisJCW50ZnNfd3JpdGVfaW5vZGUodmksIDEpOworCXJldHVybjsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0lOT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGF5b3V0LmggYi9mcy9udGZzL2xheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjMzODkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2xheW91dC5oCkBAIC0wLDAgKzEsMjQxMyBAQAorLyoKKyAqIGxheW91dC5oIC0gQWxsIE5URlMgYXNzb2NpYXRlZCBvbi1kaXNrIHN0cnVjdHVyZXMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICAgIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0xBWU9VVF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0xBWU9VVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKgorICogQ29uc3RhbnQgZW5kaWFubmVzcyBjb252ZXJzaW9uIGRlZmluZXMuCisgKi8KKyNkZWZpbmUgY29uc3RfbGUxNl90b19jcHUoeCkJX19jb25zdGFudF9sZTE2X3RvX2NwdSh4KQorI2RlZmluZSBjb25zdF9sZTMyX3RvX2NwdSh4KQlfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGNvbnN0X2xlNjRfdG9fY3B1KHgpCV9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkKKworI2RlZmluZSBjb25zdF9jcHVfdG9fbGUxNih4KQlfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpCisjZGVmaW5lIGNvbnN0X2NwdV90b19sZTMyKHgpCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgY29uc3RfY3B1X3RvX2xlNjQoeCkJX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KQorCisvKiBUaGUgTlRGUyBvZW1faWQgIk5URlMgICAgIiAqLworI2RlZmluZSBtYWdpY05URlMJY29uc3RfY3B1X3RvX2xlNjQoMHgyMDIwMjAyMDUzNDY1NDRlVUxMKQorCisvKgorICogTG9jYXRpb24gb2YgYm9vdHNlY3RvciBvbiBwYXJ0aXRpb246CisgKglUaGUgc3RhbmRhcmQgTlRGU19CT09UX1NFQ1RPUiBpcyBvbiBzZWN0b3IgMCBvZiB0aGUgcGFydGl0aW9uLgorICoJT24gTlQ0IGFuZCBhYm92ZSB0aGVyZSBpcyBvbmUgYmFja3VwIGNvcHkgb2YgdGhlIGJvb3Qgc2VjdG9yIHRvCisgKgliZSBmb3VuZCBvbiB0aGUgbGFzdCBzZWN0b3Igb2YgdGhlIHBhcnRpdGlvbiAobm90IG5vcm1hbGx5IGFjY2Vzc2libGUKKyAqCWZyb20gd2l0aGluIFdpbmRvd3MgYXMgdGhlIGJvb3RzZWN0b3IgY29udGFpbmVkIG51bWJlciBvZiBzZWN0b3JzCisgKgl2YWx1ZSBpcyBvbmUgbGVzcyB0aGFuIHRoZSBhY3R1YWwgdmFsdWUhKS4KKyAqCU9uIHZlcnNpb25zIG9mIE5UIDMuNTEgYW5kIGVhcmxpZXIsIHRoZSBiYWNrdXAgY29weSB3YXMgbG9jYXRlZCBhdAorICoJbnVtYmVyIG9mIHNlY3RvcnMvMiAoaW50ZWdlciBkaXZpZGUpLCBpLmUuIGluIHRoZSBtaWRkbGUgb2YgdGhlIHZvbHVtZS4KKyAqLworCisvKgorICogQklPUyBwYXJhbWV0ZXIgYmxvY2sgKGJwYikgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUxNiBieXRlc19wZXJfc2VjdG9yOwkJLyogU2l6ZSBvZiBhIHNlY3RvciBpbiBieXRlcy4gKi8KKwl1OCAgc2VjdG9yc19wZXJfY2x1c3RlcjsJLyogU2l6ZSBvZiBhIGNsdXN0ZXIgaW4gc2VjdG9ycy4gKi8KKwlsZTE2IHJlc2VydmVkX3NlY3RvcnM7CQkvKiB6ZXJvICovCisJdTggIGZhdHM7CQkJLyogemVybyAqLworCWxlMTYgcm9vdF9lbnRyaWVzOwkJLyogemVybyAqLworCWxlMTYgc2VjdG9yczsJCQkvKiB6ZXJvICovCisJdTggIG1lZGlhX3R5cGU7CQkJLyogMHhmOCA9IGhhcmQgZGlzayAqLworCWxlMTYgc2VjdG9yc19wZXJfZmF0OwkJLyogemVybyAqLworCWxlMTYgc2VjdG9yc19wZXJfdHJhY2s7CQkvKiBpcnJlbGV2YW50ICovCisJbGUxNiBoZWFkczsJCQkvKiBpcnJlbGV2YW50ICovCisJbGUzMiBoaWRkZW5fc2VjdG9yczsJCS8qIHplcm8gKi8KKwlsZTMyIGxhcmdlX3NlY3RvcnM7CQkvKiB6ZXJvICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQklPU19QQVJBTUVURVJfQkxPQ0s7CisKKy8qCisgKiBOVEZTIGJvb3Qgc2VjdG9yIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4ICBqdW1wWzNdOwkJCS8qIElycmVsZXZhbnQgKGp1bXAgdG8gYm9vdCB1cCBjb2RlKS4qLworCWxlNjQgb2VtX2lkOwkJCS8qIE1hZ2ljICJOVEZTICAgICIuICovCisJQklPU19QQVJBTUVURVJfQkxPQ0sgYnBiOwkvKiBTZWUgQklPU19QQVJBTUVURVJfQkxPQ0suICovCisJdTggIHVudXNlZFs0XTsJCQkvKiB6ZXJvLCBOVEZTIGRpc2tlZGl0LmV4ZSBzdGF0ZXMgdGhhdAorCQkJCQkgICB0aGlzIGlzIGFjdHVhbGx5OgorCQkJCQkJX191OCBwaHlzaWNhbF9kcml2ZTsJLy8gMHg4MAorCQkJCQkJX191OCBjdXJyZW50X2hlYWQ7CS8vIHplcm8KKwkJCQkJCV9fdTggZXh0ZW5kZWRfYm9vdF9zaWduYXR1cmU7CisJCQkJCQkJCQkvLyAweDgwCisJCQkJCQlfX3U4IHVudXNlZDsJCS8vIHplcm8KKwkJCQkJICovCisvKjB4MjgqL3NsZTY0IG51bWJlcl9vZl9zZWN0b3JzOwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyBpbiB2b2x1bWUuIEdpdmVzCisJCQkJCSAgIG1heGltdW0gdm9sdW1lIHNpemUgb2YgMl42MyBzZWN0b3JzLgorCQkJCQkgICBBc3N1bWluZyBzdGFuZGFyZCBzZWN0b3Igc2l6ZSBvZiA1MTIKKwkJCQkJICAgYnl0ZXMsIHRoZSBtYXhpbXVtIGJ5dGUgc2l6ZSBpcworCQkJCQkgICBhcHByb3guIDQuN3gxMF4yMSBieXRlcy4gKC07ICovCisJc2xlNjQgbWZ0X2xjbjsJCQkvKiBDbHVzdGVyIGxvY2F0aW9uIG9mIG1mdCBkYXRhLiAqLworCXNsZTY0IG1mdG1pcnJfbGNuOwkJLyogQ2x1c3RlciBsb2NhdGlvbiBvZiBjb3B5IG9mIG1mdC4gKi8KKwlzOCAgY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQ7CS8qIE1mdCByZWNvcmQgc2l6ZSBpbiBjbHVzdGVycy4gKi8KKwl1OCAgcmVzZXJ2ZWQwWzNdOwkJLyogemVybyAqLworCXM4ICBjbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkOwkvKiBJbmRleCBibG9jayBzaXplIGluIGNsdXN0ZXJzLiAqLworCXU4ICByZXNlcnZlZDFbM107CQkvKiB6ZXJvICovCisJbGU2NCB2b2x1bWVfc2VyaWFsX251bWJlcjsJLyogSXJyZWxldmFudCAoc2VyaWFsIG51bWJlcikuICovCisJbGUzMiBjaGVja3N1bTsJCQkvKiBCb290IHNlY3RvciBjaGVja3N1bS4gKi8KKy8qMHg1NCovdTggIGJvb3RzdHJhcFs0MjZdOwkJLyogSXJyZWxldmFudCAoYm9vdCB1cCBjb2RlKS4gKi8KKwlsZTE2IGVuZF9vZl9zZWN0b3JfbWFya2VyOwkvKiBFbmQgb2YgYm9vdHNlY3RvciBtYWdpYy4gQWx3YXlzIGlzCisJCQkJCSAgIDB4YWE1NSBpbiBsaXR0bGUgZW5kaWFuLiAqLworLyogc2l6ZW9mKCkgPSA1MTIgKDB4MjAwKSBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE5URlNfQk9PVF9TRUNUT1I7CisKKy8qCisgKiBNYWdpYyBpZGVudGlmaWVycyBwcmVzZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIG50ZnMgcmVjb3JkIGNvbnRhaW5pbmcKKyAqIHJlY29yZHMgKGxpa2UgbWZ0IHJlY29yZHMgZm9yIGV4YW1wbGUpLgorICovCitlbnVtIHsKKwkvKiBGb3VuZCBpbiAkTUZULyREQVRBLiAqLworCW1hZ2ljX0ZJTEUgPSBjb25zdF9jcHVfdG9fbGUzMigweDQ1NGM0OTQ2KSwgLyogTWZ0IGVudHJ5LiAqLworCW1hZ2ljX0lORFggPSBjb25zdF9jcHVfdG9fbGUzMigweDU4NDQ0ZTQ5KSwgLyogSW5kZXggYnVmZmVyLiAqLworCW1hZ2ljX0hPTEUgPSBjb25zdF9jcHVfdG9fbGUzMigweDQ1NGM0ZjQ4KSwgLyogPyAoTlRGUyAzLjArPykgKi8KKworCS8qIEZvdW5kIGluICRMb2dGaWxlLyREQVRBLiAqLworCW1hZ2ljX1JTVFIgPSBjb25zdF9jcHVfdG9fbGUzMigweDUyNTQ1MzUyKSwgLyogUmVzdGFydCBwYWdlLiAqLworCW1hZ2ljX1JDUkQgPSBjb25zdF9jcHVfdG9fbGUzMigweDQ0NTI0MzUyKSwgLyogTG9nIHJlY29yZCBwYWdlLiAqLworCisJLyogRm91bmQgaW4gJExvZ0ZpbGUvJERBVEEuICAoTWF5IGJlIGZvdW5kIGluICRNRlQvJERBVEEsIGFsc28/KSAqLworCW1hZ2ljX0NIS0QgPSBjb25zdF9jcHVfdG9fbGUzMigweDQyNGI0ODQzKSwgLyogTW9kaWZpZWQgYnkgY2hrZHNrLiAqLworCisJLyogRm91bmQgaW4gYWxsIG50ZnMgcmVjb3JkIGNvbnRhaW5pbmcgcmVjb3Jkcy4gKi8KKwltYWdpY19CQUFEID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0NDQxNDE0MiksIC8qIEZhaWxlZCBtdWx0aSBzZWN0b3IKKwkJCQkJCSAgICAgICB0cmFuc2ZlciB3YXMgZGV0ZWN0ZWQuICovCisJLyoKKwkgKiBGb3VuZCBpbiAkTG9nRmlsZS8kREFUQSB3aGVuIGEgcGFnZSBpcyBmdWxsIG9mIDB4ZmYgYnl0ZXMgYW5kIGlzCisJICogdGh1cyBub3QgaW5pdGlhbGl6ZWQuICBQYWdlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzaW5nIGl0LgorCSAqLworCW1hZ2ljX2VtcHR5ID0gY29uc3RfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikgLyogUmVjb3JkIGlzIGVtcHR5LiAqLworfTsKKwordHlwZWRlZiBsZTMyIE5URlNfUkVDT1JEX1RZUEU7CisKKy8qCisgKiBHZW5lcmljIG1hZ2ljIGNvbXBhcmlzb24gbWFjcm9zLiBGaW5hbGx5IGZvdW5kIGEgdXNlIGZvciB0aGUgIyMgcHJlcHJvY2Vzc29yCisgKiBvcGVyYXRvciEgKC04CisgKi8KKworc3RhdGljIGlubGluZSBCT09MIF9fbnRmc19pc19tYWdpYyhsZTMyIHgsIE5URlNfUkVDT1JEX1RZUEUgcikKK3sKKwlyZXR1cm4gKHggPT0gcik7Cit9CisjZGVmaW5lIG50ZnNfaXNfbWFnaWMoeCwgbSkJX19udGZzX2lzX21hZ2ljKHgsIG1hZ2ljXyMjbSkKKworc3RhdGljIGlubGluZSBCT09MIF9fbnRmc19pc19tYWdpY3AobGUzMiAqcCwgTlRGU19SRUNPUkRfVFlQRSByKQoreworCXJldHVybiAoKnAgPT0gcik7Cit9CisjZGVmaW5lIG50ZnNfaXNfbWFnaWNwKHAsIG0pCV9fbnRmc19pc19tYWdpY3AocCwgbWFnaWNfIyNtKQorCisvKgorICogU3BlY2lhbGlzZWQgbWFnaWMgY29tcGFyaXNvbiBtYWNyb3MgZm9yIHRoZSBOVEZTX1JFQ09SRF9UWVBFcyBkZWZpbmVkIGFib3ZlLgorICovCisjZGVmaW5lIG50ZnNfaXNfZmlsZV9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgRklMRSkgKQorI2RlZmluZSBudGZzX2lzX2ZpbGVfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBGSUxFKSApCisjZGVmaW5lIG50ZnNfaXNfbWZ0X3JlY29yZCh4KQkJKCBudGZzX2lzX2ZpbGVfcmVjb3JkICh4KSApCisjZGVmaW5lIG50ZnNfaXNfbWZ0X3JlY29yZHAocCkJCSggbnRmc19pc19maWxlX3JlY29yZHAocCkgKQorI2RlZmluZSBudGZzX2lzX2luZHhfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIElORFgpICkKKyNkZWZpbmUgbnRmc19pc19pbmR4X3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgSU5EWCkgKQorI2RlZmluZSBudGZzX2lzX2hvbGVfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIEhPTEUpICkKKyNkZWZpbmUgbnRmc19pc19ob2xlX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgSE9MRSkgKQorCisjZGVmaW5lIG50ZnNfaXNfcnN0cl9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgUlNUUikgKQorI2RlZmluZSBudGZzX2lzX3JzdHJfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBSU1RSKSApCisjZGVmaW5lIG50ZnNfaXNfcmNyZF9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgUkNSRCkgKQorI2RlZmluZSBudGZzX2lzX3JjcmRfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBSQ1JEKSApCisKKyNkZWZpbmUgbnRmc19pc19jaGtkX3JlY29yZCh4KQkJKCBudGZzX2lzX21hZ2ljICh4LCBDSEtEKSApCisjZGVmaW5lIG50ZnNfaXNfY2hrZF9yZWNvcmRwKHApCQkoIG50ZnNfaXNfbWFnaWNwKHAsIENIS0QpICkKKworI2RlZmluZSBudGZzX2lzX2JhYWRfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIEJBQUQpICkKKyNkZWZpbmUgbnRmc19pc19iYWFkX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgQkFBRCkgKQorCisjZGVmaW5lIG50ZnNfaXNfZW1wdHlfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIGVtcHR5KSApCisjZGVmaW5lIG50ZnNfaXNfZW1wdHlfcmVjb3JkcChwKQkoIG50ZnNfaXNfbWFnaWNwKHAsIGVtcHR5KSApCisKKy8qCisgKiBUaGUgVXBkYXRlIFNlcXVlbmNlIEFycmF5ICh1c2EpIGlzIGFuIGFycmF5IG9mIHRoZSBsZTE2IHZhbHVlcyB3aGljaCBiZWxvbmcKKyAqIHRvIHRoZSBlbmQgb2YgZWFjaCBzZWN0b3IgcHJvdGVjdGVkIGJ5IHRoZSB1cGRhdGUgc2VxdWVuY2UgcmVjb3JkIGluIHdoaWNoCisgKiB0aGlzIGFycmF5IGlzIGNvbnRhaW5lZC4gTm90ZSB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgVXBkYXRlIFNlcXVlbmNlCisgKiBOdW1iZXIgKHVzbiksIGEgY3ljbGljIGNvdW50ZXIgb2YgaG93IG1hbnkgdGltZXMgdGhlIHByb3RlY3RlZCByZWNvcmQgaGFzCisgKiBiZWVuIHdyaXR0ZW4gdG8gZGlzay4gVGhlIHZhbHVlcyAwIGFuZCAtMSAoaWUuIDB4ZmZmZikgYXJlIG5vdCB1c2VkLiBBbGwKKyAqIGxhc3QgbGUxNidzIG9mIGVhY2ggc2VjdG9yIGhhdmUgdG8gYmUgZXF1YWwgdG8gdGhlIHVzbiAoZHVyaW5nIHJlYWRpbmcpIG9yCisgKiBhcmUgc2V0IHRvIGl0IChkdXJpbmcgd3JpdGluZykuIElmIHRoZXkgYXJlIG5vdCwgYW4gaW5jb21wbGV0ZSBtdWx0aSBzZWN0b3IKKyAqIHRyYW5zZmVyIGhhcyBvY2N1cnJlZCB3aGVuIHRoZSBkYXRhIHdhcyB3cml0dGVuLgorICogVGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSBpcyBmaXhlZCB0bzoKKyAqCW1heGltdW0gc2l6ZSA9IHVzYV9vZnMgKyAodXNhX2NvdW50ICogMikgPSA1MTAgYnl0ZXMKKyAqIFRoZSA1MTAgYnl0ZXMgY29tZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBsYXN0IGxlMTYgaW4gdGhlIGFycmF5IGhhcyB0bworICogKG9idmlvdXNseSkgZmluaXNoIGJlZm9yZSB0aGUgbGFzdCBsZTE2IG9mIHRoZSBmaXJzdCA1MTItYnl0ZSBzZWN0b3IuCisgKiBUaGlzIGZvcm11bGEgY2FuIGJlIHVzZWQgYXMgYSBjb25zaXN0ZW5jeSBjaGVjayBpbiB0aGF0IHVzYV9vZnMgKworICogKHVzYV9jb3VudCAqIDIpIGhhcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNTEwLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJTlRGU19SRUNPUkRfVFlQRSBtYWdpYzsJLyogQSBmb3VyLWJ5dGUgbWFnaWMgaWRlbnRpZnlpbmcgdGhlIHJlY29yZAorCQkJCSAgIHR5cGUgYW5kL29yIHN0YXR1cy4gKi8KKwlsZTE2IHVzYV9vZnM7CQkvKiBPZmZzZXQgdG8gdGhlIFVwZGF0ZSBTZXF1ZW5jZSBBcnJheSAodXNhKQorCQkJCSAgIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBudGZzIHJlY29yZC4gKi8KKwlsZTE2IHVzYV9jb3VudDsJCS8qIE51bWJlciBvZiBsZTE2IHNpemVkIGVudHJpZXMgaW4gdGhlIHVzYQorCQkJCSAgIGluY2x1ZGluZyB0aGUgVXBkYXRlIFNlcXVlbmNlIE51bWJlciAodXNuKSwKKwkJCQkgICB0aHVzIHRoZSBudW1iZXIgb2YgZml4dXBzIGlzIHRoZSB1c2FfY291bnQKKwkJCQkgICBtaW51cyAxLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE5URlNfUkVDT1JEOworCisvKgorICogU3lzdGVtIGZpbGVzIG1mdCByZWNvcmQgbnVtYmVycy4gQWxsIHRoZXNlIGZpbGVzIGFyZSBhbHdheXMgbWFya2VkIGFzIHVzZWQKKyAqIGluIHRoZSBiaXRtYXAgYXR0cmlidXRlIG9mIHRoZSBtZnQ7IHByZXN1bWFibHkgaW4gb3JkZXIgdG8gYXZvaWQgYWNjaWRlbnRhbAorICogYWxsb2NhdGlvbiBmb3IgcmFuZG9tIG90aGVyIG1mdCByZWNvcmRzLiBBbHNvLCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBlYWNoCisgKiBvZiB0aGUgc3lzdGVtIGZpbGVzIGlzIGFsd2F5cyBlcXVhbCB0byB0aGVpciBtZnQgcmVjb3JkIG51bWJlciBhbmQgaXQgaXMKKyAqIG5ldmVyIG1vZGlmaWVkLgorICovCit0eXBlZGVmIGVudW0geworCUZJTEVfTUZUICAgICAgID0gMCwJLyogTWFzdGVyIGZpbGUgdGFibGUgKG1mdCkuIERhdGEgYXR0cmlidXRlCisJCQkJICAgY29udGFpbnMgdGhlIGVudHJpZXMgYW5kIGJpdG1hcCBhdHRyaWJ1dGUKKwkJCQkgICByZWNvcmRzIHdoaWNoIG9uZXMgYXJlIGluIHVzZSAoYml0PT0xKS4gKi8KKwlGSUxFX01GVE1pcnIgICA9IDEsCS8qIE1mdCBtaXJyb3I6IGNvcHkgb2YgZmlyc3QgZm91ciBtZnQgcmVjb3JkcworCQkJCSAgIGluIGRhdGEgYXR0cmlidXRlLiBJZiBjbHVzdGVyIHNpemUgPiA0a2lCLAorCQkJCSAgIGNvcHkgb2YgZmlyc3QgTiBtZnQgcmVjb3Jkcywgd2l0aAorCQkJCQlOID0gY2x1c3Rlcl9zaXplIC8gbWZ0X3JlY29yZF9zaXplLiAqLworCUZJTEVfTG9nRmlsZSAgID0gMiwJLyogSm91cm5hbGxpbmcgbG9nIGluIGRhdGEgYXR0cmlidXRlLiAqLworCUZJTEVfVm9sdW1lICAgID0gMywJLyogVm9sdW1lIG5hbWUgYXR0cmlidXRlIGFuZCB2b2x1bWUgaW5mb3JtYXRpb24KKwkJCQkgICBhdHRyaWJ1dGUgKGZsYWdzIGFuZCBudGZzIHZlcnNpb24pLiBXaW5kb3dzCisJCQkJICAgcmVmZXJzIHRvIHRoaXMgZmlsZSBhcyB2b2x1bWUgREFTRCAoRGlyZWN0CisJCQkJICAgQWNjZXNzIFN0b3JhZ2UgRGV2aWNlKS4gKi8KKwlGSUxFX0F0dHJEZWYgICA9IDQsCS8qIEFycmF5IG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbiBkYXRhCisJCQkJICAgYXR0cmlidXRlLiAqLworCUZJTEVfcm9vdCAgICAgID0gNSwJLyogUm9vdCBkaXJlY3RvcnkuICovCisJRklMRV9CaXRtYXAgICAgPSA2LAkvKiBBbGxvY2F0aW9uIGJpdG1hcCBvZiBhbGwgY2x1c3RlcnMgKGxjbnMpIGluCisJCQkJICAgZGF0YSBhdHRyaWJ1dGUuICovCisJRklMRV9Cb290ICAgICAgPSA3LAkvKiBCb290IHNlY3RvciAoYWx3YXlzIGF0IGNsdXN0ZXIgMCkgaW4gZGF0YQorCQkJCSAgIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX0JhZENsdXMgICA9IDgsCS8qIENvbnRhaW5zIGFsbCBiYWQgY2x1c3RlcnMgaW4gdGhlIG5vbi1yZXNpZGVudAorCQkJCSAgIGRhdGEgYXR0cmlidXRlLiAqLworCUZJTEVfU2VjdXJlICAgID0gOSwJLyogU2hhcmVkIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGluIGRhdGEgYXR0cmlidXRlCisJCQkJICAgYW5kIHR3byBpbmRleGVzIGludG8gdGhlIGRlc2NyaXB0b3JzLgorCQkJCSAgIEFwcGVhcmVkIGluIFdpbmRvd3MgMjAwMC4gQmVmb3JlIHRoYXQsIHRoaXMKKwkJCQkgICBmaWxlIHdhcyBuYW1lZCAkUXVvdGEgYnV0IHdhcyB1bnVzZWQuICovCisJRklMRV9VcENhc2UgICAgPSAxMCwJLyogVXBwZXJjYXNlIGVxdWl2YWxlbnRzIG9mIGFsbCA2NTUzNiBVbmljb2RlCisJCQkJICAgY2hhcmFjdGVycyBpbiBkYXRhIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX0V4dGVuZCAgICA9IDExLAkvKiBEaXJlY3RvcnkgY29udGFpbmluZyBvdGhlciBzeXN0ZW0gZmlsZXMgKGVnLgorCQkJCSAgICRPYmpJZCwgJFF1b3RhLCAkUmVwYXJzZSBhbmQgJFVzbkpybmwpLiBUaGlzCisJCQkJICAgaXMgbmV3IHRvIE5URlMzLjAuICovCisJRklMRV9yZXNlcnZlZDEyID0gMTIsCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIChyZWNvcmRzIDEyLTE1KS4gKi8KKwlGSUxFX3Jlc2VydmVkMTMgPSAxMywKKwlGSUxFX3Jlc2VydmVkMTQgPSAxNCwKKwlGSUxFX3Jlc2VydmVkMTUgPSAxNSwKKwlGSUxFX2ZpcnN0X3VzZXIgPSAxNiwJLyogRmlyc3QgdXNlciBmaWxlLCB1c2VkIGFzIHRlc3QgbGltaXQgZm9yCisJCQkJICAgd2hldGhlciB0byBhbGxvdyBvcGVuaW5nIGEgZmlsZSBvciBub3QuICovCit9IE5URlNfU1lTVEVNX0ZJTEVTOworCisvKgorICogVGhlc2UgYXJlIHRoZSBzbyBmYXIga25vd24gTUZUX1JFQ09SRF8qIGZsYWdzICgxNi1iaXQpIHdoaWNoIGNvbnRhaW4KKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZnQgcmVjb3JkIGluIHdoaWNoIHRoZXkgYXJlIHByZXNlbnQuCisgKi8KK2VudW0geworCU1GVF9SRUNPUkRfSU5fVVNFCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAxKSwKKwlNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWSA9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMiksCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBNRlRfUkVDT1JEX0ZMQUdTOworCisvKgorICogbWZ0IHJlZmVyZW5jZXMgKGFrYSBmaWxlIHJlZmVyZW5jZXMgb3IgZmlsZSByZWNvcmQgc2VnbWVudCByZWZlcmVuY2VzKSBhcmUKKyAqIHVzZWQgd2hlbmV2ZXIgYSBzdHJ1Y3R1cmUgbmVlZHMgdG8gcmVmZXIgdG8gYSByZWNvcmQgaW4gdGhlIG1mdC4KKyAqCisgKiBBIHJlZmVyZW5jZSBjb25zaXN0cyBvZiBhIDQ4LWJpdCBpbmRleCBpbnRvIHRoZSBtZnQgYW5kIGEgMTYtYml0IHNlcXVlbmNlCisgKiBudW1iZXIgdXNlZCB0byBkZXRlY3Qgc3RhbGUgcmVmZXJlbmNlcy4KKyAqCisgKiBGb3IgZXJyb3IgcmVwb3J0aW5nIHB1cnBvc2VzIHdlIHRyZWF0IHRoZSA0OC1iaXQgaW5kZXggYXMgYSBzaWduZWQgcXVhbnRpdHkuCisgKgorICogVGhlIHNlcXVlbmNlIG51bWJlciBpcyBhIGNpcmN1bGFyIGNvdW50ZXIgKHNraXBwaW5nIDApIGRlc2NyaWJpbmcgaG93IG1hbnkKKyAqIHRpbWVzIHRoZSByZWZlcmVuY2VkIG1mdCByZWNvcmQgaGFzIGJlZW4gKHJlKXVzZWQuIFRoaXMgaGFzIHRvIG1hdGNoIHRoZQorICogc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZnQgcmVjb3JkIGJlaW5nIHJlZmVyZW5jZWQsIG90aGVyd2lzZSB0aGUgcmVmZXJlbmNlCisgKiBpcyBjb25zaWRlcmVkIHN0YWxlIGFuZCByZW1vdmVkIChGSVhNRTogb25seSBudGZzY2sgb3IgdGhlIGRyaXZlciBpdHNlbGY/KS4KKyAqCisgKiBJZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGlzIHplcm8gaXQgaXMgYXNzdW1lZCB0aGF0IG5vIHNlcXVlbmNlIG51bWJlcgorICogY29uc2lzdGVuY3kgY2hlY2tpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAqCisgKiBGSVhNRTogU2luY2UgaW5vZGVzIGFyZSAzMi1iaXQgYXMgb2Ygbm93LCB0aGUgZHJpdmVyIG5lZWRzIHRvIGFsd2F5cyBjaGVjaworICogZm9yIGhpZ2hfcGFydCBiZWluZyAwIGFuZCBpZiBub3QgZWl0aGVyIEJVRygpLCBjYXVzZSBhIHBhbmljKCkgb3IgaGFuZGxlCisgKiB0aGUgc2l0dWF0aW9uIGluIHNvbWUgb3RoZXIgd2F5LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gYXMgYSB2b2x1bWUgaGFzCisgKiB0byBiZWNvbWUgSFVHRSBpbiBvcmRlciB0byBuZWVkIG1vcmUgdGhhbiAzMi1iaXRzIHdvcnRoIG9mIG1mdCByZWNvcmRzLgorICogQXNzdW1pbmcgdGhlIHN0YW5kYXJkIG1mdCByZWNvcmQgc2l6ZSBvZiAxa2Igb25seSB0aGUgcmVjb3JkcyAobmV2ZXIgbWluZAorICogdGhlIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLCBldGMuKSB3b3VsZCByZXF1aXJlIDRUYiBvZiBzcGFjZSBvbiB0aGVpciBvd24KKyAqIGZvciB0aGUgZmlyc3QgMzIgYml0cyB3b3J0aCBvZiByZWNvcmRzLiBUaGlzIGlzIG9ubHkgaWYgc29tZSBzdHJhbmdlIHBlcnNvbgorICogZG9lc24ndCBkZWNpZGUgdG8gZm91bCBwbGF5IGFuZCBtYWtlIHRoZSBtZnQgc3BhcnNlIHdoaWNoIHdvdWxkIGJlIGEgcmVhbGx5CisgKiBob3JyaWJsZSB0aGluZyB0byBkbyBhcyBpdCB3b3VsZCB0cmFzaCBvdXIgY3VycmVudCBkcml2ZXIgaW1wbGVtZW50YXRpb24uICktOgorICogRG8gSSBoZWFyIHNjcmVhbXMgIndlIHdhbnQgNjQtYml0IGlub2RlcyEiID8hPyAoLTsKKyAqCisgKiBGSVhNRTogVGhlIG1mdCB6b25lIGlzIGRlZmluZWQgYXMgdGhlIGZpcnN0IDEyJSBvZiB0aGUgdm9sdW1lLiBUaGlzIHNwYWNlIGlzCisgKiByZXNlcnZlZCBzbyB0aGF0IHRoZSBtZnQgY2FuIGdyb3cgY29udGlndW91c2x5IGFuZCBoZW5jZSBkb2Vzbid0IGJlY29tZQorICogZnJhZ21lbnRlZC4gVm9sdW1lIGZyZWUgc3BhY2UgaW5jbHVkZXMgdGhlIGVtcHR5IHBhcnQgb2YgdGhlIG1mdCB6b25lIGFuZAorICogd2hlbiB0aGUgdm9sdW1lJ3MgZnJlZSA4OCUgYXJlIHVzZWQgdXAsIHRoZSBtZnQgem9uZSBpcyBzaHJ1bmsgYnkgYSBmYWN0b3IKKyAqIG9mIDIsIHRodXMgbWFraW5nIG1vcmUgc3BhY2UgYXZhaWxhYmxlIGZvciBtb3JlIGZpbGVzL2RhdGEuIFRoaXMgcHJvY2VzcyBpcworICogcmVwZWF0ZWQgZXZlcnl0aW1lIHRoZXJlIGlzIG5vIG1vcmUgZnJlZSBzcGFjZSBleGNlcHQgZm9yIHRoZSBtZnQgem9uZSB1bnRpbAorICogdGhlcmUgcmVhbGx5IGlzIG5vIG1vcmUgZnJlZSBzcGFjZS4KKyAqLworCisvKgorICogVHlwZWRlZiB0aGUgTUZUX1JFRiBhcyBhIDY0LWJpdCB2YWx1ZSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorICogQWxzbyBkZWZpbmUgdHdvIHVucGFja2luZyBtYWNyb3MgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2UgKE1SRUYpIGFuZAorICogc2VxdWVuY2UgbnVtYmVyIChNU0VRTk8pIHJlc3BlY3RpdmVseS4KKyAqIFRoZSBfTEUgdmVyc2lvbnMgYXJlIHRvIGJlIGFwcGxpZWQgb24gbGl0dGxlIGVuZGlhbiBNRlRfUkVGcy4KKyAqIE5vdGU6IFRoZSBfTEUgdmVyc2lvbnMgd2lsbCByZXR1cm4gYSBDUFUgZW5kaWFuIGZvcm1hdHRlZCB2YWx1ZSEKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlNRlRfUkVGX01BU0tfQ1BVCT0gMHgwMDAwZmZmZmZmZmZmZmZmVUxMLAorCU1GVF9SRUZfTUFTS19MRQkJPSBjb25zdF9jcHVfdG9fbGU2NCgweDAwMDBmZmZmZmZmZmZmZmZVTEwpLAorfSBNRlRfUkVGX0NPTlNUUzsKKwordHlwZWRlZiB1NjQgTUZUX1JFRjsKK3R5cGVkZWYgbGU2NCBsZU1GVF9SRUY7CisKKyNkZWZpbmUgTUtfTVJFRihtLCBzKQkoKE1GVF9SRUYpKCgoTUZUX1JFRikocykgPDwgNDgpIHwJCVwKKwkJCQkJKChNRlRfUkVGKShtKSAmIE1GVF9SRUZfTUFTS19DUFUpKSkKKyNkZWZpbmUgTUtfTEVfTVJFRihtLCBzKSBjcHVfdG9fbGU2NChNS19NUkVGKG0sIHMpKQorCisjZGVmaW5lIE1SRUYoeCkJCSgodW5zaWduZWQgbG9uZykoKHgpICYgTUZUX1JFRl9NQVNLX0NQVSkpCisjZGVmaW5lIE1TRVFOTyh4KQkoKHUxNikoKCh4KSA+PiA0OCkgJiAweGZmZmYpKQorI2RlZmluZSBNUkVGX0xFKHgpCSgodW5zaWduZWQgbG9uZykobGU2NF90b19jcHUoeCkgJiBNRlRfUkVGX01BU0tfQ1BVKSkKKyNkZWZpbmUgTVNFUU5PX0xFKHgpCSgodTE2KSgobGU2NF90b19jcHUoeCkgPj4gNDgpICYgMHhmZmZmKSkKKworI2RlZmluZSBJU19FUlJfTVJFRih4KQkoKCh4KSAmIDB4MDAwMDgwMDAwMDAwMDAwMFVMTCkgPyAxIDogMCkKKyNkZWZpbmUgRVJSX01SRUYoeCkJKCh1NjQpKChzNjQpKHgpKSkKKyNkZWZpbmUgTVJFRl9FUlIoeCkJKChpbnQpKChzNjQpKHgpKSkKKworLyoKKyAqIFRoZSBtZnQgcmVjb3JkIGhlYWRlciBwcmVzZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgcmVjb3JkIGluIHRoZSBtZnQuCisgKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUgbGVuZ3RoIGF0dHJpYnV0ZSByZWNvcmRzIHdoaWNoCisgKiBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGF0dHJpYnV0ZSBvZiB0eXBlIEFUX0VORCB3aGljaCBpcyBhIHRydW5jYXRlZCBhdHRyaWJ1dGUKKyAqIGluIHRoYXQgaXQgb25seSBjb25zaXN0cyBvZiB0aGUgYXR0cmlidXRlIHR5cGUgY29kZSBBVF9FTkQgYW5kIG5vbmUgb2YgdGhlCisgKiBvdGhlciBtZW1iZXJzIG9mIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlIGFyZSBwcmVzZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBVc3VhbGx5IHRoZSBtYWdpYyBpcyAiRklMRSIuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gYWJvdmUuICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBhYm92ZS4gKi8KKworLyogIDgqLwlsZTY0IGxzbjsJCS8qICRMb2dGaWxlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhpcyByZWNvcmQuCisJCQkJICAgQ2hhbmdlZCBldmVyeSB0aW1lIHRoZSByZWNvcmQgaXMgbW9kaWZpZWQuICovCisvKiAxNiovCWxlMTYgc2VxdWVuY2VfbnVtYmVyOwkvKiBOdW1iZXIgb2YgdGltZXMgdGhpcyBtZnQgcmVjb3JkIGhhcyBiZWVuCisJCQkJICAgcmV1c2VkLiAoU2VlIGRlc2NyaXB0aW9uIGZvciBNRlRfUkVGCisJCQkJICAgYWJvdmUuKSBOT1RFOiBUaGUgaW5jcmVtZW50IChza2lwcGluZyB6ZXJvKQorCQkJCSAgIGlzIGRvbmUgd2hlbiB0aGUgZmlsZSBpcyBkZWxldGVkLiBOT1RFOiBJZgorCQkJCSAgIHRoaXMgaXMgemVybyBpdCBpcyBsZWZ0IHplcm8uICovCisvKiAxOCovCWxlMTYgbGlua19jb3VudDsJLyogTnVtYmVyIG9mIGhhcmQgbGlua3MsIGkuZS4gdGhlIG51bWJlciBvZgorCQkJCSAgIGRpcmVjdG9yeSBlbnRyaWVzIHJlZmVyZW5jaW5nIHRoaXMgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE9ubHkgdXNlZCBpbiBtZnQgYmFzZSByZWNvcmRzLgorCQkJCSAgIE5PVEU6IFdoZW4gZGVsZXRpbmcgYSBkaXJlY3RvcnkgZW50cnkgd2UKKwkJCQkgICBjaGVjayB0aGUgbGlua19jb3VudCBhbmQgaWYgaXQgaXMgMSB3ZQorCQkJCSAgIGRlbGV0ZSB0aGUgZmlsZS4gT3RoZXJ3aXNlIHdlIGRlbGV0ZSB0aGUKKwkJCQkgICBGSUxFX05BTUVfQVRUUiBiZWluZyByZWZlcmVuY2VkIGJ5IHRoZQorCQkJCSAgIGRpcmVjdG9yeSBlbnRyeSBmcm9tIHRoZSBtZnQgcmVjb3JkIGFuZAorCQkJCSAgIGRlY3JlbWVudCB0aGUgbGlua19jb3VudC4KKwkJCQkgICBGSVhNRTogQ2FyZWZ1bCB3aXRoIFdpbjMyICsgRE9TIG5hbWVzISAqLworLyogMjAqLwlsZTE2IGF0dHJzX29mZnNldDsJLyogQnl0ZSBvZmZzZXQgdG8gdGhlIGZpcnN0IGF0dHJpYnV0ZSBpbiB0aGlzCisJCQkJICAgbWZ0IHJlY29yZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBNdXN0IGJlIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogMjIqLwlNRlRfUkVDT1JEX0ZMQUdTIGZsYWdzOwkvKiBCaXQgYXJyYXkgb2YgTUZUX1JFQ09SRF9GTEFHUy4gV2hlbiBhIGZpbGUKKwkJCQkgICBpcyBkZWxldGVkLCB0aGUgTUZUX1JFQ09SRF9JTl9VU0UgZmxhZyBpcworCQkJCSAgIHNldCB0byB6ZXJvLiAqLworLyogMjQqLwlsZTMyIGJ5dGVzX2luX3VzZTsJLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gdGhpcyBtZnQgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE11c3QgYmUgYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiAyOCovCWxlMzIgYnl0ZXNfYWxsb2NhdGVkOwkvKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGlzIG1mdAorCQkJCSAgIHJlY29yZC4gVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG1mdAorCQkJCSAgIHJlY29yZCBzaXplLiAqLworLyogMzIqLwlsZU1GVF9SRUYgYmFzZV9tZnRfcmVjb3JkOy8qIFRoaXMgaXMgemVybyBmb3IgYmFzZSBtZnQgcmVjb3Jkcy4KKwkJCQkgICBXaGVuIGl0IGlzIG5vdCB6ZXJvIGl0IGlzIGEgbWZ0IHJlZmVyZW5jZQorCQkJCSAgIHBvaW50aW5nIHRvIHRoZSBiYXNlIG1mdCByZWNvcmQgdG8gd2hpY2gKKwkJCQkgICB0aGlzIHJlY29yZCBiZWxvbmdzICh0aGlzIGlzIHRoZW4gdXNlZCB0bworCQkJCSAgIGxvY2F0ZSB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIHByZXNlbnQKKwkJCQkgICBpbiB0aGUgYmFzZSByZWNvcmQgd2hpY2ggZGVzY3JpYmVzIHRoaXMKKwkJCQkgICBleHRlbnNpb24gcmVjb3JkIGFuZCBoZW5jZSBtaWdodCBuZWVkCisJCQkJICAgbW9kaWZpY2F0aW9uIHdoZW4gdGhlIGV4dGVuc2lvbiByZWNvcmQKKwkJCQkgICBpdHNlbGYgaXMgbW9kaWZpZWQsIGFsc28gbG9jYXRpbmcgdGhlCisJCQkJICAgYXR0cmlidXRlIGxpc3QgYWxzbyBtZWFucyBmaW5kaW5nIHRoZSBvdGhlcgorCQkJCSAgIHBvdGVudGlhbCBleHRlbnRzLCBiZWxvbmdpbmcgdG8gdGhlIG5vbi1iYXNlCisJCQkJICAgbWZ0IHJlY29yZCkuICovCisvKiA0MCovCWxlMTYgbmV4dF9hdHRyX2luc3RhbmNlOy8qIFRoZSBpbnN0YW5jZSBudW1iZXIgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvCisJCQkJICAgdGhlIG5leHQgYXR0cmlidXRlIGFkZGVkIHRvIHRoaXMgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBJbmNyZW1lbnRlZCBlYWNoIHRpbWUgYWZ0ZXIgaXQgaXMgdXNlZC4KKwkJCQkgICBOT1RFOiBFdmVyeSB0aW1lIHRoZSBtZnQgcmVjb3JkIGlzIHJldXNlZAorCQkJCSAgIHRoaXMgbnVtYmVyIGlzIHNldCB0byB6ZXJvLiAgTk9URTogVGhlIGZpcnN0CisJCQkJICAgaW5zdGFuY2UgbnVtYmVyIGlzIGFsd2F5cyAwLiAqLworLyogVGhlIGJlbG93IGZpZWxkcyBhcmUgc3BlY2lmaWMgdG8gTlRGUyAzLjErIChXaW5kb3dzIFhQIGFuZCBhYm92ZSk6ICovCisvKiA0MiovIGxlMTYgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZC9hbGlnbm1lbnQuICovCisvKiA0NCovIGxlMzIgbWZ0X3JlY29yZF9udW1iZXI7CS8qIE51bWJlciBvZiB0aGlzIG1mdCByZWNvcmQuICovCisvKiBzaXplb2YoKSA9IDQ4IGJ5dGVzICovCisvKgorICogV2hlbiAocmUpdXNpbmcgdGhlIG1mdCByZWNvcmQsIHdlIHBsYWNlIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgYXQgdGhpcworICogb2Zmc2V0LCBpLmUuIGJlZm9yZSB3ZSBzdGFydCB3aXRoIHRoZSBhdHRyaWJ1dGVzLiAgVGhpcyBhbHNvIG1ha2VzIHNlbnNlLAorICogb3RoZXJ3aXNlIHdlIGNvdWxkIHJ1biBpbnRvIHByb2JsZW1zIHdpdGggdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheQorICogY29udGFpbmluZyBpbiBpdHNlbGYgdGhlIGxhc3QgdHdvIGJ5dGVzIG9mIGEgc2VjdG9yIHdoaWNoIHdvdWxkIG1lYW4gdGhhdAorICogbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24gd291bGRuJ3Qgd29yay4gIEFzIHlvdSBjYW4ndCBwcm90ZWN0IGRhdGEKKyAqIGJ5IG92ZXJ3cml0aW5nIGl0IHNpbmNlIHlvdSB0aGVuIGNhbid0IGdldCBpdCBiYWNrLi4uCisgKiBXaGVuIHJlYWRpbmcgd2Ugb2J2aW91c2x5IHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBudGZzIHJlY29yZCBoZWFkZXIuCisgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBNRlRfUkVDT1JEOworCisvKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIHdpdGhvdXQgdGhlIE5URlMgMy4xKyBzcGVjaWZpYyBmaWVsZHMuICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBVc3VhbGx5IHRoZSBtYWdpYyBpcyAiRklMRSIuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gYWJvdmUuICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBhYm92ZS4gKi8KKworLyogIDgqLwlsZTY0IGxzbjsJCS8qICRMb2dGaWxlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhpcyByZWNvcmQuCisJCQkJICAgQ2hhbmdlZCBldmVyeSB0aW1lIHRoZSByZWNvcmQgaXMgbW9kaWZpZWQuICovCisvKiAxNiovCWxlMTYgc2VxdWVuY2VfbnVtYmVyOwkvKiBOdW1iZXIgb2YgdGltZXMgdGhpcyBtZnQgcmVjb3JkIGhhcyBiZWVuCisJCQkJICAgcmV1c2VkLiAoU2VlIGRlc2NyaXB0aW9uIGZvciBNRlRfUkVGCisJCQkJICAgYWJvdmUuKSBOT1RFOiBUaGUgaW5jcmVtZW50IChza2lwcGluZyB6ZXJvKQorCQkJCSAgIGlzIGRvbmUgd2hlbiB0aGUgZmlsZSBpcyBkZWxldGVkLiBOT1RFOiBJZgorCQkJCSAgIHRoaXMgaXMgemVybyBpdCBpcyBsZWZ0IHplcm8uICovCisvKiAxOCovCWxlMTYgbGlua19jb3VudDsJLyogTnVtYmVyIG9mIGhhcmQgbGlua3MsIGkuZS4gdGhlIG51bWJlciBvZgorCQkJCSAgIGRpcmVjdG9yeSBlbnRyaWVzIHJlZmVyZW5jaW5nIHRoaXMgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE9ubHkgdXNlZCBpbiBtZnQgYmFzZSByZWNvcmRzLgorCQkJCSAgIE5PVEU6IFdoZW4gZGVsZXRpbmcgYSBkaXJlY3RvcnkgZW50cnkgd2UKKwkJCQkgICBjaGVjayB0aGUgbGlua19jb3VudCBhbmQgaWYgaXQgaXMgMSB3ZQorCQkJCSAgIGRlbGV0ZSB0aGUgZmlsZS4gT3RoZXJ3aXNlIHdlIGRlbGV0ZSB0aGUKKwkJCQkgICBGSUxFX05BTUVfQVRUUiBiZWluZyByZWZlcmVuY2VkIGJ5IHRoZQorCQkJCSAgIGRpcmVjdG9yeSBlbnRyeSBmcm9tIHRoZSBtZnQgcmVjb3JkIGFuZAorCQkJCSAgIGRlY3JlbWVudCB0aGUgbGlua19jb3VudC4KKwkJCQkgICBGSVhNRTogQ2FyZWZ1bCB3aXRoIFdpbjMyICsgRE9TIG5hbWVzISAqLworLyogMjAqLwlsZTE2IGF0dHJzX29mZnNldDsJLyogQnl0ZSBvZmZzZXQgdG8gdGhlIGZpcnN0IGF0dHJpYnV0ZSBpbiB0aGlzCisJCQkJICAgbWZ0IHJlY29yZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBNdXN0IGJlIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogMjIqLwlNRlRfUkVDT1JEX0ZMQUdTIGZsYWdzOwkvKiBCaXQgYXJyYXkgb2YgTUZUX1JFQ09SRF9GTEFHUy4gV2hlbiBhIGZpbGUKKwkJCQkgICBpcyBkZWxldGVkLCB0aGUgTUZUX1JFQ09SRF9JTl9VU0UgZmxhZyBpcworCQkJCSAgIHNldCB0byB6ZXJvLiAqLworLyogMjQqLwlsZTMyIGJ5dGVzX2luX3VzZTsJLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gdGhpcyBtZnQgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE11c3QgYmUgYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiAyOCovCWxlMzIgYnl0ZXNfYWxsb2NhdGVkOwkvKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGlzIG1mdAorCQkJCSAgIHJlY29yZC4gVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG1mdAorCQkJCSAgIHJlY29yZCBzaXplLiAqLworLyogMzIqLwlsZU1GVF9SRUYgYmFzZV9tZnRfcmVjb3JkOy8qIFRoaXMgaXMgemVybyBmb3IgYmFzZSBtZnQgcmVjb3Jkcy4KKwkJCQkgICBXaGVuIGl0IGlzIG5vdCB6ZXJvIGl0IGlzIGEgbWZ0IHJlZmVyZW5jZQorCQkJCSAgIHBvaW50aW5nIHRvIHRoZSBiYXNlIG1mdCByZWNvcmQgdG8gd2hpY2gKKwkJCQkgICB0aGlzIHJlY29yZCBiZWxvbmdzICh0aGlzIGlzIHRoZW4gdXNlZCB0bworCQkJCSAgIGxvY2F0ZSB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIHByZXNlbnQKKwkJCQkgICBpbiB0aGUgYmFzZSByZWNvcmQgd2hpY2ggZGVzY3JpYmVzIHRoaXMKKwkJCQkgICBleHRlbnNpb24gcmVjb3JkIGFuZCBoZW5jZSBtaWdodCBuZWVkCisJCQkJICAgbW9kaWZpY2F0aW9uIHdoZW4gdGhlIGV4dGVuc2lvbiByZWNvcmQKKwkJCQkgICBpdHNlbGYgaXMgbW9kaWZpZWQsIGFsc28gbG9jYXRpbmcgdGhlCisJCQkJICAgYXR0cmlidXRlIGxpc3QgYWxzbyBtZWFucyBmaW5kaW5nIHRoZSBvdGhlcgorCQkJCSAgIHBvdGVudGlhbCBleHRlbnRzLCBiZWxvbmdpbmcgdG8gdGhlIG5vbi1iYXNlCisJCQkJICAgbWZ0IHJlY29yZCkuICovCisvKiA0MCovCWxlMTYgbmV4dF9hdHRyX2luc3RhbmNlOy8qIFRoZSBpbnN0YW5jZSBudW1iZXIgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvCisJCQkJICAgdGhlIG5leHQgYXR0cmlidXRlIGFkZGVkIHRvIHRoaXMgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBJbmNyZW1lbnRlZCBlYWNoIHRpbWUgYWZ0ZXIgaXQgaXMgdXNlZC4KKwkJCQkgICBOT1RFOiBFdmVyeSB0aW1lIHRoZSBtZnQgcmVjb3JkIGlzIHJldXNlZAorCQkJCSAgIHRoaXMgbnVtYmVyIGlzIHNldCB0byB6ZXJvLiAgTk9URTogVGhlIGZpcnN0CisJCQkJICAgaW5zdGFuY2UgbnVtYmVyIGlzIGFsd2F5cyAwLiAqLworLyogc2l6ZW9mKCkgPSA0MiBieXRlcyAqLworLyoKKyAqIFdoZW4gKHJlKXVzaW5nIHRoZSBtZnQgcmVjb3JkLCB3ZSBwbGFjZSB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5IGF0IHRoaXMKKyAqIG9mZnNldCwgaS5lLiBiZWZvcmUgd2Ugc3RhcnQgd2l0aCB0aGUgYXR0cmlidXRlcy4gIFRoaXMgYWxzbyBtYWtlcyBzZW5zZSwKKyAqIG90aGVyd2lzZSB3ZSBjb3VsZCBydW4gaW50byBwcm9ibGVtcyB3aXRoIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkKKyAqIGNvbnRhaW5pbmcgaW4gaXRzZWxmIHRoZSBsYXN0IHR3byBieXRlcyBvZiBhIHNlY3RvciB3aGljaCB3b3VsZCBtZWFuIHRoYXQKKyAqIG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0aW9uIHdvdWxkbid0IHdvcmsuICBBcyB5b3UgY2FuJ3QgcHJvdGVjdCBkYXRhCisgKiBieSBvdmVyd3JpdGluZyBpdCBzaW5jZSB5b3UgdGhlbiBjYW4ndCBnZXQgaXQgYmFjay4uLgorICogV2hlbiByZWFkaW5nIHdlIG9idmlvdXNseSB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgbnRmcyByZWNvcmQgaGVhZGVyLgorICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgTUZUX1JFQ09SRF9PTEQ7CisKKy8qCisgKiBTeXN0ZW0gZGVmaW5lZCBhdHRyaWJ1dGVzICgzMi1iaXQpLiAgRWFjaCBhdHRyaWJ1dGUgdHlwZSBoYXMgYSBjb3JyZXNwb25kaW5nCisgKiBhdHRyaWJ1dGUgbmFtZSAoVW5pY29kZSBzdHJpbmcgb2YgbWF4aW11bSA2NCBjaGFyYWN0ZXIgbGVuZ3RoKSBhcyBkZXNjcmliZWQKKyAqIGJ5IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgcHJlc2VudCBpbiB0aGUgZGF0YSBhdHRyaWJ1dGUgb2YgdGhlICRBdHRyRGVmCisgKiBzeXN0ZW0gZmlsZS4gIE9uIE5URlMgMy4wIHZvbHVtZXMgdGhlIG5hbWVzIGFyZSBqdXN0IGFzIHRoZSB0eXBlcyBhcmUgbmFtZWQKKyAqIGluIHRoZSBiZWxvdyBkZWZpbmVzIGV4Y2hhbmdpbmcgQVRfIGZvciB0aGUgZG9sbGFyIHNpZ24gKCQpLiAgSWYgdGhhdCBpcyBub3QKKyAqIGEgcmV2ZWFsaW5nIGNob2ljZSBvZiBzeW1ib2wgSSBkbyBub3Qga25vdyB3aGF0IGlzLi4uICgtOworICovCitlbnVtIHsKKwlBVF9VTlVTRUQJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgICAgIDApLAorCUFUX1NUQU5EQVJEX0lORk9STUFUSU9OCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4MTApLAorCUFUX0FUVFJJQlVURV9MSVNUCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4MjApLAorCUFUX0ZJTEVfTkFNRQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHgzMCksCisJQVRfT0JKRUNUX0lECQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDQwKSwKKwlBVF9TRUNVUklUWV9ERVNDUklQVE9SCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4NTApLAorCUFUX1ZPTFVNRV9OQU1FCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDYwKSwKKwlBVF9WT0xVTUVfSU5GT1JNQVRJT04JCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHg3MCksCisJQVRfREFUQQkJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4ODApLAorCUFUX0lOREVYX1JPT1QJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4OTApLAorCUFUX0lOREVYX0FMTE9DQVRJT04JCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHhhMCksCisJQVRfQklUTUFQCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweGIwKSwKKwlBVF9SRVBBUlNFX1BPSU5UCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4YzApLAorCUFUX0VBX0lORk9STUFUSU9OCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4ZDApLAorCUFUX0VBCQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHhlMCksCisJQVRfUFJPUEVSVFlfU0VUCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweGYwKSwKKwlBVF9MT0dHRURfVVRJTElUWV9TVFJFQU0JPSBjb25zdF9jcHVfdG9fbGUzMiggICAgIDB4MTAwKSwKKwlBVF9GSVJTVF9VU0VSX0RFRklORURfQVRUUklCVVRFCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgIDB4MTAwMCksCisJQVRfRU5ECQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikKK307CisKK3R5cGVkZWYgbGUzMiBBVFRSX1RZUEU7CisKKy8qCisgKiBUaGUgY29sbGF0aW9uIHJ1bGVzIGZvciBzb3J0aW5nIHZpZXdzL2luZGV4ZXMvZXRjICgzMi1iaXQpLgorICoKKyAqIENPTExBVElPTl9CSU5BUlkgLSBDb2xsYXRlIGJ5IGJpbmFyeSBjb21wYXJlIHdoZXJlIHRoZSBmaXJzdCBieXRlIGlzIG1vc3QKKyAqCXNpZ25pZmljYW50LgorICogQ09MTEFUSU9OX1VOSUNPREVfU1RSSU5HIC0gQ29sbGF0ZSBVbmljb2RlIHN0cmluZ3MgYnkgY29tcGFyaW5nIHRoZWlyIGJpbmFyeQorICoJVW5pY29kZSB2YWx1ZXMsIGV4Y2VwdCB0aGF0IHdoZW4gYSBjaGFyYWN0ZXIgY2FuIGJlIHVwcGVyY2FzZWQsIHRoZQorICoJdXBwZXIgY2FzZSB2YWx1ZSBjb2xsYXRlcyBiZWZvcmUgdGhlIGxvd2VyIGNhc2Ugb25lLgorICogQ09MTEFUSU9OX0ZJTEVfTkFNRSAtIENvbGxhdGUgZmlsZSBuYW1lcyBhcyBVbmljb2RlIHN0cmluZ3MuIFRoZSBjb2xsYXRpb24KKyAqCWlzIGRvbmUgdmVyeSBtdWNoIGxpa2UgQ09MTEFUSU9OX1VOSUNPREVfU1RSSU5HLiBJbiBmYWN0IEkgaGF2ZSBubyBpZGVhCisgKgl3aGF0IHRoZSBkaWZmZXJlbmNlIGlzLiBQZXJoYXBzIHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZmlsZSBuYW1lcworICoJd291bGQgdHJlYXQgc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gYW4gb2RkIHdheSAoc2VlCisgKgl1bmlzdHIuYzo6bnRmc19jb2xsYXRlX25hbWVzKCkgYW5kIHVuaXN0ci5jOjpsZWdhbF9hbnNpX2NoYXJfYXJyYXlbXQorICoJZm9yIHdoYXQgSSBtZWFuIGJ1dCBDT0xMQVRJT05fVU5JQ09ERV9TVFJJTkcgd291bGQgbm90IGdpdmUgYW55IHNwZWNpYWwKKyAqCXRyZWF0bWVudCB0byBhbnkgY2hhcmFjdGVycyBhdCBhbGwsIGJ1dCB0aGlzIGlzIHNwZWN1bGF0aW9uLgorICogQ09MTEFUSU9OX05UT0ZTX1VMT05HIC0gU29ydGluZyBpcyBkb25lIGFjY29yZGluZyB0byBhc2NlbmRpbmcgbGUzMiBrZXkKKyAqCXZhbHVlcy4gRS5nLiB1c2VkIGZvciAkU0lJIGluZGV4IGluIEZJTEVfU2VjdXJlLCB3aGljaCBzb3J0cyBieQorICoJc2VjdXJpdHlfaWQgKGxlMzIpLgorICogQ09MTEFUSU9OX05UT0ZTX1NJRCAtIFNvcnRpbmcgaXMgZG9uZSBhY2NvcmRpbmcgdG8gYXNjZW5kaW5nIFNJRCB2YWx1ZXMuCisgKglFLmcuIHVzZWQgZm9yICRPIGluZGV4IGluIEZJTEVfRXh0ZW5kLyRRdW90YS4KKyAqIENPTExBVElPTl9OVE9GU19TRUNVUklUWV9IQVNIIC0gU29ydGluZyBpcyBkb25lIGZpcnN0IGJ5IGFzY2VuZGluZyBoYXNoCisgKgl2YWx1ZXMgYW5kIHNlY29uZCBieSBhc2NlbmRpbmcgc2VjdXJpdHlfaWQgdmFsdWVzLiBFLmcuIHVzZWQgZm9yICRTREgKKyAqCWluZGV4IGluIEZJTEVfU2VjdXJlLgorICogQ09MTEFUSU9OX05UT0ZTX1VMT05HUyAtIFNvcnRpbmcgaXMgZG9uZSBhY2NvcmRpbmcgdG8gYSBzZXF1ZW5jZSBvZiBhc2NlbmRpbmcKKyAqCWxlMzIga2V5IHZhbHVlcy4gRS5nLiB1c2VkIGZvciAkTyBpbmRleCBpbiBGSUxFX0V4dGVuZC8kT2JqSWQsIHdoaWNoCisgKglzb3J0cyBieSBvYmplY3RfaWQgKDE2LWJ5dGUpLCBieSBzcGxpdHRpbmcgdXAgdGhlIG9iamVjdF9pZCBpbiBmb3VyCisgKglsZTMyIHZhbHVlcyBhbmQgdXNpbmcgdGhlbSBhcyBpbmRpdmlkdWFsIGtleXMuIEUuZy4gdGFrZSB0aGUgZm9sbG93aW5nCisgKgl0d28gc2VjdXJpdHlfaWRzLCBzdG9yZWQgYXMgZm9sbG93cyBvbiBkaXNrOgorICoJCTFzdDogYTEgNjEgNjUgYjcgNjUgN2IgZDQgMTEgOWUgM2QgMDAgZTAgODEgMTAgNDIgNTkKKyAqCQkybmQ6IDM4IDE0IDM3IGQyIGQyIGYzIGQ0IDExIGE1IDIxIGM4IDZiIDc5IGIxIDk3IDQ1CisgKglUbyBjb21wYXJlIHRoZW0sIHRoZXkgYXJlIHNwbGl0IGludG8gZm91ciBsZTMyIHZhbHVlcyBlYWNoLCBsaWtlIHNvOgorICoJCTFzdDogMHhiNzY1NjFhMSAweDExZDQ3YjY1IDB4ZTAwMDNkOWUgMHg1OTQyMTA4MQorICoJCTJuZDogMHhkMjM3MTQzOCAweDExZDRmM2QyIDB4NmJjODIxYTUgMHg0NTk3YjE3OQorICoJTm93LCBpdCBpcyBhcHBhcmVudCB3aHkgdGhlIDJuZCBvYmplY3RfaWQgY29sbGF0ZXMgYWZ0ZXIgdGhlIDFzdDogdGhlCisgKglmaXJzdCBsZTMyIHZhbHVlIG9mIHRoZSAxc3Qgb2JqZWN0X2lkIGlzIGxlc3MgdGhhbiB0aGUgZmlyc3QgbGUzMiBvZgorICoJdGhlIDJuZCBvYmplY3RfaWQuIElmIHRoZSBmaXJzdCBsZTMyIHZhbHVlcyBvZiBib3RoIG9iamVjdF9pZHMgd2VyZQorICoJZXF1YWwgdGhlbiB0aGUgc2Vjb25kIGxlMzIgdmFsdWVzIHdvdWxkIGJlIGNvbXBhcmVkLCBldGMuCisgKi8KK2VudW0geworCUNPTExBVElPTl9CSU5BUlkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMCksCisJQ09MTEFUSU9OX0ZJTEVfTkFNRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAxKSwKKwlDT0xMQVRJT05fVU5JQ09ERV9TVFJJTkcJPSBjb25zdF9jcHVfdG9fbGUzMigweDAyKSwKKwlDT0xMQVRJT05fTlRPRlNfVUxPTkcJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMCksCisJQ09MTEFUSU9OX05UT0ZTX1NJRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDExKSwKKwlDT0xMQVRJT05fTlRPRlNfU0VDVVJJVFlfSEFTSAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTIpLAorCUNPTExBVElPTl9OVE9GU19VTE9OR1MJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMykKK307CisKK3R5cGVkZWYgbGUzMiBDT0xMQVRJT05fUlVMRTsKKworLyoKKyAqIFRoZSBmbGFncyAoMzItYml0KSBkZXNjcmliaW5nIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIGluIHRoZSBhdHRyaWJ1dGUKKyAqIGRlZmluaXRpb24gc3RydWN0dXJlLiAgRklYTUU6IFRoaXMgaW5mb3JtYXRpb24gaXMgZnJvbSBSZWdpcydzIGluZm9ybWF0aW9uCisgKiBhbmQsIGFjY29yZGluZyB0byBoaW0sIGl0IGlzIG5vdCBjZXJ0YWluIGFuZCBwcm9iYWJseSBpbmNvbXBsZXRlLgorICogVGhlIElOREVYQUJMRSBmbGFnIGlzIGZhaXJseSBjZXJ0YWlubHkgY29ycmVjdCBhcyBvbmx5IHRoZSBmaWxlIG5hbWUKKyAqIGF0dHJpYnV0ZSBoYXMgdGhpcyBmbGFnIHNldCBhbmQgdGhpcyBpcyB0aGUgb25seSBhdHRyaWJ1dGUgaW5kZXhlZCBpbiBOVDQuCisgKi8KK2VudW0geworCUlOREVYQUJMRQkgICAgPSBjb25zdF9jcHVfdG9fbGUzMigweDAyKSwgLyogQXR0cmlidXRlIGNhbiBiZQorCQkJCQkJCSAgaW5kZXhlZC4gKi8KKwlORUVEX1RPX1JFR0VORVJBVEUgID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0MCksIC8qIE5lZWQgdG8gcmVnZW5lcmF0ZQorCQkJCQkJCSAgZHVyaW5nIHJlZ2VuZXJhdGlvbgorCQkJCQkJCSAgcGhhc2UuICovCisJQ0FOX0JFX05PTl9SRVNJREVOVCA9IGNvbnN0X2NwdV90b19sZTMyKDB4ODApLCAvKiBBdHRyaWJ1dGUgY2FuIGJlCisJCQkJCQkJICBub24tcmVzaWRlbnQuICovCit9OworCit0eXBlZGVmIGxlMzIgQVRUUl9ERUZfRkxBR1M7CisKKy8qCisgKiBUaGUgZGF0YSBhdHRyaWJ1dGUgb2YgRklMRV9BdHRyRGVmIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgYXR0cmlidXRlCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIE5URlMgdm9sdW1lLiBXaXRoIHRoaXMsIGl0IGlzIHN1cHBvc2VkIHRvIGJlIHNhZmUgZm9yIGFuCisgKiBvbGRlciBOVEZTIGRyaXZlciB0byBtb3VudCBhIHZvbHVtZSBjb250YWluaW5nIGEgbmV3ZXIgTlRGUyB2ZXJzaW9uIHdpdGhvdXQKKyAqIGRhbWFnaW5nIGl0ICh0aGF0J3MgdGhlIHRoZW9yeS4gSW4gcHJhY3RpY2UgaXQnczogbm90IGRhbWFnaW5nIGl0IHRvbyBtdWNoKS4KKyAqIEVudHJpZXMgYXJlIHNvcnRlZCBieSBhdHRyaWJ1dGUgdHlwZS4gVGhlIGZsYWdzIGRlc2NyaWJlIHdoZXRoZXIgdGhlCisgKiBhdHRyaWJ1dGUgY2FuIGJlIHJlc2lkZW50L25vbi1yZXNpZGVudCBhbmQgcG9zc2libHkgb3RoZXIgdGhpbmdzLCBidXQgdGhlCisgKiBhY3R1YWwgYml0cyBhcmUgdW5rbm93bi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypoZXggb2ZzKi8KKy8qICAwKi8JbnRmc2NoYXIgbmFtZVsweDQwXTsJCS8qIFVuaWNvZGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBaZXJvCisJCQkJCSAgIHRlcm1pbmF0ZWQuICovCisvKiA4MCovCUFUVFJfVFlQRSB0eXBlOwkJCS8qIFR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKy8qIDg0Ki8JbGUzMiBkaXNwbGF5X3J1bGU7CQkvKiBEZWZhdWx0IGRpc3BsYXkgcnVsZS4KKwkJCQkJICAgRklYTUU6IFdoYXQgZG9lcyBpdCBtZWFuPyAoQUlBKSAqLworLyogODgqLyBDT0xMQVRJT05fUlVMRSBjb2xsYXRpb25fcnVsZTsJLyogRGVmYXVsdCBjb2xsYXRpb24gcnVsZS4gKi8KKy8qIDhjKi8JQVRUUl9ERUZfRkxBR1MgZmxhZ3M7CQkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGUuICovCisvKiA5MCovCXNsZTY0IG1pbl9zaXplOwkJCS8qIE9wdGlvbmFsIG1pbmltdW0gYXR0cmlidXRlIHNpemUuICovCisvKiA5OCovCXNsZTY0IG1heF9zaXplOwkJCS8qIE1heGltdW0gc2l6ZSBvZiBhdHRyaWJ1dGUuICovCisvKiBzaXplb2YoKSA9IDB4YTAgb3IgMTYwIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQVRUUl9ERUY7CisKKy8qCisgKiBBdHRyaWJ1dGUgZmxhZ3MgKDE2LWJpdCkuCisgKi8KK2VudW0geworCUFUVFJfSVNfQ09NUFJFU1NFRCAgICA9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMSksCisJQVRUUl9DT01QUkVTU0lPTl9NQVNLID0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMGZmKSwgLyogQ29tcHJlc3Npb24gbWV0aG9kCisJCQkJCQkJICAgICAgbWFzay4gIEFsc28sIGZpcnN0CisJCQkJCQkJICAgICAgaWxsZWdhbCB2YWx1ZS4gKi8KKwlBVFRSX0lTX0VOQ1JZUFRFRCAgICAgPSBjb25zdF9jcHVfdG9fbGUxNigweDQwMDApLAorCUFUVFJfSVNfU1BBUlNFCSAgICAgID0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDAwKSwKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiBsZTE2IEFUVFJfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGUgY29tcHJlc3Npb24uCisgKgorICogT25seSB0aGUgZGF0YSBhdHRyaWJ1dGUgaXMgZXZlciBjb21wcmVzc2VkIGluIHRoZSBjdXJyZW50IG50ZnMgZHJpdmVyIGluCisgKiBXaW5kb3dzLiBGdXJ0aGVyLCBjb21wcmVzc2lvbiBpcyBvbmx5IGFwcGxpZWQgd2hlbiB0aGUgZGF0YSBhdHRyaWJ1dGUgaXMKKyAqIG5vbi1yZXNpZGVudC4gRmluYWxseSwgdG8gdXNlIGNvbXByZXNzaW9uLCB0aGUgbWF4aW11bSBhbGxvd2VkIGNsdXN0ZXIgc2l6ZQorICogb24gYSB2b2x1bWUgaXMgNGtpYi4KKyAqCisgKiBUaGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJhc2VkIG9uIGluZGVwZW5kZW50bHkgY29tcHJlc3NpbmcgYmxvY2tzIG9mIFgKKyAqIGNsdXN0ZXJzLCB3aGVyZSBYIGlzIGRldGVybWluZWQgZnJvbSB0aGUgY29tcHJlc3Npb25fdW5pdCB2YWx1ZSBmb3VuZCBpbiB0aGUKKyAqIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUgcmVjb3JkIGhlYWRlciAobW9yZSBwcmVjaXNlbHk6IFggPSAyXmNvbXByZXNzaW9uX3VuaXQKKyAqIGNsdXN0ZXJzKS4gT24gV2luZG93cyBOVC8yaywgWCBhbHdheXMgaXMgMTYgY2x1c3RlcnMgKGNvbXByZXNzaW9uX3VuaXQgPSA0KS4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGNhc2VzIG9mIGhvdyBhIGNvbXByZXNzaW9uIGJsb2NrIG9mIFggY2x1c3RlcnMKKyAqIGNhbiBiZSBzdG9yZWQ6CisgKgorICogICAxKSBUaGUgZGF0YSBpbiB0aGUgYmxvY2sgaXMgYWxsIHplcm8gKGEgc3BhcnNlIGJsb2NrKToKKyAqCSAgVGhpcyBpcyBzdG9yZWQgYXMgYSBzcGFyc2UgYmxvY2sgaW4gdGhlIHJ1bmxpc3QsIGkuZS4gdGhlIHJ1bmxpc3QKKyAqCSAgZW50cnkgaGFzIGxlbmd0aCA9IFggYW5kIGxjbiA9IC0xLiBUaGUgbWFwcGluZyBwYWlycyBhcnJheSBhY3R1YWxseQorICoJICB1c2VzIGEgZGVsdGFfbGNuIHZhbHVlIGxlbmd0aCBvZiAwLCBpLmUuIGRlbHRhX2xjbiBpcyBub3QgcHJlc2VudCBhdAorICoJICBhbGwsIHdoaWNoIGlzIHRoZW4gaW50ZXJwcmV0ZWQgYnkgdGhlIGRyaXZlciBhcyBsY24gPSAtMS4KKyAqCSAgTk9URTogRXZlbiB1bmNvbXByZXNzZWQgZmlsZXMgY2FuIGJlIHNwYXJzZSBvbiBOVEZTIDMuMCB2b2x1bWVzLCB0aGVuCisgKgkgIHRoZSBzYW1lIHByaW5jaXBsZXMgYXBwbHkgYXMgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBsZW5ndGggaXMgbm90CisgKgkgIHJlc3RyaWN0ZWQgdG8gYmVpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuCisgKgorICogICAyKSBUaGUgZGF0YSBpbiB0aGUgYmxvY2sgaXMgbm90IGNvbXByZXNzZWQ6CisgKgkgIFRoaXMgaGFwcGVucyB3aGVuIGNvbXByZXNzaW9uIGRvZXNuJ3QgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBibG9jaworICoJICBpbiBjbHVzdGVycy4gSS5lLiBpZiBjb21wcmVzc2lvbiBoYXMgYSBzbWFsbCBlZmZlY3Qgc28gdGhhdCB0aGUKKyAqCSAgY29tcHJlc3NlZCBkYXRhIHN0aWxsIG9jY3VwaWVzIFggY2x1c3RlcnMsIHRoZW4gdGhlIHVuY29tcHJlc3NlZCBkYXRhCisgKgkgIGlzIHN0b3JlZCBpbiB0aGUgYmxvY2suCisgKgkgIFRoaXMgY2FzZSBpcyByZWNvZ25pc2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHJ1bmxpc3QgZW50cnkgaGFzCisgKgkgIGxlbmd0aCA9IFggYW5kIGxjbiA+PSAwLiBUaGUgbWFwcGluZyBwYWlycyBhcnJheSBzdG9yZXMgdGhpcyBhcworICoJICBub3JtYWwgd2l0aCBhIHJ1biBsZW5ndGggb2YgWCBhbmQgc29tZSBzcGVjaWZpYyBkZWx0YV9sY24sIGkuZS4KKyAqCSAgZGVsdGFfbGNuIGhhcyB0byBiZSBwcmVzZW50LgorICoKKyAqICAgMykgVGhlIGRhdGEgaW4gdGhlIGJsb2NrIGlzIGNvbXByZXNzZWQ6CisgKgkgIFRoZSBjb21tb24gY2FzZS4gVGhpcyBjYXNlIGlzIHJlY29nbmlzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcnVuCisgKgkgIGxpc3QgZW50cnkgaGFzIGxlbmd0aCBMIDwgWCBhbmQgbGNuID49IDAuIFRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKgkgIHN0b3JlcyB0aGlzIGFzIG5vcm1hbCB3aXRoIGEgcnVuIGxlbmd0aCBvZiBYIGFuZCBzb21lIHNwZWNpZmljCisgKgkgIGRlbHRhX2xjbiwgaS5lLiBkZWx0YV9sY24gaGFzIHRvIGJlIHByZXNlbnQuIFRoaXMgcnVubGlzdCBlbnRyeSBpcworICoJICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHNwYXJzZSBlbnRyeSB3aXRoIGxlbmd0aCA9IFggLSBMIGFuZAorICoJICBsY24gPSAtMS4gVGhlIGxhdHRlciBlbnRyeSBpcyB0byBtYWtlIHVwIHRoZSB2Y24gY291bnRpbmcgdG8gdGhlCisgKgkgIGZ1bGwgY29tcHJlc3Npb24gYmxvY2sgc2l6ZSBYLgorICoKKyAqIEluIGZhY3QsIGxpZmUgaXMgbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIGFkamFjZW50IGVudHJpZXMgb2YgdGhlIHNhbWUgdHlwZQorICogY2FuIGJlIGNvYWxlc2NlZC4gVGhpcyBtZWFucyB0aGF0IG9uZSBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mCisgKiBjbHVzdGVycyBoYW5kbGVkIGFuZCB3b3JrIG9uIGEgYmFzaXMgb2YgWCBjbHVzdGVycyBhdCBhIHRpbWUgYmVpbmcgb25lCisgKiBibG9jay4gQW4gZXhhbXBsZTogaWYgbGVuZ3RoIEwgPiBYIHRoaXMgbWVhbnMgdGhhdCB0aGlzIHBhcnRpY3VsYXIgcnVubGlzdAorICogZW50cnkgY29udGFpbnMgYSBibG9jayBvZiBsZW5ndGggWCBhbmQgcGFydCBvZiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgbGVuZ3RoCisgKiBMIC0gWC4gQW5vdGhlciBleGFtcGxlOiBpZiBsZW5ndGggTCA8IFgsIHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0CisgKiB0aGUgYmxvY2sgaXMgY29tcHJlc3NlZCBhcyBpdCBtaWdodCBiZSB0aGF0IHRoZSBsY24gY2hhbmdlcyBpbnNpZGUgdGhlIGJsb2NrCisgKiBhbmQgaGVuY2UgdGhlIGZvbGxvd2luZyBydW5saXN0IGVudHJ5IGRlc2NyaWJlcyB0aGUgY29udGludWF0aW9uIG9mIHRoZQorICogcG90ZW50aWFsbHkgY29tcHJlc3NlZCBibG9jay4gVGhlIGJsb2NrIHdvdWxkIGJlIGNvbXByZXNzZWQgaWYgdGhlCisgKiBmb2xsb3dpbmcgcnVubGlzdCBlbnRyeSBkZXNjcmliZXMgYXQgbGVhc3QgWCAtIEwgc3BhcnNlIGNsdXN0ZXJzLCB0aHVzCisgKiBtYWtpbmcgdXAgdGhlIGNvbXByZXNzaW9uIGJsb2NrIGxlbmd0aCBhcyBkZXNjcmliZWQgaW4gcG9pbnQgMyBhYm92ZS4gKE9mCisgKiBjb3Vyc2UsIHRoZXJlIGNhbiBiZSBzZXZlcmFsIHJ1bmxpc3QgZW50cmllcyB3aXRoIHNtYWxsIGxlbmd0aHMgc28gdGhhdCB0aGUKKyAqIHNwYXJzZSBlbnRyeSBkb2VzIG5vdCBmb2xsb3cgdGhlIGZpcnN0IGRhdGEgY29udGFpbmluZyBlbnRyeSB3aXRoCisgKiBsZW5ndGggPCBYLikKKyAqCisgKiBOT1RFOiBBdCB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGF0dHJpYnV0ZSB2YWx1ZSwgdGhlcmUgbW9zdCBsaWtlbHkgaXMgbm90CisgKiBqdXN0IHRoZSByaWdodCBhbW91bnQgb2YgZGF0YSB0byBtYWtlIHVwIGEgY29tcHJlc3Npb24gYmxvY2ssIHRodXMgdGhpcyBkYXRhCisgKiBpcyBub3QgZXZlbiBhdHRlbXB0ZWQgdG8gYmUgY29tcHJlc3NlZC4gSXQgaXMganVzdCBzdG9yZWQgYXMgaXMsIHVubGVzcworICogdGhlIG51bWJlciBvZiBjbHVzdGVycyBpdCBvY2N1cGllcyBpcyByZWR1Y2VkIHdoZW4gY29tcHJlc3NlZCBpbiB3aGljaCBjYXNlCisgKiBpdCBpcyBzdG9yZWQgYXMgYSBjb21wcmVzc2VkIGNvbXByZXNzaW9uIGJsb2NrLCBjb21wbGV0ZSB3aXRoIHNwYXJzZQorICogY2x1c3RlcnMgYXQgdGhlIGVuZC4KKyAqLworCisvKgorICogRmxhZ3Mgb2YgcmVzaWRlbnQgYXR0cmlidXRlcyAoOC1iaXQpLgorICovCitlbnVtIHsKKwlSRVNJREVOVF9BVFRSX0lTX0lOREVYRUQgPSAweDAxLCAvKiBBdHRyaWJ1dGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBpbmRleAorCQkJCQkgICAgKGhhcyBpbXBsaWNhdGlvbnMgZm9yIGRlbGV0aW5nIGFuZAorCQkJCQkgICAgbW9kaWZ5aW5nIHRoZSBhdHRyaWJ1dGUpLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHU4IFJFU0lERU5UX0FUVFJfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGUgcmVjb3JkIGhlYWRlci4gQWx3YXlzIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMCovCUFUVFJfVFlQRSB0eXBlOwkJLyogVGhlICgzMi1iaXQpIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKy8qICA0Ki8JbGUzMiBsZW5ndGg7CQkvKiBCeXRlIHNpemUgb2YgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlCisJCQkJICAgYXR0cmlidXRlIChhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeSkuCisJCQkJICAgVXNlZCB0byBnZXQgdG8gdGhlIG5leHQgYXR0cmlidXRlLiAqLworLyogIDgqLwl1OCBub25fcmVzaWRlbnQ7CS8qIElmIDAsIGF0dHJpYnV0ZSBpcyByZXNpZGVudC4KKwkJCQkgICBJZiAxLCBhdHRyaWJ1dGUgaXMgbm9uLXJlc2lkZW50LiAqLworLyogIDkqLwl1OCBuYW1lX2xlbmd0aDsJCS8qIFVuaWNvZGUgY2hhcmFjdGVyIHNpemUgb2YgbmFtZSBvZiBhdHRyaWJ1dGUuCisJCQkJICAgMCBpZiB1bm5hbWVkLiAqLworLyogMTAqLwlsZTE2IG5hbWVfb2Zmc2V0OwkvKiBJZiBuYW1lX2xlbmd0aCAhPSAwLCB0aGUgYnl0ZSBvZmZzZXQgdG8gdGhlCisJCQkJICAgYmVnaW5uaW5nIG9mIHRoZSBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZQorCQkJCSAgIHJlY29yZC4gTm90ZSB0aGF0IHRoZSBuYW1lIGlzIHN0b3JlZCBhcyBhCisJCQkJICAgVW5pY29kZSBzdHJpbmcuIFdoZW4gY3JlYXRpbmcsIHBsYWNlIG9mZnNldAorCQkJCSAgIGp1c3QgYXQgdGhlIGVuZCBvZiB0aGUgcmVjb3JkIGhlYWRlci4gVGhlbiwKKwkJCQkgICBmb2xsb3cgd2l0aCBhdHRyaWJ1dGUgdmFsdWUgb3IgbWFwcGluZyBwYWlycworCQkJCSAgIGFycmF5LCByZXNpZGVudCBhbmQgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMKKwkJCQkgICByZXNwZWN0aXZlbHksIGFsaWduaW5nIHRvIGFuIDgtYnl0ZQorCQkJCSAgIGJvdW5kYXJ5LiAqLworLyogMTIqLwlBVFRSX0ZMQUdTIGZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGUuICovCisvKiAxNCovCWxlMTYgaW5zdGFuY2U7CQkvKiBUaGUgaW5zdGFuY2Ugb2YgdGhpcyBhdHRyaWJ1dGUgcmVjb3JkLiBUaGlzCisJCQkJICAgbnVtYmVyIGlzIHVuaXF1ZSB3aXRoaW4gdGhpcyBtZnQgcmVjb3JkIChzZWUKKwkJCQkgICBNRlRfUkVDT1JEL25leHRfYXR0cmlidXRlX2luc3RhbmNlIG5vdGVzIGluCisJCQkJICAgaW4gbWZ0LmggZm9yIG1vcmUgZGV0YWlscykuICovCisvKiAxNiovCXVuaW9uIHsKKwkJLyogUmVzaWRlbnQgYXR0cmlidXRlcy4gKi8KKwkJc3RydWN0IHsKKy8qIDE2ICovCQlsZTMyIHZhbHVlX2xlbmd0aDsvKiBCeXRlIHNpemUgb2YgYXR0cmlidXRlIHZhbHVlLiAqLworLyogMjAgKi8JCWxlMTYgdmFsdWVfb2Zmc2V0Oy8qIEJ5dGUgb2Zmc2V0IG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQkJICAgICB2YWx1ZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKwkJCQkJICAgICBhdHRyaWJ1dGUgcmVjb3JkLiBXaGVuIGNyZWF0aW5nLAorCQkJCQkgICAgIGFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeSBpZiB3ZQorCQkJCQkgICAgIGhhdmUgYSBuYW1lIHByZXNlbnQgYXMgdGhpcyBtaWdodAorCQkJCQkgICAgIG5vdCBoYXZlIGEgbGVuZ3RoIG9mIGEgbXVsdGlwbGUKKwkJCQkJICAgICBvZiA4LWJ5dGVzLiAqLworLyogMjIgKi8JCVJFU0lERU5UX0FUVFJfRkxBR1MgZmxhZ3M7IC8qIFNlZSBhYm92ZS4gKi8KKy8qIDIzICovCQlzOCByZXNlcnZlZDsJICAvKiBSZXNlcnZlZC9hbGlnbm1lbnQgdG8gOC1ieXRlCisJCQkJCSAgICAgYm91bmRhcnkuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSByZXNpZGVudDsKKwkJLyogTm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMuICovCisJCXN0cnVjdCB7CisvKiAxNiovCQkJbGVWQ04gbG93ZXN0X3ZjbjsvKiBMb3dlc3QgdmFsaWQgdmlydHVhbCBjbHVzdGVyIG51bWJlcgorCQkJCWZvciB0aGlzIHBvcnRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvcgorCQkJCTAgaWYgdGhpcyBpcyB0aGUgb25seSBleHRlbnQgKHVzdWFsbHkgdGhlCisJCQkJY2FzZSkuIC0gT25seSB3aGVuIGFuIGF0dHJpYnV0ZSBsaXN0IGlzIHVzZWQKKwkJCQlkb2VzIGxvd2VzdF92Y24gIT0gMCBldmVyIG9jY3VyLiAqLworLyogMjQqLwkJCWxlVkNOIGhpZ2hlc3RfdmNuOy8qIEhpZ2hlc3QgdmFsaWQgdmNuIG9mIHRoaXMgZXh0ZW50IG9mCisJCQkJdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gLSBVc3VhbGx5IHRoZXJlIGlzIG9ubHkgb25lCisJCQkJcG9ydGlvbiwgc28gdGhpcyB1c3VhbGx5IGVxdWFscyB0aGUgYXR0cmlidXRlCisJCQkJdmFsdWUgc2l6ZSBpbiBjbHVzdGVycyBtaW51cyAxLiBDYW4gYmUgLTEgZm9yCisJCQkJemVybyBsZW5ndGggZmlsZXMuIENhbiBiZSAwIGZvciAic2luZ2xlIGV4dGVudCIKKwkJCQlhdHRyaWJ1dGVzLiAqLworLyogMzIqLwkJCWxlMTYgbWFwcGluZ19wYWlyc19vZmZzZXQ7IC8qIEJ5dGUgb2Zmc2V0IGZyb20gdGhlCisJCQkJYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIG1hcHBpbmcgcGFpcnMKKwkJCQlhcnJheSB3aGljaCBjb250YWlucyB0aGUgbWFwcGluZ3MgYmV0d2VlbiB0aGUKKwkJCQl2Y25zIGFuZCB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlcnMgKGxjbnMpLgorCQkJCVdoZW4gY3JlYXRpbmcsIHBsYWNlIHRoaXMgYXQgdGhlIGVuZCBvZiB0aGlzCisJCQkJcmVjb3JkIGhlYWRlciBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIDM0Ki8JCQl1OCBjb21wcmVzc2lvbl91bml0OyAvKiBUaGUgY29tcHJlc3Npb24gdW5pdCBleHByZXNzZWQKKwkJCQlhcyB0aGUgbG9nIHRvIHRoZSBiYXNlIDIgb2YgdGhlIG51bWJlciBvZgorCQkJCWNsdXN0ZXJzIGluIGEgY29tcHJlc3Npb24gdW5pdC4gMCBtZWFucyBub3QKKwkJCQljb21wcmVzc2VkLiAoVGhpcyBlZmZlY3RpdmVseSBsaW1pdHMgdGhlCisJCQkJY29tcHJlc3Npb24gdW5pdCBzaXplIHRvIGJlIGEgcG93ZXIgb2YgdHdvCisJCQkJY2x1c3RlcnMuKSBXaW5OVDQgb25seSB1c2VzIGEgdmFsdWUgb2YgNC4gKi8KKy8qIDM1Ki8JCQl1OCByZXNlcnZlZFs1XTsJCS8qIEFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIFRoZSBzaXplcyBiZWxvdyBhcmUgb25seSB1c2VkIHdoZW4gbG93ZXN0X3ZjbiBpcyB6ZXJvLCBhcyBvdGhlcndpc2UgaXQgd291bGQKKyAgIGJlIGRpZmZpY3VsdCB0byBrZWVwIHRoZW0gdXAtdG8tZGF0ZS4qLworLyogNDAqLwkJCXNsZTY0IGFsbG9jYXRlZF9zaXplOwkvKiBCeXRlIHNpemUgb2YgZGlzayBzcGFjZQorCQkJCWFsbG9jYXRlZCB0byBob2xkIHRoZSBhdHRyaWJ1dGUgdmFsdWUuIEFsd2F5cworCQkJCWlzIGEgbXVsdGlwbGUgb2YgdGhlIGNsdXN0ZXIgc2l6ZS4gV2hlbiBhIGZpbGUKKwkJCQlpcyBjb21wcmVzc2VkLCB0aGlzIGZpZWxkIGlzIGEgbXVsdGlwbGUgb2YgdGhlCisJCQkJY29tcHJlc3Npb24gYmxvY2sgc2l6ZSAoMl5jb21wcmVzc2lvbl91bml0KSBhbmQKKwkJCQlpdCByZXByZXNlbnRzIHRoZSBsb2dpY2FsbHkgYWxsb2NhdGVkIHNwYWNlCisJCQkJcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBvbiBkaXNrIHVzYWdlLiBGb3IgdGhpcworCQkJCXVzZSB0aGUgY29tcHJlc3NlZF9zaXplIChzZWUgYmVsb3cpLiAqLworLyogNDgqLwkJCXNsZTY0IGRhdGFfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQl2YWx1ZS4gQ2FuIGJlIGxhcmdlciB0aGFuIGFsbG9jYXRlZF9zaXplIGlmCisJCQkJYXR0cmlidXRlIHZhbHVlIGlzIGNvbXByZXNzZWQgb3Igc3BhcnNlLiAqLworLyogNTYqLwkJCXNsZTY0IGluaXRpYWxpemVkX3NpemU7CS8qIEJ5dGUgc2l6ZSBvZiBpbml0aWFsaXplZAorCQkJCXBvcnRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gVXN1YWxseSBlcXVhbHMKKwkJCQlkYXRhX3NpemUuICovCisvKiBzaXplb2YodW5jb21wcmVzc2VkIGF0dHIpID0gNjQqLworLyogNjQqLwkJCXNsZTY0IGNvbXByZXNzZWRfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQl2YWx1ZSBhZnRlciBjb21wcmVzc2lvbi4gT25seSBwcmVzZW50IHdoZW4KKwkJCQljb21wcmVzc2VkLiBBbHdheXMgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKwkJCQljbHVzdGVyIHNpemUuIFJlcHJlc2VudHMgdGhlIGFjdHVhbCBhbW91bnQgb2YKKwkJCQlkaXNrIHNwYWNlIGJlaW5nIHVzZWQgb24gdGhlIGRpc2suICovCisvKiBzaXplb2YoY29tcHJlc3NlZCBhdHRyKSA9IDcyKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIG5vbl9yZXNpZGVudDsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgZGF0YTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVFRSX1JFQ09SRDsKKwordHlwZWRlZiBBVFRSX1JFQ09SRCBBVFRSX1JFQzsKKworLyoKKyAqIEZpbGUgYXR0cmlidXRlIGZsYWdzICgzMi1iaXQpLgorICovCitlbnVtIHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIG9ubHkgcHJlc2VudCBpbiB0aGUgU1RBTkRBUkRfSU5GT1JNQVRJT04KKwkgKiBhdHRyaWJ1dGUgKGluIHRoZSBmaWVsZCBmaWxlX2F0dHJpYnV0ZXMpLgorCSAqLworCUZJTEVfQVRUUl9SRUFET05MWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlGSUxFX0FUVFJfSElEREVOCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCUZJTEVfQVRUUl9TWVNURU0JCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisJLyogT2xkIERPUyB2b2xpZC4gVW51c2VkIGluIE5ULgk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpLCAqLworCisJRklMRV9BVFRSX0RJUkVDVE9SWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDEwKSwKKwkvKiBOb3RlLCBGSUxFX0FUVFJfRElSRUNUT1JZIGlzIG5vdCBjb25zaWRlcmVkIHZhbGlkIGluIE5ULiAgSXQgaXMKKwkgICByZXNlcnZlZCBmb3IgdGhlIERPUyBTVUJESVJFQ1RPUlkgZmxhZy4gKi8KKwlGSUxFX0FUVFJfQVJDSElWRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKSwKKwlGSUxFX0FUVFJfREVWSUNFCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwNDApLAorCUZJTEVfQVRUUl9OT1JNQUwJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCksCisKKwlGSUxFX0FUVFJfVEVNUE9SQVJZCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAxMDApLAorCUZJTEVfQVRUUl9TUEFSU0VfRklMRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMjAwKSwKKwlGSUxFX0FUVFJfUkVQQVJTRV9QT0lOVAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwNDAwKSwKKwlGSUxFX0FUVFJfQ09NUFJFU1NFRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwODAwKSwKKworCUZJTEVfQVRUUl9PRkZMSU5FCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDEwMDApLAorCUZJTEVfQVRUUl9OT1RfQ09OVEVOVF9JTkRFWEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMjAwMCksCisJRklMRV9BVFRSX0VOQ1JZUFRFRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDA0MDAwKSwKKworCUZJTEVfQVRUUl9WQUxJRF9GTEFHUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDA3ZmI3KSwKKwkvKiBOb3RlLCBGSUxFX0FUVFJfVkFMSURfRkxBR1MgbWFza3Mgb3V0IHRoZSBvbGQgRE9TIFZvbElkIGFuZCB0aGUKKwkgICBGSUxFX0FUVFJfREVWSUNFIGFuZCBwcmVzZXJ2ZXMgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBtYXNrIGlzIHVzZWQKKwkgICB0byBvYnRhaW4gYWxsIGZsYWdzIHRoYXQgYXJlIHZhbGlkIGZvciByZWFkaW5nLiAqLworCUZJTEVfQVRUUl9WQUxJRF9TRVRfRkxBR1MJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAzMWE3KSwKKwkvKiBOb3RlLCBGSUxFX0FUVFJfVkFMSURfU0VUX0ZMQUdTIG1hc2tzIG91dCB0aGUgb2xkIERPUyBWb2xJZCwgdGhlCisJICAgRl9BX0RFVklDRSwgRl9BX0RJUkVDVE9SWSwgRl9BX1NQQVJTRV9GSUxFLCBGX0FfUkVQQVJTRV9QT0lOVCwKKwkgICBGX0FfQ09NUFJFU1NFRCwgYW5kIEZfQV9FTkNSWVBURUQgYW5kIHByZXNlcnZlcyB0aGUgcmVzdC4gIFRoaXMgbWFzaworCSAgIGlzIHVzZWQgdG8gdG8gb2J0YWluIGFsbCBmbGFncyB0aGF0IGFyZSB2YWxpZCBmb3Igc2V0dGluZy4gKi8KKworCS8qCisJICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgb25seSBwcmVzZW50IGluIHRoZSBGSUxFX05BTUUgYXR0cmlidXRlIChpbgorCSAqIHRoZSBmaWVsZCBmaWxlX2F0dHJpYnV0ZXMpLgorCSAqLworCUZJTEVfQVRUUl9EVVBfRklMRV9OQU1FX0lOREVYX1BSRVNFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDEwMDAwMDAwKSwKKwkvKiBOb3RlLCB0aGlzIGlzIGEgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgZnJvbSB0aGUgbWZ0IHJlY29yZCwKKwkgICB0ZWxsaW5nIHVzIHdoZXRoZXIgdGhpcyBpcyBhIGRpcmVjdG9yeSBvciBub3QsIGkuZS4gd2hldGhlciBpdCBoYXMKKwkgICBhbiBpbmRleCByb290IGF0dHJpYnV0ZSBvciBub3QuICovCisJRklMRV9BVFRSX0RVUF9WSUVXX0lOREVYX1BSRVNFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDIwMDAwMDAwKSwKKwkvKiBOb3RlLCB0aGlzIGlzIGEgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgZnJvbSB0aGUgbWZ0IHJlY29yZCwKKwkgICB0ZWxsaW5nIHVzIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBhIHZpZXcgaW5kZXggcHJlc2VudCAoZWcuIG9iamVjdCBpZAorCSAgIGluZGV4LCBxdW90YSBpbmRleCwgb25lIG9mIHRoZSBzZWN1cml0eSBpbmRleGVzIG9yIHRoZSBlbmNyeXB0aW5nCisJICAgZmlsZSBzeXN0ZW0gcmVsYXRlZCBpbmRleGVzKS4gKi8KK307CisKK3R5cGVkZWYgbGUzMiBGSUxFX0FUVFJfRkxBR1M7CisKKy8qCisgKiBOT1RFIG9uIHRpbWVzIGluIE5URlM6IEFsbCB0aW1lcyBhcmUgaW4gTVMgc3RhbmRhcmQgdGltZSBmb3JtYXQsIGkuZS4gdGhleQorICogYXJlIHRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIDFzdCBKYW51YXJ5IDE2MDEsIDAwOjAwOjAwCisgKiB1bml2ZXJzYWwgY29vcmRpbmF0ZWQgdGltZSAoVVRDKS4gKEluIExpbnV4IHRpbWUgc3RhcnRzIDFzdCBKYW51YXJ5IDE5NzAsCisgKiAwMDowMDowMCBVVEMgYW5kIGlzIHN0b3JlZCBhcyB0aGUgbnVtYmVyIG9mIDEtc2Vjb25kIGludGVydmFscyBzaW5jZSB0aGVuLikKKyAqLworCisvKgorICogQXR0cmlidXRlOiBTdGFuZGFyZCBpbmZvcm1hdGlvbiAoMHgxMCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICogTk9URTogUHJlc2VudCBpbiBhbGwgYmFzZSBmaWxlIHJlY29yZHMgb24gYSB2b2x1bWUuCisgKiBOT1RFOiBUaGVyZSBpcyBjb25mbGljdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiBlYWNoIG9mIHRoZSB0aW1lCisgKgkgZmllbGRzIGJ1dCB0aGUgbWVhbmluZyBhcyBkZWZpbmVkIGJlbG93IGhhcyBiZWVuIHZlcmlmaWVkIHRvIGJlCisgKgkgY29ycmVjdCBieSBwcmFjdGljYWwgZXhwZXJpbWVudGF0aW9uIG9uIFdpbmRvd3MgTlQ0IFNQNmEgYW5kIGlzIGhlbmNlCisgKgkgYXNzdW1lZCB0byBiZSB0aGUgb25lIGFuZCBvbmx5IGNvcnJlY3QgaW50ZXJwcmV0YXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwKi8Jc2xlNjQgY3JlYXRpb25fdGltZTsJCS8qIFRpbWUgZmlsZSB3YXMgY3JlYXRlZC4gVXBkYXRlZCB3aGVuCisJCQkJCSAgIGEgZmlsZW5hbWUgaXMgY2hhbmdlZCg/KS4gKi8KKy8qICA4Ki8Jc2xlNjQgbGFzdF9kYXRhX2NoYW5nZV90aW1lOwkvKiBUaW1lIHRoZSBkYXRhIGF0dHJpYnV0ZSB3YXMgbGFzdAorCQkJCQkgICBtb2RpZmllZC4gKi8KKy8qIDE2Ki8Jc2xlNjQgbGFzdF9tZnRfY2hhbmdlX3RpbWU7CS8qIFRpbWUgdGhpcyBtZnQgcmVjb3JkIHdhcyBsYXN0CisJCQkJCSAgIG1vZGlmaWVkLiAqLworLyogMjQqLwlzbGU2NCBsYXN0X2FjY2Vzc190aW1lOwkJLyogQXBwcm94aW1hdGUgdGltZSB3aGVuIHRoZSBmaWxlIHdhcworCQkJCQkgICBsYXN0IGFjY2Vzc2VkIChvYnZpb3VzbHkgdGhpcyBpcyBub3QKKwkJCQkJICAgdXBkYXRlZCBvbiByZWFkLW9ubHkgdm9sdW1lcykuIEluCisJCQkJCSAgIFdpbmRvd3MgdGhpcyBpcyBvbmx5IHVwZGF0ZWQgd2hlbgorCQkJCQkgICBhY2Nlc3NlZCBpZiBzb21lIHRpbWUgZGVsdGEgaGFzCisJCQkJCSAgIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuIEFsc28sCisJCQkJCSAgIGxhc3QgYWNjZXNzIHRpbWVzIHVwZGF0ZXMgY2FuIGJlCisJCQkJCSAgIGRpc2FibGVkIGFsdG9nZXRoZXIgZm9yIHNwZWVkLiAqLworLyogMzIqLwlGSUxFX0FUVFJfRkxBR1MgZmlsZV9hdHRyaWJ1dGVzOyAvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBmaWxlLiAqLworLyogMzYqLwl1bmlvbiB7CisJLyogTlRGUyAxLjIgKi8KKwkJc3RydWN0IHsKKwkJLyogMzYqLwl1OCByZXNlcnZlZDEyWzEyXTsJLyogUmVzZXJ2ZWQvYWxpZ25tZW50IHRvIDgtYnl0ZQorCQkJCQkJICAgYm91bmRhcnkuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB2MTsKKwkvKiBzaXplb2YoKSA9IDQ4IGJ5dGVzICovCisJLyogTlRGUyAzLnggKi8KKwkJc3RydWN0IHsKKy8qCisgKiBJZiBhIHZvbHVtZSBoYXMgYmVlbiB1cGdyYWRlZCBmcm9tIGEgcHJldmlvdXMgTlRGUyB2ZXJzaW9uLCB0aGVuIHRoZXNlCisgKiBmaWVsZHMgYXJlIHByZXNlbnQgb25seSBpZiB0aGUgZmlsZSBoYXMgYmVlbiBhY2Nlc3NlZCBzaW5jZSB0aGUgdXBncmFkZS4KKyAqIFJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBieSBjb21wYXJpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVzaWRlbnQgYXR0cmlidXRlCisgKiB2YWx1ZS4gSWYgaXQgaXMgNDgsIHRoZW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG1pc3NpbmcuIElmIGl0IGlzIDcyIHRoZW4KKyAqIHRoZSBmaWVsZHMgYXJlIHByZXNlbnQuIE1heWJlIGp1c3QgY2hlY2sgbGlrZSB0aGlzOgorICoJaWYgKHJlc2lkZW50LlZhbHVlTGVuZ3RoIDwgc2l6ZW9mKFNUQU5EQVJEX0lORk9STUFUSU9OKSkgeworICoJCUFzc3VtZSBOVEZTIDEuMi0gZm9ybWF0LgorICoJCUlmICh2b2x1bWUgdmVyc2lvbiBpcyAzLngpCisgKgkJCVVwZ3JhZGUgYXR0cmlidXRlIHRvIE5URlMgMy54IGZvcm1hdC4KKyAqCQllbHNlCisgKgkJCVVzZSBOVEZTIDEuMi0gZm9ybWF0IGZvciBhY2Nlc3MuCisgKgl9IGVsc2UKKyAqCQlVc2UgTlRGUyAzLnggZm9ybWF0IGZvciBhY2Nlc3MuCisgKiBPbmx5IHByb2JsZW0gaXMgdGhhdCBpdCBtaWdodCBiZSBsZWdhbCB0byBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgdG8KKyAqIGFyYml0cmFyaWx5IGxhcmdlIHZhbHVlcyB0aHVzIHNwb2lsaW5nIHRoaXMgY2hlY2suIC0gQnV0IGNoa2RzayBwcm9iYWJseQorICogdmlld3MgdGhhdCBhcyBhIGNvcnJ1cHRpb24sIGFzc3VtaW5nIHRoYXQgaXQgYmVoYXZlcyBsaWtlIHRoaXMgZm9yIGFsbAorICogYXR0cmlidXRlcy4KKyAqLworCQkvKiAzNiovCWxlMzIgbWF4aW11bV92ZXJzaW9uczsJLyogTWF4aW11bSBhbGxvd2VkIHZlcnNpb25zIGZvcgorCQkJCWZpbGUuIFplcm8gaWYgdmVyc2lvbiBudW1iZXJpbmcgaXMgZGlzYWJsZWQuICovCisJCS8qIDQwKi8JbGUzMiB2ZXJzaW9uX251bWJlcjsJLyogVGhpcyBmaWxlJ3MgdmVyc2lvbiAoaWYgYW55KS4KKwkJCQlTZXQgdG8gemVybyBpZiBtYXhpbXVtX3ZlcnNpb25zIGlzIHplcm8uICovCisJCS8qIDQ0Ki8JbGUzMiBjbGFzc19pZDsJCS8qIENsYXNzIGlkIGZyb20gYmlkaXJlY3Rpb25hbAorCQkJCWNsYXNzIGlkIGluZGV4ICg/KS4gKi8KKwkJLyogNDgqLwlsZTMyIG93bmVyX2lkOwkJLyogT3duZXJfaWQgb2YgdGhlIHVzZXIgb3duaW5nCisJCQkJdGhlIGZpbGUuIFRyYW5zbGF0ZSB2aWEgJFEgaW5kZXggaW4gRklMRV9FeHRlbmQKKwkJCQkvJFF1b3RhIHRvIHRoZSBxdW90YSBjb250cm9sIGVudHJ5IGZvciB0aGUgdXNlcgorCQkJCW93bmluZyB0aGUgZmlsZS4gWmVybyBpZiBxdW90YXMgYXJlIGRpc2FibGVkLiAqLworCQkvKiA1MiovCWxlMzIgc2VjdXJpdHlfaWQ7CS8qIFNlY3VyaXR5X2lkIGZvciB0aGUgZmlsZS4KKwkJCQlUcmFuc2xhdGUgdmlhICRTSUkgaW5kZXggYW5kICRTRFMgZGF0YSBzdHJlYW0KKwkJCQlpbiBGSUxFX1NlY3VyZSB0byB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwkJLyogNTYqLwlsZTY0IHF1b3RhX2NoYXJnZWQ7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgY2hhcmdlIHRvCisJCQkJdGhlIHF1b3RhIGZvciBhbGwgc3RyZWFtcyBvZiB0aGUgZmlsZS4gTm90ZTogSXMKKwkJCQl6ZXJvIGlmIHF1b3RhcyBhcmUgZGlzYWJsZWQuICovCisJCS8qIDY0Ki8JbGU2NCB1c247CQkvKiBMYXN0IHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIKKwkJCQlvZiB0aGUgZmlsZS4gVGhpcyBpcyBhIGRpcmVjdCBpbmRleCBpbnRvIHRoZQorCQkJCWNoYW5nZSAoYWthIHVzbikgam91cm5hbCBmaWxlLiBJdCBpcyB6ZXJvIGlmCisJCQkJdGhlIHVzbiBqb3VybmFsIGlzIGRpc2FibGVkLgorCQkJCU5PVEU6IFRvIGRpc2FibGUgdGhlIGpvdXJuYWwgbmVlZCB0byBkZWxldGUKKwkJCQl0aGUgam91cm5hbCBmaWxlIGl0c2VsZiBhbmQgdG8gdGhlbiB3YWxrIHRoZQorCQkJCXdob2xlIG1mdCBhbmQgc2V0IGFsbCBVc24gZW50cmllcyBpbiBhbGwgbWZ0CisJCQkJcmVjb3JkcyB0byB6ZXJvISAoVGhpcyBjYW4gdGFrZSBhIHdoaWxlISkKKwkJCQlUaGUgam91cm5hbCBpcyBGSUxFX0V4dGVuZC8kVXNuSnJubC4gV2luMmsKKwkJCQl3aWxsIHJlY3JlYXRlIHRoZSBqb3VybmFsIGFuZCBpbml0aWF0ZQorCQkJCWxvZ2dpbmcgaWYgbmVjZXNzYXJ5IHdoZW4gbW91bnRpbmcgdGhlCisJCQkJcGFydGl0aW9uLiBUaGlzLCBpbiBjb250cmFzdCB0byBkaXNhYmxpbmcgdGhlCisJCQkJam91cm5hbCBpcyBhIHZlcnkgZmFzdCBwcm9jZXNzLCBzbyB0aGUgdXNlcgorCQkJCXdvbid0IGV2ZW4gbm90aWNlIGl0LiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdjM7CisJLyogc2l6ZW9mKCkgPSA3MiBieXRlcyAoTlRGUyAzLngpICovCisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZlcjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTVEFOREFSRF9JTkZPUk1BVElPTjsKKworLyoKKyAqIEF0dHJpYnV0ZTogQXR0cmlidXRlIGxpc3QgKDB4MjApLgorICoKKyAqIC0gQ2FuIGJlIGVpdGhlciByZXNpZGVudCBvciBub24tcmVzaWRlbnQuCisgKiAtIFZhbHVlIGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUgbGVuZ3RoLCA4LWJ5dGUgYWxpZ25lZCwKKyAqIEFUVFJfTElTVF9FTlRSWSByZWNvcmRzLgorICogLSBUaGUgbGlzdCBpcyBub3QgdGVybWluYXRlZCBieSBhbnl0aGluZyBhdCBhbGwhIFRoZSBvbmx5IHdheSB0byBrbm93IHdoZW4KKyAqIHRoZSBlbmQgaXMgcmVhY2hlZCBpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IG9mZnNldCBhbmQgY29tcGFyZSBpdCB0bworICogdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzaXplLgorICogLSBUaGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGNvbnRhaW5zIG9uZSBlbnRyeSBmb3IgZWFjaCBhdHRyaWJ1dGUgb2YKKyAqIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBsaXN0IGlzIGxvY2F0ZWQsIGV4Y2VwdCBmb3IgdGhlIGxpc3QgYXR0cmlidXRlCisgKiBpdHNlbGYuIFRoZSBsaXN0IGlzIHNvcnRlZDogZmlyc3QgYnkgYXR0cmlidXRlIHR5cGUsIHNlY29uZCBieSBhdHRyaWJ1dGUKKyAqIG5hbWUgKGlmIHByZXNlbnQpLCB0aGlyZCBieSBpbnN0YW5jZSBudW1iZXIuIFRoZSBleHRlbnRzIG9mIG9uZQorICogbm9uLXJlc2lkZW50IGF0dHJpYnV0ZSAoaWYgcHJlc2VudCkgaW1tZWRpYXRlbHkgZm9sbG93IGFmdGVyIHRoZSBpbml0aWFsCisgKiBleHRlbnQuIFRoZXkgYXJlIG9yZGVyZWQgYnkgbG93ZXN0X3ZjbiBhbmQgaGF2ZSB0aGVpciBpbnN0YWNlIHNldCB0byB6ZXJvLgorICogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSB0d28gYXR0cmlidXRlcyB3aXRoIGFsbCBzb3J0aW5nIGtleXMgZXF1YWwuCisgKiAtIEZ1cnRoZXIgcmVzdHJpY3Rpb25zOgorICoJLSBJZiBub3QgcmVzaWRlbnQsIHRoZSB2Y24gdG8gbGNuIG1hcHBpbmcgYXJyYXkgaGFzIHRvIGZpdCBpbnNpZGUgdGhlCisgKgkgIGJhc2UgbWZ0IHJlY29yZC4KKyAqCS0gVGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYSBtYXhpbXVtIHNpemUgb2YgMjU2a2IuIFRoaXMKKyAqCSAgaXMgaW1wb3NlZCBieSB0aGUgV2luZG93cyBjYWNoZSBtYW5hZ2VyLgorICogLSBBdHRyaWJ1dGUgbGlzdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSBhdHRyaWJ1dGVzIG9mIG1mdCByZWNvcmQgZG8gbm90CisgKiBmaXQgaW5zaWRlIHRoZSBtZnQgcmVjb3JkIGRlc3BpdGUgYWxsIGF0dHJpYnV0ZXMgKHRoYXQgY2FuIGJlIG1hZGUKKyAqIG5vbi1yZXNpZGVudCkgaGF2aW5nIGJlZW4gbWFkZSBub24tcmVzaWRlbnQuIFRoaXMgY2FuIGhhcHBlbiBlLmcuIHdoZW46CisgKgktIEZpbGUgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGhhcmQgbGlua3MgKGxvdHMgb2YgZmlsZSBuYW1lCisgKgkgIGF0dHJpYnV0ZXMgcHJlc2VudCkuCisgKgktIFRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IG9mIHNvbWUgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZSBiZWNvbWVzIHNvCisgKgkgIGxhcmdlIGR1ZSB0byBmcmFnbWVudGF0aW9uIHRoYXQgaXQgb3ZlcmZsb3dzIHRoZSBtZnQgcmVjb3JkLgorICoJLSBUaGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyB2ZXJ5IGNvbXBsZXggKG5vdCBhcHBsaWNhYmxlIHRvCisgKgkgIE5URlMgMy4wIHZvbHVtZXMpLgorICoJLSBUaGVyZSBhcmUgbWFueSBuYW1lZCBzdHJlYW1zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMCovCUFUVFJfVFlQRSB0eXBlOwkJLyogVHlwZSBvZiByZWZlcmVuY2VkIGF0dHJpYnV0ZS4gKi8KKy8qICA0Ki8JbGUxNiBsZW5ndGg7CQkvKiBCeXRlIHNpemUgb2YgdGhpcyBlbnRyeSAoOC1ieXRlIGFsaWduZWQpLiAqLworLyogIDYqLwl1OCBuYW1lX2xlbmd0aDsJCS8qIFNpemUgaW4gVW5pY29kZSBjaGFycyBvZiB0aGUgbmFtZSBvZiB0aGUKKwkJCQkgICBhdHRyaWJ1dGUgb3IgMCBpZiB1bm5hbWVkLiAqLworLyogIDcqLwl1OCBuYW1lX29mZnNldDsJCS8qIEJ5dGUgb2Zmc2V0IHRvIGJlZ2lubmluZyBvZiBhdHRyaWJ1dGUgbmFtZQorCQkJCSAgIChhbHdheXMgc2V0IHRoaXMgdG8gd2hlcmUgdGhlIG5hbWUgd291bGQKKwkJCQkgICBzdGFydCBldmVuIGlmIHVubmFtZWQpLiAqLworLyogIDgqLwlsZVZDTiBsb3dlc3RfdmNuOwkvKiBMb3dlc3QgdmlydHVhbCBjbHVzdGVyIG51bWJlciBvZiB0aGlzIHBvcnRpb24KKwkJCQkgICBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLiBUaGlzIGlzIHVzdWFsbHkgMC4gSXQKKwkJCQkgICBpcyBub24temVybyBmb3IgdGhlIGNhc2Ugd2hlcmUgb25lIGF0dHJpYnV0ZQorCQkJCSAgIGRvZXMgbm90IGZpdCBpbnRvIG9uZSBtZnQgcmVjb3JkIGFuZCB0aHVzCisJCQkJICAgc2V2ZXJhbCBtZnQgcmVjb3JkcyBhcmUgYWxsb2NhdGVkIHRvIGhvbGQKKwkJCQkgICB0aGlzIGF0dHJpYnV0ZS4gSW4gdGhlIGxhdHRlciBjYXNlLCBlYWNoIG1mdAorCQkJCSAgIHJlY29yZCBob2xkcyBvbmUgZXh0ZW50IG9mIHRoZSBhdHRyaWJ1dGUgYW5kCisJCQkJICAgdGhlcmUgaXMgb25lIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGZvciBlYWNoCisJCQkJICAgZXh0ZW50LiBOT1RFOiBUaGlzIGlzIERFRklOSVRFTFkgYSBzaWduZWQKKwkJCQkgICB2YWx1ZSEgVGhlIHdpbmRvd3MgZHJpdmVyIHVzZXMgY21wLCBmb2xsb3dlZAorCQkJCSAgIGJ5IGpnIHdoZW4gY29tcGFyaW5nIHRoaXMsIHRodXMgaXQgdHJlYXRzIGl0CisJCQkJICAgYXMgc2lnbmVkLiAqLworLyogMTYqLwlsZU1GVF9SRUYgbWZ0X3JlZmVyZW5jZTsvKiBUaGUgcmVmZXJlbmNlIG9mIHRoZSBtZnQgcmVjb3JkIGhvbGRpbmcKKwkJCQkgICB0aGUgQVRUUl9SRUNPUkQgZm9yIHRoaXMgcG9ydGlvbiBvZiB0aGUKKwkJCQkgICBhdHRyaWJ1dGUgdmFsdWUuICovCisvKiAyNCovCWxlMTYgaW5zdGFuY2U7CQkvKiBJZiBsb3dlc3RfdmNuID0gMCwgdGhlIGluc3RhbmNlIG9mIHRoZQorCQkJCSAgIGF0dHJpYnV0ZSBiZWluZyByZWZlcmVuY2VkOyBvdGhlcndpc2UgMC4gKi8KKy8qIDI2Ki8JbnRmc2NoYXIgbmFtZVswXTsJLyogVXNlIHdoZW4gY3JlYXRpbmcgb25seS4gV2hlbiByZWFkaW5nIHVzZQorCQkJCSAgIG5hbWVfb2Zmc2V0IHRvIGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlCisJCQkJICAgbmFtZS4gKi8KKy8qIHNpemVvZigpID0gMjYgKyAoYXR0cmlidXRlX25hbWVfbGVuZ3RoICogMikgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVFRSX0xJU1RfRU5UUlk7CisKKy8qCisgKiBUaGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBmb3IgYSBmaWxlIG5hbWUuCisgKi8KKyNkZWZpbmUgTUFYSU1VTV9GSUxFX05BTUVfTEVOR1RICTI1NQorCisvKgorICogUG9zc2libGUgbmFtZXNwYWNlcyBmb3IgZmlsZW5hbWVzIGluIG50ZnMgKDgtYml0KS4KKyAqLworZW51bSB7CisJRklMRV9OQU1FX1BPU0lYCQk9IDB4MDAsCisJLyogVGhpcyBpcyB0aGUgbGFyZ2VzdCBuYW1lc3BhY2UuIEl0IGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBhbGxvd3MgYWxsCisJICAgVW5pY29kZSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3I6ICdcMCcgYW5kICcvJy4gIEJld2FyZSB0aGF0IGluCisJICAgV2luTlQvMmsgZmlsZXMgd2hpY2ggZWcgaGF2ZSB0aGUgc2FtZSBuYW1lIGV4Y2VwdCBmb3IgdGhlaXIgY2FzZQorCSAgIHdpbGwgbm90IGJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHN0YW5kYXJkIHV0aWxpdGllcyBhbmQgdGh1cyBhICJkZWwKKwkgICBmaWxlbmFtZSIgd2lsbCBkZWxldGUgYm90aCAiZmlsZW5hbWUiIGFuZCAiZmlsZU5hbWUiIHdpdGhvdXQKKwkgICB3YXJuaW5nLiAqLworCUZJTEVfTkFNRV9XSU4zMgkJPSAweDAxLAorCS8qIFRoZSBzdGFuZGFyZCBXaW5OVC8yayBOVEZTIGxvbmcgZmlsZW5hbWVzLiBDYXNlIGluc2Vuc2l0aXZlLiAgQWxsCisJICAgVW5pY29kZSBjaGFycyBleGNlcHQ6ICdcMCcsICciJywgJyonLCAnLycsICc6JywgJzwnLCAnPicsICc/JywgJ1wnLAorCSAgIGFuZCAnfCcuICBGdXJ0aGVyLCBuYW1lcyBjYW5ub3QgZW5kIHdpdGggYSAnLicgb3IgYSBzcGFjZS4gKi8KKwlGSUxFX05BTUVfRE9TCQk9IDB4MDIsCisJLyogVGhlIHN0YW5kYXJkIERPUyBmaWxlbmFtZXMgKDguMyBmb3JtYXQpLiBVcHBlcmNhc2Ugb25seS4gIEFsbCA4LWJpdAorCSAgIGNoYXJhY3RlcnMgZ3JlYXRlciBzcGFjZSwgZXhjZXB0OiAnIicsICcqJywgJysnLCAnLCcsICcvJywgJzonLCAnOycsCisJICAgJzwnLCAnPScsICc+JywgJz8nLCBhbmQgJ1wnLiAqLworCUZJTEVfTkFNRV9XSU4zMl9BTkRfRE9TCT0gMHgwMywKKwkvKiAzIG1lYW5zIHRoYXQgYm90aCB0aGUgV2luMzIgYW5kIHRoZSBET1MgZmlsZW5hbWVzIGFyZSBpZGVudGljYWwgYW5kCisJICAgaGVuY2UgaGF2ZSBiZWVuIHNhdmVkIGluIHRoaXMgc2luZ2xlIGZpbGVuYW1lIHJlY29yZC4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiB1OCBGSUxFX05BTUVfVFlQRV9GTEFHUzsKKworLyoKKyAqIEF0dHJpYnV0ZTogRmlsZW5hbWUgKDB4MzApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqIE5PVEU6IEFsbCBmaWVsZHMsIGV4Y2VwdCB0aGUgcGFyZW50X2RpcmVjdG9yeSwgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZQorICoJIGZpbGVuYW1lIGlzIGNoYW5nZWQuIFVudGlsIHRoZW4sIHRoZXkganVzdCBiZWNvbWUgb3V0IG9mIHN5bmMgd2l0aAorICoJIHJlYWxpdHkgYW5kIHRoZSBtb3JlIHVwIHRvIGRhdGUgdmFsdWVzIGFyZSBwcmVzZW50IGluIHRoZSBzdGFuZGFyZAorICoJIGluZm9ybWF0aW9uIGF0dHJpYnV0ZS4KKyAqIE5PVEU6IFRoZXJlIGlzIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIGVhY2ggb2YgdGhlIHRpbWUKKyAqCSBmaWVsZHMgYnV0IHRoZSBtZWFuaW5nIGFzIGRlZmluZWQgYmVsb3cgaGFzIGJlZW4gdmVyaWZpZWQgdG8gYmUKKyAqCSBjb3JyZWN0IGJ5IHByYWN0aWNhbCBleHBlcmltZW50YXRpb24gb24gV2luZG93cyBOVDQgU1A2YSBhbmQgaXMgaGVuY2UKKyAqCSBhc3N1bWVkIHRvIGJlIHRoZSBvbmUgYW5kIG9ubHkgY29ycmVjdCBpbnRlcnByZXRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypoZXggb2ZzKi8KKy8qICAwKi8JbGVNRlRfUkVGIHBhcmVudF9kaXJlY3Rvcnk7CS8qIERpcmVjdG9yeSB0aGlzIGZpbGVuYW1lIGlzCisJCQkJCSAgIHJlZmVyZW5jZWQgZnJvbS4gKi8KKy8qICA4Ki8Jc2xlNjQgY3JlYXRpb25fdGltZTsJCS8qIFRpbWUgZmlsZSB3YXMgY3JlYXRlZC4gKi8KKy8qIDEwKi8Jc2xlNjQgbGFzdF9kYXRhX2NoYW5nZV90aW1lOwkvKiBUaW1lIHRoZSBkYXRhIGF0dHJpYnV0ZSB3YXMgbGFzdAorCQkJCQkgICBtb2RpZmllZC4gKi8KKy8qIDE4Ki8Jc2xlNjQgbGFzdF9tZnRfY2hhbmdlX3RpbWU7CS8qIFRpbWUgdGhpcyBtZnQgcmVjb3JkIHdhcyBsYXN0CisJCQkJCSAgIG1vZGlmaWVkLiAqLworLyogMjAqLwlzbGU2NCBsYXN0X2FjY2Vzc190aW1lOwkJLyogVGltZSB0aGlzIG1mdCByZWNvcmQgd2FzIGxhc3QKKwkJCQkJICAgYWNjZXNzZWQuICovCisvKiAyOCovCXNsZTY0IGFsbG9jYXRlZF9zaXplOwkJLyogQnl0ZSBzaXplIG9mIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlCisJCQkJCSAgIGRhdGEgYXR0cmlidXRlLiBOT1RFOiBJcyBhIG11bHRpcGxlCisJCQkJCSAgIG9mIHRoZSBjbHVzdGVyIHNpemUuICovCisvKiAzMCovCXNsZTY0IGRhdGFfc2l6ZTsJCS8qIEJ5dGUgc2l6ZSBvZiBhY3R1YWwgZGF0YSBpbiBkYXRhCisJCQkJCSAgIGF0dHJpYnV0ZS4gKi8KKy8qIDM4Ki8JRklMRV9BVFRSX0ZMQUdTIGZpbGVfYXR0cmlidXRlczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgZmlsZS4gKi8KKy8qIDNjKi8JdW5pb24geworCS8qIDNjKi8Jc3RydWN0IHsKKwkJLyogM2MqLwlsZTE2IHBhY2tlZF9lYV9zaXplOwkvKiBTaXplIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRvCisJCQkJCQkgICBwYWNrIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzCisJCQkJCQkgICAoRUFzKSwgaWYgc3VjaCBhcmUgcHJlc2VudC4qLworCQkvKiAzZSovCWxlMTYgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCBmb3IgYWxpZ25tZW50LiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgZWE7CisJLyogM2MqLwlzdHJ1Y3QgeworCQkvKiAzYyovCWxlMzIgcmVwYXJzZV9wb2ludF90YWc7CS8qIFR5cGUgb2YgcmVwYXJzZSBwb2ludCwKKwkJCQkJCSAgIHByZXNlbnQgb25seSBpbiByZXBhcnNlCisJCQkJCQkgICBwb2ludHMgYW5kIG9ubHkgaWYgdGhlcmUgYXJlCisJCQkJCQkgICBubyBFQXMuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBycDsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdHlwZTsKKy8qIDQwKi8JdTggZmlsZV9uYW1lX2xlbmd0aDsJCQkvKiBMZW5ndGggb2YgZmlsZSBuYW1lIGluCisJCQkJCQkgICAoVW5pY29kZSkgY2hhcmFjdGVycy4gKi8KKy8qIDQxKi8JRklMRV9OQU1FX1RZUEVfRkxBR1MgZmlsZV9uYW1lX3R5cGU7CS8qIE5hbWVzcGFjZSBvZiB0aGUgZmlsZSBuYW1lLiovCisvKiA0MiovCW50ZnNjaGFyIGZpbGVfbmFtZVswXTsJCQkvKiBGaWxlIG5hbWUgaW4gVW5pY29kZS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBGSUxFX05BTUVfQVRUUjsKKworLyoKKyAqIEdVSUQgc3RydWN0dXJlcyBzdG9yZSBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllcnMgKEdVSUQpLiBBIEdVSUQgaXMgYQorICogMTI4LWJpdCB2YWx1ZSBjb25zaXN0aW5nIG9mIG9uZSBncm91cCBvZiBlaWdodCBoZXhhZGVjaW1hbCBkaWdpdHMsIGZvbGxvd2VkCisgKiBieSB0aHJlZSBncm91cHMgb2YgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMgZWFjaCwgZm9sbG93ZWQgYnkgb25lIGdyb3VwIG9mCisgKiB0d2VsdmUgaGV4YWRlY2ltYWwgZGlnaXRzLiBHVUlEcyBhcmUgTWljcm9zb2Z0J3MgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBkaXN0cmlidXRlZCBjb21wdXRpbmcgZW52aXJvbm1lbnQgKERDRSkgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpLgorICogRXhhbXBsZSBvZiBhIEdVSUQ6CisgKgkxRjAxMDc2OC01QTczLUJDOTEtMDAxMEE1MjIxNkE3CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIGRhdGExOwkvKiBUaGUgZmlyc3QgZWlnaHQgaGV4YWRlY2ltYWwgZGlnaXRzIG9mIHRoZSBHVUlELiAqLworCWxlMTYgZGF0YTI7CS8qIFRoZSBmaXJzdCBncm91cCBvZiBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cy4gKi8KKwlsZTE2IGRhdGEzOwkvKiBUaGUgc2Vjb25kIGdyb3VwIG9mIGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzLiAqLworCXU4IGRhdGE0WzhdOwkvKiBUaGUgZmlyc3QgdHdvIGJ5dGVzIGFyZSB0aGUgdGhpcmQgZ3JvdXAgb2YgZm91cgorCQkJICAgaGV4YWRlY2ltYWwgZGlnaXRzLiBUaGUgcmVtYWluaW5nIHNpeCBieXRlcyBhcmUgdGhlCisJCQkgICBmaW5hbCAxMiBoZXhhZGVjaW1hbCBkaWdpdHMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgR1VJRDsKKworLyoKKyAqIEZJTEVfRXh0ZW5kLyRPYmpJZCBjb250YWlucyBhbiBpbmRleCBuYW1lZCAkTy4gVGhpcyBpbmRleCBjb250YWlucyBhbGwKKyAqIG9iamVjdF9pZHMgcHJlc2VudCBvbiB0aGUgdm9sdW1lIGFzIHRoZSBpbmRleCBrZXlzIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogbWZ0X3JlY29yZCBudW1iZXJzIGFzIHRoZSBpbmRleCBlbnRyeSBkYXRhIHBhcnRzLiBUaGUgZGF0YSBwYXJ0IChkZWZpbmVkCisgKiBiZWxvdykgYWxzbyBjb250YWlucyB0aHJlZSBvdGhlciBvYmplY3RfaWRzOgorICoJYmlydGhfdm9sdW1lX2lkIC0gb2JqZWN0X2lkIG9mIEZJTEVfVm9sdW1lIG9uIHdoaWNoIHRoZSBmaWxlIHdhcyBmaXJzdAorICoJCQkgIGNyZWF0ZWQuIE9wdGlvbmFsIChpLmUuIGNhbiBiZSB6ZXJvKS4KKyAqCWJpcnRoX29iamVjdF9pZCAtIG9iamVjdF9pZCBvZiBmaWxlIHdoZW4gaXQgd2FzIGZpcnN0IGNyZWF0ZWQuIFVzdWFsbHkKKyAqCQkJICBlcXVhbHMgdGhlIG9iamVjdF9pZC4gT3B0aW9uYWwgKGkuZS4gY2FuIGJlIHplcm8pLgorICoJZG9tYWluX2lkCS0gUmVzZXJ2ZWQgKGFsd2F5cyB6ZXJvKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlTUZUX1JFRiBtZnRfcmVmZXJlbmNlOy8qIE1mdCByZWNvcmQgY29udGFpbmluZyB0aGUgb2JqZWN0X2lkIGluCisJCQkJICAgdGhlIGluZGV4IGVudHJ5IGtleS4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlHVUlEIGJpcnRoX3ZvbHVtZV9pZDsKKwkJCUdVSUQgYmlydGhfb2JqZWN0X2lkOworCQkJR1VJRCBkb21haW5faWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBvcmlnaW47CisJCXU4IGV4dGVuZGVkX2luZm9bNDhdOworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBvcHQ7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgT0JKX0lEX0lOREVYX0RBVEE7CisKKy8qCisgKiBBdHRyaWJ1dGU6IE9iamVjdCBpZCAoTlRGUyAzLjArKSAoMHg0MCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJR1VJRCBvYmplY3RfaWQ7CQkJCS8qIFVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGUKKwkJCQkJCSAgIGZpbGUuKi8KKwkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFRoZSBhdHRyaWJ1dGUgdmFsdWUgc2l6ZSBpcyAxNgorCSAgIGJ5dGVzLCBpLmUuIHNpemVvZihHVUlEKSwgaWYgdGhlc2UgYXJlIG5vdCBwcmVzZW50IGF0IGFsbC4gTm90ZSwKKwkgICB0aGUgZW50cmllcyBjYW4gYmUgcHJlc2VudCBidXQgb25lIG9yIG1vcmUgKG9yIGFsbCkgY2FuIGJlIHplcm8KKwkgICBtZWFuaW5nIHRoYXQgdGhhdCBwYXJ0aWN1bGFyIHZhbHVlKHMpIGlzKGFyZSkgbm90IGRlZmluZWQuICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJR1VJRCBiaXJ0aF92b2x1bWVfaWQ7CS8qIFVuaXF1ZSBpZCBvZiB2b2x1bWUgb24gd2hpY2gKKwkJCQkJCSAgIHRoZSBmaWxlIHdhcyBmaXJzdCBjcmVhdGVkLiovCisJCQlHVUlEIGJpcnRoX29iamVjdF9pZDsJLyogVW5pcXVlIGlkIG9mIGZpbGUgd2hlbiBpdCB3YXMKKwkJCQkJCSAgIGZpcnN0IGNyZWF0ZWQuICovCisJCQlHVUlEIGRvbWFpbl9pZDsJCS8qIFJlc2VydmVkLCB6ZXJvLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgb3JpZ2luOworCQl1OCBleHRlbmRlZF9pbmZvWzQ4XTsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgb3B0OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE9CSkVDVF9JRF9BVFRSOworCisvKgorICogVGhlIHByZS1kZWZpbmVkIElERU5USUZJRVJfQVVUSE9SSVRJRVMgdXNlZCBhcyBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgaW4KKyAqIHRoZSBTSUQgc3RydWN0dXJlIChzZWUgYmVsb3cpLgorICovCisvL3R5cGVkZWYgZW51bSB7CQkJCQkvKiBTSUQgc3RyaW5nIHByZWZpeC4gKi8KKy8vCVNFQ1VSSVRZX05VTExfU0lEX0FVVEhPUklUWQk9IHswLCAwLCAwLCAwLCAwLCAwfSwJLyogUy0xLTAgKi8KKy8vCVNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFkJPSB7MCwgMCwgMCwgMCwgMCwgMX0sCS8qIFMtMS0xICovCisvLwlTRUNVUklUWV9MT0NBTF9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDJ9LAkvKiBTLTEtMiAqLworLy8JU0VDVVJJVFlfQ1JFQVRPUl9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDN9LAkvKiBTLTEtMyAqLworLy8JU0VDVVJJVFlfTk9OX1VOSVFVRV9BVVRIT1JJVFkJPSB7MCwgMCwgMCwgMCwgMCwgNH0sCS8qIFMtMS00ICovCisvLwlTRUNVUklUWV9OVF9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDV9LAkvKiBTLTEtNSAqLworLy99IElERU5USUZJRVJfQVVUSE9SSVRJRVM7CisKKy8qCisgKiBUaGVzZSByZWxhdGl2ZSBpZGVudGlmaWVycyAoUklEcykgYXJlIHVzZWQgd2l0aCB0aGUgYWJvdmUgaWRlbnRpZmllcgorICogYXV0aG9yaXRpZXMgdG8gbWFrZSB1cCB1bml2ZXJzYWwgd2VsbC1rbm93biBTSURzLgorICoKKyAqIE5vdGU6IFRoZSByZWxhdGl2ZSBpZGVudGlmaWVyIChSSUQpIHJlZmVycyB0byB0aGUgcG9ydGlvbiBvZiBhIFNJRCwgd2hpY2gKKyAqIGlkZW50aWZpZXMgYSB1c2VyIG9yIGdyb3VwIGluIHJlbGF0aW9uIHRvIHRoZSBhdXRob3JpdHkgdGhhdCBpc3N1ZWQgdGhlIFNJRC4KKyAqIEZvciBleGFtcGxlLCB0aGUgdW5pdmVyc2FsIHdlbGwta25vd24gU0lEIENyZWF0b3IgT3duZXIgSUQgKFMtMS0zLTApIGlzCisgKiBtYWRlIHVwIG9mIHRoZSBpZGVudGlmaWVyIGF1dGhvcml0eSBTRUNVUklUWV9DUkVBVE9SX1NJRF9BVVRIT1JJVFkgKDMpIGFuZAorICogdGhlIHJlbGF0aXZlIGlkZW50aWZpZXIgU0VDVVJJVFlfQ1JFQVRPUl9PV05FUl9SSUQgKDApLgorICovCit0eXBlZGVmIGVudW0gewkJCQkJLyogSWRlbnRpZmllciBhdXRob3JpdHkuICovCisJU0VDVVJJVFlfTlVMTF9SSUQJCSAgPSAwLAkvKiBTLTEtMCAqLworCVNFQ1VSSVRZX1dPUkxEX1JJRAkJICA9IDAsCS8qIFMtMS0xICovCisJU0VDVVJJVFlfTE9DQUxfUklECQkgID0gMCwJLyogUy0xLTIgKi8KKworCVNFQ1VSSVRZX0NSRUFUT1JfT1dORVJfUklECSAgPSAwLAkvKiBTLTEtMyAqLworCVNFQ1VSSVRZX0NSRUFUT1JfR1JPVVBfUklECSAgPSAxLAkvKiBTLTEtMyAqLworCisJU0VDVVJJVFlfQ1JFQVRPUl9PV05FUl9TRVJWRVJfUklEID0gMiwJLyogUy0xLTMgKi8KKwlTRUNVUklUWV9DUkVBVE9SX0dST1VQX1NFUlZFUl9SSUQgPSAzLAkvKiBTLTEtMyAqLworCisJU0VDVVJJVFlfRElBTFVQX1JJRAkJICA9IDEsCisJU0VDVVJJVFlfTkVUV09SS19SSUQJCSAgPSAyLAorCVNFQ1VSSVRZX0JBVENIX1JJRAkJICA9IDMsCisJU0VDVVJJVFlfSU5URVJBQ1RJVkVfUklECSAgPSA0LAorCVNFQ1VSSVRZX1NFUlZJQ0VfUklECQkgID0gNiwKKwlTRUNVUklUWV9BTk9OWU1PVVNfTE9HT05fUklECSAgPSA3LAorCVNFQ1VSSVRZX1BST1hZX1JJRAkJICA9IDgsCisJU0VDVVJJVFlfRU5URVJQUklTRV9DT05UUk9MTEVSU19SSUQ9OSwKKwlTRUNVUklUWV9TRVJWRVJfTE9HT05fUklECSAgPSA5LAorCVNFQ1VSSVRZX1BSSU5DSVBBTF9TRUxGX1JJRAkgID0gMHhhLAorCVNFQ1VSSVRZX0FVVEhFTlRJQ0FURURfVVNFUl9SSUQJICA9IDB4YiwKKwlTRUNVUklUWV9SRVNUUklDVEVEX0NPREVfUklECSAgPSAweGMsCisJU0VDVVJJVFlfVEVSTUlOQUxfU0VSVkVSX1JJRAkgID0gMHhkLAorCisJU0VDVVJJVFlfTE9HT05fSURTX1JJRAkJICA9IDUsCisJU0VDVVJJVFlfTE9HT05fSURTX1JJRF9DT1VOVAkgID0gMywKKworCVNFQ1VSSVRZX0xPQ0FMX1NZU1RFTV9SSUQJICA9IDB4MTIsCisKKwlTRUNVUklUWV9OVF9OT05fVU5JUVVFCQkgID0gMHgxNSwKKworCVNFQ1VSSVRZX0JVSUxUSU5fRE9NQUlOX1JJRAkgID0gMHgyMCwKKworCS8qCisJICogV2VsbC1rbm93biBkb21haW4gcmVsYXRpdmUgc3ViLWF1dGhvcml0eSB2YWx1ZXMgKFJJRHMpLgorCSAqLworCisJLyogVXNlcnMuICovCisJRE9NQUlOX1VTRVJfUklEX0FETUlOCQkgID0gMHgxZjQsCisJRE9NQUlOX1VTRVJfUklEX0dVRVNUCQkgID0gMHgxZjUsCisJRE9NQUlOX1VTRVJfUklEX0tSQlRHVAkJICA9IDB4MWY2LAorCisJLyogR3JvdXBzLiAqLworCURPTUFJTl9HUk9VUF9SSURfQURNSU5TCQkgID0gMHgyMDAsCisJRE9NQUlOX0dST1VQX1JJRF9VU0VSUwkJICA9IDB4MjAxLAorCURPTUFJTl9HUk9VUF9SSURfR1VFU1RTCQkgID0gMHgyMDIsCisJRE9NQUlOX0dST1VQX1JJRF9DT01QVVRFUlMJICA9IDB4MjAzLAorCURPTUFJTl9HUk9VUF9SSURfQ09OVFJPTExFUlMJICA9IDB4MjA0LAorCURPTUFJTl9HUk9VUF9SSURfQ0VSVF9BRE1JTlMJICA9IDB4MjA1LAorCURPTUFJTl9HUk9VUF9SSURfU0NIRU1BX0FETUlOUwkgID0gMHgyMDYsCisJRE9NQUlOX0dST1VQX1JJRF9FTlRFUlBSSVNFX0FETUlOUz0gMHgyMDcsCisJRE9NQUlOX0dST1VQX1JJRF9QT0xJQ1lfQURNSU5TCSAgPSAweDIwOCwKKworCS8qIEFsaWFzZXMuICovCisJRE9NQUlOX0FMSUFTX1JJRF9BRE1JTlMJCSAgPSAweDIyMCwKKwlET01BSU5fQUxJQVNfUklEX1VTRVJTCQkgID0gMHgyMjEsCisJRE9NQUlOX0FMSUFTX1JJRF9HVUVTVFMJCSAgPSAweDIyMiwKKwlET01BSU5fQUxJQVNfUklEX1BPV0VSX1VTRVJTCSAgPSAweDIyMywKKworCURPTUFJTl9BTElBU19SSURfQUNDT1VOVF9PUFMJICA9IDB4MjI0LAorCURPTUFJTl9BTElBU19SSURfU1lTVEVNX09QUwkgID0gMHgyMjUsCisJRE9NQUlOX0FMSUFTX1JJRF9QUklOVF9PUFMJICA9IDB4MjI2LAorCURPTUFJTl9BTElBU19SSURfQkFDS1VQX09QUwkgID0gMHgyMjcsCisKKwlET01BSU5fQUxJQVNfUklEX1JFUExJQ0FUT1IJICA9IDB4MjI4LAorCURPTUFJTl9BTElBU19SSURfUkFTX1NFUlZFUlMJICA9IDB4MjI5LAorCURPTUFJTl9BTElBU19SSURfUFJFVzJLQ09NUEFDQ0VTUyA9IDB4MjJhLAorfSBSRUxBVElWRV9JREVOVElGSUVSUzsKKworLyoKKyAqIFRoZSB1bml2ZXJzYWwgd2VsbC1rbm93biBTSURzOgorICoKKyAqCU5VTExfU0lECQkJUy0xLTAtMAorICoJV09STERfU0lECQkJUy0xLTEtMAorICoJTE9DQUxfU0lECQkJUy0xLTItMAorICoJQ1JFQVRPUl9PV05FUl9TSUQJCVMtMS0zLTAKKyAqCUNSRUFUT1JfR1JPVVBfU0lECQlTLTEtMy0xCisgKglDUkVBVE9SX09XTkVSX1NFUlZFUl9TSUQJUy0xLTMtMgorICoJQ1JFQVRPUl9HUk9VUF9TRVJWRVJfU0lECVMtMS0zLTMKKyAqCisgKgkoTm9uLXVuaXF1ZSBJRHMpCQlTLTEtNAorICoKKyAqIE5UIHdlbGwta25vd24gU0lEczoKKyAqCisgKglOVF9BVVRIT1JJVFlfU0lECVMtMS01CisgKglESUFMVVBfU0lECQlTLTEtNS0xCisgKgorICoJTkVUV09SRF9TSUQJCVMtMS01LTIKKyAqCUJBVENIX1NJRAkJUy0xLTUtMworICoJSU5URVJBQ1RJVkVfU0lECQlTLTEtNS00CisgKglTRVJWSUNFX1NJRAkJUy0xLTUtNgorICoJQU5PTllNT1VTX0xPR09OX1NJRAlTLTEtNS03CQkoYWthIG51bGwgbG9nb24gc2Vzc2lvbikKKyAqCVBST1hZX1NJRAkJUy0xLTUtOAorICoJU0VSVkVSX0xPR09OX1NJRAlTLTEtNS05CQkoYWthIGRvbWFpbiBjb250cm9sbGVyIGFjY291bnQpCisgKglTRUxGX1NJRAkJUy0xLTUtMTAJKHNlbGYgUklEKQorICoJQVVUSEVOVElDQVRFRF9VU0VSX1NJRAlTLTEtNS0xMQorICoJUkVTVFJJQ1RFRF9DT0RFX1NJRAlTLTEtNS0xMgkocnVubmluZyByZXN0cmljdGVkIGNvZGUpCisgKglURVJNSU5BTF9TRVJWRVJfU0lECVMtMS01LTEzCShydW5uaW5nIG9uIHRlcm1pbmFsIHNlcnZlcikKKyAqCisgKgkoTG9nb24gSURzKQkJUy0xLTUtNS1YLVkKKyAqCisgKgkoTlQgbm9uLXVuaXF1ZSBJRHMpCVMtMS01LTB4MTUtLi4uCisgKgorICoJKEJ1aWx0LWluIGRvbWFpbikJUy0xLTUtMHgyMAorICovCisKKy8qCisgKiBUaGUgU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZIGlzIGEgNDgtYml0IHZhbHVlIHVzZWQgaW4gdGhlIFNJRCBzdHJ1Y3R1cmUuCisgKgorICogTk9URTogVGhpcyBpcyBzdG9yZWQgYXMgYSBiaWcgZW5kaWFuIG51bWJlciwgaGVuY2UgdGhlIGhpZ2hfcGFydCBjb21lcworICogYmVmb3JlIHRoZSBsb3dfcGFydC4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHsKKwkJdTE2IGhpZ2hfcGFydDsJLyogSGlnaCAxNi1iaXRzLiAqLworCQl1MzIgbG93X3BhcnQ7CS8qIExvdyAzMi1iaXRzLiAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBwYXJ0czsKKwl1OCB2YWx1ZVs2XTsJCS8qIFZhbHVlIGFzIGluZGl2aWR1YWwgYnl0ZXMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZOworCisvKgorICogVGhlIFNJRCBzdHJ1Y3R1cmUgaXMgYSB2YXJpYWJsZS1sZW5ndGggc3RydWN0dXJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkKKyAqIHVzZXJzIG9yIGdyb3Vwcy4gU0lEIHN0YW5kcyBmb3Igc2VjdXJpdHkgaWRlbnRpZmllci4KKyAqCisgKiBUaGUgc3RhbmRhcmQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgU0lEIGlzIG9mIHRoZSBmb3JtOgorICoJUy1SLUktUy1TLi4uCisgKiBXaGVyZToKKyAqICAgIC0gVGhlIGZpcnN0ICJTIiBpcyB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgJ1MnIGlkZW50aWZ5aW5nIHRoZSBmb2xsb3dpbmcKKyAqCWRpZ2l0cyBhcyBhIFNJRC4KKyAqICAgIC0gUiBpcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgdGhlIFNJRCBleHByZXNzZWQgYXMgYSBzZXF1ZW5jZSBvZiBkaWdpdHMKKyAqCWVpdGhlciBpbiBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIChpZiB0aGUgbGF0ZXIsIHByZWZpeGVkIGJ5ICIweCIpLgorICogICAgLSBJIGlzIHRoZSA0OC1iaXQgaWRlbnRpZmllcl9hdXRob3JpdHksIGV4cHJlc3NlZCBhcyBkaWdpdHMgYXMgUiBhYm92ZS4KKyAqICAgIC0gUy4uLiBpcyBvbmUgb3IgbW9yZSBzdWJfYXV0aG9yaXR5IHZhbHVlcywgZXhwcmVzc2VkIGFzIGRpZ2l0cyBhcyBhYm92ZS4KKyAqCisgKiBFeGFtcGxlIFNJRDsgdGhlIGRvbWFpbi1yZWxhdGl2ZSBTSUQgb2YgdGhlIGxvY2FsIEFkbWluaXN0cmF0b3JzIGdyb3VwIG9uCisgKiBXaW5kb3dzIE5ULzJrOgorICoJUy0xLTUtMzItNTQ0CisgKiBUaGlzIHRyYW5zbGF0ZXMgdG8gYSBTSUQgd2l0aDoKKyAqCXJldmlzaW9uID0gMSwKKyAqCXN1Yl9hdXRob3JpdHlfY291bnQgPSAyLAorICoJaWRlbnRpZmllcl9hdXRob3JpdHkgPSB7MCwwLDAsMCwwLDV9LAkvLyBTRUNVUklUWV9OVF9BVVRIT1JJVFkKKyAqCXN1Yl9hdXRob3JpdHlbMF0gPSAzMiwJCQkvLyBTRUNVUklUWV9CVUlMVElOX0RPTUFJTl9SSUQKKyAqCXN1Yl9hdXRob3JpdHlbMV0gPSA1NDQJCQkvLyBET01BSU5fQUxJQVNfUklEX0FETUlOUworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggcmV2aXNpb247CisJdTggc3ViX2F1dGhvcml0eV9jb3VudDsKKwlTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgaWRlbnRpZmllcl9hdXRob3JpdHk7CisJbGUzMiBzdWJfYXV0aG9yaXR5WzFdOwkJLyogQXQgbGVhc3Qgb25lIHN1Yl9hdXRob3JpdHkuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0lEOworCisvKgorICogQ3VycmVudCBjb25zdGFudHMgZm9yIFNJRHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJU0lEX1JFVklTSU9OCQkJPSAgMSwJLyogQ3VycmVudCByZXZpc2lvbiBsZXZlbC4gKi8KKwlTSURfTUFYX1NVQl9BVVRIT1JJVElFUwkJPSAxNSwJLyogTWF4aW11bSBudW1iZXIgb2YgdGhvc2UuICovCisJU0lEX1JFQ09NTUVOREVEX1NVQl9BVVRIT1JJVElFUwk9ICAxLAkvKiBXaWxsIGNoYW5nZSB0byBhcm91bmQgNiBpbgorCQkJCQkJICAgYSBmdXR1cmUgcmV2aXNpb24uICovCit9IFNJRF9DT05TVEFOVFM7CisKKy8qCisgKiBUaGUgcHJlZGVmaW5lZCBBQ0UgdHlwZXMgKDgtYml0LCBzZWUgYmVsb3cpLgorICovCitlbnVtIHsKKwlBQ0NFU1NfTUlOX01TX0FDRV9UWVBFCQk9IDAsCisJQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUJCT0gMCwKKwlBQ0NFU1NfREVOSUVEX0FDRV9UWVBFCQk9IDEsCisJU1lTVEVNX0FVRElUX0FDRV9UWVBFCQk9IDIsCisJU1lTVEVNX0FMQVJNX0FDRV9UWVBFCQk9IDMsIC8qIE5vdCBpbXBsZW1lbnRlZCBhcyBvZiBXaW4yay4gKi8KKwlBQ0NFU1NfTUFYX01TX1YyX0FDRV9UWVBFCT0gMywKKworCUFDQ0VTU19BTExPV0VEX0NPTVBPVU5EX0FDRV9UWVBFPSA0LAorCUFDQ0VTU19NQVhfTVNfVjNfQUNFX1RZUEUJPSA0LAorCisJLyogVGhlIGZvbGxvd2luZyBhcmUgV2luMmsgb25seS4gKi8KKwlBQ0NFU1NfTUlOX01TX09CSkVDVF9BQ0VfVFlQRQk9IDUsCisJQUNDRVNTX0FMTE9XRURfT0JKRUNUX0FDRV9UWVBFCT0gNSwKKwlBQ0NFU1NfREVOSUVEX09CSkVDVF9BQ0VfVFlQRQk9IDYsCisJU1lTVEVNX0FVRElUX09CSkVDVF9BQ0VfVFlQRQk9IDcsCisJU1lTVEVNX0FMQVJNX09CSkVDVF9BQ0VfVFlQRQk9IDgsCisJQUNDRVNTX01BWF9NU19PQkpFQ1RfQUNFX1RZUEUJPSA4LAorCisJQUNDRVNTX01BWF9NU19WNF9BQ0VfVFlQRQk9IDgsCisKKwkvKiBUaGlzIG9uZSBpcyBmb3IgV2luTlQvMmsuICovCisJQUNDRVNTX01BWF9NU19BQ0VfVFlQRQkJPSA4LAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHU4IEFDRV9UWVBFUzsKKworLyoKKyAqIFRoZSBBQ0UgZmxhZ3MgKDgtYml0KSBmb3IgYXVkaXQgYW5kIGluaGVyaXRhbmNlIChzZWUgYmVsb3cpLgorICoKKyAqIFNVQ0NFU1NGVUxfQUNDRVNTX0FDRV9GTEFHIGlzIG9ubHkgdXNlZCB3aXRoIHN5c3RlbSBhdWRpdCBhbmQgYWxhcm0gQUNFCisgKiB0eXBlcyB0byBpbmRpY2F0ZSB0aGF0IGEgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgKGluIFdpbmRvd3MhKSBmb3Igc3VjY2Vzc2Z1bAorICogYWNjZXNzZXMuCisgKgorICogRkFJTEVEX0FDQ0VTU19BQ0VfRkxBRyBpcyBvbmx5IHVzZWQgd2l0aCBzeXN0ZW0gYXVkaXQgYW5kIGFsYXJtIEFDRSB0eXBlcworICogdG8gaW5kaWNhdGUgdGhhdCBhIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIChpbiBXaW5kb3dzISkgZm9yIGZhaWxlZCBhY2Nlc3Nlcy4KKyAqLworZW51bSB7CisJLyogVGhlIGluaGVyaXRhbmNlIGZsYWdzLiAqLworCU9CSkVDVF9JTkhFUklUX0FDRQkJPSAweDAxLAorCUNPTlRBSU5FUl9JTkhFUklUX0FDRQkJPSAweDAyLAorCU5PX1BST1BBR0FURV9JTkhFUklUX0FDRQk9IDB4MDQsCisJSU5IRVJJVF9PTkxZX0FDRQkJPSAweDA4LAorCUlOSEVSSVRFRF9BQ0UJCQk9IDB4MTAsCS8qIFdpbjJrIG9ubHkuICovCisJVkFMSURfSU5IRVJJVF9GTEFHUwkJPSAweDFmLAorCisJLyogVGhlIGF1ZGl0IGZsYWdzLiAqLworCVNVQ0NFU1NGVUxfQUNDRVNTX0FDRV9GTEFHCT0gMHg0MCwKKwlGQUlMRURfQUNDRVNTX0FDRV9GTEFHCQk9IDB4ODAsCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgdTggQUNFX0ZMQUdTOworCisvKgorICogQW4gQUNFIGlzIGFuIGFjY2Vzcy1jb250cm9sIGVudHJ5IGluIGFuIGFjY2Vzcy1jb250cm9sIGxpc3QgKEFDTCkuCisgKiBBbiBBQ0UgZGVmaW5lcyBhY2Nlc3MgdG8gYW4gb2JqZWN0IGZvciBhIHNwZWNpZmljIHVzZXIgb3IgZ3JvdXAgb3IgZGVmaW5lcworICogdGhlIHR5cGVzIG9mIGFjY2VzcyB0aGF0IGdlbmVyYXRlIHN5c3RlbS1hZG1pbmlzdHJhdGlvbiBtZXNzYWdlcyBvciBhbGFybXMKKyAqIGZvciBhIHNwZWNpZmljIHVzZXIgb3IgZ3JvdXAuIFRoZSB1c2VyIG9yIGdyb3VwIGlzIGlkZW50aWZpZWQgYnkgYSBzZWN1cml0eQorICogaWRlbnRpZmllciAoU0lEKS4KKyAqCisgKiBFYWNoIEFDRSBzdGFydHMgd2l0aCBhbiBBQ0VfSEVBREVSIHN0cnVjdHVyZSAoYWxpZ25lZCBvbiA0LWJ5dGUgYm91bmRhcnkpLAorICogd2hpY2ggc3BlY2lmaWVzIHRoZSB0eXBlIGFuZCBzaXplIG9mIHRoZSBBQ0UuIFRoZSBmb3JtYXQgb2YgdGhlIHN1YnNlcXVlbnQKKyAqIGRhdGEgZGVwZW5kcyBvbiB0aGUgQUNFIHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwKi8JQUNFX1RZUEVTIHR5cGU7CQkvKiBUeXBlIG9mIHRoZSBBQ0UuICovCisvKiAgMSovCUFDRV9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQUNFLiAqLworLyogIDIqLwlsZTE2IHNpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBBQ0UuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQUNFX0hFQURFUjsKKworLyoKKyAqIFRoZSBhY2Nlc3MgbWFzayAoMzItYml0KS4gRGVmaW5lcyB0aGUgYWNjZXNzIHJpZ2h0cy4KKyAqCisgKiBUaGUgc3BlY2lmaWMgcmlnaHRzIChiaXRzIDAgdG8gMTUpLiAgVGhlc2UgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QKKyAqIGJlaW5nIHNlY3VyZWQgYnkgdGhlIEFDRS4KKyAqLworZW51bSB7CisJLyogU3BlY2lmaWMgcmlnaHRzIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIGFzIGZvbGxvd3M6ICovCisKKwkvKiBSaWdodCB0byByZWFkIGRhdGEgZnJvbSB0aGUgZmlsZS4gKEZJTEUpICovCisJRklMRV9SRUFEX0RBVEEJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCS8qIFJpZ2h0IHRvIGxpc3QgY29udGVudHMgb2YgYSBkaXJlY3RvcnkuIChESVJFQ1RPUlkpICovCisJRklMRV9MSVNUX0RJUkVDVE9SWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKworCS8qIFJpZ2h0IHRvIHdyaXRlIGRhdGEgdG8gdGhlIGZpbGUuIChGSUxFKSAqLworCUZJTEVfV1JJVEVfREFUQQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMiksCisJLyogUmlnaHQgdG8gY3JlYXRlIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfQUREX0ZJTEUJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCisJLyogUmlnaHQgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGZpbGUuIChGSUxFKSAqLworCUZJTEVfQVBQRU5EX0RBVEEJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisJLyogUmlnaHQgdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfQUREX1NVQkRJUkVDVE9SWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KSwKKworCS8qIFJpZ2h0IHRvIHJlYWQgZXh0ZW5kZWQgYXR0cmlidXRlcy4gKEZJTEUvRElSRUNUT1JZKSAqLworCUZJTEVfUkVBRF9FQQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCksCisKKwkvKiBSaWdodCB0byB3cml0ZSBleHRlbmRlZCBhdHRyaWJ1dGVzLiAoRklMRS9ESVJFQ1RPUlkpICovCisJRklMRV9XUklURV9FQQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCksCisKKwkvKiBSaWdodCB0byBleGVjdXRlIGEgZmlsZS4gKEZJTEUpICovCisJRklMRV9FWEVDVVRFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKSwKKwkvKiBSaWdodCB0byB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfVFJBVkVSU0UJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMjApLAorCisJLyoKKwkgKiBSaWdodCB0byBkZWxldGUgYSBkaXJlY3RvcnkgYW5kIGFsbCB0aGUgZmlsZXMgaXQgY29udGFpbnMgKGl0cworCSAqIGNoaWxkcmVuKSwgZXZlbiBpZiB0aGUgZmlsZXMgYXJlIHJlYWQtb25seS4gKERJUkVDVE9SWSkKKwkgKi8KKwlGSUxFX0RFTEVURV9DSElMRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKSwKKworCS8qIFJpZ2h0IHRvIHJlYWQgZmlsZSBhdHRyaWJ1dGVzLiAoRklMRS9ESVJFQ1RPUlkpICovCisJRklMRV9SRUFEX0FUVFJJQlVURVMJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCksCisKKwkvKiBSaWdodCB0byBjaGFuZ2UgZmlsZSBhdHRyaWJ1dGVzLiAoRklMRS9ESVJFQ1RPUlkpICovCisJRklMRV9XUklURV9BVFRSSUJVVEVTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAxMDApLAorCisJLyoKKwkgKiBUaGUgc3RhbmRhcmQgcmlnaHRzIChiaXRzIDE2IHRvIDIzKS4gIFRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUKKwkgKiB0eXBlIG9mIG9iamVjdCBiZWluZyBzZWN1cmVkLgorCSAqLworCisJLyogUmlnaHQgdG8gZGVsZXRlIHRoZSBvYmplY3QuICovCisJREVMRVRFCQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAxMDAwMCksCisKKwkvKgorCSAqIFJpZ2h0IHRvIHJlYWQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBvYmplY3QncyBzZWN1cml0eSBkZXNjcmlwdG9yLAorCSAqIG5vdCBpbmNsdWRpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBTQUNMLCBpLmUuIHJpZ2h0IHRvIHJlYWQgdGhlCisJICogc2VjdXJpdHkgZGVzY3JpcHRvciBhbmQgb3duZXIuCisJICovCisJUkVBRF9DT05UUk9MCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKworCS8qIFJpZ2h0IHRvIG1vZGlmeSB0aGUgREFDTCBpbiB0aGUgb2JqZWN0J3Mgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwlXUklURV9EQUMJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwNDAwMDApLAorCisJLyogUmlnaHQgdG8gY2hhbmdlIHRoZSBvd25lciBpbiB0aGUgb2JqZWN0J3Mgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwlXUklURV9PV05FUgkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDA4MDAwMCksCisKKwkvKgorCSAqIFJpZ2h0IHRvIHVzZSB0aGUgb2JqZWN0IGZvciBzeW5jaHJvbml6YXRpb24uICBFbmFibGVzIGEgcHJvY2VzcyB0bworCSAqIHdhaXQgdW50aWwgdGhlIG9iamVjdCBpcyBpbiB0aGUgc2lnbmFsbGVkIHN0YXRlLiAgU29tZSBvYmplY3QgdHlwZXMKKwkgKiBkbyBub3Qgc3VwcG9ydCB0aGlzIGFjY2VzcyByaWdodC4KKwkgKi8KKwlTWU5DSFJPTklaRQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDEwMDAwMCksCisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgU1RBTkRBUkRfUklHSFRTXyogYXJlIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgZm9yCisJICogY29udmVuaWVuY2UgYW5kIGFyZSBkZWZpbmVkIGJ5IHRoZSBXaW4zMiBBUEkuCisJICovCisKKwkvKiBUaGVzZSBhcmUgY3VycmVudGx5IGRlZmluZWQgdG8gUkVBRF9DT05UUk9MLiAqLworCVNUQU5EQVJEX1JJR0hUU19SRUFECQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMjAwMDApLAorCVNUQU5EQVJEX1JJR0hUU19XUklURQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKwlTVEFOREFSRF9SSUdIVFNfRVhFQ1VURQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKworCS8qIENvbWJpbmVzIERFTEVURSwgUkVBRF9DT05UUk9MLCBXUklURV9EQUMsIGFuZCBXUklURV9PV05FUiBhY2Nlc3MuICovCisJU1RBTkRBUkRfUklHSFRTX1JFUVVJUkVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDBmMDAwMCksCisKKwkvKgorCSAqIENvbWJpbmVzIERFTEVURSwgUkVBRF9DT05UUk9MLCBXUklURV9EQUMsIFdSSVRFX09XTkVSLCBhbmQKKwkgKiBTWU5DSFJPTklaRSBhY2Nlc3MuCisJICovCisJU1RBTkRBUkRfUklHSFRTX0FMTAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMWYwMDAwKSwKKworCS8qCisJICogVGhlIGFjY2VzcyBzeXN0ZW0gQUNMIGFuZCBtYXhpbXVtIGFsbG93ZWQgYWNjZXNzIHR5cGVzIChiaXRzIDI0IHRvCisJICogMjUsIGJpdHMgMjYgdG8gMjcgYXJlIHJlc2VydmVkKS4KKwkgKi8KKwlBQ0NFU1NfU1lTVEVNX1NFQ1VSSVRZCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDEwMDAwMDApLAorCU1BWElNVU1fQUxMT1dFRAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMjAwMDAwMCksCisKKwkvKgorCSAqIFRoZSBnZW5lcmljIHJpZ2h0cyAoYml0cyAyOCB0byAzMSkuICBUaGVzZSBtYXAgb250byB0aGUgc3RhbmRhcmQgYW5kCisJICogc3BlY2lmaWMgcmlnaHRzLgorCSAqLworCisJLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGFjY2Vzcy4gKi8KKwlHRU5FUklDX0FMTAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMDAwMDAwMCksCisKKwkvKiBFeGVjdXRlIGFjY2Vzcy4gKi8KKwlHRU5FUklDX0VYRUNVVEUJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MjAwMDAwMDApLAorCisJLyoKKwkgKiBXcml0ZSBhY2Nlc3MuICBGb3IgZmlsZXMsIHRoaXMgbWFwcyBvbnRvOgorCSAqCUZJTEVfQVBQRU5EX0RBVEEgfCBGSUxFX1dSSVRFX0FUVFJJQlVURVMgfCBGSUxFX1dSSVRFX0RBVEEgfAorCSAqCUZJTEVfV1JJVEVfRUEgfCBTVEFOREFSRF9SSUdIVFNfV1JJVEUgfCBTWU5DSFJPTklaRQorCSAqIEZvciBkaXJlY3RvcmllcywgdGhlIG1hcHBpbmcgaGFzIHRoZSBzYW1lIG51bWVyaWNhbCB2YWx1ZS4gIFNlZQorCSAqIGFib3ZlIGZvciB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSByaWdodHMgZ3JhbnRlZC4KKwkgKi8KKwlHRU5FUklDX1dSSVRFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDQwMDAwMDAwKSwKKworCS8qCisJICogUmVhZCBhY2Nlc3MuICBGb3IgZmlsZXMsIHRoaXMgbWFwcyBvbnRvOgorCSAqCUZJTEVfUkVBRF9BVFRSSUJVVEVTIHwgRklMRV9SRUFEX0RBVEEgfCBGSUxFX1JFQURfRUEgfAorCSAqCVNUQU5EQVJEX1JJR0hUU19SRUFEIHwgU1lOQ0hST05JWkUKKwkgKiBGb3IgZGlyZWN0b3JpZXMsIHRoZSBtYXBwaW5nIGhhcyB0aGUgc2FtZSBudW1iZXJpY2FsIHZhbHVlLiAgU2VlCisJICogYWJvdmUgZm9yIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHJpZ2h0cyBncmFudGVkLgorCSAqLworCUdFTkVSSUNfUkVBRAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCksCit9OworCit0eXBlZGVmIGxlMzIgQUNDRVNTX01BU0s7CisKKy8qCisgKiBUaGUgZ2VuZXJpYyBtYXBwaW5nIGFycmF5LiBVc2VkIHRvIGRlbm90ZSB0aGUgbWFwcGluZyBvZiBlYWNoIGdlbmVyaWMKKyAqIGFjY2VzcyByaWdodCB0byBhIHNwZWNpZmljIGFjY2VzcyBtYXNrLgorICoKKyAqIEZJWE1FOiBXaGF0IGV4YWN0bHkgaXMgdGhpcyBhbmQgd2hhdCBpcyBpdCBmb3I/IChBSUEpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBQ0NFU1NfTUFTSyBnZW5lcmljX3JlYWQ7CisJQUNDRVNTX01BU0sgZ2VuZXJpY193cml0ZTsKKwlBQ0NFU1NfTUFTSyBnZW5lcmljX2V4ZWN1dGU7CisJQUNDRVNTX01BU0sgZ2VuZXJpY19hbGw7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgR0VORVJJQ19NQVBQSU5HOworCisvKgorICogVGhlIHByZWRlZmluZWQgQUNFIHR5cGUgc3RydWN0dXJlcyBhcmUgYXMgZGVmaW5lZCBiZWxvdy4KKyAqLworCisvKgorICogQUNDRVNTX0FMTE9XRURfQUNFLCBBQ0NFU1NfREVOSUVEX0FDRSwgU1lTVEVNX0FVRElUX0FDRSwgU1lTVEVNX0FMQVJNX0FDRQorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKiAgMAlBQ0VfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UgdW5uYW1lZCBzdHJ1Y3RzLiAqLworCUFDRV9UWVBFUyB0eXBlOwkJLyogVHlwZSBvZiB0aGUgQUNFLiAqLworCUFDRV9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQUNFLiAqLworCWxlMTYgc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIEFDRS4gKi8KKy8qICA0Ki8JQUNDRVNTX01BU0sgbWFzazsJLyogQWNjZXNzIG1hc2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBBQ0UuICovCisKKy8qICA4Ki8JU0lEIHNpZDsJCS8qIFRoZSBTSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBQ0UuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQUNDRVNTX0FMTE9XRURfQUNFLCBBQ0NFU1NfREVOSUVEX0FDRSwKKwkJCSAgICAgICBTWVNURU1fQVVESVRfQUNFLCBTWVNURU1fQUxBUk1fQUNFOworCisvKgorICogVGhlIG9iamVjdCBBQ0UgZmxhZ3MgKDMyLWJpdCkuCisgKi8KK2VudW0geworCUFDRV9PQkpFQ1RfVFlQRV9QUkVTRU5UCQkJPSBjb25zdF9jcHVfdG9fbGUzMigxKSwKKwlBQ0VfSU5IRVJJVEVEX09CSkVDVF9UWVBFX1BSRVNFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigyKSwKK307CisKK3R5cGVkZWYgbGUzMiBPQkpFQ1RfQUNFX0ZMQUdTOworCit0eXBlZGVmIHN0cnVjdCB7CisvKiAgMAlBQ0VfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UgdW5uYW1lZCBzdHJ1Y3RzLiAqLworCUFDRV9UWVBFUyB0eXBlOwkJLyogVHlwZSBvZiB0aGUgQUNFLiAqLworCUFDRV9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQUNFLiAqLworCWxlMTYgc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIEFDRS4gKi8KKy8qICA0Ki8JQUNDRVNTX01BU0sgbWFzazsJLyogQWNjZXNzIG1hc2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBBQ0UuICovCisKKy8qICA4Ki8JT0JKRUNUX0FDRV9GTEFHUyBvYmplY3RfZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIG9iamVjdCBBQ0UuICovCisvKiAxMiovCUdVSUQgb2JqZWN0X3R5cGU7CisvKiAyOCovCUdVSUQgaW5oZXJpdGVkX29iamVjdF90eXBlOworCisvKiA0NCovCVNJRCBzaWQ7CQkvKiBUaGUgU0lEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQUNFLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFDQ0VTU19BTExPV0VEX09CSkVDVF9BQ0UsCisJCQkgICAgICAgQUNDRVNTX0RFTklFRF9PQkpFQ1RfQUNFLAorCQkJICAgICAgIFNZU1RFTV9BVURJVF9PQkpFQ1RfQUNFLAorCQkJICAgICAgIFNZU1RFTV9BTEFSTV9PQkpFQ1RfQUNFOworCisvKgorICogQW4gQUNMIGlzIGFuIGFjY2Vzcy1jb250cm9sIGxpc3QgKEFDTCkuCisgKiBBbiBBQ0wgc3RhcnRzIHdpdGggYW4gQUNMIGhlYWRlciBzdHJ1Y3R1cmUsIHdoaWNoIHNwZWNpZmllcyB0aGUgc2l6ZSBvZgorICogdGhlIEFDTCBhbmQgdGhlIG51bWJlciBvZiBBQ0VzIGl0IGNvbnRhaW5zLiBUaGUgQUNMIGhlYWRlciBpcyBmb2xsb3dlZCBieQorICogemVybyBvciBtb3JlIGFjY2VzcyBjb250cm9sIGVudHJpZXMgKEFDRXMpLiBUaGUgQUNMIGFzIHdlbGwgYXMgZWFjaCBBQ0UKKyAqIGFyZSBhbGlnbmVkIG9uIDQtYnl0ZSBib3VuZGFyaWVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggcmV2aXNpb247CS8qIFJldmlzaW9uIG9mIHRoaXMgQUNMLiAqLworCXU4IGFsaWdubWVudDE7CisJbGUxNiBzaXplOwkvKiBBbGxvY2F0ZWQgc3BhY2UgaW4gYnl0ZXMgZm9yIEFDTC4gSW5jbHVkZXMgdGhpcworCQkJICAgaGVhZGVyLCB0aGUgQUNFcyBhbmQgdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlLiAqLworCWxlMTYgYWNlX2NvdW50OwkvKiBOdW1iZXIgb2YgQUNFcyBpbiB0aGUgQUNMLiAqLworCWxlMTYgYWxpZ25tZW50MjsKKy8qIHNpemVvZigpID0gOCBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFDTDsKKworLyoKKyAqIEN1cnJlbnQgY29uc3RhbnRzIGZvciBBQ0xzLgorICovCit0eXBlZGVmIGVudW0geworCS8qIEN1cnJlbnQgcmV2aXNpb24uICovCisJQUNMX1JFVklTSU9OCQk9IDIsCisJQUNMX1JFVklTSU9OX0RTCQk9IDQsCisKKwkvKiBIaXN0b3J5IG9mIHJldmlzaW9ucy4gKi8KKwlBQ0xfUkVWSVNJT04xCQk9IDEsCisJTUlOX0FDTF9SRVZJU0lPTgk9IDIsCisJQUNMX1JFVklTSU9OMgkJPSAyLAorCUFDTF9SRVZJU0lPTjMJCT0gMywKKwlBQ0xfUkVWSVNJT040CQk9IDQsCisJTUFYX0FDTF9SRVZJU0lPTgk9IDQsCit9IEFDTF9DT05TVEFOVFM7CisKKy8qCisgKiBUaGUgc2VjdXJpdHkgZGVzY3JpcHRvciBjb250cm9sIGZsYWdzICgxNi1iaXQpLgorICoKKyAqIFNFX09XTkVSX0RFRkFVTFRFRCAtIFRoaXMgYm9vbGVhbiBmbGFnLCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIFNJRAorICoJcG9pbnRlZCB0byBieSB0aGUgT3duZXIgZmllbGQgd2FzIHByb3ZpZGVkIGJ5IGEgZGVmYXVsdGluZyBtZWNoYW5pc20KKyAqCXJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsIHByb3ZpZGVyIG9mIHRoZQorICoJc2VjdXJpdHkgZGVzY3JpcHRvci4gIFRoaXMgbWF5IGFmZmVjdCB0aGUgdHJlYXRtZW50IG9mIHRoZSBTSUQgd2l0aAorICoJcmVzcGVjdCB0byBpbmhlcml0ZW5jZSBvZiBhbiBvd25lci4KKyAqCisgKiBTRV9HUk9VUF9ERUZBVUxURUQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBTSUQgaW4KKyAqCXRoZSBHcm91cCBmaWVsZCB3YXMgcHJvdmlkZWQgYnkgYSBkZWZhdWx0aW5nIG1lY2hhbmlzbSByYXRoZXIgdGhhbgorICoJZXhwbGljaXRseSBwcm92aWRlZCBieSB0aGUgb3JpZ2luYWwgcHJvdmlkZXIgb2YgdGhlIHNlY3VyaXR5CisgKglkZXNjcmlwdG9yLiAgVGhpcyBtYXkgYWZmZWN0IHRoZSB0cmVhdG1lbnQgb2YgdGhlIFNJRCB3aXRoIHJlc3BlY3QgdG8KKyAqCWluaGVyaXRlbmNlIG9mIGEgcHJpbWFyeSBncm91cC4KKyAqCisgKiBTRV9EQUNMX1BSRVNFTlQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBzZWN1cml0eQorICoJZGVzY3JpcHRvciBjb250YWlucyBhIGRpc2NyZXRpb25hcnkgQUNMLiAgSWYgdGhpcyBmbGFnIGlzIHNldCBhbmQgdGhlCisgKglEYWNsIGZpZWxkIG9mIHRoZSBTRUNVUklUWV9ERVNDUklQVE9SIGlzIG51bGwsIHRoZW4gYSBudWxsIEFDTCBpcworICoJZXhwbGljaXRseSBiZWluZyBzcGVjaWZpZWQuCisgKgorICogU0VfREFDTF9ERUZBVUxURUQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBBQ0wKKyAqCXBvaW50ZWQgdG8gYnkgdGhlIERhY2wgZmllbGQgd2FzIHByb3ZpZGVkIGJ5IGEgZGVmYXVsdGluZyBtZWNoYW5pc20KKyAqCXJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsIHByb3ZpZGVyIG9mIHRoZQorICoJc2VjdXJpdHkgZGVzY3JpcHRvci4gIFRoaXMgbWF5IGFmZmVjdCB0aGUgdHJlYXRtZW50IG9mIHRoZSBBQ0wgd2l0aAorICoJcmVzcGVjdCB0byBpbmhlcml0ZW5jZSBvZiBhbiBBQ0wuICBUaGlzIGZsYWcgaXMgaWdub3JlZCBpZiB0aGUKKyAqCURhY2xQcmVzZW50IGZsYWcgaXMgbm90IHNldC4KKyAqCisgKiBTRV9TQUNMX1BSRVNFTlQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsICBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VjdXJpdHkKKyAqCWRlc2NyaXB0b3IgY29udGFpbnMgYSBzeXN0ZW0gQUNMIHBvaW50ZWQgdG8gYnkgdGhlIFNhY2wgZmllbGQuICBJZiB0aGlzCisgKglmbGFnIGlzIHNldCBhbmQgdGhlIFNhY2wgZmllbGQgb2YgdGhlIFNFQ1VSSVRZX0RFU0NSSVBUT1IgaXMgbnVsbCwgdGhlbgorICoJYW4gZW1wdHkgKGJ1dCBwcmVzZW50KSBBQ0wgaXMgYmVpbmcgc3BlY2lmaWVkLgorICoKKyAqIFNFX1NBQ0xfREVGQVVMVEVEIC0gVGhpcyBib29sZWFuIGZsYWcsIHdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgQUNMCisgKglwb2ludGVkIHRvIGJ5IHRoZSBTYWNsIGZpZWxkIHdhcyBwcm92aWRlZCBieSBhIGRlZmF1bHRpbmcgbWVjaGFuaXNtCisgKglyYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBwcm92aWRlciBvZiB0aGUKKyAqCXNlY3VyaXR5IGRlc2NyaXB0b3IuICBUaGlzIG1heSBhZmZlY3QgdGhlIHRyZWF0bWVudCBvZiB0aGUgQUNMIHdpdGgKKyAqCXJlc3BlY3QgdG8gaW5oZXJpdGVuY2Ugb2YgYW4gQUNMLiAgVGhpcyBmbGFnIGlzIGlnbm9yZWQgaWYgdGhlCisgKglTYWNsUHJlc2VudCBmbGFnIGlzIG5vdCBzZXQuCisgKgorICogU0VfU0VMRl9SRUxBVElWRSAtIFRoaXMgYm9vbGVhbiBmbGFnLCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3VyaXR5CisgKglkZXNjcmlwdG9yIGlzIGluIHNlbGYtcmVsYXRpdmUgZm9ybS4gIEluIHRoaXMgZm9ybSwgYWxsIGZpZWxkcyBvZiB0aGUKKyAqCXNlY3VyaXR5IGRlc2NyaXB0b3IgYXJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5IGFuZCBhbGwgcG9pbnRlciBmaWVsZHMgYXJlCisgKglleHByZXNzZWQgYXMgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuCisgKi8KK2VudW0geworCVNFX09XTkVSX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDEpLAorCVNFX0dST1VQX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDIpLAorCVNFX0RBQ0xfUFJFU0VOVAkJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDA0KSwKKwlTRV9EQUNMX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDgpLAorCisJU0VfU0FDTF9QUkVTRU5UCQkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMTApLAorCVNFX1NBQ0xfREVGQVVMVEVECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAyMCksCisKKwlTRV9EQUNMX0FVVE9fSU5IRVJJVF9SRVEJPSBjb25zdF9jcHVfdG9fbGUxNigweDAxMDApLAorCVNFX1NBQ0xfQVVUT19JTkhFUklUX1JFUQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDIwMCksCisJU0VfREFDTF9BVVRPX0lOSEVSSVRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDA0MDApLAorCVNFX1NBQ0xfQVVUT19JTkhFUklURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwODAwKSwKKworCVNFX0RBQ0xfUFJPVEVDVEVECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MTAwMCksCisJU0VfU0FDTF9QUk9URUNURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgyMDAwKSwKKwlTRV9STV9DT05UUk9MX1ZBTElECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4NDAwMCksCisJU0VfU0VMRl9SRUxBVElWRQkJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwMDApCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBTRUNVUklUWV9ERVNDUklQVE9SX0NPTlRST0w7CisKKy8qCisgKiBTZWxmLXJlbGF0aXZlIHNlY3VyaXR5IGRlc2NyaXB0b3IuIENvbnRhaW5zIHRoZSBvd25lciBhbmQgZ3JvdXAgU0lEcyBhcyB3ZWxsCisgKiBhcyB0aGUgc2FjbCBhbmQgZGFjbCBBQ0xzIGluc2lkZSB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpdHNlbGYuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCByZXZpc2lvbjsJLyogUmV2aXNpb24gbGV2ZWwgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJdTggYWxpZ25tZW50OworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfQ09OVFJPTCBjb250cm9sOyAvKiBGbGFncyBxdWFsaWZ5aW5nIHRoZSB0eXBlIG9mCisJCQkgICB0aGUgZGVzY3JpcHRvciBhcyB3ZWxsIGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzLiAqLworCWxlMzIgb3duZXI7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgU0lEIHJlcHJlc2VudGluZyBhbiBvYmplY3QncworCQkJICAgb3duZXIuIElmIHRoaXMgaXMgTlVMTCwgbm8gb3duZXIgU0lEIGlzIHByZXNlbnQgaW4KKwkJCSAgIHRoZSBkZXNjcmlwdG9yLiAqLworCWxlMzIgZ3JvdXA7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgU0lEIHJlcHJlc2VudGluZyBhbiBvYmplY3QncworCQkJICAgcHJpbWFyeSBncm91cC4gSWYgdGhpcyBpcyBOVUxMLCBubyBwcmltYXJ5IGdyb3VwCisJCQkgICBTSUQgaXMgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvci4gKi8KKwlsZTMyIHNhY2w7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgc3lzdGVtIEFDTC4gT25seSB2YWxpZCwgaWYKKwkJCSAgIFNFX1NBQ0xfUFJFU0VOVCBpcyBzZXQgaW4gdGhlIGNvbnRyb2wgZmllbGQuIElmCisJCQkgICBTRV9TQUNMX1BSRVNFTlQgaXMgc2V0IGJ1dCBzYWNsIGlzIE5VTEwsIGEgTlVMTCBBQ0wKKwkJCSAgIGlzIHNwZWNpZmllZC4gKi8KKwlsZTMyIGRhY2w7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgZGlzY3JldGlvbmFyeSBBQ0wuIE9ubHkgdmFsaWQsIGlmCisJCQkgICBTRV9EQUNMX1BSRVNFTlQgaXMgc2V0IGluIHRoZSBjb250cm9sIGZpZWxkLiBJZgorCQkJICAgU0VfREFDTF9QUkVTRU5UIGlzIHNldCBidXQgZGFjbCBpcyBOVUxMLCBhIE5VTEwgQUNMCisJCQkgICAodW5jb25kaXRpb25hbGx5IGdyYW50aW5nIGFjY2VzcykgaXMgc3BlY2lmaWVkLiAqLworLyogc2l6ZW9mKCkgPSAweDE0IGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRUxBVElWRTsKKworLyoKKyAqIEFic29sdXRlIHNlY3VyaXR5IGRlc2NyaXB0b3IuIERvZXMgbm90IGNvbnRhaW4gdGhlIG93bmVyIGFuZCBncm91cCBTSURzLCBub3IKKyAqIHRoZSBzYWNsIGFuZCBkYWNsIEFDTHMgaW5zaWRlIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiBJbnN0ZWFkLCBpdCBjb250YWlucworICogcG9pbnRlcnMgdG8gdGhlc2Ugc3RydWN0dXJlcyBpbiBtZW1vcnkuIE9idmlvdXNseSwgYWJzb2x1dGUgc2VjdXJpdHkKKyAqIGRlc2NyaXB0b3JzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgaW4gbWVtb3J5IHJlcHJlc2VudGF0aW9ucyBvZiBzZWN1cml0eQorICogZGVzY3JpcHRvcnMuIE9uIGRpc2ssIGEgc2VsZi1yZWxhdGl2ZSBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIHVzZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCByZXZpc2lvbjsJLyogUmV2aXNpb24gbGV2ZWwgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJdTggYWxpZ25tZW50OworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfQ09OVFJPTCBjb250cm9sOwkvKiBGbGFncyBxdWFsaWZ5aW5nIHRoZSB0eXBlIG9mCisJCQkgICB0aGUgZGVzY3JpcHRvciBhcyB3ZWxsIGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzLiAqLworCVNJRCAqb3duZXI7CS8qIFBvaW50cyB0byBhIFNJRCByZXByZXNlbnRpbmcgYW4gb2JqZWN0J3Mgb3duZXIuIElmCisJCQkgICB0aGlzIGlzIE5VTEwsIG5vIG93bmVyIFNJRCBpcyBwcmVzZW50IGluIHRoZQorCQkJICAgZGVzY3JpcHRvci4gKi8KKwlTSUQgKmdyb3VwOwkvKiBQb2ludHMgdG8gYSBTSUQgcmVwcmVzZW50aW5nIGFuIG9iamVjdCdzIHByaW1hcnkKKwkJCSAgIGdyb3VwLiBJZiB0aGlzIGlzIE5VTEwsIG5vIHByaW1hcnkgZ3JvdXAgU0lEIGlzCisJCQkgICBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yLiAqLworCUFDTCAqc2FjbDsJLyogUG9pbnRzIHRvIGEgc3lzdGVtIEFDTC4gT25seSB2YWxpZCwgaWYKKwkJCSAgIFNFX1NBQ0xfUFJFU0VOVCBpcyBzZXQgaW4gdGhlIGNvbnRyb2wgZmllbGQuIElmCisJCQkgICBTRV9TQUNMX1BSRVNFTlQgaXMgc2V0IGJ1dCBzYWNsIGlzIE5VTEwsIGEgTlVMTCBBQ0wKKwkJCSAgIGlzIHNwZWNpZmllZC4gKi8KKwlBQ0wgKmRhY2w7CS8qIFBvaW50cyB0byBhIGRpc2NyZXRpb25hcnkgQUNMLiBPbmx5IHZhbGlkLCBpZgorCQkJICAgU0VfREFDTF9QUkVTRU5UIGlzIHNldCBpbiB0aGUgY29udHJvbCBmaWVsZC4gSWYKKwkJCSAgIFNFX0RBQ0xfUFJFU0VOVCBpcyBzZXQgYnV0IGRhY2wgaXMgTlVMTCwgYSBOVUxMIEFDTAorCQkJICAgKHVuY29uZGl0aW9uYWxseSBncmFudGluZyBhY2Nlc3MpIGlzIHNwZWNpZmllZC4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTRUNVUklUWV9ERVNDUklQVE9SOworCisvKgorICogQ3VycmVudCBjb25zdGFudHMgZm9yIHNlY3VyaXR5IGRlc2NyaXB0b3JzLgorICovCit0eXBlZGVmIGVudW0geworCS8qIEN1cnJlbnQgcmV2aXNpb24uICovCisJU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTgk9IDEsCisJU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTjEJPSAxLAorCisJLyogVGhlIHNpemVzIG9mIGJvdGggdGhlIGFic29sdXRlIGFuZCByZWxhdGl2ZSBzZWN1cml0eSBkZXNjcmlwdG9ycyBpcworCSAgIHRoZSBzYW1lIGFzIHBvaW50ZXJzLCBhdCBsZWFzdCBvbiBpYTMyIGFyY2hpdGVjdHVyZSBhcmUgMzItYml0LiAqLworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSAk9IHNpemVvZihTRUNVUklUWV9ERVNDUklQVE9SKSwKK30gU0VDVVJJVFlfREVTQ1JJUFRPUl9DT05TVEFOVFM7CisKKy8qCisgKiBBdHRyaWJ1dGU6IFNlY3VyaXR5IGRlc2NyaXB0b3IgKDB4NTApLiBBIHN0YW5kYXJkIHNlbGYtcmVsYXRpdmUgc2VjdXJpdHkKKyAqIGRlc2NyaXB0b3IuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqIE5PVEU6IE5vdCB1c2VkIGluIE5URlMgMy4wKywgYXMgc2VjdXJpdHkgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBjZW50cmFsbHkKKyAqIGluIEZJTEVfU2VjdXJlIGFuZCB0aGUgY29ycmVjdCBkZXNjcmlwdG9yIGlzIGZvdW5kIHVzaW5nIHRoZSBzZWN1cml0eV9pZAorICogZnJvbSB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gYXR0cmlidXRlLgorICovCit0eXBlZGVmIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVMQVRJVkUgU0VDVVJJVFlfREVTQ1JJUFRPUl9BVFRSOworCisvKgorICogT24gTlRGUyAzLjArLCBhbGwgc2VjdXJpdHkgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBpbiBGSUxFX1NlY3VyZS4gT25seSBvbmUKKyAqIHJlZmVyZW5jZWQgaW5zdGFuY2Ugb2YgZWFjaCB1bmlxdWUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBzdG9yZWQuCisgKgorICogRklMRV9TZWN1cmUgY29udGFpbnMgbm8gdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZSwgaS5lLiBpdCBoYXMgemVybyBsZW5ndGguIEl0CisgKiBkb2VzLCBob3dldmVyLCBjb250YWluIHR3byBpbmRleGVzICgkU0RIIGFuZCAkU0lJKSBhcyB3ZWxsIGFzIGEgbmFtZWQgZGF0YQorICogc3RyZWFtICgkU0RTKS4KKyAqCisgKiBFdmVyeSB1bmlxdWUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBhc3NpZ25lZCBhIHVuaXF1ZSBzZWN1cml0eSBpZGVudGlmaWVyCisgKiAoc2VjdXJpdHlfaWQsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGEgU0lEKS4gVGhlIHNlY3VyaXR5X2lkIGlzIHVuaXF1ZSBmb3IKKyAqIHRoZSBOVEZTIHZvbHVtZSBhbmQgaXMgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHRoZSAkU0lJIGluZGV4LCB3aGljaCBtYXBzCisgKiBzZWN1cml0eV9pZHMgdG8gdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IncyBzdG9yYWdlIGxvY2F0aW9uIHdpdGhpbiB0aGUgJFNEUworICogZGF0YSBhdHRyaWJ1dGUuIFRoZSAkU0lJIGluZGV4IGlzIHNvcnRlZCBieSBhc2NlbmRpbmcgc2VjdXJpdHlfaWQuCisgKgorICogQSBzaW1wbGUgaGFzaCBpcyBjb21wdXRlZCBmcm9tIGVhY2ggc2VjdXJpdHkgZGVzY3JpcHRvci4gVGhpcyBoYXNoIGlzIHVzZWQKKyAqIGFzIGFuIGluZGV4IGludG8gdGhlICRTREggaW5kZXgsIHdoaWNoIG1hcHMgc2VjdXJpdHkgZGVzY3JpcHRvciBoYXNoZXMgdG8KKyAqIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yJ3Mgc3RvcmFnZSBsb2NhdGlvbiB3aXRoaW4gdGhlICRTRFMgZGF0YSBhdHRyaWJ1dGUuCisgKiBUaGUgJFNESCBpbmRleCBpcyBzb3J0ZWQgYnkgc2VjdXJpdHkgZGVzY3JpcHRvciBoYXNoIGFuZCBpcyBzdG9yZWQgaW4gYSBCKworICogdHJlZS4gV2hlbiBzZWFyY2hpbmcgJFNESCAod2l0aCB0aGUgaW50ZW50IG9mIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IGEKKyAqIG5ldyBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgJFNEUyBkYXRhIHN0cmVhbSksIGlmIGEKKyAqIG1hdGNoaW5nIGhhc2ggaXMgZm91bmQsIGJ1dCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvcnMgZG8gbm90IG1hdGNoLCB0aGUKKyAqIHNlYXJjaCBpbiB0aGUgJFNESCBpbmRleCBpcyBjb250aW51ZWQsIHNlYXJjaGluZyBmb3IgYSBuZXh0IG1hdGNoaW5nIGhhc2guCisgKgorICogV2hlbiBhIHByZWNpc2UgbWF0Y2ggaXMgZm91bmQsIHRoZSBzZWN1cml0eV9pZCBjb3Jlc3BvbmRpbmcgdG8gdGhlIHNlY3VyaXR5CisgKiBkZXNjcmlwdG9yIGluIHRoZSAkU0RTIGF0dHJpYnV0ZSBpcyByZWFkIGZyb20gdGhlIGZvdW5kICRTREggaW5kZXggZW50cnkgYW5kCisgKiBpcyBzdG9yZWQgaW4gdGhlICRTVEFOREFSRF9JTkZPUk1BVElPTiBhdHRyaWJ1dGUgb2YgdGhlIGZpbGUvZGlyZWN0b3J5IHRvCisgKiB3aGljaCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBiZWluZyBhcHBsaWVkLiBUaGUgJFNUQU5EQVJEX0lORk9STUFUSU9OCisgKiBhdHRyaWJ1dGUgaXMgcHJlc2VudCBpbiBhbGwgYmFzZSBtZnQgcmVjb3JkcyAoaS5lLiBpbiBhbGwgZmlsZXMgYW5kCisgKiBkaXJlY3RvcmllcykuCisgKgorICogSWYgYSBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIGFzc2lnbmVkIGEgbmV3IHVuaXF1ZQorICogc2VjdXJpdHlfaWQgYW5kIGlzIGFkZGVkIHRvIHRoZSAkU0RTIGRhdGEgYXR0cmlidXRlLiBUaGVuLCBlbnRyaWVzCisgKiByZWZlcmVuY2luZyB0aGUgdGhpcyBzZWN1cml0eSBkZXNjcmlwdG9yIGluIHRoZSAkU0RTIGRhdGEgYXR0cmlidXRlIGFyZQorICogYWRkZWQgdG8gdGhlICRTREggYW5kICRTSUkgaW5kZXhlcy4KKyAqCisgKiBOb3RlOiBFbnRyaWVzIGFyZSBuZXZlciBkZWxldGVkIGZyb20gRklMRV9TZWN1cmUsIGV2ZW4gaWYgbm90aGluZworICogcmVmZXJlbmNlcyBhbiBlbnRyeSBhbnkgbW9yZS4KKyAqLworCisvKgorICogVGhpcyBoZWFkZXIgcHJlY2VkZXMgZWFjaCBzZWN1cml0eSBkZXNjcmlwdG9yIGluIHRoZSAkU0RTIGRhdGEgc3RyZWFtLgorICogVGhpcyBpcyBhbHNvIHRoZSBpbmRleCBlbnRyeSBkYXRhIHBhcnQgb2YgYm90aCB0aGUgJFNJSSBhbmQgJFNESCBpbmRleGVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBoYXNoOwkgIC8qIEhhc2ggb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJbGUzMiBzZWN1cml0eV9pZDsgLyogVGhlIHNlY3VyaXR5X2lkIGFzc2lnbmVkIHRvIHRoZSBkZXNjcmlwdG9yLiAqLworCWxlNjQgb2Zmc2V0OwkgIC8qIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZW50cnkgaW4gdGhlICRTRFMgc3RyZWFtLiAqLworCWxlMzIgbGVuZ3RoOwkgIC8qIFNpemUgaW4gYnl0ZXMgb2YgdGhpcyBlbnRyeSBpbiAkU0RTIHN0cmVhbS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTRUNVUklUWV9ERVNDUklQVE9SX0hFQURFUjsKKworLyoKKyAqIFRoZSAkU0RTIGRhdGEgc3RyZWFtIGNvbnRhaW5zIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9ycywgYWxpZ25lZCBvbiAxNi1ieXRlCisgKiBib3VuZGFyaWVzLCBzb3J0ZWQgYnkgc2VjdXJpdHlfaWQgaW4gYSBCKyB0cmVlLiBTZWN1cml0eSBkZXNjcmlwdG9ycyBjYW5ub3QKKyAqIGNyb3NzIDI1NmtpYiBib3VuZGFyaWVzICh0aGlzIHJlc3RyaWN0aW9uIGlzIGltcG9zZWQgYnkgdGhlIFdpbmRvd3MgY2FjaGUKKyAqIG1hbmFnZXIpLiBFYWNoIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgY29udGFpbmVkIGluIGEgU0RTX0VOVFJZIHN0cnVjdHVyZS4KKyAqIEFsc28sIGVhY2ggc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBzdG9yZWQgdHdpY2UgaW4gdGhlICRTRFMgc3RyZWFtIHdpdGggYQorICogZml4ZWQgb2Zmc2V0IG9mIDB4NDAwMDAgYnl0ZXMgKDI1NmtpYiwgdGhlIFdpbmRvd3MgY2FjaGUgbWFuYWdlcidzIG1heCBzaXplKQorICogYmV0d2VlbiB0aGVtOyBpLmUuIGlmIGEgU0RTX0VOVFJZIHNwZWNpZmllcyBhbiBvZmZzZXQgb2YgMHg1MWQwLCB0aGVuIHRoZQorICogdGhlIGZpcnN0IGNvcHkgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3Igd2lsbCBiZSBhdCBvZmZzZXQgMHg1MWQwIGluIHRoZQorICogJFNEUyBkYXRhIHN0cmVhbSBhbmQgdGhlIHNlY29uZCBjb3B5IHdpbGwgYmUgYXQgb2Zmc2V0IDB4NDUxZDAuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwCVNFQ1VSSVRZX0RFU0NSSVBUT1JfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UKKwkJCQkgICAgICAgdW5uYW1lZCBzdHJ1Y3RzLiAqLworCWxlMzIgaGFzaDsJICAvKiBIYXNoIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiAqLworCWxlMzIgc2VjdXJpdHlfaWQ7IC8qIFRoZSBzZWN1cml0eV9pZCBhc3NpZ25lZCB0byB0aGUgZGVzY3JpcHRvci4gKi8KKwlsZTY0IG9mZnNldDsJICAvKiBCeXRlIG9mZnNldCBvZiB0aGlzIGVudHJ5IGluIHRoZSAkU0RTIHN0cmVhbS4gKi8KKwlsZTMyIGxlbmd0aDsJICAvKiBTaXplIGluIGJ5dGVzIG9mIHRoaXMgZW50cnkgaW4gJFNEUyBzdHJlYW0uICovCisvKiAyMCovCVNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVMQVRJVkUgc2lkOyAvKiBUaGUgc2VsZi1yZWxhdGl2ZSBzZWN1cml0eQorCQkJCQkgICAgIGRlc2NyaXB0b3IuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0RTX0VOVFJZOworCisvKgorICogVGhlIGluZGV4IGVudHJ5IGtleSB1c2VkIGluIHRoZSAkU0lJIGluZGV4LiBUaGUgY29sbGF0aW9uIHR5cGUgaXMKKyAqIENPTExBVElPTl9OVE9GU19VTE9ORy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgc2VjdXJpdHlfaWQ7IC8qIFRoZSBzZWN1cml0eV9pZCBhc3NpZ25lZCB0byB0aGUgZGVzY3JpcHRvci4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTSUlfSU5ERVhfS0VZOworCisvKgorICogVGhlIGluZGV4IGVudHJ5IGtleSB1c2VkIGluIHRoZSAkU0RIIGluZGV4LiBUaGUga2V5cyBhcmUgc29ydGVkIGZpcnN0IGJ5CisgKiBoYXNoIGFuZCB0aGVuIGJ5IHNlY3VyaXR5X2lkLiBUaGUgY29sbGF0aW9uIHJ1bGUgaXMKKyAqIENPTExBVElPTl9OVE9GU19TRUNVUklUWV9IQVNILgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBoYXNoOwkgIC8qIEhhc2ggb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJbGUzMiBzZWN1cml0eV9pZDsgLyogVGhlIHNlY3VyaXR5X2lkIGFzc2lnbmVkIHRvIHRoZSBkZXNjcmlwdG9yLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNESF9JTkRFWF9LRVk7CisKKy8qCisgKiBBdHRyaWJ1dGU6IFZvbHVtZSBuYW1lICgweDYwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgcmVzaWRlbnQuCisgKiBOT1RFOiBQcmVzZW50IG9ubHkgaW4gRklMRV9Wb2x1bWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwludGZzY2hhciBuYW1lWzBdOwkvKiBUaGUgbmFtZSBvZiB0aGUgdm9sdW1lIGluIFVuaWNvZGUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVk9MVU1FX05BTUU7CisKKy8qCisgKiBQb3NzaWJsZSBmbGFncyBmb3IgdGhlIHZvbHVtZSAoMTYtYml0KS4KKyAqLworZW51bSB7CisJVk9MVU1FX0lTX0RJUlRZCQkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDEpLAorCVZPTFVNRV9SRVNJWkVfTE9HX0ZJTEUJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAyKSwKKwlWT0xVTUVfVVBHUkFERV9PTl9NT1VOVAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDQpLAorCVZPTFVNRV9NT1VOVEVEX09OX05UNAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDgpLAorCisJVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMTApLAorCVZPTFVNRV9SRVBBSVJfT0JKRUNUX0lECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAyMCksCisKKwlWT0xVTUVfTU9ESUZJRURfQllfQ0hLRFNLCT0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDAwKSwKKworCVZPTFVNRV9GTEFHU19NQVNLCQk9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAzZiksCisKKwkvKiBUbyBtYWtlIG91ciBsaWZlIGVhc2llciB3aGVuIGNoZWNraW5nIGlmIHdlIG11c3QgbW91bnQgcmVhZC1vbmx5LiAqLworCVZPTFVNRV9NVVNUX01PVU5UX1JPX01BU0sJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwMzcpLAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIGxlMTYgVk9MVU1FX0ZMQUdTOworCisvKgorICogQXR0cmlidXRlOiBWb2x1bWUgaW5mb3JtYXRpb24gKDB4NzApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqIE5PVEU6IFByZXNlbnQgb25seSBpbiBGSUxFX1ZvbHVtZS4KKyAqIE5PVEU6IFdpbmRvd3MgMjAwMCB1c2VzIE5URlMgMy4wIHdoaWxlIFdpbmRvd3MgTlQ0IHNlcnZpY2UgcGFjayA2YSB1c2VzCisgKgkgTlRGUyAxLjIuIEkgaGF2ZW4ndCBwZXJzb25hbGx5IHNlZW4gb3RoZXIgdmFsdWVzIHlldC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlNjQgcmVzZXJ2ZWQ7CQkvKiBOb3QgdXNlZCAoeWV0PykuICovCisJdTggbWFqb3JfdmVyOwkJLyogTWFqb3IgdmVyc2lvbiBvZiB0aGUgbnRmcyBmb3JtYXQuICovCisJdTggbWlub3JfdmVyOwkJLyogTWlub3IgdmVyc2lvbiBvZiB0aGUgbnRmcyBmb3JtYXQuICovCisJVk9MVU1FX0ZMQUdTIGZsYWdzOwkvKiBCaXQgYXJyYXkgb2YgVk9MVU1FXyogZmxhZ3MuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVk9MVU1FX0lORk9STUFUSU9OOworCisvKgorICogQXR0cmlidXRlOiBEYXRhIGF0dHJpYnV0ZSAoMHg4MCkuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqCisgKiBEYXRhIGNvbnRlbnRzIG9mIGEgZmlsZSAoaS5lLiB0aGUgdW5uYW1lZCBzdHJlYW0pIG9yIG9mIGEgbmFtZWQgc3RyZWFtLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggZGF0YVswXTsJCS8qIFRoZSBmaWxlJ3MgZGF0YSBjb250ZW50cy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBEQVRBX0FUVFI7CisKKy8qCisgKiBJbmRleCBoZWFkZXIgZmxhZ3MgKDgtYml0KS4KKyAqLworZW51bSB7CisJLyoKKwkgKiBXaGVuIGluZGV4IGhlYWRlciBpcyBpbiBhbiBpbmRleCByb290IGF0dHJpYnV0ZToKKwkgKi8KKwlTTUFMTF9JTkRFWCA9IDAsIC8qIFRoZSBpbmRleCBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluc2lkZSB0aGUgaW5kZXgKKwkJCSAgICByb290IGF0dHJpYnV0ZSBhbmQgdGhlcmUgaXMgbm8gaW5kZXggYWxsb2NhdGlvbgorCQkJICAgIGF0dHJpYnV0ZSBwcmVzZW50LiAqLworCUxBUkdFX0lOREVYID0gMSwgLyogVGhlIGluZGV4IGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIGluZGV4IHJvb3QKKwkJCSAgICBhdHRyaWJ1dGUgYW5kL29yIGFuIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGlzCisJCQkgICAgcHJlc2VudC4gKi8KKwkvKgorCSAqIFdoZW4gaW5kZXggaGVhZGVyIGlzIGluIGFuIGluZGV4IGJsb2NrLCBpLmUuIGlzIHBhcnQgb2YgaW5kZXgKKwkgKiBhbGxvY2F0aW9uIGF0dHJpYnV0ZToKKwkgKi8KKwlMRUFGX05PREUgID0gMCwgLyogVGhpcyBpcyBhIGxlYWYgbm9kZSwgaS5lLiB0aGVyZSBhcmUgbm8gbW9yZSBub2RlcworCQkJICAgYnJhbmNoaW5nIG9mZiBpdC4gKi8KKwlJTkRFWF9OT0RFID0gMSwgLyogVGhpcyBub2RlIGluZGV4ZXMgb3RoZXIgbm9kZXMsIGkuZS4gaXQgaXMgbm90IGEgbGVhZgorCQkJICAgbm9kZS4gKi8KKwlOT0RFX01BU0sgID0gMSwgLyogTWFzayBmb3IgYWNjZXNzaW5nIHRoZSAqX05PREUgYml0cy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiB1OCBJTkRFWF9IRUFERVJfRkxBR1M7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBoZWFkZXIgZm9yIGluZGV4ZXMsIGRlc2NyaWJpbmcgdGhlIElOREVYX0VOVFJZIHJlY29yZHMsIHdoaWNoCisgKiBmb2xsb3cgdGhlIElOREVYX0hFQURFUi4gVG9nZXRoZXIgdGhlIGluZGV4IGhlYWRlciBhbmQgdGhlIGluZGV4IGVudHJpZXMKKyAqIG1ha2UgdXAgYSBjb21wbGV0ZSBpbmRleC4KKyAqCisgKiBJTVBPUlRBTlQgTk9URTogVGhlIG9mZnNldCwgbGVuZ3RoIGFuZCBzaXplIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSBjb3VudGVkCisgKiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGluZGV4IGhlYWRlciBzdHJ1Y3R1cmUgYW5kIG5vdCByZWxhdGl2ZSB0byB0aGUKKyAqIHN0YXJ0IG9mIHRoZSBpbmRleCByb290IG9yIGluZGV4IGFsbG9jYXRpb24gc3RydWN0dXJlcyB0aGVtc2VsdmVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBlbnRyaWVzX29mZnNldDsJCS8qIEJ5dGUgb2Zmc2V0IHRvIGZpcnN0IElOREVYX0VOVFJZCisJCQkJCSAgIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCWxlMzIgaW5kZXhfbGVuZ3RoOwkJLyogRGF0YSBzaXplIG9mIHRoZSBpbmRleCBpbiBieXRlcywKKwkJCQkJICAgaS5lLiBieXRlcyB1c2VkIGZyb20gYWxsb2NhdGVkCisJCQkJCSAgIHNpemUsIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCWxlMzIgYWxsb2NhdGVkX3NpemU7CQkvKiBCeXRlIHNpemUgb2YgdGhpcyBpbmRleCAoYmxvY2spLAorCQkJCQkgICBtdWx0aXBsZSBvZiA4IGJ5dGVzLiAqLworCS8qIE5PVEU6IEZvciB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHRoZSBhYm92ZSB0d28gbnVtYmVycyBhcmUgYWx3YXlzCisJICAgZXF1YWwsIGFzIHRoZSBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQgYW5kIGl0IGlzIHJlc2l6ZWQgYXMgbmVlZGVkLiBJbgorCSAgIHRoZSBjYXNlIG9mIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIGlzIG5vdAorCSAgIHJlc2lkZW50IGFuZCBoZW5jZSB0aGUgYWxsb2NhdGVkX3NpemUgaXMgYSBmaXhlZCB2YWx1ZSBhbmQgbXVzdAorCSAgIGVxdWFsIHRoZSBpbmRleF9ibG9ja19zaXplIHNwZWNpZmllZCBieSB0aGUgSU5ERVhfUk9PVCBhdHRyaWJ1dGUKKwkgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSB0aGlzIElOREVYX0JMT0NLCisJICAgYmVsb25ncyB0by4gKi8KKwlJTkRFWF9IRUFERVJfRkxBR1MgZmxhZ3M7CS8qIEJpdCBmaWVsZCBvZiBJTkRFWF9IRUFERVJfRkxBR1MuICovCisJdTggcmVzZXJ2ZWRbM107CQkJLyogUmVzZXJ2ZWQvYWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIElOREVYX0hFQURFUjsKKworLyoKKyAqIEF0dHJpYnV0ZTogSW5kZXggcm9vdCAoMHg5MCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICoKKyAqIFRoaXMgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBpbmRleCBlbnRyaWVzIChJTkRFWF9FTlRSWSBzdHJ1Y3R1cmVzKQorICogYXMgZGVzY3JpYmVkIGJ5IHRoZSBpbmRleCBoZWFkZXIuCisgKgorICogV2hlbiBhIGRpcmVjdG9yeSBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluc2lkZSB0aGUgaW5kZXggcm9vdCB0aGVuIHRoaXMKKyAqIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBkaXJlY3RvcnkuIFdoZW4gdGhlIGRpcmVjdG9yeSBpcyB0b28KKyAqIGxhcmdlIHRvIGZpdCBpbiB0aGUgaW5kZXggcm9vdCwgb24gdGhlIG90aGVyIGhhbmQsIHR3byBhZGl0aW9uYWwgYXR0cmlidXRlcworICogYXJlIHByZXNlbnQ6IGFuIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLCBjb250YWluaW5nIHN1Yi1ub2RlcyBvZiB0aGUgQisKKyAqIGRpcmVjdG9yeSB0cmVlIChzZWUgYmVsb3cpLCBhbmQgYSBiaXRtYXAgYXR0cmlidXRlLCBkZXNjcmliaW5nIHdoaWNoIHZpcnR1YWwKKyAqIGNsdXN0ZXIgbnVtYmVycyAodmNucykgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGFyZSBpbiB1c2UgYnkgYW4KKyAqIGluZGV4IGJsb2NrLgorICoKKyAqIE5PVEU6IFRoZSByb290IGRpcmVjdG9yeSAoRklMRV9yb290KSBjb250YWlucyBhbiBlbnRyeSBmb3IgaXRzZWxmLiBPdGhlcgorICogZGlyY2V0b3JpZXMgZG8gbm90IGNvbnRhaW4gZW50cmllcyBmb3IgdGhlbXNlbHZlcywgdGhvdWdoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQVRUUl9UWVBFIHR5cGU7CQkJLyogVHlwZSBvZiB0aGUgaW5kZXhlZCBhdHRyaWJ1dGUuIElzCisJCQkJCSAgICRGSUxFX05BTUUgZm9yIGRpcmVjdG9yaWVzLCB6ZXJvCisJCQkJCSAgIGZvciB2aWV3IGluZGV4ZXMuIE5vIG90aGVyIHZhbHVlcworCQkJCQkgICBhbGxvd2VkLiAqLworCUNPTExBVElPTl9SVUxFIGNvbGxhdGlvbl9ydWxlOwkvKiBDb2xsYXRpb24gcnVsZSB1c2VkIHRvIHNvcnQgdGhlCisJCQkJCSAgIGluZGV4IGVudHJpZXMuIElmIHR5cGUgaXMgJEZJTEVfTkFNRSwKKwkJCQkJICAgdGhpcyBtdXN0IGJlIENPTExBVElPTl9GSUxFX05BTUUuICovCisJbGUzMiBpbmRleF9ibG9ja19zaXplOwkJLyogU2l6ZSBvZiBlYWNoIGluZGV4IGJsb2NrIGluIGJ5dGVzIChpbgorCQkJCQkgICB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUpLiAqLworCXU4IGNsdXN0ZXJzX3Blcl9pbmRleF9ibG9jazsJLyogQ2x1c3RlciBzaXplIG9mIGVhY2ggaW5kZXggYmxvY2sgKGluCisJCQkJCSAgIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSksIHdoZW4KKwkJCQkJICAgYW4gaW5kZXggYmxvY2sgaXMgPj0gdGhhbiBhIGNsdXN0ZXIsCisJCQkJCSAgIG90aGVyd2lzZSB0aGlzIHdpbGwgYmUgdGhlIGxvZyBvZgorCQkJCQkgICB0aGUgc2l6ZSAobGlrZSBob3cgdGhlIGVuY29kaW5nIG9mCisJCQkJCSAgIHRoZSBtZnQgcmVjb3JkIHNpemUgYW5kIHRoZSBpbmRleAorCQkJCQkgICByZWNvcmQgc2l6ZSBmb3VuZCBpbiB0aGUgYm9vdCBzZWN0b3IKKwkJCQkJICAgd29yaykuIEhhcyB0byBiZSBhIHBvd2VyIG9mIDIuICovCisJdTggcmVzZXJ2ZWRbM107CQkJLyogUmVzZXJ2ZWQvYWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCUlOREVYX0hFQURFUiBpbmRleDsJCS8qIEluZGV4IGhlYWRlciBkZXNjcmliaW5nIHRoZQorCQkJCQkgICBmb2xsb3dpbmcgaW5kZXggZW50cmllcy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9ST09UOworCisvKgorICogQXR0cmlidXRlOiBJbmRleCBhbGxvY2F0aW9uICgweGEwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgbm9uLXJlc2lkZW50IChkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYmUgcmVzaWRlbnQgYW55d2F5ISkuCisgKgorICogVGhpcyBpcyBhbiBhcnJheSBvZiBpbmRleCBibG9ja3MuIEVhY2ggaW5kZXggYmxvY2sgc3RhcnRzIHdpdGggYW4KKyAqIElOREVYX0JMT0NLIHN0cnVjdHVyZSBjb250YWluaW5nIGFuIGluZGV4IGhlYWRlciwgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgorICogaW5kZXggZW50cmllcyAoSU5ERVhfRU5UUlkgc3RydWN0dXJlcyksIGFzIGRlc2NyaWJlZCBieSB0aGUgSU5ERVhfSEVBREVSLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBNYWdpYyBpcyAiSU5EWCIuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24uICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbi4gKi8KKworLyogIDgqLwlzbGU2NCBsc247CQkvKiAkTG9nRmlsZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QKKwkJCQkgICBtb2RpZmljYXRpb24gb2YgdGhpcyBpbmRleCBibG9jay4gKi8KKy8qIDE2Ki8JbGVWQ04gaW5kZXhfYmxvY2tfdmNuOwkvKiBWaXJ0dWFsIGNsdXN0ZXIgbnVtYmVyIG9mIHRoZSBpbmRleCBibG9jay4KKwkJCQkgICBJZiB0aGUgY2x1c3Rlcl9zaXplIG9uIHRoZSB2b2x1bWUgaXMgPD0gdGhlCisJCQkJICAgaW5kZXhfYmxvY2tfc2l6ZSBvZiB0aGUgZGlyZWN0b3J5LAorCQkJCSAgIGluZGV4X2Jsb2NrX3ZjbiBjb3VudHMgaW4gdW5pdHMgb2YgY2x1c3RlcnMsCisJCQkJICAgYW5kIGluIHVuaXRzIG9mIHNlY3RvcnMgb3RoZXJ3aXNlLiAqLworLyogMjQqLwlJTkRFWF9IRUFERVIgaW5kZXg7CS8qIERlc2NyaWJlcyB0aGUgZm9sbG93aW5nIGluZGV4IGVudHJpZXMuICovCisvKiBzaXplb2YoKT0gNDAgKDB4MjgpIGJ5dGVzICovCisvKgorICogV2hlbiBjcmVhdGluZyB0aGUgaW5kZXggYmxvY2ssIHdlIHBsYWNlIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgYXQgdGhpcworICogb2Zmc2V0LCBpLmUuIGJlZm9yZSB3ZSBzdGFydCB3aXRoIHRoZSBpbmRleCBlbnRyaWVzLiBUaGlzIGFsc28gbWFrZXMgc2Vuc2UsCisgKiBvdGhlcndpc2Ugd2UgY291bGQgcnVuIGludG8gcHJvYmxlbXMgd2l0aCB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5CisgKiBjb250YWluaW5nIGluIGl0c2VsZiB0aGUgbGFzdCB0d28gYnl0ZXMgb2YgYSBzZWN0b3Igd2hpY2ggd291bGQgbWVhbiB0aGF0CisgKiBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGlvbiB3b3VsZG4ndCB3b3JrLiBBcyB5b3UgY2FuJ3QgcHJvdGVjdCBkYXRhCisgKiBieSBvdmVyd3JpdGluZyBpdCBzaW5jZSB5b3UgdGhlbiBjYW4ndCBnZXQgaXQgYmFjay4uLgorICogV2hlbiByZWFkaW5nIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBudGZzIHJlY29yZCBoZWFkZXIuCisgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9CTE9DSzsKKwordHlwZWRlZiBJTkRFWF9CTE9DSyBJTkRFWF9BTExPQ0FUSU9OOworCisvKgorICogVGhlIHN5c3RlbSBmaWxlIEZJTEVfRXh0ZW5kLyRSZXBhcnNlIGNvbnRhaW5zIGFuIGluZGV4IG5hbWVkICRSIGxpc3RpbmcKKyAqIGFsbCByZXBhcnNlIHBvaW50cyBvbiB0aGUgdm9sdW1lLiBUaGUgaW5kZXggZW50cnkga2V5cyBhcmUgYXMgZGVmaW5lZAorICogYmVsb3cuIE5vdGUsIHRoYXQgdGhlcmUgaXMgbm8gaW5kZXggZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGluZGV4IGVudHJpZXMuCisgKgorICogVGhlIGluZGV4IGVudHJpZXMgYXJlIHNvcnRlZCBieSB0aGUgaW5kZXgga2V5IGZpbGVfaWQuIFRoZSBjb2xsYXRpb24gcnVsZSBpcworICogQ09MTEFUSU9OX05UT0ZTX1VMT05HUy4gRklYTUU6IFZlcmlmeSB3aGV0aGVyIHRoZSByZXBhcnNlX3RhZyBpcyBub3QgdGhlCisgKiBwcmltYXJ5IGtleSAvIGlzIG5vdCBhIGtleSBhdCBhbGwuIChBSUEpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIHJlcGFyc2VfdGFnOwkvKiBSZXBhcnNlIHBvaW50IHR5cGUgKGluYy4gZmxhZ3MpLiAqLworCWxlTUZUX1JFRiBmaWxlX2lkOwkvKiBNZnQgcmVjb3JkIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisJCQkJICAgcmVwYXJzZSBwb2ludCBhdHRyaWJ1dGUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgUkVQQVJTRV9JTkRFWF9LRVk7CisKKy8qCisgKiBRdW90YSBmbGFncyAoMzItYml0KS4KKyAqCisgKiBUaGUgdXNlciBxdW90YSBmbGFncy4gIE5hbWVzIGV4cGxhaW4gbWVhbmluZy4KKyAqLworZW51bSB7CisJUVVPVEFfRkxBR19ERUZBVUxUX0xJTUlUUwk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCVFVT1RBX0ZMQUdfTElNSVRfUkVBQ0hFRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCVFVT1RBX0ZMQUdfSURfREVMRVRFRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KSwKKworCVFVT1RBX0ZMQUdfVVNFUl9NQVNLCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDcpLAorCS8qIFRoaXMgaXMgYSBiaXQgbWFzayBmb3IgdGhlIHVzZXIgcXVvdGEgZmxhZ3MuICovCisKKwkvKgorCSAqIFRoZXNlIGZsYWdzIGFyZSBvbmx5IHByZXNlbnQgaW4gdGhlIHF1b3RhIGRlZmF1bHRzIGluZGV4IGVudHJ5LCBpLmUuCisJICogaW4gdGhlIGVudHJ5IHdoZXJlIG93bmVyX2lkID0gUVVPVEFfREVGQVVMVFNfSUQuCisJICovCisJUVVPVEFfRkxBR19UUkFDS0lOR19FTkFCTEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCksCisJUVVPVEFfRkxBR19FTkZPUkNFTUVOVF9FTkFCTEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCksCisJUVVPVEFfRkxBR19UUkFDS0lOR19SRVFVRVNURUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKSwKKwlRVU9UQV9GTEFHX0xPR19USFJFU0hPTEQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDgwKSwKKworCVFVT1RBX0ZMQUdfTE9HX0xJTUlUCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAxMDApLAorCVFVT1RBX0ZMQUdfT1VUX09GX0RBVEUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDIwMCksCisJUVVPVEFfRkxBR19DT1JSVVBUCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDA0MDApLAorCVFVT1RBX0ZMQUdfUEVORElOR19ERUxFVEVTCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDgwMCksCit9OworCit0eXBlZGVmIGxlMzIgUVVPVEFfRkxBR1M7CisKKy8qCisgKiBUaGUgc3lzdGVtIGZpbGUgRklMRV9FeHRlbmQvJFF1b3RhIGNvbnRhaW5zIHR3byBpbmRleGVzICRPIGFuZCAkUS4gUXVvdGFzCisgKiBhcmUgb24gYSBwZXIgdm9sdW1lIGFuZCBwZXIgdXNlciBiYXNpcy4KKyAqCisgKiBUaGUgJFEgaW5kZXggY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIGV4aXN0aW5nIHVzZXJfaWQgb24gdGhlIHZvbHVtZS4gVGhlCisgKiBpbmRleCBrZXkgaXMgdGhlIHVzZXJfaWQgb2YgdGhlIHVzZXIvZ3JvdXAgb3duaW5nIHRoaXMgcXVvdGEgY29udHJvbCBlbnRyeSwKKyAqIGkuZS4gdGhlIGtleSBpcyB0aGUgb3duZXJfaWQuIFRoZSB1c2VyX2lkIG9mIHRoZSBvd25lciBvZiBhIGZpbGUsIGkuZS4gdGhlCisgKiBvd25lcl9pZCwgaXMgZm91bmQgaW4gdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZS4gVGhlIGNvbGxhdGlvbiBydWxlCisgKiBmb3IgJFEgaXMgQ09MTEFUSU9OX05UT0ZTX1VMT05HLgorICoKKyAqIFRoZSAkTyBpbmRleCBjb250YWlucyBvbmUgZW50cnkgZm9yIGVhY2ggdXNlci9ncm91cCB3aG8gaGFzIGJlZW4gYXNzaWduZWQKKyAqIGEgcXVvdGEgb24gdGhhdCB2b2x1bWUuIFRoZSBpbmRleCBrZXkgaG9sZHMgdGhlIFNJRCBvZiB0aGUgdXNlcl9pZCB0aGUKKyAqIGVudHJ5IGJlbG9uZ3MgdG8sIGkuZS4gdGhlIG93bmVyX2lkLiBUaGUgY29sbGF0aW9uIHJ1bGUgZm9yICRPIGlzCisgKiBDT0xMQVRJT05fTlRPRlNfU0lELgorICoKKyAqIFRoZSAkTyBpbmRleCBlbnRyeSBkYXRhIGlzIHRoZSB1c2VyX2lkIG9mIHRoZSB1c2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNJRC4KKyAqIFRoaXMgdXNlcl9pZCBpcyB1c2VkIGFzIGFuIGluZGV4IGludG8gJFEgdG8gZmluZCB0aGUgcXVvdGEgY29udHJvbCBlbnRyeQorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBTSUQuCisgKgorICogVGhlICRRIGluZGV4IGVudHJ5IGRhdGEgaXMgdGhlIHF1b3RhIGNvbnRyb2wgZW50cnkgYW5kIGlzIGRlZmluZWQgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIHZlcnNpb247CQkvKiBDdXJyZW50bHkgZXF1YWxzIDIuICovCisJUVVPVEFfRkxBR1MgZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhpcyBxdW90YSBlbnRyeS4gKi8KKwlsZTY0IGJ5dGVzX3VzZWQ7CS8qIEhvdyBtYW55IGJ5dGVzIG9mIHRoZSBxdW90YSBhcmUgaW4gdXNlLiAqLworCXNsZTY0IGNoYW5nZV90aW1lOwkvKiBMYXN0IHRpbWUgdGhpcyBxdW90YSBlbnRyeSB3YXMgY2hhbmdlZC4gKi8KKwlzbGU2NCB0aHJlc2hvbGQ7CS8qIFNvZnQgcXVvdGEgKC0xIGlmIG5vdCBsaW1pdGVkKS4gKi8KKwlzbGU2NCBsaW1pdDsJCS8qIEhhcmQgcXVvdGEgKC0xIGlmIG5vdCBsaW1pdGVkKS4gKi8KKwlzbGU2NCBleGNlZWRlZF90aW1lOwkvKiBIb3cgbG9uZyB0aGUgc29mdCBxdW90YSBoYXMgYmVlbiBleGNlZWRlZC4gKi8KKwlTSUQgc2lkOwkJLyogVGhlIFNJRCBvZiB0aGUgdXNlci9vYmplY3QgYXNzb2NpYXRlZCB3aXRoCisJCQkJICAgdGhpcyBxdW90YSBlbnRyeS4gIEVxdWFscyB6ZXJvIGZvciB0aGUgcXVvdGEKKwkJCQkgICBkZWZhdWx0cyBlbnRyeSAoYW5kIGluIGZhY3Qgb24gYSBXaW5YUAorCQkJCSAgIHZvbHVtZSwgaXQgaXMgbm90IHByZXNlbnQgYXQgYWxsKS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBRVU9UQV9DT05UUk9MX0VOVFJZOworCisvKgorICogUHJlZGVmaW5lZCBvd25lcl9pZCB2YWx1ZXMgKDMyLWJpdCkuCisgKi8KK2VudW0geworCVFVT1RBX0lOVkFMSURfSUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKKwlRVU9UQV9ERUZBVUxUU19JRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCVFVT1RBX0ZJUlNUX1VTRVJfSUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKSwKK307CisKKy8qCisgKiBDdXJyZW50IGNvbnN0YW50cyBmb3IgcXVvdGEgY29udHJvbCBlbnRyaWVzLgorICovCit0eXBlZGVmIGVudW0geworCS8qIEN1cnJlbnQgdmVyc2lvbi4gKi8KKwlRVU9UQV9WRVJTSU9OCT0gMiwKK30gUVVPVEFfQ09OVFJPTF9FTlRSWV9DT05TVEFOVFM7CisKKy8qCisgKiBJbmRleCBlbnRyeSBmbGFncyAoMTYtYml0KS4KKyAqLworZW51bSB7CisJSU5ERVhfRU5UUllfTk9ERSA9IGNvbnN0X2NwdV90b19sZTE2KDEpLCAvKiBUaGlzIGVudHJ5IGNvbnRhaW5zIGEKKwkJCXN1Yi1ub2RlLCBpLmUuIGEgcmVmZXJlbmNlIHRvIGFuIGluZGV4IGJsb2NrIGluIGZvcm0gb2YKKwkJCWEgdmlydHVhbCBjbHVzdGVyIG51bWJlciAoc2VlIGJlbG93KS4gKi8KKwlJTkRFWF9FTlRSWV9FTkQgID0gY29uc3RfY3B1X3RvX2xlMTYoMiksIC8qIFRoaXMgc2lnbmlmaWVzIHRoZSBsYXN0CisJCQllbnRyeSBpbiBhbiBpbmRleCBibG9jay4gIFRoZSBpbmRleCBlbnRyeSBkb2VzIG5vdAorCQkJcmVwcmVzZW50IGEgZmlsZSBidXQgaXQgY2FuIHBvaW50IHRvIGEgc3ViLW5vZGUuICovCisKKwlJTkRFWF9FTlRSWV9TUEFDRV9GSUxMRVIgPSBjb25zdF9jcHVfdG9fbGUxNigweGZmZmYpLCAvKiBnY2M6IEZvcmNlCisJCQllbnVtIGJpdCB3aWR0aCB0byAxNi1iaXQuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBJTkRFWF9FTlRSWV9GTEFHUzsKKworLyoKKyAqIFRoaXMgdGhlIGluZGV4IGVudHJ5IGhlYWRlciAoc2VlIGJlbG93KS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLyogIDAqLwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIE9ubHkgdmFsaWQgd2hlbiBJTkRFWF9FTlRSWV9FTkQgaXMgbm90IHNldC4gKi8KKwkJCWxlTUZUX1JFRiBpbmRleGVkX2ZpbGU7CS8qIFRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBmaWxlCisJCQkJCQkgICBkZXNjcmliZWQgYnkgdGhpcyBpbmRleAorCQkJCQkJICAgZW50cnkuIFVzZWQgZm9yIGRpcmVjdG9yeQorCQkJCQkJICAgaW5kZXhlcy4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRpcjsKKwkJc3RydWN0IHsgLyogVXNlZCBmb3Igdmlld3MvaW5kZXhlcyB0byBmaW5kIHRoZSBlbnRyeSdzIGRhdGEuICovCisJCQlsZTE2IGRhdGFfb2Zmc2V0OwkvKiBEYXRhIGJ5dGUgb2Zmc2V0IGZyb20gdGhpcworCQkJCQkJICAgSU5ERVhfRU5UUlkuIEZvbGxvd3MgdGhlCisJCQkJCQkgICBpbmRleCBrZXkuICovCisJCQlsZTE2IGRhdGFfbGVuZ3RoOwkvKiBEYXRhIGxlbmd0aCBpbiBieXRlcy4gKi8KKwkJCWxlMzIgcmVzZXJ2ZWRWOwkJLyogUmVzZXJ2ZWQgKHplcm8pLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdmk7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRhdGE7CisvKiAgOCovCWxlMTYgbGVuZ3RoOwkJIC8qIEJ5dGUgc2l6ZSBvZiB0aGlzIGluZGV4IGVudHJ5LCBtdWx0aXBsZSBvZgorCQkJCSAgICA4LWJ5dGVzLiAqLworLyogMTAqLwlsZTE2IGtleV9sZW5ndGg7CSAvKiBCeXRlIHNpemUgb2YgdGhlIGtleSB2YWx1ZSwgd2hpY2ggaXMgaW4gdGhlCisJCQkJICAgIGluZGV4IGVudHJ5LiBJdCBmb2xsb3dzIGZpZWxkIHJlc2VydmVkLiBOb3QKKwkJCQkgICAgbXVsdGlwbGUgb2YgOC1ieXRlcy4gKi8KKy8qIDEyKi8JSU5ERVhfRU5UUllfRkxBR1MgZmxhZ3M7IC8qIEJpdCBmaWVsZCBvZiBJTkRFWF9FTlRSWV8qIGZsYWdzLiAqLworLyogMTQqLwlsZTE2IHJlc2VydmVkOwkJIC8qIFJlc2VydmVkL2FsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIHNpemVvZigpID0gMTYgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9FTlRSWV9IRUFERVI7CisKKy8qCisgKiBUaGlzIGlzIGFuIGluZGV4IGVudHJ5LiBBIHNlcXVlbmNlIG9mIHN1Y2ggZW50cmllcyBmb2xsb3dzIGVhY2ggSU5ERVhfSEVBREVSCisgKiBzdHJ1Y3R1cmUuIFRvZ2V0aGVyIHRoZXkgbWFrZSB1cCBhIGNvbXBsZXRlIGluZGV4LiBUaGUgaW5kZXggZm9sbG93cyBlaXRoZXIKKyAqIGFuIGluZGV4IHJvb3QgYXR0cmlidXRlIG9yIGFuIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLgorICoKKyAqIE5PVEU6IEJlZm9yZSBOVEZTIDMuMCBvbmx5IGZpbGVuYW1lIGF0dHJpYnV0ZXMgd2VyZSBpbmRleGVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlJTkRFWF9FTlRSWV9IRUFERVI7IC0tIFVuZm9sZGVkIGhlcmUgYXMgZ2NjIGRpc2xpa2VzIHVubmFtZWQgc3RydWN0cy4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIE9ubHkgdmFsaWQgd2hlbiBJTkRFWF9FTlRSWV9FTkQgaXMgbm90IHNldC4gKi8KKwkJCWxlTUZUX1JFRiBpbmRleGVkX2ZpbGU7CS8qIFRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBmaWxlCisJCQkJCQkgICBkZXNjcmliZWQgYnkgdGhpcyBpbmRleAorCQkJCQkJICAgZW50cnkuIFVzZWQgZm9yIGRpcmVjdG9yeQorCQkJCQkJICAgaW5kZXhlcy4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRpcjsKKwkJc3RydWN0IHsgLyogVXNlZCBmb3Igdmlld3MvaW5kZXhlcyB0byBmaW5kIHRoZSBlbnRyeSdzIGRhdGEuICovCisJCQlsZTE2IGRhdGFfb2Zmc2V0OwkvKiBEYXRhIGJ5dGUgb2Zmc2V0IGZyb20gdGhpcworCQkJCQkJICAgSU5ERVhfRU5UUlkuIEZvbGxvd3MgdGhlCisJCQkJCQkgICBpbmRleCBrZXkuICovCisJCQlsZTE2IGRhdGFfbGVuZ3RoOwkvKiBEYXRhIGxlbmd0aCBpbiBieXRlcy4gKi8KKwkJCWxlMzIgcmVzZXJ2ZWRWOwkJLyogUmVzZXJ2ZWQgKHplcm8pLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdmk7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRhdGE7CisJbGUxNiBsZW5ndGg7CQkgLyogQnl0ZSBzaXplIG9mIHRoaXMgaW5kZXggZW50cnksIG11bHRpcGxlIG9mCisJCQkJICAgIDgtYnl0ZXMuICovCisJbGUxNiBrZXlfbGVuZ3RoOwkgLyogQnl0ZSBzaXplIG9mIHRoZSBrZXkgdmFsdWUsIHdoaWNoIGlzIGluIHRoZQorCQkJCSAgICBpbmRleCBlbnRyeS4gSXQgZm9sbG93cyBmaWVsZCByZXNlcnZlZC4gTm90CisJCQkJICAgIG11bHRpcGxlIG9mIDgtYnl0ZXMuICovCisJSU5ERVhfRU5UUllfRkxBR1MgZmxhZ3M7IC8qIEJpdCBmaWVsZCBvZiBJTkRFWF9FTlRSWV8qIGZsYWdzLiAqLworCWxlMTYgcmVzZXJ2ZWQ7CQkgLyogUmVzZXJ2ZWQvYWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCisvKiAxNiovCXVuaW9uIHsJCS8qIFRoZSBrZXkgb2YgdGhlIGluZGV4ZWQgYXR0cmlidXRlLiBOT1RFOiBPbmx5IHByZXNlbnQKKwkJCSAgIGlmIElOREVYX0VOVFJZX0VORCBiaXQgaW4gZmxhZ3MgaXMgbm90IHNldC4gTk9URTogT24KKwkJCSAgIE5URlMgdmVyc2lvbnMgYmVmb3JlIDMuMCB0aGUgb25seSB2YWxpZCBrZXkgaXMgdGhlCisJCQkgICBGSUxFX05BTUVfQVRUUi4gT24gTlRGUyAzLjArIHRoZSBmb2xsb3dpbmcKKwkJCSAgIGFkZGl0aW9uYWwgaW5kZXgga2V5cyBhcmUgZGVmaW5lZDogKi8KKwkJRklMRV9OQU1FX0FUVFIgZmlsZV9uYW1lOy8qICRJMzAgaW5kZXggaW4gZGlyZWN0b3JpZXMuICovCisJCVNJSV9JTkRFWF9LRVkgc2lpOwkvKiAkU0lJIGluZGV4IGluICRTZWN1cmUuICovCisJCVNESF9JTkRFWF9LRVkgc2RoOwkvKiAkU0RIIGluZGV4IGluICRTZWN1cmUuICovCisJCUdVSUQgb2JqZWN0X2lkOwkJLyogJE8gaW5kZXggaW4gRklMRV9FeHRlbmQvJE9iaklkOiBUaGUKKwkJCQkJICAgb2JqZWN0X2lkIG9mIHRoZSBtZnQgcmVjb3JkIGZvdW5kIGluCisJCQkJCSAgIHRoZSBkYXRhIHBhcnQgb2YgdGhlIGluZGV4LiAqLworCQlSRVBBUlNFX0lOREVYX0tFWSByZXBhcnNlOwkvKiAkUiBpbmRleCBpbgorCQkJCQkJICAgRklMRV9FeHRlbmQvJFJlcGFyc2UuICovCisJCVNJRCBzaWQ7CQkvKiAkTyBpbmRleCBpbiBGSUxFX0V4dGVuZC8kUXVvdGE6CisJCQkJCSAgIFNJRCBvZiB0aGUgb3duZXIgb2YgdGhlIHVzZXJfaWQuICovCisJCWxlMzIgb3duZXJfaWQ7CQkvKiAkUSBpbmRleCBpbiBGSUxFX0V4dGVuZC8kUXVvdGE6CisJCQkJCSAgIHVzZXJfaWQgb2YgdGhlIG93bmVyIG9mIHRoZSBxdW90YQorCQkJCQkgICBjb250cm9sIGVudHJ5IGluIHRoZSBkYXRhIHBhcnQgb2YKKwkJCQkJICAgdGhlIGluZGV4LiAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBrZXk7CisJLyogVGhlIChvcHRpb25hbCkgaW5kZXggZGF0YSBpcyBpbnNlcnRlZCBoZXJlIHdoZW4gY3JlYXRpbmcuICovCisJLy8gbGVWQ04gdmNuOwkvKiBJZiBJTkRFWF9FTlRSWV9OT0RFIGJpdCBpbiBmbGFncyBpcyBzZXQsIHRoZSBsYXN0CisJLy8JCSAgIGVpZ2h0IGJ5dGVzIG9mIHRoaXMgaW5kZXggZW50cnkgY29udGFpbiB0aGUgdmlydHVhbAorCS8vCQkgICBjbHVzdGVyIG51bWJlciBvZiB0aGUgaW5kZXggYmxvY2sgdGhhdCBob2xkcyB0aGUKKwkvLwkJICAgZW50cmllcyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGN1cnJlbnQgZW50cnkgKHRoZQorCS8vCQkgICB2Y24gcmVmZXJlbmNlcyB0aGUgY29ycmVzcG9uZGluZyBjbHVzdGVyIGluIHRoZSBkYXRhCisJLy8JCSAgIG9mIHRoZSBub24tcmVzaWRlbnQgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUpLiBJZgorCS8vCQkgICB0aGUga2V5X2xlbmd0aCBpcyB6ZXJvLCB0aGVuIHRoZSB2Y24gaW1tZWRpYXRlbHkKKwkvLwkJICAgZm9sbG93cyB0aGUgSU5ERVhfRU5UUllfSEVBREVSLiBSZWdhcmRsZXNzIG9mCisJLy8JCSAgIGtleV9sZW5ndGgsIHRoZSBhZGRyZXNzIG9mIHRoZSA4LWJ5dGUgYm91bmRhcnkKKwkvLwkJICAgYWxsaWduZWQgdmNuIG9mIElOREVYX0VOVFJZe19IRUFERVJ9ICppZSBpcyBnaXZlbiBieQorCS8vCQkgICAoY2hhciopaWUgKyBsZTE2X3RvX2NwdShpZSopLT5sZW5ndGgpIC0gc2l6ZW9mKFZDTiksCisJLy8JCSAgIHdoZXJlIHNpemVvZihWQ04pIGNhbiBiZSBoYXJkY29kZWQgYXMgOCBpZiB3YW50ZWQuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgSU5ERVhfRU5UUlk7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEJpdG1hcCAoMHhiMCkuCisgKgorICogQ29udGFpbnMgYW4gYXJyYXkgb2YgYml0cyAoYWthIGEgYml0ZmllbGQpLgorICoKKyAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSwgZWFjaCBiaXQKKyAqIGNvcnJlc3BvbmRzIHRvIG9uZSBpbmRleCBibG9jayB3aXRoaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiBUaHVzCisgKiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpdG1hcCAqIGluZGV4IGJsb2NrIHNpemUgLyBjbHVzdGVyIHNpemUgaXMgdGhlCisgKiBudW1iZXIgb2YgY2x1c3RlcnMgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggYml0bWFwWzBdOwkJCS8qIEFycmF5IG9mIGJpdHMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQklUTUFQX0FUVFI7CisKKy8qCisgKiBUaGUgcmVwYXJzZSBwb2ludCB0YWcgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgcmVwYXJzZSBwb2ludC4gSXQgYWxzbworICogaW5jbHVkZXMgc2V2ZXJhbCBmbGFncywgd2hpY2ggZnVydGhlciBkZXNjcmliZSB0aGUgcmVwYXJzZSBwb2ludC4KKyAqCisgKiBUaGUgcmVwYXJzZSBwb2ludCB0YWcgaXMgYW4gdW5zaWduZWQgMzItYml0IHZhbHVlIGRpdmlkZWQgaW4gdGhyZWUgcGFydHM6CisgKgorICogMS4gVGhlIGxlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgKGkuZS4gYml0cyAwIHRvIDE1KSBzcGVjaWZpeSB0aGUgdHlwZSBvZgorICogICAgdGhlIHJlcGFyc2UgcG9pbnQuCisgKiAyLiBUaGUgMTMgYml0cyBhZnRlciB0aGlzIChpLmUuIGJpdHMgMTYgdG8gMjgpIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqIDMuIFRoZSBtb3N0IHNpZ25pZmljYW50IHRocmVlIGJpdHMgYXJlIGZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlcGFyc2UgcG9pbnQuCisgKiAgICBUaGV5IGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKgliaXQgMjk6IE5hbWUgc3Vycm9nYXRlIGJpdC4gSWYgc2V0LCB0aGUgZmlsZW5hbWUgaXMgYW4gYWxpYXMgZm9yCisgKgkJYW5vdGhlciBvYmplY3QgaW4gdGhlIHN5c3RlbS4KKyAqCWJpdCAzMDogSGlnaC1sYXRlbmN5IGJpdC4gSWYgc2V0LCBhY2Nlc3NpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSB3aWxsCisgKgkJYmUgc2xvdy4gKEUuZy4gdGhlIGRhdGEgaXMgc3RvcmVkIG9uIGEgdGFwZSBkcml2ZS4pCisgKgliaXQgMzE6IE1pY3Jvc29mdCBiaXQuIElmIHNldCwgdGhlIHRhZyBpcyBvd25lZCBieSBNaWNyb3NvZnQuIFVzZXIKKyAqCQlkZWZpbmVkIHRhZ3MgaGF2ZSB0byB1c2UgemVybyBoZXJlLgorICoKKyAqIFRoZXNlIGFyZSB0aGUgcHJlZGVmaW5lZCByZXBhcnNlIHBvaW50IHRhZ3M6CisgKi8KK2VudW0geworCUlPX1JFUEFSU0VfVEFHX0lTX0FMSUFTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MjAwMDAwMDApLAorCUlPX1JFUEFSU0VfVEFHX0lTX0hJR0hfTEFURU5DWQk9IGNvbnN0X2NwdV90b19sZTMyKDB4NDAwMDAwMDApLAorCUlPX1JFUEFSU0VfVEFHX0lTX01JQ1JPU09GVAk9IGNvbnN0X2NwdV90b19sZTMyKDB4ODAwMDAwMDApLAorCisJSU9fUkVQQVJTRV9UQUdfUkVTRVJWRURfWkVSTwk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDApLAorCUlPX1JFUEFSU0VfVEFHX1JFU0VSVkVEX09ORQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCUlPX1JFUEFSU0VfVEFHX1JFU0VSVkVEX1JBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSksCisKKwlJT19SRVBBUlNFX1RBR19OU1MJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg2ODAwMDAwNSksCisJSU9fUkVQQVJTRV9UQUdfTlNTX1JFQ09WRVIJPSBjb25zdF9jcHVfdG9fbGUzMigweDY4MDAwMDA2KSwKKwlJT19SRVBBUlNFX1RBR19TSVMJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg2ODAwMDAwNyksCisJSU9fUkVQQVJTRV9UQUdfREZTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4NjgwMDAwMDgpLAorCisJSU9fUkVQQVJTRV9UQUdfTU9VTlRfUE9JTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDg4MDAwMDAzKSwKKworCUlPX1JFUEFSU0VfVEFHX0hTTQkJPSBjb25zdF9jcHVfdG9fbGUzMigweGE4MDAwMDA0KSwKKworCUlPX1JFUEFSU0VfVEFHX1NZTUJPTElDX0xJTksJPSBjb25zdF9jcHVfdG9fbGUzMigweGU4MDAwMDAwKSwKKworCUlPX1JFUEFSU0VfVEFHX1ZBTElEX1ZBTFVFUwk9IGNvbnN0X2NwdV90b19sZTMyKDB4ZTAwMGZmZmYpLAorfTsKKworLyoKKyAqIEF0dHJpYnV0ZTogUmVwYXJzZSBwb2ludCAoMHhjMCkuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgcmVwYXJzZV90YWc7CQkvKiBSZXBhcnNlIHBvaW50IHR5cGUgKGluYy4gZmxhZ3MpLiAqLworCWxlMTYgcmVwYXJzZV9kYXRhX2xlbmd0aDsJLyogQnl0ZSBzaXplIG9mIHJlcGFyc2UgZGF0YS4gKi8KKwlsZTE2IHJlc2VydmVkOwkJCS8qIEFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKwl1OCByZXBhcnNlX2RhdGFbMF07CQkvKiBNZWFuaW5nIGRlcGVuZHMgb24gcmVwYXJzZV90YWcuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgUkVQQVJTRV9QT0lOVDsKKworLyoKKyAqIEF0dHJpYnV0ZTogRXh0ZW5kZWQgYXR0cmlidXRlIChFQSkgaW5mb3JtYXRpb24gKDB4ZDApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4gKElzIHRoaXMgdHJ1ZT8/PykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMTYgZWFfbGVuZ3RoOwkJLyogQnl0ZSBzaXplIG9mIHRoZSBwYWNrZWQgZXh0ZW5kZWQKKwkJCQkgICBhdHRyaWJ1dGVzLiAqLworCWxlMTYgbmVlZF9lYV9jb3VudDsJLyogVGhlIG51bWJlciBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIHdoaWNoIGhhdmUKKwkJCQkgICB0aGUgTkVFRF9FQSBiaXQgc2V0LiAqLworCWxlMzIgZWFfcXVlcnlfbGVuZ3RoOwkvKiBCeXRlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBxdWVyeQorCQkJCSAgIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIHdoZW4gY2FsbGluZworCQkJCSAgIFp3UXVlcnlFYUZpbGUoKSBpbiBXaW5kb3dzIE5ULzJrLiBJLmUuIHRoZQorCQkJCSAgIGJ5dGUgc2l6ZSBvZiB0aGUgdW5wYWNrZWQgZXh0ZW5kZWQKKwkJCQkgICBhdHRyaWJ1dGVzLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEVBX0lORk9STUFUSU9OOworCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlIGZsYWdzICg4LWJpdCkuCisgKi8KK2VudW0geworCU5FRURfRUEJPSAweDgwCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgdTggRUFfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEV4dGVuZGVkIGF0dHJpYnV0ZSAoRUEpICgweGUwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgbm9uLXJlc2lkZW50LiAoSXMgdGhpcyB0cnVlPykKKyAqCisgKiBMaWtlIHRoZSBhdHRyaWJ1dGUgbGlzdCBhbmQgdGhlIGluZGV4IGJ1ZmZlciBsaXN0LCB0aGUgRUEgYXR0cmlidXRlIHZhbHVlIGlzCisgKiBhIHNlcXVlbmNlIG9mIEVBX0FUVFIgdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMuCisgKgorICogRklYTUU6IEl0IGFwcGVhcnMgd2VpcmQgdGhhdCB0aGUgRUEgbmFtZSBpcyBub3QgdW5pY29kZS4gSXMgaXQgdHJ1ZT8KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgbmV4dF9lbnRyeV9vZmZzZXQ7CS8qIE9mZnNldCB0byB0aGUgbmV4dCBFQV9BVFRSLiAqLworCUVBX0ZMQUdTIGZsYWdzOwkJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgRUEuICovCisJdTggZWFfbmFtZV9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgbmFtZSBvZiB0aGUgRUEgaW4gYnl0ZXMuICovCisJbGUxNiBlYV92YWx1ZV9sZW5ndGg7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgRUEncyB2YWx1ZS4gKi8KKwl1OCBlYV9uYW1lWzBdOwkJLyogTmFtZSBvZiB0aGUgRUEuICovCisJdTggZWFfdmFsdWVbMF07CQkvKiBUaGUgdmFsdWUgb2YgdGhlIEVBLiBJbW1lZGlhdGVseSBmb2xsb3dzCisJCQkJICAgdGhlIG5hbWUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgRUFfQVRUUjsKKworLyoKKyAqIEF0dHJpYnV0ZTogUHJvcGVydHkgc2V0ICgweGYwKS4KKyAqCisgKiBJbnRlbmRlZCB0byBzdXBwb3J0IE5hdGl2ZSBTdHJ1Y3R1cmUgU3RvcmFnZSAoTlNTKSAtIGEgZmVhdHVyZSByZW1vdmVkIGZyb20KKyAqIE5URlMgMy4wIGR1cmluZyBiZXRhIHRlc3RpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBJcnJlbGV2YW50IGFzIGZlYXR1cmUgdW51c2VkLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFBST1BFUlRZX1NFVDsKKworLyoKKyAqIEF0dHJpYnV0ZTogTG9nZ2VkIHV0aWxpdHkgc3RyZWFtICgweDEwMCkuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqCisgKiBPcGVyYXRpb25zIG9uIHRoaXMgYXR0cmlidXRlIGFyZSBsb2dnZWQgdG8gdGhlIGpvdXJuYWwgKCRMb2dGaWxlKSBsaWtlCisgKiBub3JtYWwgbWV0YWRhdGEgY2hhbmdlcy4KKyAqCisgKiBVc2VkIGJ5IHRoZSBFbmNyeXB0aW5nIEZpbGUgU3lzdGVtIChFRlMpLiBBbGwgZW5jcnlwdGVkIGZpbGVzIGhhdmUgdGhpcworICogYXR0cmlidXRlIHdpdGggdGhlIG5hbWUgJEVGUy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIENhbiBiZSBhbnl0aGluZyB0aGUgY3JlYXRvciBjaG9vc2VzLiAqLworCS8qIEVGUyB1c2VzIGl0IGFzIGZvbGxvd3M6ICovCisJLy8gRklYTUU6IFR5cGUgdGhpcyBpbmZvLCB2ZXJpZnlpbmcgaXQgYWxvbmcgdGhlIHdheS4gKEFJQSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBMT0dHRURfVVRJTElUWV9TVFJFQU0sIEVGU19BVFRSOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfTEFZT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGNuYWxsb2MuYyBiL2ZzL250ZnMvbGNuYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZkOTExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9sY25hbGxvYy5jCkBAIC0wLDAgKzEsMTAwMiBAQAorLyoKKyAqIGxjbmFsbG9jLmMgLSBDbHVzdGVyIChkZSlhbGxvY2F0aW9uIGNvZGUuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJsY25hbGxvYy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYml0bWFwLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrIC0gZnJlZSBjbHVzdGVycyBmcm9tIHJ1bmxpc3QKKyAqIEB2b2w6CW1vdW50ZWQgbnRmcyB2b2x1bWUgb24gd2hpY2ggdG8gZnJlZSB0aGUgY2x1c3RlcnMKKyAqIEBybDoJCXJ1bmxpc3QgZGVzY3JpYmluZyB0aGUgY2x1c3RlcnMgdG8gZnJlZQorICoKKyAqIEZyZWUgYWxsIHRoZSBjbHVzdGVycyBkZXNjcmliZWQgYnkgdGhlIHJ1bmxpc3QgQHJsIG9uIHRoZSB2b2x1bWUgQHZvbC4gIEluCisgKiB0aGUgY2FzZSBvZiBhbiBlcnJvciBiZWluZyByZXR1cm5lZCwgYXQgbGVhc3Qgc29tZSBvZiB0aGUgY2x1c3RlcnMgd2VyZSBub3QKKyAqIGZyZWVkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIGxvY2tlZCBmb3Igd3JpdGluZyBvbiBlbnRyeSBhbmQgaXMKKyAqCSAgICAgIGxlZnQgbG9ja2VkIG9uIHJldHVybi4KKyAqLworaW50IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwpCit7CisJc3RydWN0IGlub2RlICpsY25ibXBfdmkgPSB2b2wtPmxjbmJtcF9pbm87CisJaW50IHJldCA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgeworCQlpbnQgZXJyOworCisJCWlmIChybC0+bGNuIDwgMCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBudGZzX2JpdG1hcF9jbGVhcl9ydW4obGNuYm1wX3ZpLCBybC0+bGNuLCBybC0+bGVuZ3RoKTsKKwkJaWYgKHVubGlrZWx5KGVyciAmJiAoIXJldCB8fCByZXQgPT0gRU5PTUVNKSAmJiByZXQgIT0gZXJyKSkKKwkJCXJldCA9IGVycjsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9hbGxvYyAtIGFsbG9jYXRlIGNsdXN0ZXJzIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdm9sOgltb3VudGVkIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBjbHVzdGVycworICogQHN0YXJ0X3ZjbjoJdmNuIHRvIHVzZSBmb3IgdGhlIGZpcnN0IGFsbG9jYXRlZCBjbHVzdGVyCisgKiBAY291bnQ6CW51bWJlciBvZiBjbHVzdGVycyB0byBhbGxvY2F0ZQorICogQHN0YXJ0X2xjbjoJc3RhcnRpbmcgbGNuIGF0IHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBjbHVzdGVycyAob3IgLTEgaWYgbm9uZSkKKyAqIEB6b25lOgl6b25lIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIGNsdXN0ZXJzCisgKgorICogQWxsb2NhdGUgQGNvdW50IGNsdXN0ZXJzIHByZWZlcmFibHkgc3RhcnRpbmcgYXQgY2x1c3RlciBAc3RhcnRfbGNuIG9yIGF0IHRoZQorICogY3VycmVudCBhbGxvY2F0b3IgcG9zaXRpb24gaWYgQHN0YXJ0X2xjbiBpcyAtMSwgb24gdGhlIG1vdW50ZWQgbnRmcyB2b2x1bWUKKyAqIEB2b2wuIEB6b25lIGlzIGVpdGhlciBEQVRBX1pPTkUgZm9yIGFsbG9jYXRpb24gb2Ygbm9ybWFsIGNsdXN0ZXJzIG9yCisgKiBNRlRfWk9ORSBmb3IgYWxsb2NhdGlvbiBvZiBjbHVzdGVycyBmb3IgdGhlIG1hc3RlciBmaWxlIHRhYmxlLCBpLmUuIHRoZQorICogJE1GVC8kREFUQSBhdHRyaWJ1dGUuCisgKgorICogQHN0YXJ0X3ZjbiBzcGVjaWZpZXMgdGhlIHZjbiBvZiB0aGUgZmlyc3QgYWxsb2NhdGVkIGNsdXN0ZXIuICBUaGlzIG1ha2VzCisgKiBtZXJnaW5nIHRoZSByZXN1bHRpbmcgcnVubGlzdCB3aXRoIHRoZSBvbGQgcnVubGlzdCBlYXNpZXIuCisgKgorICogWW91IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSB3aXRoIElTX0VSUigpLiAgSWYgdGhpcyBpcyBmYWxzZSwgdGhlCisgKiBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHJ1bmxpc3QgZGVzY3JpYmluZyB0aGUKKyAqIGFsbG9jYXRlZCBjbHVzdGVyKHMpLiAgSWYgSVNfRVJSKCkgaXMgdHJ1ZSwgdGhlIGZ1bmN0aW9uIGZhaWxlZCBhbmQKKyAqIFBUUl9FUlIoKSBnaXZlcyB5b3UgdGhlIGVycm9yIGNvZGUuCisgKgorICogTm90ZXMgb24gdGhlIGFsbG9jYXRpb24gYWxnb3JpdGhtCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGVyZSBhcmUgdHdvIGRhdGEgem9uZXMuICBGaXJzdCBpcyB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG1mdCB6b25lCisgKiBhbmQgdGhlIGVuZCBvZiB0aGUgdm9sdW1lLCBhbmQgc2Vjb25kIGlzIHRoZSBhcmVhIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQorICogdm9sdW1lIGFuZCB0aGUgc3RhcnQgb2YgdGhlIG1mdCB6b25lLiAgT24gdW5tb2RpZmllZC9zdGFuZGFyZCBOVEZTIDEueAorICogdm9sdW1lcywgdGhlIHNlY29uZCBkYXRhIHpvbmUgZG9lcyBub3QgZXhpc3QgZHVlIHRvIHRoZSBtZnQgem9uZSBiZWluZworICogZXhwYW5kZWQgdG8gY292ZXIgdGhlIHN0YXJ0IG9mIHRoZSB2b2x1bWUgaW4gb3JkZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlCisgKiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4KKyAqCisgKiBUaGlzIGlzIG5vdCB0aGUgcHJldHRpZXN0IGZ1bmN0aW9uIGJ1dCB0aGUgY29tcGxleGl0eSBzdGVtcyBmcm9tIHRoZSBuZWVkIG9mCisgKiBpbXBsZW1lbnRpbmcgdGhlIG1mdCB2cyBkYXRhIHpvbmVkIGFwcHJvYWNoIGFuZCBmcm9tIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZQorICogYWNjZXNzIHRvIHRoZSBsY24gYml0bWFwIGluIHBvcnRpb25zIG9mIHVwIHRvIDgxOTIgYnl0ZXMgYXQgYSB0aW1lLCBzbyB3ZQorICogbmVlZCB0byBjb3BlIHdpdGggY3Jvc3Npbmcgb3ZlciBib3VuZGFyaWVzIG9mIHR3byBidWZmZXJzLiAgRnVydGhlciwgdGhlCisgKiBmYWN0IHRoYXQgdGhlIGFsbG9jYXRvciBhbGxvd3MgZm9yIGNhbGxlciBzdXBwbGllZCBoaW50cyBhcyB0byB0aGUgbG9jYXRpb24KKyAqIG9mIHdoZXJlIGFsbG9jYXRpb24gc2hvdWxkIGJlZ2luIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSBhbGxvY2F0b3Iga2VlcHMgdHJhY2sKKyAqIG9mIHdoZXJlIGluIHRoZSBkYXRhIHpvbmVzIHRoZSBuZXh0IG5hdHVyYWwgYWxsb2NhdGlvbiBzaG91bGQgb2NjdXIsCisgKiBjb250cmlidXRlIHRvIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBmdW5jdGlvbi4gIEJ1dCBpdCBzaG91bGQgYWxsIGJlCisgKiB3b3J0aHdoaWxlLCBiZWNhdXNlIHRoaXMgYWxsb2NhdG9yIHNob3VsZDogMSkgYmUgYSBmdWxsIGltcGxlbWVudGF0aW9uIG9mCisgKiB0aGUgTUZUIHpvbmUgYXBwcm9hY2ggdXNlZCBieSBXaW5kb3dzIE5ULCAyKSBjYXVzZSByZWR1Y3Rpb24gaW4KKyAqIGZyYWdtZW50YXRpb24sIGFuZCAzKSBiZSBzcGVlZHkgaW4gYWxsb2NhdGlvbnMgKHRoZSBjb2RlIGlzIG5vdCBvcHRpbWl6ZWQKKyAqIGZvciBzcGVlZCwgYnV0IHRoZSBhbGdvcml0aG0gaXMsIHNvIGZ1cnRoZXIgc3BlZWQgaW1wcm92ZW1lbnRzIGFyZSBwcm9iYWJseQorICogcG9zc2libGUpLgorICoKKyAqIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9uaXRvcmluZyBjbHVzdGVyIGFsbG9jYXRpb24gYW5kIGluY3JlbWVudCB0aGUgTUZUIHpvbmUKKyAqIHNpemUgZHluYW1pY2FsbHkgYnV0IHRoaXMgaXMgc29tZXRoaW5nIGZvciB0aGUgZnV0dXJlLiAgV2Ugd2lsbCBqdXN0IGNhdXNlCisgKiBoZWF2aWVyIGZyYWdtZW50YXRpb24gYnkgbm90IGRvaW5nIGl0IGFuZCBJIGFtIG5vdCBldmVuIHN1cmUgV2luZG93cyB3b3VsZAorICogZ3JvdyB0aGUgTUZUIHpvbmUgZHluYW1pY2FsbHksIHNvIGl0IG1pZ2h0IGV2ZW4gYmUgY29ycmVjdCBub3QgdG8gZG8gdGhpcy4KKyAqIFRoZSBvdmVyaGVhZCBpbiBkb2luZyBkeW5hbWljIE1GVCB6b25lIGV4cGFuc2lvbiB3b3VsZCBiZSB2ZXJ5IGxhcmdlIGFuZAorICogdW5saWtlbHkgd29ydGggdGhlIGVmZm9ydC4gKEFJQSkKKyAqCisgKiBUT0RPOiBJIGhhdmUgYWRkZWQgaW4gZG91YmxlIHRoZSByZXF1aXJlZCB6b25lIHBvc2l0aW9uIHBvaW50ZXIgd3JhcCBhcm91bmQKKyAqIGxvZ2ljIHdoaWNoIGNhbiBiZSBvcHRpbWl6ZWQgdG8gaGF2aW5nIG9ubHkgb25lIG9mIHRoZSB0d28gbG9naWMgc2V0cy4KKyAqIEhvd2V2ZXIsIGhhdmluZyB0aGUgZG91YmxlIGxvZ2ljIHdpbGwgd29yayBmaW5lLCBidXQgaWYgd2UgaGF2ZSBvbmx5IG9uZSBvZgorICogdGhlIHNldHMgYW5kIHdlIGdldCBpdCB3cm9uZyBzb21ld2hlcmUsIHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSwgc28KKyAqIHJlbW92aW5nIHRoZSBkdXBsaWNhdGUgbG9naWMgcmVxdWlyZXMgX3ZlcnlfIGNhcmVmdWwgY29uc2lkZXJhdGlvbiBvZiBfYWxsXworICogcG9zc2libGUgY29kZSBwYXRocy4gIFNvIGF0IGxlYXN0IGZvciBub3csIEkgYW0gbGVhdmluZyB0aGUgZG91YmxlIGxvZ2ljIC0KKyAqIGJldHRlciBzYWZlIHRoYW4gc29ycnkuLi4gKEFJQSkKKyAqCisgKiBMb2NraW5nOiAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZAorICoJICAgICAgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKKyAqCSAgICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCisgKi8KK3J1bmxpc3RfZWxlbWVudCAqbnRmc19jbHVzdGVyX2FsbG9jKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IFZDTiBzdGFydF92Y24sCisJCWNvbnN0IHM2NCBjb3VudCwgY29uc3QgTENOIHN0YXJ0X2xjbiwKKwkJY29uc3QgTlRGU19DTFVTVEVSX0FMTE9DQVRJT05fWk9ORVMgem9uZSkKK3sKKwlMQ04gem9uZV9zdGFydCwgem9uZV9lbmQsIGJtcF9wb3MsIGJtcF9pbml0aWFsX3BvcywgbGFzdF9yZWFkX3BvcywgbGNuOworCUxDTiBwcmV2X2xjbiA9IDAsIHByZXZfcnVuX2xlbiA9IDAsIG1mdF96b25lX3NpemU7CisJczY0IGNsdXN0ZXJzOworCXN0cnVjdCBpbm9kZSAqbGNuYm1wX3ZpOworCXJ1bmxpc3RfZWxlbWVudCAqcmwgPSBOVUxMOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1OCAqYnVmLCAqYnl0ZTsKKwlpbnQgZXJyID0gMCwgcmxwb3MsIHJsc2l6ZSwgYnVmX3NpemU7CisJdTggcGFzcywgZG9uZV96b25lcywgc2VhcmNoX3pvbmUsIG5lZWRfd3JpdGViYWNrID0gMCwgYml0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIHN0YXJ0X3ZjbiAweCVsbHgsIGNvdW50IDB4JWxseCwgc3RhcnRfbGNuICIKKwkJCSIweCVsbHgsIHpvbmUgJXNfWk9ORS4iLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X3ZjbiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY291bnQsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X2xjbiwKKwkJCXpvbmUgPT0gTUZUX1pPTkUgPyAiTUZUIiA6ICJEQVRBIik7CisJQlVHX09OKCF2b2wpOworCWxjbmJtcF92aSA9IHZvbC0+bGNuYm1wX2lubzsKKwlCVUdfT04oIWxjbmJtcF92aSk7CisJQlVHX09OKHN0YXJ0X3ZjbiA8IDApOworCUJVR19PTihjb3VudCA8IDApOworCUJVR19PTihzdGFydF9sY24gPCAtMSk7CisJQlVHX09OKHpvbmUgPCBGSVJTVF9aT05FKTsKKwlCVUdfT04oem9uZSA+IExBU1RfWk9ORSk7CisKKwkvKiBSZXR1cm4gZW1wdHkgcnVubGlzdCBpZiBAY291bnQgPT0gMCAqLworCS8vIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGp1c3QgcmV0dXJuIE5VTEwgaW5zdGVhZD8gKEFJQSkKKwlpZiAoIWNvdW50KSB7CisJCXJsID0gbnRmc19tYWxsb2Nfbm9mcyhQQUdFX1NJWkUpOworCQlpZiAoIXJsKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJsWzBdLnZjbiA9IHN0YXJ0X3ZjbjsKKwkJcmxbMF0ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCXJsWzBdLmxlbmd0aCA9IDA7CisJCXJldHVybiBybDsKKwl9CisJLyogVGFrZSB0aGUgbGNuYm1wIGxvY2sgZm9yIHdyaXRpbmcuICovCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJLyoKKwkgKiBJZiBubyBzcGVjaWZpYyBAc3RhcnRfbGNuIHdhcyByZXF1ZXN0ZWQsIHVzZSB0aGUgY3VycmVudCBkYXRhIHpvbmUKKwkgKiBwb3NpdGlvbiwgb3RoZXJ3aXNlIHVzZSB0aGUgcmVxdWVzdGVkIEBzdGFydF9sY24gYnV0IG1ha2Ugc3VyZSBpdAorCSAqIGxpZXMgb3V0c2lkZSB0aGUgbWZ0IHpvbmUuICBBbHNvIHNldCBkb25lX3pvbmVzIHRvIDAgKG5vIHpvbmVzIGRvbmUpCisJICogYW5kIHBhc3MgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHN0YXJ0aW5nIGluc2lkZSBhIHpvbmUgKDEpIG9yCisJICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIHpvbmUgKDIpLiAgSWYgcmVxdWVzdGluZyBmcm9tIHRoZSBNRlRfWk9ORSwKKwkgKiB3ZSBlaXRoZXIgc3RhcnQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBtZnQgem9uZSBvciBhdAorCSAqIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uICBJZiB0aGUgbGF0dGVyIGlzIG91dCBvZiBib3VuZHMgdGhlbiB3ZSBzdGFydAorCSAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1GVF9aT05FLgorCSAqLworCWRvbmVfem9uZXMgPSAwOworCXBhc3MgPSAxOworCS8qCisJICogem9uZV9zdGFydCBhbmQgem9uZV9lbmQgYXJlIHRoZSBjdXJyZW50IHNlYXJjaCByYW5nZS4gIHNlYXJjaF96b25lCisJICogaXMgMSBmb3IgbWZ0IHpvbmUsIDIgZm9yIGRhdGEgem9uZSAxIChlbmQgb2YgbWZ0IHpvbmUgdGlsbCBlbmQgb2YKKwkgKiB2b2x1bWUpIGFuZCA0IGZvciBkYXRhIHpvbmUgMiAoc3RhcnQgb2Ygdm9sdW1lIHRpbGwgc3RhcnQgb2YgbWZ0CisJICogem9uZSkuCisJICovCisJem9uZV9zdGFydCA9IHN0YXJ0X2xjbjsKKwlpZiAoem9uZV9zdGFydCA8IDApIHsKKwkJaWYgKHpvbmUgPT0gREFUQV9aT05FKQorCQkJem9uZV9zdGFydCA9IHZvbC0+ZGF0YTFfem9uZV9wb3M7CisJCWVsc2UKKwkJCXpvbmVfc3RhcnQgPSB2b2wtPm1mdF96b25lX3BvczsKKwkJaWYgKCF6b25lX3N0YXJ0KSB7CisJCQkvKgorCQkJICogWm9uZSBzdGFydHMgYXQgYmVnaW5uaW5nIG9mIHZvbHVtZSB3aGljaCBtZWFucyBhCisJCQkgKiBzaW5nbGUgcGFzcyBpcyBzdWZmaWNpZW50LgorCQkJICovCisJCQlwYXNzID0gMjsKKwkJfQorCX0gZWxzZSBpZiAoem9uZSA9PSBEQVRBX1pPTkUgJiYgem9uZV9zdGFydCA+PSB2b2wtPm1mdF96b25lX3N0YXJ0ICYmCisJCQl6b25lX3N0YXJ0IDwgdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJem9uZV9zdGFydCA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQkvKgorCQkgKiBTdGFydGluZyBhdCBiZWdpbm5pbmcgb2YgZGF0YTFfem9uZSB3aGljaCBtZWFucyBhIHNpbmdsZQorCQkgKiBwYXNzIGluIHRoaXMgem9uZSBpcyBzdWZmaWNpZW50LgorCQkgKi8KKwkJcGFzcyA9IDI7CisJfSBlbHNlIGlmICh6b25lID09IE1GVF9aT05FICYmICh6b25lX3N0YXJ0IDwgdm9sLT5tZnRfem9uZV9zdGFydCB8fAorCQkJem9uZV9zdGFydCA+PSB2b2wtPm1mdF96b25lX2VuZCkpIHsKKwkJem9uZV9zdGFydCA9IHZvbC0+bWZ0X2xjbjsKKwkJaWYgKCF2b2wtPm1mdF96b25lX2VuZCkKKwkJCXpvbmVfc3RhcnQgPSAwOworCQkvKgorCQkgKiBTdGFydGluZyBhdCBiZWdpbm5pbmcgb2Ygdm9sdW1lIHdoaWNoIG1lYW5zIGEgc2luZ2xlIHBhc3MKKwkJICogaXMgc3VmZmljaWVudC4KKwkJICovCisJCXBhc3MgPSAyOworCX0KKwlpZiAoem9uZSA9PSBNRlRfWk9ORSkgeworCQl6b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQlzZWFyY2hfem9uZSA9IDE7CisJfSBlbHNlIC8qIGlmICh6b25lID09IERBVEFfWk9ORSkgKi8geworCQkvKiBTa2lwIHNlYXJjaGluZyB0aGUgbWZ0IHpvbmUuICovCisJCWRvbmVfem9uZXMgfD0gMTsKKwkJaWYgKHpvbmVfc3RhcnQgPj0gdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJCXpvbmVfZW5kID0gdm9sLT5ucl9jbHVzdGVyczsKKwkJCXNlYXJjaF96b25lID0gMjsKKwkJfSBlbHNlIHsKKwkJCXpvbmVfZW5kID0gdm9sLT5tZnRfem9uZV9zdGFydDsKKwkJCXNlYXJjaF96b25lID0gNDsKKwkJfQorCX0KKwkvKgorCSAqIGJtcF9wb3MgaXMgdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluc2lkZSB0aGUgYml0bWFwLiAgV2UgdXNlCisJICogYm1wX2luaXRpYWxfcG9zIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0byBkbyBhIHpvbmUgc3dpdGNoLgorCSAqLworCWJtcF9wb3MgPSBibXBfaW5pdGlhbF9wb3MgPSB6b25lX3N0YXJ0OworCisJLyogTG9vcCB1bnRpbCBhbGwgY2x1c3RlcnMgYXJlIGFsbG9jYXRlZCwgaS5lLiBjbHVzdGVycyA9PSAwLiAqLworCWNsdXN0ZXJzID0gY291bnQ7CisJcmxwb3MgPSBybHNpemUgPSAwOworCW1hcHBpbmcgPSBsY25ibXBfdmktPmlfbWFwcGluZzsKKwl3aGlsZSAoMSkgeworCQludGZzX2RlYnVnKCJTdGFydCBvZiBvdXRlciB3aGlsZSBsb29wOiBkb25lX3pvbmVzIDB4JXgsICIKKwkJCQkic2VhcmNoX3pvbmUgJWksIHBhc3MgJWksIHpvbmVfc3RhcnQgMHglbGx4LCAiCisJCQkJInpvbmVfZW5kIDB4JWxseCwgYm1wX2luaXRpYWxfcG9zIDB4JWxseCwgIgorCQkJCSJibXBfcG9zIDB4JWxseCwgcmxwb3MgJWksIHJsc2l6ZSAlaS4iLAorCQkJCWRvbmVfem9uZXMsIHNlYXJjaF96b25lLCBwYXNzLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpem9uZV9zdGFydCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX2luaXRpYWxfcG9zLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3Bvcywgcmxwb3MsIHJsc2l6ZSk7CisJCS8qIExvb3AgdW50aWwgd2UgcnVuIG91dCBvZiBmcmVlIGNsdXN0ZXJzLiAqLworCQlsYXN0X3JlYWRfcG9zID0gYm1wX3BvcyA+PiAzOworCQludGZzX2RlYnVnKCJsYXN0X3JlYWRfcG9zIDB4JWxseC4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9yZWFkX3Bvcyk7CisJCWlmIChsYXN0X3JlYWRfcG9zID4gbGNuYm1wX3ZpLT5pX3NpemUpIHsKKwkJCW50ZnNfZGVidWcoIkVuZCBvZiBhdHRyaWJ1dGUgcmVhY2hlZC4gICIKKwkJCQkJIlNraXBwaW5nIHRvIHpvbmVfcGFzc19kb25lLiIpOworCQkJZ290byB6b25lX3Bhc3NfZG9uZTsKKwkJfQorCQlpZiAobGlrZWx5KHBhZ2UpKSB7CisJCQlpZiAobmVlZF93cml0ZWJhY2spIHsKKwkJCQludGZzX2RlYnVnKCJNYXJraW5nIHBhZ2UgZGlydHkuIik7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCQkJbmVlZF93cml0ZWJhY2sgPSAwOworCQkJfQorCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQl9CisJCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1hcHBpbmcsIGxhc3RfcmVhZF9wb3MgPj4KKwkJCQlQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgcGFnZS4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ1Zl9zaXplID0gbGFzdF9yZWFkX3BvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIGJ1Zl9zaXplOworCQlidWZfc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIGJ1Zl9zaXplOworCQlpZiAodW5saWtlbHkobGFzdF9yZWFkX3BvcyArIGJ1Zl9zaXplID4gbGNuYm1wX3ZpLT5pX3NpemUpKQorCQkJYnVmX3NpemUgPSBsY25ibXBfdmktPmlfc2l6ZSAtIGxhc3RfcmVhZF9wb3M7CisJCWJ1Zl9zaXplIDw8PSAzOworCQlsY24gPSBibXBfcG9zICYgNzsKKwkJYm1wX3BvcyAmPSB+NzsKKwkJbnRmc19kZWJ1ZygiQmVmb3JlIGlubmVyIHdoaWxlIGxvb3A6IGJ1Zl9zaXplICVpLCBsY24gMHglbGx4LCAiCisJCQkJImJtcF9wb3MgMHglbGx4LCBuZWVkX3dyaXRlYmFjayAlaS4iLCBidWZfc2l6ZSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MsIG5lZWRfd3JpdGViYWNrKTsKKwkJd2hpbGUgKGxjbiA8IGJ1Zl9zaXplICYmIGxjbiArIGJtcF9wb3MgPCB6b25lX2VuZCkgeworCQkJYnl0ZSA9IGJ1ZiArIChsY24gPj4gMyk7CisJCQludGZzX2RlYnVnKCJJbiBpbm5lciB3aGlsZSBsb29wOiBidWZfc2l6ZSAlaSwgIgorCQkJCQkibGNuIDB4JWxseCwgYm1wX3BvcyAweCVsbHgsICIKKwkJCQkJIm5lZWRfd3JpdGViYWNrICVpLCBieXRlIG9mcyAweCV4LCAiCisJCQkJCSIqYnl0ZSAweCV4LiIsIGJ1Zl9zaXplLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLAorCQkJCQluZWVkX3dyaXRlYmFjaywKKwkJCQkJKHVuc2lnbmVkIGludCkobGNuID4+IDMpLAorCQkJCQkodW5zaWduZWQgaW50KSpieXRlKTsKKwkJCS8qIFNraXAgZnVsbCBieXRlcy4gKi8KKwkJCWlmICgqYnl0ZSA9PSAweGZmKSB7CisJCQkJbGNuID0gKGxjbiArIDgpICYgfjc7CisJCQkJbnRmc19kZWJ1ZygiQ29udGludWluZyB3aGlsZSBsb29wIDEuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQliaXQgPSAxIDw8IChsY24gJiA3KTsKKwkJCW50ZnNfZGVidWcoImJpdCAlaS4iLCBiaXQpOworCQkJLyogSWYgdGhlIGJpdCBpcyBhbHJlYWR5IHNldCwgZ28gb250byB0aGUgbmV4dCBvbmUuICovCisJCQlpZiAoKmJ5dGUgJiBiaXQpIHsKKwkJCQlsY24rKzsKKwkJCQludGZzX2RlYnVnKCJDb250aW51aW5nIHdoaWxlIGxvb3AgMi4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBBbGxvY2F0ZSBtb3JlIG1lbW9yeSBpZiBuZWVkZWQsIGluY2x1ZGluZyBzcGFjZSBmb3IKKwkJCSAqIHRoZSB0ZXJtaW5hdG9yIGVsZW1lbnQuCisJCQkgKiBudGZzX21hbGxvY19ub2ZzKCkgb3BlcmF0ZXMgb24gd2hvbGUgcGFnZXMgb25seS4KKwkJCSAqLworCQkJaWYgKChybHBvcyArIDIpICogc2l6ZW9mKCpybCkgPiBybHNpemUpIHsKKwkJCQlydW5saXN0X2VsZW1lbnQgKnJsMjsKKworCQkJCW50ZnNfZGVidWcoIlJlYWxsb2NhdGluZyBtZW1vcnkuIik7CisJCQkJaWYgKCFybCkKKwkJCQkJbnRmc19kZWJ1ZygiRmlyc3QgZnJlZSBiaXQgaXMgYXQgTENOICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQkobGNuICsgYm1wX3BvcykpOworCQkJCXJsMiA9IG50ZnNfbWFsbG9jX25vZnMocmxzaXplICsgKGludClQQUdFX1NJWkUpOworCQkJCWlmICh1bmxpa2VseSghcmwyKSkgeworCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gIgorCQkJCQkJCSJhbGxvY2F0ZSBtZW1vcnkuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQltZW1jcHkocmwyLCBybCwgcmxzaXplKTsKKwkJCQludGZzX2ZyZWUocmwpOworCQkJCXJsID0gcmwyOworCQkJCXJsc2l6ZSArPSBQQUdFX1NJWkU7CisJCQkJbnRmc19kZWJ1ZygiUmVhbGxvY2F0ZWQgbWVtb3J5LCBybHNpemUgMHgleC4iLAorCQkJCQkJcmxzaXplKTsKKwkJCX0KKwkJCS8qIEFsbG9jYXRlIHRoZSBiaXRtYXAgYml0LiAqLworCQkJKmJ5dGUgfD0gYml0OworCQkJLyogV2UgbmVlZCB0byB3cml0ZSB0aGlzIGJpdG1hcCBwYWdlIHRvIGRpc2suICovCisJCQluZWVkX3dyaXRlYmFjayA9IDE7CisJCQludGZzX2RlYnVnKCIqYnl0ZSAweCV4LCBuZWVkX3dyaXRlYmFjayBpcyBzZXQuIiwKKwkJCQkJKHVuc2lnbmVkIGludCkqYnl0ZSk7CisJCQkvKgorCQkJICogQ29hbGVzY2Ugd2l0aCBwcmV2aW91cyBydW4gaWYgYWRqYWNlbnQgTENOcy4KKwkJCSAqIE90aGVyd2lzZSwgYXBwZW5kIGEgbmV3IHJ1bi4KKwkJCSAqLworCQkJbnRmc19kZWJ1ZygiQWRkaW5nIHJ1biAobGNuIDB4JWxseCwgbGVuIDB4JWxseCksICIKKwkJCQkJInByZXZfbGNuIDB4JWxseCwgbGNuIDB4JWxseCwgIgorCQkJCQkiYm1wX3BvcyAweCVsbHgsIHByZXZfcnVuX2xlbiAweCVsbHgsICIKKwkJCQkJInJscG9zICVpLiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKGxjbiArIGJtcF9wb3MpLAorCQkJCQkxVUxMLCAodW5zaWduZWQgbG9uZyBsb25nKXByZXZfbGNuLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXByZXZfcnVuX2xlbiwKKwkJCQkJcmxwb3MpOworCQkJaWYgKHByZXZfbGNuID09IGxjbiArIGJtcF9wb3MgLSBwcmV2X3J1bl9sZW4gJiYgcmxwb3MpIHsKKwkJCQludGZzX2RlYnVnKCJDb2FsZXNjaW5nIHRvIHJ1biAobGNuIDB4JWxseCwgIgorCQkJCQkJImxlbiAweCVsbHgpLiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sY24sCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sZW5ndGgpOworCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoID0gKytwcmV2X3J1bl9sZW47CisJCQkJbnRmc19kZWJ1ZygiUnVuIG5vdyAobGNuIDB4JWxseCwgbGVuIDB4JWxseCksICIKKwkJCQkJCSJwcmV2X3J1bl9sZW4gMHglbGx4LiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sY24sCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sZW5ndGgsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcHJldl9ydW5fbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGxpa2VseShybHBvcykpIHsKKwkJCQkJbnRmc19kZWJ1ZygiQWRkaW5nIG5ldyBydW4sIChwcmV2aW91cyAiCisJCQkJCQkJInJ1biBsY24gMHglbGx4LCAiCisJCQkJCQkJImxlbiAweCVsbHgpLiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxjbiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoKTsKKwkJCQkJcmxbcmxwb3NdLnZjbiA9IHJsW3JscG9zIC0gMV0udmNuICsKKwkJCQkJCQlwcmV2X3J1bl9sZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJbnRmc19kZWJ1ZygiQWRkaW5nIG5ldyBydW4sIGlzIGZpcnN0ICIKKwkJCQkJCQkicnVuLiIpOworCQkJCQlybFtybHBvc10udmNuID0gc3RhcnRfdmNuOworCQkJCX0KKwkJCQlybFtybHBvc10ubGNuID0gcHJldl9sY24gPSBsY24gKyBibXBfcG9zOworCQkJCXJsW3JscG9zXS5sZW5ndGggPSBwcmV2X3J1bl9sZW4gPSAxOworCQkJCXJscG9zKys7CisJCQl9CisJCQkvKiBEb25lPyAqLworCQkJaWYgKCEtLWNsdXN0ZXJzKSB7CisJCQkJTENOIHRjOworCQkJCS8qCisJCQkJICogVXBkYXRlIHRoZSBjdXJyZW50IHpvbmUgcG9zaXRpb24uICBQb3NpdGlvbnMKKwkJCQkgKiBvZiBhbHJlYWR5IHNjYW5uZWQgem9uZXMgaGF2ZSBiZWVuIHVwZGF0ZWQKKwkJCQkgKiBkdXJpbmcgdGhlIHJlc3BlY3RpdmUgem9uZSBzd2l0Y2hlcy4KKwkJCQkgKi8KKwkJCQl0YyA9IGxjbiArIGJtcF9wb3MgKyAxOworCQkJCW50ZnNfZGVidWcoIkRvbmUuIFVwZGF0aW5nIGN1cnJlbnQgem9uZSAiCisJCQkJCQkicG9zaXRpb24sIHRjIDB4JWxseCwgIgorCQkJCQkJInNlYXJjaF96b25lICVpLiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXRjLAorCQkJCQkJc2VhcmNoX3pvbmUpOworCQkJCXN3aXRjaCAoc2VhcmNoX3pvbmUpIHsKKwkJCQljYXNlIDE6CisJCQkJCW50ZnNfZGVidWcoIkJlZm9yZSBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5tZnRfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zKTsKKwkJCQkJaWYgKHRjID49IHZvbC0+bWZ0X3pvbmVfZW5kKSB7CisJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9CisJCQkJCQkJCXZvbC0+bWZ0X2xjbjsKKwkJCQkJCWlmICghdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPSAwOworCQkJCQl9IGVsc2UgaWYgKChibXBfaW5pdGlhbF9wb3MgPj0KKwkJCQkJCQl2b2wtPm1mdF96b25lX3BvcyB8fAorCQkJCQkJCXRjID4gdm9sLT5tZnRfem9uZV9wb3MpCisJCQkJCQkJJiYgdGMgPj0gdm9sLT5tZnRfbGNuKQorCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+bWZ0X3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPm1mdF96b25lX3Bvcyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGExX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwkJCQkJaWYgKHRjID49IHZvbC0+bnJfY2x1c3RlcnMpCisJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0KKwkJCQkJCQkgICAgIHZvbC0+bWZ0X3pvbmVfZW5kOworCQkJCQllbHNlIGlmICgoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkgICAgdm9sLT5kYXRhMV96b25lX3BvcyB8fAorCQkJCQkJICAgIHRjID4gdm9sLT5kYXRhMV96b25lX3BvcykKKwkJCQkJCSAgICAmJiB0YyA+PSB2b2wtPm1mdF96b25lX2VuZCkKKwkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTFfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCW50ZnNfZGVidWcoIkJlZm9yZSBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5kYXRhMl96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5kYXRhMl96b25lX3Bvcyk7CisJCQkJCWlmICh0YyA+PSB2b2wtPm1mdF96b25lX3N0YXJ0KQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IDA7CisJCQkJCWVsc2UgaWYgKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJICAgICAgdm9sLT5kYXRhMl96b25lX3BvcyB8fAorCQkJCQkJICAgICAgdGMgPiB2b2wtPmRhdGEyX3pvbmVfcG9zKQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IHRjOworCQkJCQludGZzX2RlYnVnKCJBZnRlciBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5kYXRhMl96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5kYXRhMl96b25lX3Bvcyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUJVRygpOworCQkJCX0KKwkJCQludGZzX2RlYnVnKCJGaW5pc2hlZC4gIEdvaW5nIHRvIG91dC4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWxjbisrOworCQl9CisJCWJtcF9wb3MgKz0gYnVmX3NpemU7CisJCW50ZnNfZGVidWcoIkFmdGVyIGlubmVyIHdoaWxlIGxvb3A6IGJ1Zl9zaXplIDB4JXgsIGxjbiAiCisJCQkJIjB4JWxseCwgYm1wX3BvcyAweCVsbHgsIG5lZWRfd3JpdGViYWNrICVpLiIsCisJCQkJYnVmX3NpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpbGNuLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcywgbmVlZF93cml0ZWJhY2spOworCQlpZiAoYm1wX3BvcyA8IHpvbmVfZW5kKSB7CisJCQludGZzX2RlYnVnKCJDb250aW51aW5nIG91dGVyIHdoaWxlIGxvb3AsICIKKwkJCQkJImJtcF9wb3MgMHglbGx4LCB6b25lX2VuZCAweCVsbHguIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kKTsKKwkJCWNvbnRpbnVlOworCQl9Cit6b25lX3Bhc3NfZG9uZToJLyogRmluaXNoZWQgd2l0aCB0aGUgY3VycmVudCB6b25lIHBhc3MuICovCisJCW50ZnNfZGVidWcoIkF0IHpvbmVfcGFzc19kb25lLCBwYXNzICVpLiIsIHBhc3MpOworCQlpZiAocGFzcyA9PSAxKSB7CisJCQkvKgorCQkJICogTm93IGRvIHBhc3MgMiwgc2Nhbm5pbmcgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHpvbmUKKwkJCSAqIHdlIG9taXR0ZWQgaW4gcGFzcyAxLgorCQkJICovCisJCQlwYXNzID0gMjsKKwkJCXpvbmVfZW5kID0gem9uZV9zdGFydDsKKwkJCXN3aXRjaCAoc2VhcmNoX3pvbmUpIHsKKwkJCWNhc2UgMTogLyogbWZ0X3pvbmUgKi8KKwkJCQl6b25lX3N0YXJ0ID0gdm9sLT5tZnRfem9uZV9zdGFydDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjogLyogZGF0YTFfem9uZSAqLworCQkJCXpvbmVfc3RhcnQgPSB2b2wtPm1mdF96b25lX2VuZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDogLyogZGF0YTJfem9uZSAqLworCQkJCXpvbmVfc3RhcnQgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCS8qIFNhbml0eSBjaGVjay4gKi8KKwkJCWlmICh6b25lX2VuZCA8IHpvbmVfc3RhcnQpCisJCQkJem9uZV9lbmQgPSB6b25lX3N0YXJ0OworCQkJYm1wX3BvcyA9IHpvbmVfc3RhcnQ7CisJCQludGZzX2RlYnVnKCJDb250aW51aW5nIG91dGVyIHdoaWxlIGxvb3AsIHBhc3MgMiwgIgorCQkJCQkiem9uZV9zdGFydCAweCVsbHgsIHpvbmVfZW5kIDB4JWxseCwgIgorCQkJCQkiYm1wX3BvcyAweCVsbHguIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX3N0YXJ0LAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MpOworCQkJY29udGludWU7CisJCX0gLyogcGFzcyA9PSAyICovCitkb25lX3pvbmVzX2NoZWNrOgorCQludGZzX2RlYnVnKCJBdCBkb25lX3pvbmVzX2NoZWNrLCBzZWFyY2hfem9uZSAlaSwgZG9uZV96b25lcyAiCisJCQkJImJlZm9yZSAweCV4LCBkb25lX3pvbmVzIGFmdGVyIDB4JXguIiwKKwkJCQlzZWFyY2hfem9uZSwgZG9uZV96b25lcywKKwkJCQlkb25lX3pvbmVzIHwgc2VhcmNoX3pvbmUpOworCQlkb25lX3pvbmVzIHw9IHNlYXJjaF96b25lOworCQlpZiAoZG9uZV96b25lcyA8IDcpIHsKKwkJCW50ZnNfZGVidWcoIlN3aXRjaGluZyB6b25lLiIpOworCQkJLyogTm93IHN3aXRjaCB0byB0aGUgbmV4dCB6b25lIHdlIGhhdmVuJ3QgZG9uZSB5ZXQuICovCisJCQlwYXNzID0gMTsKKwkJCXN3aXRjaCAoc2VhcmNoX3pvbmUpIHsKKwkJCWNhc2UgMToKKwkJCQludGZzX2RlYnVnKCJTd2l0Y2hpbmcgZnJvbSBtZnQgem9uZSB0byBkYXRhMSAiCisJCQkJCQkiem9uZS4iKTsKKwkJCQkvKiBVcGRhdGUgbWZ0IHpvbmUgcG9zaXRpb24uICovCisJCQkJaWYgKHJscG9zKSB7CisJCQkJCUxDTiB0YzsKKworCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+bWZ0X3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPm1mdF96b25lX3Bvcyk7CisJCQkJCXRjID0gcmxbcmxwb3MgLSAxXS5sY24gKworCQkJCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoOworCQkJCQlpZiAodGMgPj0gdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zID0KKwkJCQkJCQkJdm9sLT5tZnRfbGNuOworCQkJCQkJaWYgKCF2b2wtPm1mdF96b25lX2VuZCkKKwkJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9IDA7CisJCQkJCX0gZWxzZSBpZiAoKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zIHx8CisJCQkJCQkJdGMgPiB2b2wtPm1mdF96b25lX3BvcykKKwkJCQkJCQkmJiB0YyA+PSB2b2wtPm1mdF9sY24pCisJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9IHRjOworCQkJCQludGZzX2RlYnVnKCJBZnRlciBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5tZnRfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zKTsKKwkJCQl9CisJCQkJLyogU3dpdGNoIGZyb20gbWZ0IHpvbmUgdG8gZGF0YTEgem9uZS4gKi8KK3N3aXRjaF90b19kYXRhMV96b25lOgkJc2VhcmNoX3pvbmUgPSAyOworCQkJCXpvbmVfc3RhcnQgPSBibXBfaW5pdGlhbF9wb3MgPQorCQkJCQkJdm9sLT5kYXRhMV96b25lX3BvczsKKwkJCQl6b25lX2VuZCA9IHZvbC0+bnJfY2x1c3RlcnM7CisJCQkJaWYgKHpvbmVfc3RhcnQgPT0gdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCXBhc3MgPSAyOworCQkJCWlmICh6b25lX3N0YXJ0ID49IHpvbmVfZW5kKSB7CisJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB6b25lX3N0YXJ0ID0KKwkJCQkJCQl2b2wtPm1mdF96b25lX2VuZDsKKwkJCQkJcGFzcyA9IDI7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCW50ZnNfZGVidWcoIlN3aXRjaGluZyBmcm9tIGRhdGExIHpvbmUgdG8gIgorCQkJCQkJImRhdGEyIHpvbmUuIik7CisJCQkJLyogVXBkYXRlIGRhdGExIHpvbmUgcG9zaXRpb24uICovCisJCQkJaWYgKHJscG9zKSB7CisJCQkJCUxDTiB0YzsKKworCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTFfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCQkJCQl0YyA9IHJsW3JscG9zIC0gMV0ubGNuICsKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJCQkJaWYgKHRjID49IHZvbC0+bnJfY2x1c3RlcnMpCisJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0KKwkJCQkJCQkgICAgIHZvbC0+bWZ0X3pvbmVfZW5kOworCQkJCQllbHNlIGlmICgoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkgICAgdm9sLT5kYXRhMV96b25lX3BvcyB8fAorCQkJCQkJICAgIHRjID4gdm9sLT5kYXRhMV96b25lX3BvcykKKwkJCQkJCSAgICAmJiB0YyA+PSB2b2wtPm1mdF96b25lX2VuZCkKKwkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTFfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCQkJCX0KKwkJCQkvKiBTd2l0Y2ggZnJvbSBkYXRhMSB6b25lIHRvIGRhdGEyIHpvbmUuICovCisJCQkJc2VhcmNoX3pvbmUgPSA0OworCQkJCXpvbmVfc3RhcnQgPSBibXBfaW5pdGlhbF9wb3MgPQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvczsKKwkJCQl6b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQ7CisJCQkJaWYgKCF6b25lX3N0YXJ0KQorCQkJCQlwYXNzID0gMjsKKwkJCQlpZiAoem9uZV9zdGFydCA+PSB6b25lX2VuZCkgeworCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zID0gem9uZV9zdGFydCA9CisJCQkJCQkJYm1wX2luaXRpYWxfcG9zID0gMDsKKwkJCQkJcGFzcyA9IDI7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCW50ZnNfZGVidWcoIlN3aXRjaGluZyBmcm9tIGRhdGEyIHpvbmUgdG8gIgorCQkJCQkJImRhdGExIHpvbmUuIik7CisJCQkJLyogVXBkYXRlIGRhdGEyIHpvbmUgcG9zaXRpb24uICovCisJCQkJaWYgKHJscG9zKSB7CisJCQkJCUxDTiB0YzsKKworCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTJfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3MpOworCQkJCQl0YyA9IHJsW3JscG9zIC0gMV0ubGNuICsKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJCQkJaWYgKHRjID49IHZvbC0+bWZ0X3pvbmVfc3RhcnQpCisJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zID0gMDsKKwkJCQkJZWxzZSBpZiAoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkgICAgICB2b2wtPmRhdGEyX3pvbmVfcG9zIHx8CisJCQkJCQkgICAgICB0YyA+IHZvbC0+ZGF0YTJfem9uZV9wb3MpCisJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zID0gdGM7CisJCQkJCW50ZnNfZGVidWcoIkFmdGVyIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGEyX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zKTsKKwkJCQl9CisJCQkJLyogU3dpdGNoIGZyb20gZGF0YTIgem9uZSB0byBkYXRhMSB6b25lLiAqLworCQkJCWdvdG8gc3dpdGNoX3RvX2RhdGExX3pvbmU7CisJCQlkZWZhdWx0OgorCQkJCUJVRygpOworCQkJfQorCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgem9uZSBzd2l0Y2gsIHNlYXJjaF96b25lICVpLCAiCisJCQkJCSJwYXNzICVpLCBibXBfaW5pdGlhbF9wb3MgMHglbGx4LCAiCisJCQkJCSJ6b25lX3N0YXJ0IDB4JWxseCwgem9uZV9lbmQgMHglbGx4LiIsCisJCQkJCXNlYXJjaF96b25lLCBwYXNzLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9pbml0aWFsX3BvcywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX3N0YXJ0LAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kKTsKKwkJCWJtcF9wb3MgPSB6b25lX3N0YXJ0OworCQkJaWYgKHpvbmVfc3RhcnQgPT0gem9uZV9lbmQpIHsKKwkJCQludGZzX2RlYnVnKCJFbXB0eSB6b25lLCBnb2luZyB0byAiCisJCQkJCQkiZG9uZV96b25lc19jaGVjay4iKTsKKwkJCQkvKiBFbXB0eSB6b25lLiBEb24ndCBib3RoZXIgc2VhcmNoaW5nIGl0LiAqLworCQkJCWdvdG8gZG9uZV96b25lc19jaGVjazsKKwkJCX0KKwkJCW50ZnNfZGVidWcoIkNvbnRpbnVpbmcgb3V0ZXIgd2hpbGUgbG9vcC4iKTsKKwkJCWNvbnRpbnVlOworCQl9IC8qIGRvbmVfem9uZXMgPT0gNyAqLworCQludGZzX2RlYnVnKCJBbGwgem9uZXMgYXJlIGZpbmlzaGVkLiIpOworCQkvKgorCQkgKiBBbGwgem9uZXMgYXJlIGZpbmlzaGVkISAgSWYgREFUQV9aT05FLCBzaHJpbmsgbWZ0IHpvbmUuICBJZgorCQkgKiBNRlRfWk9ORSwgd2UgaGF2ZSByZWFsbHkgcnVuIG91dCBvZiBzcGFjZS4KKwkJICovCisJCW1mdF96b25lX3NpemUgPSB2b2wtPm1mdF96b25lX2VuZCAtIHZvbC0+bWZ0X3pvbmVfc3RhcnQ7CisJCW50ZnNfZGVidWcoInZvbC0+bWZ0X3pvbmVfc3RhcnQgMHglbGx4LCB2b2wtPm1mdF96b25lX2VuZCAiCisJCQkJIjB4JWxseCwgbWZ0X3pvbmVfc2l6ZSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfc3RhcnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX2VuZCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1mdF96b25lX3NpemUpOworCQlpZiAoem9uZSA9PSBNRlRfWk9ORSB8fCBtZnRfem9uZV9zaXplIDw9IDApIHsKKwkJCW50ZnNfZGVidWcoIk5vIGZyZWUgY2x1c3RlcnMgbGVmdCwgZ29pbmcgdG8gb3V0LiIpOworCQkJLyogUmVhbGx5IG5vIG1vcmUgc3BhY2UgbGVmdCBvbiBkZXZpY2UuICovCisJCQllcnIgPSBFTk9TUEM7CisJCQlnb3RvIG91dDsKKwkJfSAvKiB6b25lID09IERBVEFfWk9ORSAmJiBtZnRfem9uZV9zaXplID4gMCAqLworCQludGZzX2RlYnVnKCJTaHJpbmtpbmcgbWZ0IHpvbmUuIik7CisJCXpvbmVfZW5kID0gdm9sLT5tZnRfem9uZV9lbmQ7CisJCW1mdF96b25lX3NpemUgPj49IDE7CisJCWlmIChtZnRfem9uZV9zaXplID4gMCkKKwkJCXZvbC0+bWZ0X3pvbmVfZW5kID0gdm9sLT5tZnRfem9uZV9zdGFydCArIG1mdF96b25lX3NpemU7CisJCWVsc2UgLyogbWZ0IHpvbmUgYW5kIGRhdGEyIHpvbmUgbm8gbG9uZ2VyIGV4aXN0LiAqLworCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQgPQorCQkJCQl2b2wtPm1mdF96b25lX2VuZCA9IDA7CisJCWlmICh2b2wtPm1mdF96b25lX3BvcyA+PSB2b2wtPm1mdF96b25lX2VuZCkgeworCQkJdm9sLT5tZnRfem9uZV9wb3MgPSB2b2wtPm1mdF9sY247CisJCQlpZiAoIXZvbC0+bWZ0X3pvbmVfZW5kKQorCQkJCXZvbC0+bWZ0X3pvbmVfcG9zID0gMDsKKwkJfQorCQlibXBfcG9zID0gem9uZV9zdGFydCA9IGJtcF9pbml0aWFsX3BvcyA9CisJCQkJdm9sLT5kYXRhMV96b25lX3BvcyA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQlzZWFyY2hfem9uZSA9IDI7CisJCXBhc3MgPSAyOworCQlkb25lX3pvbmVzICY9IH4yOworCQludGZzX2RlYnVnKCJBZnRlciBzaHJpbmtpbmcgbWZ0IHpvbmUsIG1mdF96b25lX3NpemUgMHglbGx4LCAiCisJCQkJInZvbC0+bWZ0X3pvbmVfc3RhcnQgMHglbGx4LCAiCisJCQkJInZvbC0+bWZ0X3pvbmVfZW5kIDB4JWxseCwgIgorCQkJCSJ2b2wtPm1mdF96b25lX3BvcyAweCVsbHgsIHNlYXJjaF96b25lIDIsICIKKwkJCQkicGFzcyAyLCBkb25lc196b25lcyAweCV4LCB6b25lX3N0YXJ0IDB4JWxseCwgIgorCQkJCSJ6b25lX2VuZCAweCVsbHgsIHZvbC0+ZGF0YTFfem9uZV9wb3MgMHglbGx4LCAiCisJCQkJImNvbnRpbnVpbmcgb3V0ZXIgd2hpbGUgbG9vcC4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWZ0X3pvbmVfc2l6ZSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfc3RhcnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX2VuZCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfcG9zLAorCQkJCWRvbmVfem9uZXMsICh1bnNpZ25lZCBsb25nIGxvbmcpem9uZV9zdGFydCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5kYXRhMV96b25lX3Bvcyk7CisJfQorCW50ZnNfZGVidWcoIkFmdGVyIG91dGVyIHdoaWxlIGxvb3AuIik7CitvdXQ6CisJbnRmc19kZWJ1ZygiQXQgb3V0LiIpOworCS8qIEFkZCBydW5saXN0IHRlcm1pbmF0b3IgZWxlbWVudC4gKi8KKwlpZiAobGlrZWx5KHJsKSkgeworCQlybFtybHBvc10udmNuID0gcmxbcmxwb3MgLSAxXS52Y24gKyBybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQlybFtybHBvc10ubGVuZ3RoID0gMDsKKwl9CisJaWYgKGxpa2VseShwYWdlICYmICFJU19FUlIocGFnZSkpKSB7CisJCWlmIChuZWVkX3dyaXRlYmFjaykgeworCQkJbnRmc19kZWJ1ZygiTWFya2luZyBwYWdlIGRpcnR5LiIpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCW5lZWRfd3JpdGViYWNrID0gMDsKKwkJfQorCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJfQorCWlmIChsaWtlbHkoIWVycikpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCQludGZzX2RlYnVnKCJEb25lLiIpOworCQlyZXR1cm4gcmw7CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjbHVzdGVycywgYWJvcnRpbmcgIgorCQkJIihlcnJvciAlaSkuIiwgZXJyKTsKKwlpZiAocmwpIHsKKwkJaW50IGVycjI7CisKKwkJaWYgKGVyciA9PSBFTk9TUEMpCisJCQludGZzX2RlYnVnKCJOb3QgZW5vdWdoIHNwYWNlIHRvIGNvbXBsZXRlIGFsbG9jYXRpb24sICIKKwkJCQkJImVyciBFTk9TUEMsIGZpcnN0IGZyZWUgbGNuIDB4JWxseCwgIgorCQkJCQkiY291bGQgYWxsb2NhdGUgdXAgdG8gMHglbGx4ICIKKwkJCQkJImNsdXN0ZXJzLiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmxbMF0ubGNuLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWNvdW50IC0gY2x1c3RlcnMpOworCQkvKiBEZWFsbG9jYXRlIGFsbCBhbGxvY2F0ZWQgY2x1c3RlcnMuICovCisJCW50ZnNfZGVidWcoIkF0dGVtcHRpbmcgcm9sbGJhY2suLi4iKTsKKwkJZXJyMiA9IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKHZvbCwgcmwpOworCQlpZiAoZXJyMikgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJvbGxiYWNrIChlcnJvciAlaSkuICAiCisJCQkJCSJMZWF2aW5nIGluY29uc2lzdGVudCBtZXRhZGF0YSEgICIKKwkJCQkJIlVubW91bnQgYW5kIHJ1biBjaGtkc2suIiwgZXJyMik7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJLyogRnJlZSB0aGUgcnVubGlzdC4gKi8KKwkJbnRmc19mcmVlKHJsKTsKKwl9IGVsc2UgaWYgKGVyciA9PSBFTk9TUEMpCisJCW50ZnNfZGVidWcoIk5vIHNwYWNlIGxlZnQgYXQgYWxsLCBlcnIgPSBFTk9TUEMsICIKKwkJCQkiZmlyc3QgZnJlZSBsY24gPSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKioKKyAqIF9fbnRmc19jbHVzdGVyX2ZyZWUgLSBmcmVlIGNsdXN0ZXJzIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdmk6CQl2ZnMgaW5vZGUgd2hvc2UgcnVubGlzdCBkZXNjcmliZXMgdGhlIGNsdXN0ZXJzIHRvIGZyZWUKKyAqIEBzdGFydF92Y246CXZjbiBpbiB0aGUgcnVubGlzdCBvZiBAdmkgYXQgd2hpY2ggdG8gc3RhcnQgZnJlZWluZyBjbHVzdGVycworICogQGNvdW50OgludW1iZXIgb2YgY2x1c3RlcnMgdG8gZnJlZSBvciAtMSBmb3IgYWxsIGNsdXN0ZXJzCisgKiBAaXNfcm9sbGJhY2s6CWlmIFRSVUUgdGhpcyBpcyBhIHJvbGxiYWNrIG9wZXJhdGlvbgorICoKKyAqIEZyZWUgQGNvdW50IGNsdXN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBjbHVzdGVyIEBzdGFydF92Y24gaW4gdGhlIHJ1bmxpc3QKKyAqIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBJZiBAY291bnQgaXMgLTEsIGFsbCBjbHVzdGVycyBmcm9tIEBzdGFydF92Y24gdG8gdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBhcmUKKyAqIGRlYWxsb2NhdGVkLiAgVGh1cywgdG8gY29tcGxldGVseSBmcmVlIGFsbCBjbHVzdGVycyBpbiBhIHJ1bmxpc3QsIHVzZQorICogQHN0YXJ0X3ZjbiA9IDAgYW5kIEBjb3VudCA9IC0xLgorICoKKyAqIEBpc19yb2xsYmFjayBzaG91bGQgYWx3YXlzIGJlIEZBTFNFLCBpdCBpcyBmb3IgaW50ZXJuYWwgdXNlIHRvIHJvbGxiYWNrCisgKiBlcnJvcnMuICBZb3UgcHJvYmFibHkgd2FudCB0byB1c2UgbnRmc19jbHVzdGVyX2ZyZWUoKSBpbnN0ZWFkLgorICoKKyAqIE5vdGUsIG50ZnNfY2x1c3Rlcl9mcmVlKCkgZG9lcyBub3QgbW9kaWZ5IHRoZSBydW5saXN0IGF0IGFsbCwgc28gdGhlIGNhbGxlcgorICogaGFzIHRvIGRlYWwgd2l0aCBpdCBsYXRlci4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWFsbG9jYXRlZCBjbHVzdGVycyAobm90IGNvdW50aW5nIHNwYXJzZSBvbmVzKSBvbgorICogc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IEB2aSBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcworICoJICAgICAgdW5sb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcnVubGlzdCBsb2NrIG9mIEB2aSBmb3IgcmVhZGluZyBhbmQKKyAqCSAgICAgIHNvbWV0aW1lcyBmb3Igd3JpdGluZyBhbmQgc29tZXRpbWVzIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICoJICAgIC0gVGhlIHZvbHVtZSBsY24gYml0bWFwIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkCisgKgkgICAgICBvbiByZXR1cm4uCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAorICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KKyAqLworczY0IF9fbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwgczY0IGNvdW50LAorCQljb25zdCBCT09MIGlzX3JvbGxiYWNrKQoreworCXM2NCBkZWx0YSwgdG9fZnJlZSwgdG90YWxfZnJlZWQsIHJlYWxfZnJlZWQ7CisJbnRmc19pbm9kZSAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlzdHJ1Y3QgaW5vZGUgKmxjbmJtcF92aTsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCWludCBlcnI7CisKKwlCVUdfT04oIXZpKTsKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHN0YXJ0X3ZjbiAweCVsbHgsIGNvdW50ICIKKwkJCSIweCVsbHguJXMiLCB2aS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRfdmNuLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudCwKKwkJCWlzX3JvbGxiYWNrID8gIiAocm9sbGJhY2spIiA6ICIiKTsKKwluaSA9IE5URlNfSSh2aSk7CisJdm9sID0gbmktPnZvbDsKKwlsY25ibXBfdmkgPSB2b2wtPmxjbmJtcF9pbm87CisJQlVHX09OKCFsY25ibXBfdmkpOworCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlCVUdfT04oY291bnQgPCAtMSk7CisJLyoKKwkgKiBMb2NrIHRoZSBsY24gYml0bWFwIGZvciB3cml0aW5nIGJ1dCBvbmx5IGlmIG5vdCByb2xsaW5nIGJhY2suICBXZQorCSAqIG11c3QgaG9sZCB0aGUgbG9jayBhbGwgdGhlIHdheSBpbmNsdWRpbmcgdGhyb3VnaCByb2xsYmFjayBvdGhlcndpc2UKKwkgKiByb2xsYmFjayBpcyBub3QgcG9zc2libGUgYmVjYXVzZSBvbmNlIHdlIGhhdmUgY2xlYXJlZCBhIGJpdCBhbmQKKwkgKiBkcm9wcGVkIHRoZSBsb2NrLCBhbnlvbmUgY291bGQgaGF2ZSBzZXQgdGhlIGJpdCBhZ2FpbiwgdGh1cworCSAqIGFsbG9jYXRpbmcgdGhlIGNsdXN0ZXIgZm9yIGFub3RoZXIgdXNlLgorCSAqLworCWlmIChsaWtlbHkoIWlzX3JvbGxiYWNrKSkKKwkJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisKKwl0b3RhbF9mcmVlZCA9IHJlYWxfZnJlZWQgPSAwOworCisJLyogVGhpcyByZXR1cm5zIHdpdGggbmktPnJ1bmxpc3QgbG9ja2VkIGZvciByZWFkaW5nIG9uIHN1Y2Nlc3MuICovCisJcmwgPSBudGZzX2ZpbmRfdmNuKG5pLCBzdGFydF92Y24sIEZBTFNFKTsKKwlpZiAoSVNfRVJSKHJsKSkgeworCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgcnVubGlzdCAiCisJCQkJCSJlbGVtZW50IChlcnJvciAlbGkpLCBhYm9ydGluZy4iLAorCQkJCQlQVFJfRVJSKHJsKSk7CisJCWVyciA9IFBUUl9FUlIocmwpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmICh1bmxpa2VseShybC0+bGNuIDwgTENOX0hPTEUpKSB7CisJCWlmICghaXNfcm9sbGJhY2spCisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGaXJzdCBydW5saXN0IGVsZW1lbnQgaGFzICIKKwkJCQkJImludmFsaWQgbGNuLCBhYm9ydGluZy4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byB1bmxfZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgc3RhcnRpbmcgY2x1c3RlciBpbnNpZGUgdGhlIHJ1biB0aGF0IG5lZWRzIGZyZWVpbmcuICovCisJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCisJLyogVGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB0aGlzIHJ1biB0aGF0IG5lZWQgZnJlZWluZy4gKi8KKwl0b19mcmVlID0gcmwtPmxlbmd0aCAtIGRlbHRhOworCWlmIChjb3VudCA+PSAwICYmIHRvX2ZyZWUgPiBjb3VudCkKKwkJdG9fZnJlZSA9IGNvdW50OworCisJaWYgKGxpa2VseShybC0+bGNuID49IDApKSB7CisJCS8qIERvIHRoZSBhY3R1YWwgZnJlZWluZyBvZiB0aGUgY2x1c3RlcnMgaW4gdGhpcyBydW4uICovCisJCWVyciA9IG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihsY25ibXBfdmksIHJsLT5sY24gKyBkZWx0YSwKKwkJCQl0b19mcmVlLCBsaWtlbHkoIWlzX3JvbGxiYWNrKSA/IDAgOiAxKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyIGZpcnN0IHJ1biAiCisJCQkJCQkiKGVycm9yICVpKSwgYWJvcnRpbmcuIiwgZXJyKTsKKwkJCWdvdG8gdW5sX2Vycl9vdXQ7CisJCX0KKwkJLyogV2UgaGF2ZSBmcmVlZCBAdG9fZnJlZSByZWFsIGNsdXN0ZXJzLiAqLworCQlyZWFsX2ZyZWVkID0gdG9fZnJlZTsKKwl9OworCS8qIEdvIHRvIHRoZSBuZXh0IHJ1biBhbmQgYWRqdXN0IHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgbGVmdCB0byBmcmVlLiAqLworCSsrcmw7CisJaWYgKGNvdW50ID49IDApCisJCWNvdW50IC09IHRvX2ZyZWU7CisKKwkvKiBLZWVwIHRyYWNrIG9mIHRoZSB0b3RhbCAiZnJlZWQiIGNsdXN0ZXJzLCBpbmNsdWRpbmcgc3BhcnNlIG9uZXMuICovCisJdG90YWxfZnJlZWQgPSB0b19mcmVlOworCS8qCisJICogTG9vcCBvdmVyIHRoZSByZW1haW5pbmcgcnVucywgdXNpbmcgQGNvdW50IGFzIGEgY2FwcGluZyB2YWx1ZSwgYW5kCisJICogZnJlZSB0aGVtLgorCSAqLworCWZvciAoOyBybC0+bGVuZ3RoICYmIGNvdW50ICE9IDA7ICsrcmwpIHsKKwkJaWYgKHVubGlrZWx5KHJsLT5sY24gPCBMQ05fSE9MRSkpIHsKKwkJCVZDTiB2Y247CisKKwkJCS8qCisJCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZyBydW5saXN0IGxvY2sgZm9yCisJCQkgKiB0aGUgZHVyYXRpb24uCisJCQkgKi8KKwkJCXZjbiA9IHJsLT52Y247CisJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQlpZiAoZXJyKSB7CisJCQkJaWYgKCFpc19yb2xsYmFjaykKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCAiCisJCQkJCQkJInJ1bmxpc3QgZnJhZ21lbnQuIik7CisJCQkJaWYgKGVyciA9PSAtRUlOVkFMIHx8IGVyciA9PSAtRU5PRU5UKQorCQkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIHJldHVybnMgd2l0aCBuaS0+cnVubGlzdCBsb2NrZWQgZm9yIHJlYWRpbmcgb24KKwkJCSAqIHN1Y2Nlc3MuCisJCQkgKi8KKwkJCXJsID0gbnRmc19maW5kX3ZjbihuaSwgdmNuLCBGQUxTRSk7CisJCQlpZiAoSVNfRVJSKHJsKSkgeworCQkJCWVyciA9IFBUUl9FUlIocmwpOworCQkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kICIKKwkJCQkJCQkic3Vic2VxdWVudCBydW5saXN0ICIKKwkJCQkJCQkiZWxlbWVudC4iKTsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlpZiAodW5saWtlbHkocmwtPmxjbiA8IExDTl9IT0xFKSkgeworCQkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlJ1bmxpc3QgZWxlbWVudCAiCisJCQkJCQkJImhhcyBpbnZhbGlkIGxjbiAiCisJCQkJCQkJIigweCVsbHgpLiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQlybC0+bGNuKTsKKwkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gdW5sX2Vycl9vdXQ7CisJCQl9CisJCX0KKwkJLyogVGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB0aGlzIHJ1biB0aGF0IG5lZWQgZnJlZWluZy4gKi8KKwkJdG9fZnJlZSA9IHJsLT5sZW5ndGg7CisJCWlmIChjb3VudCA+PSAwICYmIHRvX2ZyZWUgPiBjb3VudCkKKwkJCXRvX2ZyZWUgPSBjb3VudDsKKworCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCkpIHsKKwkJCS8qIERvIHRoZSBhY3R1YWwgZnJlZWluZyBvZiB0aGUgY2x1c3RlcnMgaW4gdGhlIHJ1bi4gKi8KKwkJCWVyciA9IG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihsY25ibXBfdmksIHJsLT5sY24sCisJCQkJCXRvX2ZyZWUsIGxpa2VseSghaXNfcm9sbGJhY2spID8gMCA6IDEpOworCQkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gY2xlYXIgIgorCQkJCQkJCSJzdWJzZXF1ZW50IHJ1bi4iKTsKKwkJCQlnb3RvIHVubF9lcnJfb3V0OworCQkJfQorCQkJLyogV2UgaGF2ZSBmcmVlZCBAdG9fZnJlZSByZWFsIGNsdXN0ZXJzLiAqLworCQkJcmVhbF9mcmVlZCArPSB0b19mcmVlOworCQl9CisJCS8qIEFkanVzdCB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIGxlZnQgdG8gZnJlZS4gKi8KKwkJaWYgKGNvdW50ID49IDApCisJCQljb3VudCAtPSB0b19mcmVlOworCQorCQkvKiBVcGRhdGUgdGhlIHRvdGFsIGRvbmUgY2x1c3RlcnMuICovCisJCXRvdGFsX2ZyZWVkICs9IHRvX2ZyZWU7CisJfQorCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCWlmIChsaWtlbHkoIWlzX3JvbGxiYWNrKSkKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCisJQlVHX09OKGNvdW50ID4gMCk7CisKKwkvKiBXZSBhcmUgZG9uZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjdHVhbGx5IGZyZWVkIGNsdXN0ZXJzLiAqLworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIHJlYWxfZnJlZWQ7Cit1bmxfZXJyX291dDoKKwl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKK2Vycl9vdXQ6CisJaWYgKGlzX3JvbGxiYWNrKQorCQlyZXR1cm4gZXJyOworCS8qIElmIG5vIHJlYWwgY2x1c3RlcnMgd2VyZSBmcmVlZCwgbm8gbmVlZCB0byByb2xsYmFjay4gKi8KKwlpZiAoIXJlYWxfZnJlZWQpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwkvKgorCSAqIEF0dGVtcHQgdG8gcm9sbGJhY2sgYW5kIGlmIHRoYXQgc3VjY2VlZHMganVzdCByZXR1cm4gdGhlIGVycm9yIGNvZGUuCisJICogSWYgcm9sbGJhY2sgZmFpbHMsIHNldCB0aGUgdm9sdW1lIGVycm9ycyBmbGFnLCBlbWl0IGFuIGVycm9yCisJICogbWVzc2FnZSwgYW5kIHJldHVybiB0aGUgZXJyb3IgY29kZS4KKwkgKi8KKwlkZWx0YSA9IF9fbnRmc19jbHVzdGVyX2ZyZWUodmksIHN0YXJ0X3ZjbiwgdG90YWxfZnJlZWQsIFRSVUUpOworCWlmIChkZWx0YSA8IDApIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJvbGxiYWNrIChlcnJvciAlaSkuICBMZWF2aW5nICIKKwkJCQkiaW5jb25zaXN0ZW50IG1ldGFkYXRhISAgVW5tb3VudCBhbmQgcnVuICIKKwkJCQkiY2hrZHNrLiIsIChpbnQpZGVsdGEpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJBYm9ydGluZyAoZXJyb3IgJWkpLiIsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGNuYWxsb2MuaCBiL2ZzL250ZnMvbGNuYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FjMWMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9sY25hbGxvYy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogbGNuYWxsb2MuaCAtIEV4cG9ydHMgZm9yIE5URlMga2VybmVsIGNsdXN0ZXIgKGRlKWFsbG9jYXRpb24uICBQYXJ0IG9mIHRoZQorICoJCUxpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19MQ05BTExPQ19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0xDTkFMTE9DX0gKKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInJ1bmxpc3QuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKwordHlwZWRlZiBlbnVtIHsKKwlGSVJTVF9aT05FCT0gMCwJLyogRm9yIHNhbml0eSBjaGVja2luZy4gKi8KKwlNRlRfWk9ORQk9IDAsCS8qIEFsbG9jYXRlIGZyb20gJE1GVCB6b25lLiAqLworCURBVEFfWk9ORQk9IDEsCS8qIEFsbG9jYXRlIGZyb20gJERBVEEgem9uZS4gKi8KKwlMQVNUX1pPTkUJPSAxLAkvKiBGb3Igc2FuaXR5IGNoZWNraW5nLiAqLworfSBOVEZTX0NMVVNURVJfQUxMT0NBVElPTl9aT05FUzsKKworZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19jbHVzdGVyX2FsbG9jKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IFZDTiBzdGFydF92Y24sIGNvbnN0IHM2NCBjb3VudCwgY29uc3QgTENOIHN0YXJ0X2xjbiwKKwkJY29uc3QgTlRGU19DTFVTVEVSX0FMTE9DQVRJT05fWk9ORVMgem9uZSk7CisKK2V4dGVybiBzNjQgX19udGZzX2NsdXN0ZXJfZnJlZShzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBWQ04gc3RhcnRfdmNuLAorCQlzNjQgY291bnQsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spOworCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9mcmVlIC0gZnJlZSBjbHVzdGVycyBvbiBhbiBudGZzIHZvbHVtZQorICogQHZpOgkJdmZzIGlub2RlIHdob3NlIHJ1bmxpc3QgZGVzY3JpYmVzIHRoZSBjbHVzdGVycyB0byBmcmVlCisgKiBAc3RhcnRfdmNuOgl2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgQHZpIGF0IHdoaWNoIHRvIHN0YXJ0IGZyZWVpbmcgY2x1c3RlcnMKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIGZyZWUgb3IgLTEgZm9yIGFsbCBjbHVzdGVycworICoKKyAqIEZyZWUgQGNvdW50IGNsdXN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBjbHVzdGVyIEBzdGFydF92Y24gaW4gdGhlIHJ1bmxpc3QKKyAqIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBJZiBAY291bnQgaXMgLTEsIGFsbCBjbHVzdGVycyBmcm9tIEBzdGFydF92Y24gdG8gdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBhcmUKKyAqIGRlYWxsb2NhdGVkLiAgVGh1cywgdG8gY29tcGxldGVseSBmcmVlIGFsbCBjbHVzdGVycyBpbiBhIHJ1bmxpc3QsIHVzZQorICogQHN0YXJ0X3ZjbiA9IDAgYW5kIEBjb3VudCA9IC0xLgorICoKKyAqIE5vdGUsIG50ZnNfY2x1c3Rlcl9mcmVlKCkgZG9lcyBub3QgbW9kaWZ5IHRoZSBydW5saXN0IGF0IGFsbCwgc28gdGhlIGNhbGxlcgorICogaGFzIHRvIGRlYWwgd2l0aCBpdCBsYXRlci4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWFsbG9jYXRlZCBjbHVzdGVycyAobm90IGNvdW50aW5nIHNwYXJzZSBvbmVzKSBvbgorICogc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IEB2aSBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcworICoJICAgICAgdW5sb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcnVubGlzdCBsb2NrIG9mIEB2aSBmb3IgcmVhZGluZyBhbmQKKyAqCSAgICAgIHNvbWV0aW1lcyBmb3Igd3JpdGluZyBhbmQgc29tZXRpbWVzIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICoJICAgIC0gVGhlIHZvbHVtZSBsY24gYml0bWFwIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkCisgKgkgICAgICBvbiByZXR1cm4uCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAorICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KKyAqLworc3RhdGljIGlubGluZSBzNjQgbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwKKwkJczY0IGNvdW50KQoreworCXJldHVybiBfX250ZnNfY2x1c3Rlcl9mcmVlKHZpLCBzdGFydF92Y24sIGNvdW50LCBGQUxTRSk7Cit9CisKK2V4dGVybiBpbnQgbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybF9ub2xvY2sobnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCk7CisKKy8qKgorICogbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybCAtIGZyZWUgY2x1c3RlcnMgZnJvbSBydW5saXN0CisgKiBAdm9sOgltb3VudGVkIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIGZyZWUgdGhlIGNsdXN0ZXJzCisgKiBAcmw6CQlydW5saXN0IGRlc2NyaWJpbmcgdGhlIGNsdXN0ZXJzIHRvIGZyZWUKKyAqCisgKiBGcmVlIGFsbCB0aGUgY2x1c3RlcnMgZGVzY3JpYmVkIGJ5IHRoZSBydW5saXN0IEBybCBvbiB0aGUgdm9sdW1lIEB2b2wuICBJbgorICogdGhlIGNhc2Ugb2YgYW4gZXJyb3IgYmVpbmcgcmV0dXJuZWQsIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGNsdXN0ZXJzIHdlcmUgbm90CisgKiBmcmVlZC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKKyAqCSAgICBtb2RpZmllcyB0aGUgYml0bWFwIGNvbnRlbnRzLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwpCit7CisJaW50IHJldDsKKworCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCXJldCA9IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKHZvbCwgcmwpOworCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogZGVmaW5lZCBfTElOVVhfTlRGU19MQ05BTExPQ19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xvZ2ZpbGUuYyBiL2ZzL250ZnMvbG9nZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjgwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2xvZ2ZpbGUuYwpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAqIGxvZ2ZpbGUuYyAtIE5URlMga2VybmVsIGpvdXJuYWwgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibG9nZmlsZS5oIgorI2luY2x1ZGUgIm1hbGxvYy5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIgLSBjaGVjayB0aGUgcGFnZSBoZWFkZXIgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBiZWxvbmdzCisgKiBAcnA6CQlyZXN0YXJ0IHBhZ2UgaGVhZGVyIHRvIGNoZWNrCisgKiBAcG9zOglwb3NpdGlvbiBpbiBAdmkgYXQgd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgcmVzaWRlcworICoKKyAqIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIEBycCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybiBUUlVFIGlmIGl0IGlzCisgKiBjb25zaXN0ZW50IGFuZCBGQUxTRSBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIE5URlNfQkxPQ0tfU0laRSBieXRlcyBpbiBAcnAsIGkuZS4gaXQgZG9lcyBub3QKKyAqIHJlcXVpcmUgdGhlIGZ1bGwgcmVzdGFydCBwYWdlLgorICovCitzdGF0aWMgQk9PTCBudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnAsIHM2NCBwb3MpCit7CisJdTMyIGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSwgbG9nZmlsZV9sb2dfcGFnZV9zaXplOworCXUxNiB1c2FfY291bnQsIHVzYV9vZnMsIHVzYV9lbmQsIHJhX29mczsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qCisJICogSWYgdGhlIHN5c3RlbSBvciBsb2cgcGFnZSBzaXplcyBhcmUgc21hbGxlciB0aGFuIHRoZSBudGZzIGJsb2NrIHNpemUKKwkgKiBvciBlaXRoZXIgaXMgbm90IGEgcG93ZXIgb2YgMiB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMgbG9nIGZpbGUuCisJICovCisJbG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplID0gbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpOworCWxvZ2ZpbGVfbG9nX3BhZ2Vfc2l6ZSA9IGxlMzJfdG9fY3B1KHJwLT5sb2dfcGFnZV9zaXplKTsKKwlpZiAobG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplIDwgTlRGU19CTE9DS19TSVpFIHx8CisJCQlsb2dmaWxlX2xvZ19wYWdlX3NpemUgPCBOVEZTX0JMT0NLX1NJWkUgfHwKKwkJCWxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSAmCisJCQkobG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplIC0gMSkgfHwKKwkJCWxvZ2ZpbGVfbG9nX3BhZ2Vfc2l6ZSAmIChsb2dmaWxlX2xvZ19wYWdlX3NpemUgLSAxKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgdXNlcyB1bnN1cHBvcnRlZCBwYWdlIHNpemUuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBXZSBtdXN0IGJlIGVpdGhlciBhdCAhcG9zICgxc3QgcmVzdGFydCBwYWdlKSBvciBhdCBwb3MgPSBzeXN0ZW0gcGFnZQorCSAqIHNpemUgKDJuZCByZXN0YXJ0IHBhZ2UpLgorCSAqLworCWlmIChwb3MgJiYgcG9zICE9IGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgcmVzdGFydCBhcmVhIGluIGluY29ycmVjdCAiCisJCQkJInBvc2l0aW9uIGluICRMb2dGaWxlLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIHZlcnNpb24gMS4xLiAqLworCWlmIChzbGUxNl90b19jcHUocnAtPm1ham9yX3ZlcikgIT0gMSB8fAorCQkJc2xlMTZfdG9fY3B1KHJwLT5taW5vcl92ZXIpICE9IDEpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHZlcnNpb24gJWkuJWkgaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkLiAgKFRoaXMgZHJpdmVyIHN1cHBvcnRzIHZlcnNpb24gIgorCQkJCSIxLjEgb25seS4pIiwgKGludClzbGUxNl90b19jcHUocnAtPm1ham9yX3ZlciksCisJCQkJKGludClzbGUxNl90b19jcHUocnAtPm1pbm9yX3ZlcikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFZlcmlmeSB0aGUgc2l6ZSBvZiB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5LiAqLworCXVzYV9jb3VudCA9IDEgKyAobG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTKTsKKwlpZiAodXNhX2NvdW50ICE9IGxlMTZfdG9fY3B1KHJwLT51c2FfY291bnQpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IHBhZ2Ugc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSBjb3VudC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBWZXJpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX29mcyA9IGxlMTZfdG9fY3B1KHJwLT51c2Ffb2ZzKTsKKwl1c2FfZW5kID0gdXNhX29mcyArIHVzYV9jb3VudCAqIHNpemVvZih1MTYpOworCWlmICh1c2Ffb2ZzIDwgc2l6ZW9mKFJFU1RBUlRfUEFHRV9IRUFERVIpIHx8CisJCQl1c2FfZW5kID4gTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgdXBkYXRlIHNlcXVlbmNlIGFycmF5IG9mZnNldC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFZlcmlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIHJlc3RhcnQgYXJlYS4gIEl0IG11c3QgYmU6CisJICoJLSBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeSwKKwkgKgktIGFmdGVyIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXksIGFuZAorCSAqCS0gd2l0aGluIHRoZSBzeXN0ZW0gcGFnZSBzaXplLgorCSAqLworCXJhX29mcyA9IGxlMTZfdG9fY3B1KHJwLT5yZXN0YXJ0X2FyZWFfb2Zmc2V0KTsKKwlpZiAocmFfb2ZzICYgNyB8fCByYV9vZnMgPCB1c2FfZW5kIHx8CisJCQlyYV9vZnMgPiBsb2dmaWxlX3N5c3RlbV9wYWdlX3NpemUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgcmVzdGFydCBhcmVhIG9mZnNldC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIE9ubHkgcmVzdGFydCBwYWdlcyBtb2RpZmllZCBieSBjaGtkc2sgYXJlIGFsbG93ZWQgdG8gaGF2ZSBjaGtkc2tfbHNuCisJICogc2V0LgorCSAqLworCWlmICghbnRmc19pc19jaGtkX3JlY29yZChycC0+bWFnaWMpICYmIHNsZTY0X3RvX2NwdShycC0+Y2hrZHNrX2xzbikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBpcyBub3QgbW9kaWZpZWQgIgorCQkJCSJjaGtkc2sgYnV0IGEgY2hrZHNrIExTTiBpcyBzcGVjaWZpZWQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBudGZzX2NoZWNrX3Jlc3RhcnRfYXJlYSAtIGNoZWNrIHRoZSByZXN0YXJ0IGFyZWEgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGJlbG9uZ3MKKyAqIEBycDoJCXJlc3RhcnQgcGFnZSB3aG9zZSByZXN0YXJ0IGFyZWEgdG8gY2hlY2sKKyAqCisgKiBDaGVjayB0aGUgcmVzdGFydCBhcmVhIG9mIHRoZSByZXN0YXJ0IHBhZ2UgQHJwIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuCisgKiBUUlVFIGlmIGl0IGlzIGNvbnNpc3RlbnQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuCisgKiBjb25zaXN0ZW5jeSBjaGVja2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMgaW4gQHJwLCBpLmUuIGl0IGRvZXMgbm90CisgKiByZXF1aXJlIHRoZSBmdWxsIHJlc3RhcnQgcGFnZS4KKyAqLworc3RhdGljIEJPT0wgbnRmc19jaGVja19yZXN0YXJ0X2FyZWEoc3RydWN0IGlub2RlICp2aSwgUkVTVEFSVF9QQUdFX0hFQURFUiAqcnApCit7CisJdTY0IGZpbGVfc2l6ZTsKKwlSRVNUQVJUX0FSRUEgKnJhOworCXUxNiByYV9vZnMsIHJhX2xlbiwgY2Ffb2ZzOworCXU4IGZzX2JpdHM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlyYV9vZnMgPSBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCk7CisJcmEgPSAoUkVTVEFSVF9BUkVBKikoKHU4KilycCArIHJhX29mcyk7CisJLyoKKwkgKiBFdmVyeXRoaW5nIGJlZm9yZSByYS0+ZmlsZV9zaXplIG11c3QgYmUgYmVmb3JlIHRoZSBmaXJzdCB3b3JkCisJICogcHJvdGVjdGVkIGJ5IGFuIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIuICBUaGlzIGVuc3VyZXMgdGhhdCBpdCBpcworCSAqIHNhZmUgdG8gYWNjZXNzIHJhLT5jbGllbnRfYXJyYXlfb2Zmc2V0LgorCSAqLworCWlmIChyYV9vZnMgKyBvZmZzZXRvZihSRVNUQVJUX0FSRUEsIGZpbGVfc2l6ZSkgPgorCQkJTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgZmlsZSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBjYW4gYWNjZXNzIHJhLT5jbGllbnRfYXJyYXlfb2Zmc2V0LCBtYWtlIHN1cmUgZXZlcnl0aGluZworCSAqIHVwIHRvIHRoZSBsb2cgY2xpZW50IGFycmF5IGlzIGJlZm9yZSB0aGUgZmlyc3Qgd29yZCBwcm90ZWN0ZWQgYnkgYW4KKwkgKiB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyLiAgVGhpcyBlbnN1cmVzIHdlIGNhbiBhY2Nlc3MgYWxsIG9mIHRoZQorCSAqIHJlc3RhcnQgYXJlYSBlbGVtZW50cyBzYWZlbHkuICBBbHNvLCB0aGUgY2xpZW50IGFycmF5IG9mZnNldCBtdXN0IGJlCisJICogYWxpZ25lZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkuCisJICovCisJY2Ffb2ZzID0gbGUxNl90b19jcHUocmEtPmNsaWVudF9hcnJheV9vZmZzZXQpOworCWlmICgoKGNhX29mcyArIDcpICYgfjcpICE9IGNhX29mcyB8fAorCQkJcmFfb2ZzICsgY2Ffb2ZzID4gTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgY2xpZW50IGFycmF5IG9mZnNldC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFRoZSByZXN0YXJ0IGFyZWEgbXVzdCBlbmQgd2l0aGluIHRoZSBzeXN0ZW0gcGFnZSBzaXplIGJvdGggd2hlbgorCSAqIGNhbGN1bGF0ZWQgbWFudWFsbHkgYW5kIGFzIHNwZWNpZmllZCBieSByYS0+cmVzdGFydF9hcmVhX2xlbmd0aC4KKwkgKiBBbHNvLCB0aGUgY2FsY3VsYXRlZCBsZW5ndGggbXVzdCBub3QgZXhjZWVkIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgorCSAqLworCXJhX2xlbiA9IGNhX29mcyArIGxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cykgKgorCQkJc2l6ZW9mKExPR19DTElFTlRfUkVDT1JEKTsKKwlpZiAocmFfb2ZzICsgcmFfbGVuID4gbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpIHx8CisJCQlyYV9vZnMgKyBsZTE2X3RvX2NwdShyYS0+cmVzdGFydF9hcmVhX2xlbmd0aCkgPgorCQkJbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpIHx8CisJCQlyYV9sZW4gPiBsZTE2X3RvX2NwdShyYS0+cmVzdGFydF9hcmVhX2xlbmd0aCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBpcyBvdXQgb2YgYm91bmRzICIKKwkJCQkib2YgdGhlIHN5c3RlbSBwYWdlIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSAiCisJCQkJInJlc3RhcnQgcGFnZSBoZWFkZXIgYW5kL29yIHRoZSBzcGVjaWZpZWQgIgorCQkJCSJyZXN0YXJ0IGFyZWEgbGVuZ3RoIGlzIGluY29uc2lzdGVudC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFRoZSByYS0+Y2xpZW50X2ZyZWVfbGlzdCBhbmQgcmEtPmNsaWVudF9pbl91c2VfbGlzdCBtdXN0IGJlIGVpdGhlcgorCSAqIExPR0ZJTEVfTk9fQ0xJRU5UIG9yIGxlc3MgdGhhbiByYS0+bG9nX2NsaWVudHMgb3IgdGhleSBhcmUKKwkgKiBvdmVyZmxvd2luZyB0aGUgY2xpZW50IGFycmF5LgorCSAqLworCWlmICgocmEtPmNsaWVudF9mcmVlX2xpc3QgIT0gTE9HRklMRV9OT19DTElFTlQgJiYKKwkJCWxlMTZfdG9fY3B1KHJhLT5jbGllbnRfZnJlZV9saXN0KSA+PQorCQkJbGUxNl90b19jcHUocmEtPmxvZ19jbGllbnRzKSkgfHwKKwkJCShyYS0+Y2xpZW50X2luX3VzZV9saXN0ICE9IExPR0ZJTEVfTk9fQ0xJRU5UICYmCisJCQlsZTE2X3RvX2NwdShyYS0+Y2xpZW50X2luX3VzZV9saXN0KSA+PQorCQkJbGUxNl90b19jcHUocmEtPmxvZ19jbGllbnRzKSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJvdmVyZmxvd2luZyBjbGllbnQgZnJlZSBhbmQvb3IgaW4gdXNlIGxpc3RzLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogQ2hlY2sgcmEtPnNlcV9udW1iZXJfYml0cyBhZ2FpbnN0IHJhLT5maWxlX3NpemUgZm9yIGNvbnNpc3RlbmN5LgorCSAqIFdlIGNhbm5vdCBqdXN0IHVzZSBmZnMoKSBiZWNhdXNlIHRoZSBmaWxlIHNpemUgaXMgbm90IGEgcG93ZXIgb2YgMi4KKwkgKi8KKwlmaWxlX3NpemUgPSAodTY0KXNsZTY0X3RvX2NwdShyYS0+ZmlsZV9zaXplKTsKKwlmc19iaXRzID0gMDsKKwl3aGlsZSAoZmlsZV9zaXplKSB7CisJCWZpbGVfc2l6ZSA+Pj0gMTsKKwkJZnNfYml0cysrOworCX0KKwlpZiAobGUzMl90b19jcHUocmEtPnNlcV9udW1iZXJfYml0cykgIT0gNjcgLSBmc19iaXRzKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IHNlcXVlbmNlIG51bWJlciBiaXRzLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFRoZSBsb2cgcmVjb3JkIGhlYWRlciBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguICovCisJaWYgKCgobGUxNl90b19jcHUocmEtPmxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aCkgKyA3KSAmIH43KSAhPQorCQkJbGUxNl90b19jcHUocmEtPmxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgbG9nIHJlY29yZCBoZWFkZXIgbGVuZ3RoLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIERpdG8gZm9yIHRoZSBsb2cgcGFnZSBkYXRhIG9mZnNldC4gKi8KKwlpZiAoKChsZTE2X3RvX2NwdShyYS0+bG9nX3BhZ2VfZGF0YV9vZmZzZXQpICsgNykgJiB+NykgIT0KKwkJCWxlMTZfdG9fY3B1KHJhLT5sb2dfcGFnZV9kYXRhX29mZnNldCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgbG9nIHBhZ2UgZGF0YSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkgLSBjaGVjayB0aGUgbG9nIGNsaWVudCBhcnJheSBmb3IgY29uc2lzdGVuY3kKKyAqIEB2aToJCSRMb2dGaWxlIGlub2RlIHRvIHdoaWNoIHRoZSByZXN0YXJ0IHBhZ2UgYmVsb25ncworICogQHJwOgkJcmVzdGFydCBwYWdlIHdob3NlIGxvZyBjbGllbnQgYXJyYXkgdG8gY2hlY2sKKyAqCisgKiBDaGVjayB0aGUgbG9nIGNsaWVudCBhcnJheSBvZiB0aGUgcmVzdGFydCBwYWdlIEBycCBmb3IgY29uc2lzdGVuY3kgYW5kCisgKiByZXR1cm4gVFJVRSBpZiBpdCBpcyBjb25zaXN0ZW50IGFuZCBGQUxTRSBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgYW5kIHRoZSByZXN0YXJ0IGFyZWEgaGF2ZQorICogYWxyZWFkeSBiZWVuIGNvbnNpc3RlbmN5IGNoZWNrZWQuCisgKgorICogVW5saWtlIG50ZnNfY2hlY2tfcmVzdGFydF9wYWdlX2hlYWRlcigpIGFuZCBudGZzX2NoZWNrX3Jlc3RhcnRfYXJlYSgpLCB0aGlzCisgKiBmdW5jdGlvbiBuZWVkcyBAcnAtPnN5c3RlbV9wYWdlX3NpemUgYnl0ZXMgaW4gQHJwLCBpLmUuIGl0IHJlcXVpcmVzIHRoZSBmdWxsCisgKiByZXN0YXJ0IHBhZ2UgYW5kIHRoZSBwYWdlIG11c3QgYmUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkLgorICovCitzdGF0aWMgQk9PTCBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnApCit7CisJUkVTVEFSVF9BUkVBICpyYTsKKwlMT0dfQ0xJRU5UX1JFQ09SRCAqY2EsICpjcjsKKwl1MTYgbnJfY2xpZW50cywgaWR4OworCUJPT0wgaW5fZnJlZV9saXN0LCBpZHhfaXNfZmlyc3Q7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlyYSA9IChSRVNUQVJUX0FSRUEqKSgodTgqKXJwICsgbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpKTsKKwljYSA9IChMT0dfQ0xJRU5UX1JFQ09SRCopKCh1OCopcmEgKworCQkJbGUxNl90b19jcHUocmEtPmNsaWVudF9hcnJheV9vZmZzZXQpKTsKKwkvKgorCSAqIENoZWNrIHRoZSByYS0+Y2xpZW50X2ZyZWVfbGlzdCBmaXJzdCBhbmQgdGhlbiBjaGVjayB0aGUKKwkgKiByYS0+Y2xpZW50X2luX3VzZV9saXN0LiAgQ2hlY2sgZWFjaCBvZiB0aGUgbG9nIGNsaWVudCByZWNvcmRzIGluCisJICogZWFjaCBvZiB0aGUgbGlzdHMgYW5kIGNoZWNrIHRoYXQgdGhlIGFycmF5IGRvZXMgbm90IG92ZXJmbG93IHRoZQorCSAqIHJhLT5sb2dfY2xpZW50cyB2YWx1ZS4gIEFsc28ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlY29yZHMKKwkgKiB2aXNpdGVkIGFzIHRoZXJlIGNhbm5vdCBiZSBtb3JlIHRoYW4gcmEtPmxvZ19jbGllbnRzIHJlY29yZHMgYW5kCisJICogdGhhdCB3YXkgd2UgZGV0ZWN0IGV2ZW50dWFsIGxvb3BzIGluIHdpdGhpbiBhIGxpc3QuCisJICovCisJbnJfY2xpZW50cyA9IGxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cyk7CisJaWR4ID0gbGUxNl90b19jcHUocmEtPmNsaWVudF9mcmVlX2xpc3QpOworCWluX2ZyZWVfbGlzdCA9IFRSVUU7CitjaGVja19saXN0OgorCWZvciAoaWR4X2lzX2ZpcnN0ID0gVFJVRTsgaWR4ICE9IExPR0ZJTEVfTk9fQ0xJRU5UX0NQVTsgbnJfY2xpZW50cy0tLAorCQkJaWR4ID0gbGUxNl90b19jcHUoY3ItPm5leHRfY2xpZW50KSkgeworCQlpZiAoIW5yX2NsaWVudHMgfHwgaWR4ID49IGxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cykpCisJCQlnb3RvIGVycl9vdXQ7CisJCS8qIFNldCBAY3IgdG8gdGhlIGN1cnJlbnQgbG9nIGNsaWVudCByZWNvcmQuICovCisJCWNyID0gY2EgKyBpZHg7CisJCS8qIFRoZSBmaXJzdCBsb2cgY2xpZW50IHJlY29yZCBtdXN0IG5vdCBoYXZlIGEgcHJldl9jbGllbnQuICovCisJCWlmIChpZHhfaXNfZmlyc3QpIHsKKwkJCWlmIChjci0+cHJldl9jbGllbnQgIT0gTE9HRklMRV9OT19DTElFTlQpCisJCQkJZ290byBlcnJfb3V0OworCQkJaWR4X2lzX2ZpcnN0ID0gRkFMU0U7CisJCX0KKwl9CisJLyogU3dpdGNoIHRvIGFuZCBjaGVjayB0aGUgaW4gdXNlIGxpc3QgaWYgd2UganVzdCBkaWQgdGhlIGZyZWUgbGlzdC4gKi8KKwlpZiAoaW5fZnJlZV9saXN0KSB7CisJCWluX2ZyZWVfbGlzdCA9IEZBTFNFOworCQlpZHggPSBsZTE2X3RvX2NwdShyYS0+Y2xpZW50X2luX3VzZV9saXN0KTsKKwkJZ290byBjaGVja19saXN0OworCX0KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgbG9nIGNsaWVudCBhcnJheSBpcyBjb3JydXB0LiIpOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX2NoZWNrX2FuZF9sb2FkX3Jlc3RhcnRfcGFnZSAtIGNoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGJlbG9uZ3MKKyAqIEBycDoJCXJlc3RhcnQgcGFnZSB0byBjaGVjaworICogQHBvczoJcG9zaXRpb24gaW4gQHZpIGF0IHdoaWNoIHRoZSByZXN0YXJ0IHBhZ2UgcmVzaWRlcworICogQHdycDoJY29weSBvZiB0aGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIHJlc3RhcnQgcGFnZQorICoKKyAqIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgQHJwIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaXMKKyAqIGNvbnNpc3RlbnQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgTlRGU19CTE9DS19TSVpFIGJ5dGVzIGluIEBycCwgaS5lLiBpdCBkb2VzIG5vdAorICogcmVxdWlyZSB0aGUgZnVsbCByZXN0YXJ0IHBhZ2UuCisgKgorICogSWYgQHdycCBpcyBub3QgTlVMTCwgb24gc3VjY2VzcywgKkB3cnAgd2lsbCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhlIGNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCBwYWdlLiAgT24gZmFpbHVyZSwKKyAqICpAd3JwIGlzIHVuZGVmaW5lZC4KKyAqLworc3RhdGljIEJPT0wgbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2Uoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnAsIHM2NCBwb3MsIFJFU1RBUlRfUEFHRV9IRUFERVIgKip3cnApCit7CisJUkVTVEFSVF9BUkVBICpyYTsKKwlSRVNUQVJUX1BBR0VfSEVBREVSICp0cnA7CisJaW50IHNpemU7CisJQk9PTCByZXQ7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBmb3IgY29uc2lzdGVuY3kuICovCisJaWYgKCFudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIodmksIHJwLCBwb3MpKSB7CisJCS8qIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBDaGVjayB0aGUgcmVzdGFydCBhcmVhIGZvciBjb25zaXN0ZW5jeS4gKi8KKwlpZiAoIW50ZnNfY2hlY2tfcmVzdGFydF9hcmVhKHZpLCBycCkpIHsKKwkJLyogRXJyb3Igb3V0cHV0IGFscmVhZHkgZG9uZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJhID0gKFJFU1RBUlRfQVJFQSopKCh1OCopcnAgKyBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCkpOworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgdG8gc3RvcmUgdGhlIHdob2xlIHJlc3RhcnQgcGFnZSBzbyB3ZSBjYW4gbXVsdGkKKwkgKiBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0IGl0LgorCSAqLworCXRycCA9IG50ZnNfbWFsbG9jX25vZnMobGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpKTsKKwlpZiAoIXRycCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJExvZ0ZpbGUgIgorCQkJCSJyZXN0YXJ0IHBhZ2UgYnVmZmVyLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogUmVhZCB0aGUgd2hvbGUgb2YgdGhlIHJlc3RhcnQgcGFnZSBpbnRvIHRoZSBidWZmZXIuICBJZiBpdCBmaXRzCisJICogY29tcGxldGVseSBpbnNpZGUgQHJwLCBqdXN0IGNvcHkgaXQgZnJvbSB0aGVyZS4gIE90aGVyd2lzZSBtYXAgYWxsCisJICogdGhlIHJlcXVpcmVkIHBhZ2VzIGFuZCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlbS4KKwkgKi8KKwlzaXplID0gUEFHRV9DQUNIRV9TSVpFIC0gKHBvcyAmIH5QQUdFX0NBQ0hFX01BU0spOworCWlmIChzaXplID49IGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSkgeworCQltZW1jcHkodHJwLCBycCwgbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpKTsKKwl9IGVsc2UgeworCQlwZ29mZl90IGlkeDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWludCBoYXZlX3JlYWQsIHRvX3JlYWQ7CisKKwkJLyogRmlyc3QgY29weSB3aGF0IHdlIGFscmVhZHkgaGF2ZSBpbiBAcnAuICovCisJCW1lbWNweSh0cnAsIHJwLCBzaXplKTsKKwkJLyogQ29weSB0aGUgcmVtYWluaW5nIGRhdGEgb25lIHBhZ2UgYXQgYSB0aW1lLiAqLworCQloYXZlX3JlYWQgPSBzaXplOworCQl0b19yZWFkID0gbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpIC0gc2l6ZTsKKwkJaWR4ID0gKHBvcyArIHNpemUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCUJVR19PTigocG9zICsgc2l6ZSkgJiB+UEFHRV9DQUNIRV9NQVNLKTsKKwkJZG8geworCQkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UodmktPmlfbWFwcGluZywgaWR4KTsKKwkJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSAiCisJCQkJCQkicGFnZSAoaW5kZXggJWx1KS4iLCBpZHgpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCXNpemUgPSBtaW5fdChpbnQsIHRvX3JlYWQsIFBBR0VfQ0FDSEVfU0laRSk7CisJCQltZW1jcHkoKHU4Kil0cnAgKyBoYXZlX3JlYWQsIHBhZ2VfYWRkcmVzcyhwYWdlKSwgc2l6ZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQloYXZlX3JlYWQgKz0gc2l6ZTsKKwkJCXRvX3JlYWQgLT0gc2l6ZTsKKwkJCWlkeCsrOworCQl9IHdoaWxlICh0b19yZWFkID4gMCk7CisJfQorCS8qIFBlcmZvcm0gdGhlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3Rpb24gb24gdGhlIGJ1ZmZlci4gKi8KKwlpZiAocG9zdF9yZWFkX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKXRycCwKKwkJCWxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIk11bHRpIHNlY3RvciB0cmFuc2ZlciBlcnJvciBkZXRlY3RlZCBpbiAiCisJCQkJIiRMb2dGaWxlIHJlc3RhcnQgcGFnZS4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBDaGVjayB0aGUgbG9nIGNsaWVudCByZWNvcmRzIGZvciBjb25zaXN0ZW5jeS4gKi8KKwlyZXQgPSBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkodmksIHRycCk7CisJaWYgKHJldCAmJiB3cnApCisJCSp3cnAgPSB0cnA7CisJZWxzZQorCQludGZzX2ZyZWUodHJwKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiByZXQ7CitlcnJfb3V0OgorCW50ZnNfZnJlZSh0cnApOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX2NrZWNrX2xvZ2ZpbGUgLSBjaGVjayBpbiB0aGUgam91cm5hbCBpZiB0aGUgdm9sdW1lIGlzIGNvbnNpc3RlbnQKKyAqIEBsb2dfdmk6CXN0cnVjdCBpbm9kZSBvZiBsb2FkZWQgam91cm5hbCAkTG9nRmlsZSB0byBjaGVjaworICoKKyAqIENoZWNrIHRoZSAkTG9nRmlsZSBqb3VybmFsIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaXMKKyAqIGNvbnNpc3RlbnQgYW5kIEZBTFNFIGlmIG5vdC4KKyAqCisgKiBBdCBwcmVzZW50IHdlIG9ubHkgY2hlY2sgdGhlIHR3byByZXN0YXJ0IHBhZ2VzIGFuZCBpZ25vcmUgdGhlIGxvZyByZWNvcmQKKyAqIHBhZ2VzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgTXN0UHJvdGVjdGVkIGZsYWcgaXMgbm90IHNldCBvbiB0aGUgJExvZ0ZpbGUgaW5vZGUgYW5kIGhlbmNlCisgKiB3aGVuIHJlYWRpbmcgcGFnZXMgdGhleSBhcmUgbm90IGRlcHJvdGVjdGVkLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGRvIG5vdCBrbm93CisgKiBpZiB0aGUgJExvZ0ZpbGUgd2FzIGNyZWF0ZWQgb24gYSBzeXN0ZW0gd2l0aCBhIGRpZmZlcmVudCBwYWdlIHNpemUgdG8gb3VycworICogeWV0IGFuZCBtc3QgZGVwcm90ZWN0aW9uIHdvdWxkIGZhaWwgaWYgb3VyIHBhZ2Ugc2l6ZSBpcyBzbWFsbGVyLgorICovCitCT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSkKK3sKKwlzNjQgc2l6ZSwgcG9zLCByc3RyMV9wb3MsIHJzdHIyX3BvczsKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihsb2dfdmktPmlfc2IpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gbG9nX3ZpLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXU4ICprYWRkciA9IE5VTEw7CisJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnN0cjFfcGggPSBOVUxMOworCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJzdHIyX3BoID0gTlVMTDsKKwlpbnQgbG9nX3BhZ2Vfc2l6ZSwgbG9nX3BhZ2VfbWFzaywgb2ZzOworCUJPT0wgbG9nZmlsZV9pc19lbXB0eSA9IFRSVUU7CisJQk9PTCByc3RyMV9mb3VuZCA9IEZBTFNFOworCUJPT0wgcnN0cjJfZm91bmQgPSBGQUxTRTsKKwl1OCBsb2dfcGFnZV9iaXRzOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogQW4gZW1wdHkgJExvZ0ZpbGUgbXVzdCBoYXZlIGJlZW4gY2xlYW4gYmVmb3JlIGl0IGdvdCBlbXB0aWVkLiAqLworCWlmIChOVm9sTG9nRmlsZUVtcHR5KHZvbCkpCisJCWdvdG8gaXNfZW1wdHk7CisJc2l6ZSA9IGxvZ192aS0+aV9zaXplOworCS8qIE1ha2Ugc3VyZSB0aGUgZmlsZSBkb2Vzbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUuICovCisJaWYgKHNpemUgPiBNYXhMb2dGaWxlU2l6ZSkKKwkJc2l6ZSA9IE1heExvZ0ZpbGVTaXplOworCS8qCisJICogVHJ1bmNhdGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIGNhY2hlIHNpemUgb3IgdGhlIGRlZmF1bHQKKwkgKiBsb2cgcGFnZSBzaXplIGlmIHRoZSBwYWdlIGNhY2hlIHNpemUgaXMgYmV0d2VlbiB0aGUgZGVmYXVsdCBsb2cgcGFnZQorCSAqIGxvZyBwYWdlIHNpemUgaWYgdGhlIHBhZ2UgY2FjaGUgc2l6ZSBpcyBiZXR3ZWVuIHRoZSBkZWZhdWx0IGxvZyBwYWdlCisJICogc2l6ZSBhbmQgdHdpY2UgdGhhdC4KKwkgKi8KKwlpZiAoUEFHRV9DQUNIRV9TSVpFID49IERlZmF1bHRMb2dQYWdlU2l6ZSAmJiBQQUdFX0NBQ0hFX1NJWkUgPD0KKwkJCURlZmF1bHRMb2dQYWdlU2l6ZSAqIDIpCisJCWxvZ19wYWdlX3NpemUgPSBEZWZhdWx0TG9nUGFnZVNpemU7CisJZWxzZQorCQlsb2dfcGFnZV9zaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWxvZ19wYWdlX21hc2sgPSBsb2dfcGFnZV9zaXplIC0gMTsKKwkvKgorCSAqIFVzZSBnZW5lcmljX2ZmcygpIGluc3RlYWQgb2YgZmZzKCkgdG8gZW5hYmxlIHRoZSBjb21waWxlciB0bworCSAqIG9wdGltaXplIGxvZ19wYWdlX3NpemUgYW5kIGxvZ19wYWdlX2JpdHMgaW50byBjb25zdGFudHMuCisJICovCisJbG9nX3BhZ2VfYml0cyA9IGdlbmVyaWNfZmZzKGxvZ19wYWdlX3NpemUpIC0gMTsKKwlzaXplICY9IH4obG9nX3BhZ2Vfc2l6ZSAtIDEpOworCS8qCisJICogRW5zdXJlIHRoZSBsb2cgZmlsZSBpcyBiaWcgZW5vdWdoIHRvIHN0b3JlIGF0IGxlYXN0IHRoZSB0d28gcmVzdGFydAorCSAqIHBhZ2VzIGFuZCB0aGUgbWluaW11bSBudW1iZXIgb2YgbG9nIHJlY29yZCBwYWdlcy4KKwkgKi8KKwlpZiAoc2l6ZSA8IGxvZ19wYWdlX3NpemUgKiAyIHx8IChzaXplIC0gbG9nX3BhZ2Vfc2l6ZSAqIDIpID4+CisJCQlsb2dfcGFnZV9iaXRzIDwgTWluTG9nUmVjb3JkUGFnZXMpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJExvZ0ZpbGUgaXMgdG9vIHNtYWxsLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogUmVhZCB0aHJvdWdoIHRoZSBmaWxlIGxvb2tpbmcgZm9yIGEgcmVzdGFydCBwYWdlLiAgU2luY2UgdGhlIHJlc3RhcnQKKwkgKiBwYWdlIGhlYWRlciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGFnZSB3ZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGF0CisJICogd2hhdCBjb3VsZCBiZSB0aGUgYmVnaW5uaW5nIG9mIGEgcGFnZSAoZm9yIGVhY2ggcGFnZSBzaXplKSByYXRoZXIKKwkgKiB0aGFuIHNjYW5uaW5nIHRoZSB3aG9sZSBmaWxlIGJ5dGUgYnkgYnl0ZS4gIElmIGFsbCBwb3RlbnRpYWwgcGxhY2VzCisJICogY29udGFpbiBlbXB0eSBhbmQgdW5pbml0aWFsemVkIHJlY29yZHMsIHRoZSBsb2cgZmlsZSBjYW4gYmUgYXNzdW1lZAorCSAqIHRvIGJlIGVtcHR5LgorCSAqLworCWZvciAocG9zID0gMDsgcG9zIDwgc2l6ZTsgcG9zIDw8PSAxKSB7CisJCXBnb2ZmX3QgaWR4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlmICghcGFnZSB8fCBwYWdlLT5pbmRleCAhPSBpZHgpIHsKKwkJCWlmIChwYWdlKQorCQkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1hcHBpbmcsIGlkeCk7CisJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSAiCisJCQkJCQkicGFnZSAoaW5kZXggJWx1KS4iLCBpZHgpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCQlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpICsgKHBvcyAmIH5QQUdFX0NBQ0hFX01BU0spOworCQkvKgorCQkgKiBBIG5vbi1lbXB0eSBibG9jayBtZWFucyB0aGUgbG9nZmlsZSBpcyBub3QgZW1wdHkgd2hpbGUgYW4KKwkJICogZW1wdHkgYmxvY2sgYWZ0ZXIgYSBub24tZW1wdHkgYmxvY2sgaGFzIGJlZW4gZW5jb3VudGVyZWQKKwkJICogbWVhbnMgd2UgYXJlIGRvbmUuCisJCSAqLworCQlpZiAoIW50ZnNfaXNfZW1wdHlfcmVjb3JkcCgobGUzMiopa2FkZHIpKQorCQkJbG9nZmlsZV9pc19lbXB0eSA9IEZBTFNFOworCQllbHNlIGlmICghbG9nZmlsZV9pc19lbXB0eSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIGxvZyByZWNvcmQgcGFnZSBtZWFucyB0aGVyZSBjYW5ub3QgYmUgYSByZXN0YXJ0IHBhZ2UgYWZ0ZXIKKwkJICogdGhpcyBzbyBubyBuZWVkIHRvIGNvbnRpbnVlIHNlYXJjaGluZy4KKwkJICovCisJCWlmIChudGZzX2lzX3JjcmRfcmVjb3JkcCgobGUzMiopa2FkZHIpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEEgbW9kaWZpZWQgYnkgY2hrZHNrIHJlc3RhcnQgcGFnZSBtZWFucyB3ZSBjYW5ub3QgaGFuZGxlCisJCSAqIHRoaXMgbG9nIGZpbGUuCisJCSAqLworCQlpZiAobnRmc19pc19jaGtkX3JlY29yZHAoKGxlMzIqKWthZGRyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiJExvZ0ZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgIgorCQkJCQkiY2hrZHNrLiAgTW91bnQgdGhpcyB2b2x1bWUgaW4gIgorCQkJCQkiV2luZG93cy4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQkvKiBJZiBub3QgYSByZXN0YXJ0IHBhZ2UsIGNvbnRpbnVlLiAqLworCQlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmRwKChsZTMyKilrYWRkcikpIHsKKwkJCS8qIFNraXAgdG8gdGhlIG1pbmltdW0gcGFnZSBzaXplIGZvciB0aGUgbmV4dCBvbmUuICovCisJCQlpZiAoIXBvcykKKwkJCQlwb3MgPSBOVEZTX0JMT0NLX1NJWkUgPj4gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdlIG5vdyBrbm93IHdlIGhhdmUgYSByZXN0YXJ0IHBhZ2UuICovCisJCWlmICghcG9zKSB7CisJCQlyc3RyMV9mb3VuZCA9IFRSVUU7CisJCQlyc3RyMV9wb3MgPSBwb3M7CisJCX0gZWxzZSB7CisJCQlpZiAocnN0cjJfZm91bmQpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGb3VuZCBtb3JlIHRoYW4gdHdvICIKKwkJCQkJCSJyZXN0YXJ0IHBhZ2VzIGluICRMb2dGaWxlLiIpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCXJzdHIyX2ZvdW5kID0gVFJVRTsKKwkJCXJzdHIyX3BvcyA9IHBvczsKKwkJfQorCQkvKgorCQkgKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGZvciBjb25zaXN0ZW5jeSBhbmQgZ2V0IGEgY29weSBvZiB0aGUKKwkJICogY29tcGxldGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIHJlc3RhcnQgcGFnZS4KKwkJICovCisJCWlmICghbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2UobG9nX3ZpLAorCQkJCShSRVNUQVJUX1BBR0VfSEVBREVSKilrYWRkciwgcG9zLAorCQkJCSFwb3MgPyAmcnN0cjFfcGggOiAmcnN0cjJfcGgpKSB7CisJCQkvKiBFcnJvciBvdXRwdXQgYWxyZWFkeSBkb25lIGluc2lkZSB0aGUgZnVuY3Rpb24uICovCisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogV2UgaGF2ZSBhIHZhbGlkIHJlc3RhcnQgcGFnZS4gIFRoZSBuZXh0IG9uZSBtdXN0IGJlIGFmdGVyCisJCSAqIGEgd2hvbGUgc3lzdGVtIHBhZ2Ugc2l6ZSBhcyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkIHJlc3RhcnQKKwkJICogcGFnZS4KKwkJICovCisJCWlmICghcG9zKQorCQkJcG9zID0gbGUzMl90b19jcHUocnN0cjFfcGgtPnN5c3RlbV9wYWdlX3NpemUpID4+IDE7CisJfQorCWlmIChwYWdlKSB7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJcGFnZSA9IE5VTEw7CisJfQorCWlmIChsb2dmaWxlX2lzX2VtcHR5KSB7CisJCU5Wb2xTZXRMb2dGaWxlRW1wdHkodm9sKTsKK2lzX2VtcHR5OgorCQludGZzX2RlYnVnKCJEb25lLiAgKCRMb2dGaWxlIGlzIGVtcHR5LikiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmICghcnN0cjFfZm91bmQgfHwgIXJzdHIyX2ZvdW5kKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkRpZCBub3QgZmluZCB0d28gcmVzdGFydCBwYWdlcyBpbiAiCisJCQkJIiRMb2dGaWxlLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qCisJICogVGhlIHR3byByZXN0YXJ0IGFyZWFzIG11c3QgYmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIHVwZGF0ZQorCSAqIHNlcXVlbmNlIG51bWJlci4KKwkgKi8KKwlvZnMgPSBsZTE2X3RvX2NwdShyc3RyMV9waC0+dXNhX29mcyk7CisJaWYgKG1lbWNtcChyc3RyMV9waCwgcnN0cjJfcGgsIG9mcykgfHwgKG9mcyArPSBzaXplb2YodTE2KSwKKwkJCW1lbWNtcCgodTgqKXJzdHIxX3BoICsgb2ZzLCAodTgqKXJzdHIyX3BoICsgb2ZzLAorCQkJbGUzMl90b19jcHUocnN0cjFfcGgtPnN5c3RlbV9wYWdlX3NpemUpIC0gb2ZzKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiVGhlIHR3byByZXN0YXJ0IHBhZ2VzIGluICRMb2dGaWxlIGRvIG5vdCAiCisJCQkJIm1hdGNoLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZnJlZShyc3RyMV9waCk7CisJbnRmc19mcmVlKHJzdHIyX3BoKTsKKwkvKiBBbGwgY29uc2lzdGVuY3kgY2hlY2tzIHBhc3NlZC4gKi8KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwlpZiAocGFnZSkKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCWlmIChyc3RyMV9waCkKKwkJbnRmc19mcmVlKHJzdHIxX3BoKTsKKwlpZiAocnN0cjJfcGgpCisJCW50ZnNfZnJlZShyc3RyMl9waCk7CisJcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIG50ZnNfaXNfbG9nZmlsZV9jbGVhbiAtIGNoZWNrIGluIHRoZSBqb3VybmFsIGlmIHRoZSB2b2x1bWUgaXMgY2xlYW4KKyAqIEBsb2dfdmk6CXN0cnVjdCBpbm9kZSBvZiBsb2FkZWQgam91cm5hbCAkTG9nRmlsZSB0byBjaGVjaworICoKKyAqIEFuYWx5emUgdGhlICRMb2dGaWxlIGpvdXJuYWwgYW5kIHJldHVybiBUUlVFIGlmIGl0IGluZGljYXRlcyB0aGUgdm9sdW1lIHdhcworICogc2h1dGRvd24gY2xlYW5seSBhbmQgRkFMU0UgaWYgbm90LgorICoKKyAqIEF0IHByZXNlbnQgd2Ugb25seSBsb29rIGF0IHRoZSB0d28gcmVzdGFydCBwYWdlcyBhbmQgaWdub3JlIHRoZSBsb2cgcmVjb3JkCisgKiBwYWdlcy4gIFRoaXMgaXMgYSBsaXR0bGUgYml0IGNydWRlIGluIHRoYXQgdGhlcmUgd2lsbCBiZSBhIHZlcnkgc21hbGwgbnVtYmVyCisgKiBvZiBjYXNlcyB3aGVyZSB3ZSB0aGluayB0aGF0IGEgdm9sdW1lIGlzIGRpcnR5IHdoZW4gaW4gZmFjdCBpdCBpcyBjbGVhbi4KKyAqIFRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0IHZvbHVtZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHNodXRkb3duIGNsZWFubHkgYnV0IGRpZAorICogbm90IGhhdmUgYW55IHBlbmRpbmcsIG5vbi1jaGVjay1wb2ludGVkIGkvbywgaS5lLiB0aGV5IHdlcmUgY29tcGxldGVseSBpZGxlCisgKiBhdCBsZWFzdCBmb3IgdGhlIGZpdmUgc2Vjb25kcyBwcmVjZWVkaW5nIHRoZSB1bmNsZWFuIHNodXRkb3duLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAkTG9nRmlsZSBqb3VybmFsIGhhcyBhbHJlYWR5IGJlZW4gY29uc2lzdGVuY3kKKyAqIGNoZWNrZWQgYnkgYSBjYWxsIHRvIG50ZnNfY2hlY2tfbG9nZmlsZSgpIGFuZCBpbiBwYXJ0aWN1bGFyIGlmIHRoZSAkTG9nRmlsZQorICogaXMgZW1wdHkgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IE5Wb2xMb2dGaWxlRW1wdHkoKSBpcyB0cnVlIG90aGVyd2lzZSBhbgorICogZW1wdHkgdm9sdW1lIHdpbGwgYmUgcmVwb3J0ZWQgYXMgZGlydHkuCisgKi8KK0JPT0wgbnRmc19pc19sb2dmaWxlX2NsZWFuKHN0cnVjdCBpbm9kZSAqbG9nX3ZpKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGxvZ192aS0+aV9zYik7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnA7CisJUkVTVEFSVF9BUkVBICpyYTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIEFuIGVtcHR5ICRMb2dGaWxlIG11c3QgaGF2ZSBiZWVuIGNsZWFuIGJlZm9yZSBpdCBnb3QgZW1wdGllZC4gKi8KKwlpZiAoTlZvbExvZ0ZpbGVFbXB0eSh2b2wpKSB7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoJExvZ0ZpbGUgaXMgZW1wdHkuKSIpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyoKKwkgKiBSZWFkIHRoZSBmaXJzdCByZXN0YXJ0IHBhZ2UuICBJdCB3aWxsIGJlIHBvc3NpYmx5IGluY29tcGxldGUgYW5kCisJICogd2lsbCBub3QgYmUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIGJ1dCB3ZSBvbmx5IG5lZWQgdGhlCisJICogZmlyc3QgTlRGU19CTE9DS19TSVpFIGJ5dGVzIHNvIGl0IGRvZXMgbm90IG1hdHRlci4KKwkgKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShsb2dfdmktPmlfbWFwcGluZywgMCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJFcnJvciBtYXBwaW5nICRMb2dGaWxlIHBhZ2UgKGluZGV4IDApLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJwID0gKFJFU1RBUlRfUEFHRV9IRUFERVIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmQocnAtPm1hZ2ljKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJObyByZXN0YXJ0IHBhZ2UgZm91bmQgYXQgb2Zmc2V0IHplcm8gaW4gIgorCQkJCSIkTG9nRmlsZS4gIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhhdCAiCisJCQkJInRoZSAkTG9nRmlsZSBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpc3RlbmN5ICIKKwkJCQkiY2hlY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJhID0gKFJFU1RBUlRfQVJFQSopKCh1OCopcnAgKyBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCkpOworCS8qCisJICogSWYgdGhlICRMb2dGaWxlIGhhcyBhY3RpdmUgY2xpZW50cywgaS5lLiBpdCBpcyBvcGVuLCBhbmQgd2UgZG8gbm90CisJICogaGF2ZSB0aGUgUkVTVEFSVF9WT0xVTUVfSVNfQ0xFQU4gYml0IHNldCBpbiB0aGUgcmVzdGFydCBhcmVhIGZsYWdzLAorCSAqIHdlIGFzc3VtZSB0aGVyZSB3YXMgYW4gdW5jbGVhbiBzaHV0ZG93bi4KKwkgKi8KKwlpZiAocmEtPmNsaWVudF9pbl91c2VfbGlzdCAhPSBMT0dGSUxFX05PX0NMSUVOVCAmJgorCQkJIShyYS0+ZmxhZ3MgJiBSRVNUQVJUX1ZPTFVNRV9JU19DTEVBTikpIHsKKwkJbnRmc19kZWJ1ZygiRG9uZS4gICRMb2dGaWxlIGluZGljYXRlcyBhIGRpcnR5IHNodXRkb3duLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkvKiAkTG9nRmlsZSBpbmRpY2F0ZXMgYSBjbGVhbiBzaHV0ZG93bi4gKi8KKwludGZzX2RlYnVnKCJEb25lLiAgJExvZ0ZpbGUgaW5kaWNhdGVzIGEgY2xlYW4gc2h1dGRvd24uIik7CisJcmV0dXJuIFRSVUU7CitlcnJfb3V0OgorCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogbnRmc19lbXB0eV9sb2dmaWxlIC0gZW1wdHkgdGhlIGNvbnRlbnRzIG9mIHRoZSAkTG9nRmlsZSBqb3VybmFsCisgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gZW1wdHkKKyAqCisgKiBFbXB0eSB0aGUgY29udGVudHMgb2YgdGhlICRMb2dGaWxlIGpvdXJuYWwgQGxvZ192aSBhbmQgcmV0dXJuIFRSVUUgb24KKyAqIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAkTG9nRmlsZSBqb3VybmFsIGhhcyBhbHJlYWR5IGJlZW4gY29uc2lzdGVuY3kKKyAqIGNoZWNrZWQgYnkgYSBjYWxsIHRvIG50ZnNfY2hlY2tfbG9nZmlsZSgpIGFuZCB0aGF0IG50ZnNfaXNfbG9nZmlsZV9jbGVhbigpCisgKiBoYXMgYmVlbiB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSAkTG9nRmlsZSBpcyBjbGVhbi4KKyAqLworQk9PTCBudGZzX2VtcHR5X2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobG9nX3ZpLT5pX3NiKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmICghTlZvbExvZ0ZpbGVFbXB0eSh2b2wpKSB7CisJCWludCBlcnI7CisJCQorCQllcnIgPSBudGZzX2F0dHJfc2V0KE5URlNfSShsb2dfdmkpLCAwLCBsb2dfdmktPmlfc2l6ZSwgMHhmZik7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmlsbCAkTG9nRmlsZSB3aXRoICIKKwkJCQkJIjB4ZmYgYnl0ZXMgKGVycm9yIGNvZGUgJWkpLiIsIGVycik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJLyogU2V0IHRoZSBmbGFnIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGl0IGFnYWluIG9uIHJlbW91bnQuICovCisJCU5Wb2xTZXRMb2dGaWxlRW1wdHkodm9sKTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbG9nZmlsZS5oIGIvZnMvbnRmcy9sb2dmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNDM3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbG9nZmlsZS5oCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogbG9nZmlsZS5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgam91cm5hbCAoJExvZ0ZpbGUpIGhhbmRsaW5nLiAgUGFydCBvZgorICoJICAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19MT0dGSUxFX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfTE9HRklMRV9ICisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKworLyoKKyAqIEpvdXJuYWwgKCRMb2dGaWxlKSBvcmdhbml6YXRpb246CisgKgorICogVHdvIHJlc3RhcnQgYXJlYXMgcHJlc2VudCBpbiB0aGUgZmlyc3QgdHdvIHBhZ2VzIChyZXN0YXJ0IHBhZ2VzLCBvbmUgcmVzdGFydAorICogYXJlYSBpbiBlYWNoIHBhZ2UpLiAgV2hlbiB0aGUgdm9sdW1lIGlzIGRpc21vdW50ZWQgdGhleSBzaG91bGQgYmUgaWRlbnRpY2FsLAorICogZXhjZXB0IGZvciB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5IHdoaWNoIHVzdWFsbHkgaGFzIGEgZGlmZmVyZW50IHVwZGF0ZQorICogc2VxdWVuY2UgbnVtYmVyLgorICoKKyAqIFRoZXNlIGFyZSBmb2xsb3dlZCBieSBsb2cgcmVjb3JkcyBvcmdhbml6ZWQgaW4gcGFnZXMgaGVhZGVkIGJ5IGEgbG9nIHJlY29yZAorICogaGVhZGVyIGdvaW5nIHVwIHRvIGxvZyBmaWxlIHNpemUuICBOb3QgYWxsIHBhZ2VzIGNvbnRhaW4gbG9nIHJlY29yZHMgd2hlbiBhCisgKiB2b2x1bWUgaXMgZmlyc3QgZm9ybWF0dGVkLCBidXQgYXMgdGhlIHZvbHVtZSBhZ2VzLCBhbGwgcmVjb3JkcyB3aWxsIGJlIHVzZWQuCisgKiBXaGVuIHRoZSBsb2cgZmlsZSBmaWxscyB1cCwgdGhlIHJlY29yZHMgYXQgdGhlIGJlZ2lubmluZyBhcmUgcHVyZ2VkIChieQorICogbW9kaWZ5aW5nIHRoZSBvbGRlc3RfbHNuIHRvIGEgaGlnaGVyIHZhbHVlIHByZXN1bWFibHkpIGFuZCB3cml0aW5nIGJlZ2lucworICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIEVmZmVjdGl2ZWx5LCB0aGUgbG9nIGZpbGUgaXMgdmlld2VkIGFzIGEKKyAqIGNpcmN1bGFyIGVudGl0eS4KKyAqCisgKiBOT1RFOiBXaW5kb3dzIE5ULCAyMDAwLCBhbmQgWFAgYWxsIHVzZSBsb2cgZmlsZSB2ZXJzaW9uIDEuMSBidXQgdGhleSBhY2NlcHQKKyAqIHZlcnNpb25zIDw9IDEueCwgaW5jbHVkaW5nIDAuLTEuICAoWWVzLCB0aGF0IGlzIGEgbWludXMgb25lIGluIHRoZXJlISkgIFdlCisgKiBwcm9iYWJseSBvbmx5IHdhbnQgdG8gc3VwcG9ydCAxLjEgYXMgdGhpcyBzZWVtcyB0byBiZSB0aGUgY3VycmVudCB2ZXJzaW9uCisgKiBhbmQgd2UgZG9uJ3Qga25vdyBob3cgdGhhdCBkaWZmZXJzIGZyb20gdGhlIG9sZGVyIHZlcnNpb25zLiAgVGhlIG9ubHkKKyAqIGV4Y2VwdGlvbiBpcyBpZiB0aGUgam91cm5hbCBpcyBjbGVhbiBhcyBtYXJrZWQgYnkgdGhlIHR3byByZXN0YXJ0IHBhZ2VzCisgKiB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgd2UgYXJlIG9uIGFuIGVhcmxpZXIgdmVyc2lvbi4gIFdlIGNhbiBqdXN0CisgKiByZWluaXRpYWxpemUgdGhlIGxvZ2ZpbGUgYW5kIHN0YXJ0IGFnYWluIHdpdGggdmVyc2lvbiAxLjEuCisgKi8KKworLyogU29tZSAkTG9nRmlsZSByZWxhdGVkIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgTWF4TG9nRmlsZVNpemUJCTB4MTAwMDAwMDAwVUxMCisjZGVmaW5lIERlZmF1bHRMb2dQYWdlU2l6ZQk0MDk2CisjZGVmaW5lIE1pbkxvZ1JlY29yZFBhZ2VzCTQ4CisKKy8qCisgKiBMb2cgZmlsZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIChiZWdpbnMgdGhlIHJlc3RhcnQgYXJlYSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwCU5URlNfUkVDT1JEOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UgdW5uYW1lZCBzdHJ1Y3RzLiAqLworLyogIDAqLwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBUaGUgbWFnaWMgaXMgIlJTVFIiLiAqLworLyogIDQqLwlsZTE2IHVzYV9vZnM7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBpbiBsYXlvdXQuaC4KKwkJCQkgICBXaGVuIGNyZWF0aW5nLCBzZXQgdGhpcyB0byBiZSBpbW1lZGlhdGVseQorCQkJCSAgIGFmdGVyIHRoaXMgaGVhZGVyIHN0cnVjdHVyZSAod2l0aG91dCBhbnkKKwkJCQkgICBhbGlnbm1lbnQpLiAqLworLyogIDYqLwlsZTE2IHVzYV9jb3VudDsJCS8qIFNlZSBOVEZTX1JFQ09SRCBkZWZpbml0aW9uIGluIGxheW91dC5oLiAqLworCisvKiAgOCovCWxlTFNOIGNoa2Rza19sc247CS8qIFRoZSBsYXN0IGxvZyBmaWxlIHNlcXVlbmNlIG51bWJlciBmb3VuZCBieQorCQkJCSAgIGNoa2Rzay4gIE9ubHkgdXNlZCB3aGVuIHRoZSBtYWdpYyBpcyBjaGFuZ2VkCisJCQkJICAgdG8gIkNIS0QiLiAgT3RoZXJ3aXNlIHRoaXMgaXMgemVyby4gKi8KKy8qIDE2Ki8JbGUzMiBzeXN0ZW1fcGFnZV9zaXplOwkvKiBCeXRlIHNpemUgb2Ygc3lzdGVtIHBhZ2VzIHdoZW4gdGhlIGxvZyBmaWxlCisJCQkJICAgd2FzIGNyZWF0ZWQsIGhhcyB0byBiZSA+PSA1MTIgYW5kIGEgcG93ZXIgb2YKKwkJCQkgICAyLiAgVXNlIHRoaXMgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBzaXplCisJCQkJICAgb2YgdGhlIHVzYSAodXNhX2NvdW50KSBhbmQgYWRkIGl0IHRvIHVzYV9vZnMuCisJCQkJICAgVGhlbiB2ZXJpZnkgdGhhdCB0aGUgcmVzdWx0IGlzIGxlc3MgdGhhbiB0aGUKKwkJCQkgICB2YWx1ZSBvZiB0aGUgcmVzdGFydF9hcmVhX29mZnNldC4gKi8KKy8qIDIwKi8JbGUzMiBsb2dfcGFnZV9zaXplOwkvKiBCeXRlIHNpemUgb2YgbG9nIGZpbGUgcGFnZXMsIGhhcyB0byBiZSA+PQorCQkJCSAgIDUxMiBhbmQgYSBwb3dlciBvZiAyLiAgVGhlIGRlZmF1bHQgaXMgNDA5NgorCQkJCSAgIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHN5c3RlbSBwYWdlIHNpemUgaXMKKwkJCQkgICBiZXR3ZWVuIDQwOTYgYW5kIDgxOTIuICBPdGhlcndpc2UgdGhpcyBpcworCQkJCSAgIHNldCB0byB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZSBpbnN0ZWFkLiAqLworLyogMjQqLwlsZTE2IHJlc3RhcnRfYXJlYV9vZmZzZXQ7LyogQnl0ZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBoZWFkZXIgdG8KKwkJCQkgICB0aGUgUkVTVEFSVF9BUkVBLiAgVmFsdWUgaGFzIHRvIGJlIGFsaWduZWQKKwkJCQkgICB0byA4LWJ5dGUgYm91bmRhcnkuICBXaGVuIGNyZWF0aW5nLCBzZXQgdGhpcworCQkJCSAgIHRvIGJlIGFmdGVyIHRoZSB1c2EuICovCisvKiAyNiovCXNsZTE2IG1pbm9yX3ZlcjsJLyogTG9nIGZpbGUgbWlub3IgdmVyc2lvbi4gIE9ubHkgY2hlY2sgaWYgbWFqb3IKKwkJCQkgICB2ZXJzaW9uIGlzIDEuICovCisvKiAyOCovCXNsZTE2IG1ham9yX3ZlcjsJLyogTG9nIGZpbGUgbWFqb3IgdmVyc2lvbi4gIFdlIG9ubHkgc3VwcG9ydAorCQkJCSAgIHZlcnNpb24gMS4xLiAqLworLyogc2l6ZW9mKCkgPSAzMCAoMHgxZSkgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBSRVNUQVJUX1BBR0VfSEVBREVSOworCisvKgorICogQ29uc3RhbnQgZm9yIHRoZSBsb2cgY2xpZW50IGluZGljZXMgbWVhbmluZyB0aGF0IHRoZXJlIGFyZSBubyBjbGllbnQgcmVjb3JkcworICogaW4gdGhpcyBwYXJ0aWN1bGFyIGNsaWVudCBhcnJheS4gIEFsc28gaW5zaWRlIHRoZSBjbGllbnQgcmVjb3JkcyB0aGVtc2VsdmVzLAorICogdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBjbGllbnQgcmVjb3JkcyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRoaXMgb25lLgorICovCisjZGVmaW5lIExPR0ZJTEVfTk9fQ0xJRU5UCWNvbnN0X2NwdV90b19sZTE2KDB4ZmZmZikKKyNkZWZpbmUgTE9HRklMRV9OT19DTElFTlRfQ1BVCTB4ZmZmZgorCisvKgorICogVGhlc2UgYXJlIHRoZSBzbyBmYXIga25vd24gUkVTVEFSVF9BUkVBXyogZmxhZ3MgKDE2LWJpdCkgd2hpY2ggY29udGFpbgorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZyBmaWxlIGluIHdoaWNoIHRoZXkgYXJlIHByZXNlbnQuCisgKi8KK2VudW0geworCVJFU1RBUlRfVk9MVU1FX0lTX0NMRUFOCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAyKSwKKwlSRVNUQVJUX1NQQUNFX0ZJTExFUgk9IDB4ZmZmZiwgLyogZ2NjOiBGb3JjZSBlbnVtIGJpdCB3aWR0aCB0byAxNi4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiBsZTE2IFJFU1RBUlRfQVJFQV9GTEFHUzsKKworLyoKKyAqIExvZyBmaWxlIHJlc3RhcnQgYXJlYSByZWNvcmQuICBUaGUgb2Zmc2V0IG9mIHRoaXMgcmVjb3JkIGlzIGZvdW5kIGJ5IGFkZGluZworICogdGhlIG9mZnNldCBvZiB0aGUgUkVTVEFSVF9QQUdFX0hFQURFUiB0byB0aGUgcmVzdGFydF9hcmVhX29mZnNldCB2YWx1ZSBmb3VuZAorICogaW4gaXQuICBTZWUgbm90ZXMgYXQgcmVzdGFydF9hcmVhX29mZnNldCBhYm92ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAqLwlsZUxTTiBjdXJyZW50X2xzbjsJLyogVGhlIGN1cnJlbnQsIGkuZS4gbGFzdCBMU04gaW5zaWRlIHRoZSBsb2cKKwkJCQkgICB3aGVuIHRoZSByZXN0YXJ0IGFyZWEgd2FzIGxhc3Qgd3JpdHRlbi4KKwkJCQkgICBUaGlzIGhhcHBlbnMgb2Z0ZW4gYnV0IHdoYXQgaXMgdGhlIGludGVydmFsPworCQkJCSAgIElzIGl0IGp1c3QgZml4ZWQgdGltZSBvciBpcyBpdCBldmVyeSB0aW1lIGEKKwkJCQkgICBjaGVjayBwb2ludCBpcyB3cml0dGVuIG9yIHNvbWV0aGluZSBlbHNlPworCQkJCSAgIE9uIGNyZWF0ZSBzZXQgdG8gMC4gKi8KKy8qICA4Ki8JbGUxNiBsb2dfY2xpZW50czsJLyogTnVtYmVyIG9mIGxvZyBjbGllbnQgcmVjb3JkcyBpbiB0aGUgYXJyYXkgb2YKKwkJCQkgICBsb2cgY2xpZW50IHJlY29yZHMgd2hpY2ggZm9sbG93cyB0aGlzCisJCQkJICAgcmVzdGFydCBhcmVhLiAgTXVzdCBiZSAxLiAgKi8KKy8qIDEwKi8JbGUxNiBjbGllbnRfZnJlZV9saXN0OwkvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgbG9nIGNsaWVudCByZWNvcmQKKwkJCQkgICBpbiB0aGUgYXJyYXkgb2YgbG9nIGNsaWVudCByZWNvcmRzLgorCQkJCSAgIExPR0ZJTEVfTk9fQ0xJRU5UIG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vCisJCQkJICAgZnJlZSBsb2cgY2xpZW50IHJlY29yZHMgaW4gdGhlIGFycmF5LgorCQkJCSAgIElmICE9IExPR0ZJTEVfTk9fQ0xJRU5ULCBjaGVjayB0aGF0CisJCQkJICAgbG9nX2NsaWVudHMgPiBjbGllbnRfZnJlZV9saXN0LiAgT24gV2luMmsKKwkJCQkgICBhbmQgcHJlc3VtYWJseSBlYXJsaWVyLCBvbiBhIGNsZWFuIHZvbHVtZQorCQkJCSAgIHRoaXMgaXMgIT0gTE9HRklMRV9OT19DTElFTlQsIGFuZCBpdCBzaG91bGQKKwkJCQkgICBiZSAwLCBpLmUuIHRoZSBmaXJzdCAoYW5kIG9ubHkpIGNsaWVudAorCQkJCSAgIHJlY29yZCBpcyBmcmVlIGFuZCB0aHVzIHRoZSBsb2dmaWxlIGlzCisJCQkJICAgY2xvc2VkIGFuZCBoZW5jZSBjbGVhbi4gIEEgZGlydHkgdm9sdW1lCisJCQkJICAgd291bGQgaGF2ZSBsZWZ0IHRoZSBsb2dmaWxlIG9wZW4gYW5kIGhlbmNlCisJCQkJICAgdGhpcyB3b3VsZCBiZSBMT0dGSUxFX05PX0NMSUVOVC4gIE9uIFdpblhQCisJCQkJICAgYW5kIHByZXN1bWFibHkgbGF0ZXIsIHRoZSBsb2dmaWxlIGlzIGFsd2F5cworCQkJCSAgIG9wZW4sIGV2ZW4gb24gY2xlYW4gc2h1dGRvd24gc28gdGhpcyBzaG91bGQKKwkJCQkgICBhbHdheXMgYmUgTE9HRklMRV9OT19DTElFTlQuICovCisvKiAxMiovCWxlMTYgY2xpZW50X2luX3VzZV9saXN0Oy8qIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW4tdXNlIGxvZyBjbGllbnQKKwkJCQkgICByZWNvcmQgaW4gdGhlIGFycmF5IG9mIGxvZyBjbGllbnQgcmVjb3Jkcy4KKwkJCQkgICBMT0dGSUxFX05PX0NMSUVOVCBtZWFucyB0aGF0IHRoZXJlIGFyZSBubworCQkJCSAgIGluLXVzZSBsb2cgY2xpZW50IHJlY29yZHMgaW4gdGhlIGFycmF5LiAgSWYKKwkJCQkgICAhPSBMT0dGSUxFX05PX0NMSUVOVCBjaGVjayB0aGF0IGxvZ19jbGllbnRzCisJCQkJICAgPiBjbGllbnRfaW5fdXNlX2xpc3QuICBPbiBXaW4yayBhbmQKKwkJCQkgICBwcmVzdW1hYmx5IGVhcmxpZXIsIG9uIGEgY2xlYW4gdm9sdW1lIHRoaXMKKwkJCQkgICBpcyBMT0dGSUxFX05PX0NMSUVOVCwgaS5lLiB0aGVyZSBhcmUgbm8KKwkJCQkgICBjbGllbnQgcmVjb3JkcyBpbiB1c2UgYW5kIHRodXMgdGhlIGxvZ2ZpbGUKKwkJCQkgICBpcyBjbG9zZWQgYW5kIGhlbmNlIGNsZWFuLiAgQSBkaXJ0eSB2b2x1bWUKKwkJCQkgICB3b3VsZCBoYXZlIGxlZnQgdGhlIGxvZ2ZpbGUgb3BlbiBhbmQgaGVuY2UKKwkJCQkgICB0aGlzIHdvdWxkIGJlICE9IExPR0ZJTEVfTk9fQ0xJRU5ULCBhbmQgaXQKKwkJCQkgICBzaG91bGQgYmUgMCwgaS5lLiB0aGUgZmlyc3QgKGFuZCBvbmx5KQorCQkJCSAgIGNsaWVudCByZWNvcmQgaXMgaW4gdXNlLiAgT24gV2luWFAgYW5kCisJCQkJICAgcHJlc3VtYWJseSBsYXRlciwgdGhlIGxvZ2ZpbGUgaXMgYWx3YXlzCisJCQkJICAgb3BlbiwgZXZlbiBvbiBjbGVhbiBzaHV0ZG93biBzbyB0aGlzIHNob3VsZAorCQkJCSAgIGFsd2F5cyBiZSAwLiAqLworLyogMTQqLwlSRVNUQVJUX0FSRUFfRkxBR1MgZmxhZ3M7LyogRmxhZ3MgbW9kaWZ5aW5nIExGUyBiZWhhdmlvdXIuICBPbiBXaW4yaworCQkJCSAgIGFuZCBwcmVzdW1hYmx5IGVhcmxpZXIgdGhpcyBpcyBhbHdheXMgMC4gIE9uCisJCQkJICAgV2luWFAgYW5kIHByZXN1bWFibHkgbGF0ZXIsIGlmIHRoZSBsb2dmaWxlCisJCQkJICAgd2FzIHNodXRkb3duIGNsZWFubHksIHRoZSBzZWNvbmQgYml0LAorCQkJCSAgIFJFU1RBUlRfVk9MVU1FX0lTX0NMRUFOLCBpcyBzZXQuICBUaGlzIGJpdAorCQkJCSAgIGlzIGNsZWFyZWQgd2hlbiB0aGUgdm9sdW1lIGlzIG1vdW50ZWQgYnkKKwkJCQkgICBXaW5YUCBhbmQgc2V0IHdoZW4gdGhlIHZvbHVtZSBpcyBkaXNtb3VudGVkLAorCQkJCSAgIHRodXMgaWYgdGhlIGxvZ2ZpbGUgaXMgZGlydHksIHRoaXMgYml0IGlzCisJCQkJICAgY2xlYXIuICBUaHVzIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlCisJCQkJICAgV2luZG93cyB2ZXJzaW9uIHRvIGRldGVybWluZSBpZiB0aGUgbG9nZmlsZQorCQkJCSAgIGlzIGNsZWFuLiAgSW5zdGVhZCBpZiB0aGUgbG9nZmlsZSBpcyBjbG9zZWQsCisJCQkJICAgd2Uga25vdyBpdCBtdXN0IGJlIGNsZWFuLiAgSWYgaXQgaXMgb3BlbiBhbmQKKwkJCQkgICB0aGlzIGJpdCBpcyBzZXQsIHdlIGFsc28ga25vdyBpdCBtdXN0IGJlCisJCQkJICAgY2xlYW4uICBJZiBvbiB0aGUgb3RoZXIgaGFuZCB0aGUgbG9nZmlsZSBpcworCQkJCSAgIG9wZW4gYW5kIHRoaXMgYml0IGlzIGNsZWFyLCB3ZSBjYW4gYmUgYWxtb3N0CisJCQkJICAgY2VydGFpbiB0aGF0IHRoZSBsb2dmaWxlIGlzIGRpcnR5LiAqLworLyogMTYqLwlsZTMyIHNlcV9udW1iZXJfYml0czsJLyogSG93IG1hbnkgYml0cyB0byB1c2UgZm9yIHRoZSBzZXF1ZW5jZQorCQkJCSAgIG51bWJlci4gIFRoaXMgaXMgY2FsY3VsYXRlZCBhcyA2NyAtIHRoZQorCQkJCSAgIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBsb2dmaWxlCisJCQkJICAgc2l6ZSBpbiBieXRlcyBhbmQgdGhpcyBjYW4gYmUgdXNlZCBpbiB3aXRoCisJCQkJICAgdGhlIHNwZWNpZmllZCBmaWxlX3NpemUgYXMgYSBjb25zaXN0ZW5jeQorCQkJCSAgIGNoZWNrLiAqLworLyogMjAqLwlsZTE2IHJlc3RhcnRfYXJlYV9sZW5ndGg7LyogTGVuZ3RoIG9mIHRoZSByZXN0YXJ0IGFyZWEgaW5jbHVkaW5nIHRoZQorCQkJCSAgIGNsaWVudCBhcnJheS4gIEZvbGxvd2luZyBjaGVja3MgcmVxdWlyZWQgaWYKKwkJCQkgICB2ZXJzaW9uIG1hdGNoZXMuICBPdGhlcndpc2UsIHNraXAgdGhlbS4KKwkJCQkgICByZXN0YXJ0X2FyZWFfb2Zmc2V0ICsgcmVzdGFydF9hcmVhX2xlbmd0aAorCQkJCSAgIGhhcyB0byBiZSA8PSBzeXN0ZW1fcGFnZV9zaXplLiAgQWxzbywKKwkJCQkgICByZXN0YXJ0X2FyZWFfbGVuZ3RoIGhhcyB0byBiZSA+PQorCQkJCSAgIGNsaWVudF9hcnJheV9vZmZzZXQgKyAobG9nX2NsaWVudHMgKgorCQkJCSAgIHNpemVvZihsb2cgY2xpZW50IHJlY29yZCkpLiAqLworLyogMjIqLwlsZTE2IGNsaWVudF9hcnJheV9vZmZzZXQ7LyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgcmVjb3JkIHRvCisJCQkJICAgdGhlIGZpcnN0IGxvZyBjbGllbnQgcmVjb3JkIGlmIHZlcnNpb25zIGFyZQorCQkJCSAgIG1hdGNoZWQuICBXaGVuIGNyZWF0aW5nLCBzZXQgdGhpcyB0byBiZQorCQkJCSAgIGFmdGVyIHRoaXMgcmVzdGFydCBhcmVhIHN0cnVjdHVyZSwgYWxpZ25lZAorCQkJCSAgIHRvIDgtYnl0ZXMgYm91bmRhcnkuICBJZiB0aGUgdmVyc2lvbnMgZG8gbm90CisJCQkJICAgbWF0Y2gsIHRoaXMgaXMgaWdub3JlZCBhbmQgdGhlIG9mZnNldCBpcworCQkJCSAgIGFzc3VtZWQgdG8gYmUgKHNpemVvZihSRVNUQVJUX0FSRUEpICsgNykgJgorCQkJCSAgIH43LCBpLmUuIHJvdW5kZWQgdXAgdG8gZmlyc3QgOC1ieXRlCisJCQkJICAgYm91bmRhcnkuICBFaXRoZXIgd2F5LCBjbGllbnRfYXJyYXlfb2Zmc2V0CisJCQkJICAgaGFzIHRvIGJlIGFsaWduZWQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5LgorCQkJCSAgIEFsc28sIHJlc3RhcnRfYXJlYV9vZmZzZXQgKworCQkJCSAgIGNsaWVudF9hcnJheV9vZmZzZXQgaGFzIHRvIGJlIDw9IDUxMC4KKwkJCQkgICBGaW5hbGx5LCBjbGllbnRfYXJyYXlfb2Zmc2V0ICsgKGxvZ19jbGllbnRzCisJCQkJICAgKiBzaXplb2YobG9nIGNsaWVudCByZWNvcmQpKSBoYXMgdG8gYmUgPD0KKwkJCQkgICBzeXN0ZW1fcGFnZV9zaXplLiAgT24gV2luMmsgYW5kIHByZXN1bWFibHkKKwkJCQkgICBlYXJsaWVyLCB0aGlzIGlzIDB4MzAsIGkuZS4gaW1tZWRpYXRlbHkKKwkJCQkgICBmb2xsb3dpbmcgdGhpcyByZWNvcmQuICBPbiBXaW5YUCBhbmQKKwkJCQkgICBwcmVzdW1hYmx5IGxhdGVyLCB0aGlzIGlzIDB4NDAsIGkuZS4gdGhlcmUKKwkJCQkgICBhcmUgMTYgZXh0cmEgYnl0ZXMgYmV0d2VlbiB0aGlzIHJlY29yZCBhbmQKKwkJCQkgICB0aGUgY2xpZW50IGFycmF5LiAgVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0CisJCQkJICAgdGhlIFJFU1RBUlRfQVJFQSByZWNvcmQgaXMgYWN0dWFsbHkgYmlnZ2VyCisJCQkJICAgaW4gV2luWFAgYW5kIGxhdGVyLiAqLworLyogMjQqLwlzbGU2NCBmaWxlX3NpemU7CS8qIFVzYWJsZSBieXRlIHNpemUgb2YgdGhlIGxvZyBmaWxlLiAgSWYgdGhlCisJCQkJICAgcmVzdGFydF9hcmVhX29mZnNldCArIHRoZSBvZmZzZXQgb2YgdGhlCisJCQkJICAgZmlsZV9zaXplIGFyZSA+IDUxMCB0aGVuIGNvcnJ1cHRpb24gaGFzCisJCQkJICAgb2NjdXJlZC4gIFRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2hlY2sgd2hlbgorCQkJCSAgIHN0YXJ0aW5nIHdpdGggdGhlIHJlc3RhcnRfYXJlYSBhcyBpZiBpdAorCQkJCSAgIGZhaWxzIGl0IG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgYWJvdmUgdmFsdWVzCisJCQkJICAgd2lsbCBiZSBjb3JydXB0ZWQgYnkgdGhlIG11bHRpIHNlY3RvcgorCQkJCSAgIHRyYW5zZmVyIHByb3RlY3Rpb24uICBUaGUgZmlsZV9zaXplIGhhcyB0bworCQkJCSAgIGJlIHJvdW5kZWQgZG93biB0byBiZSBhIG11bHRpcGxlIG9mIHRoZQorCQkJCSAgIGxvZ19wYWdlX3NpemUgaW4gdGhlIFJFU1RBUlRfUEFHRV9IRUFERVIgYW5kCisJCQkJICAgdGhlbiBpdCBoYXMgdG8gYmUgYXQgbGVhc3QgYmlnIGVub3VnaCB0bworCQkJCSAgIHN0b3JlIHRoZSB0d28gcmVzdGFydCBwYWdlcyBhbmQgNDggKDB4MzApCisJCQkJICAgbG9nIHJlY29yZCBwYWdlcy4gKi8KKy8qIDMyKi8JbGUzMiBsYXN0X2xzbl9kYXRhX2xlbmd0aDsvKiBMZW5ndGggb2YgZGF0YSBvZiBsYXN0IExTTiwgbm90IGluY2x1ZGluZworCQkJCSAgIHRoZSBsb2cgcmVjb3JkIGhlYWRlci4gIE9uIGNyZWF0ZSBzZXQgdG8KKwkJCQkgICAwLiAqLworLyogMzYqLwlsZTE2IGxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aDsvKiBCeXRlIHNpemUgb2YgdGhlIGxvZyByZWNvcmQgaGVhZGVyLgorCQkJCSAgIElmIHRoZSB2ZXJzaW9uIG1hdGNoZXMgdGhlbiBjaGVjayB0aGF0IHRoZQorCQkJCSAgIHZhbHVlIG9mIGxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aCBpcyBhCisJCQkJICAgbXVsdGlwbGUgb2YgOCwgaS5lLgorCQkJCSAgIChsb2dfcmVjb3JkX2hlYWRlcl9sZW5ndGggKyA3KSAmIH43ID09CisJCQkJICAgbG9nX3JlY29yZF9oZWFkZXJfbGVuZ3RoLiAgV2hlbiBjcmVhdGluZyBzZXQKKwkJCQkgICBpdCB0byBzaXplb2YoTE9HX1JFQ09SRF9IRUFERVIpLCBhbGlnbmVkIHRvCisJCQkJICAgOCBieXRlcy4gKi8KKy8qIDM4Ki8JbGUxNiBsb2dfcGFnZV9kYXRhX29mZnNldDsvKiBPZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgaW4gYSBsb2cgcmVjb3JkCisJCQkJICAgcGFnZS4gIE11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAgT24gY3JlYXRlCisJCQkJICAgc2V0IGl0IHRvIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1cGRhdGUKKwkJCQkgICBzZXF1ZW5jZSBhcnJheSBvZiB0aGUgbG9nIHJlY29yZCBwYWdlLiAqLworLyogNDAqLwlsZTMyIHJlc3RhcnRfbG9nX29wZW5fY291bnQ7LyogQSBjb3VudGVyIHRoYXQgZ2V0cyBpbmNyZW1lbnRlZCBldmVyeQorCQkJCSAgIHRpbWUgdGhlIGxvZ2ZpbGUgaXMgcmVzdGFydGVkIHdoaWNoIGhhcHBlbnMKKwkJCQkgICBhdCBtb3VudCB0aW1lIHdoZW4gdGhlIGxvZ2ZpbGUgaXMgb3BlbmVkLgorCQkJCSAgIFdoZW4gY3JlYXRpbmcgc2V0IHRvIGEgcmFuZG9tIHZhbHVlLiAgV2luMmsKKwkJCQkgICBzZXRzIGl0IHRvIHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgY3VycmVudAorCQkJCSAgIHN5c3RlbSB0aW1lIGluIE5URlMgZm9ybWF0IChzZWUgdGltZS5oKS4gKi8KKy8qIDQ0Ki8JbGUzMiByZXNlcnZlZDsJCS8qIFJlc2VydmVkL2FsaWdubWVudCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiBzaXplb2YoKSA9IDQ4ICgweDMwKSBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFJFU1RBUlRfQVJFQTsKKworLyoKKyAqIExvZyBjbGllbnQgcmVjb3JkLiAgVGhlIG9mZnNldCBvZiB0aGlzIHJlY29yZCBpcyBmb3VuZCBieSBhZGRpbmcgdGhlIG9mZnNldAorICogb2YgdGhlIFJFU1RBUlRfQVJFQSB0byB0aGUgY2xpZW50X2FycmF5X29mZnNldCB2YWx1ZSBmb3VuZCBpbiBpdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAqLwlsZUxTTiBvbGRlc3RfbHNuOwkvKiBPbGRlc3QgTFNOIG5lZWRlZCBieSB0aGlzIGNsaWVudC4gIE9uIGNyZWF0ZQorCQkJCSAgIHNldCB0byAwLiAqLworLyogIDgqLwlsZUxTTiBjbGllbnRfcmVzdGFydF9sc247LyogTFNOIGF0IHdoaWNoIHRoaXMgY2xpZW50IG5lZWRzIHRvIHJlc3RhcnQKKwkJCQkgICB0aGUgdm9sdW1lLCBpLmUuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbgorCQkJCSAgIHRoZSBsb2cgZmlsZS4gIEF0IHByZXNlbnQsIGlmIGNsZWFuIHRoaXMKKwkJCQkgICBzaG91bGQgPSBjdXJyZW50X2xzbiBpbiByZXN0YXJ0IGFyZWEgYnV0IGl0CisJCQkJICAgcHJvYmFibHkgYWxzbyA9IGN1cnJlbnRfbHNuIHdoZW4gZGlydHkgbW9zdAorCQkJCSAgIG9mIHRoZSB0aW1lLiAgQXQgY3JlYXRlIHNldCB0byAwLiAqLworLyogMTYqLwlsZTE2IHByZXZfY2xpZW50OwkvKiBUaGUgb2Zmc2V0IHRvIHRoZSBwcmV2aW91cyBsb2cgY2xpZW50IHJlY29yZAorCQkJCSAgIGluIHRoZSBhcnJheSBvZiBsb2cgY2xpZW50IHJlY29yZHMuCisJCQkJICAgTE9HRklMRV9OT19DTElFTlQgbWVhbnMgdGhlcmUgaXMgbm8gcHJldmlvdXMKKwkJCQkgICBjbGllbnQgcmVjb3JkLCBpLmUuIHRoaXMgaXMgdGhlIGZpcnN0IG9uZS4KKwkJCQkgICBUaGlzIGlzIGFsd2F5cyBMT0dGSUxFX05PX0NMSUVOVC4gKi8KKy8qIDE4Ki8JbGUxNiBuZXh0X2NsaWVudDsJLyogVGhlIG9mZnNldCB0byB0aGUgbmV4dCBsb2cgY2xpZW50IHJlY29yZCBpbgorCQkJCSAgIHRoZSBhcnJheSBvZiBsb2cgY2xpZW50IHJlY29yZHMuCisJCQkJICAgTE9HRklMRV9OT19DTElFTlQgbWVhbnMgdGhlcmUgYXJlIG5vIG5leHQKKwkJCQkgICBjbGllbnQgcmVjb3JkcywgaS5lLiB0aGlzIGlzIHRoZSBsYXN0IG9uZS4KKwkJCQkgICBUaGlzIGlzIGFsd2F5cyBMT0dGSUxFX05PX0NMSUVOVC4gKi8KKy8qIDIwKi8JbGUxNiBzZXFfbnVtYmVyOwkvKiBPbiBXaW4yayBhbmQgcHJlc3VtYWJseSBlYXJsaWVyLCB0aGlzIGlzIHNldAorCQkJCSAgIHRvIHplcm8gZXZlcnkgdGltZSB0aGUgbG9nZmlsZSBpcyByZXN0YXJ0ZWQKKwkJCQkgICBhbmQgaXQgaXMgaW5jcmVtZW50ZWQgd2hlbiB0aGUgbG9nZmlsZSBpcworCQkJCSAgIGNsb3NlZCBhdCBkaXNtb3VudCB0aW1lLiAgVGh1cyBpdCBpcyAwIHdoZW4KKwkJCQkgICBkaXJ0eSBhbmQgMSB3aGVuIGNsZWFuLiAgT24gV2luWFAgYW5kCisJCQkJICAgcHJlc3VtYWJseSBsYXRlciwgdGhpcyBpcyBhbHdheXMgMC4gKi8KKy8qIDIyKi8JdTggcmVzZXJ2ZWRbNl07CQkvKiBSZXNlcnZlZC9hbGlnbm1lbnQuICovCisvKiAyOCovCWxlMzIgY2xpZW50X25hbWVfbGVuZ3RoOy8qIExlbmd0aCBvZiBjbGllbnQgbmFtZSBpbiBieXRlcy4gIFNob3VsZAorCQkJCSAgIGFsd2F5cyBiZSA4LiAqLworLyogMzIqLwludGZzY2hhciBjbGllbnRfbmFtZVs2NF07LyogTmFtZSBvZiB0aGUgY2xpZW50IGluIFVuaWNvZGUuICBTaG91bGQKKwkJCQkgICBhbHdheXMgYmUgIk5URlMiIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcworCQkJCSAgIHNldCB0byAwLiAqLworLyogc2l6ZW9mKCkgPSAxNjAgKDB4YTApIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgTE9HX0NMSUVOVF9SRUNPUkQ7CisKK2V4dGVybiBCT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CisKK2V4dGVybiBCT09MIG50ZnNfaXNfbG9nZmlsZV9jbGVhbihzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CisKK2V4dGVybiBCT09MIG50ZnNfZW1wdHlfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19MT0dGSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWFsbG9jLmggYi9mcy9udGZzL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzU5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL21hbGxvYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBtYWxsb2MuaCAtIE5URlMga2VybmVsIG1lbW9yeSBoYW5kbGluZy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfTUFMTE9DX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfTUFMTE9DX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKioKKyAqIG50ZnNfbWFsbG9jX25vZnMgLSBhbGxvY2F0ZSBtZW1vcnkgaW4gbXVsdGlwbGVzIG9mIHBhZ2VzCisgKiBAc2l6ZQludW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqCisgKiBBbGxvY2F0ZXMgQHNpemUgYnl0ZXMgb2YgbWVtb3J5LCByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiBQQUdFX1NJWkUgYW5kCisgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBJZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCwgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbnRmc19tYWxsb2Nfbm9mcyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKGxpa2VseShzaXplIDw9IFBBR0VfU0laRSkpIHsKKwkJQlVHX09OKCFzaXplKTsKKwkJLyoga21hbGxvYygpIGhhcyBwZXItQ1BVIGNhY2hlcyBzbyBpcyBmYXN0ZXIgZm9yIG5vdy4gKi8KKwkJcmV0dXJuIGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfTk9GUyk7CisJCS8qIHJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0pOyAqLworCX0KKwlpZiAobGlrZWx5KHNpemUgPj4gUEFHRV9TSElGVCA8IG51bV9waHlzcGFnZXMpKQorCQlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9OT0ZTIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUwpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19mcmVlKHZvaWQgKmFkZHIpCit7CisJaWYgKGxpa2VseSgoKHVuc2lnbmVkIGxvbmcpYWRkciA8IFZNQUxMT0NfU1RBUlQpIHx8CisJCQkoKHVuc2lnbmVkIGxvbmcpYWRkciA+PSBWTUFMTE9DX0VORCApKSkgeworCQlrZnJlZShhZGRyKTsKKwkJLyogZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOyAqLworCQlyZXR1cm47CisJfQorCXZmcmVlKGFkZHIpOworfQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWZ0LmMgYi9mcy9udGZzL21mdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTg1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL21mdC5jCkBAIC0wLDAgKzEsMjgyOSBAQAorLyoqCisgKiBtZnQuYyAtIE5URlMga2VybmVsIG1mdCByZWNvcmQgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAibGNuYWxsb2MuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbWFwX21mdF9yZWNvcmRfcGFnZSAtIG1hcCB0aGUgcGFnZSBpbiB3aGljaCBhIHNwZWNpZmljIG1mdCByZWNvcmQgcmVzaWRlcworICogQG5pOgkJbnRmcyBpbm9kZSB3aG9zZSBtZnQgcmVjb3JkIHBhZ2UgdG8gbWFwCisgKgorICogVGhpcyBtYXBzIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBudGZzIGlub2RlIEBuaSBpcyBzaXR1YXRlZAorICogYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZnQgcmVjb3JkIHdpdGhpbiB0aGUgbWFwcGVkIHBhZ2UuCisgKgorICogUmV0dXJuIHZhbHVlIG5lZWRzIHRvIGJlIGNoZWNrZWQgd2l0aCBJU19FUlIoKSBhbmQgaWYgdGhhdCBpcyB0cnVlIFBUUl9FUlIoKQorICogY29udGFpbnMgdGhlIG5lZ2F0aXZlIGVycm9yIGNvZGUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgTUZUX1JFQ09SRCAqbWFwX21mdF9yZWNvcmRfcGFnZShudGZzX2lub2RlICpuaSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwlzdHJ1Y3QgaW5vZGUgKm1mdF92aSA9IHZvbC0+bWZ0X2lubzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBvZnMsIGVuZF9pbmRleDsKKworCUJVR19PTihuaS0+cGFnZSk7CisJLyoKKwkgKiBUaGUgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgY2FjaGUKKwkgKiBwYWdlIG9mIHRoZSB3YW50ZWQgbWZ0IHJlY29yZC4gRklYTUU6IFdlIG5lZWQgdG8gY2hlY2sgZm9yCisJICogb3ZlcmZsb3dpbmcgdGhlIHVuc2lnbmVkIGxvbmcsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHdvdWxkIGV2ZXIgZ2V0CisJICogaGVyZSBpZiB0aGUgdm9sdW1lIHdhcyB0aGF0IGJpZy4uLgorCSAqLworCWluZGV4ID0gbmktPm1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2ZzID0gKG5pLT5tZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJLyogVGhlIG1heGltdW0gdmFsaWQgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVCdzIGRhdGEuICovCisJZW5kX2luZGV4ID0gbWZ0X3ZpLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIElmIHRoZSB3YW50ZWQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyB0aGUgbWZ0IHJlY29yZCBkb2Vzbid0IGV4aXN0LiAqLworCWlmICh1bmxpa2VseShpbmRleCA+PSBlbmRfaW5kZXgpKSB7CisJCWlmIChpbmRleCA+IGVuZF9pbmRleCB8fCAobWZ0X3ZpLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSA8CisJCQkJb2ZzICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJCXBhZ2UgPSBFUlJfUFRSKC1FTk9FTlQpOworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0ZW10IHRvIHJlYWQgbWZ0IHJlY29yZCAweCVseCwgIgorCQkJCQkid2hpY2ggaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG1mdC4gICIKKwkJCQkJIlRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlIG50ZnMgIgorCQkJCQkiZHJpdmVyLiIsIG5pLT5tZnRfbm8pOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCS8qIFJlYWQsIG1hcCwgYW5kIHBpbiB0aGUgcGFnZS4gKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShtZnRfdmktPmlfbWFwcGluZywgaW5kZXgpOworCWlmIChsaWtlbHkoIUlTX0VSUihwYWdlKSkpIHsKKwkJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwkJaWYgKGxpa2VseShudGZzX2lzX21mdF9yZWNvcmRwKChsZTMyKikocGFnZV9hZGRyZXNzKHBhZ2UpICsKKwkJCQlvZnMpKSkpIHsKKwkJCW5pLT5wYWdlID0gcGFnZTsKKwkJCW5pLT5wYWdlX29mcyA9IG9mczsKKwkJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZnM7CisJCX0KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWZ0IHJlY29yZCAweCVseCBpcyBjb3JydXB0LiAgIgorCQkJCSJSdW4gY2hrZHNrLiIsIG5pLT5tZnRfbm8pOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXBhZ2UgPSBFUlJfUFRSKC1FSU8pOworCX0KK2Vycl9vdXQ6CisJbmktPnBhZ2UgPSBOVUxMOworCW5pLT5wYWdlX29mcyA9IDA7CisJcmV0dXJuICh2b2lkKilwYWdlOworfQorCisvKioKKyAqIG1hcF9tZnRfcmVjb3JkIC0gbWFwLCBwaW4gYW5kIGxvY2sgYW4gbWZ0IHJlY29yZAorICogQG5pOgkJbnRmcyBpbm9kZSB3aG9zZSBNRlQgcmVjb3JkIHRvIG1hcAorICoKKyAqIEZpcnN0LCB0YWtlIHRoZSBtcmVjX2xvY2sgc2VtYXBob3JlLiBXZSBtaWdodCBub3cgYmUgc2xlZXBpbmcsIHdoaWxlIHdhaXRpbmcKKyAqIGZvciB0aGUgc2VtYXBob3JlIGlmIGl0IHdhcyBhbHJlYWR5IGxvY2tlZCBieSBzb21lb25lIGVsc2UuCisgKgorICogVGhlIHBhZ2Ugb2YgdGhlIHJlY29yZCBpcyBtYXBwZWQgdXNpbmcgbWFwX21mdF9yZWNvcmRfcGFnZSgpIGJlZm9yZSBiZWluZworICogcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBUaGlzIGluIHR1cm4gdXNlcyBudGZzX21hcF9wYWdlKCkgdG8gZ2V0IHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIHdhbnRlZCBtZnQKKyAqIHJlY29yZCAoaXQgaW4gdHVybiBjYWxscyByZWFkX2NhY2hlX3BhZ2UoKSB3aGljaCByZWFkcyBpdCBpbiBmcm9tIGRpc2sgaWYKKyAqIG5lY2Vzc2FyeSwgaW5jcmVtZW50cyB0aGUgdXNlIGNvdW50IG9uIHRoZSBwYWdlIHNvIHRoYXQgaXQgY2Fubm90IGRpc2FwcGVhcgorICogdW5kZXIgdXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgY2FjaGUgcGFnZSkuCisgKgorICogSWYgcmVhZF9jYWNoZV9wYWdlKCkgaW52b2tlcyBudGZzX3JlYWRwYWdlKCkgdG8gbG9hZCB0aGUgcGFnZSBmcm9tIGRpc2ssIGl0CisgKiBzZXRzIFBHX2xvY2tlZCBhbmQgY2xlYXJzIFBHX3VwdG9kYXRlIG9uIHRoZSBwYWdlLiBPbmNlIEkvTyBoYXMgY29tcGxldGVkCisgKiBhbmQgdGhlIHBvc3QtcmVhZCBtc3QgZml4dXBzIG9uIGVhY2ggbWZ0IHJlY29yZCBpbiB0aGUgcGFnZSBoYXZlIGJlZW4KKyAqIHBlcmZvcm1lZCwgdGhlIHBhZ2UgZ2V0cyBQR191cHRvZGF0ZSBzZXQgYW5kIFBHX2xvY2tlZCBjbGVhcmVkICh0aGlzIGlzIGRvbmUKKyAqIGluIG91ciBhc3luY2hyb25vdXMgSS9PIGNvbXBsZXRpb24gaGFuZGxlciBlbmRfYnVmZmVyX3JlYWRfbWZ0X2FzeW5jKCkpLgorICogbnRmc19tYXBfcGFnZSgpIHdhaXRzIGZvciBQR19sb2NrZWQgdG8gYmVjb21lIGNsZWFyIGFuZCBjaGVja3MgaWYKKyAqIFBHX3VwdG9kYXRlIGlzIHNldCBhbmQgcmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIG5vdC4gVGhpcyBwcm92aWRlcworICogc3VmZmljaWVudCBwcm90ZWN0aW9uIGFnYWluc3QgcmFjZXMgd2hlbiByZWFkaW5nL3VzaW5nIHRoZSBwYWdlLgorICoKKyAqIEhvd2V2ZXIgdGhlcmUgaXMgdGhlIHdyaXRlIG1hcHBpbmcgdG8gdGhpbmsgYWJvdXQuIERvaW5nIHRoZSBhYm92ZSBkZXNjcmliZWQKKyAqIGNoZWNraW5nIGhlcmUgd2lsbCBiZSBmaW5lLCBiZWNhdXNlIHdoZW4gaW5pdGlhdGluZyB0aGUgd3JpdGUgd2Ugd2lsbCBzZXQKKyAqIFBHX2xvY2tlZCBhbmQgY2xlYXIgUEdfdXB0b2RhdGUgbWFraW5nIHN1cmUgbm9ib2R5IGlzIHRvdWNoaW5nIHRoZSBwYWdlCisgKiBjb250ZW50cy4gRG9pbmcgdGhlIGxvY2tpbmcgdGhpcyB3YXkgbWVhbnMgdGhhdCB0aGUgY29tbWl0IHRvIGRpc2sgY29kZSBpbgorICogdGhlIHBhZ2UgY2FjaGUgY29kZSBwYXRocyBpcyBhdXRvbWF0aWNhbGx5IHN1ZmZpY2llbnRseSBsb2NrZWQgd2l0aCB1cyBhcworICogd2Ugd2lsbCBub3QgdG91Y2ggYSBwYWdlIHRoYXQgaGFzIGJlZW4gbG9ja2VkIG9yIGlzIG5vdCB1cHRvZGF0ZS4gVGhlIG9ubHkKKyAqIGxvY2tpbmcgcHJvYmxlbSB0aGVuIGlzIHRoZW0gbG9ja2luZyB0aGUgcGFnZSB3aGlsZSB3ZSBhcmUgYWNjZXNzaW5nIGl0LgorICoKKyAqIFNvIHRoYXQgY29kZSB3aWxsIGVuZCB1cCBoYXZpbmcgdG8gb3duIHRoZSBtcmVjX2xvY2sgb2YgYWxsIG1mdAorICogcmVjb3Jkcy9pbm9kZXMgcHJlc2VudCBpbiB0aGUgcGFnZSBiZWZvcmUgSS9PIGNhbiBwcm9jZWVkLiBJbiB0aGF0IGNhc2Ugd2UKKyAqIHdvdWxkbid0IG5lZWQgdG8gYm90aGVyIHdpdGggUEdfbG9ja2VkIGFuZCBQR191cHRvZGF0ZSBhcyBub2JvZHkgd2lsbCBiZQorICogYWNjZXNzaW5nIGFueXRoaW5nIHdpdGhvdXQgb3duaW5nIHRoZSBtcmVjX2xvY2sgc2VtYXBob3JlLiBCdXQgd2UgZG8gbmVlZAorICogdG8gdXNlIHRoZW0gYmVjYXVzZSBvZiB0aGUgcmVhZF9jYWNoZV9wYWdlKCkgaW52b2NhdGlvbiBhbmQgdGhlIGNvZGUgYmVjb21lcworICogc28gbXVjaCBzaW1wbGVyIHRoaXMgd2F5IHRoYXQgaXQgaXMgd2VsbCB3b3J0aCBpdC4KKyAqCisgKiBUaGUgbWZ0IHJlY29yZCBpcyBub3cgb3VycyBhbmQgd2UgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gWW91IG5lZWQgdG8gY2hlY2sKKyAqIHRoZSByZXR1cm5lZCBwb2ludGVyIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRoYXQgaXMgdHJ1ZSwgUFRSX0VSUigpIHdpbGwgcmV0dXJuCisgKiB0aGUgZXJyb3IgY29kZS4KKyAqCisgKiBOT1RFOiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdGhlIG1mdCByZWNvcmQgZGlydHkgYmVmb3JlIGNhbGxpbmcKKyAqIHVubWFwX21mdF9yZWNvcmQoKS4gVGhpcyBpcyBvYnZpb3VzbHkgb25seSBuZWNlc3NhcnkgaWYgdGhlIGNhbGxlciByZWFsbHkKKyAqIG1vZGlmaWVkIHRoZSBtZnQgcmVjb3JkLi4uCisgKiBROiBEbyB3ZSB3YW50IHRvIHJlY3ljbGUgb25lIG9mIHRoZSBWRlMgaW5vZGUgc3RhdGUgYml0cyBpbnN0ZWFkPworICogQTogTm8sIHRoZSBpbm9kZSBvbmVzIG1lYW4gd2Ugd2FudCB0byBjaGFuZ2UgdGhlIG1mdCByZWNvcmQsIG5vdCB3ZSB3YW50IHRvCisgKiB3cml0ZSBpdCBvdXQuCisgKi8KK01GVF9SRUNPUkQgKm1hcF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKm5pKQoreworCU1GVF9SRUNPUkQgKm07CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgbWZ0X25vIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCisJLyogTWFrZSBzdXJlIHRoZSBudGZzIGlub2RlIGRvZXNuJ3QgZ28gYXdheS4gKi8KKwlhdG9taWNfaW5jKCZuaS0+Y291bnQpOworCisJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGlzIG1mdCByZWNvcmQuICovCisJZG93bigmbmktPm1yZWNfbG9jayk7CisKKwltID0gbWFwX21mdF9yZWNvcmRfcGFnZShuaSk7CisJaWYgKGxpa2VseSghSVNfRVJSKG0pKSkKKwkJcmV0dXJuIG07CisKKwl1cCgmbmktPm1yZWNfbG9jayk7CisJYXRvbWljX2RlYygmbmktPmNvdW50KTsKKwludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlbHUuIiwgLVBUUl9FUlIobSkpOworCXJldHVybiBtOworfQorCisvKioKKyAqIHVubWFwX21mdF9yZWNvcmRfcGFnZSAtIHVubWFwIHRoZSBwYWdlIGluIHdoaWNoIGEgc3BlY2lmaWMgbWZ0IHJlY29yZCByZXNpZGVzCisgKiBAbmk6CQludGZzIGlub2RlIHdob3NlIG1mdCByZWNvcmQgcGFnZSB0byB1bm1hcAorICoKKyAqIFRoaXMgdW5tYXBzIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBudGZzIGlub2RlIEBuaSBpcworICogc2l0dWF0ZWQgYW5kIHJldHVybnMuIFRoaXMgaXMgYSBOT09QIGlmIGhpZ2htZW0gaXMgbm90IGNvbmZpZ3VyZWQuCisgKgorICogVGhlIHVubWFwIGhhcHBlbnMgdmlhIG50ZnNfdW5tYXBfcGFnZSgpIHdoaWNoIGluIHR1cm4gZGVjcmVtZW50cyB0aGUgdXNlCisgKiBjb3VudCBvbiB0aGUgcGFnZSB0aHVzIHJlbGVhc2luZyBpdCBmcm9tIHRoZSBwaW5uZWQgc3RhdGUuCisgKgorICogV2UgZG8gbm90IGFjdHVhbGx5IHVubWFwIHRoZSBwYWdlIGZyb20gbWVtb3J5IG9mIGNvdXJzZSwgYXMgdGhhdCB3aWxsIGJlCisgKiBkb25lIGJ5IHRoZSBwYWdlIGNhY2hlIGNvZGUgaXRzZWxmIHdoZW4gbWVtb3J5IHByZXNzdXJlIGluY3JlYXNlcyBvcgorICogd2hhdGV2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9tZnRfcmVjb3JkX3BhZ2UobnRmc19pbm9kZSAqbmkpCit7CisJQlVHX09OKCFuaS0+cGFnZSk7CisKKwkvLyBUT0RPOiBJZiBkaXJ0eSwgYmxhaC4uLgorCW50ZnNfdW5tYXBfcGFnZShuaS0+cGFnZSk7CisJbmktPnBhZ2UgPSBOVUxMOworCW5pLT5wYWdlX29mcyA9IDA7CisJcmV0dXJuOworfQorCisvKioKKyAqIHVubWFwX21mdF9yZWNvcmQgLSByZWxlYXNlIGEgbWFwcGVkIG1mdCByZWNvcmQKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2hvc2UgTUZUIHJlY29yZCB0byB1bm1hcAorICoKKyAqIFdlIHJlbGVhc2UgdGhlIHBhZ2UgbWFwcGluZyBhbmQgdGhlIG1yZWNfbG9jayBtdXRleCB3aGljaCB1bm1hcHMgdGhlIG1mdAorICogcmVjb3JkIGFuZCByZWxlYXNlcyBpdCBmb3Igb3RoZXJzIHRvIGdldCBob2xkIG9mLiBXZSBhbHNvIHJlbGVhc2UgdGhlIG50ZnMKKyAqIGlub2RlIGJ5IGRlY3JlbWVudGluZyB0aGUgbnRmcyBpbm9kZSByZWZlcmVuY2UgY291bnQuCisgKgorICogTk9URTogSWYgY2FsbGVyIGhhcyBtb2RpZmllZCB0aGUgbWZ0IHJlY29yZCwgaXQgaXMgaW1wZXJhdGl2ZSB0byBzZXQgdGhlIG1mdAorICogcmVjb3JkIGRpcnR5IEJFRk9SRSBjYWxsaW5nIHVubWFwX21mdF9yZWNvcmQoKS4KKyAqLwordm9pZCB1bm1hcF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKm5pKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gbmktPnBhZ2U7CisKKwlCVUdfT04oIXBhZ2UpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIG1mdF9ubyAweCVseC4iLCBuaS0+bWZ0X25vKTsKKworCXVubWFwX21mdF9yZWNvcmRfcGFnZShuaSk7CisJdXAoJm5pLT5tcmVjX2xvY2spOworCWF0b21pY19kZWMoJm5pLT5jb3VudCk7CisJLyoKKwkgKiBJZiBwdXJlIG50ZnNfaW5vZGUsIGkuZS4gbm8gdmZzIGlub2RlIGF0dGFjaGVkLCB3ZSBsZWF2ZSBpdCB0bworCSAqIG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKCkgaW4gdGhlIGV4dGVudCBpbm9kZSBjYXNlLCBhbmQgdG8gdGhlCisJICogY2FsbGVyIGluIHRoZSBub24tZXh0ZW50LCB5ZXQgcHVyZSBudGZzIGlub2RlIGNhc2UsIHRvIGRvIHRoZSBhY3R1YWwKKwkgKiB0ZWFyIGRvd24gb2YgYWxsIHN0cnVjdHVyZXMgYW5kIGZyZWVpbmcgb2YgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCisJICovCisJcmV0dXJuOworfQorCisvKioKKyAqIG1hcF9leHRlbnRfbWZ0X3JlY29yZCAtIGxvYWQgYW4gZXh0ZW50IGlub2RlIGFuZCBhdHRhY2ggaXQgdG8gaXRzIGJhc2UKKyAqIEBiYXNlX25pOgliYXNlIG50ZnMgaW5vZGUKKyAqIEBtcmVmOgltZnQgcmVmZXJlbmNlIG9mIHRoZSBleHRlbnQgaW5vZGUgdG8gbG9hZAorICogQG50ZnNfaW5vOglvbiBzdWNjZXNzZnVsIHJldHVybiwgcG9pbnRlciB0byB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUKKyAqCisgKiBMb2FkIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBAbXJlZiBhbmQgYXR0YWNoIGl0IHRvIGl0cyBiYXNlIGlub2RlIEBiYXNlX25pLgorICogUmV0dXJuIHRoZSBtYXBwZWQgZXh0ZW50IG1mdCByZWNvcmQgaWYgSVNfRVJSKHJlc3VsdCkgaXMgZmFsc2UuICBPdGhlcndpc2UKKyAqIFBUUl9FUlIocmVzdWx0KSBnaXZlcyB0aGUgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqCisgKiBPbiBzdWNjZXNzZnVsIHJldHVybiwgQG50ZnNfaW5vIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbnRmc19pbm9kZQorICogc3RydWN0dXJlIG9mIHRoZSBtYXBwZWQgZXh0ZW50IGlub2RlLgorICovCitNRlRfUkVDT1JEICptYXBfZXh0ZW50X21mdF9yZWNvcmQobnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFRiBtcmVmLAorCQludGZzX2lub2RlICoqbnRmc19pbm8pCit7CisJTUZUX1JFQ09SRCAqbTsKKwludGZzX2lub2RlICpuaSA9IE5VTEw7CisJbnRmc19pbm9kZSAqKmV4dGVudF9uaXMgPSBOVUxMOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbWZ0X25vID0gTVJFRihtcmVmKTsKKwl1MTYgc2VxX25vID0gTVNFUU5PKG1yZWYpOworCUJPT0wgZGVzdHJveV9uaSA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiTWFwcGluZyBleHRlbnQgbWZ0IHJlY29yZCAweCVseCAoYmFzZSBtZnQgcmVjb3JkIDB4JWx4KS4iLAorCQkJbWZ0X25vLCBiYXNlX25pLT5tZnRfbm8pOworCS8qIE1ha2Ugc3VyZSB0aGUgYmFzZSBudGZzIGlub2RlIGRvZXNuJ3QgZ28gYXdheS4gKi8KKwlhdG9taWNfaW5jKCZiYXNlX25pLT5jb3VudCk7CisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIGV4dGVudCBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBiYXNlIGlub2RlLAorCSAqIGluIHdoaWNoIGNhc2UganVzdCByZXR1cm4gaXQuIElmIG5vdCBmb3VuZCwgYWRkIGl0IHRvIHRoZSBiYXNlCisJICogaW5vZGUgYmVmb3JlIHJldHVybmluZyBpdC4KKwkgKi8KKwlkb3duKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJaWYgKGJhc2VfbmktPm5yX2V4dGVudHMgPiAwKSB7CisJCWV4dGVudF9uaXMgPSBiYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vczsKKwkJZm9yIChpID0gMDsgaSA8IGJhc2VfbmktPm5yX2V4dGVudHM7IGkrKykgeworCQkJaWYgKG1mdF9ubyAhPSBleHRlbnRfbmlzW2ldLT5tZnRfbm8pCisJCQkJY29udGludWU7CisJCQluaSA9IGV4dGVudF9uaXNbaV07CisJCQkvKiBNYWtlIHN1cmUgdGhlIG50ZnMgaW5vZGUgZG9lc24ndCBnbyBhd2F5LiAqLworCQkJYXRvbWljX2luYygmbmktPmNvdW50KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChsaWtlbHkobmkgIT0gTlVMTCkpIHsKKwkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCQkvKiBXZSBmb3VuZCB0aGUgcmVjb3JkOyBqdXN0IGhhdmUgdG8gbWFwIGFuZCByZXR1cm4gaXQuICovCisJCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJCS8qIG1hcF9tZnRfcmVjb3JkKCkgaGFzIGluY3JlbWVudGVkIHRoaXMgb24gc3VjY2Vzcy4gKi8KKwkJYXRvbWljX2RlYygmbmktPmNvdW50KTsKKwkJaWYgKGxpa2VseSghSVNfRVJSKG0pKSkgeworCQkJLyogVmVyaWZ5IHRoZSBzZXF1ZW5jZSBudW1iZXIuICovCisJCQlpZiAobGlrZWx5KGxlMTZfdG9fY3B1KG0tPnNlcXVlbmNlX251bWJlcikgPT0gc2VxX25vKSkgeworCQkJCW50ZnNfZGVidWcoIkRvbmUgMS4iKTsKKwkJCQkqbnRmc19pbm8gPSBuaTsKKwkJCQlyZXR1cm4gbTsKKwkJCX0KKwkJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQkJbnRmc19lcnJvcihiYXNlX25pLT52b2wtPnNiLCAiRm91bmQgc3RhbGUgZXh0ZW50IG1mdCAiCisJCQkJCSJyZWZlcmVuY2UhIENvcnJ1cHQgZmlsZSBzeXN0ZW0uICIKKwkJCQkJIlJ1biBjaGtkc2suIik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJfQorbWFwX2Vycl9vdXQ6CisJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgZXh0ZW50ICIKKwkJCQkibWZ0IHJlY29yZCwgZXJyb3IgY29kZSAlbGQuIiwgLVBUUl9FUlIobSkpOworCQlyZXR1cm4gbTsKKwl9CisJLyogUmVjb3JkIHdhc24ndCB0aGVyZS4gR2V0IGEgbmV3IG50ZnMgaW5vZGUgYW5kIGluaXRpYWxpemUgaXQuICovCisJbmkgPSBudGZzX25ld19leHRlbnRfaW5vZGUoYmFzZV9uaS0+dm9sLT5zYiwgbWZ0X25vKTsKKwlpZiAodW5saWtlbHkoIW5pKSkgeworCQl1cCgmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCQlhdG9taWNfZGVjKCZiYXNlX25pLT5jb3VudCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwluaS0+dm9sID0gYmFzZV9uaS0+dm9sOworCW5pLT5zZXFfbm8gPSBzZXFfbm87CisJbmktPm5yX2V4dGVudHMgPSAtMTsKKwluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBiYXNlX25pOworCS8qIE5vdyBtYXAgdGhlIHJlY29yZC4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCQludGZzX2NsZWFyX2V4dGVudF9pbm9kZShuaSk7CisJCWdvdG8gbWFwX2Vycl9vdXQ7CisJfQorCS8qIFZlcmlmeSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnQuICovCisJaWYgKHNlcV9ubyAmJiAobGUxNl90b19jcHUobS0+c2VxdWVuY2VfbnVtYmVyKSAhPSBzZXFfbm8pKSB7CisJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZvdW5kIHN0YWxlIGV4dGVudCBtZnQgIgorCQkJCSJyZWZlcmVuY2UhIENvcnJ1cHQgZmlsZSBzeXN0ZW0uIFJ1biBjaGtkc2suIik7CisJCWRlc3Ryb3lfbmkgPSBUUlVFOworCQltID0gRVJSX1BUUigtRUlPKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQXR0YWNoIGV4dGVudCBpbm9kZSB0byBiYXNlIGlub2RlLCByZWFsbG9jYXRpbmcgbWVtb3J5IGlmIG5lZWRlZC4gKi8KKwlpZiAoIShiYXNlX25pLT5ucl9leHRlbnRzICYgMykpIHsKKwkJbnRmc19pbm9kZSAqKnRtcDsKKwkJaW50IG5ld19zaXplID0gKGJhc2VfbmktPm5yX2V4dGVudHMgKyA0KSAqIHNpemVvZihudGZzX2lub2RlICopOworCisJCXRtcCA9IChudGZzX2lub2RlICoqKWttYWxsb2MobmV3X3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKHVubGlrZWx5KCF0bXApKSB7CisJCQludGZzX2Vycm9yKGJhc2VfbmktPnZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgIgorCQkJCQkiaW50ZXJuYWwgYnVmZmVyLiIpOworCQkJZGVzdHJveV9uaSA9IFRSVUU7CisJCQltID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGJhc2VfbmktPm5yX2V4dGVudHMpIHsKKwkJCUJVR19PTighYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MpOworCQkJbWVtY3B5KHRtcCwgYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MsIG5ld19zaXplIC0KKwkJCQkJNCAqIHNpemVvZihudGZzX2lub2RlICopKTsKKwkJCWtmcmVlKGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwkJfQorCQliYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcyA9IHRtcDsKKwl9CisJYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3NbYmFzZV9uaS0+bnJfZXh0ZW50cysrXSA9IG5pOworCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCW50ZnNfZGVidWcoIkRvbmUgMi4iKTsKKwkqbnRmc19pbm8gPSBuaTsKKwlyZXR1cm4gbTsKK3VubV9lcnJfb3V0OgorCXVubWFwX21mdF9yZWNvcmQobmkpOworCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCS8qCisJICogSWYgdGhlIGV4dGVudCBpbm9kZSB3YXMgbm90IGF0dGFjaGVkIHRvIHRoZSBiYXNlIGlub2RlIHdlIG5lZWQgdG8KKwkgKiByZWxlYXNlIGl0IG9yIHdlIHdpbGwgbGVhayBtZW1vcnkuCisJICovCisJaWYgKGRlc3Ryb3lfbmkpCisJCW50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKG5pKTsKKwlyZXR1cm4gbTsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBfX21hcmtfbWZ0X3JlY29yZF9kaXJ0eSAtIHNldCB0aGUgbWZ0IHJlY29yZCBhbmQgdGhlIHBhZ2UgY29udGFpbmluZyBpdCBkaXJ0eQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBtYXBwZWQgbWZ0IHJlY29yZAorICoKKyAqIEludGVybmFsIGZ1bmN0aW9uLiAgVXNlcnMgc2hvdWxkIGNhbGwgbWFya19tZnRfcmVjb3JkX2RpcnR5KCkgaW5zdGVhZC4KKyAqCisgKiBTZXQgdGhlIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIG9mIHRoZSAoYmFzZSBvciBleHRlbnQpIG50ZnMgaW5vZGUgQG5pLAorICogYXMgd2VsbCBhcyB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkLCBkaXJ0eS4gIEFsc28sIG1hcmsgdGhlIGJhc2UKKyAqIHZmcyBpbm9kZSBkaXJ0eS4gIFRoaXMgZW5zdXJlcyB0aGF0IGFueSBjaGFuZ2VzIHRvIHRoZSBtZnQgcmVjb3JkIGFyZQorICogd3JpdHRlbiBvdXQgdG8gZGlzay4KKyAqCisgKiBOT1RFOiAgV2Ugb25seSBzZXQgSV9ESVJUWV9TWU5DIGFuZCBJX0RJUlRZX0RBVEFTWU5DIChhbmQgbm90IElfRElSVFlfUEFHRVMpCisgKiBvbiB0aGUgYmFzZSB2ZnMgaW5vZGUsIGJlY2F1c2UgZXZlbiB0aG91Z2ggZmlsZSBkYXRhIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQsCisgKiBpdCBpcyBkaXJ0eSBpbiB0aGUgaW5vZGUgbWV0YSBkYXRhIHJhdGhlciB0aGFuIHRoZSBkYXRhIHBhZ2UgY2FjaGUgb2YgdGhlCisgKiBpbm9kZSwgYW5kIHRodXMgdGhlcmUgYXJlIG5vIGRhdGEgcGFnZXMgdGhhdCBuZWVkIHdyaXRpbmcgb3V0LiAgVGhlcmVmb3JlLCBhCisgKiBmdWxsIG1hcmtfaW5vZGVfZGlydHkoKSBpcyBvdmVya2lsbC4gIEEgbWFya19pbm9kZV9kaXJ0eV9zeW5jKCksIG9uIHRoZQorICogb3RoZXIgaGFuZCwgaXMgbm90IHN1ZmZpY2llbnQsIGJlY2F1c2UgSV9ESVJUWV9EQVRBU1lOQyBuZWVkcyB0byBiZSBzZXQgdG8KKyAqIGVuc3VyZSAtPndyaXRlX2lub2RlIGlzIGNhbGxlZCBmcm9tIGdlbmVyaWNfb3N5bmNfaW5vZGUoKSBhbmQgdGhpcyBuZWVkcyB0bworICogaGFwcGVuIG9yIHRoZSBmaWxlIGRhdGEgd291bGQgbm90IG5lY2Vzc2FyaWx5IGhpdCB0aGUgZGV2aWNlIHN5bmNocm9ub3VzbHksCisgKiBldmVuIHRob3VnaCB0aGUgdmZzIGlub2RlIGhhcyB0aGUgT19TWU5DIGZsYWcgc2V0LiAgQWxzbywgSV9ESVJUWV9EQVRBU1lOQworICogc2ltcGx5ICJmZWVscyIgYmV0dGVyIHRoYW4ganVzdCBJX0RJUlRZX1NZTkMsIHNpbmNlIHRoZSBmaWxlIGRhdGEgaGFzIG5vdAorICogYWN0dWFsbHkgaGl0IHRoZSBibG9jayBkZXZpY2UgeWV0LCB3aGljaCBpcyBub3Qgd2hhdCBJX0RJUlRZX1NZTkMgb24gaXRzIG93bgorICogd291bGQgc3VnZ2VzdC4KKyAqLwordm9pZCBfX21hcmtfbWZ0X3JlY29yZF9kaXJ0eShudGZzX2lub2RlICpuaSkKK3sKKwludGZzX2lub2RlICpiYXNlX25pOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCUJVR19PTihOSW5vQXR0cihuaSkpOworCW1hcmtfbnRmc19yZWNvcmRfZGlydHkobmktPnBhZ2UsIG5pLT5wYWdlX29mcyk7CisJLyogRGV0ZXJtaW5lIHRoZSBiYXNlIHZmcyBpbm9kZSBhbmQgbWFyayBpdCBkaXJ0eSwgdG9vLiAqLworCWRvd24oJm5pLT5leHRlbnRfbG9jayk7CisJaWYgKGxpa2VseShuaS0+bnJfZXh0ZW50cyA+PSAwKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwl1cCgmbmktPmV4dGVudF9sb2NrKTsKKwlfX21hcmtfaW5vZGVfZGlydHkoVkZTX0koYmFzZV9uaSksIElfRElSVFlfU1lOQyB8IElfRElSVFlfREFUQVNZTkMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbnRmc19wbGVhc2VfZW1haWwgPSAiUGxlYXNlIGVtYWlsICIKKwkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBhbmQgc2F5IHRoYXQgeW91IHNhdyAiCisJCSJ0aGlzIG1lc3NhZ2UuICBUaGFuayB5b3UuIjsKKworLyoqCisgKiBudGZzX3N5bmNfbWZ0X21pcnJvcl91bW91bnQgLSBzeW5jaHJvbmlzZSBhbiBtZnQgcmVjb3JkIHRvIHRoZSBtZnQgbWlycm9yCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0aGUgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZSByZXNpZGVzCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciBvZiBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKiBAbToJCW1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKgorICogV3JpdGUgdGhlIG1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIEBtIHdpdGggbWZ0IHJlY29yZAorICogbnVtYmVyIEBtZnRfbm8gdG8gdGhlIG1mdCBtaXJyb3IgKCRNRlRNaXJyKSBvZiB0aGUgbnRmcyB2b2x1bWUgQHZvbCwKKyAqIGJ5cGFzc2luZyB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlICRNRlRNaXJyIGlub2RlIGl0c2VsZi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHVzZSBhdCB1bW91bnQgdGltZSB3aGVuIHRoZSBtZnQgbWlycm9yIGlub2RlIGhhcworICogYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mZi4gIFdlIEJVRygpIGlmIHdlIGFyZSBjYWxsZWQgd2hpbGUgdGhlIG1mdCBtaXJyb3IKKyAqIGlub2RlIGlzIHN0aWxsIGF0dGFjaGVkIHRvIHRoZSB2b2x1bWUuCisgKgorICogT24gc3VjY2VzcyByZXR1cm4gMC4gIE9uIGVycm9yIHJldHVybiAtZXJybm8uCisgKgorICogTk9URTogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldCBhcyBJIGFtIG5vdCBjb252aW5jZWQgaXQgY2FuCisgKiBhY3R1YWxseSBiZSB0cmlnZ2VyZWQgY29uc2lkZXJpbmcgdGhlIHNlcXVlbmNlIG9mIGNvbW1pdHMgd2UgZG8gaW4gc3VwZXIuYzo6CisgKiBudGZzX3B1dF9zdXBlcigpLiAgQnV0IGp1c3QgaW4gY2FzZSB3ZSBwcm92aWRlIHRoaXMgcGxhY2UgaG9sZGVyIGFzIHRoZQorICogYWx0ZXJuYXRpdmUgd291bGQgYmUgZWl0aGVyIHRvIEJVRygpIG9yIHRvIGdldCBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZQorICogYW5kIE9vcHMuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19zeW5jX21mdF9taXJyb3JfdW1vdW50KG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLCBNRlRfUkVDT1JEICptKQoreworCUJVR19PTih2b2wtPm1mdG1pcnJfaW5vKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJVbW91bnQgdGltZSBtZnQgbWlycm9yIHN5bmNpbmcgaXMgbm90ICIKKwkJCSJpbXBsZW1lbnRlZCB5ZXQuICAlcyIsIG50ZnNfcGxlYXNlX2VtYWlsKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qKgorICogbnRmc19zeW5jX21mdF9taXJyb3IgLSBzeW5jaHJvbml6ZSBhbiBtZnQgcmVjb3JkIHRvIHRoZSBtZnQgbWlycm9yCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0aGUgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZSByZXNpZGVzCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciBvZiBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKiBAbToJCW1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKiBAc3luYzoJaWYgdHJ1ZSwgd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24KKyAqCisgKiBXcml0ZSB0aGUgbWFwcGVkLCBtc3QgcHJvdGVjdGVkIChleHRlbnQpIG1mdCByZWNvcmQgQG0gd2l0aCBtZnQgcmVjb3JkCisgKiBudW1iZXIgQG1mdF9ubyB0byB0aGUgbWZ0IG1pcnJvciAoJE1GVE1pcnIpIG9mIHRoZSBudGZzIHZvbHVtZSBAdm9sLgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIDAuICBPbiBlcnJvciByZXR1cm4gLWVycm5vIGFuZCBzZXQgdGhlIHZvbHVtZSBlcnJvcnMgZmxhZworICogaW4gdGhlIG50ZnMgdm9sdW1lIEB2b2wuCisgKgorICogTk9URTogIFdlIGFsd2F5cyBwZXJmb3JtIHN5bmNocm9ub3VzIGkvbyBhbmQgaWdub3JlIHRoZSBAc3luYyBwYXJhbWV0ZXIuCisgKgorICogVE9ETzogIElmIEBzeW5jIGlzIGZhbHNlLCB3YW50IHRvIGRvIHRydWx5IGFzeW5jaHJvbm91cyBpL28sIGkuZS4ganVzdAorICogc2NoZWR1bGUgaS9vIHZpYSAtPndyaXRlcGFnZSBvciBkbyBpdCB2aWEga250ZnNkIG9yIHdoYXRldmVyLgorICovCitpbnQgbnRmc19zeW5jX21mdF9taXJyb3IobnRmc192b2x1bWUgKnZvbCwgY29uc3QgdW5zaWduZWQgbG9uZyBtZnRfbm8sCisJCU1GVF9SRUNPUkQgKm0sIGludCBzeW5jKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBibG9ja3NpemUgPSB2b2wtPnNiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgbWF4X2JocyA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIC8gYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXU4ICprbWlycjsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXVuc2lnbmVkIGludCBibG9ja19zdGFydCwgYmxvY2tfZW5kLCBtX3N0YXJ0LCBtX2VuZCwgcGFnZV9vZnM7CisJaW50IGlfYmhzLCBucl9iaHMsIGVyciA9IDA7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0cyA9IHZvbC0+bWZ0bWlycl9pbm8tPmlfYmxrYml0czsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCBtZnRfbm8pOworCUJVR19PTighbWF4X2Jocyk7CisJaWYgKHVubGlrZWx5KCF2b2wtPm1mdG1pcnJfaW5vKSkgeworCQkvKiBUaGlzIGNvdWxkIGhhcHBlbiBkdXJpbmcgdW1vdW50Li4uICovCisJCWVyciA9IG50ZnNfc3luY19tZnRfbWlycm9yX3Vtb3VudCh2b2wsIG1mdF9ubywgbSk7CisJCWlmIChsaWtlbHkoIWVycikpCisJCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBtaXJyb3IgY29weSBvZiB0aGUgbWZ0IHJlY29yZCBAbS4gKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPm1mdG1pcnJfaW5vLT5pX21hcHBpbmcsIG1mdF9ubyA+PgorCQkJKFBBR0VfQ0FDSEVfU0hJRlQgLSB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCBtaXJyb3IgcGFnZS4iKTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCS8qIE9mZnNldCBvZiB0aGUgbWZ0IG1pcnJvciByZWNvcmQgaW5zaWRlIHRoZSBwYWdlLiAqLworCXBhZ2Vfb2ZzID0gKG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogVGhlIGFkZHJlc3MgaW4gdGhlIHBhZ2Ugb2YgdGhlIG1pcnJvciBjb3B5IG9mIHRoZSBtZnQgcmVjb3JkIEBtLiAqLworCWttaXJyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgcGFnZV9vZnM7CisJLyogQ29weSB0aGUgbXN0IHByb3RlY3RlZCBtZnQgcmVjb3JkIHRvIHRoZSBtaXJyb3IuICovCisJbWVtY3B5KGttaXJyLCBtLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJLyogQ3JlYXRlIHVwdG9kYXRlIGJ1ZmZlcnMgaWYgbm90IHByZXNlbnQuICovCisJaWYgKHVubGlrZWx5KCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRhaWw7CisKKwkJYmggPSBoZWFkID0gYWxsb2NfcGFnZV9idWZmZXJzKHBhZ2UsIGJsb2Nrc2l6ZSwgMSk7CisJCWRvIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJdGFpbCA9IGJoOworCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCX0gd2hpbGUgKGJoKTsKKwkJdGFpbC0+Yl90aGlzX3BhZ2UgPSBoZWFkOworCQlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIGhlYWQpOworCQlCVUdfT04oIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCX0KKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJQlVHX09OKCFiaCk7CisJcmwgPSBOVUxMOworCW5yX2JocyA9IDA7CisJYmxvY2tfc3RhcnQgPSAwOworCW1fc3RhcnQgPSBrbWlyciAtICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpOworCW1fZW5kID0gbV9zdGFydCArIHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWRvIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCS8qIElmIHRoZSBidWZmZXIgaXMgb3V0c2lkZSB0aGUgbWZ0IHJlY29yZCwgc2tpcCBpdC4gKi8KKwkJaWYgKGJsb2NrX2VuZCA8PSBtX3N0YXJ0KQorCQkJY29udGludWU7CisJCWlmICh1bmxpa2VseShibG9ja19zdGFydCA+PSBtX2VuZCkpCisJCQlicmVhazsKKwkJLyogTmVlZCB0byBtYXAgdGhlIGJ1ZmZlciBpZiBpdCBpcyBub3QgbWFwcGVkIGFscmVhZHkuICovCisJCWlmICh1bmxpa2VseSghYnVmZmVyX21hcHBlZChiaCkpKSB7CisJCQlWQ04gdmNuOworCQkJTENOIGxjbjsKKwkJCXVuc2lnbmVkIGludCB2Y25fb2ZzOworCisJCQkvKiBPYnRhaW4gdGhlIHZjbiBhbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGJsb2NrLiAqLworCQkJdmNuID0gKChWQ04pbWZ0X25vIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICsKKwkJCQkJKGJsb2NrX3N0YXJ0IC0gbV9zdGFydCk7CisJCQl2Y25fb2ZzID0gdmNuICYgdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJCXZjbiA+Pj0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCWlmICghcmwpIHsKKwkJCQlkb3duX3JlYWQoJk5URlNfSSh2b2wtPm1mdG1pcnJfaW5vKS0+CisJCQkJCQlydW5saXN0LmxvY2spOworCQkJCXJsID0gTlRGU19JKHZvbC0+bWZ0bWlycl9pbm8pLT5ydW5saXN0LnJsOworCQkJCS8qCisJCQkJICogJE1GVE1pcnIgYWx3YXlzIGhhcyB0aGUgd2hvbGUgb2YgaXRzIHJ1bmxpc3QKKwkJCQkgKiBpbiBtZW1vcnkuCisJCQkJICovCisJCQkJQlVHX09OKCFybCk7CisJCQl9CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQkJLyogRm9yICRNRlRNaXJyLCBvbmx5IGxjbiA+PSAwIGlzIGEgc3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsaWtlbHkobGNuID49IDApKSB7CisJCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpICsKKwkJCQkJCXZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCX0gZWxzZSB7CisJCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCB3cml0ZSBtZnQgbWlycm9yICIKKwkJCQkJCSJyZWNvcmQgMHglbHggYmVjYXVzZSBpdHMgIgorCQkJCQkJImxvY2F0aW9uIG9uIGRpc2sgY291bGQgbm90ICIKKwkJCQkJCSJiZSBkZXRlcm1pbmVkIChlcnJvciBjb2RlICIKKwkJCQkJCSIlbGxpKS4iLCBtZnRfbm8sCisJCQkJCQkobG9uZyBsb25nKWxjbik7CisJCQkJZXJyID0gLUVJTzsKKwkJCX0KKwkJfQorCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCQlCVUdfT04oIW5yX2JocyAmJiAobV9zdGFydCAhPSBibG9ja19zdGFydCkpOworCQlCVUdfT04obnJfYmhzID49IG1heF9iaHMpOworCQliaHNbbnJfYmhzKytdID0gYmg7CisJCUJVR19PTigobnJfYmhzID49IG1heF9iaHMpICYmIChtX2VuZCAhPSBibG9ja19lbmQpKTsKKwl9IHdoaWxlIChibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlpZiAodW5saWtlbHkocmwpKQorCQl1cF9yZWFkKCZOVEZTX0kodm9sLT5tZnRtaXJyX2lubyktPnJ1bmxpc3QubG9jayk7CisJaWYgKGxpa2VseSghZXJyKSkgeworCQkvKiBMb2NrIGJ1ZmZlcnMgYW5kIHN0YXJ0IHN5bmNocm9ub3VzIHdyaXRlIGkvbyBvbiB0aGVtLiAqLworCQlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gYmhzW2lfYmhzXTsKKworCQkJaWYgKHVubGlrZWx5KHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQodGJoKSkpCisJCQkJQlVHKCk7CisJCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKTsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eSh0YmgpOworCQkJZ2V0X2JoKHRiaCk7CisJCQl0YmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQkJc3VibWl0X2JoKFdSSVRFLCB0YmgpOworCQl9CisJCS8qIFdhaXQgb24gaS9vIGNvbXBsZXRpb24gb2YgYnVmZmVycy4gKi8KKwkJZm9yIChpX2JocyA9IDA7IGlfYmhzIDwgbnJfYmhzOyBpX2JocysrKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoc1tpX2Joc107CisKKwkJCXdhaXRfb25fYnVmZmVyKHRiaCk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJCWVyciA9IC1FSU87CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGJ1ZmZlciB1cHRvZGF0ZSBzbyB0aGUgcGFnZSBhbmQKKwkJCQkgKiBidWZmZXIgc3RhdGVzIGRvIG5vdCBiZWNvbWUgb3V0IG9mIHN5bmMuCisJCQkJICovCisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSh0YmgpOworCQkJfQorCQl9CisJfSBlbHNlIC8qIGlmICh1bmxpa2VseShlcnIpKSAqLyB7CisJCS8qIENsZWFuIHRoZSBidWZmZXJzLiAqLworCQlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspCisJCQljbGVhcl9idWZmZXJfZGlydHkoYmhzW2lfYmhzXSk7CisJfQorCS8qIEN1cnJlbnQgc3RhdGU6IGFsbCBidWZmZXJzIGFyZSBjbGVhbiwgdW5sb2NrZWQsIGFuZCB1cHRvZGF0ZS4gKi8KKwkvKiBSZW1vdmUgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBhZ2Fpbi4gKi8KKwlwb3N0X3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKWttaXJyKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCWlmIChsaWtlbHkoIWVycikpIHsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwl9IGVsc2UgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJJL08gZXJyb3Igd2hpbGUgd3JpdGluZyBtZnQgbWlycm9yICIKKwkJCQkicmVjb3JkIDB4JWx4ISIsIG1mdF9ubyk7CitlcnJfb3V0OgorCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gc3luY2hyb25pemUgJE1GVE1pcnIgKGVycm9yICIKKwkJCQkiY29kZSAlaSkuICBWb2x1bWUgd2lsbCBiZSBsZWZ0IG1hcmtlZCBkaXJ0eSAiCisJCQkJIm9uIHVtb3VudC4gIFJ1biBudGZzZml4IG9uIHRoZSBwYXJ0aXRpb24gIgorCQkJCSJhZnRlciB1bW91bnRpbmcgdG8gY29ycmVjdCB0aGlzLiIsIC1lcnIpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2sgLSB3cml0ZSBvdXQgYSBtYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZAorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBtYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZAorICogQG06CQltYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZCB0byB3cml0ZQorICogQHN5bmM6CWlmIHRydWUsIHdhaXQgZm9yIGkvbyBjb21wbGV0aW9uCisgKgorICogV3JpdGUgdGhlIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIEBtIGRlc2NyaWJlZCBieSB0aGUgKHJlZ3VsYXIgb3IgZXh0ZW50KQorICogbnRmcyBpbm9kZSBAbmkgdG8gYmFja2luZyBzdG9yZS4gIElmIHRoZSBtZnQgcmVjb3JkIEBtIGhhcyBhIGNvdW50ZXJwYXJ0IGluCisgKiB0aGUgbWZ0IG1pcnJvciwgdGhhdCBpcyBhbHNvIHVwZGF0ZWQuCisgKgorICogV2Ugb25seSB3cml0ZSB0aGUgbWZ0IHJlY29yZCBpZiB0aGUgbnRmcyBpbm9kZSBAbmkgaXMgZGlydHkgYW5kIHRoZSBmaXJzdAorICogYnVmZmVyIGJlbG9uZ2luZyB0byBpdHMgbWZ0IHJlY29yZCBpcyBkaXJ0eSwgdG9vLiAgV2UgaWdub3JlIHRoZSBkaXJ0eSBzdGF0ZQorICogb2Ygc3Vic2VxdWVudCBidWZmZXJzIGJlY2F1c2Ugd2UgY291bGQgaGF2ZSByYWNlZCB3aXRoCisgKiBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpLgorICoKKyAqIE9uIHN1Y2Nlc3MsIGNsZWFuIHRoZSBtZnQgcmVjb3JkIGFuZCByZXR1cm4gMC4gIE9uIGVycm9yLCBsZWF2ZSB0aGUgbWZ0CisgKiByZWNvcmQgZGlydHkgYW5kIHJldHVybiAtZXJybm8uICBUaGUgY2FsbGVyIHNob3VsZCBjYWxsIG1ha2VfYmFkX2lub2RlKCkgb24KKyAqIHRoZSBiYXNlIGlub2RlIHRvIGVuc3VyZSBubyBtb3JlIGFjY2VzcyBoYXBwZW5zIHRvIHRoaXMgaW5vZGUuICBXZSBkbyBub3QgZG8KKyAqIGl0IGhlcmUgYXMgdGhlIGNhbGxlciBtYXkgd2FudCB0byBmaW5pc2ggd3JpdGluZyBvdGhlciBleHRlbnQgbWZ0IHJlY29yZHMKKyAqIGZpcnN0IHRvIG1pbmltaXplIG9uLWRpc2sgbWV0YWRhdGEgaW5jb25zaXN0ZW5jaWVzLgorICoKKyAqIE5PVEU6ICBXZSBhbHdheXMgcGVyZm9ybSBzeW5jaHJvbm91cyBpL28gYW5kIGlnbm9yZSB0aGUgQHN5bmMgcGFyYW1ldGVyLgorICogSG93ZXZlciwgaWYgdGhlIG1mdCByZWNvcmQgaGFzIGEgY291bnRlcnBhcnQgaW4gdGhlIG1mdCBtaXJyb3IgYW5kIEBzeW5jIGlzCisgKiB0cnVlLCB3ZSB3cml0ZSB0aGUgbWZ0IHJlY29yZCwgd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24sIGFuZCBvbmx5IHRoZW4gd3JpdGUKKyAqIHRoZSBtZnQgbWlycm9yIGNvcHkuICBUaGlzIGVuc3VyZXMgdGhhdCBpZiB0aGUgc3lzdGVtIGNyYXNoZXMgZWl0aGVyIHRoZSBtZnQKKyAqIG9yIHRoZSBtZnQgbWlycm9yIHdpbGwgY29udGFpbiBhIHNlbGYtY29uc2lzdGVudCBtZnQgcmVjb3JkIEBtLiAgSWYgQHN5bmMgaXMKKyAqIGZhbHNlIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBzdGFydCBpL28gb24gYm90aCBhbmQgdGhlbiB3YWl0IGZvciBjb21wbGV0aW9uCisgKiBvbiB0aGVtLiAgVGhpcyBwcm92aWRlcyBhIHNwZWVkdXAgYnV0IG5vIGxvbmdlciBndWFyYW50ZWVzIHRoYXQgeW91IHdpbGwgZW5kCisgKiB1cCB3aXRoIGEgc2VsZi1jb25zaXN0ZW50IG1mdCByZWNvcmQgaW4gdGhlIGNhc2Ugb2YgYSBjcmFzaCBidXQgaWYgeW91IGFza2VkCisgKiBmb3IgYXN5bmNocm9ub3VzIHdyaXRpbmcgeW91IHByb2JhYmx5IGRvIG5vdCBjYXJlIGFib3V0IHRoYXQgYW55d2F5LgorICoKKyAqIFRPRE86ICBJZiBAc3luYyBpcyBmYWxzZSwgd2FudCB0byBkbyB0cnVseSBhc3luY2hyb25vdXMgaS9vLCBpLmUuIGp1c3QKKyAqIHNjaGVkdWxlIGkvbyB2aWEgLT53cml0ZXBhZ2Ugb3IgZG8gaXQgdmlhIGtudGZzZCBvciB3aGF0ZXZlci4KKyAqLworaW50IHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKG50ZnNfaW5vZGUgKm5pLCBNRlRfUkVDT1JEICptLCBpbnQgc3luYykKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IG5pLT5wYWdlOworCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHMgPSB2b2wtPm1mdF9pbm8tPmlfYmxrYml0czsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gMSA8PCBibG9ja3NpemVfYml0czsKKwlpbnQgbWF4X2JocyA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIC8gYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJdW5zaWduZWQgaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIG1fc3RhcnQsIG1fZW5kOworCWludCBpX2JocywgbnJfYmhzLCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCUJVR19PTihOSW5vQXR0cihuaSkpOworCUJVR19PTighbWF4X2Jocyk7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkvKgorCSAqIElmIHRoZSBudGZzX2lub2RlIGlzIGNsZWFuIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICBJZiBpdCBpcyBkaXJ0eSwKKwkgKiBtYXJrIGl0IGFzIGNsZWFuIG5vdyBzbyB0aGF0IGl0IGNhbiBiZSByZWRpcnRpZWQgbGF0ZXIgb24gaWYgbmVlZGVkLgorCSAqIFRoZXJlIGlzIG5vIGRhbmdlciBvZiByYWNlcyBzaW5jZSB0aGUgY2FsbGVyIGlzIGhvbGRpbmcgdGhlIGxvY2tzCisJICogZm9yIHRoZSBtZnQgcmVjb3JkIEBtIGFuZCB0aGUgcGFnZSBpdCBpcyBpbi4KKwkgKi8KKwlpZiAoIU5Jbm9UZXN0Q2xlYXJEaXJ0eShuaSkpCisJCWdvdG8gZG9uZTsKKwlCVUdfT04oIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlCVUdfT04oIWJoKTsKKwlybCA9IE5VTEw7CisJbnJfYmhzID0gMDsKKwlibG9ja19zdGFydCA9IDA7CisJbV9zdGFydCA9IG5pLT5wYWdlX29mczsKKwltX2VuZCA9IG1fc3RhcnQgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQkvKiBJZiB0aGUgYnVmZmVyIGlzIG91dHNpZGUgdGhlIG1mdCByZWNvcmQsIHNraXAgaXQuICovCisJCWlmIChibG9ja19lbmQgPD0gbV9zdGFydCkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYmxvY2tfc3RhcnQgPj0gbV9lbmQpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHRoaXMgYmxvY2sgaXMgbm90IHRoZSBmaXJzdCBvbmUgaW4gdGhlIHJlY29yZCwgd2UgaWdub3JlCisJCSAqIHRoZSBidWZmZXIncyBkaXJ0eSBzdGF0ZSBiZWNhdXNlIHdlIGNvdWxkIGhhdmUgcmFjZWQgd2l0aCBhCisJCSAqIHBhcmFsbGVsIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoKS4KKwkJICovCisJCWlmIChibG9ja19zdGFydCA9PSBtX3N0YXJ0KSB7CisJCQkvKiBUaGlzIGJsb2NrIGlzIHRoZSBmaXJzdCBvbmUgaW4gdGhlIHJlY29yZC4gKi8KKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCUJVR19PTihucl9iaHMpOworCQkJCS8qIENsZWFuIHJlY29yZHMgYXJlIG5vdCB3cml0dGVuIG91dC4gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBOZWVkIHRvIG1hcCB0aGUgYnVmZmVyIGlmIGl0IGlzIG5vdCBtYXBwZWQgYWxyZWFkeS4gKi8KKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCVZDTiB2Y247CisJCQlMQ04gbGNuOworCQkJdW5zaWduZWQgaW50IHZjbl9vZnM7CisKKwkJCS8qIE9idGFpbiB0aGUgdmNuIGFuZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICovCisJCQl2Y24gPSAoKFZDTiluaS0+bWZ0X25vIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICsKKwkJCQkJKGJsb2NrX3N0YXJ0IC0gbV9zdGFydCk7CisJCQl2Y25fb2ZzID0gdmNuICYgdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJCXZjbiA+Pj0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCWlmICghcmwpIHsKKwkJCQlkb3duX3JlYWQoJk5URlNfSSh2b2wtPm1mdF9pbm8pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gTlRGU19JKHZvbC0+bWZ0X2lubyktPnJ1bmxpc3Qucmw7CisJCQkJQlVHX09OKCFybCk7CisJCQl9CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQkJLyogRm9yICRNRlQsIG9ubHkgbGNuID49IDAgaXMgYSBzdWNjZXNzZnVsIHJlbWFwLiAqLworCQkJaWYgKGxpa2VseShsY24gPj0gMCkpIHsKKwkJCQkvKiBTZXR1cCBidWZmZXIgaGVhZCB0byBjb3JyZWN0IGJsb2NrLiAqLworCQkJCWJoLT5iX2Jsb2NrbnIgPSAoKGxjbiA8PAorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cykgKworCQkJCQkJdmNuX29mcykgPj4gYmxvY2tzaXplX2JpdHM7CisJCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCQkJfSBlbHNlIHsKKwkJCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ2Fubm90IHdyaXRlIG1mdCByZWNvcmQgIgorCQkJCQkJIjB4JWx4IGJlY2F1c2UgaXRzIGxvY2F0aW9uICIKKwkJCQkJCSJvbiBkaXNrIGNvdWxkIG5vdCBiZSAiCisJCQkJCQkiZGV0ZXJtaW5lZCAoZXJyb3IgY29kZSAlbGxpKS4iLAorCQkJCQkJbmktPm1mdF9ubywgKGxvbmcgbG9uZylsY24pOworCQkJCWVyciA9IC1FSU87CisJCQl9CisJCX0KKwkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKwkJQlVHX09OKCFucl9iaHMgJiYgKG1fc3RhcnQgIT0gYmxvY2tfc3RhcnQpKTsKKwkJQlVHX09OKG5yX2JocyA+PSBtYXhfYmhzKTsKKwkJYmhzW25yX2JocysrXSA9IGJoOworCQlCVUdfT04oKG5yX2JocyA+PSBtYXhfYmhzKSAmJiAobV9lbmQgIT0gYmxvY2tfZW5kKSk7CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJaWYgKHVubGlrZWx5KHJsKSkKKwkJdXBfcmVhZCgmTlRGU19JKHZvbC0+bWZ0X2lubyktPnJ1bmxpc3QubG9jayk7CisJaWYgKCFucl9iaHMpCisJCWdvdG8gZG9uZTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBjbGVhbnVwX291dDsKKwkvKiBBcHBseSB0aGUgbXN0IHByb3RlY3Rpb24gZml4dXBzLiAqLworCWVyciA9IHByZV93cml0ZV9tc3RfZml4dXAoKE5URlNfUkVDT1JEKiltLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJaWYgKGVycikgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYXBwbHkgbXN0IGZpeHVwcyEiKTsKKwkJZ290byBjbGVhbnVwX291dDsKKwl9CisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShuaSk7CisJLyogTG9jayBidWZmZXJzIGFuZCBzdGFydCBzeW5jaHJvbm91cyB3cml0ZSBpL28gb24gdGhlbS4gKi8KKwlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBiaHNbaV9iaHNdOworCisJCWlmICh1bmxpa2VseSh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKHRiaCkpKQorCQkJQlVHKCk7CisJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKHRiaCkpOworCQljbGVhcl9idWZmZXJfZGlydHkodGJoKTsKKwkJZ2V0X2JoKHRiaCk7CisJCXRiaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJCXN1Ym1pdF9iaChXUklURSwgdGJoKTsKKwl9CisJLyogU3luY2hyb25pemUgdGhlIG1mdCBtaXJyb3Igbm93IGlmIG5vdCBAc3luYy4gKi8KKwlpZiAoIXN5bmMgJiYgbmktPm1mdF9ubyA8IHZvbC0+bWZ0bWlycl9zaXplKQorCQludGZzX3N5bmNfbWZ0X21pcnJvcih2b2wsIG5pLT5tZnRfbm8sIG0sIHN5bmMpOworCS8qIFdhaXQgb24gaS9vIGNvbXBsZXRpb24gb2YgYnVmZmVycy4gKi8KKwlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBiaHNbaV9iaHNdOworCisJCXdhaXRfb25fYnVmZmVyKHRiaCk7CisJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisJCQllcnIgPSAtRUlPOworCQkJLyoKKwkJCSAqIFNldCB0aGUgYnVmZmVyIHVwdG9kYXRlIHNvIHRoZSBwYWdlIGFuZCBidWZmZXIKKwkJCSAqIHN0YXRlcyBkbyBub3QgYmVjb21lIG91dCBvZiBzeW5jLgorCQkJICovCisJCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQkJCXNldF9idWZmZXJfdXB0b2RhdGUodGJoKTsKKwkJfQorCX0KKwkvKiBJZiBAc3luYywgbm93IHN5bmNocm9uaXplIHRoZSBtZnQgbWlycm9yLiAqLworCWlmIChzeW5jICYmIG5pLT5tZnRfbm8gPCB2b2wtPm1mdG1pcnJfc2l6ZSkKKwkJbnRmc19zeW5jX21mdF9taXJyb3Iodm9sLCBuaS0+bWZ0X25vLCBtLCBzeW5jKTsKKwkvKiBSZW1vdmUgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBhZ2Fpbi4gKi8KKwlwb3N0X3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKW0pOworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UobmkpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCS8qIEkvTyBlcnJvciBkdXJpbmcgd3JpdGluZy4gIFRoaXMgaXMgcmVhbGx5IGJhZCEgKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgbWZ0IHJlY29yZCAiCisJCQkJIjB4JWx4ISAgTWFya2luZyBiYXNlIGlub2RlIGFzIGJhZC4gIFlvdSAiCisJCQkJInNob3VsZCB1bm1vdW50IHRoZSB2b2x1bWUgYW5kIHJ1biBjaGtkc2suIiwKKwkJCQluaS0+bWZ0X25vKTsKKwkJZ290byBlcnJfb3V0OworCX0KK2RvbmU6CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK2NsZWFudXBfb3V0OgorCS8qIENsZWFuIHRoZSBidWZmZXJzLiAqLworCWZvciAoaV9iaHMgPSAwOyBpX2JocyA8IG5yX2JoczsgaV9iaHMrKykKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoc1tpX2Joc10pOworZXJyX291dDoKKwkvKgorCSAqIEN1cnJlbnQgc3RhdGU6IGFsbCBidWZmZXJzIGFyZSBjbGVhbiwgdW5sb2NrZWQsIGFuZCB1cHRvZGF0ZS4KKwkgKiBUaGUgY2FsbGVyIHNob3VsZCBtYXJrIHRoZSBiYXNlIGlub2RlIGFzIGJhZCBzbyB0aGF0IG5vIG1vcmUgaS9vCisJICogaGFwcGVucy4gIC0+Y2xlYXJfaW5vZGUoKSB3aWxsIHN0aWxsIGJlIGludm9rZWQgc28gYWxsIGV4dGVudCBpbm9kZXMKKwkgKiBhbmQgb3RoZXIgYWxsb2NhdGVkIG1lbW9yeSB3aWxsIGJlIGZyZWVkLgorCSAqLworCWlmIChlcnIgPT0gLUVOT01FTSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBtZnQgcmVjb3JkLiAgIgorCQkJCSJSZWRpcnR5aW5nIHNvIHRoZSB3cml0ZSBpcyByZXRyaWVkIGxhdGVyLiIpOworCQltYXJrX21mdF9yZWNvcmRfZGlydHkobmkpOworCQllcnIgPSAwOworCX0gZWxzZQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkIC0gY2hlY2sgaWYgYW4gbWZ0IHJlY29yZCBtYXkgYmUgd3JpdHRlbiBvdXQKKyAqIEB2b2w6CVtJTl0gIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRoZSBtZnQgcmVjb3JkIHRvIGNoZWNrIHJlc2lkZXMKKyAqIEBtZnRfbm86CVtJTl0gIG1mdCByZWNvcmQgbnVtYmVyIG9mIHRoZSBtZnQgcmVjb3JkIHRvIGNoZWNrCisgKiBAbToJCVtJTl0gIG1hcHBlZCBtZnQgcmVjb3JkIHRvIGNoZWNrCisgKiBAbG9ja2VkX25pOglbT1VUXSBjYWxsZXIgaGFzIHRvIHVubG9jayB0aGlzIG50ZnMgaW5vZGUgaWYgb25lIGlzIHJldHVybmVkCisgKgorICogQ2hlY2sgaWYgdGhlIG1hcHBlZCAoYmFzZSBvciBleHRlbnQpIG1mdCByZWNvcmQgQG0gd2l0aCBtZnQgcmVjb3JkIG51bWJlcgorICogQG1mdF9ubyBiZWxvbmdpbmcgdG8gdGhlIG50ZnMgdm9sdW1lIEB2b2wgbWF5IGJlIHdyaXR0ZW4gb3V0LiAgSWYgbmVjZXNzYXJ5CisgKiBhbmQgcG9zc2libGUgdGhlIG50ZnMgaW5vZGUgb2YgdGhlIG1mdCByZWNvcmQgaXMgbG9ja2VkIGFuZCB0aGUgYmFzZSB2ZnMKKyAqIGlub2RlIGlzIHBpbm5lZC4gIFRoZSBsb2NrZWQgbnRmcyBpbm9kZSBpcyB0aGVuIHJldHVybmVkIGluIEBsb2NrZWRfbmkuICBUaGUKKyAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdW5sb2NraW5nIHRoZSBudGZzIGlub2RlIGFuZCB1bnBpbm5pbmcgdGhlIGJhc2UKKyAqIHZmcyBpbm9kZS4KKyAqCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgbWZ0IHJlY29yZCBtYXkgYmUgd3JpdHRlbiBvdXQgYW5kIEZBTFNFIGlmIG5vdC4KKyAqCisgKiBUaGUgY2FsbGVyIGhhcyBsb2NrZWQgdGhlIHBhZ2UgYW5kIGNsZWFyZWQgdGhlIHVwdG9kYXRlIGZsYWcgb24gaXQgd2hpY2gKKyAqIG1lYW5zIHRoYXQgd2UgY2FuIHNhZmVseSB3cml0ZSBvdXQgYW55IGRpcnR5IG1mdCByZWNvcmRzIHRoYXQgZG8gbm90IGhhdmUKKyAqIHRoZWlyIGlub2RlcyBpbiBpY2FjaGUgYXMgZGV0ZXJtaW5lZCBieSBpbG9va3VwNSgpIGFzIGFueW9uZQorICogb3BlbmluZy9jcmVhdGluZyBzdWNoIGFuIGlub2RlIHdvdWxkIGJsb2NrIHdoZW4gYXR0ZW1wdGluZyB0byBtYXAgdGhlIG1mdAorICogcmVjb3JkIGluIHJlYWRfY2FjaGVfcGFnZSgpIHVudGlsIHdlIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSB3cml0ZSBvdXQuCisgKgorICogSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0cyB3ZSBwZXJmb3JtOgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBmb3VuZCBpbiBpY2FjaGUgd2Uga25vdyB0aGUgbWZ0IHJlY29yZCBtdXN0IGJlIGEgYmFzZSBtZnQKKyAqIHJlY29yZC4gIElmIGl0IGlzIGRpcnR5LCB3ZSBkbyBub3Qgd3JpdGUgaXQgYW5kIHJldHVybiBGQUxTRSBhcyB0aGUgdmZzCisgKiBpbm9kZSB3cml0ZSBwYXRocyB3aWxsIHJlc3VsdCBpbiB0aGUgYWNjZXNzIHRpbWVzIGJlaW5nIHVwZGF0ZWQgd2hpY2ggd291bGQKKyAqIGNhdXNlIHRoZSBiYXNlIG1mdCByZWNvcmQgdG8gYmUgcmVkaXJ0aWVkIGFuZCB3cml0dGVuIG91dCBhZ2Fpbi4gIChXZSBrbm93CisgKiB0aGUgYWNjZXNzIHRpbWUgdXBkYXRlIHdpbGwgbW9kaWZ5IHRoZSBiYXNlIG1mdCByZWNvcmQgYmVjYXVzZSBXaW5kb3dzCisgKiBjaGtkc2sgY29tcGxhaW5zIGlmIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgaXMgbm90IGluIHRoZSBiYXNlCisgKiBtZnQgcmVjb3JkLikKKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgaW4gaWNhY2hlIGFuZCBub3QgZGlydHksIHdlIGF0dGVtcHQgdG8gbG9jayB0aGUgbWZ0IHJlY29yZAorICogYW5kIGlmIHdlIGZpbmQgdGhlIGxvY2sgd2FzIGFscmVhZHkgdGFrZW4sIGl0IGlzIG5vdCBzYWZlIHRvIHdyaXRlIHRoZSBtZnQKKyAqIHJlY29yZCBhbmQgd2UgcmV0dXJuIEZBTFNFLgorICoKKyAqIElmIHdlIG1hbmFnZSB0byBvYnRhaW4gdGhlIGxvY2sgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBtZnQgcmVjb3JkLAorICogd2hpY2ggYWxzbyBhbGxvd3MgdXMgc2FmZSB3cml0ZW91dCBvZiB0aGUgbWZ0IHJlY29yZC4gIFdlIHRoZW4gc2V0CisgKiBAbG9ja2VkX25pIHRvIHRoZSBsb2NrZWQgbnRmcyBpbm9kZSBhbmQgcmV0dXJuIFRSVUUuCisgKgorICogTm90ZSB3ZSBjYW5ub3QganVzdCBsb2NrIHRoZSBtZnQgcmVjb3JkIGFuZCBzbGVlcCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jaworICogYmVjYXVzZSB0aGlzIHdvdWxkIGRlYWRsb2NrIGR1ZSB0byBsb2NrIHJldmVyc2FsIChub3JtYWxseSB0aGUgbWZ0IHJlY29yZCBpcworICogbG9ja2VkIGJlZm9yZSB0aGUgcGFnZSBpcyBsb2NrZWQgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgcGFnZSBsb2NrZWQgaGVyZQorICogd2hlbiB3ZSB0cnkgdG8gbG9jayB0aGUgbWZ0IHJlY29yZCkuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5vdCBpbiBpY2FjaGUgd2UgbmVlZCB0byBwZXJmb3JtIGZ1cnRoZXIgY2hlY2tzLgorICoKKyAqIElmIHRoZSBtZnQgcmVjb3JkIGlzIG5vdCBhIEZJTEUgcmVjb3JkIG9yIGl0IGlzIGEgYmFzZSBtZnQgcmVjb3JkLCB3ZSBjYW4KKyAqIHNhZmVseSB3cml0ZSBpdCBhbmQgcmV0dXJuIFRSVUUuCisgKgorICogV2Ugbm93IGtub3cgdGhlIG1mdCByZWNvcmQgaXMgYW4gZXh0ZW50IG1mdCByZWNvcmQuICBXZSBjaGVjayBpZiB0aGUgaW5vZGUKKyAqIGNvcnJlc3BvbmRpbmcgdG8gaXRzIGJhc2UgbWZ0IHJlY29yZCBpcyBpbiBpY2FjaGUgYW5kIG9idGFpbiBhIHJlZmVyZW5jZSB0bworICogaXQgaWYgaXQgaXMuICBJZiBpdCBpcyBub3QsIHdlIGNhbiBzYWZlbHkgd3JpdGUgaXQgYW5kIHJldHVybiBUUlVFLgorICoKKyAqIFdlIG5vdyBoYXZlIHRoZSBiYXNlIGlub2RlIGZvciB0aGUgZXh0ZW50IG1mdCByZWNvcmQuICBXZSBjaGVjayBpZiBpdCBoYXMgYW4KKyAqIG50ZnMgaW5vZGUgZm9yIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhdHRhY2hlZCBhbmQgaWYgbm90IGl0IGlzIHNhZmUgdG8gd3JpdGUKKyAqIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhbmQgd2UgcmV0dXJuIFRSVUUuCisgKgorICogVGhlIG50ZnMgaW5vZGUgZm9yIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBpcyBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSBzbyB3ZQorICogYXR0ZW1wdCB0byBsb2NrIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhbmQgaWYgd2UgZmluZCB0aGUgbG9jayB3YXMgYWxyZWFkeQorICogdGFrZW4sIGl0IGlzIG5vdCBzYWZlIHRvIHdyaXRlIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhbmQgd2UgcmV0dXJuIEZBTFNFLgorICoKKyAqIElmIHdlIG1hbmFnZSB0byBvYnRhaW4gdGhlIGxvY2sgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBleHRlbnQgbWZ0CisgKiByZWNvcmQsIHdoaWNoIGFsc28gYWxsb3dzIHVzIHNhZmUgd3JpdGVvdXQgb2YgdGhlIGV4dGVudCBtZnQgcmVjb3JkLiAgV2UKKyAqIHNldCB0aGUgbnRmcyBpbm9kZSBvZiB0aGUgZXh0ZW50IG1mdCByZWNvcmQgY2xlYW4gYW5kIHRoZW4gc2V0IEBsb2NrZWRfbmkgdG8KKyAqIHRoZSBub3cgbG9ja2VkIG50ZnMgaW5vZGUgYW5kIHJldHVybiBUUlVFLgorICoKKyAqIE5vdGUsIHRoZSByZWFzb24gZm9yIGFjdHVhbGx5IHdyaXRpbmcgZGlydHkgbWZ0IHJlY29yZHMgaGVyZSBhbmQgbm90IGp1c3QKKyAqIHJlbHlpbmcgb24gdGhlIHZmcyBpbm9kZSBkaXJ0eSBjb2RlIHBhdGhzIGlzIHRoYXQgd2UgY2FuIGhhdmUgbWZ0IHJlY29yZHMKKyAqIG1vZGlmaWVkIHdpdGhvdXQgdGhlbSBldmVyIGhhdmluZyBhY3R1YWwgaW5vZGVzIGluIG1lbW9yeS4gIEFsc28gd2UgY2FuIGhhdmUKKyAqIGRpcnR5IG1mdCByZWNvcmRzIHdpdGggY2xlYW4gbnRmcyBpbm9kZXMgaW4gbWVtb3J5LiAgTm9uZSBvZiB0aGUgZGVzY3JpYmVkCisgKiBjYXNlcyB3b3VsZCByZXN1bHQgaW4gdGhlIGRpcnR5IG1mdCByZWNvcmRzIGJlaW5nIHdyaXR0ZW4gb3V0IGlmIHdlIG9ubHkKKyAqIHJlbGllZCBvbiB0aGUgdmZzIGlub2RlIGRpcnR5IGNvZGUgcGF0aHMuICBBbmQgdGhlc2UgY2FzZXMgY2FuIHJlYWxseSBvY2N1cgorICogZHVyaW5nIGFsbG9jYXRpb24gb2YgbmV3IG1mdCByZWNvcmRzIGFuZCBpbiBwYXJ0aWN1bGFyIHdoZW4gdGhlCisgKiBpbml0aWFsaXplZF9zaXplIG9mIHRoZSAkTUZULyREQVRBIGF0dHJpYnV0ZSBpcyBleHRlbmRlZCBhbmQgdGhlIG5ldyBzcGFjZQorICogaXMgaW5pdGlhbGl6ZWQgdXNpbmcgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdCgpLiAgVGhlIGNsZWFuIGlub2RlIGNhbiB0aGVuCisgKiBhcHBlYXIgaWYgdGhlIG1mdCByZWNvcmQgaXMgcmV1c2VkIGZvciBhIG5ldyBpbm9kZSBiZWZvcmUgaXQgZ290IHdyaXR0ZW4KKyAqIG91dC4KKyAqLworQk9PTCBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLAorCQljb25zdCBNRlRfUkVDT1JEICptLCBudGZzX2lub2RlICoqbG9ja2VkX25pKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXN0cnVjdCBpbm9kZSAqbWZ0X3ZpID0gdm9sLT5tZnRfaW5vOworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19pbm9kZSAqbmksICplbmksICoqZXh0ZW50X25pczsKKwlpbnQgaTsKKwludGZzX2F0dHIgbmE7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHguIiwgbWZ0X25vKTsKKwkvKgorCSAqIE5vcm1hbGx5IHdlIGRvIG5vdCByZXR1cm4gYSBsb2NrZWQgaW5vZGUgc28gc2V0IEBsb2NrZWRfbmkgdG8gTlVMTC4KKwkgKi8KKwlCVUdfT04oIWxvY2tlZF9uaSk7CisJKmxvY2tlZF9uaSA9IE5VTEw7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgaW5vZGUgY29ycmVzcG9uZGluZyB0byB0aGlzIG1mdCByZWNvcmQgaXMgaW4gdGhlIFZGUworCSAqIGlub2RlIGNhY2hlIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gaXQgaWYgaXQgaXMuCisJICovCisJbnRmc19kZWJ1ZygiTG9va2luZyBmb3IgaW5vZGUgMHglbHggaW4gaWNhY2hlLiIsIG1mdF9ubyk7CisJbmEubWZ0X25vID0gbWZ0X25vOworCW5hLm5hbWUgPSBOVUxMOworCW5hLm5hbWVfbGVuID0gMDsKKwluYS50eXBlID0gQVRfVU5VU0VEOworCS8qCisJICogRm9yIGlub2RlIDAsIGkuZS4gJE1GVCBpdHNlbGYsIHdlIGNhbm5vdCB1c2UgaWxvb2t1cDUoKSBmcm9tIGhlcmUgb3IKKwkgKiB3ZSBkZWFkbG9jayBiZWNhdXNlIHRoZSBpbm9kZSBpcyBhbHJlYWR5IGxvY2tlZCBieSB0aGUga2VybmVsCisJICogKGZzL2ZzLXdyaXRlYmFjay5jOjpfX3N5bmNfc2luZ2xlX2lub2RlKCkpIGFuZCBpbG9va3VwNSgpIHdhaXRzCisJICogdW50aWwgdGhlIGlub2RlIGlzIHVubG9ja2VkIGJlZm9yZSByZXR1cm5pbmcgaXQgYW5kIGl0IG5ldmVyIGdldHMKKwkgKiB1bmxvY2tlZCBiZWNhdXNlIG50ZnNfc2hvdWxkX3dyaXRlX21mdF9yZWNvcmQoKSBuZXZlciByZXR1cm5zLiAgKS06CisJICogRm9ydHVuYXRlbHksIHdlIGhhdmUgaW5vZGUgMCBwaW5uZWQgaW4gaWNhY2hlIGZvciB0aGUgZHVyYXRpb24gb2YKKwkgKiB0aGUgbW91bnQgc28gd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseS4KKwkgKi8KKwlpZiAoIW1mdF9ubykgeworCQkvKiBCYWxhbmNlIHRoZSBiZWxvdyBpcHV0KCkuICovCisJCXZpID0gaWdyYWIobWZ0X3ZpKTsKKwkJQlVHX09OKHZpICE9IG1mdF92aSk7CisJfSBlbHNlCisJCXZpID0gaWxvb2t1cDUoc2IsIG1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsICZuYSk7CisJaWYgKHZpKSB7CisJCW50ZnNfZGVidWcoIkJhc2UgaW5vZGUgMHglbHggaXMgaW4gaWNhY2hlLiIsIG1mdF9ubyk7CisJCS8qIFRoZSBpbm9kZSBpcyBpbiBpY2FjaGUuICovCisJCW5pID0gTlRGU19JKHZpKTsKKwkJLyogVGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgbnRmcyBpbm9kZS4gKi8KKwkJYXRvbWljX2luYygmbmktPmNvdW50KTsKKwkJLyogSWYgdGhlIGlub2RlIGlzIGRpcnR5LCBkbyBub3Qgd3JpdGUgdGhpcyByZWNvcmQuICovCisJCWlmIChOSW5vRGlydHkobmkpKSB7CisJCQludGZzX2RlYnVnKCJJbm9kZSAweCVseCBpcyBkaXJ0eSwgZG8gbm90IHdyaXRlIGl0LiIsCisJCQkJCW1mdF9ubyk7CisJCQlhdG9taWNfZGVjKCZuaS0+Y291bnQpOworCQkJaXB1dCh2aSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJbnRmc19kZWJ1ZygiSW5vZGUgMHglbHggaXMgbm90IGRpcnR5LiIsIG1mdF9ubyk7CisJCS8qIFRoZSBpbm9kZSBpcyBub3QgZGlydHksIHRyeSB0byB0YWtlIHRoZSBtZnQgcmVjb3JkIGxvY2suICovCisJCWlmICh1bmxpa2VseShkb3duX3RyeWxvY2soJm5pLT5tcmVjX2xvY2spKSkgeworCQkJbnRmc19kZWJ1ZygiTWZ0IHJlY29yZCAweCVseCBpcyBhbHJlYWR5IGxvY2tlZCwgZG8gIgorCQkJCQkibm90IHdyaXRlIGl0LiIsIG1mdF9ubyk7CisJCQlhdG9taWNfZGVjKCZuaS0+Y291bnQpOworCQkJaXB1dCh2aSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJbnRmc19kZWJ1ZygiTWFuYWdlZCB0byBsb2NrIG1mdCByZWNvcmQgMHglbHgsIHdyaXRlIGl0LiIsCisJCQkJbWZ0X25vKTsKKwkJLyoKKwkJICogVGhlIHdyaXRlIGhhcyB0byBvY2N1ciB3aGlsZSB3ZSBob2xkIHRoZSBtZnQgcmVjb3JkIGxvY2sgc28KKwkJICogcmV0dXJuIHRoZSBsb2NrZWQgbnRmcyBpbm9kZS4KKwkJICovCisJCSpsb2NrZWRfbmkgPSBuaTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW50ZnNfZGVidWcoIklub2RlIDB4JWx4IGlzIG5vdCBpbiBpY2FjaGUuIiwgbWZ0X25vKTsKKwkvKiBUaGUgaW5vZGUgaXMgbm90IGluIGljYWNoZS4gKi8KKwkvKiBXcml0ZSB0aGUgcmVjb3JkIGlmIGl0IGlzIG5vdCBhIG1mdCByZWNvcmQgKHR5cGUgIkZJTEUiKS4gKi8KKwlpZiAoIW50ZnNfaXNfbWZ0X3JlY29yZChtLT5tYWdpYykpIHsKKwkJbnRmc19kZWJ1ZygiTWZ0IHJlY29yZCAweCVseCBpcyBub3QgYSBGSUxFIHJlY29yZCwgd3JpdGUgaXQuIiwKKwkJCQltZnRfbm8pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyogV3JpdGUgdGhlIG1mdCByZWNvcmQgaWYgaXQgaXMgYSBiYXNlIGlub2RlLiAqLworCWlmICghbS0+YmFzZV9tZnRfcmVjb3JkKSB7CisJCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgYSBiYXNlIHJlY29yZCwgd3JpdGUgaXQuIiwKKwkJCQltZnRfbm8pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyoKKwkgKiBUaGlzIGlzIGFuIGV4dGVudCBtZnQgcmVjb3JkLiAgQ2hlY2sgaWYgdGhlIGlub2RlIGNvcnJlc3BvbmRpbmcgdG8KKwkgKiBpdHMgYmFzZSBtZnQgcmVjb3JkIGlzIGluIGljYWNoZSBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGl0IGlmIGl0CisJICogaXMuCisJICovCisJbmEubWZ0X25vID0gTVJFRl9MRShtLT5iYXNlX21mdF9yZWNvcmQpOworCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgYW4gZXh0ZW50IHJlY29yZC4gIExvb2tpbmcgZm9yIGJhc2UgIgorCQkJImlub2RlIDB4JWx4IGluIGljYWNoZS4iLCBtZnRfbm8sIG5hLm1mdF9ubyk7CisJdmkgPSBpbG9va3VwNShzYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwgJm5hKTsKKwlpZiAoIXZpKSB7CisJCS8qCisJCSAqIFRoZSBiYXNlIGlub2RlIGlzIG5vdCBpbiBpY2FjaGUsIHdyaXRlIHRoaXMgZXh0ZW50IG1mdAorCQkgKiByZWNvcmQuCisJCSAqLworCQludGZzX2RlYnVnKCJCYXNlIGlub2RlIDB4JWx4IGlzIG5vdCBpbiBpY2FjaGUsIHdyaXRlIHRoZSAiCisJCQkJImV4dGVudCByZWNvcmQuIiwgbmEubWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW50ZnNfZGVidWcoIkJhc2UgaW5vZGUgMHglbHggaXMgaW4gaWNhY2hlLiIsIG5hLm1mdF9ubyk7CisJLyoKKwkgKiBUaGUgYmFzZSBpbm9kZSBpcyBpbiBpY2FjaGUuICBDaGVjayBpZiBpdCBoYXMgdGhlIGV4dGVudCBpbm9kZQorCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBleHRlbnQgbWZ0IHJlY29yZCBhdHRhY2hlZC4KKwkgKi8KKwluaSA9IE5URlNfSSh2aSk7CisJZG93bigmbmktPmV4dGVudF9sb2NrKTsKKwlpZiAobmktPm5yX2V4dGVudHMgPD0gMCkgeworCQkvKgorCQkgKiBUaGUgYmFzZSBpbm9kZSBoYXMgbm8gYXR0YWNoZWQgZXh0ZW50IGlub2Rlcywgd3JpdGUgdGhpcworCQkgKiBleHRlbnQgbWZ0IHJlY29yZC4KKwkJICovCisJCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCQlpcHV0KHZpKTsKKwkJbnRmc19kZWJ1ZygiQmFzZSBpbm9kZSAweCVseCBoYXMgbm8gYXR0YWNoZWQgZXh0ZW50IGlub2RlcywgIgorCQkJCSJ3cml0ZSB0aGUgZXh0ZW50IHJlY29yZC4iLCBuYS5tZnRfbm8pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyogSXRlcmF0ZSBvdmVyIHRoZSBhdHRhY2hlZCBleHRlbnQgaW5vZGVzLiAqLworCWV4dGVudF9uaXMgPSBuaS0+ZXh0LmV4dGVudF9udGZzX2lub3M7CisJZm9yIChlbmkgPSBOVUxMLCBpID0gMDsgaSA8IG5pLT5ucl9leHRlbnRzOyArK2kpIHsKKwkJaWYgKG1mdF9ubyA9PSBleHRlbnRfbmlzW2ldLT5tZnRfbm8pIHsKKwkJCS8qCisJCQkgKiBGb3VuZCB0aGUgZXh0ZW50IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBleHRlbnQKKwkJCSAqIG1mdCByZWNvcmQuCisJCQkgKi8KKwkJCWVuaSA9IGV4dGVudF9uaXNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIElmIHRoZSBleHRlbnQgaW5vZGUgd2FzIG5vdCBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSwgd3JpdGUgdGhpcworCSAqIGV4dGVudCBtZnQgcmVjb3JkLgorCSAqLworCWlmICghZW5pKSB7CisJCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCQlpcHV0KHZpKTsKKwkJbnRmc19kZWJ1ZygiRXh0ZW50IGlub2RlIDB4JWx4IGlzIG5vdCBhdHRhY2hlZCB0byBpdHMgYmFzZSAiCisJCQkJImlub2RlIDB4JWx4LCB3cml0ZSB0aGUgZXh0ZW50IHJlY29yZC4iLAorCQkJCW1mdF9ubywgbmEubWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW50ZnNfZGVidWcoIkV4dGVudCBpbm9kZSAweCVseCBpcyBhdHRhY2hlZCB0byBpdHMgYmFzZSBpbm9kZSAweCVseC4iLAorCQkJbWZ0X25vLCBuYS5tZnRfbm8pOworCS8qIFRha2UgYSByZWZlcmVuY2UgdG8gdGhlIGV4dGVudCBudGZzIGlub2RlLiAqLworCWF0b21pY19pbmMoJmVuaS0+Y291bnQpOworCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCS8qCisJICogRm91bmQgdGhlIGV4dGVudCBpbm9kZSBjb3Jlc3BvbmRpbmcgdG8gdGhpcyBleHRlbnQgbWZ0IHJlY29yZC4KKwkgKiBUcnkgdG8gdGFrZSB0aGUgbWZ0IHJlY29yZCBsb2NrLgorCSAqLworCWlmICh1bmxpa2VseShkb3duX3RyeWxvY2soJmVuaS0+bXJlY19sb2NrKSkpIHsKKwkJYXRvbWljX2RlYygmZW5pLT5jb3VudCk7CisJCWlwdXQodmkpOworCQludGZzX2RlYnVnKCJFeHRlbnQgbWZ0IHJlY29yZCAweCVseCBpcyBhbHJlYWR5IGxvY2tlZCwgZG8gIgorCQkJCSJub3Qgd3JpdGUgaXQuIiwgbWZ0X25vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwludGZzX2RlYnVnKCJNYW5hZ2VkIHRvIGxvY2sgZXh0ZW50IG1mdCByZWNvcmQgMHglbHgsIHdyaXRlIGl0LiIsCisJCQltZnRfbm8pOworCWlmIChOSW5vVGVzdENsZWFyRGlydHkoZW5pKSkKKwkJbnRmc19kZWJ1ZygiRXh0ZW50IGlub2RlIDB4JWx4IGlzIGRpcnR5LCBtYXJraW5nIGl0IGNsZWFuLiIsCisJCQkJbWZ0X25vKTsKKwkvKgorCSAqIFRoZSB3cml0ZSBoYXMgdG8gb2NjdXIgd2hpbGUgd2UgaG9sZCB0aGUgbWZ0IHJlY29yZCBsb2NrIHNvIHJldHVybgorCSAqIHRoZSBsb2NrZWQgZXh0ZW50IG50ZnMgaW5vZGUuCisJICovCisJKmxvY2tlZF9uaSA9IGVuaTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmVzID0gIiAgTGVhdmluZyBpbmNvbnNpc3RlbnQgbWV0YWRhdGEuICBVbm1vdW50IGFuZCBydW4gIgorCQkiY2hrZHNrLiI7CisKKy8qKgorICogbnRmc19tZnRfYml0bWFwX2ZpbmRfYW5kX2FsbG9jX2ZyZWVfcmVjX25vbG9jayAtIHNlZSBuYW1lCisgKiBAdm9sOgl2b2x1bWUgb24gd2hpY2ggdG8gc2VhcmNoIGZvciBhIGZyZWUgbWZ0IHJlY29yZAorICogQGJhc2Vfbmk6CW9wZW4gYmFzZSBpbm9kZSBpZiBhbGxvY2F0aW5nIGFuIGV4dGVudCBtZnQgcmVjb3JkIG9yIE5VTEwKKyAqCisgKiBTZWFyY2ggZm9yIGEgZnJlZSBtZnQgcmVjb3JkIGluIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZSBvbiB0aGUgbnRmcyB2b2x1bWUKKyAqIEB2b2wuCisgKgorICogSWYgQGJhc2VfbmkgaXMgTlVMTCBzdGFydCB0aGUgc2VhcmNoIGF0IHRoZSBkZWZhdWx0IGFsbG9jYXRvciBwb3NpdGlvbi4KKyAqCisgKiBJZiBAYmFzZV9uaSBpcyBub3QgTlVMTCBzdGFydCB0aGUgc2VhcmNoIGF0IHRoZSBtZnQgcmVjb3JkIGFmdGVyIHRoZSBiYXNlCisgKiBtZnQgcmVjb3JkIEBiYXNlX25pLgorICoKKyAqIFJldHVybiB0aGUgZnJlZSBtZnQgcmVjb3JkIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIEFuIGVycm9yIGNvZGUgb2YKKyAqIC1FTk9TUEMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gZnJlZSBtZnQgcmVjb3JkcyBpbiB0aGUgY3VycmVudGx5CisgKiBpbml0aWFsaXplZCBtZnQgYml0bWFwLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdm9sLT5tZnRibXBfbG9jayBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZmluZF9hbmRfYWxsb2NfZnJlZV9yZWNfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wsCisJCW50ZnNfaW5vZGUgKmJhc2VfbmkpCit7CisJczY0IHBhc3NfZW5kLCBsbCwgZGF0YV9wb3MsIHBhc3Nfc3RhcnQsIG9mcywgYml0OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptZnRibXBfbWFwcGluZzsKKwl1OCAqYnVmLCAqYnl0ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBpbnQgcGFnZV9vZnMsIHNpemU7CisJdTggcGFzcywgYjsKKworCW50ZnNfZGVidWcoIlNlYXJjaGluZyBmb3IgZnJlZSBtZnQgcmVjb3JkIGluIHRoZSBjdXJyZW50bHkgIgorCQkJImluaXRpYWxpemVkIG1mdCBiaXRtYXAuIik7CisJbWZ0Ym1wX21hcHBpbmcgPSB2b2wtPm1mdGJtcF9pbm8tPmlfbWFwcGluZzsKKwkvKgorCSAqIFNldCB0aGUgZW5kIG9mIHRoZSBwYXNzIG1ha2luZyBzdXJlIHdlIGRvIG5vdCBvdmVyZmxvdyB0aGUgbWZ0CisJICogYml0bWFwLgorCSAqLworCXBhc3NfZW5kID0gTlRGU19JKHZvbC0+bWZ0X2lubyktPmFsbG9jYXRlZF9zaXplID4+CisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCWxsID0gTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyktPmluaXRpYWxpemVkX3NpemUgPDwgMzsKKwlpZiAocGFzc19lbmQgPiBsbCkKKwkJcGFzc19lbmQgPSBsbDsKKwlwYXNzID0gMTsKKwlpZiAoIWJhc2VfbmkpCisJCWRhdGFfcG9zID0gdm9sLT5tZnRfZGF0YV9wb3M7CisJZWxzZQorCQlkYXRhX3BvcyA9IGJhc2VfbmktPm1mdF9ubyArIDE7CisJaWYgKGRhdGFfcG9zIDwgMjQpCisJCWRhdGFfcG9zID0gMjQ7CisJaWYgKGRhdGFfcG9zID49IHBhc3NfZW5kKSB7CisJCWRhdGFfcG9zID0gMjQ7CisJCXBhc3MgPSAyOworCQkvKiBUaGlzIGhhcHBlbnMgb24gYSBmcmVzaGx5IGZvcm1hdHRlZCB2b2x1bWUuICovCisJCWlmIChkYXRhX3BvcyA+PSBwYXNzX2VuZCkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKwlwYXNzX3N0YXJ0ID0gZGF0YV9wb3M7CisJbnRmc19kZWJ1ZygiU3RhcnRpbmcgYml0bWFwIHNlYXJjaDogcGFzcyAldSwgcGFzc19zdGFydCAweCVsbHgsICIKKwkJCSJwYXNzX2VuZCAweCVsbHgsIGRhdGFfcG9zIDB4JWxseC4iLCBwYXNzLAorCQkJKGxvbmcgbG9uZylwYXNzX3N0YXJ0LCAobG9uZyBsb25nKXBhc3NfZW5kLAorCQkJKGxvbmcgbG9uZylkYXRhX3Bvcyk7CisJLyogTG9vcCB1bnRpbCBhIGZyZWUgbWZ0IHJlY29yZCBpcyBmb3VuZC4gKi8KKwlmb3IgKDsgcGFzcyA8PSAyOykgeworCQkvKiBDYXAgc2l6ZSB0byBwYXNzX2VuZC4gKi8KKwkJb2ZzID0gZGF0YV9wb3MgPj4gMzsKKwkJcGFnZV9vZnMgPSBvZnMgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlzaXplID0gUEFHRV9DQUNIRV9TSVpFIC0gcGFnZV9vZnM7CisJCWxsID0gKChwYXNzX2VuZCArIDcpID4+IDMpIC0gb2ZzOworCQlpZiAoc2l6ZSA+IGxsKQorCQkJc2l6ZSA9IGxsOworCQlzaXplIDw8PSAzOworCQkvKgorCQkgKiBJZiB3ZSBhcmUgc3RpbGwgd2l0aGluIHRoZSBhY3RpdmUgcGFzcywgc2VhcmNoIHRoZSBuZXh0IHBhZ2UKKwkJICogZm9yIGEgemVybyBiaXQuCisJCSAqLworCQlpZiAoc2l6ZSkgeworCQkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWZ0Ym1wX21hcHBpbmcsCisJCQkJCW9mcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJCWlmICh1bmxpa2VseShJU19FUlIocGFnZSkpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgbWZ0ICIKKwkJCQkJCSJiaXRtYXAsIGFib3J0aW5nLiIpOworCQkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCQkJfQorCQkJYnVmID0gKHU4KilwYWdlX2FkZHJlc3MocGFnZSkgKyBwYWdlX29mczsKKwkJCWJpdCA9IGRhdGFfcG9zICYgNzsKKwkJCWRhdGFfcG9zICY9IH43dWxsOworCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGlubmVyIGZvciBsb29wOiBzaXplIDB4JXgsICIKKwkJCQkJImRhdGFfcG9zIDB4JWxseCwgYml0IDB4JWxseCIsIHNpemUsCisJCQkJCShsb25nIGxvbmcpZGF0YV9wb3MsIChsb25nIGxvbmcpYml0KTsKKwkJCWZvciAoOyBiaXQgPCBzaXplICYmIGRhdGFfcG9zICsgYml0IDwgcGFzc19lbmQ7CisJCQkJCWJpdCAmPSB+N3VsbCwgYml0ICs9IDgpIHsKKwkJCQlieXRlID0gYnVmICsgKGJpdCA+PiAzKTsKKwkJCQlpZiAoKmJ5dGUgPT0gMHhmZikKKwkJCQkJY29udGludWU7CisJCQkJYiA9IGZmeigodW5zaWduZWQgbG9uZykqYnl0ZSk7CisJCQkJaWYgKGIgPCA4ICYmIGIgPj0gKGJpdCAmIDcpKSB7CisJCQkJCWxsID0gZGF0YV9wb3MgKyAoYml0ICYgfjd1bGwpICsgYjsKKwkJCQkJaWYgKHVubGlrZWx5KGxsID4gKDFsbCA8PCAzMikpKSB7CisJCQkJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQkJfQorCQkJCQkqYnl0ZSB8PSAxIDw8IGI7CisJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJCQludGZzX2RlYnVnKCJEb25lLiAgKEZvdW5kIGFuZCAiCisJCQkJCQkJImFsbG9jYXRlZCBtZnQgcmVjb3JkICIKKwkJCQkJCQkiMHglbGx4LikiLAorCQkJCQkJCShsb25nIGxvbmcpbGwpOworCQkJCQlyZXR1cm4gbGw7CisJCQkJfQorCQkJfQorCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgaW5uZXIgZm9yIGxvb3A6IHNpemUgMHgleCwgIgorCQkJCQkiZGF0YV9wb3MgMHglbGx4LCBiaXQgMHglbGx4Iiwgc2l6ZSwKKwkJCQkJKGxvbmcgbG9uZylkYXRhX3BvcywgKGxvbmcgbG9uZyliaXQpOworCQkJZGF0YV9wb3MgKz0gc2l6ZTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZW5kIG9mIHRoZSBwYXNzIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldCwKKwkJCSAqIGNvbnRpbnVlIHNlYXJjaGluZyB0aGUgbWZ0IGJpdG1hcCBmb3IgYSB6ZXJvIGJpdC4KKwkJCSAqLworCQkJaWYgKGRhdGFfcG9zIDwgcGFzc19lbmQpCisJCQkJY29udGludWU7CisJCX0KKwkJLyogRG8gdGhlIG5leHQgcGFzcy4gKi8KKwkJaWYgKCsrcGFzcyA9PSAyKSB7CisJCQkvKgorCQkJICogU3RhcnRpbmcgdGhlIHNlY29uZCBwYXNzLCBpbiB3aGljaCB3ZSBzY2FuIHRoZSBmaXJzdAorCQkJICogcGFydCBvZiB0aGUgem9uZSB3aGljaCB3ZSBvbWl0dGVkIGVhcmxpZXIuCisJCQkgKi8KKwkJCXBhc3NfZW5kID0gcGFzc19zdGFydDsKKwkJCWRhdGFfcG9zID0gcGFzc19zdGFydCA9IDI0OworCQkJbnRmc19kZWJ1ZygicGFzcyAlaSwgcGFzc19zdGFydCAweCVsbHgsIHBhc3NfZW5kICIKKwkJCQkJIjB4JWxseC4iLCBwYXNzLCAobG9uZyBsb25nKXBhc3Nfc3RhcnQsCisJCQkJCShsb25nIGxvbmcpcGFzc19lbmQpOworCQkJaWYgKGRhdGFfcG9zID49IHBhc3NfZW5kKQorCQkJCWJyZWFrOworCQl9CisJfQorCS8qIE5vIGZyZWUgbWZ0IHJlY29yZHMgaW4gY3VycmVudGx5IGluaXRpYWxpemVkIG1mdCBiaXRtYXAuICovCisJbnRmc19kZWJ1ZygiRG9uZS4gIChObyBmcmVlIG1mdCByZWNvcmRzIGxlZnQgaW4gY3VycmVudGx5IGluaXRpYWxpemVkICIKKwkJCSJtZnQgYml0bWFwLikiKTsKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworLyoqCisgKiBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrIC0gZXh0ZW5kIG1mdCBiaXRtYXAgYnkgYSBjbHVzdGVyCisgKiBAdm9sOgl2b2x1bWUgb24gd2hpY2ggdG8gZXh0ZW5kIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZQorICoKKyAqIEV4dGVuZCB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgYnkgb25lIGNsdXN0ZXIuCisgKgorICogTm90ZTogT25seSBjaGFuZ2VzIGFsbG9jYXRlZF9zaXplLCBpLmUuIGRvZXMgbm90IHRvdWNoIGluaXRpYWxpemVkX3NpemUgb3IKKyAqIGRhdGFfc2l6ZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogLSBDYWxsZXIgbXVzdCBob2xkIHZvbC0+bWZ0Ym1wX2xvY2sgZm9yIHdyaXRpbmcuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pLT5ydW5saXN0LmxvY2sgZm9yCisgKgkgICAgICB3cml0aW5nIGFuZCByZWxlYXNlcyBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB2b2wtPmxjbmJtcF9sb2NrIGZvciB3cml0aW5nIGFuZCByZWxlYXNlcyBpdAorICoJICAgICAgYmVmb3JlIHJldHVybmluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wpCit7CisJTENOIGxjbjsKKwlzNjQgbGw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pOworCXJ1bmxpc3RfZWxlbWVudCAqcmwsICpybDIgPSBOVUxMOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHggPSBOVUxMOworCU1GVF9SRUNPUkQgKm1yZWM7CisJQVRUUl9SRUNPUkQgKmEgPSBOVUxMOworCWludCByZXQsIG1wX3NpemU7CisJdTMyIG9sZF9hbGVuID0gMDsKKwl1OCAqYiwgdGI7CisJc3RydWN0IHsKKwkJdTggYWRkZWRfY2x1c3RlcjoxOworCQl1OCBhZGRlZF9ydW46MTsKKwkJdTggbXBfcmVidWlsdDoxOworCX0gc3RhdHVzID0geyAwLCAwLCAwIH07CisKKwludGZzX2RlYnVnKCJFeHRlbmRpbmcgbWZ0IGJpdG1hcCBhbGxvY2F0aW9uLiIpOworCW1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCW1mdGJtcF9uaSA9IE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pOworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBsYXN0IGxjbiBvZiB0aGUgbWZ0IGJpdG1hcC4gIFRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUKKwkgKiBtZnQgYml0bWFwIGNhbm5vdCBiZSB6ZXJvIHNvIHdlIGFyZSBvayB0byBkbyB0aGlzLgorCSAqIG50ZnNfZmluZF92Y24oKSByZXR1cm5zIHRoZSBydW5saXN0IGxvY2tlZCBvbiBzdWNjZXNzLgorCSAqLworCXJsID0gbnRmc19maW5kX3ZjbihtZnRibXBfbmksIChtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplIC0gMSkgPj4KKwkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOworCWlmICh1bmxpa2VseShJU19FUlIocmwpIHx8ICFybC0+bGVuZ3RoIHx8IHJsLT5sY24gPCAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGxhc3QgYWxsb2NhdGVkICIKKwkJCQkiY2x1c3RlciBvZiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJaWYgKCFJU19FUlIocmwpKSB7CisJCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCQkJcmV0ID0gLUVJTzsKKwkJfSBlbHNlCisJCQlyZXQgPSBQVFJfRVJSKHJsKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbGNuID0gcmwtPmxjbiArIHJsLT5sZW5ndGg7CisJbnRmc19kZWJ1ZygiTGFzdCBsY24gb2YgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgaXMgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKWxjbik7CisJLyoKKwkgKiBBdHRlbXB0IHRvIGdldCB0aGUgY2x1c3RlciBmb2xsb3dpbmcgdGhlIGxhc3QgYWxsb2NhdGVkIGNsdXN0ZXIgYnkKKwkgKiBoYW5kIGFzIGl0IG1heSBiZSBpbiB0aGUgTUZUIHpvbmUgc28gdGhlIGFsbG9jYXRvciB3b3VsZCBub3QgZ2l2ZSBpdAorCSAqIHRvIHVzLgorCSAqLworCWxsID0gbGNuID4+IDM7CisJcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5sY25ibXBfaW5vLT5pX21hcHBpbmcsCisJCQlsbCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGZyb20gbGNuIGJpdG1hcC4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJfQorCWIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIChsbCAmIH5QQUdFX0NBQ0hFX01BU0spOworCXRiID0gMSA8PCAobGNuICYgN3VsbCk7CisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaWYgKCpiICE9IDB4ZmYgJiYgISgqYiAmIHRiKSkgeworCQkvKiBOZXh0IGNsdXN0ZXIgaXMgZnJlZSwgYWxsb2NhdGUgaXQuICovCisJCSpiIHw9IHRiOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkvKiBVcGRhdGUgdGhlIG1mdCBiaXRtYXAgcnVubGlzdC4gKi8KKwkJcmwtPmxlbmd0aCsrOworCQlybFsxXS52Y24rKzsKKwkJc3RhdHVzLmFkZGVkX2NsdXN0ZXIgPSAxOworCQludGZzX2RlYnVnKCJBcHBlbmRpbmcgb25lIGNsdXN0ZXIgdG8gbWZ0IGJpdG1hcC4iKTsKKwl9IGVsc2UgeworCQl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJLyogQWxsb2NhdGUgYSBjbHVzdGVyIGZyb20gdGhlIERBVEFfWk9ORS4gKi8KKwkJcmwyID0gbnRmc19jbHVzdGVyX2FsbG9jKHZvbCwgcmxbMV0udmNuLCAxLCBsY24sIERBVEFfWk9ORSk7CisJCWlmIChJU19FUlIocmwyKSkgeworCQkJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGNsdXN0ZXIgZm9yICIKKwkJCQkJInRoZSBtZnQgYml0bWFwLiIpOworCQkJcmV0dXJuIFBUUl9FUlIocmwyKTsKKwkJfQorCQlybCA9IG50ZnNfcnVubGlzdHNfbWVyZ2UobWZ0Ym1wX25pLT5ydW5saXN0LnJsLCBybDIpOworCQlpZiAoSVNfRVJSKHJsKSkgeworCQkJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtZXJnZSBydW5saXN0cyBmb3IgbWZ0ICIKKwkJCQkJImJpdG1hcC4iKTsKKwkJCWlmIChudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKHZvbCwgcmwyKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBkZWFsb2NhdGUgIgorCQkJCQkJImFsbG9jYXRlZCBjbHVzdGVyLiVzIiwgZXMpOworCQkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCX0KKwkJCW50ZnNfZnJlZShybDIpOworCQkJcmV0dXJuIFBUUl9FUlIocmwpOworCQl9CisJCW1mdGJtcF9uaS0+cnVubGlzdC5ybCA9IHJsOworCQlzdGF0dXMuYWRkZWRfcnVuID0gMTsKKwkJbnRmc19kZWJ1ZygiQWRkaW5nIG9uZSBydW4gdG8gbWZ0IGJpdG1hcC4iKTsKKwkJLyogRmluZCB0aGUgbGFzdCBydW4gaW4gdGhlIG5ldyBydW5saXN0LiAqLworCQlmb3IgKDsgcmxbMV0ubGVuZ3RoOyBybCsrKQorCQkJOworCX0KKwkvKgorCSAqIFVwZGF0ZSB0aGUgYXR0cmlidXRlIHJlY29yZCBhcyB3ZWxsLiAgTm90ZTogQHJsIGlzIHRoZSBsYXN0CisJICogKG5vbi10ZXJtaW5hdG9yKSBydW5saXN0IGVsZW1lbnQgb2YgbWZ0IGJpdG1hcC4KKwkgKi8KKwltcmVjID0gbWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwlpZiAoSVNfRVJSKG1yZWMpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgbWZ0IHJlY29yZC4iKTsKKwkJcmV0ID0gUFRSX0VSUihtcmVjKTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobWZ0X25pLCBtcmVjKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGdldCBzZWFyY2ggY29udGV4dC4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwlyZXQgPSBudGZzX2F0dHJfbG9va3VwKG1mdGJtcF9uaS0+dHlwZSwgbWZ0Ym1wX25pLT5uYW1lLAorCQkJbWZ0Ym1wX25pLT5uYW1lX2xlbiwgQ0FTRV9TRU5TSVRJVkUsIHJsWzFdLnZjbiwgTlVMTCwKKwkJCTAsIGN0eCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgbGFzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwlsbCA9IHNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKTsKKwkvKiBTZWFyY2ggYmFjayBmb3IgdGhlIHByZXZpb3VzIGxhc3QgYWxsb2NhdGVkIGNsdXN0ZXIgb2YgbWZ0IGJpdG1hcC4gKi8KKwlmb3IgKHJsMiA9IHJsOyBybDIgPiBtZnRibXBfbmktPnJ1bmxpc3Qucmw7IHJsMi0tKSB7CisJCWlmIChsbCA+PSBybDItPnZjbikKKwkJCWJyZWFrOworCX0KKwlCVUdfT04obGwgPCBybDItPnZjbik7CisJQlVHX09OKGxsID49IHJsMi0+dmNuICsgcmwyLT5sZW5ndGgpOworCS8qIEdldCB0aGUgc2l6ZSBmb3IgdGhlIG5ldyBtYXBwaW5nIHBhaXJzIGFycmF5IGZvciB0aGlzIGV4dGVudC4gKi8KKwltcF9zaXplID0gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyh2b2wsIHJsMiwgbGwpOworCWlmICh1bmxpa2VseShtcF9zaXplIDw9IDApKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkdldCBzaXplIGZvciBtYXBwaW5nIHBhaXJzIGZhaWxlZCBmb3IgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZSBleHRlbnQuIik7CisJCXJldCA9IG1wX3NpemU7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBFeHBhbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQgaWYgbmVjZXNzYXJ5LiAqLworCW9sZF9hbGVuID0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKTsKKwlyZXQgPSBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShjdHgtPm1yZWMsIGEsIG1wX3NpemUgKworCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlpZiAocmV0ICE9IC1FTk9TUEMpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXNpemUgYXR0cmlidXRlICIKKwkJCQkJInJlY29yZCBmb3IgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHVuZG9fYWxsb2M7CisJCX0KKwkJLy8gVE9ETzogRGVhbCB3aXRoIHRoaXMgYnkgbW92aW5nIHRoaXMgZXh0ZW50IHRvIGEgbmV3IG1mdAorCQkvLyByZWNvcmQgb3IgYnkgc3RhcnRpbmcgYSBuZXcgZXh0ZW50IGluIGEgbmV3IG1mdCByZWNvcmQgb3IgYnkKKwkJLy8gbW92aW5nIG90aGVyIGF0dHJpYnV0ZXMgb3V0IG9mIHRoaXMgbWZ0IHJlY29yZC4KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBzcGFjZSBpbiB0aGlzIG1mdCByZWNvcmQgdG8gIgorCQkJCSJhY2NvbW9kYXRlIGV4dGVuZGVkIG1mdCBiaXRtYXAgYXR0cmlidXRlICIKKwkJCQkiZXh0ZW50LiAgQ2Fubm90IGhhbmRsZSB0aGlzIHlldC4iKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJc3RhdHVzLm1wX3JlYnVpbHQgPSAxOworCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGRpcmVjdGx5IGludG8gdGhlIGF0dHIgcmVjb3JkLiAqLworCXJldCA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQltcF9zaXplLCBybDIsIGxsLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBVcGRhdGUgdGhlIGhpZ2hlc3RfdmNuLiAqLworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KHJsWzFdLnZjbiAtIDEpOworCS8qCisJICogV2Ugbm93IGhhdmUgZXh0ZW5kZWQgdGhlIG1mdCBiaXRtYXAgYWxsb2NhdGVkX3NpemUgYnkgb25lIGNsdXN0ZXIuCisJICogUmVmbGVjdCB0aGlzIGluIHRoZSBudGZzX2lub2RlIHN0cnVjdHVyZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQuCisJICovCisJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJLyoKKwkJICogV2UgYXJlIG5vdCBpbiB0aGUgZmlyc3QgYXR0cmlidXRlIGV4dGVudCwgc3dpdGNoIHRvIGl0LCBidXQKKwkJICogZmlyc3QgZW5zdXJlIHRoZSBjaGFuZ2VzIHdpbGwgbWFrZSBpdCB0byBkaXNrIGxhdGVyLgorCQkgKi8KKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwkJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCQltZnRibXBfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwKKwkJCQkwLCBjdHgpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgYXR0cmlidXRlICIKKwkJCQkJImV4dGVudCBvZiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gcmVzdG9yZV91bmRvX2FsbG9jOworCQl9CisJCWEgPSBjdHgtPmF0dHI7CisJfQorCW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gdm9sLT5jbHVzdGVyX3NpemU7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUgPQorCQkJY3B1X3RvX3NsZTY0KG1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUpOworCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3Jlc3RvcmVfdW5kb19hbGxvYzoKKwludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCW1mdGJtcF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCBybFsxXS52Y24sIE5VTEwsCisJCQkwLCBjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGxhc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCisJCQkJIm1mdCBiaXRtYXAgYXR0cmlidXRlLiVzIiwgZXMpOworCQltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplICs9IHZvbC0+Y2x1c3Rlcl9zaXplOworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCQkvKgorCQkgKiBUaGUgb25seSB0aGluZyB0aGF0IGlzIG5vdyB3cm9uZyBpcyAtPmFsbG9jYXRlZF9zaXplIG9mIHRoZQorCQkgKiBiYXNlIGF0dHJpYnV0ZSBleHRlbnQgd2hpY2ggY2hrZHNrIHNob3VsZCBiZSBhYmxlIHRvIGZpeC4KKwkJICovCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3ZjbiA9IGNwdV90b19zbGU2NChybFsxXS52Y24gLSAyKTsKK3VuZG9fYWxsb2M6CisJaWYgKHN0YXR1cy5hZGRlZF9jbHVzdGVyKSB7CisJCS8qIFRydW5jYXRlIHRoZSBsYXN0IHJ1biBpbiB0aGUgcnVubGlzdCBieSBvbmUgY2x1c3Rlci4gKi8KKwkJcmwtPmxlbmd0aC0tOworCQlybFsxXS52Y24tLTsKKwl9IGVsc2UgaWYgKHN0YXR1cy5hZGRlZF9ydW4pIHsKKwkJbGNuID0gcmwtPmxjbjsKKwkJLyogUmVtb3ZlIHRoZSBsYXN0IHJ1biBmcm9tIHRoZSBydW5saXN0LiAqLworCQlybC0+bGNuID0gcmxbMV0ubGNuOworCQlybC0+bGVuZ3RoID0gMDsKKwl9CisJLyogRGVhbGxvY2F0ZSB0aGUgY2x1c3Rlci4gKi8KKwlkb3duX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlpZiAobnRmc19iaXRtYXBfY2xlYXJfYml0KHZvbC0+bGNuYm1wX2lubywgbGNuKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZnJlZSBhbGxvY2F0ZWQgY2x1c3Rlci4lcyIsIGVzKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaWYgKHN0YXR1cy5tcF9yZWJ1aWx0KSB7CisJCWlmIChudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQkJb2xkX2FsZW4gLSBsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQkJcmwyLCBsbCwgTlVMTCkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIG1hcHBpbmcgcGFpcnMgIgorCQkJCQkiYXJyYXkuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJaWYgKG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKGN0eC0+bXJlYywgYSwgb2xkX2FsZW4pKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVzdG9yZSBhdHRyaWJ1dGUgIgorCQkJCQkicmVjb3JkLiVzIiwgZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQl9CisJCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwl9CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKCFJU19FUlIobXJlYykpCisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbnRmc19tZnRfYml0bWFwX2V4dGVuZF9pbml0aWFsaXplZF9ub2xvY2sgLSBleHRlbmQgbWZ0Ym1wIGluaXRpYWxpemVkIGRhdGEKKyAqIEB2b2w6CXZvbHVtZSBvbiB3aGljaCB0byBleHRlbmQgdGhlIG1mdCBiaXRtYXAgYXR0cmlidXRlCisgKgorICogRXh0ZW5kIHRoZSBpbml0aWFsaXplZCBwb3J0aW9uIG9mIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZSBvbiB0aGUgbnRmcworICogdm9sdW1lIEB2b2wgYnkgOCBieXRlcy4KKyAqCisgKiBOb3RlOiAgT25seSBjaGFuZ2VzIGluaXRpYWxpemVkX3NpemUgYW5kIGRhdGFfc2l6ZSwgaS5lLiByZXF1aXJlcyB0aGF0CisgKiBhbGxvY2F0ZWRfc2l6ZSBpcyBiaWcgZW5vdWdoIHRvIGZpdCB0aGUgbmV3IGluaXRpYWxpemVkX3NpemUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm9yIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdm9sLT5tZnRibXBfbG9jayBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2luaXRpYWxpemVkX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sKQoreworCXM2NCBvbGRfZGF0YV9zaXplLCBvbGRfaW5pdGlhbGl6ZWRfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgKm1mdGJtcF92aTsKKwludGZzX2lub2RlICptZnRfbmksICptZnRibXBfbmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptcmVjOworCUFUVFJfUkVDT1JEICphOworCWludCByZXQ7CisKKwludGZzX2RlYnVnKCJFeHRlbmRpbmcgbWZ0IGJpdG1hcCBpbml0aWFpbGl6ZWQgKGFuZCBkYXRhKSBzaXplLiIpOworCW1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCW1mdGJtcF92aSA9IHZvbC0+bWZ0Ym1wX2lubzsKKwltZnRibXBfbmkgPSBOVEZTX0kobWZ0Ym1wX3ZpKTsKKwkvKiBHZXQgdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuIik7CisJCXJldHVybiBQVFJfRVJSKG1yZWMpOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobWZ0X25pLCBtcmVjKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGdldCBzZWFyY2ggY29udGV4dC4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCW1mdGJtcF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGZpcnN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJaWYgKHJldCA9PSAtRU5PRU5UKQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byBwdXRfZXJyX291dDsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwlvbGRfZGF0YV9zaXplID0gbWZ0Ym1wX3ZpLT5pX3NpemU7CisJb2xkX2luaXRpYWxpemVkX3NpemUgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CisJLyoKKwkgKiBXZSBjYW4gc2ltcGx5IHVwZGF0ZSB0aGUgaW5pdGlhbGl6ZWRfc2l6ZSBiZWZvcmUgZmlsbGluZyB0aGUgc3BhY2UKKwkgKiB3aXRoIHplcm9lcyBiZWNhdXNlIHRoZSBjYWxsZXIgaXMgaG9sZGluZyB0aGUgbWZ0IGJpdG1hcCBsb2NrIGZvcgorCSAqIHdyaXRpbmcgd2hpY2ggZW5zdXJlcyB0aGF0IG5vIG9uZSBlbHNlIGlzIHRyeWluZyB0byBhY2Nlc3MgdGhlIGRhdGEuCisJICovCisJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplICs9IDg7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gbWZ0Ym1wX3ZpLT5pX3NpemUpIHsKKwkJbWZ0Ym1wX3ZpLT5pX3NpemUgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CisJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSA9CisJCQkJY3B1X3RvX3NsZTY0KG1mdGJtcF92aS0+aV9zaXplKTsKKwl9CisJLyogRW5zdXJlIHRoZSBjaGFuZ2VzIG1ha2UgaXQgdG8gZGlzay4gKi8KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJLyogSW5pdGlhbGl6ZSB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgdmFsdWUgd2l0aCB6ZXJvZXMuICovCisJcmV0ID0gbnRmc19hdHRyX3NldChtZnRibXBfbmksIG9sZF9pbml0aWFsaXplZF9zaXplLCA4LCAwKTsKKwlpZiAobGlrZWx5KCFyZXQpKSB7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoV3JvdGUgZWlnaHQgaW5pdGlhbGl6ZWQgYnl0ZXMgdG8gbWZ0ICIKKwkJCQkiYml0bWFwLiIpOworCQlyZXR1cm4gMDsKKwl9CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIHRvIG1mdCBiaXRtYXAuIik7CisJLyogVHJ5IHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKG50ZnNfYXR0cl9sb29rdXAobWZ0Ym1wX25pLT50eXBlLCBtZnRibXBfbmktPm5hbWUsCisJCQltZnRibXBfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKK3B1dF9lcnJfb3V0OgorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKK3VubV9lcnJfb3V0OgorCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgPSBvbGRfaW5pdGlhbGl6ZWRfc2l6ZTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplID0KKwkJCWNwdV90b19zbGU2NChvbGRfaW5pdGlhbGl6ZWRfc2l6ZSk7CisJaWYgKG1mdGJtcF92aS0+aV9zaXplICE9IG9sZF9kYXRhX3NpemUpIHsKKwkJbWZ0Ym1wX3ZpLT5pX3NpemUgPSBvbGRfZGF0YV9zaXplOworCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPSBjcHVfdG9fc2xlNjQob2xkX2RhdGFfc2l6ZSk7CisJfQorCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwludGZzX2RlYnVnKCJSZXN0b3JlZCBzdGF0dXMgb2YgbWZ0Ym1wOiBhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsICIKKwkJCSJkYXRhX3NpemUgMHglbGx4LCBpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAorCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRibXBfdmktPmlfc2l6ZSwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBudGZzX21mdF9kYXRhX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayAtIGV4dGVuZCBtZnQgZGF0YSBhdHRyaWJ1dGUKKyAqIEB2b2w6CXZvbHVtZSBvbiB3aGljaCB0byBleHRlbmQgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZQorICoKKyAqIEV4dGVuZCB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sIGJ5IDE2IG1mdCByZWNvcmRzCisgKiB3b3J0aCBvZiBjbHVzdGVycyBvciBpZiBub3QgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ5IG9uZSBtZnQgcmVjb3JkIHdvcnRoCisgKiBvZiBjbHVzdGVycy4KKyAqCisgKiBOb3RlOiAgT25seSBjaGFuZ2VzIGFsbG9jYXRlZF9zaXplLCBpLmUuIGRvZXMgbm90IHRvdWNoIGluaXRpYWxpemVkX3NpemUgb3IKKyAqIGRhdGFfc2l6ZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogLSBDYWxsZXIgbXVzdCBob2xkIHZvbC0+bWZ0Ym1wX2xvY2sgZm9yIHdyaXRpbmcuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIE5URlNfSSh2b2wtPm1mdF9pbm8pLT5ydW5saXN0LmxvY2sgZm9yCisgKgkgICAgICB3cml0aW5nIGFuZCByZWxlYXNlcyBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiBjYWxscyBmdW5jdGlvbnMgd2hpY2ggdGFrZSB2b2wtPmxjbmJtcF9sb2NrIGZvcgorICoJICAgICAgd3JpdGluZyBhbmQgcmVsZWFzZSBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICovCitzdGF0aWMgaW50IG50ZnNfbWZ0X2RhdGFfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wpCit7CisJTENOIGxjbjsKKwlWQ04gb2xkX2xhc3RfdmNuOworCXM2NCBtaW5fbnIsIG5yLCBsbCA9IDA7CisJbnRmc19pbm9kZSAqbWZ0X25pOworCXJ1bmxpc3RfZWxlbWVudCAqcmwsICpybDI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCA9IE5VTEw7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwlBVFRSX1JFQ09SRCAqYSA9IE5VTEw7CisJaW50IHJldCwgbXBfc2l6ZTsKKwl1MzIgb2xkX2FsZW4gPSAwOworCUJPT0wgbXBfcmVidWlsdCA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRXh0ZW5kaW5nIG1mdCBkYXRhIGFsbG9jYXRpb24uIik7CisJbWZ0X25pID0gTlRGU19JKHZvbC0+bWZ0X2lubyk7CisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHByZWZlcnJlZCBhbGxvY2F0aW9uIGxvY2F0aW9uLCBpLmUuIHRoZSBsYXN0IGxjbiBvZgorCSAqIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUuICBUaGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlIG1mdCBkYXRhCisJICogYXR0cmlidXRlIGNhbm5vdCBiZSB6ZXJvIHNvIHdlIGFyZSBvayB0byBkbyB0aGlzLgorCSAqIG50ZnNfZmluZF92Y24oKSByZXR1cm5zIHRoZSBydW5saXN0IGxvY2tlZCBvbiBzdWNjZXNzLgorCSAqLworCXJsID0gbnRmc19maW5kX3ZjbihtZnRfbmksIChtZnRfbmktPmFsbG9jYXRlZF9zaXplIC0gMSkgPj4KKwkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOworCWlmICh1bmxpa2VseShJU19FUlIocmwpIHx8ICFybC0+bGVuZ3RoIHx8IHJsLT5sY24gPCAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGxhc3QgYWxsb2NhdGVkICIKKwkJCQkiY2x1c3RlciBvZiBtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCWlmICghSVNfRVJSKHJsKSkgeworCQkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldCA9IC1FSU87CisJCX0gZWxzZQorCQkJcmV0ID0gUFRSX0VSUihybCk7CisJCXJldHVybiByZXQ7CisJfQorCWxjbiA9IHJsLT5sY24gKyBybC0+bGVuZ3RoOworCW50ZnNfZGVidWcoIkxhc3QgbGNuIG9mIG1mdCBkYXRhIGF0dHJpYnV0ZSBpcyAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbGNuKTsKKwkvKiBNaW5pbXVtIGFsbG9jYXRpb24gaXMgb25lIG1mdCByZWNvcmQgd29ydGggb2YgY2x1c3RlcnMuICovCisJbWluX25yID0gdm9sLT5tZnRfcmVjb3JkX3NpemUgPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwlpZiAoIW1pbl9ucikKKwkJbWluX25yID0gMTsKKwkvKiBXYW50IHRvIGFsbG9jYXRlIDE2IG1mdCByZWNvcmRzIHdvcnRoIG9mIGNsdXN0ZXJzLiAqLworCW5yID0gdm9sLT5tZnRfcmVjb3JkX3NpemUgPDwgNCA+PiB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCWlmICghbnIpCisJCW5yID0gbWluX25yOworCS8qIEVuc3VyZSB3ZSBkbyBub3QgZ28gYWJvdmUgMl4zMi0xIG1mdCByZWNvcmRzLiAqLworCWlmICh1bmxpa2VseSgobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSArCisJCQkobnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykpID4+CisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID49ICgxbGwgPDwgMzIpKSkgeworCQluciA9IG1pbl9ucjsKKwkJaWYgKHVubGlrZWx5KChtZnRfbmktPmFsbG9jYXRlZF9zaXplICsKKwkJCQkobnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykpID4+CisJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PSAoMWxsIDw8IDMyKSkpIHsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiQ2Fubm90IGFsbG9jYXRlIG1mdCByZWNvcmQgIgorCQkJCQkiYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5vZGVzICIKKwkJCQkJIigyXjMyKSBoYXMgYWxyZWFkeSBiZWVuIHJlYWNoZWQuIik7CisJCQl1cF93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOworCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKwl9CisJbnRmc19kZWJ1ZygiVHJ5aW5nIG1mdCBkYXRhIGFsbG9jYXRpb24gd2l0aCAlcyBjbHVzdGVyIGNvdW50ICVsbGkuIiwKKwkJCW5yID4gbWluX25yID8gImRlZmF1bHQiIDogIm1pbmltYWwiLCAobG9uZyBsb25nKW5yKTsKKwlvbGRfbGFzdF92Y24gPSBybFsxXS52Y247CisJZG8geworCQlybDIgPSBudGZzX2NsdXN0ZXJfYWxsb2Modm9sLCBvbGRfbGFzdF92Y24sIG5yLCBsY24sIE1GVF9aT05FKTsKKwkJaWYgKGxpa2VseSghSVNfRVJSKHJsMikpKQorCQkJYnJlYWs7CisJCWlmIChQVFJfRVJSKHJsMikgIT0gLUVOT1NQQyB8fCBuciA9PSBtaW5fbnIpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgbWluaW1hbCAiCisJCQkJCSJudW1iZXIgb2YgY2x1c3RlcnMgKCVsbGkpIGZvciB0aGUgIgorCQkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiIsIChsb25nIGxvbmcpbnIpOworCQkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldHVybiBQVFJfRVJSKHJsMik7CisJCX0KKwkJLyoKKwkJICogVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSB0byBkbyB0aGUgYWxsb2NhdGlvbiwgYnV0IHRoZXJlCisJCSAqIG1pZ2h0IGJlIGVub3VnaCBzcGFjZSB0byBkbyBhIG1pbmltYWwgYWxsb2NhdGlvbiBzbyB0cnkgdGhhdAorCQkgKiBiZWZvcmUgZmFpbGluZy4KKwkJICovCisJCW5yID0gbWluX25yOworCQludGZzX2RlYnVnKCJSZXRyeWluZyBtZnQgZGF0YSBhbGxvY2F0aW9uIHdpdGggbWluaW1hbCBjbHVzdGVyICIKKwkJCQkiY291bnQgJWxsaS4iLCAobG9uZyBsb25nKW5yKTsKKwl9IHdoaWxlICgxKTsKKwlybCA9IG50ZnNfcnVubGlzdHNfbWVyZ2UobWZ0X25pLT5ydW5saXN0LnJsLCBybDIpOworCWlmIChJU19FUlIocmwpKSB7CisJCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtZXJnZSBydW5saXN0cyBmb3IgbWZ0IGRhdGEgIgorCQkJCSJhdHRyaWJ1dGUuIik7CisJCWlmIChudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKHZvbCwgcmwyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGRlYWxvY2F0ZSBjbHVzdGVycyAiCisJCQkJCSJmcm9tIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJbnRmc19mcmVlKHJsMik7CisJCXJldHVybiBQVFJfRVJSKHJsKTsKKwl9CisJbWZ0X25pLT5ydW5saXN0LnJsID0gcmw7CisJbnRmc19kZWJ1ZygiQWxsb2NhdGVkICVsbGkgY2x1c3RlcnMuIiwgbnIpOworCS8qIEZpbmQgdGhlIGxhc3QgcnVuIGluIHRoZSBuZXcgcnVubGlzdC4gKi8KKwlmb3IgKDsgcmxbMV0ubGVuZ3RoOyBybCsrKQorCQk7CisJLyogVXBkYXRlIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIGFzIHdlbGwuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuIik7CisJCXJldCA9IFBUUl9FUlIobXJlYyk7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRfbmktPnR5cGUsIG1mdF9uaS0+bmFtZSwgbWZ0X25pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCBybFsxXS52Y24sIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgbGFzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiIpOworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJbGwgPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3Zjbik7CisJLyogU2VhcmNoIGJhY2sgZm9yIHRoZSBwcmV2aW91cyBsYXN0IGFsbG9jYXRlZCBjbHVzdGVyIG9mIG1mdCBiaXRtYXAuICovCisJZm9yIChybDIgPSBybDsgcmwyID4gbWZ0X25pLT5ydW5saXN0LnJsOyBybDItLSkgeworCQlpZiAobGwgPj0gcmwyLT52Y24pCisJCQlicmVhazsKKwl9CisJQlVHX09OKGxsIDwgcmwyLT52Y24pOworCUJVR19PTihsbCA+PSBybDItPnZjbiArIHJsMi0+bGVuZ3RoKTsKKwkvKiBHZXQgdGhlIHNpemUgZm9yIHRoZSBuZXcgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgdGhpcyBleHRlbnQuICovCisJbXBfc2l6ZSA9IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnModm9sLCBybDIsIGxsKTsKKwlpZiAodW5saWtlbHkobXBfc2l6ZSA8PSAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJHZXQgc2l6ZSBmb3IgbWFwcGluZyBwYWlycyBmYWlsZWQgZm9yICIKKwkJCQkibWZ0IGRhdGEgYXR0cmlidXRlIGV4dGVudC4iKTsKKwkJcmV0ID0gbXBfc2l6ZTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCS8qIEV4cGFuZCB0aGUgYXR0cmlidXRlIHJlY29yZCBpZiBuZWNlc3NhcnkuICovCisJb2xkX2FsZW4gPSBsZTMyX3RvX2NwdShhLT5sZW5ndGgpOworCXJldCA9IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKGN0eC0+bXJlYywgYSwgbXBfc2l6ZSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCkpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlc2l6ZSBhdHRyaWJ1dGUgIgorCQkJCQkicmVjb3JkIGZvciBtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHVuZG9fYWxsb2M7CisJCX0KKwkJLy8gVE9ETzogRGVhbCB3aXRoIHRoaXMgYnkgbW92aW5nIHRoaXMgZXh0ZW50IHRvIGEgbmV3IG1mdAorCQkvLyByZWNvcmQgb3IgYnkgc3RhcnRpbmcgYSBuZXcgZXh0ZW50IGluIGEgbmV3IG1mdCByZWNvcmQgb3IgYnkKKwkJLy8gbW92aW5nIG90aGVyIGF0dHJpYnV0ZXMgb3V0IG9mIHRoaXMgbWZ0IHJlY29yZC4KKwkJLy8gTm90ZTogVXNlIHRoZSBzcGVjaWFsIHJlc2VydmVkIG1mdCByZWNvcmRzIGFuZCBlbnN1cmUgdGhhdAorCQkvLyB0aGlzIGV4dGVudCBpcyBub3QgcmVxdWlyZWQgdG8gZmluZCB0aGUgbWZ0IHJlY29yZCBpbgorCQkvLyBxdWVzdGlvbi4KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBzcGFjZSBpbiB0aGlzIG1mdCByZWNvcmQgdG8gIgorCQkJCSJhY2NvbW9kYXRlIGV4dGVuZGVkIG1mdCBkYXRhIGF0dHJpYnV0ZSAiCisJCQkJImV4dGVudC4gIENhbm5vdCBoYW5kbGUgdGhpcyB5ZXQuIik7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCW1wX3JlYnVpbHQgPSBUUlVFOworCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGRpcmVjdGx5IGludG8gdGhlIGF0dHIgcmVjb3JkLiAqLworCXJldCA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQltcF9zaXplLCBybDIsIGxsLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycyBhcnJheSBvZiAiCisJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBVcGRhdGUgdGhlIGhpZ2hlc3RfdmNuLiAqLworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KHJsWzFdLnZjbiAtIDEpOworCS8qCisJICogV2Ugbm93IGhhdmUgZXh0ZW5kZWQgdGhlIG1mdCBkYXRhIGFsbG9jYXRlZF9zaXplIGJ5IG5yIGNsdXN0ZXJzLgorCSAqIFJlZmxlY3QgdGhpcyBpbiB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgYW5kIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLgorCSAqIEBybCBpcyB0aGUgbGFzdCAobm9uLXRlcm1pbmF0b3IpIHJ1bmxpc3QgZWxlbWVudCBvZiBtZnQgZGF0YQorCSAqIGF0dHJpYnV0ZS4KKwkgKi8KKwlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkvKgorCQkgKiBXZSBhcmUgbm90IGluIHRoZSBmaXJzdCBhdHRyaWJ1dGUgZXh0ZW50LCBzd2l0Y2ggdG8gaXQsIGJ1dAorCQkgKiBmaXJzdCBlbnN1cmUgdGhlIGNoYW5nZXMgd2lsbCBtYWtlIGl0IHRvIGRpc2sgbGF0ZXIuCisJCSAqLworCQlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCQltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQlyZXQgPSBudGZzX2F0dHJfbG9va3VwKG1mdF9uaS0+dHlwZSwgbWZ0X25pLT5uYW1lLAorCQkJCW1mdF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLAorCQkJCWN0eCk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBhdHRyaWJ1dGUgIgorCQkJCQkiZXh0ZW50IG9mIG1mdCBkYXRhIGF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gcmVzdG9yZV91bmRvX2FsbG9jOworCQl9CisJCWEgPSBjdHgtPmF0dHI7CisJfQorCW1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gbnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSk7CisJLyogRW5zdXJlIHRoZSBjaGFuZ2VzIG1ha2UgaXQgdG8gZGlzay4gKi8KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworcmVzdG9yZV91bmRvX2FsbG9jOgorCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChudGZzX2F0dHJfbG9va3VwKG1mdF9uaS0+dHlwZSwgbWZ0X25pLT5uYW1lLCBtZnRfbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIHJsWzFdLnZjbiwgTlVMTCwgMCwgY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBsYXN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCW1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gbnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJLyoKKwkJICogVGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBub3cgd3JvbmcgaXMgLT5hbGxvY2F0ZWRfc2l6ZSBvZiB0aGUKKwkJICogYmFzZSBhdHRyaWJ1dGUgZXh0ZW50IHdoaWNoIGNoa2RzayBzaG91bGQgYmUgYWJsZSB0byBmaXguCisJCSAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCXJldHVybiByZXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24gPSBjcHVfdG9fc2xlNjQob2xkX2xhc3RfdmNuIC0gMSk7Cit1bmRvX2FsbG9jOgorCWlmIChudGZzX2NsdXN0ZXJfZnJlZSh2b2wtPm1mdF9pbm8sIG9sZF9sYXN0X3ZjbiwgLTEpIDwgMCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZnJlZSBjbHVzdGVycyBmcm9tIG1mdCBkYXRhICIKKwkJCQkiYXR0cmlidXRlLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCWlmIChudGZzX3JsX3RydW5jYXRlX25vbG9jayh2b2wsICZtZnRfbmktPnJ1bmxpc3QsIG9sZF9sYXN0X3ZjbikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHRydW5jYXRlIG1mdCBkYXRhIGF0dHJpYnV0ZSAiCisJCQkJInJ1bmxpc3QuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJaWYgKG1wX3JlYnVpbHQpIHsKKwkJaWYgKG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArIGxlMTZfdG9fY3B1KAorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKKwkJCQlvbGRfYWxlbiAtIGxlMTZfdG9fY3B1KAorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKKwkJCQlybDIsIGxsLCBOVUxMKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlc3RvcmUgbWFwcGluZyBwYWlycyAiCisJCQkJCSJhcnJheS4lcyIsIGVzKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJfQorCQlpZiAobnRmc19hdHRyX3JlY29yZF9yZXNpemUoY3R4LT5tcmVjLCBhLCBvbGRfYWxlbikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIGF0dHJpYnV0ZSAiCisJCQkJCSJyZWNvcmQuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCX0KKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAoIUlTX0VSUihtcmVjKSkKKwkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBudGZzX21mdF9yZWNvcmRfbGF5b3V0IC0gbGF5b3V0IGFuIG1mdCByZWNvcmQgaW50byBhIG1lbW9yeSBidWZmZXIKKyAqIEB2b2w6CXZvbHVtZSB0byB3aGljaCB0aGUgbWZ0IHJlY29yZCB3aWxsIGJlbG9uZworICogQG1mdF9ubzoJbWZ0IHJlZmVyZW5jZSBzcGVjaWZ5aW5nIHRoZSBtZnQgcmVjb3JkIG51bWJlcgorICogQG06CQlkZXN0aW5hdGlvbiBidWZmZXIgb2Ygc2l6ZSA+PSBAdm9sLT5tZnRfcmVjb3JkX3NpemUgYnl0ZXMKKyAqCisgKiBMYXlvdXQgYW4gZW1wdHksIHVudXNlZCBtZnQgcmVjb3JkIHdpdGggdGhlIG1mdCByZWNvcmQgbnVtYmVyIEBtZnRfbm8gaW50bworICogdGhlIGJ1ZmZlciBAbS4gIFRoZSB2b2x1bWUgQHZvbCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgbWZ0IHJlY29yZCBzdHJ1Y3R1cmUKKyAqIHdhcyBtb2RpZmllZCBpbiBOVEZTIDMuMSBzbyB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggdm9sdW1lIHZlcnNpb24gdGhpcyBtZnQKKyAqIHJlY29yZCB3aWxsIGJlIHVzZWQgb24uCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG50ZnNfbWZ0X3JlY29yZF9sYXlvdXQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgczY0IG1mdF9ubywKKwkJTUZUX1JFQ09SRCAqbSkKK3sKKwlBVFRSX1JFQ09SRCAqYTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBtZnQgcmVjb3JkIDB4JWxseC4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJaWYgKG1mdF9ubyA+PSAoMWxsIDw8IDMyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJNZnQgcmVjb3JkIG51bWJlciAweCVsbHggZXhjZWVkcyAiCisJCQkJIm1heGltdW0gb2YgMl4zMi4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKwkvKiBTdGFydCBieSBjbGVhcmluZyB0aGUgd2hvbGUgbWZ0IHJlY29yZCB0byBnaXZlcyB1cyBhIGNsZWFuIHNsYXRlLiAqLworCW1lbXNldChtLCAwLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJLyogQWxpZ25lZCB0byAyLWJ5dGUgYm91bmRhcnkuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyIDwgMyB8fCAodm9sLT5tYWpvcl92ZXIgPT0gMyAmJiAhdm9sLT5taW5vcl92ZXIpKQorCQltLT51c2Ffb2ZzID0gY3B1X3RvX2xlMTYoKHNpemVvZihNRlRfUkVDT1JEX09MRCkgKyAxKSAmIH4xKTsKKwllbHNlIHsKKwkJbS0+dXNhX29mcyA9IGNwdV90b19sZTE2KChzaXplb2YoTUZUX1JFQ09SRCkgKyAxKSAmIH4xKTsKKwkJLyoKKwkJICogU2V0IHRoZSBOVEZTIDMuMSsgc3BlY2lmaWMgZmllbGRzIHdoaWxlIHdlIGtub3cgdGhhdCB0aGUKKwkJICogdm9sdW1lIHZlcnNpb24gaXMgMy4xKy4KKwkJICovCisJCW0tPnJlc2VydmVkID0gMDsKKwkJbS0+bWZ0X3JlY29yZF9udW1iZXIgPSBjcHVfdG9fbGUzMigodTMyKW1mdF9ubyk7CisJfQorCW0tPm1hZ2ljID0gbWFnaWNfRklMRTsKKwlpZiAodm9sLT5tZnRfcmVjb3JkX3NpemUgPj0gTlRGU19CTE9DS19TSVpFKQorCQltLT51c2FfY291bnQgPSBjcHVfdG9fbGUxNih2b2wtPm1mdF9yZWNvcmRfc2l6ZSAvCisJCQkJTlRGU19CTE9DS19TSVpFICsgMSk7CisJZWxzZSB7CisJCW0tPnVzYV9jb3VudCA9IGNwdV90b19sZTE2KDEpOworCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlNlY3RvciBzaXplIGlzIGJpZ2dlciB0aGFuIG1mdCByZWNvcmQgIgorCQkJCSJzaXplLiAgU2V0dGluZyB1c2FfY291bnQgdG8gMS4gIElmIGNoa2RzayAiCisJCQkJInJlcG9ydHMgdGhpcyBhcyBjb3JydXB0aW9uLCBwbGVhc2UgZW1haWwgIgorCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgc3RhdGluZyAiCisJCQkJInRoYXQgeW91IHNhdyB0aGlzIG1lc3NhZ2UgYW5kIHRoYXQgdGhlICIKKwkJCQkibW9kaWZpZWQgZmlsZSBzeXN0ZW0gY3JlYXRlZCB3YXMgY29ycnVwdC4gICIKKwkJCQkiVGhhbmsgeW91LiIpOworCX0KKwkvKiBTZXQgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgdG8gMS4gKi8KKwkqKGxlMTYqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT51c2Ffb2ZzKSkgPSBjcHVfdG9fbGUxNigxKTsKKwltLT5sc24gPSAwOworCW0tPnNlcXVlbmNlX251bWJlciA9IGNwdV90b19sZTE2KDEpOworCW0tPmxpbmtfY291bnQgPSAwOworCS8qCisJICogUGxhY2UgdGhlIGF0dHJpYnV0ZXMgc3RyYWlnaHQgYWZ0ZXIgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSwKKwkgKiBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4KKwkgKi8KKwltLT5hdHRyc19vZmZzZXQgPSBjcHVfdG9fbGUxNigobGUxNl90b19jcHUobS0+dXNhX29mcykgKworCQkJKGxlMTZfdG9fY3B1KG0tPnVzYV9jb3VudCkgPDwgMSkgKyA3KSAmIH43KTsKKwltLT5mbGFncyA9IDA7CisJLyoKKwkgKiBVc2luZyBhdHRyc19vZmZzZXQgcGx1cyBlaWdodCBieXRlcyAoZm9yIHRoZSB0ZXJtaW5hdGlvbiBhdHRyaWJ1dGUpLgorCSAqIGF0dHJzX29mZnNldCBpcyBhbHJlYWR5IGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LCBzbyBubyBuZWVkIHRvCisJICogYWxpZ24gYWdhaW4uCisJICovCisJbS0+Ynl0ZXNfaW5fdXNlID0gY3B1X3RvX2xlMzIobGUxNl90b19jcHUobS0+YXR0cnNfb2Zmc2V0KSArIDgpOworCW0tPmJ5dGVzX2FsbG9jYXRlZCA9IGNwdV90b19sZTMyKHZvbC0+bWZ0X3JlY29yZF9zaXplKTsKKwltLT5iYXNlX21mdF9yZWNvcmQgPSAwOworCW0tPm5leHRfYXR0cl9pbnN0YW5jZSA9IDA7CisJLyogQWRkIHRoZSB0ZXJtaW5hdGlvbiBhdHRyaWJ1dGUuICovCisJYSA9IChBVFRSX1JFQ09SRCopKCh1OCopbSArIGxlMTZfdG9fY3B1KG0tPmF0dHJzX29mZnNldCkpOworCWEtPnR5cGUgPSBBVF9FTkQ7CisJYS0+bGVuZ3RoID0gMDsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQgLSBmb3JtYXQgYW4gbWZ0IHJlY29yZCBvbiBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJdm9sdW1lIG9uIHdoaWNoIHRvIGZvcm1hdCB0aGUgbWZ0IHJlY29yZAorICogQG1mdF9ubzoJbWZ0IHJlY29yZCBudW1iZXIgdG8gZm9ybWF0CisgKgorICogRm9ybWF0IHRoZSBtZnQgcmVjb3JkIEBtZnRfbm8gaW4gJE1GVC8kREFUQSwgaS5lLiBsYXkgb3V0IGFuIGVtcHR5LCB1bnVzZWQKKyAqIG1mdCByZWNvcmQgaW50byB0aGUgYXBwcm9wcmlhdGUgcGxhY2Ugb2YgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZS4gIFRoaXMgaXMKKyAqIHVzZWQgd2hlbiBleHRlbmRpbmcgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBzNjQgbWZ0X25vKQoreworCXN0cnVjdCBpbm9kZSAqbWZ0X3ZpID0gdm9sLT5tZnRfaW5vOworCXN0cnVjdCBwYWdlICpwYWdlOworCU1GVF9SRUNPUkQgKm07CisJcGdvZmZfdCBpbmRleCwgZW5kX2luZGV4OworCXVuc2lnbmVkIGludCBvZnM7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBtZnQgcmVjb3JkIDB4JWxseC4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJLyoKKwkgKiBUaGUgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgY2FjaGUKKwkgKiBwYWdlIG9mIHRoZSB3YW50ZWQgbWZ0IHJlY29yZC4KKwkgKi8KKwlpbmRleCA9IG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2ZzID0gKG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogVGhlIG1heGltdW0gdmFsaWQgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVCdzIGRhdGEuICovCisJZW5kX2luZGV4ID0gbWZ0X3ZpLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAodW5saWtlbHkoaW5kZXggPj0gZW5kX2luZGV4KSkgeworCQlpZiAodW5saWtlbHkoaW5kZXggPiBlbmRfaW5kZXggfHwgb2ZzICsgdm9sLT5tZnRfcmVjb3JkX3NpemUgPj0KKwkJCQkobWZ0X3ZpLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRyaWVkIHRvIGZvcm1hdCBub24tZXhpc3RpbmcgbWZ0ICIKKwkJCQkJInJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyltZnRfbm8pOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwl9CisJLyogUmVhZCwgbWFwLCBhbmQgcGluIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG1mdCByZWNvcmQuICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWZ0X3ZpLT5pX21hcHBpbmcsIGluZGV4KTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHBhZ2UpKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIHBhZ2UgY29udGFpbmluZyBtZnQgcmVjb3JkICIKKwkJCQkidG8gZm9ybWF0IDB4JWxseC4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCW0gPSAoTUZUX1JFQ09SRCopKCh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2ZzKTsKKwllcnIgPSBudGZzX21mdF9yZWNvcmRfbGF5b3V0KHZvbCwgbWZ0X25vLCBtKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbGF5b3V0IG1mdCByZWNvcmQgMHglbGx4LiIsCisJCQkJKGxvbmcgbG9uZyltZnRfbm8pOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBlcnI7CisJfQorCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLiAgV2UgY291bGQgdXNlCisJICogaWxvb2t1cDUoKSB0byBjaGVjayBpZiBhbiBpbm9kZSBpcyBpbiBpY2FjaGUgYW5kIHNvIG9uIGJ1dCB0aGlzIGlzCisJICogdW5uZWNlc3NhcnkgYXMgbnRmc193cml0ZXBhZ2UoKSB3aWxsIHdyaXRlIHRoZSBkaXJ0eSByZWNvcmQgYW55d2F5LgorCSAqLworCW1hcmtfbnRmc19yZWNvcmRfZGlydHkocGFnZSwgb2ZzKTsKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudGZzX21mdF9yZWNvcmRfYWxsb2MgLSBhbGxvY2F0ZSBhbiBtZnQgcmVjb3JkIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdm9sOglbSU5dICB2b2x1bWUgb24gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIG1mdCByZWNvcmQKKyAqIEBtb2RlOglbSU5dICBtb2RlIGlmIHdhbnQgYSBmaWxlIG9yIGRpcmVjdG9yeSwgaS5lLiBiYXNlIGlub2RlIG9yIDAKKyAqIEBiYXNlX25pOglbSU5dICBvcGVuIGJhc2UgaW5vZGUgaWYgYWxsb2NhdGluZyBhbiBleHRlbnQgbWZ0IHJlY29yZCBvciBOVUxMCisgKiBAbXJlYzoJW09VVF0gb24gc3VjY2Vzc2Z1bCByZXR1cm4gdGhpcyBpcyB0aGUgbWFwcGVkIG1mdCByZWNvcmQKKyAqCisgKiBBbGxvY2F0ZSBhbiBtZnQgcmVjb3JkIGluICRNRlQvJERBVEEgb2YgYW4gb3BlbiBudGZzIHZvbHVtZSBAdm9sLgorICoKKyAqIElmIEBiYXNlX25pIGlzIE5VTEwgbWFrZSB0aGUgbWZ0IHJlY29yZCBhIGJhc2UgbWZ0IHJlY29yZCwgaS5lLiBhIGZpbGUgb3IKKyAqIGRpcmV2Y3RvcnkgaW5vZGUsIGFuZCBhbGxvY2F0ZSBpdCBhdCB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgcG9zaXRpb24uICBJbgorICogdGhpcyBjYXNlIEBtb2RlIGlzIHRoZSBmaWxlIG1vZGUgYXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIGNhbGxlci4gIFdlIGluCisgKiBwYXJ0aWN1bGFyIHVzZSBAbW9kZSB0byBkaXN0aW5ndWlzaCB3aGV0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeSBpcyBiZWluZworICogY3JlYXRlZCAoU19JRkRJUihtb2RlKSBhbmQgU19JRlJFRyhtb2RlKSwgcmVzcGVjdGl2ZWx5KS4KKyAqCisgKiBJZiBAYmFzZV9uaSBpcyBub3QgTlVMTCBtYWtlIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBhbiBleHRlbnQgcmVjb3JkLAorICogYWxsb2NhdGUgaXQgc3RhcnRpbmcgYXQgdGhlIG1mdCByZWNvcmQgYWZ0ZXIgdGhlIGJhc2UgbWZ0IHJlY29yZCBhbmQgYXR0YWNoCisgKiB0aGUgYWxsb2NhdGVkIGFuZCBvcGVuZWQgbnRmcyBpbm9kZSB0byB0aGUgYmFzZSBpbm9kZSBAYmFzZV9uaS4gIEluIHRoaXMKKyAqIGNhc2UgQG1vZGUgbXVzdCBiZSAwIGFzIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlbnQgaW5vZGVzLgorICoKKyAqIFlvdSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgd2l0aCBJU19FUlIoKS4gIElmIGZhbHNlLCB0aGUgZnVuY3Rpb24KKyAqIHdhcyBzdWNjZXNzZnVsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBub3cgb3BlbmVkIG50ZnMgaW5vZGUgb2YgdGhlCisgKiBhbGxvY2F0ZWQgbWZ0IHJlY29yZC4gICpAbXJlYyBpcyB0aGVuIHNldCB0byB0aGUgYWxsb2NhdGVkLCBtYXBwZWQsIHBpbm5lZCwKKyAqIGFuZCBsb2NrZWQgbWZ0IHJlY29yZC4gIElmIElTX0VSUigpIGlzIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kIHRoZQorICogZXJyb3IgY29kZSBpcyBvYnRhaW5lZCBmcm9tIFBUUl9FUlIocmV0dXJuIHZhbHVlKS4gICpAbXJlYyBpcyB1bmRlZmluZWQgaW4KKyAqIHRoaXMgY2FzZS4KKyAqCisgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5OgorICoKKyAqIFRvIGZpbmQgYSBmcmVlIG1mdCByZWNvcmQsIHdlIHNjYW4gdGhlIG1mdCBiaXRtYXAgZm9yIGEgemVybyBiaXQuICBUbworICogb3B0aW1pemUgdGhpcyB3ZSBzdGFydCBzY2FubmluZyBhdCB0aGUgcGxhY2Ugc3BlY2lmaWVkIGJ5IEBiYXNlX25pIG9yIGlmCisgKiBAYmFzZV9uaSBpcyBOVUxMIHdlIHN0YXJ0IHdoZXJlIHdlIGxhc3Qgc3RvcHBlZCBhbmQgd2UgcGVyZm9ybSB3cmFwIGFyb3VuZAorICogd2hlbiB3ZSByZWFjaCB0aGUgZW5kLiAgTm90ZSwgd2UgZG8gbm90IHRyeSB0byBhbGxvY2F0ZSBtZnQgcmVjb3JkcyBiZWxvdworICogbnVtYmVyIDI0IGJlY2F1c2UgbnVtYmVycyAwIHRvIDE1IGFyZSB0aGUgZGVmaW5lZCBzeXN0ZW0gZmlsZXMgYW55d2F5IGFuZCAxNgorICogdG8gMjQgYXJlIHNwZWNpYWwgaW4gdGhhdCB0aGV5IGFyZSB1c2VkIGZvciBzdG9yaW5nIGV4dGVuc2lvbiBtZnQgcmVjb3JkcworICogZm9yIHRoZSAkREFUQSBhdHRyaWJ1dGUgb2YgJE1GVC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5CisgKiBvZiBjcmVhdGluZyBhIHJ1bmxpc3Qgd2l0aCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hpY2ggb25jZSB3cml0dGVuIHRvIGRpc2sKKyAqIGNhbiBuZXZlciBiZSByZWFkIGluIGFnYWluLiAgV2luZG93cyB3aWxsIG9ubHkgdXNlIHJlY29yZHMgMTYgdG8gMjQgZm9yCisgKiBub3JtYWwgZmlsZXMgaWYgdGhlIHZvbHVtZSBpcyBjb21wbGV0ZWx5IG91dCBvZiBzcGFjZS4gIFdlIG5ldmVyIHVzZSB0aGVtCisgKiB3aGljaCBtZWFucyB0aGF0IHdoZW4gdGhlIHZvbHVtZSBpcyByZWFsbHkgb3V0IG9mIHNwYWNlIHdlIGNhbm5vdCBjcmVhdGUgYW55CisgKiBtb3JlIGZpbGVzIHdoaWxlIFdpbmRvd3MgY2FuIHN0aWxsIGNyZWF0ZSB1cCB0byA4IHNtYWxsIGZpbGVzLiAgV2UgY2FuIHN0YXJ0CisgKiBkb2luZyB0aGlzIGF0IHNvbWUgbGF0ZXIgdGltZSwgaXQgZG9lcyBub3QgbWF0dGVyIG11Y2ggZm9yIG5vdy4KKyAqCisgKiBXaGVuIHNjYW5uaW5nIHRoZSBtZnQgYml0bWFwLCB3ZSBvbmx5IHNlYXJjaCB1cCB0byB0aGUgbGFzdCBhbGxvY2F0ZWQgbWZ0CisgKiByZWNvcmQuICBJZiB0aGVyZSBhcmUgbm8gZnJlZSByZWNvcmRzIGxlZnQgaW4gdGhlIHJhbmdlIDI0IHRvIG51bWJlciBvZgorICogYWxsb2NhdGVkIG1mdCByZWNvcmRzLCB0aGVuIHdlIGV4dGVuZCB0aGUgJE1GVC8kREFUQSBhdHRyaWJ1dGUgaW4gb3JkZXIgdG8KKyAqIGNyZWF0ZSBmcmVlIG1mdCByZWNvcmRzLiAgV2UgZXh0ZW5kIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiAkTUZULyREQVRBIGJ5IDE2CisgKiByZWNvcmRzIGF0IGEgdGltZSBvciBvbmUgY2x1c3RlciwgaWYgY2x1c3RlciBzaXplIGlzIGFib3ZlIDE2a2lCLiAgSWYgdGhlcmUKKyAqIGlzIG5vdCBzdWZmaWNpZW50IHNwYWNlIHRvIGRvIHRoaXMsIHdlIHRyeSB0byBleHRlbmQgYnkgYSBzaW5nbGUgbWZ0IHJlY29yZAorICogb3Igb25lIGNsdXN0ZXIsIGlmIGNsdXN0ZXIgc2l6ZSBpcyBhYm92ZSB0aGUgbWZ0IHJlY29yZCBzaXplLgorICoKKyAqIE5vIG1hdHRlciBob3cgbWFueSBtZnQgcmVjb3JkcyB3ZSBhbGxvY2F0ZSwgd2UgaW5pdGlhbGl6ZSBvbmx5IHRoZSBmaXJzdAorICogYWxsb2NhdGVkIG1mdCByZWNvcmQsIGluY3JlbWVudGluZyBtZnQgZGF0YSBzaXplIGFuZCBpbml0aWFsaXplZCBzaXplCisgKiBhY2NvcmRpbmdseSwgb3BlbiBhbiBudGZzX2lub2RlIGZvciBpdCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIsIHVubGVzcworICogdGhlcmUgYXJlIGxlc3MgdGhhbiAyNCBtZnQgcmVjb3JkcywgaW4gd2hpY2ggY2FzZSB3ZSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZQorICogbWZ0IHJlY29yZHMgdW50aWwgd2UgcmVhY2ggcmVjb3JkIDI0IHdoaWNoIHdlIGNvbnNpZGVyIGFzIHRoZSBmaXJzdCBmcmVlIG1mdAorICogcmVjb3JkIGZvciB1c2UgYnkgbm9ybWFsIGZpbGVzLgorICoKKyAqIElmIGR1cmluZyBhbnkgc3RhZ2Ugd2Ugb3ZlcmZsb3cgdGhlIGluaXRpYWxpemVkIGRhdGEgaW4gdGhlIG1mdCBiaXRtYXAsIHdlCisgKiBleHRlbmQgdGhlIGluaXRpYWxpemVkIHNpemUgKGFuZCBkYXRhIHNpemUpIGJ5IDggYnl0ZXMsIGFsbG9jYXRpbmcgYW5vdGhlcgorICogY2x1c3RlciBpZiByZXF1aXJlZC4gIFRoZSBiaXRtYXAgZGF0YSBzaXplIGhhcyB0byBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUKKyAqIG51bWJlciBvZiBtZnQgcmVjb3JkcyBpbiB0aGUgbWZ0LCBidXQgaXQgY2FuIGJlIGJpZ2dlciwgaW4gd2hpY2ggY2FzZSB0aGUKKyAqIHN1cGVyZmxvdXMgYml0cyBhcmUgcGFkZGVkIHdpdGggemVyb2VzLgorICoKKyAqIFRodXMsIHdoZW4gd2UgcmV0dXJuIHN1Y2Nlc3NmdWxseSAoSVNfRVJSKCkgaXMgZmFsc2UpLCB3ZSB3aWxsIGhhdmU6CisgKgktIGluaXRpYWxpemVkIC8gZXh0ZW5kZWQgdGhlIG1mdCBiaXRtYXAgaWYgbmVjZXNzYXJ5LAorICoJLSBpbml0aWFsaXplZCAvIGV4dGVuZGVkIHRoZSBtZnQgZGF0YSBpZiBuZWNlc3NhcnksCisgKgktIHNldCB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1mdCByZWNvcmQgYmVpbmcgYWxsb2NhdGVkIGluIHRoZQorICoJICBtZnQgYml0bWFwLAorICoJLSBvcGVuZWQgYW4gbnRmc19pbm9kZSBmb3IgdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkLCBhbmQgd2Ugd2lsbCBoYXZlCisgKgktIHJldHVybmVkIHRoZSBudGZzX2lub2RlIGFzIHdlbGwgYXMgdGhlIGFsbG9jYXRlZCBtYXBwZWQsIHBpbm5lZCwgYW5kCisgKgkgIGxvY2tlZCBtZnQgcmVjb3JkLgorICoKKyAqIE9uIGVycm9yLCB0aGUgdm9sdW1lIHdpbGwgYmUgbGVmdCBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgYW5kIG5vIHJlY29yZCB3aWxsCisgKiBiZSBhbGxvY2F0ZWQuICBJZiByb2xsaW5nIGJhY2sgYSBwYXJ0aWFsIG9wZXJhdGlvbiBmYWlscywgd2UgbWF5IGxlYXZlIHNvbWUKKyAqIGluY29uc2lzdGVudCBtZXRhZGF0YSBpbiB3aGljaCBjYXNlIHdlIHNldCBOVm9sRXJyb3JzKCkgc28gdGhlIHZvbHVtZSBpcworICogbGVmdCBkaXJ0eSB3aGVuIHVubW91bnRlZC4KKyAqCisgKiBOb3RlLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBtYWtlIHVzZSBvZiBtb3N0IG9mIHRoZSBub3JtYWwgZnVuY3Rpb25zLCBsaWtlCisgKiBmb3IgZXhhbXBsZSBmb3IgYXR0cmlidXRlIHJlc2l6aW5nLCBldGMsIGJlY2F1c2Ugd2hlbiB0aGUgcnVuIGxpc3Qgb3ZlcmZsb3dzCisgKiB0aGUgYmFzZSBtZnQgcmVjb3JkIGFuZCBhbiBhdHRyaWJ1dGUgbGlzdCBpcyB1c2VkLCBpdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0CisgKiB0aGUgZXh0ZW5zaW9uIG1mdCByZWNvcmRzIHVzZWQgdG8gc3RvcmUgdGhlICREQVRBIGF0dHJpYnV0ZSBvZiAkTUZUIGNhbiBiZQorICogcmVhY2hlZCB3aXRob3V0IGhhdmluZyB0byByZWFkIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW5zaWRlIHRoZW0sIGFzCisgKiB0aGlzIHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBmaW5kIHRoZW0gaW4gdGhlIGZpcnN0IHBsYWNlIGFmdGVyIHRoZQorICogdm9sdW1lIGlzIHVubW91bnRlZC4gICRNRlQvJEJJVE1BUCBwcm9iYWJseSBkb2VzIG5vdCBuZWVkIHRvIGZvbGxvdyB0aGlzCisgKiBydWxlIGJlY2F1c2UgdGhlIGJpdG1hcCBpcyBub3QgZXNzZW50aWFsIGZvciBmaW5kaW5nIHRoZSBtZnQgcmVjb3JkcywgYnV0IG9uCisgKiB0aGUgb3RoZXIgaGFuZCwgaGFuZGxpbmcgdGhlIGJpdG1hcCBpbiB0aGlzIHNwZWNpYWwgd2F5IHdvdWxkIG1ha2UgbGlmZQorICogZWFzaWVyIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXJlIG1pZ2h0IGJlIGNpcmN1bGFyIGludm9jYXRpb25zIG9mIGZ1bmN0aW9ucworICogd2hlbiByZWFkaW5nIHRoZSBiaXRtYXAuCisgKi8KK250ZnNfaW5vZGUgKm50ZnNfbWZ0X3JlY29yZF9hbGxvYyhudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBpbnQgbW9kZSwKKwkJbnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFQ09SRCAqKm1yZWMpCit7CisJczY0IGxsLCBiaXQsIG9sZF9kYXRhX2luaXRpYWxpemVkLCBvbGRfZGF0YV9zaXplOworCXN0cnVjdCBpbm9kZSAqdmk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pLCAqbmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOworCXBnb2ZmX3QgaW5kZXg7CisJdW5zaWduZWQgaW50IG9mczsKKwlpbnQgZXJyOworCWxlMTYgc2VxX25vLCB1c247CisJQk9PTCByZWNvcmRfZm9ybWF0dGVkID0gRkFMU0U7CisKKwlpZiAoYmFzZV9uaSkgeworCQludGZzX2RlYnVnKCJFbnRlcmluZyAoYWxsb2NhdGluZyBhbiBleHRlbnQgbWZ0IHJlY29yZCBmb3IgIgorCQkJCSJiYXNlIG1mdCByZWNvcmQgMHglbGx4KS4iLAorCQkJCShsb25nIGxvbmcpYmFzZV9uaS0+bWZ0X25vKTsKKwkJLyogQG1vZGUgYW5kIEBiYXNlX25pIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCisJCUJVR19PTihtb2RlKTsKKwl9IGVsc2UKKwkJbnRmc19kZWJ1ZygiRW50ZXJpbmcgKGFsbG9jYXRpbmcgYSBiYXNlIG1mdCByZWNvcmQpLiIpOworCWlmIChtb2RlKSB7CisJCS8qIEBtb2RlIGFuZCBAYmFzZV9uaSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworCQlCVUdfT04oYmFzZV9uaSk7CisJCS8qIFdlIG9ubHkgc3VwcG9ydCBjcmVhdGlvbiBvZiBub3JtYWwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiAqLworCQlpZiAoIVNfSVNSRUcobW9kZSkgJiYgIVNfSVNESVIobW9kZSkpCisJCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJfQorCUJVR19PTighbXJlYyk7CisJbWZ0X25pID0gTlRGU19JKHZvbC0+bWZ0X2lubyk7CisJbWZ0Ym1wX25pID0gTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyk7CisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJYml0ID0gbnRmc19tZnRfYml0bWFwX2ZpbmRfYW5kX2FsbG9jX2ZyZWVfcmVjX25vbG9jayh2b2wsIGJhc2VfbmkpOworCWlmIChiaXQgPj0gMCkgeworCQludGZzX2RlYnVnKCJGb3VuZCBhbmQgYWxsb2NhdGVkIGZyZWUgcmVjb3JkICgjMSksIGJpdCAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKWJpdCk7CisJCWdvdG8gaGF2ZV9hbGxvY19yZWM7CisJfQorCWlmIChiaXQgIT0gLUVOT1NQQykgeworCQl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJCXJldHVybiBFUlJfUFRSKGJpdCk7CisJfQorCS8qCisJICogTm8gZnJlZSBtZnQgcmVjb3JkcyBsZWZ0LiAgSWYgdGhlIG1mdCBiaXRtYXAgYWxyZWFkeSBjb3ZlcnMgbW9yZQorCSAqIHRoYW4gdGhlIGN1cnJlbnRseSB1c2VkIG1mdCByZWNvcmRzLCB0aGUgbmV4dCByZWNvcmRzIGFyZSBhbGwgZnJlZSwKKwkgKiBzbyB3ZSBjYW4gc2ltcGx5IGFsbG9jYXRlIHRoZSBmaXJzdCB1bnVzZWQgbWZ0IHJlY29yZC4KKwkgKiBOb3RlOiBXZSBhbHNvIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1mdCBiaXRtYXAgYXQgbGVhc3QgY292ZXJzCisJICogdGhlIGZpcnN0IDI0IG1mdCByZWNvcmRzIGFzIHRoZXkgYXJlIHNwZWNpYWwgYW5kIHdoaWxzdCB0aGV5IG1heSBub3QKKwkgKiBiZSBpbiB1c2UsIHdlIGRvIG5vdCBhbGxvY2F0ZSBmcm9tIHRoZW0uCisJICovCisJbGwgPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplIDw8IDMgPiBsbCAmJgorCQkJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gMykgeworCQliaXQgPSBsbDsKKwkJaWYgKGJpdCA8IDI0KQorCQkJYml0ID0gMjQ7CisJCWlmICh1bmxpa2VseShiaXQgPj0gKDFsbCA8PCAzMikpKQorCQkJZ290byBtYXhfZXJyX291dDsKKwkJbnRmc19kZWJ1ZygiRm91bmQgZnJlZSByZWNvcmQgKCMyKSwgYml0IDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpYml0KTsKKwkJZ290byBmb3VuZF9mcmVlX3JlYzsKKwl9CisJLyoKKwkgKiBUaGUgbWZ0IGJpdG1hcCBuZWVkcyB0byBiZSBleHBhbmRlZCB1bnRpbCBpdCBjb3ZlcnMgdGhlIGZpcnN0IHVudXNlZAorCSAqIG1mdCByZWNvcmQgdGhhdCB3ZSBjYW4gYWxsb2NhdGUuCisJICogTm90ZTogVGhlIHNtYWxsZXN0IG1mdCByZWNvcmQgd2UgYWxsb2NhdGUgaXMgbWZ0IHJlY29yZCAyNC4KKwkgKi8KKwliaXQgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgPDwgMzsKKwlpZiAodW5saWtlbHkoYml0ID49ICgxbGwgPDwgMzIpKSkKKwkJZ290byBtYXhfZXJyX291dDsKKwludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0Ym1wIGJlZm9yZSBleHRlbnNpb246IGFsbG9jYXRlZF9zaXplIDB4JWxseCwgIgorCQkJImRhdGFfc2l6ZSAweCVsbHgsIGluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkobG9uZyBsb25nKXZvbC0+bWZ0Ym1wX2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOworCWlmIChtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgKyA4ID4gbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSkgeworCQkvKiBOZWVkIHRvIGV4dGVuZCBiaXRtYXAgYnkgb25lIG1vcmUgY2x1c3Rlci4gKi8KKwkJbnRmc19kZWJ1ZygibWZ0Ym1wOiBpbml0aWFsaXplZF9zaXplICsgOCA+IGFsbG9jYXRlZF9zaXplLiIpOworCQllcnIgPSBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKHZvbCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdGJtcCBhZnRlciBhbGxvY2F0aW9uIGV4dGVuc2lvbjogIgorCQkJCSJhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsIGRhdGFfc2l6ZSAweCVsbHgsICIKKwkJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkJKGxvbmcgbG9uZyl2b2wtPm1mdGJtcF9pbm8tPmlfc2l6ZSwKKwkJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJfQorCS8qCisJICogV2Ugbm93IGhhdmUgc3VmZmljaWVudCBhbGxvY2F0ZWQgc3BhY2UsIGV4dGVuZCB0aGUgaW5pdGlhbGl6ZWRfc2l6ZQorCSAqIGFzIHdlbGwgYXMgdGhlIGRhdGFfc2l6ZSBpZiBuZWNlc3NhcnkgYW5kIGZpbGwgdGhlIG5ldyBzcGFjZSB3aXRoCisJICogemVyb2VzLgorCSAqLworCWVyciA9IG50ZnNfbWZ0X2JpdG1hcF9leHRlbmRfaW5pdGlhbGl6ZWRfbm9sb2NrKHZvbCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnRibXAgYWZ0ZXIgaW5pdGlhbGl6ZWQgZXh0ZW50aW9uOiAiCisJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpdm9sLT5tZnRibXBfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJbnRmc19kZWJ1ZygiRm91bmQgZnJlZSByZWNvcmQgKCMzKSwgYml0IDB4JWxseC4iLCAobG9uZyBsb25nKWJpdCk7Citmb3VuZF9mcmVlX3JlYzoKKwkvKiBAYml0IGlzIHRoZSBmb3VuZCBmcmVlIG1mdCByZWNvcmQsIGFsbG9jYXRlIGl0IGluIHRoZSBtZnQgYml0bWFwLiAqLworCW50ZnNfZGVidWcoIkF0IGZvdW5kX2ZyZWVfcmVjLiIpOworCWVyciA9IG50ZnNfYml0bWFwX3NldF9iaXQodm9sLT5tZnRibXBfaW5vLCBiaXQpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBiaXQgaW4gbWZ0IGJpdG1hcC4iKTsKKwkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZGVidWcoIlNldCBiaXQgMHglbGx4IGluIG1mdCBiaXRtYXAuIiwgKGxvbmcgbG9uZyliaXQpOworaGF2ZV9hbGxvY19yZWM6CisJLyoKKwkgKiBUaGUgbWZ0IGJpdG1hcCBpcyBub3cgdXB0b2RhdGUuICBEZWFsIHdpdGggbWZ0IGRhdGEgYXR0cmlidXRlIG5vdy4KKwkgKiBOb3RlLCB3ZSBrZWVwIGhvbGQgb2YgdGhlIG1mdCBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyB1bnRpbCBhbGwKKwkgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUgYXJlIGNvbXBsZXRlLCB0b28sIGFzIHRoZXkKKwkgKiB3aWxsIGltcGFjdCBkZWNpc2lvbnMgZm9yIG1mdCBiaXRtYXAgYW5kIG1mdCByZWNvcmQgYWxsb2NhdGlvbiBkb25lCisJICogYnkgYSBwYXJhbGxlbCBhbGxvY2F0aW9uIGFuZCBpZiB0aGUgbG9jayBpcyBub3QgbWFpbnRhaW5lZCBhCisJICogcGFyYWxsZWwgYWxsb2NhdGlvbiBjb3VsZCBhbGxvY2F0ZSB0aGUgc2FtZSBtZnQgcmVjb3JkIGFzIHRoaXMgb25lLgorCSAqLworCWxsID0gKGJpdCArIDEpIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJaWYgKGxsIDw9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQludGZzX2RlYnVnKCJBbGxvY2F0ZWQgbWZ0IHJlY29yZCBhbHJlYWR5IGluaXRpYWxpemVkLiIpOworCQlnb3RvIG1mdF9yZWNfYWxyZWFkeV9pbml0aWFsaXplZDsKKwl9CisJbnRmc19kZWJ1ZygiSW5pdGlhbGl6aW5nIGFsbG9jYXRlZCBtZnQgcmVjb3JkLiIpOworCS8qCisJICogVGhlIG1mdCByZWNvcmQgaXMgb3V0c2lkZSB0aGUgaW5pdGlhbGl6ZWQgZGF0YS4gIEV4dGVuZCB0aGUgbWZ0IGRhdGEKKwkgKiBhdHRyaWJ1dGUgdW50aWwgaXQgY292ZXJzIHRoZSBhbGxvY2F0ZWQgcmVjb3JkLiAgVGhlIGxvb3AgaXMgb25seQorCSAqIGFjdHVhbGx5IHRyYXZlcnNlZCBtb3JlIHRoYW4gb25jZSB3aGVuIGEgZnJlc2hseSBmb3JtYXR0ZWQgdm9sdW1lIGlzCisJICogZmlyc3Qgd3JpdHRlbiB0byBzbyBpdCBvcHRpbWl6ZXMgYXdheSBuaWNlbHkgaW4gdGhlIGNvbW1vbiBjYXNlLgorCSAqLworCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnQgZGF0YSBiZWZvcmUgZXh0ZW5zaW9uOiAiCisJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpdm9sLT5tZnRfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJd2hpbGUgKGxsID4gbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSkgeworCQllcnIgPSBudGZzX21mdF9kYXRhX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayh2b2wpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGV4dGVuZCBtZnQgZGF0YSAiCisJCQkJCSJhbGxvY2F0aW9uLiIpOworCQkJZ290byB1bmRvX21mdGJtcF9hbGxvY19ub2xvY2s7CisJCX0KKwkJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdCBkYXRhIGFmdGVyIGFsbG9jYXRpb24gZXh0ZW5zaW9uOiAiCisJCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgorCQkJCSJpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJCShsb25nIGxvbmcpbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKKwl9CisJLyoKKwkgKiBFeHRlbmQgbWZ0IGRhdGEgaW5pdGlhbGl6ZWQgc2l6ZSAoYW5kIGRhdGEgc2l6ZSBvZiBjb3Vyc2UpIHRvIHJlYWNoCisJICogdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkLCBmb3JtYXR0aW5nIHRoZSBtZnQgcmVjb3JkcyBhbGxvbmcgdGhlIHdheS4KKwkgKiBOb3RlOiBXZSBvbmx5IG1vZGlmeSB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgYXMgdGhhdCBpcyBhbGwgdGhhdCBpcworCSAqIG5lZWRlZCBieSBudGZzX21mdF9yZWNvcmRfZm9ybWF0KCkuICBXZSB3aWxsIHVwZGF0ZSB0aGUgYXR0cmlidXRlCisJICogcmVjb3JkIGl0c2VsZiBpbiBvbmUgZmVsbCBzd29vcCBsYXRlciBvbi4KKwkgKi8KKwlvbGRfZGF0YV9pbml0aWFsaXplZCA9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlvbGRfZGF0YV9zaXplID0gdm9sLT5tZnRfaW5vLT5pX3NpemU7CisJd2hpbGUgKGxsID4gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKSB7CisJCXM2NCBuZXdfaW5pdGlhbGl6ZWRfc2l6ZSwgbWZ0X25vOworCQkKKwkJbmV3X2luaXRpYWxpemVkX3NpemUgPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgKworCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplOworCQltZnRfbm8gPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwkJaWYgKG5ld19pbml0aWFsaXplZF9zaXplID4gdm9sLT5tZnRfaW5vLT5pX3NpemUpCisJCQl2b2wtPm1mdF9pbm8tPmlfc2l6ZSA9IG5ld19pbml0aWFsaXplZF9zaXplOworCQludGZzX2RlYnVnKCJJbml0aWFsaXppbmcgbWZ0IHJlY29yZCAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKW1mdF9ubyk7CisJCWVyciA9IG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQodm9sLCBtZnRfbm8pOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZvcm1hdCBtZnQgcmVjb3JkLiIpOworCQkJZ290byB1bmRvX2RhdGFfaW5pdDsKKwkJfQorCQltZnRfbmktPmluaXRpYWxpemVkX3NpemUgPSBuZXdfaW5pdGlhbGl6ZWRfc2l6ZTsKKwl9CisJcmVjb3JkX2Zvcm1hdHRlZCA9IFRSVUU7CisJLyogVXBkYXRlIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUgcmVjb3JkIHRvIHJlZmxlY3QgdGhlIG5ldyBzaXplcy4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgbWZ0IHJlY29yZC4iKTsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byB1bmRvX2RhdGFfaW5pdDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuIik7CisJCWVyciA9IC1FTk9NRU07CisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwkJZ290byB1bmRvX2RhdGFfaW5pdDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChtZnRfbmktPnR5cGUsIG1mdF9uaS0+bmFtZSwgbWZ0X25pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGZpcnN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJCWdvdG8gdW5kb19kYXRhX2luaXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQobWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPSBjcHVfdG9fc2xlNjQodm9sLT5tZnRfaW5vLT5pX3NpemUpOworCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnQgZGF0YSBhZnRlciBtZnQgcmVjb3JkIGluaXRpYWxpemF0aW9uOiAiCisJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpdm9sLT5tZnRfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJQlVHX09OKHZvbC0+bWZ0X2luby0+aV9zaXplID4gbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSk7CisJQlVHX09OKG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IHZvbC0+bWZ0X2luby0+aV9zaXplKTsKK21mdF9yZWNfYWxyZWFkeV9pbml0aWFsaXplZDoKKwkvKgorCSAqIFdlIGNhbiBmaW5hbGx5IGRyb3AgdGhlIG1mdCBiaXRtYXAgbG9jayBhcyB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlCisJICogaGFzIGJlZW4gZnVsbHkgdXBkYXRlZC4gIFRoZSBvbmx5IGRpc3Bhcml0eSBsZWZ0IGlzIHRoYXQgdGhlCisJICogYWxsb2NhdGVkIG1mdCByZWNvcmQgc3RpbGwgbmVlZHMgdG8gYmUgbWFya2VkIGFzIGluIHVzZSB0byBtYXRjaCB0aGUKKwkgKiBzZXQgYml0IGluIHRoZSBtZnQgYml0bWFwIGJ1dCB0aGlzIGlzIGFjdHVhbGx5IG5vdCBhIHByb2JsZW0gc2luY2UKKwkgKiB0aGlzIG1mdCByZWNvcmQgaXMgbm90IHJlZmVyZW5jZWQgZnJvbSBhbnl3aGVyZSB5ZXQgYW5kIHRoZSBmYWN0CisJICogdGhhdCBpdCBpcyBhbGxvY2F0ZWQgaW4gdGhlIG1mdCBiaXRtYXAgbWVhbnMgdGhhdCBuby1vbmUgd2lsbCB0cnkgdG8KKwkgKiBhbGxvY2F0ZSBpdCBlaXRoZXIuCisJICovCisJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCS8qCisJICogV2Ugbm93IGhhdmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCB0aGUgbWZ0IHJlY29yZC4gIENhbGN1bGF0ZSB0aGUKKwkgKiBpbmRleCBvZiBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgY2FjaGUgcGFnZSB0aGUgcmVjb3JkIGlzIGluLgorCSAqLworCWluZGV4ID0gYml0IDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZnMgPSAoYml0IDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkvKiBSZWFkLCBtYXAsIGFuZCBwaW4gdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgbWZ0IHJlY29yZC4gKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPm1mdF9pbm8tPmlfbWFwcGluZywgaW5kZXgpOworCWlmICh1bmxpa2VseShJU19FUlIocGFnZSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgcGFnZSBjb250YWluaW5nIGFsbG9jYXRlZCAiCisJCQkJIm1mdCByZWNvcmQgMHglbGx4LiIsIChsb25nIGxvbmcpYml0KTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byB1bmRvX21mdGJtcF9hbGxvYzsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwltID0gKE1GVF9SRUNPUkQqKSgodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mcyk7CisJLyogSWYgd2UganVzdCBmb3JtYXR0ZWQgdGhlIG1mdCByZWNvcmQgbm8gbmVlZCB0byBkbyBpdCBhZ2Fpbi4gKi8KKwlpZiAoIXJlY29yZF9mb3JtYXR0ZWQpIHsKKwkJLyogU2FuaXR5IGNoZWNrIHRoYXQgdGhlIG1mdCByZWNvcmQgaXMgcmVhbGx5IG5vdCBpbiB1c2UuICovCisJCWlmIChudGZzX2lzX2ZpbGVfcmVjb3JkKG0tPm1hZ2ljKSAmJgorCQkJCShtLT5mbGFncyAmIE1GVF9SRUNPUkRfSU5fVVNFKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWZ0IHJlY29yZCAweCVsbHggd2FzIG1hcmtlZCAiCisJCQkJCSJmcmVlIGluIG1mdCBiaXRtYXAgYnV0IGlzIG1hcmtlZCAiCisJCQkJCSJ1c2VkIGl0c2VsZi4gIENvcnJ1cHQgZmlsZXN5c3RlbS4gICIKKwkJCQkJIlVubW91bnQgYW5kIHJ1biBjaGtkc2suIiwKKwkJCQkJKGxvbmcgbG9uZyliaXQpOworCQkJZXJyID0gLUVJTzsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJZ290byB1bmRvX21mdGJtcF9hbGxvYzsKKwkJfQorCQkvKgorCQkgKiBXZSBuZWVkIHRvIChyZS0pZm9ybWF0IHRoZSBtZnQgcmVjb3JkLCBwcmVzZXJ2aW5nIHRoZQorCQkgKiBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgbm90IHplcm8gYXMgd2VsbCBhcyB0aGUgdXBkYXRlCisJCSAqIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBub3QgemVybyBvciAtMSAoMHhmZmZmKS4gIFRoaXMKKwkJICogbWVhbnMgd2UgZG8gbm90IG5lZWQgdG8gY2FyZSB3aGV0aGVyIG9yIG5vdCBzb21ldGhpbmcgd2VudAorCQkgKiB3cm9uZyB3aXRoIHRoZSBwcmV2aW91cyBtZnQgcmVjb3JkLgorCQkgKi8KKwkJc2VxX25vID0gbS0+c2VxdWVuY2VfbnVtYmVyOworCQl1c24gPSAqKGxlMTYqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT51c2Ffb2ZzKSk7CisJCWVyciA9IG50ZnNfbWZ0X3JlY29yZF9sYXlvdXQodm9sLCBiaXQsIG0pOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxheW91dCBhbGxvY2F0ZWQgbWZ0ICIKKwkJCQkJInJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyliaXQpOworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jOworCQl9CisJCWlmIChzZXFfbm8pCisJCQltLT5zZXF1ZW5jZV9udW1iZXIgPSBzZXFfbm87CisJCWlmICh1c24gJiYgbGUxNl90b19jcHUodXNuKSAhPSAweGZmZmYpCisJCQkqKGxlMTYqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT51c2Ffb2ZzKSkgPSB1c247CisJfQorCS8qIFNldCB0aGUgbWZ0IHJlY29yZCBpdHNlbGYgaW4gdXNlLiAqLworCW0tPmZsYWdzIHw9IE1GVF9SRUNPUkRfSU5fVVNFOworCWlmIChTX0lTRElSKG1vZGUpKQorCQltLT5mbGFncyB8PSBNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJaWYgKGJhc2VfbmkpIHsKKwkJLyoKKwkJICogU2V0dXAgdGhlIGJhc2UgbWZ0IHJlY29yZCBpbiB0aGUgZXh0ZW50IG1mdCByZWNvcmQuICBUaGlzCisJCSAqIGNvbXBsZXRlcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgYWxsb2NhdGVkIGV4dGVudCBtZnQgcmVjb3JkCisJCSAqIGFuZCB3ZSBjYW4gc2ltcGx5IHVzZSBpdCB3aXRoIG1hcF9leHRlbnRfbWZ0X3JlY29yZCgpLgorCQkgKi8KKwkJbS0+YmFzZV9tZnRfcmVjb3JkID0gTUtfTEVfTVJFRihiYXNlX25pLT5tZnRfbm8sCisJCQkJYmFzZV9uaS0+c2VxX25vKTsKKwkJLyoKKwkJICogQWxsb2NhdGUgYW4gZXh0ZW50IGlub2RlIHN0cnVjdHVyZSBmb3IgdGhlIG5ldyBtZnQgcmVjb3JkLAorCQkgKiBhdHRhY2ggaXQgdG8gdGhlIGJhc2UgaW5vZGUgQGJhc2VfbmkgYW5kIG1hcCwgcGluLCBhbmQgbG9jaworCQkgKiBpdHMsIGkuZS4gdGhlIGFsbG9jYXRlZCwgbWZ0IHJlY29yZC4KKwkJICovCisJCW0gPSBtYXBfZXh0ZW50X21mdF9yZWNvcmQoYmFzZV9uaSwgYml0LCAmbmkpOworCQlpZiAoSVNfRVJSKG0pKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBleHRlbnQgIgorCQkJCQkibWZ0IHJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyliaXQpOworCQkJZXJyID0gUFRSX0VSUihtKTsKKwkJCS8qIFNldCB0aGUgbWZ0IHJlY29yZCBpdHNlbGYgbm90IGluIHVzZS4gKi8KKwkJCW0tPmZsYWdzICY9IGNwdV90b19sZTE2KAorCQkJCQl+bGUxNl90b19jcHUoTUZUX1JFQ09SRF9JTl9VU0UpKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJLyogTWFrZSBzdXJlIHRoZSBtZnQgcmVjb3JkIGlzIHdyaXR0ZW4gb3V0IHRvIGRpc2suICovCisJCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KHBhZ2UsIG9mcyk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2M7CisJCX0KKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLgorCQkgKiBObyBuZWVkIHRvIHNldCB0aGUgaW5vZGUgZGlydHkgYmVjYXVzZSB0aGUgY2FsbGVyIGlzIGdvaW5nCisJCSAqIHRvIGRvIHRoYXQgYW55d2F5IGFmdGVyIGZpbmlzaGluZyB3aXRoIHRoZSBuZXcgZXh0ZW50IG1mdAorCQkgKiByZWNvcmQgKGUuZy4gYXQgYSBtaW5pbXVtIGEgbmV3IGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvCisJCSAqIHRoZSBtZnQgcmVjb3JkLgorCQkgKi8KKwkJbWFya19udGZzX3JlY29yZF9kaXJ0eShwYWdlLCBvZnMpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJLyoKKwkJICogTmVlZCB0byB1bm1hcCB0aGUgcGFnZSBzaW5jZSBtYXBfZXh0ZW50X21mdF9yZWNvcmQoKSBtYXBwZWQKKwkJICogaXQgYXMgd2VsbCBzbyB3ZSBoYXZlIGl0IG1hcHBlZCB0d2ljZSBhdCB0aGUgbW9tZW50LgorCQkgKi8KKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgbmV3IFZGUyBpbm9kZSBhbmQgc2V0IGl0IHVwLiAgTk9URTogQHZpLT5pX25saW5rCisJCSAqIGlzIHNldCB0byAxIGJ1dCB0aGUgbWZ0IHJlY29yZC0+bGlua19jb3VudCBpcyAwLiAgVGhlIGNhbGxlcgorCQkgKiBuZWVkcyB0byBiZWFyIHRoaXMgaW4gbWluZC4KKwkJICovCisJCXZpID0gbmV3X2lub2RlKHZvbC0+c2IpOworCQlpZiAodW5saWtlbHkoIXZpKSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCS8qIFNldCB0aGUgbWZ0IHJlY29yZCBpdHNlbGYgbm90IGluIHVzZS4gKi8KKwkJCW0tPmZsYWdzICY9IGNwdV90b19sZTE2KAorCQkJCQl+bGUxNl90b19jcHUoTUZUX1JFQ09SRF9JTl9VU0UpKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJLyogTWFrZSBzdXJlIHRoZSBtZnQgcmVjb3JkIGlzIHdyaXR0ZW4gb3V0IHRvIGRpc2suICovCisJCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KHBhZ2UsIG9mcyk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2M7CisJCX0KKwkJdmktPmlfaW5vID0gYml0OworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jaworCQkgKiBzaXplLgorCQkgKi8KKwkJdmktPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJLyoKKwkJICogVGhpcyBpcyBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBpbm9kZSBoYXMgY2hhbmdlZCB3LnIudC4gYQorCQkgKiBmaWxlIHNvIHRoYXQgdGhlIGZpbGUgY2FuIGJlIHVwZGF0ZWQgaWYgbmVjZXNzYXJ5IChjb21wYXJlCisJCSAqIHdpdGggZl92ZXJzaW9uKS4KKwkJICovCisJCXZpLT5pX3ZlcnNpb24gPSAxOworCisJCS8qIFRoZSBvd25lciBhbmQgZ3JvdXAgY29tZSBmcm9tIHRoZSBudGZzIHZvbHVtZS4gKi8KKwkJdmktPmlfdWlkID0gdm9sLT51aWQ7CisJCXZpLT5pX2dpZCA9IHZvbC0+Z2lkOworCisJCS8qIEluaXRpYWxpemUgdGhlIG50ZnMgc3BlY2lmaWMgcGFydCBvZiBAdmkuICovCisJCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCQluaSA9IE5URlNfSSh2aSk7CisJCS8qCisJCSAqIFNldCB0aGUgYXBwcm9wcmlhdGUgbW9kZSwgYXR0cmlidXRlIHR5cGUsIGFuZCBuYW1lLiAgRm9yCisJCSAqIGRpcmVjdG9yaWVzLCBhbHNvIHNldHVwIHRoZSBpbmRleCB2YWx1ZXMgdG8gdGhlIGRlZmF1bHRzLgorCQkgKi8KKwkJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJCXZpLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUldYVUdPOworCQkJdmktPmlfbW9kZSAmPSB+dm9sLT5kbWFzazsKKworCQkJTklub1NldE1zdFByb3RlY3RlZChuaSk7CisJCQluaS0+dHlwZSA9IEFUX0lOREVYX0FMTE9DQVRJT047CisJCQluaS0+bmFtZSA9IEkzMDsKKwkJCW5pLT5uYW1lX2xlbiA9IDQ7CisKKwkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gNDA5NjsKKwkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSBnZW5lcmljX2Zmcyg0MDk2KSAtIDE7CisJCQluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSBDT0xMQVRJT05fRklMRV9OQU1FOworCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5jbHVzdGVyX3NpemU7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPQorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCX0gZWxzZSB7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5zZWN0b3Jfc2l6ZTsKKwkJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9CisJCQkJCQl2b2wtPnNlY3Rvcl9zaXplX2JpdHM7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2aS0+aV9tb2RlID0gU19JRlJFRyB8IFNfSVJXWFVHTzsKKwkJCXZpLT5pX21vZGUgJj0gfnZvbC0+Zm1hc2s7CisKKwkJCW5pLT50eXBlID0gQVRfREFUQTsKKwkJCW5pLT5uYW1lID0gTlVMTDsKKwkJCW5pLT5uYW1lX2xlbiA9IDA7CisJCX0KKwkJaWYgKElTX1JET05MWSh2aSkpCisJCQl2aS0+aV9tb2RlICY9IH5TX0lXVUdPOworCisJCS8qIFNldCB0aGUgaW5vZGUgdGltZXMgdG8gdGhlIGN1cnJlbnQgdGltZS4gKi8KKwkJdmktPmlfYXRpbWUgPSB2aS0+aV9tdGltZSA9IHZpLT5pX2N0aW1lID0KKwkJCWN1cnJlbnRfZnNfdGltZSh2aS0+aV9zYik7CisJCS8qCisJCSAqIFNldCB0aGUgZmlsZSBzaXplIHRvIDAsIHRoZSBudGZzIGlub2RlIHNpemVzIGFyZSBzZXQgdG8gMCBieQorCQkgKiB0aGUgY2FsbCB0byBudGZzX2luaXRfYmlnX2lub2RlKCkgYmVsb3cuCisJCSAqLworCQl2aS0+aV9zaXplID0gMDsKKwkJdmktPmlfYmxvY2tzID0gMDsKKworCQkvKiBTZXQgdGhlIHNlcXVlbmNlIG51bWJlci4gKi8KKwkJdmktPmlfZ2VuZXJhdGlvbiA9IG5pLT5zZXFfbm8gPSBsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpOworCQkvKgorCQkgKiBNYW51YWxseSBtYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQgYXMgd2UgYWxyZWFkeQorCQkgKiBoYXZlIGl0cyBwYWdlIG1hcHBlZCBhbmQgaXQgaXMgdmVyeSBlYXN5IHRvIGRvLgorCQkgKi8KKwkJYXRvbWljX2luYygmbmktPmNvdW50KTsKKwkJZG93bigmbmktPm1yZWNfbG9jayk7CisJCW5pLT5wYWdlID0gcGFnZTsKKwkJbmktPnBhZ2Vfb2ZzID0gb2ZzOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkIGlzIHdyaXR0ZW4gb3V0IHRvIGRpc2suCisJCSAqIE5PVEU6IFdlIGRvIG5vdCBzZXQgdGhlIG50ZnMgaW5vZGUgZGlydHkgYmVjYXVzZSB0aGlzIHdvdWxkCisJCSAqIGZhaWwgaW4gbnRmc193cml0ZV9pbm9kZSgpIGJlY2F1c2UgdGhlIGlub2RlIGRvZXMgbm90IGhhdmUgYQorCQkgKiBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgeWV0LiAgQWxzbywgdGhlcmUgaXMgbm8gbmVlZAorCQkgKiB0byBzZXQgdGhlIGlub2RlIGRpcnR5IGJlY2F1c2UgdGhlIGNhbGxlciBpcyBnb2luZyB0byBkbworCQkgKiB0aGF0IGFueXdheSBhZnRlciBmaW5pc2hpbmcgd2l0aCB0aGUgbmV3IG1mdCByZWNvcmQgKGUuZy4gYXQKKwkJICogYSBtaW5pbXVtIHNvbWUgbmV3IGF0dHJpYnV0ZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWZ0CisJCSAqIHJlY29yZC4KKwkJICovCisJCW1hcmtfbnRmc19yZWNvcmRfZGlydHkocGFnZSwgb2ZzKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwkJLyogQWRkIHRoZSBpbm9kZSB0byB0aGUgaW5vZGUgaGFzaCBmb3IgdGhlIHN1cGVyYmxvY2suICovCisJCWluc2VydF9pbm9kZV9oYXNoKHZpKTsKKworCQkvKiBVcGRhdGUgdGhlIGRlZmF1bHQgbWZ0IGFsbG9jYXRpb24gcG9zaXRpb24uICovCisJCXZvbC0+bWZ0X2RhdGFfcG9zID0gYml0ICsgMTsKKwl9CisJLyoKKwkgKiBSZXR1cm4gdGhlIG9wZW5lZCwgYWxsb2NhdGVkIGlub2RlIG9mIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBhcworCSAqIHdlbGwgYXMgdGhlIG1hcHBlZCwgcGlubmVkLCBhbmQgbG9ja2VkIG1mdCByZWNvcmQuCisJICovCisJbnRmc19kZWJ1ZygiUmV0dXJuaW5nIG9wZW5lZCwgYWxsb2NhdGVkICVzaW5vZGUgMHglbGx4LiIsCisJCQliYXNlX25pID8gImV4dGVudCAiIDogIiIsIChsb25nIGxvbmcpYml0KTsKKwkqbXJlYyA9IG07CisJcmV0dXJuIG5pOwordW5kb19kYXRhX2luaXQ6CisJbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID0gb2xkX2RhdGFfaW5pdGlhbGl6ZWQ7CisJdm9sLT5tZnRfaW5vLT5pX3NpemUgPSBvbGRfZGF0YV9zaXplOworCWdvdG8gdW5kb19tZnRibXBfYWxsb2Nfbm9sb2NrOwordW5kb19tZnRibXBfYWxsb2M6CisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7Cit1bmRvX21mdGJtcF9hbGxvY19ub2xvY2s6CisJaWYgKG50ZnNfYml0bWFwX2NsZWFyX2JpdCh2b2wtPm1mdGJtcF9pbm8sIGJpdCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyIGJpdCBpbiBtZnQgYml0bWFwLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKK2Vycl9vdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK21heF9lcnJfb3V0OgorCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiQ2Fubm90IGFsbG9jYXRlIG1mdCByZWNvcmQgYmVjYXVzZSB0aGUgbWF4aW11bSAiCisJCQkibnVtYmVyIG9mIGlub2RlcyAoMl4zMikgaGFzIGFscmVhZHkgYmVlbiByZWFjaGVkLiIpOworCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKK30KKworLyoqCisgKiBudGZzX2V4dGVudF9tZnRfcmVjb3JkX2ZyZWUgLSBmcmVlIGFuIGV4dGVudCBtZnQgcmVjb3JkIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAbmk6CQludGZzIGlub2RlIG9mIHRoZSBtYXBwZWQgZXh0ZW50IG1mdCByZWNvcmQgdG8gZnJlZQorICogQG06CQltYXBwZWQgZXh0ZW50IG1mdCByZWNvcmQgb2YgdGhlIG50ZnMgaW5vZGUgQG5pCisgKgorICogRnJlZSB0aGUgbWFwcGVkIGV4dGVudCBtZnQgcmVjb3JkIEBtIG9mIHRoZSBleHRlbnQgbnRmcyBpbm9kZSBAbmkuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gdW5tYXBzIHRoZSBtZnQgcmVjb3JkIGFuZCBjbG9zZXMgYW5kIGRlc3Ryb3lzIEBuaQorICogaW50ZXJuYWxseSBhbmQgaGVuY2UgeW91IGNhbm5vdCB1c2UgZWl0aGVyIEBuaSBub3IgQG0gYW55IG1vcmUgYWZ0ZXIgdGhpcworICogZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzLgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIDAgYW5kIG9uIGVycm9yIHJldHVybiAtZXJybm8uICBAbmkgYW5kIEBtIGFyZSBzdGlsbCB2YWxpZAorICogaW4gdGhpcyBjYXNlIGFuZCBoYXZlIG5vdCBiZWVuIGZyZWVkLgorICoKKyAqIEZvciBzb21lIGVycm9ycyBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlIHN1Y2Nlc3MgY29kZSAwIGlzCisgKiByZXR1cm5lZCBhbmQgdGhlIHZvbHVtZSBpcyB0aGVuIGxlZnQgZGlydHkgb24gdW1vdW50LiAgVGhpcyBtYWtlcyBzZW5zZSBpbgorICogY2FzZSB3ZSBjb3VsZCBub3Qgcm9sbGJhY2sgdGhlIGNoYW5nZXMgdGhhdCB3ZXJlIGFscmVhZHkgZG9uZSBzaW5jZSB0aGUKKyAqIGNhbGxlciBubyBsb25nZXIgd2FudHMgdG8gcmVmZXJlbmNlIHRoaXMgbWZ0IHJlY29yZCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8KKyAqIHRoZSBjYWxsZXIgaWYgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggaXQgYXMgbG9uZyBhcyBpdCBpcyBwcm9wZXJseSBkZXRhY2hlZAorICogZnJvbSB0aGUgYmFzZSBpbm9kZS4KKyAqLworaW50IG50ZnNfZXh0ZW50X21mdF9yZWNvcmRfZnJlZShudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSkKK3sKKwl1bnNpZ25lZCBsb25nIG1mdF9ubyA9IG5pLT5tZnRfbm87CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKwludGZzX2lub2RlICoqZXh0ZW50X25pczsKKwlpbnQgaSwgZXJyOworCWxlMTYgb2xkX3NlcV9ubzsKKwl1MTYgc2VxX25vOworCQorCUJVR19PTihOSW5vQXR0cihuaSkpOworCUJVR19PTihuaS0+bnJfZXh0ZW50cyAhPSAtMSk7CisKKwlkb3duKCZuaS0+ZXh0ZW50X2xvY2spOworCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJdXAoJm5pLT5leHRlbnRfbG9jayk7CisKKwlCVUdfT04oYmFzZV9uaS0+bnJfZXh0ZW50cyA8PSAwKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBleHRlbnQgaW5vZGUgMHglbHgsIGJhc2UgaW5vZGUgMHglbHguXG4iLAorCQkJbWZ0X25vLCBiYXNlX25pLT5tZnRfbm8pOworCisJZG93bigmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBob2xkaW5nIHRoZSBvbmx5IHJlZmVyZW5jZSB0byB0aGUgZXh0ZW50IGlub2RlLiAqLworCWlmIChhdG9taWNfcmVhZCgmbmktPmNvdW50KSA+IDIpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiVHJpZWQgdG8gZnJlZSBidXN5IGV4dGVudCBpbm9kZSAweCVseCwgIgorCQkJCSJub3QgZnJlZWluZy4iLCBiYXNlX25pLT5tZnRfbm8pOworCQl1cCgmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIERpc3NvY2lhdGUgdGhlIG50ZnMgaW5vZGUgZnJvbSB0aGUgYmFzZSBpbm9kZS4gKi8KKwlleHRlbnRfbmlzID0gYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3M7CisJZXJyID0gLUVOT0VOVDsKKwlmb3IgKGkgPSAwOyBpIDwgYmFzZV9uaS0+bnJfZXh0ZW50czsgaSsrKSB7CisJCWlmIChuaSAhPSBleHRlbnRfbmlzW2ldKQorCQkJY29udGludWU7CisJCWV4dGVudF9uaXMgKz0gaTsKKwkJYmFzZV9uaS0+bnJfZXh0ZW50cy0tOworCQltZW1tb3ZlKGV4dGVudF9uaXMsIGV4dGVudF9uaXMgKyAxLCAoYmFzZV9uaS0+bnJfZXh0ZW50cyAtIGkpICoKKwkJCQlzaXplb2YobnRmc19pbm9kZSopKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkV4dGVudCBpbm9kZSAweCVseCBpcyBub3QgYXR0YWNoZWQgdG8gIgorCQkJCSJpdHMgYmFzZSBpbm9kZSAweCVseC4iLCBtZnRfbm8sCisJCQkJYmFzZV9uaS0+bWZ0X25vKTsKKwkJQlVHKCk7CisJfQorCisJLyoKKwkgKiBUaGUgZXh0ZW50IGlub2RlIGlzIG5vIGxvbmdlciBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSBzbyBubyBvbmUKKwkgKiBjYW4gZ2V0IGEgcmVmZXJlbmNlIHRvIGl0IGFueSBtb3JlLgorCSAqLworCisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBhcyBub3QgaW4gdXNlLiAqLworCW0tPmZsYWdzICY9IGNvbnN0X2NwdV90b19sZTE2KH5jb25zdF9sZTE2X3RvX2NwdShNRlRfUkVDT1JEX0lOX1VTRSkpOworCisJLyogSW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIsIHNraXBwaW5nIHplcm8sIGlmIGl0IGlzIG5vdCB6ZXJvLiAqLworCW9sZF9zZXFfbm8gPSBtLT5zZXF1ZW5jZV9udW1iZXI7CisJc2VxX25vID0gbGUxNl90b19jcHUob2xkX3NlcV9ubyk7CisJaWYgKHNlcV9ubyA9PSAweGZmZmYpCisJCXNlcV9ubyA9IDE7CisJZWxzZSBpZiAoc2VxX25vKQorCQlzZXFfbm8rKzsKKwltLT5zZXF1ZW5jZV9udW1iZXIgPSBjcHVfdG9fbGUxNihzZXFfbm8pOworCisJLyoKKwkgKiBTZXQgdGhlIG50ZnMgaW5vZGUgZGlydHkgYW5kIHdyaXRlIGl0IG91dC4gIFdlIGRvIG5vdCBuZWVkIHRvIHdvcnJ5CisJICogYWJvdXQgdGhlIGJhc2UgaW5vZGUgaGVyZSBzaW5jZSB3aGF0ZXZlciBjYXVzZWQgdGhlIGV4dGVudCBtZnQKKwkgKiByZWNvcmQgdG8gYmUgZnJlZWQgaXMgZ3VhcmFudGVlZCB0byBkbyBpdCBhbHJlYWR5LgorCSAqLworCU5Jbm9TZXREaXJ0eShuaSk7CisJZXJyID0gd3JpdGVfbWZ0X3JlY29yZChuaSwgbSwgMCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIG1mdCByZWNvcmQgMHglbHgsIG5vdCAiCisJCQkJImZyZWVpbmcuIiwgbWZ0X25vKTsKKwkJZ290byByb2xsYmFjazsKKwl9Cityb2xsYmFja19lcnJvcjoKKwkvKiBVbm1hcCBhbmQgdGhyb3cgYXdheSB0aGUgbm93IGZyZWVkIGV4dGVudCBpbm9kZS4gKi8KKwl1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChuaSk7CisJbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobmkpOworCisJLyogQ2xlYXIgdGhlIGJpdCBpbiB0aGUgJE1GVC8kQklUTUFQIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZWNvcmQuICovCisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJZXJyID0gbnRmc19iaXRtYXBfY2xlYXJfYml0KHZvbC0+bWZ0Ym1wX2lubywgbWZ0X25vKTsKKwl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJLyoKKwkJICogVGhlIGV4dGVudCBpbm9kZSBpcyBnb25lIGJ1dCB3ZSBmYWlsZWQgdG8gZGVhbGxvY2F0ZSBpdCBpbgorCQkgKiB0aGUgbWZ0IGJpdG1hcC4gIEp1c3QgZW1pdCBhIHdhcm5pbmcgYW5kIGxlYXZlIHRoZSB2b2x1bWUKKwkJICogZGlydHkgb24gdW1vdW50LgorCQkgKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyIGJpdCBpbiBtZnQgYml0bWFwLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXJldHVybiAwOworcm9sbGJhY2s6CisJLyogUm9sbGJhY2sgd2hhdCB3ZSBkaWQuLi4gKi8KKwlkb3duKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJZXh0ZW50X25pcyA9IGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zOworCWlmICghKGJhc2VfbmktPm5yX2V4dGVudHMgJiAzKSkgeworCQlpbnQgbmV3X3NpemUgPSAoYmFzZV9uaS0+bnJfZXh0ZW50cyArIDQpICogc2l6ZW9mKG50ZnNfaW5vZGUqKTsKKworCQlleHRlbnRfbmlzID0gKG50ZnNfaW5vZGUqKilrbWFsbG9jKG5ld19zaXplLCBHRlBfTk9GUyk7CisJCWlmICh1bmxpa2VseSghZXh0ZW50X25pcykpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcm5hbCAiCisJCQkJCSJidWZmZXIgZHVyaW5nIHJvbGxiYWNrLiVzIiwgZXMpOworCQkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCWdvdG8gcm9sbGJhY2tfZXJyb3I7CisJCX0KKwkJaWYgKGJhc2VfbmktPm5yX2V4dGVudHMpIHsKKwkJCUJVR19PTighYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MpOworCQkJbWVtY3B5KGV4dGVudF9uaXMsIGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zLAorCQkJCQluZXdfc2l6ZSAtIDQgKiBzaXplb2YobnRmc19pbm9kZSopKTsKKwkJCWtmcmVlKGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwkJfQorCQliYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcyA9IGV4dGVudF9uaXM7CisJfQorCW0tPmZsYWdzIHw9IE1GVF9SRUNPUkRfSU5fVVNFOworCW0tPnNlcXVlbmNlX251bWJlciA9IG9sZF9zZXFfbm87CisJZXh0ZW50X25pc1tiYXNlX25pLT5ucl9leHRlbnRzKytdID0gbmk7CisJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkobmkpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tZnQuaCBiL2ZzL250ZnMvbWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ZGUyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbWZ0LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBtZnQuaCAtIERlZmluZXMgZm9yIG1mdCByZWNvcmQgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgorICoJICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfTUZUX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfTUZUX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImlub2RlLmgiCisKK2V4dGVybiBNRlRfUkVDT1JEICptYXBfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSk7CitleHRlcm4gdm9pZCB1bm1hcF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKm5pKTsKKworZXh0ZXJuIE1GVF9SRUNPUkQgKm1hcF9leHRlbnRfbWZ0X3JlY29yZChudGZzX2lub2RlICpiYXNlX25pLCBNRlRfUkVGIG1yZWYsCisJCW50ZnNfaW5vZGUgKipudGZzX2lubyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSkKK3sKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZSAtIGZsdXNoX2RjYWNoZV9wYWdlKCkgZm9yIG1mdCByZWNvcmRzCisgKiBAbmk6CQludGZzIGlub2RlIHN0cnVjdHVyZSBvZiBtZnQgcmVjb3JkCisgKgorICogQ2FsbCBmbHVzaF9kY2FjaGVfcGFnZSgpIGZvciB0aGUgcGFnZSBpbiB3aGljaCBhbiBtZnQgcmVjb3JkIHJlc2lkZXMuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGFuIG1mdCByZWNvcmQgaXMgbW9kaWZpZWQsIGp1c3QgYWZ0ZXIgdGhlCisgKiBtb2RpZmljYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKG50ZnNfaW5vZGUgKm5pKQoreworCWZsdXNoX2RjYWNoZV9wYWdlKG5pLT5wYWdlKTsKK30KKworZXh0ZXJuIHZvaWQgX19tYXJrX21mdF9yZWNvcmRfZGlydHkobnRmc19pbm9kZSAqbmkpOworCisvKioKKyAqIG1hcmtfbWZ0X3JlY29yZF9kaXJ0eSAtIHNldCB0aGUgbWZ0IHJlY29yZCBhbmQgdGhlIHBhZ2UgY29udGFpbmluZyBpdCBkaXJ0eQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBtYXBwZWQgbWZ0IHJlY29yZAorICoKKyAqIFNldCB0aGUgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQgb2YgdGhlIChiYXNlIG9yIGV4dGVudCkgbnRmcyBpbm9kZSBAbmksCisgKiBhcyB3ZWxsIGFzIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG1mdCByZWNvcmQsIGRpcnR5LiAgQWxzbywgbWFyayB0aGUgYmFzZQorICogdmZzIGlub2RlIGRpcnR5LiAgVGhpcyBlbnN1cmVzIHRoYXQgYW55IGNoYW5nZXMgdG8gdGhlIG1mdCByZWNvcmQgYXJlCisgKiB3cml0dGVuIG91dCB0byBkaXNrLgorICoKKyAqIE5PVEU6ICBEbyBub3QgZG8gYW55dGhpbmcgaWYgdGhlIG1mdCByZWNvcmQgaXMgYWxyZWFkeSBtYXJrZWQgZGlydHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX21mdF9yZWNvcmRfZGlydHkobnRmc19pbm9kZSAqbmkpCit7CisJaWYgKCFOSW5vVGVzdFNldERpcnR5KG5pKSkKKwkJX19tYXJrX21mdF9yZWNvcmRfZGlydHkobmkpOworfQorCitleHRlcm4gaW50IG50ZnNfc3luY19tZnRfbWlycm9yKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLAorCQlNRlRfUkVDT1JEICptLCBpbnQgc3luYyk7CisKK2V4dGVybiBpbnQgd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2sobnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm0sIGludCBzeW5jKTsKKworLyoqCisgKiB3cml0ZV9tZnRfcmVjb3JkIC0gd3JpdGUgb3V0IGEgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQKKyAqIEBtOgkJbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQgdG8gd3JpdGUKKyAqIEBzeW5jOglpZiB0cnVlLCB3YWl0IGZvciBpL28gY29tcGxldGlvbgorICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgZm9yIHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKCkgKHNlZSBtZnQuYyksIHdoaWNoCisgKiBsb2NrcyB0aGUgcGFnZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3cml0ZS4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZQorICogbm8gcmFjZSBjb25kaXRpb25zIGJldHdlZW4gd3JpdGluZyB0aGUgbWZ0IHJlY29yZCB2aWEgdGhlIGRpcnR5IGlub2RlIGNvZGUKKyAqIHBhdGhzIGFuZCB2aWEgdGhlIHBhZ2UgY2FjaGUgd3JpdGUgYmFjayBjb2RlIHBhdGhzIG9yIGJldHdlZW4gd3JpdGluZworICogbmVpZ2hib3VyaW5nIG1mdCByZWNvcmRzIHJlc2lkaW5nIGluIHRoZSBzYW1lIHBhZ2UuCisgKgorICogTG9ja2luZyB0aGUgcGFnZSBhbHNvIHNlcmlhbGl6ZXMgdXMgYWdhaW5zdCAtPnJlYWRwYWdlKCkgaWYgdGhlIHBhZ2UgaXMgbm90CisgKiB1cHRvZGF0ZS4KKyAqCisgKiBPbiBzdWNjZXNzLCBjbGVhbiB0aGUgbWZ0IHJlY29yZCBhbmQgcmV0dXJuIDAuICBPbiBlcnJvciwgbGVhdmUgdGhlIG1mdAorICogcmVjb3JkIGRpcnR5IGFuZCByZXR1cm4gLWVycm5vLiAgVGhlIGNhbGxlciBzaG91bGQgY2FsbCBtYWtlX2JhZF9pbm9kZSgpIG9uCisgKiB0aGUgYmFzZSBpbm9kZSB0byBlbnN1cmUgbm8gbW9yZSBhY2Nlc3MgaGFwcGVucyB0byB0aGlzIGlub2RlLiAgV2UgZG8gbm90IGRvCisgKiBpdCBoZXJlIGFzIHRoZSBjYWxsZXIgbWF5IHdhbnQgdG8gZmluaXNoIHdyaXRpbmcgb3RoZXIgZXh0ZW50IG1mdCByZWNvcmRzCisgKiBmaXJzdCB0byBtaW5pbWl6ZSBvbi1kaXNrIG1ldGFkYXRhIGluY29uc2lzdGVuY2llcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSwgaW50IHN5bmMpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBuaS0+cGFnZTsKKwlpbnQgZXJyOworCisJQlVHX09OKCFwYWdlKTsKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2sobmksIG0sIHN5bmMpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK2V4dGVybiBCT09MIG50ZnNfbWF5X3dyaXRlX21mdF9yZWNvcmQobnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBtZnRfbm8sIGNvbnN0IE1GVF9SRUNPUkQgKm0sCisJCW50ZnNfaW5vZGUgKipsb2NrZWRfbmkpOworCitleHRlcm4gbnRmc19pbm9kZSAqbnRmc19tZnRfcmVjb3JkX2FsbG9jKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IGludCBtb2RlLAorCQludGZzX2lub2RlICpiYXNlX25pLCBNRlRfUkVDT1JEICoqbXJlYyk7CitleHRlcm4gaW50IG50ZnNfZXh0ZW50X21mdF9yZWNvcmRfZnJlZShudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19NRlRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tc3QuYyBiL2ZzL250ZnMvbXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4NThkOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbXN0LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBtc3QuYyAtIE5URlMgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24gaGFuZGxpbmcgY29kZS4gUGFydCBvZiB0aGUKKyAqCSAgIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIHBvc3RfcmVhZF9tc3RfZml4dXAgLSBkZXByb3RlY3QgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3RlZCBkYXRhCisgKiBAYjoJCXBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gZGVwcm90ZWN0CisgKiBAc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBAYgorICoKKyAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBwb3N0IHJlYWQgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGFuZCBkZXRlY3QgdGhlCisgKiBwcmVzZW5jZSBvZiBpbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlcnMuIC0gSW4gdGhhdCBjYXNlLCBvdmVyd3JpdGUgdGhlCisgKiBtYWdpYyBvZiB0aGUgbnRmcyByZWNvcmQgaGVhZGVyIGJlaW5nIHByb2Nlc3NlZCB3aXRoICJCQUFEIiAoaW4gbWVtb3J5IG9ubHkhKQorICogYW5kIGFib3J0IHByb2Nlc3NpbmcuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLUVJTlZBTCBvbiBlcnJvciAoIkJBQUQiIG1hZ2ljIHdpbGwgYmUgcHJlc2VudCkuCisgKgorICogTk9URTogV2UgY29uc2lkZXIgdGhlIGFic2VuY2UgLyBpbnZhbGlkaXR5IG9mIGFuIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSB0bworICogbWVhbiB0aGF0IHRoZSBzdHJ1Y3R1cmUgaXMgbm90IHByb3RlY3RlZCBhdCBhbGwgYW5kIGhlbmNlIGRvZXNuJ3QgbmVlZCB0bworICogYmUgZml4ZWQgdXAuIFRodXMsIHdlIHJldHVybiBzdWNjZXNzIGFuZCBub3QgZmFpbHVyZSBpbiB0aGlzIGNhc2UuIFRoaXMgaXMKKyAqIGluIGNvbnRyYXN0IHRvIHByZV93cml0ZV9tc3RfZml4dXAoKSwgc2VlIGJlbG93LgorICovCitpbnQgcG9zdF9yZWFkX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYiwgY29uc3QgdTMyIHNpemUpCit7CisJdTE2IHVzYV9vZnMsIHVzYV9jb3VudCwgdXNuOworCXUxNiAqdXNhX3BvcywgKmRhdGFfcG9zOworCisJLyogU2V0dXAgdGhlIHZhcmlhYmxlcy4gKi8KKwl1c2Ffb2ZzID0gbGUxNl90b19jcHUoYi0+dXNhX29mcyk7CisJLyogRGVjcmVtZW50IHVzYV9jb3VudCB0byBnZXQgbnVtYmVyIG9mIGZpeHVwcy4gKi8KKwl1c2FfY291bnQgPSBsZTE2X3RvX2NwdShiLT51c2FfY291bnQpIC0gMTsKKwkvKiBTaXplIGFuZCBhbGlnbm1lbnQgY2hlY2tzLiAqLworCWlmICggc2l6ZSAmIChOVEZTX0JMT0NLX1NJWkUgLSAxKQl8fAorCSAgICAgdXNhX29mcyAmIDEJCQl8fAorCSAgICAgdXNhX29mcyArICh1c2FfY291bnQgKiAyKSA+IHNpemUJfHwKKwkgICAgIChzaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTKSAhPSB1c2FfY291bnQpCisJCXJldHVybiAwOworCS8qIFBvc2l0aW9uIG9mIHVzbiBpbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX3BvcyA9ICh1MTYqKWIgKyB1c2Ffb2ZzL3NpemVvZih1MTYpOworCS8qCisJICogVGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggaGFzIHRvIGJlIGVxdWFsIHRvIGVhY2ggb2YgdGhlCisJICogdTE2IHZhbHVlcyBiZWZvcmUgdGhleSBhcmUgZml4ZWQgdXAuIE5vdGUgbm8gbmVlZCB0byBjYXJlIGZvcgorCSAqIGVuZGlhbm5lc3Mgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBhbmQgbW92aW5nIGRhdGEgZm9yIG9uIGRpc2sKKwkgKiBzdHJ1Y3R1cmVzIHdoaWNoIG1lYW5zIHRoZSBkYXRhIGlzIGNvbnNpc3RlbnQuIC0gSWYgaXQgaXMKKwkgKiBjb25zaXN0ZW50eSB0aGUgd3JvbmcgZW5kaWFubmVzcyBpdCBkb2Vzbid0IG1ha2UgYW55IGRpZmZlcmVuY2UuCisJICovCisJdXNuID0gKnVzYV9wb3M7CisJLyoKKwkgKiBQb3NpdGlvbiBpbiBwcm90ZWN0ZWQgZGF0YSBvZiBmaXJzdCB1MTYgdGhhdCBuZWVkcyBmaXhpbmcgdXAuCisJICovCisJZGF0YV9wb3MgPSAodTE2KiliICsgTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpIC0gMTsKKwkvKgorCSAqIENoZWNrIGZvciBpbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlcihzKS4KKwkgKi8KKwl3aGlsZSAodXNhX2NvdW50LS0pIHsKKwkJaWYgKCpkYXRhX3BvcyAhPSB1c24pIHsKKwkJCS8qCisJCQkgKiBJbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXRlY3RlZCEgKS06CisJCQkgKiBTZXQgdGhlIG1hZ2ljIHRvICJCQUFEIiBhbmQgcmV0dXJuIGZhaWx1cmUuCisJCQkgKiBOb3RlIHRoYXQgbWFnaWNfQkFBRCBpcyBhbHJlYWR5IGNvbnZlcnRlZCB0byBsZTMyLgorCQkJICovCisJCQliLT5tYWdpYyA9IG1hZ2ljX0JBQUQ7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkYXRhX3BvcyArPSBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKHUxNik7CisJfQorCS8qIFJlLXNldHVwIHRoZSB2YXJpYWJsZXMuICovCisJdXNhX2NvdW50ID0gbGUxNl90b19jcHUoYi0+dXNhX2NvdW50KSAtIDE7CisJZGF0YV9wb3MgPSAodTE2KiliICsgTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpIC0gMTsKKwkvKiBGaXh1cCBhbGwgc2VjdG9ycy4gKi8KKwl3aGlsZSAodXNhX2NvdW50LS0pIHsKKwkJLyoKKwkJICogSW5jcmVtZW50IHBvc2l0aW9uIGluIHVzYSBhbmQgcmVzdG9yZSBvcmlnaW5hbCBkYXRhIGZyb20KKwkJICogdGhlIHVzYSBpbnRvIHRoZSBkYXRhIGJ1ZmZlci4KKwkJICovCisJCSpkYXRhX3BvcyA9ICooKyt1c2FfcG9zKTsKKwkJLyogSW5jcmVtZW50IHBvc2l0aW9uIGluIGRhdGEgYXMgd2VsbC4gKi8KKwkJZGF0YV9wb3MgKz0gTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwcmVfd3JpdGVfbXN0X2ZpeHVwIC0gYXBwbHkgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24KKyAqIEBiOgkJcG9pbnRlciB0byB0aGUgZGF0YSB0byBwcm90ZWN0CisgKiBAc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBAYgorICoKKyAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBwcmUgd3JpdGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIG9uIHRoZSBkYXRhCisgKiBwb2ludGVyIHRvIGJ5IEBiIG9mIEBzaXplLgorICoKKyAqIFJldHVybiAwIGlmIGZpeHVwIGFwcGxpZWQgKHN1Y2Nlc3MpIG9yIC1FSU5WQUwgaWYgbm8gZml4dXAgd2FzIHBlcmZvcm1lZAorICogKGFzc3VtZWQgbm90IG5lZWRlZCkuIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gcG9zdF9yZWFkX21zdF9maXh1cCgpIGFib3ZlLgorICoKKyAqIE5PVEU6IFdlIGNvbnNpZGVyIHRoZSBhYnNlbmNlIC8gaW52YWxpZGl0eSBvZiBhbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgdG8KKyAqIG1lYW4gdGhhdCB0aGUgc3RydWN0dXJlIGlzIG5vdCBzdWJqZWN0IHRvIHByb3RlY3Rpb24gYW5kIGhlbmNlIGRvZXNuJ3QgbmVlZAorICogdG8gYmUgZml4ZWQgdXAuIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB0byBjcmVhdGUgYSB2YWxpZCB1cGRhdGUgc2VxdWVuY2UKKyAqIGFycmF5IGhlYWRlciBpbiB0aGUgbnRmcyByZWNvcmQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXJ3aXNlIGl0CisgKiB3aWxsIGZhaWwgKHRoZSBoZWFkZXIgbmVlZHMgdG8gY29udGFpbiB0aGUgcG9zaXRpb24gb2YgdGhlIHVwZGF0ZSBzZXF1ZW5jZQorICogYXJyYXkgdG9nZXRoZXIgd2l0aCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSkuIFlvdSBhbHNvIG5lZWQgdG8KKyAqIGluaXRpYWxpc2UgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogb3RoZXJ3aXNlIGEgcmFuZG9tIHdvcmQgd2lsbCBiZSB1c2VkICh3aGF0ZXZlciB3YXMgaW4gdGhlIHJlY29yZCBhdCB0aGF0CisgKiBwb3NpdGlvbiBhdCB0aGF0IHRpbWUpLgorICovCitpbnQgcHJlX3dyaXRlX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYiwgY29uc3QgdTMyIHNpemUpCit7CisJbGUxNiAqdXNhX3BvcywgKmRhdGFfcG9zOworCXUxNiB1c2Ffb2ZzLCB1c2FfY291bnQsIHVzbjsKKwlsZTE2IGxlX3VzbjsKKworCS8qIFNhbml0eSBjaGVjayArIG9ubHkgZml4dXAgaWYgaXQgbWFrZXMgc2Vuc2UuICovCisJaWYgKCFiIHx8IG50ZnNfaXNfYmFhZF9yZWNvcmQoYi0+bWFnaWMpIHx8CisJCQludGZzX2lzX2hvbGVfcmVjb3JkKGItPm1hZ2ljKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogU2V0dXAgdGhlIHZhcmlhYmxlcy4gKi8KKwl1c2Ffb2ZzID0gbGUxNl90b19jcHUoYi0+dXNhX29mcyk7CisJLyogRGVjcmVtZW50IHVzYV9jb3VudCB0byBnZXQgbnVtYmVyIG9mIGZpeHVwcy4gKi8KKwl1c2FfY291bnQgPSBsZTE2X3RvX2NwdShiLT51c2FfY291bnQpIC0gMTsKKwkvKiBTaXplIGFuZCBhbGlnbm1lbnQgY2hlY2tzLiAqLworCWlmICggc2l6ZSAmIChOVEZTX0JMT0NLX1NJWkUgLSAxKQl8fAorCSAgICAgdXNhX29mcyAmIDEJCQl8fAorCSAgICAgdXNhX29mcyArICh1c2FfY291bnQgKiAyKSA+IHNpemUJfHwKKwkgICAgIChzaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTKSAhPSB1c2FfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFBvc2l0aW9uIG9mIHVzbiBpbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX3BvcyA9IChsZTE2KikoKHU4KiliICsgdXNhX29mcyk7CisJLyoKKwkgKiBDeWNsaWNhbGx5IGluY3JlbWVudCB0aGUgdXBkYXRlIHNlcXVlbmNlIG51bWJlcgorCSAqIChza2lwcGluZyAwIGFuZCAtMSwgaS5lLiAweGZmZmYpLgorCSAqLworCXVzbiA9IGxlMTZfdG9fY3B1cCh1c2FfcG9zKSArIDE7CisJaWYgKHVzbiA9PSAweGZmZmYgfHwgIXVzbikKKwkJdXNuID0gMTsKKwlsZV91c24gPSBjcHVfdG9fbGUxNih1c24pOworCSp1c2FfcG9zID0gbGVfdXNuOworCS8qIFBvc2l0aW9uIGluIGRhdGEgb2YgZmlyc3QgdTE2IHRoYXQgbmVlZHMgZml4aW5nIHVwLiAqLworCWRhdGFfcG9zID0gKGxlMTYqKWIgKyBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGxlMTYpIC0gMTsKKwkvKiBGaXh1cCBhbGwgc2VjdG9ycy4gKi8KKwl3aGlsZSAodXNhX2NvdW50LS0pIHsKKwkJLyoKKwkJICogSW5jcmVtZW50IHRoZSBwb3NpdGlvbiBpbiB0aGUgdXNhIGFuZCBzYXZlIHRoZQorCQkgKiBvcmlnaW5hbCBkYXRhIGZyb20gdGhlIGRhdGEgYnVmZmVyIGludG8gdGhlIHVzYS4KKwkJICovCisJCSooKyt1c2FfcG9zKSA9ICpkYXRhX3BvczsKKwkJLyogQXBwbHkgZml4dXAgdG8gZGF0YS4gKi8KKwkJKmRhdGFfcG9zID0gbGVfdXNuOworCQkvKiBJbmNyZW1lbnQgcG9zaXRpb24gaW4gZGF0YSBhcyB3ZWxsLiAqLworCQlkYXRhX3BvcyArPSBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGxlMTYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwb3N0X3dyaXRlX21zdF9maXh1cCAtIGZhc3QgZGVwcm90ZWN0IG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0ZWQgZGF0YQorICogQGI6CQlwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGRlcHJvdGVjdAorICoKKyAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBwb3N0IHdyaXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCwgbm90IGNoZWNraW5nCisgKiBmb3IgYW55IGVycm9ycywgYmVjYXVzZSB3ZSBhc3N1bWUgd2UgaGF2ZSBqdXN0IHVzZWQgcHJlX3dyaXRlX21zdF9maXh1cCgpLAorICogdGh1cyB0aGUgZGF0YSB3aWxsIGJlIGZpbmUgb3Igd2Ugd291bGQgbmV2ZXIgaGF2ZSBnb3R0ZW4gaGVyZS4KKyAqLwordm9pZCBwb3N0X3dyaXRlX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYikKK3sKKwlsZTE2ICp1c2FfcG9zLCAqZGF0YV9wb3M7CisKKwl1MTYgdXNhX29mcyA9IGxlMTZfdG9fY3B1KGItPnVzYV9vZnMpOworCXUxNiB1c2FfY291bnQgPSBsZTE2X3RvX2NwdShiLT51c2FfY291bnQpIC0gMTsKKworCS8qIFBvc2l0aW9uIG9mIHVzbiBpbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX3BvcyA9IChsZTE2KiliICsgdXNhX29mcy9zaXplb2YobGUxNik7CisKKwkvKiBQb3NpdGlvbiBpbiBwcm90ZWN0ZWQgZGF0YSBvZiBmaXJzdCB1MTYgdGhhdCBuZWVkcyBmaXhpbmcgdXAuICovCisJZGF0YV9wb3MgPSAobGUxNiopYiArIE5URlNfQkxPQ0tfU0laRS9zaXplb2YobGUxNikgLSAxOworCisJLyogRml4dXAgYWxsIHNlY3RvcnMuICovCisJd2hpbGUgKHVzYV9jb3VudC0tKSB7CisJCS8qCisJCSAqIEluY3JlbWVudCBwb3NpdGlvbiBpbiB1c2EgYW5kIHJlc3RvcmUgb3JpZ2luYWwgZGF0YSBmcm9tCisJCSAqIHRoZSB1c2EgaW50byB0aGUgZGF0YSBidWZmZXIuCisJCSAqLworCQkqZGF0YV9wb3MgPSAqKCsrdXNhX3Bvcyk7CisKKwkJLyogSW5jcmVtZW50IHBvc2l0aW9uIGluIGRhdGEgYXMgd2VsbC4gKi8KKwkJZGF0YV9wb3MgKz0gTlRGU19CTE9DS19TSVpFL3NpemVvZihsZTE2KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL25hbWVpLmMgYi9mcy9udGZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZTEzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbmFtZWkuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIG5hbWVpLmMgLSBOVEZTIGtlcm5lbCBkaXJlY3RvcnkgaW5vZGUgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUworICoJICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19sb29rdXAgLSBmaW5kIHRoZSBpbm9kZSByZXByZXNlbnRlZCBieSBhIGRlbnRyeSBpbiBhIGRpcmVjdG9yeSBpbm9kZQorICogQGRpcl9pbm86CWRpcmVjdG9yeSBpbm9kZSBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgaW5vZGUKKyAqIEBkZW50OglkZW50cnkgcmVwcmVzZW50aW5nIHRoZSBpbm9kZSB0byBsb29rIGZvcgorICogQG5kOgkJbG9va3VwIG5hbWVpZGF0YQorICoKKyAqIEluIHNob3J0LCBudGZzX2xvb2t1cCgpIGxvb2tzIGZvciB0aGUgaW5vZGUgcmVwcmVzZW50ZWQgYnkgdGhlIGRlbnRyeSBAZGVudAorICogaW4gdGhlIGRpcmVjdG9yeSBpbm9kZSBAZGlyX2lubyBhbmQgaWYgZm91bmQgYXR0YWNoZXMgdGhlIGlub2RlIHRvIHRoZQorICogZGVudHJ5IEBkZW50LgorICoKKyAqIEluIG1vcmUgZGV0YWlsLCB0aGUgZGVudHJ5IEBkZW50IHNwZWNpZmllcyB3aGljaCBpbm9kZSB0byBsb29rIGZvciBieQorICogc3VwcGx5aW5nIHRoZSBuYW1lIG9mIHRoZSBpbm9kZSBpbiBAZGVudC0+ZF9uYW1lLm5hbWUuIG50ZnNfbG9va3VwKCkKKyAqIGNvbnZlcnRzIHRoZSBuYW1lIHRvIFVuaWNvZGUgYW5kIHdhbGtzIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGlub2RlCisgKiBAZGlyX2lubyBsb29raW5nIGZvciB0aGUgY29udmVydGVkIFVuaWNvZGUgbmFtZS4gSWYgdGhlIG5hbWUgaXMgZm91bmQgaW4gdGhlCisgKiBkaXJlY3RvcnksIHRoZSBjb3JyZXNwb25kaW5nIGlub2RlIGlzIGxvYWRlZCBieSBjYWxsaW5nIG50ZnNfaWdldCgpIG9uIGl0cworICogaW5vZGUgbnVtYmVyIGFuZCB0aGUgaW5vZGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZW50cnkgQGRlbnQgdmlhIGEgY2FsbCB0bworICogZF9zcGxpY2VfYWxpYXMoKS4KKyAqCisgKiBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeSwgYSBOVUxMIGlub2RlIGlzIGluc2VydGVkIGludG8gdGhlCisgKiBkZW50cnkgQGRlbnQgdmlhIGEgY2FsbCB0byBkX2FkZCgpLiBUaGUgZGVudHJ5IGlzIHRoZW4gdGVybWVkIGEgbmVnYXRpdmUKKyAqIGRlbnRyeS4KKyAqCisgKiBPbmx5IGlmIGFuIGFjdHVhbCBlcnJvciBvY2N1cnMsIGRvIHdlIHJldHVybiBhbiBlcnJvciB2aWEgRVJSX1BUUigpLgorICoKKyAqIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSBpbnNlbnNpdGl2aXR5IGlzc3VlcyBvZiBOVEZTIHdpdGggcmVnYXJkcyB0byB0aGUKKyAqIGRjYWNoZSBhbmQgdGhlIGRjYWNoZSByZXF1aXJpbmcgb25seSBvbmUgZGVudHJ5IHBlciBkaXJlY3RvcnksIHdlIGRlYWwgd2l0aAorICogZGVudHJ5IGFsaWFzZXMgdGhhdCBvbmx5IGRpZmZlciBpbiBjYXNlIGluIC0+bnRmc19sb29rdXAoKSB3aGlsZSBtYWludGFpbmluZworICogYSBjYXNlIHNlbnNpdGl2ZSBkY2FjaGUuIFRoaXMgbWVhbnMgdGhhdCB3ZSBnZXQgdGhlIGZ1bGwgYmVuZWZpdCBvZiBkY2FjaGUKKyAqIHNwZWVkIHdoZW4gdGhlIGZpbGUvZGlyZWN0b3J5IGlzIGxvb2tlZCB1cCB3aXRoIHRoZSBzYW1lIGNhc2UgYXMgcmV0dXJuZWQgYnkKKyAqIC0+bnRmc19yZWFkZGlyKCkgYnV0IHRoYXQgYSBsb29rdXAgZm9yIGFueSBvdGhlciBjYXNlIChvciBmb3IgdGhlIHNob3J0IGZpbGUKKyAqIG5hbWUpIHdpbGwgbm90IGZpbmQgYW55dGhpbmcgaW4gZGNhY2hlIGFuZCB3aWxsIGVudGVyIC0+bnRmc19sb29rdXAoKQorICogaW5zdGVhZCwgd2hlcmUgd2Ugc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIGEgZnVsbHkgbWF0Y2hpbmcgZmlsZSBuYW1lCisgKiAoaW5jbHVkaW5nIGNhc2UpIGFuZCBpZiB0aGF0IGlzIG5vdCBmb3VuZCwgd2Ugc2VhcmNoIGZvciBhIGZpbGUgbmFtZSB0aGF0CisgKiBtYXRjaGVzIHdpdGggZGlmZmVyZW50IGNhc2UgYW5kIGlmIHRoYXQgaGFzIG5vbi1QT1NJWCBzZW1hbnRpY3Mgd2UgcmV0dXJuCisgKiB0aGF0LiBXZSBhY3R1YWxseSBkbyBvbmx5IG9uZSBzZWFyY2ggKGNhc2Ugc2Vuc2l0aXZlKSBhbmQga2VlcCB0YWJzIG9uCisgKiB3aGV0aGVyIHdlIGhhdmUgZm91bmQgYSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoIGluIHRoZSBwcm9jZXNzLgorICoKKyAqIFRvIHNpbXBsaWZ5IG1hdHRlcnMgZm9yIHVzLCB3ZSBkbyBub3QgdHJlYXQgdGhlIHNob3J0IHZzIGxvbmcgZmlsZW5hbWVzIGFzCisgKiB0d28gaGFyZCBsaW5rcyBidXQgaW5zdGVhZCBpZiB0aGUgbG9va3VwIG1hdGNoZXMgYSBzaG9ydCBmaWxlbmFtZSwgd2UKKyAqIHJldHVybiB0aGUgZGVudHJ5IGZvciB0aGUgY29ycmVzcG9uZGluZyBsb25nIGZpbGVuYW1lIGluc3RlYWQuCisgKgorICogVGhlcmUgYXJlIHRocmVlIGNhc2VzIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggaGVyZToKKyAqCisgKiAxKSBAZGVudCBwZXJmZWN0bHkgbWF0Y2hlcyAoaS5lLiBpbmNsdWRpbmcgY2FzZSkgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhCisgKiAgICBmaWxlIG5hbWUgaW4gdGhlIFdJTjMyIG9yIFBPU0lYIG5hbWVzcGFjZXMuIEluIHRoaXMgY2FzZQorICogICAgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIHdpbGwgcmV0dXJuIHdpdGggbmFtZSBzZXQgdG8gTlVMTCBhbmQgd2UKKyAqICAgIGp1c3QgZF9zcGxpY2VfYWxpYXMoKSBAZGVudC4KKyAqIDIpIEBkZW50IG1hdGNoZXMgKG5vdCBpbmNsdWRpbmcgY2FzZSkgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIGZpbGUgbmFtZSBpbgorICogICAgdGhlIFdJTjMyIG5hbWVzcGFjZS4gSW4gdGhpcyBjYXNlIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSB3aWxsIHJldHVybgorICogICAgd2l0aCBuYW1lIHNldCB0byBwb2ludCB0byBhIGttYWxsb2MoKWVkIG50ZnNfbmFtZSBzdHJ1Y3R1cmUgY29udGFpbmluZworICogICAgdGhlIHByb3Blcmx5IGNhc2VkIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBuYW1lLiBXZSBjb252ZXJ0IHRoZSBuYW1lIHRvIHRoZQorICogICAgY3VycmVudCBOTFMgY29kZSBwYWdlLCBzZWFyY2ggaWYgYSBkZW50cnkgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMKKyAqICAgIGFuZCBpZiBzbyByZXR1cm4gdGhhdCBpbnN0ZWFkIG9mIEBkZW50LiAgQXQgdGhpcyBwb2ludCB0aGluZ3MgYXJlCisgKiAgICBjb21wbGljYXRlZCBieSB0aGUgcG9zc2liaWxpdHkgb2YgJ2Rpc2Nvbm5lY3RlZCcgZGVudHJpZXMgZHVlIHRvIE5GUworICogICAgd2hpY2ggd2UgZGVhbCB3aXRoIGFwcHJvcHJpYXRlbHkgKHNlZSB0aGUgY29kZSBjb21tZW50cykuICBUaGUgVkZTIHdpbGwKKyAqICAgIHRoZW4gZGVzdHJveSB0aGUgb2xkIEBkZW50IGFuZCB1c2UgdGhlIG9uZSB3ZSByZXR1cm5lZC4gIElmIGEgZGVudHJ5IGlzCisgKiAgICBub3QgZm91bmQsIHdlIGFsbG9jYXRlIGEgbmV3IG9uZSwgZF9zcGxpY2VfYWxpYXMoKSBpdCwgYW5kIHJldHVybiBpdCBhcworICogICAgYWJvdmUuCisgKiAzKSBAZGVudCBtYXRjaGVzIGVpdGhlciBwZXJmZWN0bHkgb3Igbm90IChpLmUuIHdlIGRvbid0IGNhcmUgYWJvdXQgY2FzZSkgYQorICogICAgZGlyZWN0b3J5IGVudHJ5IHdpdGggYSBmaWxlIG5hbWUgaW4gdGhlIERPUyBuYW1lc3BhY2UuIEluIHRoaXMgY2FzZQorICogICAgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIHdpbGwgcmV0dXJuIHdpdGggbmFtZSBzZXQgdG8gcG9pbnQgdG8gYQorICogICAga21hbGxvYygpZWQgbnRmc19uYW1lIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBtZnQgcmVmZXJlbmNlIChjcHUgZW5kaWFuKQorICogICAgb2YgdGhlIGlub2RlLiBXZSB1c2UgdGhlIG1mdCByZWZlcmVuY2UgdG8gcmVhZCB0aGUgaW5vZGUgYW5kIHRvIGZpbmQgdGhlCisgKiAgICBmaWxlIG5hbWUgaW4gdGhlIFdJTjMyIG5hbWVzcGFjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXRjaGVkIHNob3J0IGZpbGUKKyAqICAgIG5hbWUuIFdlIHRoZW4gY29udmVydCB0aGUgbmFtZSB0byB0aGUgY3VycmVudCBOTFMgY29kZSBwYWdlLCBhbmQgcHJvY2VlZAorICogICAgc2VhcmNoaW5nIGZvciBhIGRlbnRyeSB3aXRoIHRoaXMgbmFtZSwgZXRjLCBhcyBpbiBjYXNlIDIpLCBhYm92ZS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpudGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpcl9pbm8sIHN0cnVjdCBkZW50cnkgKmRlbnQsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGRpcl9pbm8tPmlfc2IpOworCXN0cnVjdCBpbm9kZSAqZGVudF9pbm9kZTsKKwludGZzY2hhciAqdW5hbWU7CisJbnRmc19uYW1lICpuYW1lID0gTlVMTDsKKwlNRlRfUkVGIG1yZWY7CisJdW5zaWduZWQgbG9uZyBkZW50X2lubzsKKwlpbnQgdW5hbWVfbGVuOworCisJbnRmc19kZWJ1ZygiTG9va2luZyB1cCAlcyBpbiBkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCWRlbnQtPmRfbmFtZS5uYW1lLCBkaXJfaW5vLT5pX2lubyk7CisJLyogQ29udmVydCB0aGUgbmFtZSBvZiB0aGUgZGVudHJ5IHRvIFVuaWNvZGUuICovCisJdW5hbWVfbGVuID0gbnRmc19ubHN0b3Vjcyh2b2wsIGRlbnQtPmRfbmFtZS5uYW1lLCBkZW50LT5kX25hbWUubGVuLAorCQkJJnVuYW1lKTsKKwlpZiAodW5hbWVfbGVuIDwgMCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gY29udmVydCBuYW1lIHRvIFVuaWNvZGUuIik7CisJCXJldHVybiBFUlJfUFRSKHVuYW1lX2xlbik7CisJfQorCW1yZWYgPSBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKE5URlNfSShkaXJfaW5vKSwgdW5hbWUsIHVuYW1lX2xlbiwKKwkJCSZuYW1lKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnRmc19uYW1lX2NhY2hlLCB1bmFtZSk7CisJaWYgKCFJU19FUlJfTVJFRihtcmVmKSkgeworCQlkZW50X2lubyA9IE1SRUYobXJlZik7CisJCW50ZnNfZGVidWcoIkZvdW5kIGlub2RlIDB4JWx4LiBDYWxsaW5nIG50ZnNfaWdldC4iLCBkZW50X2lubyk7CisJCWRlbnRfaW5vZGUgPSBudGZzX2lnZXQodm9sLT5zYiwgZGVudF9pbm8pOworCQlpZiAobGlrZWx5KCFJU19FUlIoZGVudF9pbm9kZSkpKSB7CisJCQkvKiBDb25zaXN0ZW5jeSBjaGVjay4gKi8KKwkJCWlmIChpc19iYWRfaW5vZGUoZGVudF9pbm9kZSkgfHwgTVNFUU5PKG1yZWYpID09CisJCQkJCU5URlNfSShkZW50X2lub2RlKS0+c2VxX25vIHx8CisJCQkJCWRlbnRfaW5vID09IEZJTEVfTUZUKSB7CisJCQkJLyogUGVyZmVjdCBXSU4zMi9QT1NJWCBtYXRjaC4gLS0gQ2FzZSAxLiAqLworCQkJCWlmICghbmFtZSkgeworCQkJCQludGZzX2RlYnVnKCJEb25lLiAgKENhc2UgMS4pIik7CisJCQkJCXJldHVybiBkX3NwbGljZV9hbGlhcyhkZW50X2lub2RlLCBkZW50KTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBXZSBhcmUgdG9vIGluZGVudGVkLiAgSGFuZGxlIGltcGVyZmVjdAorCQkJCSAqIG1hdGNoZXMgYW5kIHNob3J0IGZpbGUgbmFtZXMgZnVydGhlciBiZWxvdy4KKwkJCQkgKi8KKwkJCQlnb3RvIGhhbmRsZV9uYW1lOworCQkJfQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRm91bmQgc3RhbGUgcmVmZXJlbmNlIHRvIGlub2RlICIKKwkJCQkJIjB4JWx4IChyZWZlcmVuY2Ugc2VxdWVuY2UgbnVtYmVyID0gIgorCQkJCQkiMHgleCwgaW5vZGUgc2VxdWVuY2UgbnVtYmVyID0gMHgleCksICIKKwkJCQkJInJldHVybmluZyAtRUlPLiBSdW4gY2hrZHNrLiIsCisJCQkJCWRlbnRfaW5vLCBNU0VRTk8obXJlZiksCisJCQkJCU5URlNfSShkZW50X2lub2RlKS0+c2VxX25vKTsKKwkJCWlwdXQoZGVudF9pbm9kZSk7CisJCQlkZW50X2lub2RlID0gRVJSX1BUUigtRUlPKTsKKwkJfSBlbHNlCisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJudGZzX2lnZXQoMHglbHgpIGZhaWxlZCB3aXRoICIKKwkJCQkJImVycm9yIGNvZGUgJWxpLiIsIGRlbnRfaW5vLAorCQkJCQlQVFJfRVJSKGRlbnRfaW5vZGUpKTsKKwkJaWYgKG5hbWUpCisJCQlrZnJlZShuYW1lKTsKKwkJLyogUmV0dXJuIHRoZSBlcnJvciBjb2RlLiAqLworCQlyZXR1cm4gKHN0cnVjdCBkZW50cnkgKilkZW50X2lub2RlOworCX0KKwkvKiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgbmFtZSBpcyBubyBsb25nZXIgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQuICovCisJaWYgKE1SRUZfRVJSKG1yZWYpID09IC1FTk9FTlQpIHsKKwkJbnRmc19kZWJ1ZygiRW50cnkgd2FzIG5vdCBmb3VuZCwgYWRkaW5nIG5lZ2F0aXZlIGRlbnRyeS4iKTsKKwkJLyogVGhlIGRjYWNoZSB3aWxsIGhhbmRsZSBuZWdhdGl2ZSBlbnRyaWVzLiAqLworCQlkX2FkZChkZW50LCBOVUxMKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIm50ZnNfbG9va3VwX2lub19ieV9uYW1lKCkgZmFpbGVkIHdpdGggZXJyb3IgIgorCQkJImNvZGUgJWkuIiwgLU1SRUZfRVJSKG1yZWYpKTsKKwlyZXR1cm4gRVJSX1BUUihNUkVGX0VSUihtcmVmKSk7CisKKwkvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdGhpcyBsb3QgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiEgKEFJQSkKK2hhbmRsZV9uYW1lOgorICAgeworCXN0cnVjdCBkZW50cnkgKnJlYWxfZGVudCwgKm5ld19kZW50OworCU1GVF9SRUNPUkQgKm07CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShkZW50X2lub2RlKTsKKwlpbnQgZXJyOworCXN0cnVjdCBxc3RyIG5sc19uYW1lOworCisJbmxzX25hbWUubmFtZSA9IE5VTEw7CisJaWYgKG5hbWUtPnR5cGUgIT0gRklMRV9OQU1FX0RPUykgewkJCS8qIENhc2UgMi4gKi8KKwkJbnRmc19kZWJ1ZygiQ2FzZSAyLiIpOworCQlubHNfbmFtZS5sZW4gPSAodW5zaWduZWQpbnRmc191Y3N0b25scyh2b2wsCisJCQkJKG50ZnNjaGFyKikmbmFtZS0+bmFtZSwgbmFtZS0+bGVuLAorCQkJCSh1bnNpZ25lZCBjaGFyKiopJm5sc19uYW1lLm5hbWUsIDApOworCQlrZnJlZShuYW1lKTsKKwl9IGVsc2UgLyogaWYgKG5hbWUtPnR5cGUgPT0gRklMRV9OQU1FX0RPUykgKi8gewkJLyogQ2FzZSAzLiAqLworCQlGSUxFX05BTUVfQVRUUiAqZm47CisKKwkJbnRmc19kZWJ1ZygiQ2FzZSAzLiIpOworCQlrZnJlZShuYW1lKTsKKworCQkvKiBGaW5kIHRoZSBXSU4zMiBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hdGNoZWQgRE9TIG5hbWUuICovCisJCW5pID0gTlRGU19JKGRlbnRfaW5vZGUpOworCQltID0gbWFwX21mdF9yZWNvcmQobmkpOworCQlpZiAoSVNfRVJSKG0pKSB7CisJCQllcnIgPSBQVFJfRVJSKG0pOworCQkJbSA9IE5VTEw7CisJCQljdHggPSBOVUxMOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJCWlmICh1bmxpa2VseSghY3R4KSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlkbyB7CisJCQlBVFRSX1JFQ09SRCAqYTsKKwkJCXUzMiB2YWxfbGVuOworCisJCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0ZJTEVfTkFNRSwgTlVMTCwgMCwgMCwgMCwKKwkJCQkJTlVMTCwgMCwgY3R4KTsKKwkJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW5vZGUgY29ycnVwdDogTm8gV0lOMzIgIgorCQkJCQkJIm5hbWVzcGFjZSBjb3VudGVycGFydCB0byBET1MgIgorCQkJCQkJImZpbGUgbmFtZS4gUnVuIGNoa2Rzay4iKTsKKwkJCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJLyogQ29uc2lzdGVuY3kgY2hlY2tzLiAqLworCQkJYSA9IGN0eC0+YXR0cjsKKwkJCWlmIChhLT5ub25fcmVzaWRlbnQgfHwgYS0+ZmxhZ3MpCisJCQkJZ290byBlaW9fZXJyX291dDsKKwkJCXZhbF9sZW4gPSBsZTMyX3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJCQlpZiAobGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQkJdmFsX2xlbiA+IGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkpCisJCQkJZ290byBlaW9fZXJyX291dDsKKwkJCWZuID0gKEZJTEVfTkFNRV9BVFRSKikoKHU4KiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCQkJaWYgKCh1MzIpKGZuLT5maWxlX25hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSArCisJCQkJCXNpemVvZihGSUxFX05BTUVfQVRUUikpID4gdmFsX2xlbikKKwkJCQlnb3RvIGVpb19lcnJfb3V0OworCQl9IHdoaWxlIChmbi0+ZmlsZV9uYW1lX3R5cGUgIT0gRklMRV9OQU1FX1dJTjMyKTsKKworCQkvKiBDb252ZXJ0IHRoZSBmb3VuZCBXSU4zMiBuYW1lIHRvIGN1cnJlbnQgTkxTIGNvZGUgcGFnZS4gKi8KKwkJbmxzX25hbWUubGVuID0gKHVuc2lnbmVkKW50ZnNfdWNzdG9ubHModm9sLAorCQkJCShudGZzY2hhciopJmZuLT5maWxlX25hbWUsIGZuLT5maWxlX25hbWVfbGVuZ3RoLAorCQkJCSh1bnNpZ25lZCBjaGFyKiopJm5sc19uYW1lLm5hbWUsIDApOworCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwl9CisJbSA9IE5VTEw7CisJY3R4ID0gTlVMTDsKKworCS8qIENoZWNrIGlmIGEgY29udmVyc2lvbiBlcnJvciBvY2N1cnJlZC4gKi8KKwlpZiAoKHNpZ25lZClubHNfbmFtZS5sZW4gPCAwKSB7CisJCWVyciA9IChzaWduZWQpbmxzX25hbWUubGVuOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW5sc19uYW1lLmhhc2ggPSBmdWxsX25hbWVfaGFzaChubHNfbmFtZS5uYW1lLCBubHNfbmFtZS5sZW4pOworCisJLyoKKwkgKiBOb3RlOiBObyBuZWVkIGZvciBkZW50LT5kX2xvY2sgbG9jayBhcyBpX3NlbSBpcyBoZWxkIG9uIHRoZQorCSAqIHBhcmVudCBpbm9kZS4KKwkgKi8KKworCS8qIERvZXMgYSBkZW50cnkgbWF0Y2hpbmcgdGhlIG5sc19uYW1lIGV4aXN0IGFscmVhZHk/ICovCisJcmVhbF9kZW50ID0gZF9sb29rdXAoZGVudC0+ZF9wYXJlbnQsICZubHNfbmFtZSk7CisJLyogSWYgbm90LCBjcmVhdGUgaXQgbm93LiAqLworCWlmICghcmVhbF9kZW50KSB7CisJCXJlYWxfZGVudCA9IGRfYWxsb2MoZGVudC0+ZF9wYXJlbnQsICZubHNfbmFtZSk7CisJCWtmcmVlKG5sc19uYW1lLm5hbWUpOworCQlpZiAoIXJlYWxfZGVudCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQluZXdfZGVudCA9IGRfc3BsaWNlX2FsaWFzKGRlbnRfaW5vZGUsIHJlYWxfZGVudCk7CisJCWlmIChuZXdfZGVudCkKKwkJCWRwdXQocmVhbF9kZW50KTsKKwkJZWxzZQorCQkJbmV3X2RlbnQgPSByZWFsX2RlbnQ7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoQ3JlYXRlZCBuZXcgZGVudHJ5LikiKTsKKwkJcmV0dXJuIG5ld19kZW50OworCX0KKwlrZnJlZShubHNfbmFtZS5uYW1lKTsKKwkvKiBNYXRjaGluZyBkZW50cnkgZXhpc3RzLCBjaGVjayBpZiBpdCBpcyBuZWdhdGl2ZS4gKi8KKwlpZiAocmVhbF9kZW50LT5kX2lub2RlKSB7CisJCWlmICh1bmxpa2VseShyZWFsX2RlbnQtPmRfaW5vZGUgIT0gZGVudF9pbm9kZSkpIHsKKwkJCS8qIFRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIGJhZCBpbm9kZXMgYXJlIHVuaGFzaGVkLiAqLworCQkJQlVHX09OKCFpc19iYWRfaW5vZGUoZGVudF9pbm9kZSkpOworCQkJQlVHX09OKCFpc19iYWRfaW5vZGUocmVhbF9kZW50LT5kX2lub2RlKSk7CisJCX0KKwkJLyoKKwkJICogQWxyZWFkeSBoYXZlIHRoZSBpbm9kZSBhbmQgdGhlIGRlbnRyeSBhdHRhY2hlZCwgZGVjcmVtZW50CisJCSAqIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYmFsYW5jZSB0aGUgbnRmc19pZ2V0KCkgd2UgZGlkCisJCSAqIGVhcmxpZXIgb24uICBXZSBmb3VuZCB0aGUgZGVudHJ5IHVzaW5nIGRfbG9va3VwKCkgc28gaXQKKwkJICogY2Fubm90IGJlIGRpc2Nvbm5lY3RlZCBhbmQgdGh1cyB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeQorCQkgKiBhYm91dCBhbnkgTkZTL2Rpc2Nvbm5lY3RlZG5lc3MgaXNzdWVzIGhlcmUuCisJCSAqLworCQlpcHV0KGRlbnRfaW5vZGUpOworCQludGZzX2RlYnVnKCJEb25lLiAgKEFscmVhZHkgaGFkIGlub2RlIGFuZCBkZW50cnkuKSIpOworCQlyZXR1cm4gcmVhbF9kZW50OworCX0KKwkvKgorCSAqIE5lZ2F0aXZlIGRlbnRyeTogaW5zdGFudGlhdGUgaXQgdW5sZXNzIHRoZSBpbm9kZSBpcyBhIGRpcmVjdG9yeSBhbmQKKwkgKiBoYXMgYSAnZGlzY29ubmVjdGVkJyBkZW50cnkgKGkuZS4gSVNfUk9PVCBhbmQgRENBQ0hFX0RJU0NPTk5FQ1RFRCksCisJICogaW4gd2hpY2ggY2FzZSBkX21vdmUoKSB0aGF0IGluIHBsYWNlIG9mIHRoZSBmb3VuZCBkZW50cnkuCisJICovCisJaWYgKCFTX0lTRElSKGRlbnRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJLyogTm90IGEgZGlyZWN0b3J5OyBldmVyeXRoaW5nIGlzIGVhc3kuICovCisJCWRfaW5zdGFudGlhdGUocmVhbF9kZW50LCBkZW50X2lub2RlKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4gIChBbHJlYWR5IGhhZCBuZWdhdGl2ZSBmaWxlIGRlbnRyeS4pIik7CisJCXJldHVybiByZWFsX2RlbnQ7CisJfQorCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZkZW50X2lub2RlLT5pX2RlbnRyeSkpIHsKKwkJLyoKKwkJICogRGlyZWN0b3J5IHdpdGhvdXQgYSAnZGlzY29ubmVjdGVkJyBkZW50cnk7IHdlIG5lZWQgdG8gZG8KKwkJICogZF9pbnN0YW50aWF0ZSgpIGJ5IGhhbmQgYmVjYXVzZSBpdCB0YWtlcyBkY2FjaGVfbG9jayB3aGljaAorCQkgKiB3ZSBhbHJlYWR5IGhvbGQuCisJCSAqLworCQlsaXN0X2FkZCgmcmVhbF9kZW50LT5kX2FsaWFzLCAmZGVudF9pbm9kZS0+aV9kZW50cnkpOworCQlyZWFsX2RlbnQtPmRfaW5vZGUgPSBkZW50X2lub2RlOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlzZWN1cml0eV9kX2luc3RhbnRpYXRlKHJlYWxfZGVudCwgZGVudF9pbm9kZSk7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoQWxyZWFkeSBoYWQgbmVnYXRpdmUgZGlyZWN0b3J5IGRlbnRyeS4pIik7CisJCXJldHVybiByZWFsX2RlbnQ7CisJfQorCS8qCisJICogRGlyZWN0b3J5IHdpdGggYSAnZGlzY29ubmVjdGVkJyBkZW50cnk7IGdldCBhIHJlZmVyZW5jZSB0byB0aGUKKwkgKiAnZGlzY29ubmVjdGVkJyBkZW50cnkuCisJICovCisJbmV3X2RlbnQgPSBsaXN0X2VudHJ5KGRlbnRfaW5vZGUtPmlfZGVudHJ5Lm5leHQsIHN0cnVjdCBkZW50cnksCisJCQlkX2FsaWFzKTsKKwlkZ2V0X2xvY2tlZChuZXdfZGVudCk7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkvKiBEbyBzZWN1cml0eSB2b2Rvby4gKi8KKwlzZWN1cml0eV9kX2luc3RhbnRpYXRlKHJlYWxfZGVudCwgZGVudF9pbm9kZSk7CisJLyogTW92ZSBuZXdfZGVudCBpbiBwbGFjZSBvZiByZWFsX2RlbnQuICovCisJZF9tb3ZlKG5ld19kZW50LCByZWFsX2RlbnQpOworCS8qIEJhbGFuY2UgdGhlIG50ZnNfaWdldCgpIHdlIGRpZCBhYm92ZS4gKi8KKwlpcHV0KGRlbnRfaW5vZGUpOworCS8qIFRocm93IGF3YXkgcmVhbF9kZW50LiAqLworCWRwdXQocmVhbF9kZW50KTsKKwkvKiBVc2UgbmV3X2RlbnQgYXMgdGhlIGFjdHVhbCBkZW50cnkuICovCisJbnRmc19kZWJ1ZygiRG9uZS4gIChBbHJlYWR5IGhhZCBuZWdhdGl2ZSwgZGlzY29ubmVjdGVkIGRpcmVjdG9yeSAiCisJCQkiZGVudHJ5LikiKTsKKwlyZXR1cm4gbmV3X2RlbnQ7CisKK2Vpb19lcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIklsbGVnYWwgZmlsZSBuYW1lIGF0dHJpYnV0ZS4gUnVuIGNoa2Rzay4iKTsKKwllcnIgPSAtRUlPOworZXJyX291dDoKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJaXB1dChkZW50X2lub2RlKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQsIHJldHVybmluZyBlcnJvciBjb2RlICVpLiIsIGVycik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKyAgIH0KK30KKworLyoqCisgKiBJbm9kZSBvcGVyYXRpb25zIGZvciBkaXJlY3Rvcmllcy4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19kaXJfaW5vZGVfb3BzID0geworCS5sb29rdXAJPSBudGZzX2xvb2t1cCwJLyogVkZTOiBMb29rdXAgZGlyZWN0b3J5LiAqLworfTsKKworLyoqCisgKiBudGZzX2dldF9wYXJlbnQgLSBmaW5kIHRoZSBkZW50cnkgb2YgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeSBkZW50cnkKKyAqIEBjaGlsZF9kZW50OgkJZGVudHJ5IG9mIHRoZSBkaXJlY3Rvcnkgd2hvc2UgcGFyZW50IGRpcmVjdG9yeSB0byBmaW5kCisgKgorICogRmluZCB0aGUgZGVudHJ5IGZvciB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUKKyAqIGRlbnRyeSBAY2hpbGRfZGVudC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20KKyAqIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkgd2hpY2ggaW4gdHVybiBpcyBjYWxsZWQgZnJvbSB0aGUKKyAqIGRlZmF1bHQgLT5kZWNvZGVfZmgoKSB3aGljaCBpcyBleHBvcnRfZGVjb2RlX2ZoKCkgaW4gdGhlIHNhbWUgZmlsZS4KKyAqCisgKiBUaGUgY29kZSBpcyBiYXNlZCBvbiB0aGUgZXh0MyAtPmdldF9wYXJlbnQoKSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbgorICogZnMvZXh0My9uYW1laS5jOjpleHQzX2dldF9wYXJlbnQoKS4KKyAqCisgKiBOb3RlOiBudGZzX2dldF9wYXJlbnQoKSBpcyBjYWxsZWQgd2l0aCBAY2hpbGRfZGVudC0+ZF9pbm9kZS0+aV9zZW0gZG93bi4KKyAqCisgKiBSZXR1cm4gdGhlIGRlbnRyeSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvciBjb2RlIG9uCisgKiBlcnJvciAoSVNfRVJSKCkgaXMgdHJ1ZSkuCisgKi8KK3N0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZF9kZW50KQoreworCXN0cnVjdCBpbm9kZSAqdmkgPSBjaGlsZF9kZW50LT5kX2lub2RlOworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwlNRlRfUkVDT1JEICptcmVjOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJQVRUUl9SRUNPUkQgKmF0dHI7CisJRklMRV9OQU1FX0FUVFIgKmZuOworCXN0cnVjdCBpbm9kZSAqcGFyZW50X3ZpOworCXN0cnVjdCBkZW50cnkgKnBhcmVudF9kZW50OworCXVuc2lnbmVkIGxvbmcgcGFyZW50X2lubzsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJLyogR2V0IHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBpbm9kZSBiZWxvbmdpbmcgdG8gdGhlIGNoaWxkIGRlbnRyeS4gKi8KKwltcmVjID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobXJlYykpCisJCXJldHVybiAoc3RydWN0IGRlbnRyeSAqKW1yZWM7CisJLyogRmluZCB0aGUgZmlyc3QgZmlsZSBuYW1lIGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobmksIG1yZWMpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQordHJ5X25leHQ6CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9GSUxFX05BTUUsIE5VTEwsIDAsIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLAorCQkJMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbm9kZSAweCVseCBkb2VzIG5vdCBoYXZlIGEgIgorCQkJCQkiZmlsZSBuYW1lIGF0dHJpYnV0ZS4gIFJ1biBjaGtkc2suIiwKKwkJCQkJdmktPmlfaW5vKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisJYXR0ciA9IGN0eC0+YXR0cjsKKwlpZiAodW5saWtlbHkoYXR0ci0+bm9uX3Jlc2lkZW50KSkKKwkJZ290byB0cnlfbmV4dDsKKwlmbiA9IChGSUxFX05BTUVfQVRUUiAqKSgodTggKilhdHRyICsKKwkJCWxlMTZfdG9fY3B1KGF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJaWYgKHVubGlrZWx5KCh1OCAqKWZuICsgbGUzMl90b19jcHUoYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCSh1OCopYXR0ciArIGxlMzJfdG9fY3B1KGF0dHItPmxlbmd0aCkpKQorCQlnb3RvIHRyeV9uZXh0OworCS8qIEdldCB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiAqLworCXBhcmVudF9pbm8gPSBNUkVGX0xFKGZuLT5wYXJlbnRfZGlyZWN0b3J5KTsKKwkvKiBSZWxlYXNlIHRoZSBzZWFyY2ggY29udGV4dCBhbmQgdGhlIG1mdCByZWNvcmQgb2YgdGhlIGNoaWxkLiAqLworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmkpOworCS8qIEdldCB0aGUgaW5vZGUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkuICovCisJcGFyZW50X3ZpID0gbnRmc19pZ2V0KHZpLT5pX3NiLCBwYXJlbnRfaW5vKTsKKwlpZiAoSVNfRVJSKHBhcmVudF92aSkgfHwgdW5saWtlbHkoaXNfYmFkX2lub2RlKHBhcmVudF92aSkpKSB7CisJCWlmICghSVNfRVJSKHBhcmVudF92aSkpCisJCQlpcHV0KHBhcmVudF92aSk7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gZ2V0IHBhcmVudCBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBvZiBjaGlsZCBpbm9kZSAweCVseC4iLCBwYXJlbnRfaW5vLAorCQkJCXZpLT5pX2lubyk7CisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwkvKiBGaW5hbGx5IGdldCBhIGRlbnRyeSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHJldHVybiBpdC4gKi8KKwlwYXJlbnRfZGVudCA9IGRfYWxsb2NfYW5vbihwYXJlbnRfdmkpOworCWlmICh1bmxpa2VseSghcGFyZW50X2RlbnQpKSB7CisJCWlwdXQocGFyZW50X3ZpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJcmV0dXJuIHBhcmVudF9kZW50OworfQorCisvKioKKyAqIG50ZnNfZ2V0X2RlbnRyeSAtIGZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBmcm9tIGEgZmlsZSBoYW5kbGUgc3ViLWZyYWdtZW50CisgKiBAc2I6CQlzdXBlciBibG9jayBpZGVudGlmeWluZyB0aGUgbW91bnRlZCBudGZzIHZvbHVtZQorICogQGZoOgkJdGhlIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudAorICoKKyAqIEZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbiBhIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudC4gIFRoaXMgZnVuY3Rpb24KKyAqIGlzIGNhbGxlZCBmcm9tIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkgd2hpY2ggaW4gdHVybiBpcworICogY2FsbGVkIGZyb20gdGhlIGRlZmF1bHQgLT5kZWNvZGVfZmgoKSB3aGljaCBpcyBleHBvcnRfZGVjb2RlX2ZoKCkgaW4gdGhlCisgKiBzYW1lIGZpbGUuICBUaGUgY29kZSBpcyBjbG9zZWx5IGJhc2VkIG9uIHRoZSBkZWZhdWx0IC0+Z2V0X2RlbnRyeSgpIGhlbHBlcgorICogZnMvZXhwb3J0ZnMvZXhwZnMuYzo6Z2V0X29iamVjdCgpLgorICoKKyAqIFRoZSBAZmggY29udGFpbnMgdHdvIDMyLWJpdCB1bnNpZ25lZCB2YWx1ZXMsIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGlub2RlCisgKiBudW1iZXIgYW5kIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBpbm9kZSBnZW5lcmF0aW9uLgorICoKKyAqIFJldHVybiB0aGUgZGVudHJ5IG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yIGNvZGUgb24gZXJyb3IgKElTX0VSUigpIGlzIHRydWUpLgorICovCitzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZmgpCit7CisJc3RydWN0IGlub2RlICp2aTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCXVuc2lnbmVkIGxvbmcgaW5vID0gKCh1MzIgKilmaClbMF07CisJdTMyIGdlbiA9ICgodTMyICopZmgpWzFdOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBnZW5lcmF0aW9uIDB4JXguIiwgaW5vLCBnZW4pOworCXZpID0gbnRmc19pZ2V0KHNiLCBpbm8pOworCWlmIChJU19FUlIodmkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gZ2V0IGlub2RlIDB4JWx4LiIsIGlubyk7CisJCXJldHVybiAoc3RydWN0IGRlbnRyeSAqKXZpOworCX0KKwlpZiAodW5saWtlbHkoaXNfYmFkX2lub2RlKHZpKSB8fCB2aS0+aV9nZW5lcmF0aW9uICE9IGdlbikpIHsKKwkJLyogV2UgZGlkbid0IGZpbmQgdGhlIHJpZ2h0IGlub2RlLiAqLworCQludGZzX2Vycm9yKHNiLCAiSW5vZGUgMHglbHgsIGJhZCBjb3VudDogJWQgJWQgb3IgdmVyc2lvbiAweCV4ICIKKwkJCQkiMHgleC4iLCB2aS0+aV9pbm8sIHZpLT5pX25saW5rLAorCQkJCWF0b21pY19yZWFkKCZ2aS0+aV9jb3VudCksIHZpLT5pX2dlbmVyYXRpb24sCisJCQkJZ2VuKTsKKwkJaXB1dCh2aSk7CisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCX0KKwkvKiBOb3cgZmluZCBhIGRlbnRyeS4gIElmIHBvc3NpYmxlLCBnZXQgYSB3ZWxsLWNvbm5lY3RlZCBvbmUuICovCisJZGVudCA9IGRfYWxsb2NfYW5vbih2aSk7CisJaWYgKHVubGlrZWx5KCFkZW50KSkgeworCQlpcHV0KHZpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUgZm9yIGlub2RlIDB4JWx4LCBnZW5lcmF0aW9uIDB4JXguIiwgaW5vLCBnZW4pOworCXJldHVybiBkZW50OworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9udGZzLmggYi9mcy9udGZzL250ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBmZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9udGZzLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBudGZzLmggLSBEZWZpbmVzIGZvciBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisKK3R5cGVkZWYgZW51bSB7CisJTlRGU19CTE9DS19TSVpFCQk9IDUxMiwKKwlOVEZTX0JMT0NLX1NJWkVfQklUUwk9IDksCisJTlRGU19TQl9NQUdJQwkJPSAweDUzNDY1NDRlLAkvKiAnTlRGUycgKi8KKwlOVEZTX01BWF9OQU1FX0xFTgk9IDI1NSwKK30gTlRGU19DT05TVEFOVFM7CisKKy8qIEdsb2JhbCB2YXJpYWJsZXMuICovCisKKy8qIFNsYWIgY2FjaGVzIChmcm9tIHN1cGVyLmMpLiAqLworZXh0ZXJuIGttZW1fY2FjaGVfdCAqbnRmc19uYW1lX2NhY2hlOworZXh0ZXJuIGttZW1fY2FjaGVfdCAqbnRmc19pbm9kZV9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfYmlnX2lub2RlX2NhY2hlOworZXh0ZXJuIGttZW1fY2FjaGVfdCAqbnRmc19hdHRyX2N0eF9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfaW5kZXhfY3R4X2NhY2hlOworCisvKiBUaGUgdmFyaW91cyBvcGVyYXRpb25zIHN0cnVjdHMgZGVmaW5lZCB0aHJvdWdob3V0IHRoZSBkcml2ZXIgZmlsZXMuICovCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBudGZzX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBudGZzX21zdF9hb3BzOworCitleHRlcm4gc3RydWN0ICBmaWxlX29wZXJhdGlvbnMgbnRmc19maWxlX29wczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBudGZzX2ZpbGVfaW5vZGVfb3BzOworCitleHRlcm4gc3RydWN0ICBmaWxlX29wZXJhdGlvbnMgbnRmc19kaXJfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZGlyX2lub2RlX29wczsKKworZXh0ZXJuIHN0cnVjdCAgZmlsZV9vcGVyYXRpb25zIG50ZnNfZW1wdHlfZmlsZV9vcHM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19lbXB0eV9pbm9kZV9vcHM7CisKKy8qKgorICogTlRGU19TQiAtIHJldHVybiB0aGUgbnRmcyB2b2x1bWUgZ2l2ZW4gYSB2ZnMgc3VwZXIgYmxvY2sKKyAqIEBzYjoJCVZGUyBzdXBlciBibG9jaworICoKKyAqIE5URlNfU0IoKSByZXR1cm5zIHRoZSBudGZzIHZvbHVtZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZGUyBzdXBlciBibG9jayBAc2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgbnRmc192b2x1bWUgKk5URlNfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworLyogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcy4gKi8KKworLyogRnJvbSBmcy9udGZzL2NvbXByZXNzLmMgKi8KK2V4dGVybiBpbnQgbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIGludCBhbGxvY2F0ZV9jb21wcmVzc2lvbl9idWZmZXJzKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9jb21wcmVzc2lvbl9idWZmZXJzKHZvaWQpOworCisvKiBGcm9tIGZzL250ZnMvc3VwZXIuYyAqLworI2RlZmluZSBkZWZhdWx0X3VwY2FzZV9sZW4gMHgxMDAwMAorZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgbnRmc19sb2NrOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHZhbDsKKwljaGFyICpzdHI7Cit9IG9wdGlvbl90OworZXh0ZXJuIGNvbnN0IG9wdGlvbl90IG9uX2Vycm9yc19hcnJbXTsKKworLyogRnJvbSBmcy9udGZzL21zdC5jICovCitleHRlcm4gaW50IHBvc3RfcmVhZF9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIsIGNvbnN0IHUzMiBzaXplKTsKK2V4dGVybiBpbnQgcHJlX3dyaXRlX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYiwgY29uc3QgdTMyIHNpemUpOworZXh0ZXJuIHZvaWQgcG9zdF93cml0ZV9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIpOworCisvKiBGcm9tIGZzL250ZnMvdW5pc3RyLmMgKi8KK2V4dGVybiBCT09MIG50ZnNfYXJlX25hbWVzX2VxdWFsKGNvbnN0IG50ZnNjaGFyICpzMSwgc2l6ZV90IHMxX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKnMyLCBzaXplX3QgczJfbGVuLAorCQljb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX3NpemUpOworZXh0ZXJuIGludCBudGZzX2NvbGxhdGVfbmFtZXMoY29uc3QgbnRmc2NoYXIgKm5hbWUxLCBjb25zdCB1MzIgbmFtZTFfbGVuLAorCQljb25zdCBudGZzY2hhciAqbmFtZTIsIGNvbnN0IHUzMiBuYW1lMl9sZW4sCisJCWNvbnN0IGludCBlcnJfdmFsLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbik7CitleHRlcm4gaW50IG50ZnNfdWNzbmNtcChjb25zdCBudGZzY2hhciAqczEsIGNvbnN0IG50ZnNjaGFyICpzMiwgc2l6ZV90IG4pOworZXh0ZXJuIGludCBudGZzX3Vjc25jYXNlY21wKGNvbnN0IG50ZnNjaGFyICpzMSwgY29uc3QgbnRmc2NoYXIgKnMyLCBzaXplX3QgbiwKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9zaXplKTsKK2V4dGVybiB2b2lkIG50ZnNfdXBjYXNlX25hbWUobnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pOworZXh0ZXJuIHZvaWQgbnRmc19maWxlX3VwY2FzZV92YWx1ZShGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2VfbGVuKTsKK2V4dGVybiBpbnQgbnRmc19maWxlX2NvbXBhcmVfdmFsdWVzKEZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjEsCisJCUZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjIsCisJCWNvbnN0IGludCBlcnJfdmFsLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbik7CitleHRlcm4gaW50IG50ZnNfbmxzdG91Y3MoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgY2hhciAqaW5zLAorCQljb25zdCBpbnQgaW5zX2xlbiwgbnRmc2NoYXIgKipvdXRzKTsKK2V4dGVybiBpbnQgbnRmc191Y3N0b25scyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBudGZzY2hhciAqaW5zLAorCQljb25zdCBpbnQgaW5zX2xlbiwgdW5zaWduZWQgY2hhciAqKm91dHMsIGludCBvdXRzX2xlbik7CisKKy8qIEZyb20gZnMvbnRmcy91cGNhc2UuYyAqLworZXh0ZXJuIG50ZnNjaGFyICpnZW5lcmF0ZV9kZWZhdWx0X3VwY2FzZSh2b2lkKTsKKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvcXVvdGEuYyBiL2ZzL250ZnMvcXVvdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNkZjJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9xdW90YS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogcXVvdGEuYyAtIE5URlMga2VybmVsIHF1b3RhICgkUXVvdGEpIGhhbmRsaW5nLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUworICoJICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSAiaW5kZXguaCIKKyNpbmNsdWRlICJxdW90YS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUgLSBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUgb24gYW4gbnRmcyB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZQorICoKKyAqIE1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZSBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbCBhbmQgcmV0dXJuIFRSVUUgb24KKyAqIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICovCitCT09MIG50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUobnRmc192b2x1bWUgKnZvbCkKK3sKKwludGZzX2luZGV4X2NvbnRleHQgKmljdHg7CisJUVVPVEFfQ09OVFJPTF9FTlRSWSAqcWNlOworCWNvbnN0IGxlMzIgcWlkID0gUVVPVEFfREVGQVVMVFNfSUQ7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChOVm9sUXVvdGFPdXRPZkRhdGUodm9sKSkKKwkJZ290byBkb25lOworCWlmICghdm9sLT5xdW90YV9pbm8gfHwgIXZvbC0+cXVvdGFfcV9pbm8pIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiUXVvdGEgaW5vZGVzIGFyZSBub3Qgb3Blbi4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlkb3duKCZ2b2wtPnF1b3RhX3FfaW5vLT5pX3NlbSk7CisJaWN0eCA9IG50ZnNfaW5kZXhfY3R4X2dldChOVEZTX0kodm9sLT5xdW90YV9xX2lubykpOworCWlmICghaWN0eCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZ2V0IGluZGV4IGNvbnRleHQuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19pbmRleF9sb29rdXAoJnFpZCwgc2l6ZW9mKHFpZCksIGljdHgpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiUXVvdGEgZGVmYXVsdHMgZW50cnkgaXMgbm90ICIKKwkJCQkJInByZXNlbnQuIik7CisJCWVsc2UKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkxvb2t1cCBvZiBxdW90YSBkZWZhdWx0cyBlbnRyeSAiCisJCQkJCSJmYWlsZWQuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKGljdHgtPmRhdGFfbGVuIDwgb2Zmc2V0b2YoUVVPVEFfQ09OVFJPTF9FTlRSWSwgc2lkKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJRdW90YSBkZWZhdWx0cyBlbnRyeSBzaXplIGlzIGludmFsaWQuICAiCisJCQkJIlJ1biBjaGtkc2suIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcWNlID0gKFFVT1RBX0NPTlRST0xfRU5UUlkqKWljdHgtPmRhdGE7CisJaWYgKGxlMzJfdG9fY3B1KHFjZS0+dmVyc2lvbikgIT0gUVVPVEFfVkVSU0lPTikgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJRdW90YSBkZWZhdWx0cyBlbnRyeSB2ZXJzaW9uIDB4JXggaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkLiIsIGxlMzJfdG9fY3B1KHFjZS0+dmVyc2lvbikpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZGVidWcoIlF1b3RhIGRlZmF1bHRzIGZsYWdzID0gMHgleC4iLCBsZTMyX3RvX2NwdShxY2UtPmZsYWdzKSk7CisJLyogSWYgcXVvdGFzIGFyZSBhbHJlYWR5IG1hcmtlZCBvdXQgb2YgZGF0ZSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKi8KKwlpZiAocWNlLT5mbGFncyAmIFFVT1RBX0ZMQUdfT1VUX09GX0RBVEUpCisJCWdvdG8gc2V0X2RvbmU7CisJLyoKKwkgKiBJZiBxdW90YSB0cmFja2luZyBpcyBuZWl0aGVyIHJlcXVlc3RlZCwgbm9yIGVuYWJsZWQgYW5kIHRoZXJlIGFyZSBubworCSAqIHBlbmRpbmcgZGVsZXRlcywgbm8gbmVlZCB0byBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUuCisJICovCisJaWYgKCEocWNlLT5mbGFncyAmIChRVU9UQV9GTEFHX1RSQUNLSU5HX0VOQUJMRUQgfAorCQkJUVVPVEFfRkxBR19UUkFDS0lOR19SRVFVRVNURUQgfAorCQkJUVVPVEFfRkxBR19QRU5ESU5HX0RFTEVURVMpKSkKKwkJZ290byBzZXRfZG9uZTsKKwkvKgorCSAqIFNldCB0aGUgUVVPVEFfRkxBR19PVVRfT0ZfREFURSBiaXQgdGh1cyBtYXJraW5nIHF1b3RhcyBvdXQgb2YgZGF0ZS4KKwkgKiBUaGlzIGlzIHZlcmlmaWVkIG9uIFdpblhQIHRvIGJlIHN1ZmZpY2llbnQgdG8gY2F1c2Ugd2luZG93cyB0bworCSAqIHJlc2NhbiB0aGUgdm9sdW1lIG9uIGJvb3QgYW5kIHVwZGF0ZSBhbGwgcXVvdGEgZW50cmllcy4KKwkgKi8KKwlxY2UtPmZsYWdzIHw9IFFVT1RBX0ZMQUdfT1VUX09GX0RBVEU7CisJLyogRW5zdXJlIHRoZSBtb2RpZmllZCBmbGFncyBhcmUgd3JpdHRlbiB0byBkaXNrLiAqLworCW50ZnNfaW5kZXhfZW50cnlfZmx1c2hfZGNhY2hlX3BhZ2UoaWN0eCk7CisJbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KGljdHgpOworc2V0X2RvbmU6CisJbnRmc19pbmRleF9jdHhfcHV0KGljdHgpOworCXVwKCZ2b2wtPnF1b3RhX3FfaW5vLT5pX3NlbSk7CisJLyoKKwkgKiBXZSBzZXQgdGhlIGZsYWcgc28gd2UgZG8gbm90IHRyeSB0byBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUKKwkgKiBhZ2FpbiBvbiByZW1vdW50LgorCSAqLworCU5Wb2xTZXRRdW90YU91dE9mRGF0ZSh2b2wpOworZG9uZToKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwlpZiAoaWN0eCkKKwkJbnRmc19pbmRleF9jdHhfcHV0KGljdHgpOworCXVwKCZ2b2wtPnF1b3RhX3FfaW5vLT5pX3NlbSk7CisJcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9xdW90YS5oIGIvZnMvbnRmcy9xdW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTQ3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3F1b3RhLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIHF1b3RhLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBxdW90YSAoJFF1b3RhKSBoYW5kbGluZy4gIFBhcnQgb2YgdGhlCisgKgkgICAgIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19RVU9UQV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1FVT1RBX0gKKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisKK2V4dGVybiBCT09MIG50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUobnRmc192b2x1bWUgKnZvbCk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19RVU9UQV9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3J1bmxpc3QuYyBiL2ZzL250ZnMvcnVubGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzhmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3J1bmxpc3QuYwpAQCAtMCwwICsxLDE0MzggQEAKKy8qKgorICogcnVubGlzdC5jIC0gTlRGUyBydW5saXN0IGhhbmRsaW5nIGNvZGUuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19ybF9tbSAtIHJ1bmxpc3QgbWVtbW92ZQorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAYmFzZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfcmxfbW0ocnVubGlzdF9lbGVtZW50ICpiYXNlLCBpbnQgZHN0LCBpbnQgc3JjLAorCQlpbnQgc2l6ZSkKK3sKKwlpZiAobGlrZWx5KChkc3QgIT0gc3JjKSAmJiAoc2l6ZSA+IDApKSkKKwkJbWVtbW92ZShiYXNlICsgZHN0LCBiYXNlICsgc3JjLCBzaXplICogc2l6ZW9mICgqYmFzZSkpOworfQorCisvKioKKyAqIG50ZnNfcmxfbWMgLSBydW5saXN0IG1lbW9yeSBjb3B5CisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0cyBAZHN0YmFzZSBhbmQKKyAqIEBzcmNiYXNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19ybF9tYyhydW5saXN0X2VsZW1lbnQgKmRzdGJhc2UsIGludCBkc3QsCisJCXJ1bmxpc3RfZWxlbWVudCAqc3JjYmFzZSwgaW50IHNyYywgaW50IHNpemUpCit7CisJaWYgKGxpa2VseShzaXplID4gMCkpCisJCW1lbWNweShkc3RiYXNlICsgZHN0LCBzcmNiYXNlICsgc3JjLCBzaXplICogc2l6ZW9mKCpkc3RiYXNlKSk7Cit9CisKKy8qKgorICogbnRmc19ybF9yZWFsbG9jIC0gUmVhbGxvY2F0ZSBtZW1vcnkgZm9yIHJ1bmxpc3RzCisgKiBAcmw6CQlvcmlnaW5hbCBydW5saXN0CisgKiBAb2xkX3NpemU6CW51bWJlciBvZiBydW5saXN0IGVsZW1lbnRzIGluIHRoZSBvcmlnaW5hbCBydW5saXN0IEBybAorICogQG5ld19zaXplOgludW1iZXIgb2YgcnVubGlzdCBlbGVtZW50cyB3ZSBuZWVkIHNwYWNlIGZvcgorICoKKyAqIEFzIHRoZSBydW5saXN0cyBncm93LCBtb3JlIG1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkLiAgVG8gcHJldmVudCB0aGUKKyAqIGtlcm5lbCBoYXZpbmcgdG8gYWxsb2NhdGUgYW5kIHJlYWxsb2NhdGUgbGFyZ2UgbnVtYmVycyBvZiBzbWFsbCBiaXRzIG9mCisgKiBtZW1vcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbmQgZW50aXJlIHBhZ2Ugb2YgbWVtb3J5LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAcmwuCisgKgorICogTi5CLiAgSWYgdGhlIG5ldyBhbGxvY2F0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgcGFnZXMgaW4KKyAqICAgICAgIG1lbW9yeSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwb2ludGVyLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCwgb3IgcmVjeWNsZWQsIG1lbW9yeS4KKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3RfZWxlbWVudCAqcmwsCisJCWludCBvbGRfc2l6ZSwgaW50IG5ld19zaXplKQoreworCXJ1bmxpc3RfZWxlbWVudCAqbmV3X3JsOworCisJb2xkX3NpemUgPSBQQUdFX0FMSUdOKG9sZF9zaXplICogc2l6ZW9mKCpybCkpOworCW5ld19zaXplID0gUEFHRV9BTElHTihuZXdfc2l6ZSAqIHNpemVvZigqcmwpKTsKKwlpZiAob2xkX3NpemUgPT0gbmV3X3NpemUpCisJCXJldHVybiBybDsKKworCW5ld19ybCA9IG50ZnNfbWFsbG9jX25vZnMobmV3X3NpemUpOworCWlmICh1bmxpa2VseSghbmV3X3JsKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCWlmICh1bmxpa2VseShvbGRfc2l6ZSA+IG5ld19zaXplKSkKKwkJCW9sZF9zaXplID0gbmV3X3NpemU7CisJCW1lbWNweShuZXdfcmwsIHJsLCBvbGRfc2l6ZSk7CisJCW50ZnNfZnJlZShybCk7CisJfQorCXJldHVybiBuZXdfcmw7Cit9CisKKy8qKgorICogbnRmc19hcmVfcmxfbWVyZ2VhYmxlIC0gdGVzdCBpZiB0d28gcnVubGlzdHMgY2FuIGJlIGpvaW5lZCB0b2dldGhlcgorICogQGRzdDoJb3JpZ2luYWwgcnVubGlzdAorICogQHNyYzoJbmV3IHJ1bmxpc3QgdG8gdGVzdCBmb3IgbWVyZ2VhYmlsaXR5IHdpdGggQGRzdAorICoKKyAqIFRlc3QgaWYgdHdvIHJ1bmxpc3RzIGNhbiBiZSBqb2luZWQgdG9nZXRoZXIuIEZvciB0aGlzLCB0aGVpciBWQ05zIGFuZCBMQ05zCisgKiBtdXN0IGJlIGFkamFjZW50LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBSZXR1cm46IFRSVUUgICBTdWNjZXNzLCB0aGUgcnVubGlzdHMgY2FuIGJlIG1lcmdlZC4KKyAqCSAgIEZBTFNFICBGYWlsdXJlLCB0aGUgcnVubGlzdHMgY2Fubm90IGJlIG1lcmdlZC4KKyAqLworc3RhdGljIGlubGluZSBCT09MIG50ZnNfYXJlX3JsX21lcmdlYWJsZShydW5saXN0X2VsZW1lbnQgKmRzdCwKKwkJcnVubGlzdF9lbGVtZW50ICpzcmMpCit7CisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCWlmICgoZHN0LT5sY24gPCAwKSB8fCAoc3JjLT5sY24gPCAwKSkgICAgIC8qIEFyZSB3ZSBtZXJnaW5nIGhvbGVzPyAqLworCQlyZXR1cm4gRkFMU0U7CisJaWYgKChkc3QtPmxjbiArIGRzdC0+bGVuZ3RoKSAhPSBzcmMtPmxjbikgLyogQXJlIHRoZSBydW5zIGNvbnRpZ3VvdXM/ICovCisJCXJldHVybiBGQUxTRTsKKwlpZiAoKGRzdC0+dmNuICsgZHN0LT5sZW5ndGgpICE9IHNyYy0+dmNuKSAvKiBBcmUgdGhlIHJ1bnMgbWlzYWxpZ25lZD8gKi8KKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogX19udGZzX3JsX21lcmdlIC0gbWVyZ2UgdHdvIHJ1bmxpc3RzIHdpdGhvdXQgdGVzdGluZyBpZiB0aGV5IGNhbiBiZSBtZXJnZWQKKyAqIEBkc3Q6CW9yaWdpbmFsLCBkZXN0aW5hdGlvbiBydW5saXN0CisgKiBAc3JjOgluZXcgcnVubGlzdCB0byBtZXJnZSB3aXRoIEBkc3QKKyAqCisgKiBNZXJnZSB0aGUgdHdvIHJ1bmxpc3RzLCB3cml0aW5nIGludG8gdGhlIGRlc3RpbmF0aW9uIHJ1bmxpc3QgQGRzdC4gVGhlCisgKiBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhlIHJ1bmxpc3RzIGNhbiBiZSBtZXJnZWQgb3IgdGhpcyB3aWxsIGNvcnJ1cHQgdGhlCisgKiBkZXN0aW5hdGlvbiBydW5saXN0LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbnRmc19ybF9tZXJnZShydW5saXN0X2VsZW1lbnQgKmRzdCwgcnVubGlzdF9lbGVtZW50ICpzcmMpCit7CisJZHN0LT5sZW5ndGggKz0gc3JjLT5sZW5ndGg7Cit9CisKKy8qKgorICogbnRmc19ybF9hcHBlbmQgLSBhcHBlbmQgYSBydW5saXN0IGFmdGVyIGEgZ2l2ZW4gZWxlbWVudAorICogQGRzdDoJb3JpZ2luYWwgcnVubGlzdCB0byBiZSB3b3JrZWQgb24KKyAqIEBkc2l6ZToJbnVtYmVyIG9mIGVsZW1lbnRzIGluIEBkc3QgKGluY2x1ZGluZyBlbmQgbWFya2VyKQorICogQHNyYzoJcnVubGlzdCB0byBiZSBpbnNlcnRlZCBpbnRvIEBkc3QKKyAqIEBzc2l6ZToJbnVtYmVyIG9mIGVsZW1lbnRzIGluIEBzcmMgKGV4Y2x1ZGluZyBlbmQgbWFya2VyKQorICogQGxvYzoJYXBwZW5kIHRoZSBuZXcgcnVubGlzdCBAc3JjIGFmdGVyIHRoaXMgZWxlbWVudCBpbiBAZHN0CisgKgorICogQXBwZW5kIHRoZSBydW5saXN0IEBzcmMgYWZ0ZXIgZWxlbWVudCBAbG9jIGluIEBkc3QuICBNZXJnZSB0aGUgcmlnaHQgZW5kIG9mCisgKiB0aGUgbmV3IHJ1bmxpc3QsIGlmIG5lY2Vzc2FyeS4gQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBob2xlIGJlZm9yZSB0aGUKKyAqIGFwcGVuZGVkIHJ1bmxpc3QuCisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0cyBAZHN0IGFuZCBAc3JjLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ldywgY29tYmluZWQsIHJ1bmxpc3QuIE5vdGUsIGJvdGgKKyAqIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMgYXJlIGRlYWxsb2NhdGVkIGJlZm9yZSByZXR1cm5pbmcgc28geW91IGNhbm5vdCB1c2UKKyAqIHRoZSBwb2ludGVycyBmb3IgYW55dGhpbmcgYW55IG1vcmUuIChTdHJpY3RseSBzcGVha2luZyB0aGUgcmV0dXJuZWQgcnVubGlzdAorICogbWF5IGJlIHRoZSBzYW1lIGFzIEBkc3QgYnV0IHRoaXMgaXMgaXJyZWxldmFudC4pCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEJvdGggcnVubGlzdHMgYXJlIGxlZnQgdW5tb2RpZmllZC4gVGhlIGZvbGxvd2luZworICogZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnVubGlzdCBhcnJheS4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgcnVubGlzdF9lbGVtZW50ICpudGZzX3JsX2FwcGVuZChydW5saXN0X2VsZW1lbnQgKmRzdCwKKwkJaW50IGRzaXplLCBydW5saXN0X2VsZW1lbnQgKnNyYywgaW50IHNzaXplLCBpbnQgbG9jKQoreworCUJPT0wgcmlnaHQ7CisJaW50IG1hZ2ljOworCisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIEZpcnN0LCBjaGVjayBpZiB0aGUgcmlnaHQgaGFuZCBlbmQgbmVlZHMgbWVyZ2luZy4gKi8KKwlyaWdodCA9IG50ZnNfYXJlX3JsX21lcmdlYWJsZShzcmMgKyBzc2l6ZSAtIDEsIGRzdCArIGxvYyArIDEpOworCisJLyogU3BhY2UgcmVxdWlyZWQ6IEBkc3Qgc2l6ZSArIEBzcmMgc2l6ZSwgbGVzcyBvbmUgaWYgd2UgbWVyZ2VkLiAqLworCWRzdCA9IG50ZnNfcmxfcmVhbGxvYyhkc3QsIGRzaXplLCBkc2l6ZSArIHNzaXplIC0gcmlnaHQpOworCWlmIChJU19FUlIoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKwkvKgorCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQgZnJvbSBoZXJlIHNvIGNhbiBzdGFydCBtb2RpZnlpbmcgdGhlCisJICogb3JpZ2luYWwgcnVubGlzdHMuCisJICovCisKKwkvKiBGaXJzdCwgbWVyZ2UgdGhlIHJpZ2h0IGhhbmQgZW5kLCBpZiBuZWNlc3NhcnkuICovCisJaWYgKHJpZ2h0KQorCQlfX250ZnNfcmxfbWVyZ2Uoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKworCW1hZ2ljID0gbG9jICsgc3NpemU7CisKKwkvKiBNb3ZlIHRoZSB0YWlsIG9mIEBkc3Qgb3V0IG9mIHRoZSB3YXksIHRoZW4gY29weSBpbiBAc3JjLiAqLworCW50ZnNfcmxfbW0oZHN0LCBtYWdpYyArIDEsIGxvYyArIDEgKyByaWdodCwgZHNpemUgLSBsb2MgLSAxIC0gcmlnaHQpOworCW50ZnNfcmxfbWMoZHN0LCBsb2MgKyAxLCBzcmMsIDAsIHNzaXplKTsKKworCS8qIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgcHJlY2VkaW5nIGhvbGUuICovCisJZHN0W2xvY10ubGVuZ3RoID0gZHN0W2xvYyArIDFdLnZjbiAtIGRzdFtsb2NdLnZjbjsKKworCS8qIFdlIG1heSBoYXZlIGNoYW5nZWQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSwgc28gZml4IHRoZSBlbmQgbWFya2VyICovCisJaWYgKGRzdFttYWdpYyArIDFdLmxjbiA9PSBMQ05fRU5PRU5UKQorCQlkc3RbbWFnaWMgKyAxXS52Y24gPSBkc3RbbWFnaWNdLnZjbiArIGRzdFttYWdpY10ubGVuZ3RoOworCisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3JsX2luc2VydCAtIGluc2VydCBhIHJ1bmxpc3QgaW50byBhbm90aGVyCisgKiBAZHN0OglvcmlnaW5hbCBydW5saXN0IHRvIGJlIHdvcmtlZCBvbgorICogQGRzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQGRzdCAoaW5jbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAc3JjOgluZXcgcnVubGlzdCB0byBiZSBpbnNlcnRlZAorICogQHNzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQHNyYyAoZXhjbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAbG9jOglpbnNlcnQgdGhlIG5ldyBydW5saXN0IEBzcmMgYmVmb3JlIHRoaXMgZWxlbWVudCBpbiBAZHN0CisgKgorICogSW5zZXJ0IHRoZSBydW5saXN0IEBzcmMgYmVmb3JlIGVsZW1lbnQgQGxvYyBpbiB0aGUgcnVubGlzdCBAZHN0LiBNZXJnZSB0aGUKKyAqIGxlZnQgZW5kIG9mIHRoZSBuZXcgcnVubGlzdCwgaWYgbmVjZXNzYXJ5LiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGhvbGUKKyAqIGFmdGVyIHRoZSBpbnNlcnRlZCBydW5saXN0LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcsIGNvbWJpbmVkLCBydW5saXN0LiBOb3RlLCBib3RoCisgKiBydW5saXN0cyBAZHN0IGFuZCBAc3JjIGFyZSBkZWFsbG9jYXRlZCBiZWZvcmUgcmV0dXJuaW5nIHNvIHlvdSBjYW5ub3QgdXNlCisgKiB0aGUgcG9pbnRlcnMgZm9yIGFueXRoaW5nIGFueSBtb3JlLiAoU3RyaWN0bHkgc3BlYWtpbmcgdGhlIHJldHVybmVkIHJ1bmxpc3QKKyAqIG1heSBiZSB0aGUgc2FtZSBhcyBAZHN0IGJ1dCB0aGlzIGlzIGlycmVsZXZhbnQuKQorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBCb3RoIHJ1bmxpc3RzIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9pbnNlcnQocnVubGlzdF9lbGVtZW50ICpkc3QsCisJCWludCBkc2l6ZSwgcnVubGlzdF9lbGVtZW50ICpzcmMsIGludCBzc2l6ZSwgaW50IGxvYykKK3sKKwlCT09MIGxlZnQgPSBGQUxTRTsKKwlCT09MIGRpc2MgPSBGQUxTRTsJLyogRGlzY29udGludWl0eSAqLworCUJPT0wgaG9sZSA9IEZBTFNFOwkvKiBGb2xsb3dpbmcgYSBob2xlICovCisJaW50IG1hZ2ljOworCisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIGRpc2MgPT4gRGlzY29udGludWl0eSBiZXR3ZWVuIHRoZSBlbmQgb2YgQGRzdCBhbmQgdGhlIHN0YXJ0IG9mIEBzcmMuCisJICoJICAgVGhpcyBtZWFucyB3ZSBtaWdodCBuZWVkIHRvIGluc2VydCBhIGhvbGUuCisJICogaG9sZSA9PiBAZHN0IGVuZHMgd2l0aCBhIGhvbGUgb3IgYW4gdW5tYXBwZWQgcmVnaW9uIHdoaWNoIHdlIGNhbgorCSAqCSAgIGV4dGVuZCB0byBtYXRjaCB0aGUgZGlzY29udGludWl0eS4gKi8KKwlpZiAobG9jID09IDApCisJCWRpc2MgPSAoc3JjWzBdLnZjbiA+IDApOworCWVsc2UgeworCQlzNjQgbWVyZ2VkX2xlbmd0aDsKKworCQlsZWZ0ID0gbnRmc19hcmVfcmxfbWVyZ2VhYmxlKGRzdCArIGxvYyAtIDEsIHNyYyk7CisKKwkJbWVyZ2VkX2xlbmd0aCA9IGRzdFtsb2MgLSAxXS5sZW5ndGg7CisJCWlmIChsZWZ0KQorCQkJbWVyZ2VkX2xlbmd0aCArPSBzcmMtPmxlbmd0aDsKKworCQlkaXNjID0gKHNyY1swXS52Y24gPiBkc3RbbG9jIC0gMV0udmNuICsgbWVyZ2VkX2xlbmd0aCk7CisJCWlmIChkaXNjKQorCQkJaG9sZSA9IChkc3RbbG9jIC0gMV0ubGNuID09IExDTl9IT0xFKTsKKwl9CisKKwkvKiBTcGFjZSByZXF1aXJlZDogQGRzdCBzaXplICsgQHNyYyBzaXplLCBsZXNzIG9uZSBpZiB3ZSBtZXJnZWQsIHBsdXMKKwkgKiBvbmUgaWYgdGhlcmUgd2FzIGEgZGlzY29udGludWl0eSwgbGVzcyBvbmUgZm9yIGEgdHJhaWxpbmcgaG9sZS4gKi8KKwlkc3QgPSBudGZzX3JsX3JlYWxsb2MoZHN0LCBkc2l6ZSwgZHNpemUgKyBzc2l6ZSAtIGxlZnQgKyBkaXNjIC0gaG9sZSk7CisJaWYgKElTX0VSUihkc3QpKQorCQlyZXR1cm4gZHN0OworCS8qCisJICogV2UgYXJlIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBmcm9tIGhlcmUgc28gY2FuIHN0YXJ0IG1vZGlmeWluZyB0aGUKKwkgKiBvcmlnaW5hbCBydW5saXN0LgorCSAqLworCisJaWYgKGxlZnQpCisJCV9fbnRmc19ybF9tZXJnZShkc3QgKyBsb2MgLSAxLCBzcmMpOworCisJbWFnaWMgPSBsb2MgKyBzc2l6ZSAtIGxlZnQgKyBkaXNjIC0gaG9sZTsKKworCS8qIE1vdmUgdGhlIHRhaWwgb2YgQGRzdCBvdXQgb2YgdGhlIHdheSwgdGhlbiBjb3B5IGluIEBzcmMuICovCisJbnRmc19ybF9tbShkc3QsIG1hZ2ljLCBsb2MsIGRzaXplIC0gbG9jKTsKKwludGZzX3JsX21jKGRzdCwgbG9jICsgZGlzYyAtIGhvbGUsIHNyYywgbGVmdCwgc3NpemUgLSBsZWZ0KTsKKworCS8qIEFkanVzdCB0aGUgVkNOIG9mIHRoZSBsYXN0IHJ1biAuLi4gKi8KKwlpZiAoZHN0W21hZ2ljXS5sY24gPD0gTENOX0hPTEUpCisJCWRzdFttYWdpY10udmNuID0gZHN0W21hZ2ljIC0gMV0udmNuICsgZHN0W21hZ2ljIC0gMV0ubGVuZ3RoOworCS8qIC4uLiBhbmQgdGhlIGxlbmd0aC4gKi8KKwlpZiAoZHN0W21hZ2ljXS5sY24gPT0gTENOX0hPTEUgfHwgZHN0W21hZ2ljXS5sY24gPT0gTENOX1JMX05PVF9NQVBQRUQpCisJCWRzdFttYWdpY10ubGVuZ3RoID0gZHN0W21hZ2ljICsgMV0udmNuIC0gZHN0W21hZ2ljXS52Y247CisKKwkvKiBXcml0aW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB0aGVyZSdzIGEgZGlzY29udGludWl0eS4gKi8KKwlpZiAoZGlzYykgeworCQlpZiAoaG9sZSkKKwkJCWRzdFtsb2MgLSAxXS5sZW5ndGggPSBkc3RbbG9jXS52Y24gLSBkc3RbbG9jIC0gMV0udmNuOworCQllbHNlIHsKKwkJCWlmIChsb2MgPiAwKSB7CisJCQkJZHN0W2xvY10udmNuID0gZHN0W2xvYyAtIDFdLnZjbiArCisJCQkJCQlkc3RbbG9jIC0gMV0ubGVuZ3RoOworCQkJCWRzdFtsb2NdLmxlbmd0aCA9IGRzdFtsb2MgKyAxXS52Y24gLQorCQkJCQkJZHN0W2xvY10udmNuOworCQkJfSBlbHNlIHsKKwkJCQlkc3RbbG9jXS52Y24gPSAwOworCQkJCWRzdFtsb2NdLmxlbmd0aCA9IGRzdFtsb2MgKyAxXS52Y247CisJCQl9CisJCQlkc3RbbG9jXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJfQorCisJCW1hZ2ljICs9IGhvbGU7CisKKwkJaWYgKGRzdFttYWdpY10ubGNuID09IExDTl9FTk9FTlQpCisJCQlkc3RbbWFnaWNdLnZjbiA9IGRzdFttYWdpYyAtIDFdLnZjbiArCisJCQkJCWRzdFttYWdpYyAtIDFdLmxlbmd0aDsKKwl9CisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3JsX3JlcGxhY2UgLSBvdmVyd3JpdGUgYSBydW5saXN0IGVsZW1lbnQgd2l0aCBhbm90aGVyIHJ1bmxpc3QKKyAqIEBkc3Q6CW9yaWdpbmFsIHJ1bmxpc3QgdG8gYmUgd29ya2VkIG9uCisgKiBAZHNpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAZHN0IChpbmNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBzcmM6CW5ldyBydW5saXN0IHRvIGJlIGluc2VydGVkCisgKiBAc3NpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAc3JjIChleGNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBsb2M6CWluZGV4IGluIHJ1bmxpc3QgQGRzdCB0byBvdmVyd3JpdGUgd2l0aCBAc3JjCisgKgorICogUmVwbGFjZSB0aGUgcnVubGlzdCBlbGVtZW50IEBkc3QgYXQgQGxvYyB3aXRoIEBzcmMuIE1lcmdlIHRoZSBsZWZ0IGFuZAorICogcmlnaHQgZW5kcyBvZiB0aGUgaW5zZXJ0ZWQgcnVubGlzdCwgaWYgbmVjZXNzYXJ5LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcsIGNvbWJpbmVkLCBydW5saXN0LiBOb3RlLCBib3RoCisgKiBydW5saXN0cyBAZHN0IGFuZCBAc3JjIGFyZSBkZWFsbG9jYXRlZCBiZWZvcmUgcmV0dXJuaW5nIHNvIHlvdSBjYW5ub3QgdXNlCisgKiB0aGUgcG9pbnRlcnMgZm9yIGFueXRoaW5nIGFueSBtb3JlLiAoU3RyaWN0bHkgc3BlYWtpbmcgdGhlIHJldHVybmVkIHJ1bmxpc3QKKyAqIG1heSBiZSB0aGUgc2FtZSBhcyBAZHN0IGJ1dCB0aGlzIGlzIGlycmVsZXZhbnQuKQorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBCb3RoIHJ1bmxpc3RzIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9yZXBsYWNlKHJ1bmxpc3RfZWxlbWVudCAqZHN0LAorCQlpbnQgZHNpemUsIHJ1bmxpc3RfZWxlbWVudCAqc3JjLCBpbnQgc3NpemUsIGludCBsb2MpCit7CisJQk9PTCBsZWZ0ID0gRkFMU0U7CisJQk9PTCByaWdodDsKKwlpbnQgbWFnaWM7CisKKwlCVUdfT04oIWRzdCk7CisJQlVHX09OKCFzcmMpOworCisJLyogRmlyc3QsIG1lcmdlIHRoZSBsZWZ0IGFuZCByaWdodCBlbmRzLCBpZiBuZWNlc3NhcnkuICovCisJcmlnaHQgPSBudGZzX2FyZV9ybF9tZXJnZWFibGUoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKwlpZiAobG9jID4gMCkKKwkJbGVmdCA9IG50ZnNfYXJlX3JsX21lcmdlYWJsZShkc3QgKyBsb2MgLSAxLCBzcmMpOworCisJLyogQWxsb2NhdGUgc29tZSBzcGFjZS4gV2UnbGwgbmVlZCBsZXNzIGlmIHRoZSBsZWZ0LCByaWdodCwgb3IgYm90aAorCSAqIGVuZHMgd2VyZSBtZXJnZWQuICovCisJZHN0ID0gbnRmc19ybF9yZWFsbG9jKGRzdCwgZHNpemUsIGRzaXplICsgc3NpemUgLSBsZWZ0IC0gcmlnaHQpOworCWlmIChJU19FUlIoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKwkvKgorCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQgZnJvbSBoZXJlIHNvIGNhbiBzdGFydCBtb2RpZnlpbmcgdGhlCisJICogb3JpZ2luYWwgcnVubGlzdHMuCisJICovCisJaWYgKHJpZ2h0KQorCQlfX250ZnNfcmxfbWVyZ2Uoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKwlpZiAobGVmdCkKKwkJX19udGZzX3JsX21lcmdlKGRzdCArIGxvYyAtIDEsIHNyYyk7CisKKwkvKiBGSVhNRTogV2hhdCBkb2VzIHRoaXMgbWVhbj8gKEFJQSkgKi8KKwltYWdpYyA9IGxvYyArIHNzaXplIC0gbGVmdDsKKworCS8qIE1vdmUgdGhlIHRhaWwgb2YgQGRzdCBvdXQgb2YgdGhlIHdheSwgdGhlbiBjb3B5IGluIEBzcmMuICovCisJbnRmc19ybF9tbShkc3QsIG1hZ2ljLCBsb2MgKyByaWdodCArIDEsIGRzaXplIC0gbG9jIC0gcmlnaHQgLSAxKTsKKwludGZzX3JsX21jKGRzdCwgbG9jLCBzcmMsIGxlZnQsIHNzaXplIC0gbGVmdCk7CisKKwkvKiBXZSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUsIHNvIGZpeCB0aGUgZW5kIG1hcmtlciAqLworCWlmIChkc3RbbWFnaWNdLmxjbiA9PSBMQ05fRU5PRU5UKQorCQlkc3RbbWFnaWNdLnZjbiA9IGRzdFttYWdpYyAtIDFdLnZjbiArIGRzdFttYWdpYyAtIDFdLmxlbmd0aDsKKwlyZXR1cm4gZHN0OworfQorCisvKioKKyAqIG50ZnNfcmxfc3BsaXQgLSBpbnNlcnQgYSBydW5saXN0IGludG8gdGhlIGNlbnRyZSBvZiBhIGhvbGUKKyAqIEBkc3Q6CW9yaWdpbmFsIHJ1bmxpc3QgdG8gYmUgd29ya2VkIG9uCisgKiBAZHNpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAZHN0IChpbmNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBzcmM6CW5ldyBydW5saXN0IHRvIGJlIGluc2VydGVkCisgKiBAc3NpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAc3JjIChleGNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBsb2M6CWluZGV4IGluIHJ1bmxpc3QgQGRzdCBhdCB3aGljaCB0byBzcGxpdCBhbmQgaW5zZXJ0IEBzcmMKKyAqCisgKiBTcGxpdCB0aGUgcnVubGlzdCBAZHN0IGF0IEBsb2MgaW50byB0d28gYW5kIGluc2VydCBAbmV3IGluIGJldHdlZW4gdGhlIHR3bworICogZnJhZ21lbnRzLiBObyBtZXJnaW5nIG9mIHJ1bmxpc3RzIGlzIG5lY2Vzc2FyeS4gQWRqdXN0IHRoZSBzaXplIG9mIHRoZQorICogaG9sZXMgZWl0aGVyIHNpZGUuCisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0cyBAZHN0IGFuZCBAc3JjLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ldywgY29tYmluZWQsIHJ1bmxpc3QuIE5vdGUsIGJvdGgKKyAqIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMgYXJlIGRlYWxsb2NhdGVkIGJlZm9yZSByZXR1cm5pbmcgc28geW91IGNhbm5vdCB1c2UKKyAqIHRoZSBwb2ludGVycyBmb3IgYW55dGhpbmcgYW55IG1vcmUuIChTdHJpY3RseSBzcGVha2luZyB0aGUgcmV0dXJuZWQgcnVubGlzdAorICogbWF5IGJlIHRoZSBzYW1lIGFzIEBkc3QgYnV0IHRoaXMgaXMgaXJyZWxldmFudC4pCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEJvdGggcnVubGlzdHMgYXJlIGxlZnQgdW5tb2RpZmllZC4gVGhlIGZvbGxvd2luZworICogZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnVubGlzdCBhcnJheS4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgcnVubGlzdF9lbGVtZW50ICpudGZzX3JsX3NwbGl0KHJ1bmxpc3RfZWxlbWVudCAqZHN0LCBpbnQgZHNpemUsCisJCXJ1bmxpc3RfZWxlbWVudCAqc3JjLCBpbnQgc3NpemUsIGludCBsb2MpCit7CisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIFNwYWNlIHJlcXVpcmVkOiBAZHN0IHNpemUgKyBAc3JjIHNpemUgKyBvbmUgbmV3IGhvbGUuICovCisJZHN0ID0gbnRmc19ybF9yZWFsbG9jKGRzdCwgZHNpemUsIGRzaXplICsgc3NpemUgKyAxKTsKKwlpZiAoSVNfRVJSKGRzdCkpCisJCXJldHVybiBkc3Q7CisJLyoKKwkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0byBzdWNjZWVkIGZyb20gaGVyZSBzbyBjYW4gc3RhcnQgbW9kaWZ5aW5nIHRoZQorCSAqIG9yaWdpbmFsIHJ1bmxpc3RzLgorCSAqLworCisJLyogTW92ZSB0aGUgdGFpbCBvZiBAZHN0IG91dCBvZiB0aGUgd2F5LCB0aGVuIGNvcHkgaW4gQHNyYy4gKi8KKwludGZzX3JsX21tKGRzdCwgbG9jICsgMSArIHNzaXplLCBsb2MsIGRzaXplIC0gbG9jKTsKKwludGZzX3JsX21jKGRzdCwgbG9jICsgMSwgc3JjLCAwLCBzc2l6ZSk7CisKKwkvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGhvbGVzIGVpdGhlciBzaXplIG9mIEBzcmMuICovCisJZHN0W2xvY10ubGVuZ3RoCQk9IGRzdFtsb2MrMV0udmNuICAgICAgIC0gZHN0W2xvY10udmNuOworCWRzdFtsb2Mrc3NpemUrMV0udmNuICAgID0gZHN0W2xvYytzc2l6ZV0udmNuICAgKyBkc3RbbG9jK3NzaXplXS5sZW5ndGg7CisJZHN0W2xvYytzc2l6ZSsxXS5sZW5ndGggPSBkc3RbbG9jK3NzaXplKzJdLnZjbiAtIGRzdFtsb2Mrc3NpemUrMV0udmNuOworCisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3J1bmxpc3RzX21lcmdlIC0gbWVyZ2UgdHdvIHJ1bmxpc3RzIGludG8gb25lCisgKiBAZHJsOglvcmlnaW5hbCBydW5saXN0IHRvIGJlIHdvcmtlZCBvbgorICogQHNybDoJbmV3IHJ1bmxpc3QgdG8gYmUgbWVyZ2VkIGludG8gQGRybAorICoKKyAqIEZpcnN0IHdlIHNhbml0eSBjaGVjayB0aGUgdHdvIHJ1bmxpc3RzIEBzcmwgYW5kIEBkcmwgdG8gbWFrZSBzdXJlIHRoYXQgdGhleQorICogYXJlIHNlbnNpYmxlIGFuZCBjYW4gYmUgbWVyZ2VkLiBUaGUgcnVubGlzdCBAc3JsIG11c3QgYmUgZWl0aGVyIGFmdGVyIHRoZQorICogcnVubGlzdCBAZHJsIG9yIGNvbXBsZXRlbHkgd2l0aGluIGEgaG9sZSAob3IgdW5tYXBwZWQgcmVnaW9uKSBpbiBAZHJsLgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRybCBhbmQgQHNybC4KKyAqCisgKiBNZXJnaW5nIG9mIHJ1bmxpc3RzIGlzIG5lY2Vzc2FyeSBpbiB0d28gY2FzZXM6CisgKiAgIDEuIFdoZW4gYXR0cmlidXRlIGxpc3RzIGFyZSB1c2VkIGFuZCBhIGZ1cnRoZXIgZXh0ZW50IGlzIGJlaW5nIG1hcHBlZC4KKyAqICAgMi4gV2hlbiBuZXcgY2x1c3RlcnMgYXJlIGFsbG9jYXRlZCB0byBmaWxsIGEgaG9sZSBvciBleHRlbmQgYSBmaWxlLgorICoKKyAqIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHdheXMgQHNybCBjYW4gYmUgbWVyZ2VkLiBJdCBjYW46CisgKgktIGJlIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBob2xlLAorICoJLSBzcGxpdCB0aGUgaG9sZSBpbiB0d28gYW5kIGJlIGluc2VydGVkIGJldHdlZW4gdGhlIHR3byBmcmFnbWVudHMsCisgKgktIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgYSBob2xlLCBvciBpdCBjYW4KKyAqCS0gcmVwbGFjZSB0aGUgd2hvbGUgaG9sZS4KKyAqIEl0IGNhbiBhbHNvIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QsIHdoaWNoIGlzIGp1c3QgYSB2YXJpYW50CisgKiBvZiB0aGUgaW5zZXJ0IGNhc2UuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3LCBjb21iaW5lZCwgcnVubGlzdC4gTm90ZSwgYm90aAorICogcnVubGlzdHMgQGRybCBhbmQgQHNybCBhcmUgZGVhbGxvY2F0ZWQgYmVmb3JlIHJldHVybmluZyBzbyB5b3UgY2Fubm90IHVzZQorICogdGhlIHBvaW50ZXJzIGZvciBhbnl0aGluZyBhbnkgbW9yZS4gKFN0cmljdGx5IHNwZWFraW5nIHRoZSByZXR1cm5lZCBydW5saXN0CisgKiBtYXkgYmUgdGhlIHNhbWUgYXMgQGRzdCBidXQgdGhpcyBpcyBpcnJlbGV2YW50LikKKyAqCisgKiBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4gQm90aCBydW5saXN0cyBhcmUgbGVmdCB1bm1vZGlmaWVkLiBUaGUgZm9sbG93aW5nCisgKiBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqCS1FUkFOR0UJLSBUaGUgcnVubGlzdHMgb3ZlcmxhcCBhbmQgY2Fubm90IGJlIG1lcmdlZC4KKyAqLworcnVubGlzdF9lbGVtZW50ICpudGZzX3J1bmxpc3RzX21lcmdlKHJ1bmxpc3RfZWxlbWVudCAqZHJsLAorCQlydW5saXN0X2VsZW1lbnQgKnNybCkKK3sKKwlpbnQgZGksIHNpOwkJLyogQ3VycmVudCBpbmRleCBpbnRvIEBbZHNdcmwuICovCisJaW50IHNzdGFydDsJCS8qIEZpcnN0IGluZGV4IHdpdGggbGNuID4gTENOX1JMX05PVF9NQVBQRUQuICovCisJaW50IGRpbnM7CQkvKiBJbmRleCBpbnRvIEBkcmwgYXQgd2hpY2ggdG8gaW5zZXJ0IEBzcmwuICovCisJaW50IGRlbmQsIHNlbmQ7CQkvKiBMYXN0IGluZGV4IGludG8gQFtkc11ybC4gKi8KKwlpbnQgZGZpbmFsLCBzZmluYWw7CS8qIFRoZSBsYXN0IGluZGV4IGludG8gQFtkc11ybCB3aXRoCisJCQkJICAgbGNuID49IExDTl9IT0xFLiAqLworCWludCBtYXJrZXIgPSAwOworCVZDTiBtYXJrZXJfdmNuID0gMDsKKworI2lmZGVmIERFQlVHCisJbnRmc19kZWJ1ZygiZHN0OiIpOworCW50ZnNfZGVidWdfZHVtcF9ydW5saXN0KGRybCk7CisJbnRmc19kZWJ1Zygic3JjOiIpOworCW50ZnNfZGVidWdfZHVtcF9ydW5saXN0KHNybCk7CisjZW5kaWYKKworCS8qIENoZWNrIGZvciBzaWxseSBjYWxsaW5nLi4uICovCisJaWYgKHVubGlrZWx5KCFzcmwpKQorCQlyZXR1cm4gZHJsOworCWlmIChJU19FUlIoc3JsKSB8fCBJU19FUlIoZHJsKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IG1hcHBpbmcgaXMgYmVpbmcgZG9uZSBub3cuICovCisJaWYgKHVubGlrZWx5KCFkcmwpKSB7CisJCWRybCA9IHNybDsKKwkJLyogQ29tcGxldGUgdGhlIHNvdXJjZSBydW5saXN0IGlmIG5lY2Vzc2FyeS4gKi8KKwkJaWYgKHVubGlrZWx5KGRybFswXS52Y24pKSB7CisJCQkvKiBTY2FuIHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBydW5saXN0LiAqLworCQkJZm9yIChkZW5kID0gMDsgbGlrZWx5KGRybFtkZW5kXS5sZW5ndGgpOyBkZW5kKyspCisJCQkJOworCQkJZHJsID0gbnRmc19ybF9yZWFsbG9jKGRybCwgZGVuZCwgZGVuZCArIDEpOworCQkJaWYgKElTX0VSUihkcmwpKQorCQkJCXJldHVybiBkcmw7CisJCQkvKiBJbnNlcnQgc3RhcnQgZWxlbWVudCBhdCB0aGUgZnJvbnQgb2YgdGhlIHJ1bmxpc3QuICovCisJCQludGZzX3JsX21tKGRybCwgMSwgMCwgZGVuZCk7CisJCQlkcmxbMF0udmNuID0gMDsKKwkJCWRybFswXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJCWRybFswXS5sZW5ndGggPSBkcmxbMV0udmNuOworCQl9CisJCWdvdG8gZmluaXNoZWQ7CisJfQorCisJc2kgPSBkaSA9IDA7CisKKwkvKiBTa2lwIGFueSB1bm1hcHBlZCBzdGFydCBlbGVtZW50KHMpIGluIHRoZSBzb3VyY2UgcnVubGlzdC4gKi8KKwl3aGlsZSAoc3JsW3NpXS5sZW5ndGggJiYgc3JsW3NpXS5sY24gPCBMQ05fSE9MRSkKKwkJc2krKzsKKworCS8qIENhbid0IGhhdmUgYW4gZW50aXJlbHkgdW5tYXBwZWQgc291cmNlIHJ1bmxpc3QuICovCisJQlVHX09OKCFzcmxbc2ldLmxlbmd0aCk7CisKKwkvKiBSZWNvcmQgdGhlIHN0YXJ0aW5nIHBvaW50cy4gKi8KKwlzc3RhcnQgPSBzaTsKKworCS8qCisJICogU2tpcCBmb3J3YXJkIGluIEBkcmwgdW50aWwgd2UgcmVhY2ggdGhlIHBvc2l0aW9uIHdoZXJlIEBzcmwgbmVlZHMgdG8KKwkgKiBiZSBpbnNlcnRlZC4gSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiBAZHJsLCBAc3JsIGp1c3QgbmVlZHMgdG8gYmUKKwkgKiBhcHBlbmRlZCB0byBAZHJsLgorCSAqLworCWZvciAoOyBkcmxbZGldLmxlbmd0aDsgZGkrKykgeworCQlpZiAoZHJsW2RpXS52Y24gKyBkcmxbZGldLmxlbmd0aCA+IHNybFtzc3RhcnRdLnZjbikKKwkJCWJyZWFrOworCX0KKwlkaW5zID0gZGk7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIGlsbGVnYWwgb3ZlcmxhcHMuICovCisJaWYgKChkcmxbZGldLnZjbiA9PSBzcmxbc2ldLnZjbikgJiYgKGRybFtkaV0ubGNuID49IDApICYmCisJCQkoc3JsW3NpXS5sY24gPj0gMCkpIHsKKwkJbnRmc19lcnJvcihOVUxMLCAiUnVuIGxpc3RzIG92ZXJsYXAuIENhbm5vdCBtZXJnZSEiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVSQU5HRSk7CisJfQorCisJLyogU2NhbiB0byB0aGUgZW5kIG9mIGJvdGggcnVubGlzdHMgaW4gb3JkZXIgdG8ga25vdyB0aGVpciBzaXplcy4gKi8KKwlmb3IgKHNlbmQgPSBzaTsgc3JsW3NlbmRdLmxlbmd0aDsgc2VuZCsrKQorCQk7CisJZm9yIChkZW5kID0gZGk7IGRybFtkZW5kXS5sZW5ndGg7IGRlbmQrKykKKwkJOworCisJaWYgKHNybFtzZW5kXS5sY24gPT0gTENOX0VOT0VOVCkKKwkJbWFya2VyX3ZjbiA9IHNybFttYXJrZXIgPSBzZW5kXS52Y247CisKKwkvKiBTY2FuIHRvIHRoZSBsYXN0IGVsZW1lbnQgd2l0aCBsY24gPj0gTENOX0hPTEUuICovCisJZm9yIChzZmluYWwgPSBzZW5kOyBzZmluYWwgPj0gMCAmJiBzcmxbc2ZpbmFsXS5sY24gPCBMQ05fSE9MRTsgc2ZpbmFsLS0pCisJCTsKKwlmb3IgKGRmaW5hbCA9IGRlbmQ7IGRmaW5hbCA+PSAwICYmIGRybFtkZmluYWxdLmxjbiA8IExDTl9IT0xFOyBkZmluYWwtLSkKKwkJOworCisJeworCUJPT0wgc3RhcnQ7CisJQk9PTCBmaW5pc2g7CisJaW50IGRzID0gZGVuZCArIDE7CQkvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZHJsICYgc3JsICovCisJaW50IHNzID0gc2ZpbmFsIC0gc3N0YXJ0ICsgMTsKKworCXN0YXJ0ICA9ICgoZHJsW2RpbnNdLmxjbiA8ICBMQ05fUkxfTk9UX01BUFBFRCkgfHwgICAgLyogRW5kIG9mIGZpbGUgICAqLworCQkgIChkcmxbZGluc10udmNuID09IHNybFtzc3RhcnRdLnZjbikpOwkgICAgIC8qIFN0YXJ0IG9mIGhvbGUgKi8KKwlmaW5pc2ggPSAoKGRybFtkaW5zXS5sY24gPj0gTENOX1JMX05PVF9NQVBQRUQpICYmICAgIC8qIEVuZCBvZiBmaWxlICAgKi8KKwkJICgoZHJsW2RpbnNdLnZjbiArIGRybFtkaW5zXS5sZW5ndGgpIDw9ICAgICAgLyogRW5kIG9mIGhvbGUgICAqLworCQkgIChzcmxbc2VuZCAtIDFdLnZjbiArIHNybFtzZW5kIC0gMV0ubGVuZ3RoKSkpOworCisJLyogT3Igd2UnbGwgbG9zZSBhbiBlbmQgbWFya2VyICovCisJaWYgKHN0YXJ0ICYmIGZpbmlzaCAmJiAoZHJsW2RpbnNdLmxlbmd0aCA9PSAwKSkKKwkJc3MrKzsKKwlpZiAobWFya2VyICYmIChkcmxbZGluc10udmNuICsgZHJsW2RpbnNdLmxlbmd0aCA+IHNybFtzZW5kIC0gMV0udmNuKSkKKwkJZmluaXNoID0gRkFMU0U7CisjaWYgMAorCW50ZnNfZGVidWcoImRmaW5hbCA9ICVpLCBkZW5kID0gJWkiLCBkZmluYWwsIGRlbmQpOworCW50ZnNfZGVidWcoInNzdGFydCA9ICVpLCBzZmluYWwgPSAlaSwgc2VuZCA9ICVpIiwgc3N0YXJ0LCBzZmluYWwsIHNlbmQpOworCW50ZnNfZGVidWcoInN0YXJ0ID0gJWksIGZpbmlzaCA9ICVpIiwgc3RhcnQsIGZpbmlzaCk7CisJbnRmc19kZWJ1ZygiZHMgPSAlaSwgc3MgPSAlaSwgZGlucyA9ICVpIiwgZHMsIHNzLCBkaW5zKTsKKyNlbmRpZgorCWlmIChzdGFydCkgeworCQlpZiAoZmluaXNoKQorCQkJZHJsID0gbnRmc19ybF9yZXBsYWNlKGRybCwgZHMsIHNybCArIHNzdGFydCwgc3MsIGRpbnMpOworCQllbHNlCisJCQlkcmwgPSBudGZzX3JsX2luc2VydChkcmwsIGRzLCBzcmwgKyBzc3RhcnQsIHNzLCBkaW5zKTsKKwl9IGVsc2UgeworCQlpZiAoZmluaXNoKQorCQkJZHJsID0gbnRmc19ybF9hcHBlbmQoZHJsLCBkcywgc3JsICsgc3N0YXJ0LCBzcywgZGlucyk7CisJCWVsc2UKKwkJCWRybCA9IG50ZnNfcmxfc3BsaXQoZHJsLCBkcywgc3JsICsgc3N0YXJ0LCBzcywgZGlucyk7CisJfQorCWlmIChJU19FUlIoZHJsKSkgeworCQludGZzX2Vycm9yKE5VTEwsICJNZXJnZSBmYWlsZWQuIik7CisJCXJldHVybiBkcmw7CisJfQorCW50ZnNfZnJlZShzcmwpOworCWlmIChtYXJrZXIpIHsKKwkJbnRmc19kZWJ1ZygiVHJpZ2dlcmluZyBtYXJrZXIgY29kZS4iKTsKKwkJZm9yIChkcyA9IGRlbmQ7IGRybFtkc10ubGVuZ3RoOyBkcysrKQorCQkJOworCQkvKiBXZSBvbmx5IG5lZWQgdG8gY2FyZSBpZiBAc3JsIGVuZGVkIGFmdGVyIEBkcmwuICovCisJCWlmIChkcmxbZHNdLnZjbiA8PSBtYXJrZXJfdmNuKSB7CisJCQlpbnQgc2xvdHMgPSAwOworCisJCQlpZiAoZHJsW2RzXS52Y24gPT0gbWFya2VyX3ZjbikgeworCQkJCW50ZnNfZGVidWcoIk9sZCBtYXJrZXIgPSAweCVsbHgsIHJlcGxhY2luZyAiCisJCQkJCQkid2l0aCBMQ05fRU5PRU5ULiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJZHJsW2RzXS5sY24pOworCQkJCWRybFtkc10ubGNuID0gTENOX0VOT0VOVDsKKwkJCQlnb3RvIGZpbmlzaGVkOworCQkJfQorCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gY3JlYXRlIGFuIHVubWFwcGVkIHJ1bmxpc3QgZWxlbWVudCBpbgorCQkJICogQGRybCBvciBleHRlbmQgYW4gZXhpc3Rpbmcgb25lIGJlZm9yZSBhZGRpbmcgdGhlCisJCQkgKiBFTk9FTlQgdGVybWluYXRvci4KKwkJCSAqLworCQkJaWYgKGRybFtkc10ubGNuID09IExDTl9FTk9FTlQpIHsKKwkJCQlkcy0tOworCQkJCXNsb3RzID0gMTsKKwkJCX0KKwkJCWlmIChkcmxbZHNdLmxjbiAhPSBMQ05fUkxfTk9UX01BUFBFRCkgeworCQkJCS8qIEFkZCBhbiB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQuICovCisJCQkJaWYgKCFzbG90cykgeworCQkJCQkvKiBGSVhNRS9UT0RPOiBXZSBuZWVkIHRvIGhhdmUgdGhlCisJCQkJCSAqIGV4dHJhIG1lbW9yeSBhbHJlYWR5ISAoQUlBKSAqLworCQkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2MoZHJsLCBkcywgZHMgKyAyKTsKKwkJCQkJaWYgKCFkcmwpCisJCQkJCQlnb3RvIGNyaXRpY2FsX2Vycm9yOworCQkJCQlzbG90cyA9IDI7CisJCQkJfQorCQkJCWRzKys7CisJCQkJLyogTmVlZCB0byBzZXQgdmNuIGlmIGl0IGlzbid0IHNldCBhbHJlYWR5LiAqLworCQkJCWlmIChzbG90cyAhPSAxKQorCQkJCQlkcmxbZHNdLnZjbiA9IGRybFtkcyAtIDFdLnZjbiArCisJCQkJCQkJZHJsW2RzIC0gMV0ubGVuZ3RoOworCQkJCWRybFtkc10ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCQkJLyogV2Ugbm93IHVzZWQgdXAgYSBzbG90LiAqLworCQkJCXNsb3RzLS07CisJCQl9CisJCQlkcmxbZHNdLmxlbmd0aCA9IG1hcmtlcl92Y24gLSBkcmxbZHNdLnZjbjsKKwkJCS8qIEZpbmFsbHkgYWRkIHRoZSBFTk9FTlQgdGVybWluYXRvci4gKi8KKwkJCWRzKys7CisJCQlpZiAoIXNsb3RzKSB7CisJCQkJLyogRklYTUUvVE9ETzogV2UgbmVlZCB0byBoYXZlIHRoZSBleHRyYQorCQkJCSAqIG1lbW9yeSBhbHJlYWR5ISAoQUlBKSAqLworCQkJCWRybCA9IG50ZnNfcmxfcmVhbGxvYyhkcmwsIGRzLCBkcyArIDEpOworCQkJCWlmICghZHJsKQorCQkJCQlnb3RvIGNyaXRpY2FsX2Vycm9yOworCQkJfQorCQkJZHJsW2RzXS52Y24gPSBtYXJrZXJfdmNuOworCQkJZHJsW2RzXS5sY24gPSBMQ05fRU5PRU5UOworCQkJZHJsW2RzXS5sZW5ndGggPSAoczY0KTA7CisJCX0KKwl9CisJfQorCitmaW5pc2hlZDoKKwkvKiBUaGUgbWVyZ2Ugd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICovCisJbnRmc19kZWJ1ZygiTWVyZ2VkIHJ1bmxpc3Q6Iik7CisJbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QoZHJsKTsKKwlyZXR1cm4gZHJsOworCitjcml0aWNhbF9lcnJvcjoKKwkvKiBDcml0aWNhbCBlcnJvciEgV2UgY2Fubm90IGFmZm9yZCB0byBmYWlsIGhlcmUuICovCisJbnRmc19lcnJvcihOVUxMLCAiQ3JpdGljYWwgZXJyb3IhIE5vdCBlbm91Z2ggbWVtb3J5LiIpOworCXBhbmljKCJOVEZTOiBDYW5ub3QgY29udGludWUuIik7Cit9CisKKy8qKgorICogbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MgLSBjb252ZXJ0IG1hcHBpbmcgcGFpcnMgYXJyYXkgdG8gcnVubGlzdAorICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdGhlIGF0dHJpYnV0ZSByZXNpZGVzCisgKiBAYXR0cjoJYXR0cmlidXRlIHJlY29yZCB3aG9zZSBtYXBwaW5nIHBhaXJzIGFycmF5IHRvIGRlY29tcHJlc3MKKyAqIEBvbGRfcmw6CW9wdGlvbmFsIHJ1bmxpc3QgaW4gd2hpY2ggdG8gaW5zZXJ0IEBhdHRyJ3MgcnVubGlzdAorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAb2xkX3JsLgorICoKKyAqIERlY29tcHJlc3MgdGhlIGF0dHJpYnV0ZSBAYXR0cidzIG1hcHBpbmcgcGFpcnMgYXJyYXkgaW50byBhIHJ1bmxpc3QuIE9uCisgKiBzdWNjZXNzLCByZXR1cm4gdGhlIGRlY29tcHJlc3NlZCBydW5saXN0LgorICoKKyAqIElmIEBvbGRfcmwgaXMgbm90IE5VTEwsIGRlY29tcHJlc3NlZCBydW5saXN0IGlzIGluc2VydGVkIGludG8gdGhlCisgKiBhcHByb3ByaWF0ZSBwbGFjZSBpbiBAb2xkX3JsIGFuZCB0aGUgcmVzdWx0YW50LCBjb21iaW5lZCBydW5saXN0IGlzCisgKiByZXR1cm5lZC4gVGhlIG9yaWdpbmFsIEBvbGRfcmwgaXMgZGVhbGxvY2F0ZWQuCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEBvbGRfcmwgaXMgbGVmdCB1bm1vZGlmaWVkIGluIHRoYXQgY2FzZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlPCS0gQ29ycnVwdCBydW5saXN0LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqCS1FUkFOR0UJLSBUaGUgdHdvIHJ1bmxpc3RzIG92ZXJsYXAuCisgKgorICogRklYTUU6IEZvciBub3cgd2UgdGFrZSB0aGUgY29uY2VwdGlvbmFsbHkgc2ltcGxlc3QgYXBwcm9hY2ggb2YgY3JlYXRpbmcgdGhlCisgKiBuZXcgcnVubGlzdCBkaXNyZWdhcmRpbmcgdGhlIGFscmVhZHkgZXhpc3Rpbmcgb25lIGFuZCB0aGVuIHNwbGljaW5nIHRoZQorICogdHdvIGludG8gb25lLCBpZiB0aGF0IGlzIHBvc3NpYmxlICh3ZSBjaGVjayBmb3Igb3ZlcmxhcCBhbmQgZGlzY2FyZCB0aGUgbmV3CisgKiBydW5saXN0IGlmIG92ZXJsYXAgcHJlc2VudCBiZWZvcmUgcmV0dXJuaW5nIEVSUl9QVFIoLUVSQU5HRSkpLgorICovCitydW5saXN0X2VsZW1lbnQgKm50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IEFUVFJfUkVDT1JEICphdHRyLCBydW5saXN0X2VsZW1lbnQgKm9sZF9ybCkKK3sKKwlWQ04gdmNuOwkJLyogQ3VycmVudCB2Y24uICovCisJTENOIGxjbjsJCS8qIEN1cnJlbnQgbGNuLiAqLworCXM2NCBkZWx0YXhjbjsJCS8qIENoYW5nZSBpbiBbdmxdY24uICovCisJcnVubGlzdF9lbGVtZW50ICpybDsJLyogVGhlIG91dHB1dCBydW5saXN0LiAqLworCXU4ICpidWY7CQkvKiBDdXJyZW50IHBvc2l0aW9uIGluIG1hcHBpbmcgcGFpcnMgYXJyYXkuICovCisJdTggKmF0dHJfZW5kOwkJLyogRW5kIG9mIGF0dHJpYnV0ZS4gKi8KKwlpbnQgcmxzaXplOwkJLyogU2l6ZSBvZiBydW5saXN0IGJ1ZmZlci4gKi8KKwl1MTYgcmxwb3M7CQkvKiBDdXJyZW50IHJ1bmxpc3QgcG9zaXRpb24gaW4gdW5pdHMgb2YKKwkJCQkgICBydW5saXN0X2VsZW1lbnRzLiAqLworCXU4IGI7CQkJLyogQ3VycmVudCBieXRlIG9mZnNldCBpbiBidWYuICovCisKKyNpZmRlZiBERUJVRworCS8qIE1ha2Ugc3VyZSBhdHRyIGV4aXN0cyBhbmQgaXMgbm9uLXJlc2lkZW50LiAqLworCWlmICghYXR0ciB8fCAhYXR0ci0+bm9uX3Jlc2lkZW50IHx8IHNsZTY0X3RvX2NwdSgKKwkJCWF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIDwgKFZDTikwKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgYXJndW1lbnRzLiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisjZW5kaWYKKwkvKiBTdGFydCBhdCB2Y24gPSBsb3dlc3RfdmNuIGFuZCBsY24gMC4gKi8KKwl2Y24gPSBzbGU2NF90b19jcHUoYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3Zjbik7CisJbGNuID0gMDsKKwkvKiBHZXQgc3RhcnQgb2YgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuICovCisJYnVmID0gKHU4KilhdHRyICsgbGUxNl90b19jcHUoCisJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCk7CisJYXR0cl9lbmQgPSAodTgqKWF0dHIgKyBsZTMyX3RvX2NwdShhdHRyLT5sZW5ndGgpOworCWlmICh1bmxpa2VseShidWYgPCAodTgqKWF0dHIgfHwgYnVmID4gYXR0cl9lbmQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisJLyogQ3VycmVudCBwb3NpdGlvbiBpbiBydW5saXN0IGFycmF5LiAqLworCXJscG9zID0gMDsKKwkvKiBBbGxvY2F0ZSBmaXJzdCBwYWdlIGFuZCBzZXQgY3VycmVudCBydW5saXN0IHNpemUgdG8gb25lIHBhZ2UuICovCisJcmwgPSBudGZzX21hbGxvY19ub2ZzKHJsc2l6ZSA9IFBBR0VfU0laRSk7CisJaWYgKHVubGlrZWx5KCFybCkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCS8qIEluc2VydCB1bm1hcHBlZCBzdGFydGluZyBlbGVtZW50IGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAodmNuKSB7CisJCXJsLT52Y24gPSAwOworCQlybC0+bGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCXJsLT5sZW5ndGggPSB2Y247CisJCXJscG9zKys7CisJfQorCXdoaWxlIChidWYgPCBhdHRyX2VuZCAmJiAqYnVmKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIG1vcmUgbWVtb3J5IGlmIG5lZWRlZCwgaW5jbHVkaW5nIHNwYWNlIGZvciB0aGUKKwkJICogbm90LW1hcHBlZCBhbmQgdGVybWluYXRvciBlbGVtZW50cy4gbnRmc19tYWxsb2Nfbm9mcygpCisJCSAqIG9wZXJhdGVzIG9uIHdob2xlIHBhZ2VzIG9ubHkuCisJCSAqLworCQlpZiAoKChybHBvcyArIDMpICogc2l6ZW9mKCpvbGRfcmwpKSA+IHJsc2l6ZSkgeworCQkJcnVubGlzdF9lbGVtZW50ICpybDI7CisKKwkJCXJsMiA9IG50ZnNfbWFsbG9jX25vZnMocmxzaXplICsgKGludClQQUdFX1NJWkUpOworCQkJaWYgKHVubGlrZWx5KCFybDIpKSB7CisJCQkJbnRmc19mcmVlKHJsKTsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJCX0KKwkJCW1lbWNweShybDIsIHJsLCBybHNpemUpOworCQkJbnRmc19mcmVlKHJsKTsKKwkJCXJsID0gcmwyOworCQkJcmxzaXplICs9IFBBR0VfU0laRTsKKwkJfQorCQkvKiBFbnRlciB0aGUgY3VycmVudCB2Y24gaW50byB0aGUgY3VycmVudCBydW5saXN0IGVsZW1lbnQuICovCisJCXJsW3JscG9zXS52Y24gPSB2Y247CisJCS8qCisJCSAqIEdldCB0aGUgY2hhbmdlIGluIHZjbiwgaS5lLiB0aGUgcnVuIGxlbmd0aCBpbiBjbHVzdGVycy4KKwkJICogRG9pbmcgaXQgdGhpcyB3YXkgZW5zdXJlcyB0aGF0IHdlIHNpZ25leHRlbmQgbmVnYXRpdmUgdmFsdWVzLgorCQkgKiBBIG5lZ2F0aXZlIHJ1biBsZW5ndGggZG9lc24ndCBtYWtlIGFueSBzZW5zZSwgYnV0IGhleSwgSQorCQkgKiBkaWRuJ3QgbWFrZSB1cCB0aGUgTlRGUyBzcGVjcyBhbmQgV2luZG93cyBOVDQgdHJlYXRzIHRoZSBydW4KKwkJICogbGVuZ3RoIGFzIGEgc2lnbmVkIHZhbHVlIHNvIHRoYXQncyBob3cgaXQgaXMuLi4KKwkJICovCisJCWIgPSAqYnVmICYgMHhmOworCQlpZiAoYikgeworCQkJaWYgKHVubGlrZWx5KGJ1ZiArIGIgPiBhdHRyX2VuZCkpCisJCQkJZ290byBpb19lcnJvcjsKKwkJCWZvciAoZGVsdGF4Y24gPSAoczgpYnVmW2ItLV07IGI7IGItLSkKKwkJCQlkZWx0YXhjbiA9IChkZWx0YXhjbiA8PCA4KSArIGJ1ZltiXTsKKwkJfSBlbHNlIHsgLyogVGhlIGxlbmd0aCBlbnRyeSBpcyBjb21wdWxzb3J5LiAqLworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWlzc2luZyBsZW5ndGggZW50cnkgaW4gbWFwcGluZyAiCisJCQkJCSJwYWlycyBhcnJheS4iKTsKKwkJCWRlbHRheGNuID0gKHM2NCktMTsKKwkJfQorCQkvKgorCQkgKiBBc3N1bWUgYSBuZWdhdGl2ZSBsZW5ndGggdG8gaW5kaWNhdGUgZGF0YSBjb3JydXB0aW9uIGFuZAorCQkgKiBoZW5jZSBjbGVhbi11cCBhbmQgcmV0dXJuIE5VTEwuCisJCSAqLworCQlpZiAodW5saWtlbHkoZGVsdGF4Y24gPCAwKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCBsZW5ndGggaW4gbWFwcGluZyBwYWlycyAiCisJCQkJCSJhcnJheS4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBFbnRlciB0aGUgY3VycmVudCBydW4gbGVuZ3RoIGludG8gdGhlIGN1cnJlbnQgcnVubGlzdAorCQkgKiBlbGVtZW50LgorCQkgKi8KKwkJcmxbcmxwb3NdLmxlbmd0aCA9IGRlbHRheGNuOworCQkvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgdmNuIGJ5IHRoZSBjdXJyZW50IHJ1biBsZW5ndGguICovCisJCXZjbiArPSBkZWx0YXhjbjsKKwkJLyoKKwkJICogVGhlcmUgbWlnaHQgYmUgbm8gbGNuIGNoYW5nZSBhdCBhbGwsIGFzIGlzIHRoZSBjYXNlIGZvcgorCQkgKiBzcGFyc2UgY2x1c3RlcnMgb24gTlRGUyAzLjArLCBpbiB3aGljaCBjYXNlIHdlIHNldCB0aGUgbGNuCisJCSAqIHRvIExDTl9IT0xFLgorCQkgKi8KKwkJaWYgKCEoKmJ1ZiAmIDB4ZjApKQorCQkJcmxbcmxwb3NdLmxjbiA9IExDTl9IT0xFOworCQllbHNlIHsKKwkJCS8qIEdldCB0aGUgbGNuIGNoYW5nZSB3aGljaCByZWFsbHkgY2FuIGJlIG5lZ2F0aXZlLiAqLworCQkJdTggYjIgPSAqYnVmICYgMHhmOworCQkJYiA9IGIyICsgKCgqYnVmID4+IDQpICYgMHhmKTsKKwkJCWlmIChidWYgKyBiID4gYXR0cl9lbmQpCisJCQkJZ290byBpb19lcnJvcjsKKwkJCWZvciAoZGVsdGF4Y24gPSAoczgpYnVmW2ItLV07IGIgPiBiMjsgYi0tKQorCQkJCWRlbHRheGNuID0gKGRlbHRheGNuIDw8IDgpICsgYnVmW2JdOworCQkJLyogQ2hhbmdlIHRoZSBjdXJyZW50IGxjbiB0byBpdHMgbmV3IHZhbHVlLiAqLworCQkJbGNuICs9IGRlbHRheGNuOworI2lmZGVmIERFQlVHCisJCQkvKgorCQkJICogT24gTlRGUyAxLjItLCBhcHBhcmVudGx5IGNhbiBoYXZlIGxjbiA9PSAtMSB0bworCQkJICogaW5kaWNhdGUgYSBob2xlLiBCdXQgd2UgaGF2ZW4ndCB2ZXJpZmllZCBvdXJzZWx2ZXMKKwkJCSAqIHdoZXRoZXIgaXQgaXMgcmVhbGx5IHRoZSBsY24gb3IgdGhlIGRlbHRheGNuIHRoYXQgaXMKKwkJCSAqIC0xLiBTbyBpZiBlaXRoZXIgaXMgZm91bmQgZ2l2ZSB1cyBhIG1lc3NhZ2Ugc28gd2UKKwkJCSAqIGNhbiBpbnZlc3RpZ2F0ZSBpdCBmdXJ0aGVyIQorCQkJICovCisJCQlpZiAodm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQkJaWYgKHVubGlrZWx5KGRlbHRheGNuID09IChMQ04pLTEpKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJsY24gZGVsdGEgPT0gLTEiKTsKKwkJCQlpZiAodW5saWtlbHkobGNuID09IChMQ04pLTEpKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJsY24gPT0gLTEiKTsKKwkJCX0KKyNlbmRpZgorCQkJLyogQ2hlY2sgbGNuIGlzIG5vdCBiZWxvdyAtMS4gKi8KKwkJCWlmICh1bmxpa2VseShsY24gPCAoTENOKS0xKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgTENOIDwgLTEgaW4gIgorCQkJCQkJIm1hcHBpbmcgcGFpcnMgYXJyYXkuIik7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJLyogRW50ZXIgdGhlIGN1cnJlbnQgbGNuIGludG8gdGhlIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJCXJsW3JscG9zXS5sY24gPSBsY247CisJCX0KKwkJLyogR2V0IHRvIHRoZSBuZXh0IHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJcmxwb3MrKzsKKwkJLyogSW5jcmVtZW50IHRoZSBidWZmZXIgcG9zaXRpb24gdG8gdGhlIG5leHQgbWFwcGluZyBwYWlyLiAqLworCQlidWYgKz0gKCpidWYgJiAweGYpICsgKCgqYnVmID4+IDQpICYgMHhmKSArIDE7CisJfQorCWlmICh1bmxpa2VseShidWYgPj0gYXR0cl9lbmQpKQorCQlnb3RvIGlvX2Vycm9yOworCS8qCisJICogSWYgdGhlcmUgaXMgYSBoaWdoZXN0X3ZjbiBzcGVjaWZpZWQsIGl0IG11c3QgYmUgZXF1YWwgdG8gdGhlIGZpbmFsCisJICogdmNuIGluIHRoZSBydW5saXN0IC0gMSwgb3Igc29tZXRoaW5nIGhhcyBnb25lIGJhZGx5IHdyb25nLgorCSAqLworCWRlbHRheGNuID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKTsKKwlpZiAodW5saWtlbHkoZGVsdGF4Y24gJiYgdmNuIC0gMSAhPSBkZWx0YXhjbikpIHsKK21wYV9lcnI6CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgbWFwcGluZyBwYWlycyBhcnJheSBpbiAiCisJCQkJIm5vbi1yZXNpZGVudCBhdHRyaWJ1dGUuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogU2V0dXAgbm90IG1hcHBlZCBydW5saXN0IGVsZW1lbnQgaWYgdGhpcyBpcyB0aGUgYmFzZSBleHRlbnQuICovCisJaWYgKCFhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCVZDTiBtYXhfY2x1c3RlcjsKKworCQltYXhfY2x1c3RlciA9IChzbGU2NF90b19jcHUoCisJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpICsKKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpID4+CisJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hlc3RfdmNuIGFuZCB0aGUKKwkJICogaGlnaGVzdCBjbHVzdGVyLCB0aGUgcnVubGlzdCBpcyBlaXRoZXIgY29ycnVwdCBvciwgbW9yZQorCQkgKiBsaWtlbHksIHRoZXJlIGFyZSBtb3JlIGV4dGVudHMgZm9sbG93aW5nIHRoaXMgb25lLgorCQkgKi8KKwkJaWYgKGRlbHRheGNuIDwgLS1tYXhfY2x1c3RlcikgeworCQkJbnRmc19kZWJ1ZygiTW9yZSBleHRlbnRzIHRvIGZvbGxvdzsgZGVsdGF4Y24gPSAweCVsbHgsICIKKwkJCQkJIm1heF9jbHVzdGVyID0gMHglbGx4IiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZWx0YXhjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfY2x1c3Rlcik7CisJCQlybFtybHBvc10udmNuID0gdmNuOworCQkJdmNuICs9IHJsW3JscG9zXS5sZW5ndGggPSBtYXhfY2x1c3RlciAtIGRlbHRheGNuOworCQkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJcmxwb3MrKzsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShkZWx0YXhjbiA+IG1heF9jbHVzdGVyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ29ycnVwdCBhdHRyaWJ1dGUuIGRlbHRheGNuID0gIgorCQkJCQkiMHglbGx4LCBtYXhfY2x1c3RlciA9IDB4JWxseCIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGF4Y24sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2NsdXN0ZXIpOworCQkJZ290byBtcGFfZXJyOworCQl9CisJCXJsW3JscG9zXS5sY24gPSBMQ05fRU5PRU5UOworCX0gZWxzZSAvKiBOb3QgdGhlIGJhc2UgZXh0ZW50LiBUaGVyZSBtYXkgYmUgbW9yZSBleHRlbnRzIHRvIGZvbGxvdy4gKi8KKwkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCisJLyogU2V0dXAgdGVybWluYXRpbmcgcnVubGlzdCBlbGVtZW50LiAqLworCXJsW3JscG9zXS52Y24gPSB2Y247CisJcmxbcmxwb3NdLmxlbmd0aCA9IChzNjQpMDsKKwkvKiBJZiBubyBleGlzdGluZyBydW5saXN0IHdhcyBzcGVjaWZpZWQsIHdlIGFyZSBkb25lLiAqLworCWlmICghb2xkX3JsKSB7CisJCW50ZnNfZGVidWcoIk1hcHBpbmcgcGFpcnMgYXJyYXkgc3VjY2Vzc2Z1bGx5IGRlY29tcHJlc3NlZDoiKTsKKwkJbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QocmwpOworCQlyZXR1cm4gcmw7CisJfQorCS8qIE5vdyBjb21iaW5lIHRoZSBuZXcgYW5kIG9sZCBydW5saXN0cyBjaGVja2luZyBmb3Igb3ZlcmxhcHMuICovCisJb2xkX3JsID0gbnRmc19ydW5saXN0c19tZXJnZShvbGRfcmwsIHJsKTsKKwlpZiAobGlrZWx5KCFJU19FUlIob2xkX3JsKSkpCisJCXJldHVybiBvbGRfcmw7CisJbnRmc19mcmVlKHJsKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWVyZ2UgcnVubGlzdHMuIik7CisJcmV0dXJuIG9sZF9ybDsKK2lvX2Vycm9yOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiIpOworZXJyX291dDoKKwludGZzX2ZyZWUocmwpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCisvKioKKyAqIG50ZnNfcmxfdmNuX3RvX2xjbiAtIGNvbnZlcnQgYSB2Y24gaW50byBhIGxjbiBnaXZlbiBhIHJ1bmxpc3QKKyAqIEBybDoJCXJ1bmxpc3QgdG8gdXNlIGZvciBjb252ZXJzaW9uCisgKiBAdmNuOgl2Y24gdG8gY29udmVydAorICoKKyAqIENvbnZlcnQgdGhlIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgQHZjbiBvZiBhbiBhdHRyaWJ1dGUgaW50byBhIGxvZ2ljYWwKKyAqIGNsdXN0ZXIgbnVtYmVyIChsY24pIG9mIGEgZGV2aWNlIHVzaW5nIHRoZSBydW5saXN0IEBybCB0byBtYXAgdmNucyB0byB0aGVpcgorICogY29ycmVzcG9uZGluZyBsY25zLgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAcmwuCisgKgorICogU2luY2UgbGNucyBtdXN0IGJlID49IDAsIHdlIHVzZSBuZWdhdGl2ZSByZXR1cm4gdmFsdWVzIHdpdGggc3BlY2lhbCBtZWFuaW5nOgorICoKKyAqIFJldHVybiB2YWx1ZQkJCU1lYW5pbmcgLyBEZXNjcmlwdGlvbgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAtMSA9IExDTl9IT0xFCQlIb2xlIC8gbm90IGFsbG9jYXRlZCBvbiBkaXNrLgorICogIC0yID0gTENOX1JMX05PVF9NQVBQRUQJVGhpcyBpcyBwYXJ0IG9mIHRoZSBydW5saXN0IHdoaWNoIGhhcyBub3QgYmVlbgorICoJCQkJaW5zZXJ0ZWQgaW50byB0aGUgcnVubGlzdCB5ZXQuCisgKiAgLTMgPSBMQ05fRU5PRU5UCQlUaGVyZSBpcyBubyBzdWNoIHZjbiBpbiB0aGUgYXR0cmlidXRlLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIHRoZSBydW5saXN0IChmb3IgcmVhZGluZyBvciB3cml0aW5nKS4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdG91Y2ggdGhlIGxvY2suCisgKi8KK0xDTiBudGZzX3JsX3Zjbl90b19sY24oY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHZjbikKK3sKKwlpbnQgaTsKKworCUJVR19PTih2Y24gPCAwKTsKKwkvKgorCSAqIElmIHJsIGlzIE5VTEwsIGFzc3VtZSB0aGF0IHdlIGhhdmUgZm91bmQgYW4gdW5tYXBwZWQgcnVubGlzdC4gVGhlCisJICogY2FsbGVyIGNhbiB0aGVuIGF0dGVtcHQgdG8gbWFwIGl0IGFuZCBmYWlsIGFwcHJvcHJpYXRlbHkgaWYKKwkgKiBuZWNlc3NhcnkuCisJICovCisJaWYgKHVubGlrZWx5KCFybCkpCisJCXJldHVybiBMQ05fUkxfTk9UX01BUFBFRDsKKworCS8qIENhdGNoIG91dCBvZiBsb3dlciBib3VuZHMgdmNuLiAqLworCWlmICh1bmxpa2VseSh2Y24gPCBybFswXS52Y24pKQorCQlyZXR1cm4gTENOX0VOT0VOVDsKKworCWZvciAoaSA9IDA7IGxpa2VseShybFtpXS5sZW5ndGgpOyBpKyspIHsKKwkJaWYgKHVubGlrZWx5KHZjbiA8IHJsW2krMV0udmNuKSkgeworCQkJaWYgKGxpa2VseShybFtpXS5sY24gPj0gKExDTikwKSkKKwkJCQlyZXR1cm4gcmxbaV0ubGNuICsgKHZjbiAtIHJsW2ldLnZjbik7CisJCQlyZXR1cm4gcmxbaV0ubGNuOworCQl9CisJfQorCS8qCisJICogVGhlIHRlcm1pbmF0b3IgZWxlbWVudCBpcyBzZXR1cCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgaS5lLiBvbmUgb2YKKwkgKiBMQ05fSE9MRSwgTENOX1JMX05PVF9NQVBQRUQsIG9yIExDTl9FTk9FTlQuCisJICovCisJaWYgKGxpa2VseShybFtpXS5sY24gPCAoTENOKTApKQorCQlyZXR1cm4gcmxbaV0ubGNuOworCS8qIEp1c3QgaW4gY2FzZS4uLiBXZSBjb3VsZCByZXBsYWNlIHRoaXMgd2l0aCBCVUcoKSBzb21lIGRheS4gKi8KKwlyZXR1cm4gTENOX0VOT0VOVDsKK30KKworLyoqCisgKiBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyAtIGdldCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGEgbnVtYmVyCisgKiBAbjoJCW51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgQG4gdW5hbWJpZ3VvdXNseSBhcworICogYSBzaWduZWQgbnVtYmVyLgorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbWFwcGluZyBwYWlycyBhcnJheSB0byBkZXRlcm1pbmUgaG93CisgKiBtYW55IGJ5dGVzIHdpbGwgYmUgbmVlZGVkIGluIHRoZSBhcnJheSB0byBzdG9yZSBhIGdpdmVuIGxvZ2ljYWwgY2x1c3RlcgorICogbnVtYmVyIChsY24pIG9yIGEgc3BlY2lmaWMgcnVuIGxlbmd0aC4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMoY29uc3QgczY0IG4pCit7CisJczY0IGwgPSBuOworCWludCBpOworCXM4IGo7CisKKwlpID0gMDsKKwlkbyB7CisJCWwgPj49IDg7CisJCWkrKzsKKwl9IHdoaWxlIChsICE9IDAgJiYgbCAhPSAtMSk7CisJaiA9IChuID4+IDggKiAoaSAtIDEpKSAmIDB4ZmY7CisJLyogSWYgdGhlIHNpZ24gYml0IGlzIHdyb25nLCB3ZSBuZWVkIGFuIGV4dHJhIGJ5dGUuICovCisJaWYgKChuIDwgMCAmJiBqID49IDApIHx8IChuID4gMCAmJiBqIDwgMCkpCisJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzIC0gZ2V0IGJ5dGVzIG5lZWRlZCBmb3IgbWFwcGluZyBwYWlycyBhcnJheQorICogQHZvbDoJbnRmcyB2b2x1bWUgKG5lZWRlZCBmb3IgdGhlIG50ZnMgdmVyc2lvbikKKyAqIEBybDoJCWxvY2tlZCBydW5saXN0IHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgbWFwcGluZyBwYWlycyBvZgorICogQHN0YXJ0X3ZjbjoJdmNuIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKgorICogV2FsayB0aGUgbG9ja2VkIHJ1bmxpc3QgQHJsIGFuZCBjYWxjdWxhdGUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1hcHBpbmcKKyAqIHBhaXJzIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bmxpc3QgQHJsLCBzdGFydGluZyBhdCB2Y24gQHN0YXJ0X3Zjbi4KKyAqIFRoaXMgZm9yIGV4YW1wbGUgYWxsb3dzIHVzIHRvIGFsbG9jYXRlIGEgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplIHdoZW4KKyAqIGJ1aWxkaW5nIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LgorICoKKyAqIElmIEBybCBpcyBOVUxMLCBqdXN0IHJldHVybiAxIChmb3IgdGhlIHNpbmdsZSB0ZXJtaW5hdG9yIGJ5dGUpLgorICoKKyAqIFJldHVybiB0aGUgY2FsY3VsYXRlZCBzaXplIGluIGJ5dGVzIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4KKyAqIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRUlOVkFMCS0gUnVuIGxpc3QgY29udGFpbnMgdW5tYXBwZWQgZWxlbWVudHMuICBNYWtlIHN1cmUgdG8gb25seSBwYXNzCisgKgkJICBmdWxseSBtYXBwZWQgcnVubGlzdHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCS1FSU8JLSBUaGUgcnVubGlzdCBpcyBjb3JydXB0LgorICoKKyAqIExvY2tpbmc6IEBybCBtdXN0IGJlIGxvY2tlZCBvbiBlbnRyeSAoZWl0aGVyIGZvciByZWFkaW5nIG9yIHdyaXRpbmcpLCBpdAorICoJICAgIHJlbWFpbnMgbG9ja2VkIHRocm91Z2hvdXQsIGFuZCBpcyBsZWZ0IGxvY2tlZCB1cG9uIHJldHVybi4KKyAqLworaW50IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHN0YXJ0X3ZjbikKK3sKKwlMQ04gcHJldl9sY247CisJaW50IHJsczsKKworCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlpZiAoIXJsKSB7CisJCUJVR19PTihzdGFydF92Y24pOworCQlyZXR1cm4gMTsKKwl9CisJLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAc3RhcnRfdmNuLiAqLworCXdoaWxlIChybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+PSBybFsxXS52Y24pCisJCXJsKys7CisJaWYgKCghcmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPiBybC0+dmNuKSB8fCBzdGFydF92Y24gPCBybC0+dmNuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcmV2X2xjbiA9IDA7CisJLyogQWx3YXlzIG5lZWQgdGhlIHRlcm1pbmluZyB6ZXJvIGJ5dGUuICovCisJcmxzID0gMTsKKwkvKiBEbyB0aGUgZmlyc3QgcGFydGlhbCBydW4gaWYgcHJlc2VudC4gKi8KKwlpZiAoc3RhcnRfdmNuID4gcmwtPnZjbikgeworCQlzNjQgZGVsdGE7CisKKwkJLyogV2Uga25vdyBybC0+bGVuZ3RoICE9IDAgYWxyZWFkeS4gKi8KKwkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJCWdvdG8gZXJyX291dDsKKwkJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCQkvKiBIZWFkZXIgYnl0ZSArIGxlbmd0aC4gKi8KKwkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGVuZ3RoIC0gZGVsdGEpOworCQkvKgorCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKKwkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKKwkJICogemVybyBzcGFjZS4gIE9uIGVhcmxpZXIgTlRGUyB2ZXJzaW9ucyB3ZSBqdXN0IHN0b3JlIHRoZSBsY24uCisJCSAqIE5vdGU6IHRoaXMgYXNzdW1lcyB0aGF0IG9uIE5URlMgMS4yLSwgaG9sZXMgYXJlIHN0b3JlZCB3aXRoCisJCSAqIGFuIGxjbiBvZiAtMSBhbmQgbm90IGEgZGVsdGFfbGNuIG9mIC0xICh1bmxlc3MgYm90aCBhcmUgLTEpLgorCQkgKi8KKwkJaWYgKHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpIHsKKwkJCXByZXZfbGNuID0gcmwtPmxjbjsKKwkJCWlmIChybC0+bGNuID49IDApCisJCQkJcHJldl9sY24gKz0gZGVsdGE7CisJCQkvKiBDaGFuZ2UgaW4gbGNuLiAqLworCQkJcmxzICs9IG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHByZXZfbGNuKTsKKwkJfQorCQkvKiBHbyB0byBuZXh0IHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJcmwrKzsKKwl9CisJLyogRG8gdGhlIGZ1bGwgcnVucy4gKi8KKwlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgeworCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBIZWFkZXIgYnl0ZSArIGxlbmd0aC4gKi8KKwkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGVuZ3RoKTsKKwkJLyoKKwkJICogSWYgdGhlIGxvZ2ljYWwgY2x1c3RlciBudW1iZXIgKGxjbikgZGVub3RlcyBhIGhvbGUgYW5kIHdlCisJCSAqIGFyZSBvbiBOVEZTIDMuMCssIHdlIGRvbid0IHN0b3JlIGl0IGF0IGFsbCwgaS5lLiB3ZSBuZWVkCisJCSAqIHplcm8gc3BhY2UuICBPbiBlYXJsaWVyIE5URlMgdmVyc2lvbnMgd2UganVzdCBzdG9yZSB0aGUgbGNuLgorCQkgKiBOb3RlOiB0aGlzIGFzc3VtZXMgdGhhdCBvbiBOVEZTIDEuMi0sIGhvbGVzIGFyZSBzdG9yZWQgd2l0aAorCQkgKiBhbiBsY24gb2YgLTEgYW5kIG5vdCBhIGRlbHRhX2xjbiBvZiAtMSAodW5sZXNzIGJvdGggYXJlIC0xKS4KKwkJICovCisJCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQkvKiBDaGFuZ2UgaW4gbGNuLiAqLworCQkJcmxzICs9IG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHJsLT5sY24gLQorCQkJCQlwcmV2X2xjbik7CisJCQlwcmV2X2xjbiA9IHJsLT5sY247CisJCX0KKwl9CisJcmV0dXJuIHJsczsKK2Vycl9vdXQ6CisJaWYgKHJsLT5sY24gPT0gTENOX1JMX05PVF9NQVBQRUQpCisJCXJscyA9IC1FSU5WQUw7CisJZWxzZQorCQlybHMgPSAtRUlPOworCXJldHVybiBybHM7Cit9CisKKy8qKgorICogbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyAtIHdyaXRlIHRoZSBzaWduaWZpY2FudCBieXRlcyBvZiBhIG51bWJlcgorICogQGRzdDoJZGVzdGluYXRpb24gYnVmZmVyIHRvIHdyaXRlIHRvCisgKiBAZHN0X21heDoJcG9pbnRlciB0byBsYXN0IGJ5dGUgb2YgZGVzdGluYXRpb24gYnVmZmVyIGZvciBib3VuZHMgY2hlY2tpbmcKKyAqIEBuOgkJbnVtYmVyIHdob3NlIHNpZ25pZmljYW50IGJ5dGVzIHRvIHdyaXRlCisgKgorICogU3RvcmUgaW4gQGRzdCwgdGhlIG1pbmltdW0gYnl0ZXMgb2YgdGhlIG51bWJlciBAbiB3aGljaCBhcmUgcmVxdWlyZWQgdG8KKyAqIGlkZW50aWZ5IEBuIHVuYW1iaWd1b3VzbHkgYXMgYSBzaWduZWQgbnVtYmVyLCB0YWtpbmcgY2FyZSBub3QgdG8gZXhjZWVkCisgKiBAZGVzdF9tYXgsIHRoZSBtYXhpbXVtIHBvc2l0aW9uIHdpdGhpbiBAZHN0IHRvIHdoaWNoIHdlIGFyZSBhbGxvd2VkIHRvCisgKiB3cml0ZS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBvZiBhIHJ1bmxpc3QgdG8gY29tcHJlc3MKKyAqIGEgZ2l2ZW4gbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBvciBhIHNwZWNpZmljIHJ1biBsZW5ndGggdG8gdGhlIG1pbnVtdW0KKyAqIHNpemUgcG9zc2libGUuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvbiBzdWNjZXNzLiAgT24gZXJyb3IsIGkuZS4gdGhlCisgKiBkZXN0aW5hdGlvbiBidWZmZXIgQGRzdCBpcyB0b28gc21hbGwsIHJldHVybiAtRU5PU1BDLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKHM4ICpkc3QsIGNvbnN0IHM4ICpkc3RfbWF4LAorCQljb25zdCBzNjQgbikKK3sKKwlzNjQgbCA9IG47CisJaW50IGk7CisJczggajsKKworCWkgPSAwOworCWRvIHsKKwkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCQlnb3RvIGVycl9vdXQ7CisJCSpkc3QrKyA9IGwgJiAweGZmbGw7CisJCWwgPj49IDg7CisJCWkrKzsKKwl9IHdoaWxlIChsICE9IDAgJiYgbCAhPSAtMSk7CisJaiA9IChuID4+IDggKiAoaSAtIDEpKSAmIDB4ZmY7CisJLyogSWYgdGhlIHNpZ24gYml0IGlzIHdyb25nLCB3ZSBuZWVkIGFuIGV4dHJhIGJ5dGUuICovCisJaWYgKG4gPCAwICYmIGogPj0gMCkgeworCQlpZiAoZHN0ID4gZHN0X21heCkKKwkJCWdvdG8gZXJyX291dDsKKwkJaSsrOworCQkqZHN0ID0gKHM4KS0xOworCX0gZWxzZSBpZiAobiA+IDAgJiYgaiA8IDApIHsKKwkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCQlnb3RvIGVycl9vdXQ7CisJCWkrKzsKKwkJKmRzdCA9IChzOCkwOworCX0KKwlyZXR1cm4gaTsKK2Vycl9vdXQ6CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKy8qKgorICogbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkIC0gYnVpbGQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgZnJvbSBhIHJ1bmxpc3QKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIChuZWVkZWQgZm9yIHRoZSBudGZzIHZlcnNpb24pCisgKiBAZHN0OglkZXN0aW5hdGlvbiBidWZmZXIgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBkc3RfbGVuOglzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciBAZHN0IGluIGJ5dGVzCisgKiBAcmw6CQlsb2NrZWQgcnVubGlzdCBmb3Igd2hpY2ggdG8gYnVpbGQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBzdGFydF92Y246CXZjbiBhdCB3aGljaCB0byBzdGFydCB0aGUgbWFwcGluZyBwYWlycyBhcnJheQorICogQHN0b3BfdmNuOglmaXJzdCB2Y24gb3V0c2lkZSBkZXN0aW5hdGlvbiBidWZmZXIgb24gc3VjY2VzcyBvciAtRU5PU1BDCisgKgorICogQ3JlYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGZyb20gdGhlIGxvY2tlZCBydW5saXN0IEBybCwgc3RhcnRpbmcgYXQgdmNuCisgKiBAc3RhcnRfdmNuIGFuZCBzYXZlIHRoZSBhcnJheSBpbiBAZHN0LiAgQGRzdF9sZW4gaXMgdGhlIHNpemUgb2YgQGRzdCBpbgorICogYnl0ZXMgYW5kIGl0IHNob3VsZCBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUgdmFsdWUgb2J0YWluZWQgYnkgY2FsbGluZworICogbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpLgorICoKKyAqIElmIEBybCBpcyBOVUxMLCBqdXN0IHdyaXRlIGEgc2luZ2xlIHRlcm1pbmF0b3IgYnl0ZSB0byBAZHN0LgorICoKKyAqIE9uIHN1Y2Nlc3Mgb3IgLUVOT1NQQyBlcnJvciwgaWYgQHN0b3BfdmNuIGlzIG5vdCBOVUxMLCAqQHN0b3BfdmNuIGlzIHNldCB0bworICogdGhlIGZpcnN0IHZjbiBvdXRzaWRlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBOb3RlIHRoYXQgb24gZXJyb3IsIEBkc3QgaGFzCisgKiBiZWVuIGZpbGxlZCB3aXRoIGFsbCB0aGUgbWFwcGluZyBwYWlycyB0aGF0IHdpbGwgZml0LCB0aHVzIGl0IGNhbiBiZSB0cmVhdGVkCisgKiBhcyBwYXJ0aWFsIHN1Y2Nlc3MsIGluIHRoYXQgYSBuZXcgYXR0cmlidXRlIGV4dGVudCBuZWVkcyB0byBiZSBjcmVhdGVkIG9yCisgKiB0aGUgbmV4dCBleHRlbnQgaGFzIHRvIGJlIHVzZWQgYW5kIHRoZSBtYXBwaW5nIHBhaXJzIGJ1aWxkIGhhcyB0byBiZQorICogY29udGludWVkIHdpdGggQHN0YXJ0X3ZjbiBzZXQgdG8gKkBzdG9wX3Zjbi4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZQorICogZGVmaW5lZDoKKyAqCS1FSU5WQUwJLSBSdW4gbGlzdCBjb250YWlucyB1bm1hcHBlZCBlbGVtZW50cy4gIE1ha2Ugc3VyZSB0byBvbmx5IHBhc3MKKyAqCQkgIGZ1bGx5IG1hcHBlZCBydW5saXN0cyB0byB0aGlzIGZ1bmN0aW9uLgorICoJLUVJTwktIFRoZSBydW5saXN0IGlzIGNvcnJ1cHQuCisgKgktRU5PU1BDCS0gVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgKgorICogTG9ja2luZzogQHJsIG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5IChlaXRoZXIgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyksIGl0CisgKgkgICAgcmVtYWlucyBsb2NrZWQgdGhyb3VnaG91dCwgYW5kIGlzIGxlZnQgbG9ja2VkIHVwb24gcmV0dXJuLgorICovCitpbnQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHM4ICpkc3QsCisJCWNvbnN0IGludCBkc3RfbGVuLCBjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLAorCQljb25zdCBWQ04gc3RhcnRfdmNuLCBWQ04gKmNvbnN0IHN0b3BfdmNuKQoreworCUxDTiBwcmV2X2xjbjsKKwlzOCAqZHN0X21heCwgKmRzdF9uZXh0OworCWludCBlcnIgPSAtRU5PU1BDOworCXM4IGxlbl9sZW4sIGxjbl9sZW47CisKKwlCVUdfT04oc3RhcnRfdmNuIDwgMCk7CisJQlVHX09OKGRzdF9sZW4gPCAxKTsKKwlpZiAoIXJsKSB7CisJCUJVR19PTihzdGFydF92Y24pOworCQlpZiAoc3RvcF92Y24pCisJCQkqc3RvcF92Y24gPSAwOworCQkvKiBUZXJtaW5hdG9yIGJ5dGUuICovCisJCSpkc3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAc3RhcnRfdmNuLiAqLworCXdoaWxlIChybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+PSBybFsxXS52Y24pCisJCXJsKys7CisJaWYgKCghcmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPiBybC0+dmNuKSB8fCBzdGFydF92Y24gPCBybC0+dmNuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIEBkc3RfbWF4IGlzIHVzZWQgZm9yIGJvdW5kcyBjaGVja2luZyBpbgorCSAqIG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoKS4KKwkgKi8KKwlkc3RfbWF4ID0gZHN0ICsgZHN0X2xlbiAtIDE7CisJcHJldl9sY24gPSAwOworCS8qIERvIHRoZSBmaXJzdCBwYXJ0aWFsIHJ1biBpZiBwcmVzZW50LiAqLworCWlmIChzdGFydF92Y24gPiBybC0+dmNuKSB7CisJCXM2NCBkZWx0YTsKKworCQkvKiBXZSBrbm93IHJsLT5sZW5ndGggIT0gMCBhbHJlYWR5LiAqLworCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQkJZ290byBlcnJfb3V0OworCQlkZWx0YSA9IHN0YXJ0X3ZjbiAtIHJsLT52Y247CisJCS8qIFdyaXRlIGxlbmd0aC4gKi8KKwkJbGVuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSwgZHN0X21heCwKKwkJCQlybC0+bGVuZ3RoIC0gZGVsdGEpOworCQlpZiAobGVuX2xlbiA8IDApCisJCQlnb3RvIHNpemVfZXJyOworCQkvKgorCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKKwkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKKwkJICogemVybyBzcGFjZS4gIE9uIGVhcmxpZXIgTlRGUyB2ZXJzaW9ucyB3ZSBqdXN0IHdyaXRlIHRoZSBsY24KKwkJICogY2hhbmdlLiAgRklYTUU6IERvIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGxjbiBjaGFuZ2Ugb3IganVzdAorCQkgKiB0aGUgbGNuIGluIHRoYXQgY2FzZT8gIE5vdCBzdXJlIGFzIEkgaGF2ZSBuZXZlciBzZWVuIHRoaXMKKwkJICogY2FzZSBvbiBOVDQuIC0gV2UgYXNzdW1lIHRoYXQgd2UganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBsY24KKwkJICogY2hhbmdlIHVudGlsIHNvbWVvbmUgdGVsbHMgdXMgb3RoZXJ3aXNlLi4uIChBSUEpCisJCSAqLworCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQkJcHJldl9sY24gPSBybC0+bGNuOworCQkJaWYgKHJsLT5sY24gPj0gMCkKKwkJCQlwcmV2X2xjbiArPSBkZWx0YTsKKwkJCS8qIFdyaXRlIGNoYW5nZSBpbiBsY24uICovCisJCQlsY25fbGVuID0gbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhkc3QgKyAxICsKKwkJCQkJbGVuX2xlbiwgZHN0X21heCwgcHJldl9sY24pOworCQkJaWYgKGxjbl9sZW4gPCAwKQorCQkJCWdvdG8gc2l6ZV9lcnI7CisJCX0gZWxzZQorCQkJbGNuX2xlbiA9IDA7CisJCWRzdF9uZXh0ID0gZHN0ICsgbGVuX2xlbiArIGxjbl9sZW4gKyAxOworCQlpZiAoZHN0X25leHQgPiBkc3RfbWF4KQorCQkJZ290byBzaXplX2VycjsKKwkJLyogVXBkYXRlIGhlYWRlciBieXRlLiAqLworCQkqZHN0ID0gbGNuX2xlbiA8PCA0IHwgbGVuX2xlbjsKKwkJLyogUG9zaXRpb24gYXQgbmV4dCBtYXBwaW5nIHBhaXJzIGFycmF5IGVsZW1lbnQuICovCisJCWRzdCA9IGRzdF9uZXh0OworCQkvKiBHbyB0byBuZXh0IHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJcmwrKzsKKwl9CisJLyogRG8gdGhlIGZ1bGwgcnVucy4gKi8KKwlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgeworCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBXcml0ZSBsZW5ndGguICovCisJCWxlbl9sZW4gPSBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKGRzdCArIDEsIGRzdF9tYXgsCisJCQkJcmwtPmxlbmd0aCk7CisJCWlmIChsZW5fbGVuIDwgMCkKKwkJCWdvdG8gc2l6ZV9lcnI7CisJCS8qCisJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQorCQkgKiBhcmUgb24gTlRGUyAzLjArLCB3ZSBkb24ndCBzdG9yZSBpdCBhdCBhbGwsIGkuZS4gd2UgbmVlZAorCQkgKiB6ZXJvIHNwYWNlLiAgT24gZWFybGllciBOVEZTIHZlcnNpb25zIHdlIGp1c3Qgd3JpdGUgdGhlIGxjbgorCQkgKiBjaGFuZ2UuICBGSVhNRTogRG8gd2UgbmVlZCB0byB3cml0ZSB0aGUgbGNuIGNoYW5nZSBvciBqdXN0CisJCSAqIHRoZSBsY24gaW4gdGhhdCBjYXNlPyAgTm90IHN1cmUgYXMgSSBoYXZlIG5ldmVyIHNlZW4gdGhpcworCQkgKiBjYXNlIG9uIE5UNC4gLSBXZSBhc3N1bWUgdGhhdCB3ZSBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGxjbgorCQkgKiBjaGFuZ2UgdW50aWwgc29tZW9uZSB0ZWxscyB1cyBvdGhlcndpc2UuLi4gKEFJQSkKKwkJICovCisJCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQkvKiBXcml0ZSBjaGFuZ2UgaW4gbGNuLiAqLworCQkJbGNuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSArCisJCQkJCWxlbl9sZW4sIGRzdF9tYXgsIHJsLT5sY24gLSBwcmV2X2xjbik7CisJCQlpZiAobGNuX2xlbiA8IDApCisJCQkJZ290byBzaXplX2VycjsKKwkJCXByZXZfbGNuID0gcmwtPmxjbjsKKwkJfSBlbHNlCisJCQlsY25fbGVuID0gMDsKKwkJZHN0X25leHQgPSBkc3QgKyBsZW5fbGVuICsgbGNuX2xlbiArIDE7CisJCWlmIChkc3RfbmV4dCA+IGRzdF9tYXgpCisJCQlnb3RvIHNpemVfZXJyOworCQkvKiBVcGRhdGUgaGVhZGVyIGJ5dGUuICovCisJCSpkc3QgPSBsY25fbGVuIDw8IDQgfCBsZW5fbGVuOworCQkvKiBQb3NpdGlvbiBhdCBuZXh0IG1hcHBpbmcgcGFpcnMgYXJyYXkgZWxlbWVudC4gKi8KKwkJZHN0ID0gZHN0X25leHQ7CisJfQorCS8qIFN1Y2Nlc3MuICovCisJZXJyID0gMDsKK3NpemVfZXJyOgorCS8qIFNldCBzdG9wIHZjbi4gKi8KKwlpZiAoc3RvcF92Y24pCisJCSpzdG9wX3ZjbiA9IHJsLT52Y247CisJLyogQWRkIHRlcm1pbmF0b3IgYnl0ZS4gKi8KKwkqZHN0ID0gMDsKKwlyZXR1cm4gZXJyOworZXJyX291dDoKKwlpZiAocmwtPmxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlCisJCWVyciA9IC1FSU87CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JsX3RydW5jYXRlX25vbG9jayAtIHRydW5jYXRlIGEgcnVubGlzdCBzdGFydGluZyBhdCBhIHNwZWNpZmllZCB2Y24KKyAqIEBydW5saXN0OglydW5saXN0IHRvIHRydW5jYXRlCisgKiBAbmV3X2xlbmd0aDoJdGhlIG5ldyBsZW5ndGggb2YgdGhlIHJ1bmxpc3QgaW4gVkNOcworICoKKyAqIFRydW5jYXRlIHRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBAcnVubGlzdCBhcyB3ZWxsIGFzIHRoZSBtZW1vcnkgYnVmZmVyCisgKiBob2xkaW5nIHRoZSBydW5saXN0IGVsZW1lbnRzIHRvIGEgbGVuZ3RoIG9mIEBuZXdfbGVuZ3RoIFZDTnMuCisgKgorICogSWYgQG5ld19sZW5ndGggbGllcyB3aXRoaW4gdGhlIHJ1bmxpc3QsIHRoZSBydW5saXN0IGVsZW1lbnRzIHdpdGggVkNOcyBvZgorICogQG5ld19sZW5ndGggYW5kIGFib3ZlIGFyZSBkaXNjYXJkZWQuCisgKgorICogSWYgQG5ld19sZW5ndGggbGllcyBiZXlvbmQgdGhlIHJ1bmxpc3QsIGEgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudCBpcyBhZGRlZCB0bworICogdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBAcnVubGlzdCBvciBpZiB0aGUgbGFzdCBydW5saXN0IGVsZW1lbnQgaXMgYSBzcGFyc2UKKyAqIG9uZSBhbHJlYWR5LCB0aGlzIGlzIGV4dGVuZGVkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAcnVubGlzdC0+bG9jayBmb3Igd3JpdGluZy4KKyAqLworaW50IG50ZnNfcmxfdHJ1bmNhdGVfbm9sb2NrKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHJ1bmxpc3QgKmNvbnN0IHJ1bmxpc3QsCisJCWNvbnN0IHM2NCBuZXdfbGVuZ3RoKQoreworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJaW50IG9sZF9zaXplOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIG5ld19sZW5ndGggMHglbGx4LiIsIChsb25nIGxvbmcpbmV3X2xlbmd0aCk7CisJQlVHX09OKCFydW5saXN0KTsKKwlCVUdfT04obmV3X2xlbmd0aCA8IDApOworCXJsID0gcnVubGlzdC0+cmw7CisJaWYgKHVubGlrZWx5KCFybCkpIHsKKwkJLyoKKwkJICogQ3JlYXRlIGEgcnVubGlzdCBjb25zaXN0aW5nIG9mIGEgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudCBvZgorCQkgKiBsZW5ndGggQG5ld19sZW5ndGggZm9sbG93ZWQgYnkgYSB0ZXJtaW5hdG9yIHJ1bmxpc3QgZWxlbWVudC4KKwkJICovCisJCXJsID0gbnRmc19tYWxsb2Nfbm9mcyhQQUdFX1NJWkUpOworCQlpZiAodW5saWtlbHkoIXJsKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgIgorCQkJCQkicnVubGlzdCBlbGVtZW50IGJ1ZmZlci4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXJ1bmxpc3QtPnJsID0gcmw7CisJCXJsWzFdLmxlbmd0aCA9IHJsLT52Y24gPSAwOworCQlybC0+bGNuID0gTENOX0hPTEU7CisJCXJsWzFdLnZjbiA9IHJsLT5sZW5ndGggPSBuZXdfbGVuZ3RoOworCQlybFsxXS5sY24gPSBMQ05fRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisJQlVHX09OKG5ld19sZW5ndGggPCBybC0+dmNuKTsKKwkvKiBGaW5kIEBuZXdfbGVuZ3RoIGluIHRoZSBydW5saXN0LiAqLworCXdoaWxlIChsaWtlbHkocmwtPmxlbmd0aCAmJiBuZXdfbGVuZ3RoID49IHJsWzFdLnZjbikpCisJCXJsKys7CisJLyoKKwkgKiBJZiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcnVubGlzdCB3ZSBuZWVkIHRvIHNocmluayBpdC4KKwkgKiBJZiBhdCB0aGUgZW5kIG9mIHRoZSBydW5saXN0IHdlIG5lZWQgdG8gZXhwYW5kIGl0LgorCSAqLworCWlmIChybC0+bGVuZ3RoKSB7CisJCXJ1bmxpc3RfZWxlbWVudCAqdHJsOworCQlCT09MIGlzX2VuZDsKKworCQludGZzX2RlYnVnKCJTaHJpbmtpbmcgcnVubGlzdC4iKTsKKwkJLyogRGV0ZXJtaW5lIHRoZSBydW5saXN0IHNpemUuICovCisJCXRybCA9IHJsICsgMTsKKwkJd2hpbGUgKGxpa2VseSh0cmwtPmxlbmd0aCkpCisJCQl0cmwrKzsKKwkJb2xkX3NpemUgPSB0cmwgLSBydW5saXN0LT5ybCArIDE7CisJCS8qIFRydW5jYXRlIHRoZSBydW4uICovCisJCXJsLT5sZW5ndGggPSBuZXdfbGVuZ3RoIC0gcmwtPnZjbjsKKwkJLyoKKwkJICogSWYgYSBydW4gd2FzIHBhcnRpYWxseSB0cnVuY2F0ZWQsIG1ha2UgdGhlIGZvbGxvd2luZyBydW5saXN0CisJCSAqIGVsZW1lbnQgYSB0ZXJtaW5hdG9yLgorCQkgKi8KKwkJaXNfZW5kID0gRkFMU0U7CisJCWlmIChybC0+bGVuZ3RoKSB7CisJCQlybCsrOworCQkJaWYgKCFybC0+bGVuZ3RoKQorCQkJCWlzX2VuZCA9IFRSVUU7CisJCQlybC0+dmNuID0gbmV3X2xlbmd0aDsKKwkJCXJsLT5sZW5ndGggPSAwOworCQl9CisJCXJsLT5sY24gPSBMQ05fRU5PRU5UOworCQkvKiBSZWFsbG9jYXRlIG1lbW9yeSBpZiBuZWNlc3NhcnkuICovCisJCWlmICghaXNfZW5kKSB7CisJCQlpbnQgbmV3X3NpemUgPSBybCAtIHJ1bmxpc3QtPnJsICsgMTsKKwkJCXJsID0gbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3QtPnJsLCBvbGRfc2l6ZSwgbmV3X3NpemUpOworCQkJaWYgKElTX0VSUihybCkpCisJCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJGYWlsZWQgdG8gc2hyaW5rICIKKwkJCQkJCSJydW5saXN0IGJ1ZmZlci4gIFRoaXMganVzdCAiCisJCQkJCQkid2FzdGVzIGEgYml0IG9mIG1lbW9yeSAiCisJCQkJCQkidGVtcG9yYXJpbHkgc28gd2UgaWdub3JlIGl0ICIKKwkJCQkJCSJhbmQgcmV0dXJuIHN1Y2Nlc3MuIik7CisJCQllbHNlCisJCQkJcnVubGlzdC0+cmwgPSBybDsKKwkJfQorCX0gZWxzZSBpZiAobGlrZWx5KC8qICFybC0+bGVuZ3RoICYmICovIG5ld19sZW5ndGggPiBybC0+dmNuKSkgeworCQludGZzX2RlYnVnKCJFeHBhbmRpbmcgcnVubGlzdC4iKTsKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgYSBwcmV2aW91cyBydW5saXN0IGVsZW1lbnQgYW5kIGl0IGlzIGEgc3BhcnNlCisJCSAqIG9uZSwgZXh0ZW5kIGl0LiAgT3RoZXJ3aXNlIG5lZWQgdG8gYWRkIGEgbmV3LCBzcGFyc2UgcnVubGlzdAorCQkgKiBlbGVtZW50LgorCQkgKi8KKwkJaWYgKChybCA+IHJ1bmxpc3QtPnJsKSAmJiAoKHJsIC0gMSktPmxjbiA9PSBMQ05fSE9MRSkpCisJCQkocmwgLSAxKS0+bGVuZ3RoID0gbmV3X2xlbmd0aCAtIChybCAtIDEpLT52Y247CisJCWVsc2UgeworCQkJLyogRGV0ZXJtaW5lIHRoZSBydW5saXN0IHNpemUuICovCisJCQlvbGRfc2l6ZSA9IHJsIC0gcnVubGlzdC0+cmwgKyAxOworCQkJLyogUmVhbGxvY2F0ZSBtZW1vcnkgaWYgbmVjZXNzYXJ5LiAqLworCQkJcmwgPSBudGZzX3JsX3JlYWxsb2MocnVubGlzdC0+cmwsIG9sZF9zaXplLAorCQkJCQlvbGRfc2l6ZSArIDEpOworCQkJaWYgKElTX0VSUihybCkpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZXhwYW5kIHJ1bmxpc3QgIgorCQkJCQkJImJ1ZmZlciwgYWJvcnRpbmcuIik7CisJCQkJcmV0dXJuIFBUUl9FUlIocmwpOworCQkJfQorCQkJcnVubGlzdC0+cmwgPSBybDsKKwkJCS8qCisJCQkgKiBTZXQgQHJsIHRvIHRoZSBzYW1lIHJ1bmxpc3QgZWxlbWVudCBpbiB0aGUgbmV3CisJCQkgKiBydW5saXN0IGFzIGJlZm9yZSBpbiB0aGUgb2xkIHJ1bmxpc3QuCisJCQkgKi8KKwkJCXJsICs9IG9sZF9zaXplIC0gMTsKKwkJCS8qIEFkZCBhIG5ldywgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJCXJsLT5sY24gPSBMQ05fSE9MRTsKKwkJCXJsLT5sZW5ndGggPSBuZXdfbGVuZ3RoIC0gcmwtPnZjbjsKKwkJCS8qIEFkZCBhIG5ldyB0ZXJtaW5hdG9yIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJCXJsKys7CisJCQlybC0+bGVuZ3RoID0gMDsKKwkJfQorCQlybC0+dmNuID0gbmV3X2xlbmd0aDsKKwkJcmwtPmxjbiA9IExDTl9FTk9FTlQ7CisJfSBlbHNlIC8qIGlmICh1bmxpa2VseSghcmwtPmxlbmd0aCAmJiBuZXdfbGVuZ3RoID09IHJsLT52Y24pKSAqLyB7CisJCS8qIFJ1bmxpc3QgYWxyZWFkeSBoYXMgc2FtZSBzaXplIGFzIHJlcXVlc3RlZC4gKi8KKwkJcmwtPmxjbiA9IExDTl9FTk9FTlQ7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL3J1bmxpc3QuaCBiL2ZzL250ZnMvcnVubGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDdmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3J1bmxpc3QuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogcnVubGlzdC5oIC0gRGVmaW5lcyBmb3IgcnVubGlzdCBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuCisgKgkgICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19SVU5MSVNUX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfUlVOTElTVF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorCisvKioKKyAqIHJ1bmxpc3RfZWxlbWVudCAtIGluIG1lbW9yeSB2Y24gdG8gbGNuIG1hcHBpbmcgYXJyYXkgZWxlbWVudAorICogQHZjbjoJc3RhcnRpbmcgdmNuIG9mIHRoZSBjdXJyZW50IGFycmF5IGVsZW1lbnQKKyAqIEBsY246CXN0YXJ0aW5nIGxjbiBvZiB0aGUgY3VycmVudCBhcnJheSBlbGVtZW50CisgKiBAbGVuZ3RoOglsZW5ndGggaW4gY2x1c3RlcnMgb2YgdGhlIGN1cnJlbnQgYXJyYXkgZWxlbWVudAorICoKKyAqIFRoZSBsYXN0IHZjbiAoaW4gZmFjdCB0aGUgbGFzdCB2Y24gKyAxKSBpcyByZWFjaGVkIHdoZW4gbGVuZ3RoID09IDAuCisgKgorICogV2hlbiBsY24gPT0gLTEgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCB2Y25zIHN0YXJ0aW5nIGF0IHZjbiBhcmUgbm90CisgKiBwaHlzaWNhbGx5IGFsbG9jYXRlZCAoaS5lLiB0aGlzIGlzIGEgaG9sZSAvIGRhdGEgaXMgc3BhcnNlKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgewkvKiBJbiBtZW1vcnkgdmNuIHRvIGxjbiBtYXBwaW5nIHN0cnVjdHVyZSBlbGVtZW50LiAqLworCVZDTiB2Y247CS8qIHZjbiA9IFN0YXJ0aW5nIHZpcnR1YWwgY2x1c3RlciBudW1iZXIuICovCisJTENOIGxjbjsJLyogbGNuID0gU3RhcnRpbmcgbG9naWNhbCBjbHVzdGVyIG51bWJlci4gKi8KKwlzNjQgbGVuZ3RoOwkvKiBSdW4gbGVuZ3RoIGluIGNsdXN0ZXJzLiAqLworfSBydW5saXN0X2VsZW1lbnQ7CisKKy8qKgorICogcnVubGlzdCAtIGluIG1lbW9yeSB2Y24gdG8gbGNuIG1hcHBpbmcgYXJyYXkgaW5jbHVkaW5nIGEgcmVhZC93cml0ZSBsb2NrCisgKiBAcmw6CQlwb2ludGVyIHRvIGFuIGFycmF5IG9mIHJ1bmxpc3QgZWxlbWVudHMKKyAqIEBsb2NrOglyZWFkL3dyaXRlIHNwaW5sb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3MgdG8gQHJsCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2s7Cit9IHJ1bmxpc3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2luaXRfcnVubGlzdChydW5saXN0ICpybCkKK3sKKwlybC0+cmwgPSBOVUxMOworCWluaXRfcndzZW0oJnJsLT5sb2NrKTsKK30KKwordHlwZWRlZiBlbnVtIHsKKwlMQ05fSE9MRQkJPSAtMSwJLyogS2VlcCB0aGlzIGFzIGhpZ2hlc3QgdmFsdWUgb3IgZGllISAqLworCUxDTl9STF9OT1RfTUFQUEVECT0gLTIsCisJTENOX0VOT0VOVAkJPSAtMywKK30gTENOX1NQRUNJQUxfVkFMVUVTOworCitleHRlcm4gcnVubGlzdF9lbGVtZW50ICpudGZzX3J1bmxpc3RzX21lcmdlKHJ1bmxpc3RfZWxlbWVudCAqZHJsLAorCQlydW5saXN0X2VsZW1lbnQgKnNybCk7CisKK2V4dGVybiBydW5saXN0X2VsZW1lbnQgKm50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IEFUVFJfUkVDT1JEICphdHRyLCBydW5saXN0X2VsZW1lbnQgKm9sZF9ybCk7CisKK2V4dGVybiBMQ04gbnRmc19ybF92Y25fdG9fbGNuKGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiB2Y24pOworCitleHRlcm4gaW50IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHN0YXJ0X3Zjbik7CisKK2V4dGVybiBpbnQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHM4ICpkc3QsCisJCWNvbnN0IGludCBkc3RfbGVuLCBjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLAorCQljb25zdCBWQ04gc3RhcnRfdmNuLCBWQ04gKmNvbnN0IHN0b3BfdmNuKTsKKworZXh0ZXJuIGludCBudGZzX3JsX3RydW5jYXRlX25vbG9jayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQlydW5saXN0ICpjb25zdCBydW5saXN0LCBjb25zdCBzNjQgbmV3X2xlbmd0aCk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19SVU5MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvc3VwZXIuYyBiL2ZzL250ZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJhM2QwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9zdXBlci5jCkBAIC0wLDAgKzEsMjc3MSBAQAorLyoKKyAqIHN1cGVyLmMgLSBOVEZTIGtlcm5lbCBzdXBlciBibG9jayBoYW5kbGluZy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CS8qIEZvciBiZGV2X2hhcmRzZWN0X3NpemUoKS4gKi8KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAic3lzY3RsLmgiCisjaW5jbHVkZSAibG9nZmlsZS5oIgorI2luY2x1ZGUgInF1b3RhLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJpbmRleC5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qIE51bWJlciBvZiBtb3VudGVkIGZpbGUgc3lzdGVtcyB3aGljaCBoYXZlIGNvbXByZXNzaW9uIGVuYWJsZWQuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBudGZzX25yX2NvbXByZXNzaW9uX3VzZXJzOworCisvKiBBIGdsb2JhbCBkZWZhdWx0IHVwY2FzZSB0YWJsZSBhbmQgYSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZSBjb3VudC4gKi8KK3N0YXRpYyBudGZzY2hhciAqZGVmYXVsdF91cGNhc2UgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbnRmc19ucl91cGNhc2VfdXNlcnMgPSAwOworCisvKiBFcnJvciBjb25zdGFudHMvc3RyaW5ncyB1c2VkIGluIGlub2RlLmM6Om50ZnNfc2hvd19vcHRpb25zKCkuICovCit0eXBlZGVmIGVudW0geworCS8qIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGRlZmF1bHQgaXMgT05fRVJST1JTX0NPTlRJTlVFLiAqLworCU9OX0VSUk9SU19QQU5JQwkJCT0gMHgwMSwKKwlPTl9FUlJPUlNfUkVNT1VOVF9STwkJPSAweDAyLAorCU9OX0VSUk9SU19DT05USU5VRQkJPSAweDA0LAorCS8qIE9wdGlvbmFsLCBjYW4gYmUgY29tYmluZWQgd2l0aCBhbnkgb2YgdGhlIGFib3ZlLiAqLworCU9OX0VSUk9SU19SRUNPVkVSCQk9IDB4MTAsCit9IE9OX0VSUk9SU19BQ1RJT05TOworCitjb25zdCBvcHRpb25fdCBvbl9lcnJvcnNfYXJyW10gPSB7CisJeyBPTl9FUlJPUlNfUEFOSUMsCSJwYW5pYyIgfSwKKwl7IE9OX0VSUk9SU19SRU1PVU5UX1JPLAkicmVtb3VudC1ybyIsIH0sCisJeyBPTl9FUlJPUlNfQ09OVElOVUUsCSJjb250aW51ZSIsIH0sCisJeyBPTl9FUlJPUlNfUkVDT1ZFUiwJInJlY292ZXIiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworLyoqCisgKiBzaW1wbGVfZ2V0Ym9vbCAtCisgKgorICogQ29waWVkIGZyb20gb2xkIG50ZnMgZHJpdmVyICh3aGljaCBjb3BpZWQgZnJvbSB2ZmF0IGRyaXZlcikuCisgKi8KK3N0YXRpYyBpbnQgc2ltcGxlX2dldGJvb2woY2hhciAqcywgQk9PTCAqc2V0dmFsKQoreworCWlmIChzKSB7CisJCWlmICghc3RyY21wKHMsICIxIikgfHwgIXN0cmNtcChzLCAieWVzIikgfHwgIXN0cmNtcChzLCAidHJ1ZSIpKQorCQkJKnNldHZhbCA9IFRSVUU7CisJCWVsc2UgaWYgKCFzdHJjbXAocywgIjAiKSB8fCAhc3RyY21wKHMsICJubyIpIHx8CisJCQkJCQkJIXN0cmNtcChzLCAiZmFsc2UiKSkKKwkJCSpzZXR2YWwgPSBGQUxTRTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCSpzZXR2YWwgPSBUUlVFOworCXJldHVybiAxOworfQorCisvKioKKyAqIHBhcnNlX29wdGlvbnMgLSBwYXJzZSB0aGUgKHJlKW1vdW50IG9wdGlvbnMKKyAqIEB2b2w6CW50ZnMgdm9sdW1lCisgKiBAb3B0OglzdHJpbmcgY29udGFpbmluZyB0aGUgKHJlKW1vdW50IG9wdGlvbnMKKyAqCisgKiBQYXJzZSB0aGUgcmVjb2duaXplZCBvcHRpb25zIGluIEBvcHQgZm9yIHRoZSBudGZzIHZvbHVtZSBkZXNjcmliZWQgYnkgQHZvbC4KKyAqLworc3RhdGljIEJPT0wgcGFyc2Vfb3B0aW9ucyhudGZzX3ZvbHVtZSAqdm9sLCBjaGFyICpvcHQpCit7CisJY2hhciAqcCwgKnYsICpvdjsKKwlzdGF0aWMgY2hhciAqdXRmOCA9ICJ1dGY4IjsKKwlpbnQgZXJyb3JzID0gMCwgc2xvcHB5ID0gMDsKKwl1aWRfdCB1aWQgPSAodWlkX3QpLTE7CisJZ2lkX3QgZ2lkID0gKGdpZF90KS0xOworCW1vZGVfdCBmbWFzayA9IChtb2RlX3QpLTEsIGRtYXNrID0gKG1vZGVfdCktMTsKKwlpbnQgbWZ0X3pvbmVfbXVsdGlwbGllciA9IC0xLCBvbl9lcnJvcnMgPSAtMTsKKwlpbnQgc2hvd19zeXNfZmlsZXMgPSAtMSwgY2FzZV9zZW5zaXRpdmUgPSAtMTsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfbWFwID0gTlVMTCwgKm9sZF9ubHM7CisKKwkvKiBJIGFtIGxhenkuLi4gKC04ICovCisjZGVmaW5lIE5URlNfR0VUT1BUX1dJVEhfREVGQVVMVChvcHRpb24sIHZhcmlhYmxlLCBkZWZhdWx0X3ZhbHVlKQlcCisJaWYgKCFzdHJjbXAocCwgb3B0aW9uKSkgewkJCQkJXAorCQlpZiAoIXYgfHwgISp2KQkJCQkJCVwKKwkJCXZhcmlhYmxlID0gZGVmYXVsdF92YWx1ZTsJCQlcCisJCWVsc2UgewkJCQkJCQlcCisJCQl2YXJpYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKG92ID0gdiwgJnYsIDApOwlcCisJCQlpZiAoKnYpCQkJCQkJXAorCQkJCWdvdG8gbmVlZHNfdmFsOwkJCQlcCisJCX0JCQkJCQkJXAorCX0KKyNkZWZpbmUgTlRGU19HRVRPUFQob3B0aW9uLCB2YXJpYWJsZSkJCQkJCVwKKwlpZiAoIXN0cmNtcChwLCBvcHRpb24pKSB7CQkJCQlcCisJCWlmICghdiB8fCAhKnYpCQkJCQkJXAorCQkJZ290byBuZWVkc19hcmc7CQkJCQlcCisJCXZhcmlhYmxlID0gc2ltcGxlX3N0cnRvdWwob3YgPSB2LCAmdiwgMCk7CQlcCisJCWlmICgqdikJCQkJCQkJXAorCQkJZ290byBuZWVkc192YWw7CQkJCQlcCisJfQorI2RlZmluZSBOVEZTX0dFVE9QVF9CT09MKG9wdGlvbiwgdmFyaWFibGUpCQkJCVwKKwlpZiAoIXN0cmNtcChwLCBvcHRpb24pKSB7CQkJCQlcCisJCUJPT0wgdmFsOwkJCQkJCVwKKwkJaWYgKCFzaW1wbGVfZ2V0Ym9vbCh2LCAmdmFsKSkJCQkJXAorCQkJZ290byBuZWVkc19ib29sOwkJCQlcCisJCXZhcmlhYmxlID0gdmFsOwkJCQkJCVwKKwl9CisjZGVmaW5lIE5URlNfR0VUT1BUX09QVElPTlNfQVJSQVkob3B0aW9uLCB2YXJpYWJsZSwgb3B0X2FycmF5KQkJXAorCWlmICghc3RyY21wKHAsIG9wdGlvbikpIHsJCQkJCVwKKwkJaW50IF9pOwkJCQkJCQlcCisJCWlmICghdiB8fCAhKnYpCQkJCQkJXAorCQkJZ290byBuZWVkc19hcmc7CQkJCQlcCisJCW92ID0gdjsJCQkJCQkJXAorCQlpZiAodmFyaWFibGUgPT0gLTEpCQkJCQlcCisJCQl2YXJpYWJsZSA9IDA7CQkJCQlcCisJCWZvciAoX2kgPSAwOyBvcHRfYXJyYXlbX2ldLnN0ciAmJiAqb3B0X2FycmF5W19pXS5zdHI7IF9pKyspIFwKKwkJCWlmICghc3RyY21wKG9wdF9hcnJheVtfaV0uc3RyLCB2KSkgewkJXAorCQkJCXZhcmlhYmxlIHw9IG9wdF9hcnJheVtfaV0udmFsOwkJXAorCQkJCWJyZWFrOwkJCQkJXAorCQkJfQkJCQkJCVwKKwkJaWYgKCFvcHRfYXJyYXlbX2ldLnN0ciB8fCAhKm9wdF9hcnJheVtfaV0uc3RyKQkJXAorCQkJZ290byBuZWVkc192YWw7CQkJCQlcCisJfQorCWlmICghb3B0IHx8ICEqb3B0KQorCQlnb3RvIG5vX21vdW50X29wdGlvbnM7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgd2l0aCBtb3VudCBvcHRpb25zIHN0cmluZzogJXMiLCBvcHQpOworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0LCAiLCIpKSkgeworCQlpZiAoKHYgPSBzdHJjaHIocCwgJz0nKSkpCisJCQkqdisrID0gMDsKKwkJTlRGU19HRVRPUFQoInVpZCIsIHVpZCkKKwkJZWxzZSBOVEZTX0dFVE9QVCgiZ2lkIiwgZ2lkKQorCQllbHNlIE5URlNfR0VUT1BUKCJ1bWFzayIsIGZtYXNrID0gZG1hc2spCisJCWVsc2UgTlRGU19HRVRPUFQoImZtYXNrIiwgZm1hc2spCisJCWVsc2UgTlRGU19HRVRPUFQoImRtYXNrIiwgZG1hc2spCisJCWVsc2UgTlRGU19HRVRPUFQoIm1mdF96b25lX211bHRpcGxpZXIiLCBtZnRfem9uZV9tdWx0aXBsaWVyKQorCQllbHNlIE5URlNfR0VUT1BUX1dJVEhfREVGQVVMVCgic2xvcHB5Iiwgc2xvcHB5LCBUUlVFKQorCQllbHNlIE5URlNfR0VUT1BUX0JPT0woInNob3dfc3lzX2ZpbGVzIiwgc2hvd19zeXNfZmlsZXMpCisJCWVsc2UgTlRGU19HRVRPUFRfQk9PTCgiY2FzZV9zZW5zaXRpdmUiLCBjYXNlX3NlbnNpdGl2ZSkKKwkJZWxzZSBOVEZTX0dFVE9QVF9PUFRJT05TX0FSUkFZKCJlcnJvcnMiLCBvbl9lcnJvcnMsCisJCQkJb25fZXJyb3JzX2FycikKKwkJZWxzZSBpZiAoIXN0cmNtcChwLCAicG9zaXgiKSB8fCAhc3RyY21wKHAsICJzaG93X2lub2RlcyIpKQorCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJJZ25vcmluZyBvYnNvbGV0ZSBvcHRpb24gJXMuIiwKKwkJCQkJcCk7CisJCWVsc2UgaWYgKCFzdHJjbXAocCwgIm5scyIpIHx8ICFzdHJjbXAocCwgImlvY2hhcnNldCIpKSB7CisJCQlpZiAoIXN0cmNtcChwLCAiaW9jaGFyc2V0IikpCisJCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJPcHRpb24gaW9jaGFyc2V0IGlzICIKKwkJCQkJCSJkZXByZWNhdGVkLiBQbGVhc2UgdXNlICIKKwkJCQkJCSJvcHRpb24gbmxzPTxjaGFyc2V0bmFtZT4gaW4gIgorCQkJCQkJInRoZSBmdXR1cmUuIik7CisJCQlpZiAoIXYgfHwgISp2KQorCQkJCWdvdG8gbmVlZHNfYXJnOwordXNlX3V0Zjg6CisJCQlvbGRfbmxzID0gbmxzX21hcDsKKwkJCW5sc19tYXAgPSBsb2FkX25scyh2KTsKKwkJCWlmICghbmxzX21hcCkgeworCQkJCWlmICghb2xkX25scykgeworCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJOTFMgY2hhcmFjdGVyIHNldCAiCisJCQkJCQkJIiVzIG5vdCBmb3VuZC4iLCB2KTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJOTFMgY2hhcmFjdGVyIHNldCAlcyBub3QgIgorCQkJCQkJImZvdW5kLiBVc2luZyBwcmV2aW91cyBvbmUgJXMuIiwKKwkJCQkJCXYsIG9sZF9ubHMtPmNoYXJzZXQpOworCQkJCW5sc19tYXAgPSBvbGRfbmxzOworCQkJfSBlbHNlIC8qIG5sc19tYXAgKi8geworCQkJCWlmIChvbGRfbmxzKQorCQkJCQl1bmxvYWRfbmxzKG9sZF9ubHMpOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInV0ZjgiKSkgeworCQkJQk9PTCB2YWwgPSBGQUxTRTsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiT3B0aW9uIHV0ZjggaXMgbm8gbG9uZ2VyICIKKwkJCQkgICAic3VwcG9ydGVkLCB1c2luZyBvcHRpb24gbmxzPXV0ZjguIFBsZWFzZSAiCisJCQkJICAgInVzZSBvcHRpb24gbmxzPXV0ZjggaW4gdGhlIGZ1dHVyZSBhbmQgIgorCQkJCSAgICJtYWtlIHN1cmUgdXRmOCBpcyBjb21waWxlZCBlaXRoZXIgYXMgYSAiCisJCQkJICAgIm1vZHVsZSBvciBpbnRvIHRoZSBrZXJuZWwuIik7CisJCQlpZiAoIXYgfHwgISp2KQorCQkJCXZhbCA9IFRSVUU7CisJCQllbHNlIGlmICghc2ltcGxlX2dldGJvb2wodiwgJnZhbCkpCisJCQkJZ290byBuZWVkc19ib29sOworCQkJaWYgKHZhbCkgeworCQkJCXYgPSB1dGY4OworCQkJCWdvdG8gdXNlX3V0Zjg7CisJCQl9CisJCX0gZWxzZSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uICVzLiIsIHApOworCQkJaWYgKGVycm9ycyA8IElOVF9NQVgpCisJCQkJZXJyb3JzKys7CisJCX0KKyN1bmRlZiBOVEZTX0dFVE9QVF9PUFRJT05TX0FSUkFZCisjdW5kZWYgTlRGU19HRVRPUFRfQk9PTAorI3VuZGVmIE5URlNfR0VUT1BUCisjdW5kZWYgTlRGU19HRVRPUFRfV0lUSF9ERUZBVUxUCisJfQorbm9fbW91bnRfb3B0aW9uczoKKwlpZiAoZXJyb3JzICYmICFzbG9wcHkpCisJCXJldHVybiBGQUxTRTsKKwlpZiAoc2xvcHB5KQorCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlNsb3BweSBvcHRpb24gZ2l2ZW4uIElnbm9yaW5nICIKKwkJCQkidW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbihzKSBhbmQgY29udGludWluZy4iKTsKKwkvKiBLZWVwIHRoaXMgZmlyc3QhICovCisJaWYgKG9uX2Vycm9ycyAhPSAtMSkgeworCQlpZiAoIW9uX2Vycm9ycykgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCBlcnJvcnMgb3B0aW9uIGFyZ3VtZW50ICIKKwkJCQkJIm9yIGJ1ZyBpbiBvcHRpb25zIHBhcnNlci4iKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKwlpZiAobmxzX21hcCkgeworCQlpZiAodm9sLT5ubHNfbWFwICYmIHZvbC0+bmxzX21hcCAhPSBubHNfbWFwKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJDYW5ub3QgY2hhbmdlIE5MUyBjaGFyYWN0ZXIgc2V0ICIKKwkJCQkJIm9uIHJlbW91bnQuIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0gLyogZWxzZSAoIXZvbC0+bmxzX21hcCkgKi8KKwkJbnRmc19kZWJ1ZygiVXNpbmcgTkxTIGNoYXJhY3RlciBzZXQgJXMuIiwgbmxzX21hcC0+Y2hhcnNldCk7CisJCXZvbC0+bmxzX21hcCA9IG5sc19tYXA7CisJfSBlbHNlIC8qICghbmxzX21hcCkgKi8geworCQlpZiAoIXZvbC0+bmxzX21hcCkgeworCQkJdm9sLT5ubHNfbWFwID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQkJaWYgKCF2b2wtPm5sc19tYXApIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCBkZWZhdWx0ICIKKwkJCQkJCSJOTFMgY2hhcmFjdGVyIHNldC4iKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQludGZzX2RlYnVnKCJVc2luZyBkZWZhdWx0IE5MUyBjaGFyYWN0ZXIgc2V0ICglcykuIiwKKwkJCQkJdm9sLT5ubHNfbWFwLT5jaGFyc2V0KTsKKwkJfQorCX0KKwlpZiAobWZ0X3pvbmVfbXVsdGlwbGllciAhPSAtMSkgeworCQlpZiAodm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyICYmIHZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllciAhPQorCQkJCW1mdF96b25lX211bHRpcGxpZXIpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCBjaGFuZ2UgbWZ0X3pvbmVfbXVsdGlwbGllciAiCisJCQkJCSJvbiByZW1vdW50LiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWlmIChtZnRfem9uZV9tdWx0aXBsaWVyIDwgMSB8fCBtZnRfem9uZV9tdWx0aXBsaWVyID4gNCkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCBtZnRfem9uZV9tdWx0aXBsaWVyLiAiCisJCQkJCSJVc2luZyBkZWZhdWx0IHZhbHVlLCBpLmUuIDEuIik7CisJCQltZnRfem9uZV9tdWx0aXBsaWVyID0gMTsKKwkJfQorCQl2b2wtPm1mdF96b25lX211bHRpcGxpZXIgPSBtZnRfem9uZV9tdWx0aXBsaWVyOworCX0KKwlpZiAoIXZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllcikKKwkJdm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyID0gMTsKKwlpZiAob25fZXJyb3JzICE9IC0xKQorCQl2b2wtPm9uX2Vycm9ycyA9IG9uX2Vycm9yczsKKwlpZiAoIXZvbC0+b25fZXJyb3JzIHx8IHZvbC0+b25fZXJyb3JzID09IE9OX0VSUk9SU19SRUNPVkVSKQorCQl2b2wtPm9uX2Vycm9ycyB8PSBPTl9FUlJPUlNfQ09OVElOVUU7CisJaWYgKHVpZCAhPSAodWlkX3QpLTEpCisJCXZvbC0+dWlkID0gdWlkOworCWlmIChnaWQgIT0gKGdpZF90KS0xKQorCQl2b2wtPmdpZCA9IGdpZDsKKwlpZiAoZm1hc2sgIT0gKG1vZGVfdCktMSkKKwkJdm9sLT5mbWFzayA9IGZtYXNrOworCWlmIChkbWFzayAhPSAobW9kZV90KS0xKQorCQl2b2wtPmRtYXNrID0gZG1hc2s7CisJaWYgKHNob3dfc3lzX2ZpbGVzICE9IC0xKSB7CisJCWlmIChzaG93X3N5c19maWxlcykKKwkJCU5Wb2xTZXRTaG93U3lzdGVtRmlsZXModm9sKTsKKwkJZWxzZQorCQkJTlZvbENsZWFyU2hvd1N5c3RlbUZpbGVzKHZvbCk7CisJfQorCWlmIChjYXNlX3NlbnNpdGl2ZSAhPSAtMSkgeworCQlpZiAoY2FzZV9zZW5zaXRpdmUpCisJCQlOVm9sU2V0Q2FzZVNlbnNpdGl2ZSh2b2wpOworCQllbHNlCisJCQlOVm9sQ2xlYXJDYXNlU2Vuc2l0aXZlKHZvbCk7CisJfQorCXJldHVybiBUUlVFOworbmVlZHNfYXJnOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRoZSAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQuIiwgcCk7CisJcmV0dXJuIEZBTFNFOworbmVlZHNfYm9vbDoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJUaGUgJXMgb3B0aW9uIHJlcXVpcmVzIGEgYm9vbGVhbiBhcmd1bWVudC4iLCBwKTsKKwlyZXR1cm4gRkFMU0U7CituZWVkc192YWw6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCAlcyBvcHRpb24gYXJndW1lbnQ6ICVzIiwgcCwgb3YpOworCXJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncyAtIHdyaXRlIG5ldyBmbGFncyB0byB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0byBtb2RpZnkgdGhlIGZsYWdzCisgKiBAZmxhZ3M6CW5ldyBmbGFncyB2YWx1ZSBmb3IgdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uLiAgWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIG50ZnNfe3NldCxjbGVhcn1fdm9sdW1lX2ZsYWdzKCkKKyAqIGluc3RlYWQgKHNlZSBiZWxvdykuCisgKgorICogUmVwbGFjZSB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzIG9uIHRoZSB2b2x1bWUgQHZvbCB3aXRoIHRoZSB2YWx1ZQorICogc3VwcGxpZWQgaW4gQGZsYWdzLiAgTm90ZSwgdGhpcyBvdmVyd3JpdGVzIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3MsIHNvCisgKiBtYWtlIHN1cmUgdG8gY29tYmluZSB0aGUgZmxhZ3MgeW91IHdhbnQgdG8gbW9kaWZ5IHdpdGggdGhlIG9sZCBmbGFncyBhbmQgdXNlCisgKiB0aGUgcmVzdWx0IHdoZW4gY2FsbGluZyBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncygpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncyhudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBWT0xVTUVfRkxBR1MgZmxhZ3MpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodm9sLT52b2xfaW5vKTsKKwlNRlRfUkVDT1JEICptOworCVZPTFVNRV9JTkZPUk1BVElPTiAqdmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcsIG9sZCBmbGFncyA9IDB4JXgsIG5ldyBmbGFncyA9IDB4JXguIiwKKwkJCWxlMTZfdG9fY3B1KHZvbC0+dm9sX2ZsYWdzKSwgbGUxNl90b19jcHUoZmxhZ3MpKTsKKwlpZiAodm9sLT52b2xfZmxhZ3MgPT0gZmxhZ3MpCisJCWdvdG8gZG9uZTsKKwlCVUdfT04oIW5pKTsKKwltID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobmksIG0pOworCWlmICghY3R4KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gcHV0X3VubV9lcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX1ZPTFVNRV9JTkZPUk1BVElPTiwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwKKwkJCWN0eCk7CisJaWYgKGVycikKKwkJZ290byBwdXRfdW5tX2Vycl9vdXQ7CisJdmkgPSAoVk9MVU1FX0lORk9STUFUSU9OKikoKHU4KiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCXZvbC0+dm9sX2ZsYWdzID0gdmktPmZsYWdzID0gZmxhZ3M7CisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChuaSk7Citkb25lOgorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CitwdXRfdW5tX2Vycl9vdXQ6CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChuaSk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuIiwgLWVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3NldF92b2x1bWVfZmxhZ3MgLSBzZXQgYml0cyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0byBtb2RpZnkgdGhlIGZsYWdzCisgKiBAZmxhZ3M6CWZsYWdzIHRvIHNldCBvbiB0aGUgdm9sdW1lCisgKgorICogU2V0IHRoZSBiaXRzIGluIEBmbGFncyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzIG9uIHRoZSB2b2x1bWUgQHZvbC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfc2V0X3ZvbHVtZV9mbGFncyhudGZzX3ZvbHVtZSAqdm9sLCBWT0xVTUVfRkxBR1MgZmxhZ3MpCit7CisJZmxhZ3MgJj0gVk9MVU1FX0ZMQUdTX01BU0s7CisJcmV0dXJuIG50ZnNfd3JpdGVfdm9sdW1lX2ZsYWdzKHZvbCwgdm9sLT52b2xfZmxhZ3MgfCBmbGFncyk7Cit9CisKKy8qKgorICogbnRmc19jbGVhcl92b2x1bWVfZmxhZ3MgLSBjbGVhciBiaXRzIGluIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3MKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIG1vZGlmeSB0aGUgZmxhZ3MKKyAqIEBmbGFnczoJZmxhZ3MgdG8gY2xlYXIgb24gdGhlIHZvbHVtZQorICoKKyAqIENsZWFyIHRoZSBiaXRzIGluIEBmbGFncyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzIG9uIHRoZSB2b2x1bWUgQHZvbC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfY2xlYXJfdm9sdW1lX2ZsYWdzKG50ZnNfdm9sdW1lICp2b2wsIFZPTFVNRV9GTEFHUyBmbGFncykKK3sKKwlmbGFncyAmPSBWT0xVTUVfRkxBR1NfTUFTSzsKKwlmbGFncyA9IHZvbC0+dm9sX2ZsYWdzICYgY3B1X3RvX2xlMTYofmxlMTZfdG9fY3B1KGZsYWdzKSk7CisJcmV0dXJuIG50ZnNfd3JpdGVfdm9sdW1lX2ZsYWdzKHZvbCwgZmxhZ3MpOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisvKioKKyAqIG50ZnNfcmVtb3VudCAtIGNoYW5nZSB0aGUgbW91bnQgb3B0aW9ucyBvZiBhIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtCisgKiBAc2I6CQlzdXBlcmJsb2NrIG9mIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtCisgKiBAZmxhZ3M6CXJlbW91bnQgZmxhZ3MKKyAqIEBvcHQ6CXJlbW91bnQgb3B0aW9ucyBzdHJpbmcKKyAqCisgKiBDaGFuZ2UgdGhlIG1vdW50IG9wdGlvbnMgb2YgYW4gYWxyZWFkeSBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbS4KKyAqCisgKiBOT1RFOiAgVGhlIFZGUyBzZXRzIHRoZSBAc2ItPnNfZmxhZ3MgcmVtb3VudCBmbGFncyB0byBAZmxhZ3MgYWZ0ZXIKKyAqIG50ZnNfcmVtb3VudCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5IChpLmUuIHJldHVybnMgMCkuICBPdGhlcndpc2UsCisgKiBAc2ItPnNfZmxhZ3MgYXJlIG5vdCBjaGFuZ2VkLgorICovCitzdGF0aWMgaW50IG50ZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpvcHQpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0Ioc2IpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgd2l0aCByZW1vdW50IG9wdGlvbnMgc3RyaW5nOiAlcyIsIG9wdCk7CisjaWZuZGVmIE5URlNfUlcKKwkvKiBGb3IgcmVhZC1vbmx5IGNvbXBpbGVkIGRyaXZlciwgZW5mb3JjZSBhbGwgcmVhZC1vbmx5IGZsYWdzLiAqLworCSpmbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKyNlbHNlIC8qIE5URlNfUlcgKi8KKwkvKgorCSAqIEZvciB0aGUgcmVhZC13cml0ZSBjb21waWxlZCBkcml2ZXIsIGlmIHdlIGFyZSByZW1vdW50aW5nIHJlYWQtd3JpdGUsCisJICogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyB2b2x1bWUgZXJyb3JzIGFuZCB0aGF0IG5vIHVuc3VwcG9ydGVkIHZvbHVtZQorCSAqIGZsYWdzIGFyZSBzZXQuICBBbHNvLCBlbXB0eSB0aGUgbG9nZmlsZSBqb3VybmFsIGFzIGl0IHdvdWxkIGJlY29tZQorCSAqIHN0YWxlIGFzIHNvb24gYXMgc29tZXRoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIHZvbHVtZSBhbmQgbWFyayB0aGUKKwkgKiB2b2x1bWUgZGlydHkgc28gdGhhdCBjaGtkc2sgaXMgcnVuIGlmIHRoZSB2b2x1bWUgaXMgbm90IHVtb3VudGVkCisJICogY2xlYW5seS4gIEZpbmFsbHksIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZSBzbyBXaW5kb3dzIHJlc2NhbnMKKwkgKiB0aGUgdm9sdW1lIG9uIGJvb3QgYW5kIHVwZGF0ZXMgdGhlbS4KKwkgKgorCSAqIFdoZW4gcmVtb3VudGluZyByZWFkLW9ubHksIG1hcmsgdGhlIHZvbHVtZSBjbGVhbiBpZiBubyB2b2x1bWUgZXJyb3JzCisJICogaGF2ZSBvY2N1cmVkLgorCSAqLworCWlmICgoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmICEoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMgPSAiLiAgQ2Fubm90IHJlbW91bnQgcmVhZC13cml0ZS4iOworCisJCS8qIFJlbW91bnRpbmcgcmVhZC13cml0ZS4gKi8KKwkJaWYgKE5Wb2xFcnJvcnModm9sKSkgeworCQkJbnRmc19lcnJvcihzYiwgIlZvbHVtZSBoYXMgZXJyb3JzIGFuZCBpcyByZWFkLW9ubHklcyIsCisJCQkJCWVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKwkJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX0lTX0RJUlRZKSB7CisJCQludGZzX2Vycm9yKHNiLCAiVm9sdW1lIGlzIGRpcnR5IGFuZCByZWFkLW9ubHklcyIsIGVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKwkJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSykgeworCQkJbnRmc19lcnJvcihzYiwgIlZvbHVtZSBoYXMgdW5zdXBwb3J0ZWQgZmxhZ3Mgc2V0IGFuZCAiCisJCQkJCSJpcyByZWFkLW9ubHklcyIsIGVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKwkJaWYgKG50ZnNfc2V0X3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gc2V0IGRpcnR5IGJpdCBpbiB2b2x1bWUgIgorCQkJCQkiaW5mb3JtYXRpb24gZmxhZ3MlcyIsIGVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKyNpZiAwCisJCS8vIFRPRE86IEVuYWJsZSB0aGlzIGNvZGUgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgYW55dGhpbmcgdGhhdAorCQkvLwkgaXMgZGlmZmVyZW50IGJldHdlZW4gTlRGUyAxLjIgYW5kIDMueC4uLgorCQkvKiBTZXQgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyBvbiBuZXdlciBOVEZTIHZlcnNpb24gdm9sdW1lcy4gKi8KKwkJaWYgKCh2b2wtPm1ham9yX3ZlciA+IDEpKSB7CisJCQlpZiAobnRmc19zZXRfdm9sdW1lX2ZsYWdzKHZvbCwgVk9MVU1FX01PVU5URURfT05fTlQ0KSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gc2V0IE5UNCAiCisJCQkJCQkiY29tcGF0aWJpbGl0eSBmbGFnJXMiLCBlcyk7CisJCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJCXJldHVybiAtRVJPRlM7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAoIW50ZnNfZW1wdHlfbG9nZmlsZSh2b2wtPmxvZ2ZpbGVfaW5vKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBlbXB0eSBqb3VybmFsICRMb2dGaWxlJXMiLAorCQkJCQllcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCWlmICghbnRmc19tYXJrX3F1b3Rhc19vdXRfb2ZfZGF0ZSh2b2wpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIG1hcmsgcXVvdGFzIG91dCBvZiBkYXRlJXMiLAorCQkJCQllcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJfSBlbHNlIGlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvKiBSZW1vdW50aW5nIHJlYWQtb25seS4gKi8KKwkJaWYgKCFOVm9sRXJyb3JzKHZvbCkpIHsKKwkJCWlmIChudGZzX2NsZWFyX3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpCisJCQkJbnRmc193YXJuaW5nKHNiLCAiRmFpbGVkIHRvIGNsZWFyIGRpcnR5IGJpdCAiCisJCQkJCQkiaW4gdm9sdW1lIGluZm9ybWF0aW9uICIKKwkJCQkJCSJmbGFncy4gIFJ1biBjaGtkc2suIik7CisJCX0KKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJLy8gVE9ETzogRGVhbCB3aXRoICpmbGFncy4KKworCWlmICghcGFyc2Vfb3B0aW9ucyh2b2wsIG9wdCkpCisJCXJldHVybiAtRUlOVkFMOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNfYm9vdF9zZWN0b3JfbnRmcyAtIGNoZWNrIHdoZXRoZXIgYSBib290IHNlY3RvciBpcyBhIHZhbGlkIE5URlMgYm9vdCBzZWN0b3IKKyAqIEBzYjoJCVN1cGVyIGJsb2NrIG9mIHRoZSBkZXZpY2UgdG8gd2hpY2ggQGIgYmVsb25ncy4KKyAqIEBiOgkJQm9vdCBzZWN0b3Igb2YgZGV2aWNlIEBzYiB0byBjaGVjay4KKyAqIEBzaWxlbnQ6CUlmIFRSVUUsIGFsbCBvdXRwdXQgd2lsbCBiZSBzaWxlbmNlZC4KKyAqCisgKiBpc19ib290X3NlY3Rvcl9udGZzKCkgY2hlY2tzIHdoZXRoZXIgdGhlIGJvb3Qgc2VjdG9yIEBiIGlzIGEgdmFsaWQgTlRGUyBib290CisgKiBzZWN0b3IuIFJldHVybnMgVFJVRSBpZiBpdCBpcyB2YWxpZCBhbmQgRkFMU0UgaWYgbm90LgorICoKKyAqIEBzYiBpcyBvbmx5IG5lZWRlZCBmb3Igd2FybmluZy9lcnJvciBvdXRwdXQsIGkuZS4gaXQgY2FuIGJlIE5VTEwgd2hlbiBzaWxlbnQKKyAqIGlzIFRSVUUuCisgKi8KK3N0YXRpYyBCT09MIGlzX2Jvb3Rfc2VjdG9yX250ZnMoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgTlRGU19CT09UX1NFQ1RPUiAqYiwgY29uc3QgQk9PTCBzaWxlbnQpCit7CisJLyoKKwkgKiBDaGVjayB0aGF0IGNoZWNrc3VtID09IHN1bSBvZiB1MzIgdmFsdWVzIGZyb20gYiB0byB0aGUgY2hlY2tzdW0KKwkgKiBmaWVsZC4gSWYgY2hlY2tzdW0gaXMgemVybywgbm8gY2hlY2tpbmcgaXMgZG9uZS4KKwkgKi8KKwlpZiAoKHZvaWQqKWIgPCAodm9pZCopJmItPmNoZWNrc3VtICYmIGItPmNoZWNrc3VtKSB7CisJCWxlMzIgKnU7CisJCXUzMiBpOworCisJCWZvciAoaSA9IDAsIHUgPSAobGUzMiopYjsgdSA8IChsZTMyKikoJmItPmNoZWNrc3VtKTsgKyt1KQorCQkJaSArPSBsZTMyX3RvX2NwdXAodSk7CisJCWlmIChsZTMyX3RvX2NwdShiLT5jaGVja3N1bSkgIT0gaSkKKwkJCWdvdG8gbm90X250ZnM7CisJfQorCS8qIENoZWNrIE9FTWlkZW50aWZpZXIgaXMgIk5URlMgICAgIiAqLworCWlmIChiLT5vZW1faWQgIT0gbWFnaWNOVEZTKQorCQlnb3RvIG5vdF9udGZzOworCS8qIENoZWNrIGJ5dGVzIHBlciBzZWN0b3IgdmFsdWUgaXMgYmV0d2VlbiAyNTYgYW5kIDQwOTYuICovCisJaWYgKGxlMTZfdG9fY3B1KGItPmJwYi5ieXRlc19wZXJfc2VjdG9yKSA8IDB4MTAwIHx8CisJCQlsZTE2X3RvX2NwdShiLT5icGIuYnl0ZXNfcGVyX3NlY3RvcikgPiAweDEwMDApCisJCWdvdG8gbm90X250ZnM7CisJLyogQ2hlY2sgc2VjdG9ycyBwZXIgY2x1c3RlciB2YWx1ZSBpcyB2YWxpZC4gKi8KKwlzd2l0Y2ggKGItPmJwYi5zZWN0b3JzX3Blcl9jbHVzdGVyKSB7CisJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDogY2FzZSA4OiBjYXNlIDE2OiBjYXNlIDMyOiBjYXNlIDY0OiBjYXNlIDEyODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBub3RfbnRmczsKKwl9CisJLyogQ2hlY2sgdGhlIGNsdXN0ZXIgc2l6ZSBpcyBub3QgYWJvdmUgNjU1MzYgYnl0ZXMuICovCisJaWYgKCh1MzIpbGUxNl90b19jcHUoYi0+YnBiLmJ5dGVzX3Blcl9zZWN0b3IpICoKKwkJCWItPmJwYi5zZWN0b3JzX3Blcl9jbHVzdGVyID4gMHgxMDAwMCkKKwkJZ290byBub3RfbnRmczsKKwkvKiBDaGVjayByZXNlcnZlZC91bnVzZWQgZmllbGRzIGFyZSByZWFsbHkgemVyby4gKi8KKwlpZiAobGUxNl90b19jcHUoYi0+YnBiLnJlc2VydmVkX3NlY3RvcnMpIHx8CisJCQlsZTE2X3RvX2NwdShiLT5icGIucm9vdF9lbnRyaWVzKSB8fAorCQkJbGUxNl90b19jcHUoYi0+YnBiLnNlY3RvcnMpIHx8CisJCQlsZTE2X3RvX2NwdShiLT5icGIuc2VjdG9yc19wZXJfZmF0KSB8fAorCQkJbGUzMl90b19jcHUoYi0+YnBiLmxhcmdlX3NlY3RvcnMpIHx8IGItPmJwYi5mYXRzKQorCQlnb3RvIG5vdF9udGZzOworCS8qIENoZWNrIGNsdXN0ZXJzIHBlciBmaWxlIG1mdCByZWNvcmQgdmFsdWUgaXMgdmFsaWQuICovCisJaWYgKCh1OCliLT5jbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA8IDB4ZTEgfHwKKwkJCSh1OCliLT5jbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA+IDB4ZjcpCisJCXN3aXRjaCAoYi0+Y2x1c3RlcnNfcGVyX21mdF9yZWNvcmQpIHsKKwkJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDogY2FzZSA4OiBjYXNlIDE2OiBjYXNlIDMyOiBjYXNlIDY0OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG5vdF9udGZzOworCQl9CisJLyogQ2hlY2sgY2x1c3RlcnMgcGVyIGluZGV4IGJsb2NrIHZhbHVlIGlzIHZhbGlkLiAqLworCWlmICgodTgpYi0+Y2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA8IDB4ZTEgfHwKKwkJCSh1OCliLT5jbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkID4gMHhmNykKKwkJc3dpdGNoIChiLT5jbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkKSB7CisJCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6IGNhc2UgODogY2FzZSAxNjogY2FzZSAzMjogY2FzZSA2NDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBub3RfbnRmczsKKwkJfQorCS8qCisJICogQ2hlY2sgZm9yIHZhbGlkIGVuZCBvZiBzZWN0b3IgbWFya2VyLiBXZSB3aWxsIHdvcmsgd2l0aG91dCBpdCwgYnV0CisJICogbWFueSBCSU9TZXMgd2lsbCByZWZ1c2UgdG8gYm9vdCBmcm9tIGEgYm9vdHNlY3RvciBpZiB0aGUgbWFnaWMgaXMKKwkgKiBpbmNvcnJlY3QsIHNvIHdlIGVtaXQgYSB3YXJuaW5nLgorCSAqLworCWlmICghc2lsZW50ICYmIGItPmVuZF9vZl9zZWN0b3JfbWFya2VyICE9IGNwdV90b19sZTE2KDB4YWE1NSkpCisJCW50ZnNfd2FybmluZyhzYiwgIkludmFsaWQgZW5kIG9mIHNlY3RvciBtYXJrZXIuIik7CisJcmV0dXJuIFRSVUU7Citub3RfbnRmczoKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogcmVhZF9udGZzX2Jvb3Rfc2VjdG9yIC0gcmVhZCB0aGUgTlRGUyBib290IHNlY3RvciBvZiBhIGRldmljZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZGV2aWNlIHRvIHJlYWQgdGhlIGJvb3Qgc2VjdG9yIGZyb20KKyAqIEBzaWxlbnQ6CWlmIHRydWUsIHN1cHByZXNzIGFsbCBvdXRwdXQKKyAqCisgKiBSZWFkcyB0aGUgYm9vdCBzZWN0b3IgZnJvbSB0aGUgZGV2aWNlIGFuZCB2YWxpZGF0ZXMgaXQuIElmIHRoYXQgZmFpbHMsIHRyaWVzCisgKiB0byByZWFkIHRoZSBiYWNrdXAgYm9vdCBzZWN0b3IsIGZpcnN0IGZyb20gdGhlIGVuZCBvZiB0aGUgZGV2aWNlIGEtbGEgTlQ0IGFuZAorICogbGF0ZXIgYW5kIHRoZW4gZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBkZXZpY2UgYS1sYSBOVDMuNTEgYW5kIGJlZm9yZS4KKyAqCisgKiBJZiBhIHZhbGlkIGJvb3Qgc2VjdG9yIGlzIGZvdW5kIGJ1dCBpdCBpcyBub3QgdGhlIHByaW1hcnkgYm9vdCBzZWN0b3IsIHdlCisgKiByZXBhaXIgdGhlIHByaW1hcnkgYm9vdCBzZWN0b3Igc2lsZW50bHkgKHVubGVzcyB0aGUgZGV2aWNlIGlzIHJlYWQtb25seSBvcgorICogdGhlIHByaW1hcnkgYm9vdCBzZWN0b3IgaXMgbm90IGFjY2Vzc2libGUpLgorICoKKyAqIE5PVEU6IFRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgQHNiIG11c3QgaGF2ZSB0aGUgZmllbGRzIHNfZGV2LCB0aGUgbnRmcyBzdXBlcgorICogYmxvY2sgKHUubnRmc19zYiksIG5yX2Jsb2NrcyBhbmQgdGhlIGRldmljZSBmbGFncyAoc19mbGFncykgaW5pdGlhbGl6ZWQKKyAqIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLgorICoKKyAqIFJldHVybiB0aGUgdW5sb2NrZWQgYnVmZmVyIGhlYWQgY29udGFpbmluZyB0aGUgYm9vdCBzZWN0b3Igb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZF9udGZzX2Jvb3Rfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGludCBzaWxlbnQpCit7CisJY29uc3QgY2hhciAqcmVhZF9lcnJfc3RyID0gIlVuYWJsZSB0byByZWFkICVzIGJvb3Qgc2VjdG9yLiI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9wcmltYXJ5LCAqYmhfYmFja3VwOworCWxvbmcgbnJfYmxvY2tzID0gTlRGU19TQihzYiktPm5yX2Jsb2NrczsKKworCS8qIFRyeSB0byByZWFkIHByaW1hcnkgYm9vdCBzZWN0b3IuICovCisJaWYgKChiaF9wcmltYXJ5ID0gc2JfYnJlYWQoc2IsIDApKSkgeworCQlpZiAoaXNfYm9vdF9zZWN0b3JfbnRmcyhzYiwgKE5URlNfQk9PVF9TRUNUT1IqKQorCQkJCWJoX3ByaW1hcnktPmJfZGF0YSwgc2lsZW50KSkKKwkJCXJldHVybiBiaF9wcmltYXJ5OworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJQcmltYXJ5IGJvb3Qgc2VjdG9yIGlzIGludmFsaWQuIik7CisJfSBlbHNlIGlmICghc2lsZW50KQorCQludGZzX2Vycm9yKHNiLCByZWFkX2Vycl9zdHIsICJwcmltYXJ5Iik7CisJaWYgKCEoTlRGU19TQihzYiktPm9uX2Vycm9ycyAmIE9OX0VSUk9SU19SRUNPVkVSKSkgeworCQlpZiAoYmhfcHJpbWFyeSkKKwkJCWJyZWxzZShiaF9wcmltYXJ5KTsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiTW91bnQgb3B0aW9uIGVycm9ycz1yZWNvdmVyIG5vdCB1c2VkLiAiCisJCQkJCSJBYm9ydGluZyB3aXRob3V0IHRyeWluZyB0byByZWNvdmVyLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogVHJ5IHRvIHJlYWQgTlQ0KyBiYWNrdXAgYm9vdCBzZWN0b3IuICovCisJaWYgKChiaF9iYWNrdXAgPSBzYl9icmVhZChzYiwgbnJfYmxvY2tzIC0gMSkpKSB7CisJCWlmIChpc19ib290X3NlY3Rvcl9udGZzKHNiLCAoTlRGU19CT09UX1NFQ1RPUiopCisJCQkJYmhfYmFja3VwLT5iX2RhdGEsIHNpbGVudCkpCisJCQlnb3RvIGhvdGZpeF9wcmltYXJ5X2Jvb3Rfc2VjdG9yOworCQlicmVsc2UoYmhfYmFja3VwKTsKKwl9IGVsc2UgaWYgKCFzaWxlbnQpCisJCW50ZnNfZXJyb3Ioc2IsIHJlYWRfZXJyX3N0ciwgImJhY2t1cCIpOworCS8qIFRyeSB0byByZWFkIE5UMy41MS0gYmFja3VwIGJvb3Qgc2VjdG9yLiAqLworCWlmICgoYmhfYmFja3VwID0gc2JfYnJlYWQoc2IsIG5yX2Jsb2NrcyA+PiAxKSkpIHsKKwkJaWYgKGlzX2Jvb3Rfc2VjdG9yX250ZnMoc2IsIChOVEZTX0JPT1RfU0VDVE9SKikKKwkJCQliaF9iYWNrdXAtPmJfZGF0YSwgc2lsZW50KSkKKwkJCWdvdG8gaG90Zml4X3ByaW1hcnlfYm9vdF9zZWN0b3I7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgYmFja3VwIGJvb3QgIgorCQkJCQkic2VjdG9yLiIpOworCQlicmVsc2UoYmhfYmFja3VwKTsKKwl9IGVsc2UgaWYgKCFzaWxlbnQpCisJCW50ZnNfZXJyb3Ioc2IsIHJlYWRfZXJyX3N0ciwgImJhY2t1cCIpOworCS8qIFdlIGZhaWxlZC4gQ2xlYW51cCBhbmQgcmV0dXJuLiAqLworCWlmIChiaF9wcmltYXJ5KQorCQlicmVsc2UoYmhfcHJpbWFyeSk7CisJcmV0dXJuIE5VTEw7Citob3RmaXhfcHJpbWFyeV9ib290X3NlY3RvcjoKKwlpZiAoYmhfcHJpbWFyeSkgeworCQkvKgorCQkgKiBJZiB3ZSBtYW5hZ2VkIHRvIHJlYWQgc2VjdG9yIHplcm8gYW5kIHRoZSB2b2x1bWUgaXMgbm90CisJCSAqIHJlYWQtb25seSwgY29weSB0aGUgZm91bmQsIHZhbGlkIGJhY2t1cCBib290IHNlY3RvciB0byB0aGUKKwkJICogcHJpbWFyeSBib290IHNlY3Rvci4KKwkJICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJbnRmc193YXJuaW5nKHNiLCAiSG90LWZpeDogUmVjb3ZlcmluZyBpbnZhbGlkIHByaW1hcnkgIgorCQkJCQkiYm9vdCBzZWN0b3IgZnJvbSBiYWNrdXAgY29weS4iKTsKKwkJCW1lbWNweShiaF9wcmltYXJ5LT5iX2RhdGEsIGJoX2JhY2t1cC0+Yl9kYXRhLAorCQkJCQlzYi0+c19ibG9ja3NpemUpOworCQkJbWFya19idWZmZXJfZGlydHkoYmhfcHJpbWFyeSk7CisJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaF9wcmltYXJ5KTsKKwkJCWlmIChidWZmZXJfdXB0b2RhdGUoYmhfcHJpbWFyeSkpIHsKKwkJCQlicmVsc2UoYmhfYmFja3VwKTsKKwkJCQlyZXR1cm4gYmhfcHJpbWFyeTsKKwkJCX0KKwkJCW50ZnNfZXJyb3Ioc2IsICJIb3QtZml4OiBEZXZpY2Ugd3JpdGUgZXJyb3Igd2hpbGUgIgorCQkJCQkicmVjb3ZlcmluZyBwcmltYXJ5IGJvb3Qgc2VjdG9yLiIpOworCQl9IGVsc2UgeworCQkJbnRmc193YXJuaW5nKHNiLCAiSG90LWZpeDogUmVjb3Zlcnkgb2YgcHJpbWFyeSBib290ICIKKwkJCQkJInNlY3RvciBmYWlsZWQ6IFJlYWQtb25seSBtb3VudC4iKTsKKwkJfQorCQlicmVsc2UoYmhfcHJpbWFyeSk7CisJfQorCW50ZnNfd2FybmluZyhzYiwgIlVzaW5nIGJhY2t1cCBib290IHNlY3Rvci4iKTsKKwlyZXR1cm4gYmhfYmFja3VwOworfQorCisvKioKKyAqIHBhcnNlX250ZnNfYm9vdF9zZWN0b3IgLSBwYXJzZSB0aGUgYm9vdCBzZWN0b3IgYW5kIHN0b3JlIHRoZSBkYXRhIGluIEB2b2wKKyAqIEB2b2w6CXZvbHVtZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGlzZSB3aXRoIGRhdGEgZnJvbSBib290IHNlY3RvcgorICogQGI6CQlib290IHNlY3RvciB0byBwYXJzZQorICoKKyAqIFBhcnNlIHRoZSBudGZzIGJvb3Qgc2VjdG9yIEBiIGFuZCBzdG9yZSBhbGwgaW1wb3JhbnQgaW5mb3JtYXRpb24gdGhlcmVpbiBpbgorICogdGhlIG50ZnMgc3VwZXIgYmxvY2sgQHZvbC4gIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IE5URlNfQk9PVF9TRUNUT1IgKmIpCit7CisJdW5zaWduZWQgaW50IHNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0cywgbnJfaGlkZGVuX3NlY3RzOworCWludCBjbHVzdGVyc19wZXJfbWZ0X3JlY29yZCwgY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZDsKKwlzNjQgbGw7CisKKwl2b2wtPnNlY3Rvcl9zaXplID0gbGUxNl90b19jcHUoYi0+YnBiLmJ5dGVzX3Blcl9zZWN0b3IpOworCXZvbC0+c2VjdG9yX3NpemVfYml0cyA9IGZmcyh2b2wtPnNlY3Rvcl9zaXplKSAtIDE7CisJbnRmc19kZWJ1Zygidm9sLT5zZWN0b3Jfc2l6ZSA9ICVpICgweCV4KSIsIHZvbC0+c2VjdG9yX3NpemUsCisJCQl2b2wtPnNlY3Rvcl9zaXplKTsKKwludGZzX2RlYnVnKCJ2b2wtPnNlY3Rvcl9zaXplX2JpdHMgPSAlaSAoMHgleCkiLCB2b2wtPnNlY3Rvcl9zaXplX2JpdHMsCisJCQl2b2wtPnNlY3Rvcl9zaXplX2JpdHMpOworCWlmICh2b2wtPnNlY3Rvcl9zaXplICE9IHZvbC0+c2ItPnNfYmxvY2tzaXplKQorCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlRoZSBib290IHNlY3RvciBpbmRpY2F0ZXMgYSBzZWN0b3Igc2l6ZSAiCisJCQkJImRpZmZlcmVudCBmcm9tIHRoZSBkZXZpY2Ugc2VjdG9yIHNpemUuIik7CisJbnRmc19kZWJ1Zygic2VjdG9yc19wZXJfY2x1c3RlciA9IDB4JXgiLCBiLT5icGIuc2VjdG9yc19wZXJfY2x1c3Rlcik7CisJc2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzID0gZmZzKGItPmJwYi5zZWN0b3JzX3Blcl9jbHVzdGVyKSAtIDE7CisJbnRmc19kZWJ1Zygic2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzID0gMHgleCIsCisJCQlzZWN0b3JzX3Blcl9jbHVzdGVyX2JpdHMpOworCW5yX2hpZGRlbl9zZWN0cyA9IGxlMzJfdG9fY3B1KGItPmJwYi5oaWRkZW5fc2VjdG9ycyk7CisJbnRmc19kZWJ1ZygibnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzID0gMHgleCIsIG5yX2hpZGRlbl9zZWN0cyk7CisJdm9sLT5jbHVzdGVyX3NpemUgPSB2b2wtPnNlY3Rvcl9zaXplIDw8IHNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0czsKKwl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrID0gdm9sLT5jbHVzdGVyX3NpemUgLSAxOworCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPSBmZnModm9sLT5jbHVzdGVyX3NpemUpIC0gMTsKKwludGZzX2RlYnVnKCJ2b2wtPmNsdXN0ZXJfc2l6ZSA9ICVpICgweCV4KSIsIHZvbC0+Y2x1c3Rlcl9zaXplLAorCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCW50ZnNfZGVidWcoInZvbC0+Y2x1c3Rlcl9zaXplX21hc2sgPSAweCV4Iiwgdm9sLT5jbHVzdGVyX3NpemVfbWFzayk7CisJbnRmc19kZWJ1Zygidm9sLT5jbHVzdGVyX3NpemVfYml0cyA9ICVpICgweCV4KSIsCisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKTsKKwlpZiAodm9sLT5zZWN0b3Jfc2l6ZSA+IHZvbC0+Y2x1c3Rlcl9zaXplKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlNlY3RvciBzaXplcyBhYm92ZSB0aGUgY2x1c3RlciBzaXplIGFyZSAiCisJCQkJIm5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAodm9sLT5zYi0+c19ibG9ja3NpemUgPiB2b2wtPmNsdXN0ZXJfc2l6ZSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJDbHVzdGVyIHNpemVzIHNtYWxsZXIgdGhhbiB0aGUgZGV2aWNlICIKKwkJCQkic2VjdG9yIHNpemUgYXJlIG5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwljbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA9IGItPmNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkOworCW50ZnNfZGVidWcoImNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkID0gJWkgKDB4JXgpIiwKKwkJCWNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkLCBjbHVzdGVyc19wZXJfbWZ0X3JlY29yZCk7CisJaWYgKGNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkID4gMCkKKwkJdm9sLT5tZnRfcmVjb3JkX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA8PAorCQkJCShmZnMoY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQpIC0gMSk7CisJZWxzZQorCQkvKgorCQkgKiBXaGVuIG1mdF9yZWNvcmRfc2l6ZSA8IGNsdXN0ZXJfc2l6ZSwgY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQKKwkJICogPSAtbG9nMihtZnRfcmVjb3JkX3NpemUpIGJ5dGVzLiBtZnRfcmVjb3JkX3NpemUgbm9ybWFseSBpcworCQkgKiAxMDI0IGJ5dGVzLCB3aGljaCBpcyBlbmNvZGVkIGFzIDB4RjYgKC0xMCBpbiBkZWNpbWFsKS4KKwkJICovCisJCXZvbC0+bWZ0X3JlY29yZF9zaXplID0gMSA8PCAtY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQ7CisJdm9sLT5tZnRfcmVjb3JkX3NpemVfbWFzayA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIC0gMTsKKwl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID0gZmZzKHZvbC0+bWZ0X3JlY29yZF9zaXplKSAtIDE7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfcmVjb3JkX3NpemUgPSAlaSAoMHgleCkiLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSwKKwkJCXZvbC0+bWZ0X3JlY29yZF9zaXplKTsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9yZWNvcmRfc2l6ZV9tYXNrID0gMHgleCIsCisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9tYXNrKTsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID0gJWkgKDB4JXgpIiwKKwkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMsIHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpOworCS8qCisJICogV2UgY2Fubm90IHN1cHBvcnQgbWZ0IHJlY29yZCBzaXplcyBhYm92ZSB0aGUgUEFHRV9DQUNIRV9TSVpFIHNpbmNlCisJICogd2Ugc3RvcmUgJE1GVC8kREFUQSwgdGhlIHRhYmxlIG9mIG1mdCByZWNvcmRzIGluIHRoZSBwYWdlIGNhY2hlLgorCSAqLworCWlmICh2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJNZnQgcmVjb3JkIHNpemUgJWkgKDB4JXgpIGV4Y2VlZHMgdGhlICIKKwkJCQkicGFnZSBjYWNoZSBzaXplIG9uIHlvdXIgc3lzdGVtICVsdSAoMHglbHgpLiAgIgorCQkJCSJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iLAorCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSwKKwkJCQlQQUdFX0NBQ0hFX1NJWkUsIFBBR0VfQ0FDSEVfU0laRSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA9IGItPmNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQ7CisJbnRmc19kZWJ1ZygiY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA9ICVpICgweCV4KSIsCisJCQljbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkLCBjbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkKTsKKwlpZiAoY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA+IDApCisJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA8PAorCQkJCShmZnMoY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCkgLSAxKTsKKwllbHNlCisJCS8qCisJCSAqIFdoZW4gaW5kZXhfcmVjb3JkX3NpemUgPCBjbHVzdGVyX3NpemUsCisJCSAqIGNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQgPSAtbG9nMihpbmRleF9yZWNvcmRfc2l6ZSkgYnl0ZXMuCisJCSAqIGluZGV4X3JlY29yZF9zaXplIG5vcm1hbHkgZXF1YWxzIDQwOTYgYnl0ZXMsIHdoaWNoIGlzCisJCSAqIGVuY29kZWQgYXMgMHhGNCAoLTEyIGluIGRlY2ltYWwpLgorCQkgKi8KKwkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZSA9IDEgPDwgLWNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQ7CisJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9tYXNrID0gdm9sLT5pbmRleF9yZWNvcmRfc2l6ZSAtIDE7CisJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzID0gZmZzKHZvbC0+aW5kZXhfcmVjb3JkX3NpemUpIC0gMTsKKwludGZzX2RlYnVnKCJ2b2wtPmluZGV4X3JlY29yZF9zaXplID0gJWkgKDB4JXgpIiwKKwkJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemUsIHZvbC0+aW5kZXhfcmVjb3JkX3NpemUpOworCW50ZnNfZGVidWcoInZvbC0+aW5kZXhfcmVjb3JkX3NpemVfbWFzayA9IDB4JXgiLAorCQkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9tYXNrKTsKKwludGZzX2RlYnVnKCJ2b2wtPmluZGV4X3JlY29yZF9zaXplX2JpdHMgPSAlaSAoMHgleCkiLAorCQkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzLAorCQkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzKTsKKwkvKgorCSAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgdm9sdW1lIGluIGNsdXN0ZXJzIGFuZCBjaGVjayBmb3IgNjQtYml0LW5lc3MuCisJICogV2luZG93cyBjdXJyZW50bHkgb25seSB1c2VzIDMyIGJpdHMgdG8gc2F2ZSB0aGUgY2x1c3RlcnMgc28gd2UgZG8KKwkgKiB0aGUgc2FtZSBhcyBpdCBpcyBtdWNoIGZhc3RlciBvbiAzMi1iaXQgQ1BVcy4KKwkgKi8KKwlsbCA9IHNsZTY0X3RvX2NwdShiLT5udW1iZXJfb2Zfc2VjdG9ycykgPj4gc2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzOworCWlmICgodTY0KWxsID49IDFVTEwgPDwgMzIpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ2Fubm90IGhhbmRsZSA2NC1iaXQgY2x1c3RlcnMuICBTb3JyeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPm5yX2NsdXN0ZXJzID0gbGw7CisJbnRmc19kZWJ1Zygidm9sLT5ucl9jbHVzdGVycyA9IDB4JWxseCIsIChsb25nIGxvbmcpdm9sLT5ucl9jbHVzdGVycyk7CisJLyoKKwkgKiBPbiBhbiBhcmNoaXRlY3R1cmUgd2hlcmUgdW5zaWduZWQgbG9uZyBpcyAzMi1iaXRzLCB3ZSByZXN0cmljdCB0aGUKKwkgKiB2b2x1bWUgc2l6ZSB0byAyVGlCICgyXjQxKS4gT24gYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLCB0aGUgY29tcGlsZXIKKwkgKiB3aWxsIGhvcGVmdWxseSBvcHRpbWl6ZSB0aGUgd2hvbGUgY2hlY2sgYXdheS4KKwkgKi8KKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgOCkgeworCQlpZiAoKGxsIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpID49ICgxVUxMIDw8IDQxKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiVm9sdW1lIHNpemUgKCVsbHVUaUIpIGlzIHRvbyAiCisJCQkJCSJsYXJnZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICAiCisJCQkJCSJNYXhpbXVtIHN1cHBvcnRlZCBpcyAyVGlCLiAgU29ycnkuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsbCA+PiAoNDAgLQorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJbGwgPSBzbGU2NF90b19jcHUoYi0+bWZ0X2xjbik7CisJaWYgKGxsID49IHZvbC0+bnJfY2x1c3RlcnMpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTUZUIExDTiBpcyBiZXlvbmQgZW5kIG9mIHZvbHVtZS4gIFdlaXJkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+bWZ0X2xjbiA9IGxsOworCW50ZnNfZGVidWcoInZvbC0+bWZ0X2xjbiA9IDB4JWxseCIsIChsb25nIGxvbmcpdm9sLT5tZnRfbGNuKTsKKwlsbCA9IHNsZTY0X3RvX2NwdShiLT5tZnRtaXJyX2xjbik7CisJaWYgKGxsID49IHZvbC0+bnJfY2x1c3RlcnMpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTUZUTWlyciBMQ04gaXMgYmV5b25kIGVuZCBvZiB2b2x1bWUuICAiCisJCQkJIldlaXJkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+bWZ0bWlycl9sY24gPSBsbDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdG1pcnJfbGNuID0gMHglbGx4IiwgKGxvbmcgbG9uZyl2b2wtPm1mdG1pcnJfbGNuKTsKKyNpZmRlZiBOVEZTX1JXCisJLyoKKwkgKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgbWZ0IG1pcnJvciBpbiBudW1iZXIgb2YgbWZ0IHJlY29yZHMuIElmIHRoZQorCSAqIGNsdXN0ZXIgc2l6ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgdGFrZW4gYnkgZm91ciBtZnQKKwkgKiByZWNvcmRzLCB0aGUgbWZ0IG1pcnJvciBzdG9yZXMgdGhlIGZpcnN0IGZvdXIgbWZ0IHJlY29yZHMuIElmIHRoZQorCSAqIGNsdXN0ZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGUgc2l6ZSB0YWtlbiBieSBmb3VyIG1mdCByZWNvcmRzLCB0aGUKKwkgKiBtZnQgbWlycm9yIGNvbnRhaW5zIGFzIG1hbnkgbWZ0IHJlY29yZHMgYXMgd2lsbCBmaXQgaW50byBvbmUKKwkgKiBjbHVzdGVyLgorCSAqLworCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSAoNCA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSkKKwkJdm9sLT5tZnRtaXJyX3NpemUgPSA0OworCWVsc2UKKwkJdm9sLT5tZnRtaXJyX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA+PgorCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRtaXJyX3NpemUgPSAlaSIsIHZvbC0+bWZ0bWlycl9zaXplKTsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJdm9sLT5zZXJpYWxfbm8gPSBsZTY0X3RvX2NwdShiLT52b2x1bWVfc2VyaWFsX251bWJlcik7CisJbnRmc19kZWJ1Zygidm9sLT5zZXJpYWxfbm8gPSAweCVsbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPnNlcmlhbF9ubyk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbnRmc19zZXR1cF9hbGxvY2F0b3JzIC0gaW5pdGlhbGl6ZSB0aGUgY2x1c3RlciBhbmQgbWZ0IGFsbG9jYXRvcnMKKyAqIEB2b2w6CXZvbHVtZSBzdHJ1Y3R1cmUgZm9yIHdoaWNoIHRvIHNldHVwIHRoZSBhbGxvY2F0b3JzCisgKgorICogU2V0dXAgdGhlIGNsdXN0ZXIgKGxjbikgYW5kIG1mdCBhbGxvY2F0b3JzIHRvIHRoZSBzdGFydGluZyB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkIG50ZnNfc2V0dXBfYWxsb2NhdG9ycyhudGZzX3ZvbHVtZSAqdm9sKQoreworI2lmZGVmIE5URlNfUlcKKwlMQ04gbWZ0X3pvbmVfc2l6ZSwgbWZ0X2xjbjsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF96b25lX211bHRpcGxpZXIgPSAweCV4IiwKKwkJCXZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllcik7CisjaWZkZWYgTlRGU19SVworCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgTUZUIHpvbmUuICovCisJbWZ0X3pvbmVfc2l6ZSA9IHZvbC0+bnJfY2x1c3RlcnM7CisJc3dpdGNoICh2b2wtPm1mdF96b25lX211bHRpcGxpZXIpIHsgIC8qICUgb2Ygdm9sdW1lIHNpemUgaW4gY2x1c3RlcnMgKi8KKwljYXNlIDQ6CisJCW1mdF96b25lX3NpemUgPj49IDE7CQkJLyogNTAlICAgKi8KKwkJYnJlYWs7CisJY2FzZSAzOgorCQltZnRfem9uZV9zaXplID0gKG1mdF96b25lX3NpemUgKworCQkJCShtZnRfem9uZV9zaXplID4+IDEpKSA+PiAyOwkvKiAzNy41JSAqLworCQlicmVhazsKKwljYXNlIDI6CisJCW1mdF96b25lX3NpemUgPj49IDI7CQkJLyogMjUlICAgKi8KKwkJYnJlYWs7CisJLyogY2FzZSAxOiAqLworCWRlZmF1bHQ6CisJCW1mdF96b25lX3NpemUgPj49IDM7CQkJLyogMTIuNSUgKi8KKwkJYnJlYWs7CisJfQorCS8qIFNldHVwIHRoZSBtZnQgem9uZS4gKi8KKwl2b2wtPm1mdF96b25lX3N0YXJ0ID0gdm9sLT5tZnRfem9uZV9wb3MgPSB2b2wtPm1mdF9sY247CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfem9uZV9wb3MgPSAweCVsbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX3Bvcyk7CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIG1mdF9sY24gZm9yIGFuIHVubW9kaWZpZWQgTlRGUyB2b2x1bWUgKHNlZSBta250ZnMKKwkgKiBzb3VyY2UpIGFuZCBpZiB0aGUgYWN0dWFsIG1mdF9sY24gaXMgaW4gdGhlIGV4cGVjdGVkIHBsYWNlIG9yIGV2ZW4KKwkgKiBmdXJ0aGVyIHRvIHRoZSBmcm9udCBvZiB0aGUgdm9sdW1lLCBleHRlbmQgdGhlIG1mdF96b25lIHRvIGNvdmVyIHRoZQorCSAqIGJlZ2lubmluZyBvZiB0aGUgdm9sdW1lIGFzIHdlbGwuICBUaGlzIGlzIGluIG9yZGVyIHRvIHByb3RlY3QgdGhlCisJICogYXJlYSByZXNlcnZlZCBmb3IgdGhlIG1mdCBiaXRtYXAgYXMgd2VsbCB3aXRoaW4gdGhlIG1mdF96b25lIGl0c2VsZi4KKwkgKiBPbiBub24tc3RhbmRhcmQgdm9sdW1lcyB3ZSBkbyBub3QgcHJvdGVjdCBpdCBhcyB0aGUgb3ZlcmhlYWQgd291bGQKKwkgKiBiZSBoaWdoZXIgdGhhbiB0aGUgc3BlZWQgaW5jcmVhc2Ugd2Ugd291bGQgZ2V0IGJ5IGRvaW5nIGl0LgorCSAqLworCW1mdF9sY24gPSAoODE5MiArIDIgKiB2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpIC8gdm9sLT5jbHVzdGVyX3NpemU7CisJaWYgKG1mdF9sY24gKiB2b2wtPmNsdXN0ZXJfc2l6ZSA8IDE2ICogMTAyNCkKKwkJbWZ0X2xjbiA9ICgxNiAqIDEwMjQgKyB2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpIC8KKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZTsKKwlpZiAodm9sLT5tZnRfem9uZV9zdGFydCA8PSBtZnRfbGNuKQorCQl2b2wtPm1mdF96b25lX3N0YXJ0ID0gMDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF96b25lX3N0YXJ0ID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9zdGFydCk7CisJLyoKKwkgKiBOZWVkIHRvIGNhcCB0aGUgbWZ0IHpvbmUgb24gbm9uLXN0YW5kYXJkIHZvbHVtZXMgc28gdGhhdCBpdCBkb2VzCisJICogbm90IHBvaW50IG91dHNpZGUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHZvbHVtZS4gIFdlIGRvIHRoaXMgYnkKKwkgKiBoYWx2aW5nIHRoZSB6b25lIHNpemUgdW50aWwgd2UgYXJlIGluc2lkZSB0aGUgdm9sdW1lLgorCSAqLworCXZvbC0+bWZ0X3pvbmVfZW5kID0gdm9sLT5tZnRfbGNuICsgbWZ0X3pvbmVfc2l6ZTsKKwl3aGlsZSAodm9sLT5tZnRfem9uZV9lbmQgPj0gdm9sLT5ucl9jbHVzdGVycykgeworCQltZnRfem9uZV9zaXplID4+PSAxOworCQl2b2wtPm1mdF96b25lX2VuZCA9IHZvbC0+bWZ0X2xjbiArIG1mdF96b25lX3NpemU7CisJfQorCW50ZnNfZGVidWcoInZvbC0+bWZ0X3pvbmVfZW5kID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9lbmQpOworCS8qCisJICogU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBlYWNoIGRhdGEgem9uZSB0byB0aGUgc3RhcnQgb2YgdGhlCisJICogcmVzcGVjdGl2ZSB6b25lLgorCSAqLworCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB2b2wtPm1mdF96b25lX2VuZDsKKwludGZzX2RlYnVnKCJ2b2wtPmRhdGExX3pvbmVfcG9zID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5kYXRhMV96b25lX3Bvcyk7CisJdm9sLT5kYXRhMl96b25lX3BvcyA9IDA7CisJbnRmc19kZWJ1Zygidm9sLT5kYXRhMl96b25lX3BvcyA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTJfem9uZV9wb3MpOworCisJLyogU2V0IHRoZSBtZnQgZGF0YSBhbGxvY2F0aW9uIHBvc2l0aW9uIHRvIG1mdCByZWNvcmQgMjQuICovCisJdm9sLT5tZnRfZGF0YV9wb3MgPSAyNDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9kYXRhX3BvcyA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X2RhdGFfcG9zKTsKKyNlbmRpZiAvKiBOVEZTX1JXICovCit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbG9hZF9hbmRfaW5pdF9tZnRfbWlycm9yIC0gbG9hZCBhbmQgc2V0dXAgdGhlIG1mdCBtaXJyb3IgaW5vZGUgZm9yIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIG1mdCBtaXJyb3IgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfbWZ0X21pcnJvcihudGZzX3ZvbHVtZSAqdm9sKQoreworCXN0cnVjdCBpbm9kZSAqdG1wX2lubzsKKwludGZzX2lub2RlICp0bXBfbmk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBHZXQgbWZ0IG1pcnJvciBpbm9kZS4gKi8KKwl0bXBfaW5vID0gbnRmc19pZ2V0KHZvbC0+c2IsIEZJTEVfTUZUTWlycik7CisJaWYgKElTX0VSUih0bXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodG1wX2lubykpIHsKKwkJaWYgKCFJU19FUlIodG1wX2lubykpCisJCQlpcHV0KHRtcF9pbm8pOworCQkvKiBDYWxsZXIgd2lsbCBkaXNwbGF5IGVycm9yIG1lc3NhZ2UuICovCisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBSZS1pbml0aWFsaXplIHNvbWUgc3BlY2lmaWNzIGFib3V0ICRNRlRNaXJyJ3MgaW5vZGUgYXMKKwkgKiBudGZzX3JlYWRfaW5vZGUoKSB3aWxsIGhhdmUgc2V0IHVwIHRoZSBkZWZhdWx0IG9uZXMuCisJICovCisJLyogU2V0IHVpZCBhbmQgZ2lkIHRvIHJvb3QuICovCisJdG1wX2luby0+aV91aWQgPSB0bXBfaW5vLT5pX2dpZCA9IDA7CisJLyogUmVndWxhciBmaWxlLiAgTm8gYWNjZXNzIGZvciBhbnlvbmUuICovCisJdG1wX2luby0+aV9tb2RlID0gU19JRlJFRzsKKwkvKiBObyBWRlMgaW5pdGlhdGVkIG9wZXJhdGlvbnMgYWxsb3dlZCBmb3IgJE1GVE1pcnIuICovCisJdG1wX2luby0+aV9vcCA9ICZudGZzX2VtcHR5X2lub2RlX29wczsKKwl0bXBfaW5vLT5pX2ZvcCA9ICZudGZzX2VtcHR5X2ZpbGVfb3BzOworCS8qIFB1dCBpbiBvdXIgc3BlY2lhbCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMuICovCisJdG1wX2luby0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCXRtcF9uaSA9IE5URlNfSSh0bXBfaW5vKTsKKwkvKiBUaGUgJE1GVE1pcnIsIGxpa2UgdGhlICRNRlQgaXMgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3RlZC4gKi8KKwlOSW5vU2V0TXN0UHJvdGVjdGVkKHRtcF9uaSk7CisJLyoKKwkgKiBTZXQgdXAgb3VyIGxpdHRsZSBjaGVhdCBhbGxvd2luZyB1cyB0byByZXVzZSB0aGUgYXN5bmMgcmVhZCBpbworCSAqIGNvbXBsZXRpb24gaGFuZGxlciBmb3IgZGlyZWN0b3JpZXMuCisJICovCisJdG1wX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJdG1wX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCXZvbC0+bWZ0bWlycl9pbm8gPSB0bXBfaW5vOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogY2hlY2tfbWZ0X21pcnJvciAtIGNvbXBhcmUgY29udGVudHMgb2YgdGhlIG1mdCBtaXJyb3Igd2l0aCB0aGUgbWZ0CisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIG1mdCBtaXJyb3IgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICoKKyAqIE5vdGUsIHRoaXMgZnVuY3Rpb24gYWxzbyByZXN1bHRzIGluIHRoZSBtZnQgbWlycm9yIHJ1bmxpc3QgYmVpbmcgY29tcGxldGVseQorICogbWFwcGVkIGludG8gbWVtb3J5LiAgVGhlIG1mdCBtaXJyb3Igd3JpdGUgY29kZSByZXF1aXJlcyB0aGlzIGFuZCB3aWxsIEJVRygpCisgKiBzaG91bGQgaXQgZmluZCBhbiB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQuCisgKi8KK3N0YXRpYyBCT09MIGNoZWNrX21mdF9taXJyb3IobnRmc192b2x1bWUgKnZvbCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCW50ZnNfaW5vZGUgKm1pcnJfbmk7CisJc3RydWN0IHBhZ2UgKm1mdF9wYWdlLCAqbWlycl9wYWdlOworCXU4ICprbWZ0LCAqa21pcnI7CisJcnVubGlzdF9lbGVtZW50ICpybCwgcmwyWzJdOworCWludCBtcmVjc19wZXJfcGFnZSwgaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIENvbXBhcmUgY29udGVudHMgb2YgJE1GVCBhbmQgJE1GVE1pcnIuICovCisJbXJlY3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlCVUdfT04oIW1yZWNzX3Blcl9wYWdlKTsKKwlCVUdfT04oIXZvbC0+bWZ0bWlycl9zaXplKTsKKwltZnRfcGFnZSA9IG1pcnJfcGFnZSA9IE5VTEw7CisJa21mdCA9IGttaXJyID0gTlVMTDsKKwlpbmRleCA9IGkgPSAwOworCWRvIHsKKwkJdTMyIGJ5dGVzOworCisJCS8qIFN3aXRjaCBwYWdlcyBpZiBuZWNlc3NhcnkuICovCisJCWlmICghKGkgJSBtcmVjc19wZXJfcGFnZSkpIHsKKwkJCWlmIChpbmRleCkgeworCQkJCW50ZnNfdW5tYXBfcGFnZShtZnRfcGFnZSk7CisJCQkJbnRmc191bm1hcF9wYWdlKG1pcnJfcGFnZSk7CisJCQl9CisJCQkvKiBHZXQgdGhlICRNRlQgcGFnZS4gKi8KKwkJCW1mdF9wYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPm1mdF9pbm8tPmlfbWFwcGluZywKKwkJCQkJaW5kZXgpOworCQkJaWYgKElTX0VSUihtZnRfcGFnZSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHJlYWQgJE1GVC4iKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlrbWZ0ID0gcGFnZV9hZGRyZXNzKG1mdF9wYWdlKTsKKwkJCS8qIEdldCB0aGUgJE1GVE1pcnIgcGFnZS4gKi8KKwkJCW1pcnJfcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5tZnRtaXJyX2luby0+aV9tYXBwaW5nLAorCQkJCQlpbmRleCk7CisJCQlpZiAoSVNfRVJSKG1pcnJfcGFnZSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHJlYWQgJE1GVE1pcnIuIik7CisJCQkJZ290byBtZnRfdW5tYXBfb3V0OworCQkJfQorCQkJa21pcnIgPSBwYWdlX2FkZHJlc3MobWlycl9wYWdlKTsKKwkJCSsraW5kZXg7CisJCX0KKwkJLyogTWFrZSBzdXJlIHRoZSByZWNvcmQgaXMgb2suICovCisJCWlmIChudGZzX2lzX2JhYWRfcmVjb3JkcCgobGUzMiopa21mdCkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciAiCisJCQkJCSJkZXRlY3RlZCBpbiBtZnQgcmVjb3JkICVpLiIsIGkpOworbW1fdW5tYXBfb3V0OgorCQkJbnRmc191bm1hcF9wYWdlKG1pcnJfcGFnZSk7CittZnRfdW5tYXBfb3V0OgorCQkJbnRmc191bm1hcF9wYWdlKG1mdF9wYWdlKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAobnRmc19pc19iYWFkX3JlY29yZHAoKGxlMzIqKWttaXJyKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluY29tcGxldGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyICIKKwkJCQkJImRldGVjdGVkIGluIG1mdCBtaXJyb3IgcmVjb3JkICVpLiIsIGkpOworCQkJZ290byBtbV91bm1hcF9vdXQ7CisJCX0KKwkJLyogR2V0IHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgY3VycmVudCByZWNvcmQuICovCisJCWJ5dGVzID0gbGUzMl90b19jcHUoKChNRlRfUkVDT1JEKilrbWZ0KS0+Ynl0ZXNfaW5fdXNlKTsKKwkJaWYgKCFieXRlcyB8fCBieXRlcyA+IHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CisJCQlieXRlcyA9IGxlMzJfdG9fY3B1KCgoTUZUX1JFQ09SRCopa21pcnIpLT5ieXRlc19pbl91c2UpOworCQkJaWYgKCFieXRlcyB8fCBieXRlcyA+IHZvbC0+bWZ0X3JlY29yZF9zaXplKQorCQkJCWJ5dGVzID0gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJCX0KKwkJLyogQ29tcGFyZSB0aGUgdHdvIHJlY29yZHMuICovCisJCWlmIChtZW1jbXAoa21mdCwga21pcnIsIGJ5dGVzKSkgeworCQkJbnRmc19lcnJvcihzYiwgIiRNRlQgYW5kICRNRlRNaXJyIChyZWNvcmQgJWkpIGRvIG5vdCAiCisJCQkJCSJtYXRjaC4gIFJ1biBudGZzZml4IG9yIGNoa2Rzay4iLCBpKTsKKwkJCWdvdG8gbW1fdW5tYXBfb3V0OworCQl9CisJCWttZnQgKz0gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJCWttaXJyICs9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCX0gd2hpbGUgKCsraSA8IHZvbC0+bWZ0bWlycl9zaXplKTsKKwkvKiBSZWxlYXNlIHRoZSBsYXN0IHBhZ2VzLiAqLworCW50ZnNfdW5tYXBfcGFnZShtZnRfcGFnZSk7CisJbnRmc191bm1hcF9wYWdlKG1pcnJfcGFnZSk7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIG1mdCBtaXJyb3IgcnVubGlzdCBieSBoYW5kLiAqLworCXJsMlswXS52Y24gPSAwOworCXJsMlswXS5sY24gPSB2b2wtPm1mdG1pcnJfbGNuOworCXJsMlswXS5sZW5ndGggPSAodm9sLT5tZnRtaXJyX3NpemUgKiB2b2wtPm1mdF9yZWNvcmRfc2l6ZSArCisJCQl2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpIC8gdm9sLT5jbHVzdGVyX3NpemU7CisJcmwyWzFdLnZjbiA9IHJsMlswXS5sZW5ndGg7CisJcmwyWzFdLmxjbiA9IExDTl9FTk9FTlQ7CisJcmwyWzFdLmxlbmd0aCA9IDA7CisJLyoKKwkgKiBCZWNhdXNlIHdlIGhhdmUganVzdCByZWFkIGFsbCBvZiB0aGUgbWZ0IG1pcnJvciwgd2Uga25vdyB3ZSBoYXZlCisJICogbWFwcGVkIHRoZSBmdWxsIHJ1bmxpc3QgZm9yIGl0LgorCSAqLworCW1pcnJfbmkgPSBOVEZTX0kodm9sLT5tZnRtaXJyX2lubyk7CisJZG93bl9yZWFkKCZtaXJyX25pLT5ydW5saXN0LmxvY2spOworCXJsID0gbWlycl9uaS0+cnVubGlzdC5ybDsKKwkvKiBDb21wYXJlIHRoZSB0d28gcnVubGlzdHMuICBUaGV5IG11c3QgYmUgaWRlbnRpY2FsLiAqLworCWkgPSAwOworCWRvIHsKKwkJaWYgKHJsMltpXS52Y24gIT0gcmxbaV0udmNuIHx8IHJsMltpXS5sY24gIT0gcmxbaV0ubGNuIHx8CisJCQkJcmwyW2ldLmxlbmd0aCAhPSBybFtpXS5sZW5ndGgpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUTWlyciBsb2NhdGlvbiBtaXNtYXRjaC4gICIKKwkJCQkJIlJ1biBjaGtkc2suIik7CisJCQl1cF9yZWFkKCZtaXJyX25pLT5ydW5saXN0LmxvY2spOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfSB3aGlsZSAocmwyW2krK10ubGVuZ3RoKTsKKwl1cF9yZWFkKCZtaXJyX25pLT5ydW5saXN0LmxvY2spOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbG9hZF9hbmRfY2hlY2tfbG9nZmlsZSAtIGxvYWQgYW5kIGNoZWNrIHRoZSBsb2dmaWxlIGlub2RlIGZvciBhIHZvbHVtZQorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBsb2dmaWxlIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9jaGVja19sb2dmaWxlKG50ZnNfdm9sdW1lICp2b2wpCit7CisJc3RydWN0IGlub2RlICp0bXBfaW5vOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJdG1wX2lubyA9IG50ZnNfaWdldCh2b2wtPnNiLCBGSUxFX0xvZ0ZpbGUpOworCWlmIChJU19FUlIodG1wX2lubykgfHwgaXNfYmFkX2lub2RlKHRtcF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHRtcF9pbm8pKQorCQkJaXB1dCh0bXBfaW5vKTsKKwkJLyogQ2FsbGVyIHdpbGwgZGlzcGxheSBlcnJvciBtZXNzYWdlLiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICghbnRmc19jaGVja19sb2dmaWxlKHRtcF9pbm8pKSB7CisJCWlwdXQodG1wX2lubyk7CisJCS8qIG50ZnNfY2hlY2tfbG9nZmlsZSgpIHdpbGwgaGF2ZSBkaXNwbGF5ZWQgZXJyb3Igb3V0cHV0LiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+bG9nZmlsZV9pbm8gPSB0bXBfaW5vOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbG9hZF9hbmRfaW5pdF9xdW90YSAtIGxvYWQgYW5kIHNldHVwIHRoZSBxdW90YSBmaWxlIGZvciBhIHZvbHVtZSBpZiBwcmVzZW50CisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIHF1b3RhIGZpbGUgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuICBJZiAkUXVvdGEgaXMgbm90IHByZXNlbnQsIHdlCisgKiBsZWF2ZSB2b2wtPnF1b3RhX2lubyBhcyBOVUxMIGFuZCByZXR1cm4gc3VjY2Vzcy4KKyAqLworc3RhdGljIEJPT0wgbG9hZF9hbmRfaW5pdF9xdW90YShudGZzX3ZvbHVtZSAqdm9sKQoreworCU1GVF9SRUYgbXJlZjsKKwlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm87CisJbnRmc19uYW1lICpuYW1lID0gTlVMTDsKKwlzdGF0aWMgY29uc3QgbnRmc2NoYXIgUXVvdGFbN10gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignUScpLCBjb25zdF9jcHVfdG9fbGUxNigndScpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ28nKSwgY29uc3RfY3B1X3RvX2xlMTYoJ3QnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdhJyksIDAgfTsKKwlzdGF0aWMgbnRmc2NoYXIgUVszXSA9IHsgY29uc3RfY3B1X3RvX2xlMTYoJyQnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdRJyksIDAgfTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qCisJICogRmluZCB0aGUgaW5vZGUgbnVtYmVyIGZvciB0aGUgcXVvdGEgZmlsZSBieSBsb29raW5nIHVwIHRoZSBmaWxlbmFtZQorCSAqICRRdW90YSBpbiB0aGUgZXh0ZW5kZWQgc3lzdGVtIGZpbGVzIGRpcmVjdG9yeSAkRXh0ZW5kLgorCSAqLworCWRvd24oJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCW1yZWYgPSBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKE5URlNfSSh2b2wtPmV4dGVuZF9pbm8pLCBRdW90YSwgNiwKKwkJCSZuYW1lKTsKKwl1cCgmdm9sLT5leHRlbmRfaW5vLT5pX3NlbSk7CisJaWYgKElTX0VSUl9NUkVGKG1yZWYpKSB7CisJCS8qCisJCSAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBxdW90YXMgYXJlIGRpc2FibGVkIGFuZCBoYXZlCisJCSAqIG5ldmVyIGJlZW4gZW5hYmxlZCBvbiB0aGlzIHZvbHVtZSwganVzdCByZXR1cm4gc3VjY2Vzcy4KKwkJICovCisJCWlmIChNUkVGX0VSUihtcmVmKSA9PSAtRU5PRU5UKSB7CisJCQludGZzX2RlYnVnKCIkUXVvdGEgbm90IHByZXNlbnQuICBWb2x1bWUgZG9lcyBub3QgaGF2ZSAiCisJCQkJCSJxdW90YXMgZW5hYmxlZC4iKTsKKwkJCS8qCisJCQkgKiBObyBuZWVkIHRvIHRyeSB0byBzZXQgcXVvdGFzIG91dCBvZiBkYXRlIGlmIHRoZXkgYXJlCisJCQkgKiBub3QgZW5hYmxlZC4KKwkJCSAqLworCQkJTlZvbFNldFF1b3RhT3V0T2ZEYXRlKHZvbCk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQkvKiBBIHJlYWwgZXJyb3Igb2NjdXJlZC4gKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgaW5vZGUgbnVtYmVyIGZvciAkUXVvdGEuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogV2UgZG8gbm90IGNhcmUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgd2FzIGZvdW5kLiAqLworCWlmIChuYW1lKQorCQlrZnJlZShuYW1lKTsKKwkvKiBHZXQgdGhlIGlub2RlLiAqLworCXRtcF9pbm8gPSBudGZzX2lnZXQodm9sLT5zYiwgTVJFRihtcmVmKSk7CisJaWYgKElTX0VSUih0bXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodG1wX2lubykpIHsKKwkJaWYgKCFJU19FUlIodG1wX2lubykpCisJCQlpcHV0KHRtcF9pbm8pOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCAkUXVvdGEuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT5xdW90YV9pbm8gPSB0bXBfaW5vOworCS8qIEdldCB0aGUgJFEgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUuICovCisJdG1wX2lubyA9IG50ZnNfaW5kZXhfaWdldCh2b2wtPnF1b3RhX2lubywgUSwgMik7CisJaWYgKElTX0VSUih0bXBfaW5vKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCAkUXVvdGEvJFEgaW5kZXguIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT5xdW90YV9xX2lubyA9IHRtcF9pbm87CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsb2FkX2FuZF9pbml0X2F0dHJkZWYgLSBsb2FkIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgdGFibGUgZm9yIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIGF0dHJkZWYgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfYXR0cmRlZihudGZzX3ZvbHVtZSAqdm9sKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXN0cnVjdCBpbm9kZSAqaW5vOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIFJlYWQgYXR0cmRlZiB0YWJsZSBhbmQgc2V0dXAgdm9sLT5hdHRyZGVmIGFuZCB2b2wtPmF0dHJkZWZfc2l6ZS4gKi8KKwlpbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfQXR0ckRlZik7CisJaWYgKElTX0VSUihpbm8pIHx8IGlzX2JhZF9pbm9kZShpbm8pKSB7CisJCWlmICghSVNfRVJSKGlubykpCisJCQlpcHV0KGlubyk7CisJCWdvdG8gZmFpbGVkOworCX0KKwkvKiBUaGUgc2l6ZSBvZiBGSUxFX0F0dHJEZWYgbXVzdCBiZSBhYm92ZSAwIGFuZCBmaXQgaW5zaWRlIDMxIGJpdHMuICovCisJaWYgKCFpbm8tPmlfc2l6ZSB8fCBpbm8tPmlfc2l6ZSA+IDB4N2ZmZmZmZmYpCisJCWdvdG8gaXB1dF9mYWlsZWQ7CisJdm9sLT5hdHRyZGVmID0gKEFUVFJfREVGKiludGZzX21hbGxvY19ub2ZzKGluby0+aV9zaXplKTsKKwlpZiAoIXZvbC0+YXR0cmRlZikKKwkJZ290byBpcHV0X2ZhaWxlZDsKKwlpbmRleCA9IDA7CisJbWF4X2luZGV4ID0gaW5vLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXdoaWxlIChpbmRleCA8IG1heF9pbmRleCkgeworCQkvKiBSZWFkIHRoZSBhdHRyZGVmIHRhYmxlIGFuZCBjb3B5IGl0IGludG8gdGhlIGxpbmVhciBidWZmZXIuICovCityZWFkX3BhcnRpYWxfYXR0cmRlZl9wYWdlOgorCQlwYWdlID0gbnRmc19tYXBfcGFnZShpbm8tPmlfbWFwcGluZywgaW5kZXgpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJZ290byBmcmVlX2lwdXRfZmFpbGVkOworCQltZW1jcHkoKHU4Kil2b2wtPmF0dHJkZWYgKyAoaW5kZXgrKyA8PCBQQUdFX0NBQ0hFX1NISUZUKSwKKwkJCQlwYWdlX2FkZHJlc3MocGFnZSksIHNpemUpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJfTsKKwlpZiAoc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJc2l6ZSA9IGluby0+aV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkJaWYgKHNpemUpCisJCQlnb3RvIHJlYWRfcGFydGlhbF9hdHRyZGVmX3BhZ2U7CisJfQorCXZvbC0+YXR0cmRlZl9zaXplID0gaW5vLT5pX3NpemU7CisJbnRmc19kZWJ1ZygiUmVhZCAlbGx1IGJ5dGVzIGZyb20gJEF0dHJEZWYuIiwgaW5vLT5pX3NpemUpOworCWlwdXQoaW5vKTsKKwlyZXR1cm4gVFJVRTsKK2ZyZWVfaXB1dF9mYWlsZWQ6CisJbnRmc19mcmVlKHZvbC0+YXR0cmRlZik7CisJdm9sLT5hdHRyZGVmID0gTlVMTDsKK2lwdXRfZmFpbGVkOgorCWlwdXQoaW5vKTsKK2ZhaWxlZDoKKwludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgYXR0cmlidXRlIGRlZmluaXRpb24gdGFibGUuIik7CisJcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisvKioKKyAqIGxvYWRfYW5kX2luaXRfdXBjYXNlIC0gbG9hZCB0aGUgdXBjYXNlIHRhYmxlIGZvciBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSB1cGNhc2UgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfdXBjYXNlKG50ZnNfdm9sdW1lICp2b2wpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CisJc3RydWN0IGlub2RlICppbm87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBpbmRleCwgbWF4X2luZGV4OworCXVuc2lnbmVkIGludCBzaXplOworCWludCBpLCBtYXg7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBSZWFkIHVwY2FzZSB0YWJsZSBhbmQgc2V0dXAgdm9sLT51cGNhc2UgYW5kIHZvbC0+dXBjYXNlX2xlbi4gKi8KKwlpbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfVXBDYXNlKTsKKwlpZiAoSVNfRVJSKGlubykgfHwgaXNfYmFkX2lub2RlKGlubykpIHsKKwkJaWYgKCFJU19FUlIoaW5vKSkKKwkJCWlwdXQoaW5vKTsKKwkJZ290byB1cGNhc2VfZmFpbGVkOworCX0KKwkvKgorCSAqIFRoZSB1cGNhc2Ugc2l6ZSBtdXN0IG5vdCBiZSBhYm92ZSA2NGsgVW5pY29kZSBjaGFyYWN0ZXJzLCBtdXN0IG5vdAorCSAqIGJlIHplcm8gYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXplb2YobnRmc2NoYXIpLgorCSAqLworCWlmICghaW5vLT5pX3NpemUgfHwgaW5vLT5pX3NpemUgJiAoc2l6ZW9mKG50ZnNjaGFyKSAtIDEpIHx8CisJCQlpbm8tPmlfc2l6ZSA+IDY0VUxMICogMTAyNCAqIHNpemVvZihudGZzY2hhcikpCisJCWdvdG8gaXB1dF91cGNhc2VfZmFpbGVkOworCXZvbC0+dXBjYXNlID0gKG50ZnNjaGFyKiludGZzX21hbGxvY19ub2ZzKGluby0+aV9zaXplKTsKKwlpZiAoIXZvbC0+dXBjYXNlKQorCQlnb3RvIGlwdXRfdXBjYXNlX2ZhaWxlZDsKKwlpbmRleCA9IDA7CisJbWF4X2luZGV4ID0gaW5vLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXdoaWxlIChpbmRleCA8IG1heF9pbmRleCkgeworCQkvKiBSZWFkIHRoZSB1cGNhc2UgdGFibGUgYW5kIGNvcHkgaXQgaW50byB0aGUgbGluZWFyIGJ1ZmZlci4gKi8KK3JlYWRfcGFydGlhbF91cGNhc2VfcGFnZToKKwkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaW5vLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gaXB1dF91cGNhc2VfZmFpbGVkOworCQltZW1jcHkoKGNoYXIqKXZvbC0+dXBjYXNlICsgKGluZGV4KysgPDwgUEFHRV9DQUNIRV9TSElGVCksCisJCQkJcGFnZV9hZGRyZXNzKHBhZ2UpLCBzaXplKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCX07CisJaWYgKHNpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCXNpemUgPSBpbm8tPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWlmIChzaXplKQorCQkJZ290byByZWFkX3BhcnRpYWxfdXBjYXNlX3BhZ2U7CisJfQorCXZvbC0+dXBjYXNlX2xlbiA9IGluby0+aV9zaXplID4+IFVDSEFSX1RfU0laRV9CSVRTOworCW50ZnNfZGVidWcoIlJlYWQgJWxsdSBieXRlcyBmcm9tICRVcENhc2UgKGV4cGVjdGVkICV6dSBieXRlcykuIiwKKwkJCWluby0+aV9zaXplLCA2NCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKTsKKwlpcHV0KGlubyk7CisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAoIWRlZmF1bHRfdXBjYXNlKSB7CisJCW50ZnNfZGVidWcoIlVzaW5nIHZvbHVtZSBzcGVjaWZpZWQgJFVwQ2FzZSBzaW5jZSBkZWZhdWx0IGlzICIKKwkJCQkibm90IHByZXNlbnQuIik7CisJCXVwKCZudGZzX2xvY2spOworCQlyZXR1cm4gVFJVRTsKKwl9CisJbWF4ID0gZGVmYXVsdF91cGNhc2VfbGVuOworCWlmIChtYXggPiB2b2wtPnVwY2FzZV9sZW4pCisJCW1heCA9IHZvbC0+dXBjYXNlX2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCisJCWlmICh2b2wtPnVwY2FzZVtpXSAhPSBkZWZhdWx0X3VwY2FzZVtpXSkKKwkJCWJyZWFrOworCWlmIChpID09IG1heCkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IGRlZmF1bHRfdXBjYXNlOworCQl2b2wtPnVwY2FzZV9sZW4gPSBtYXg7CisJCW50ZnNfbnJfdXBjYXNlX3VzZXJzKys7CisJCXVwKCZudGZzX2xvY2spOworCQludGZzX2RlYnVnKCJWb2x1bWUgc3BlY2lmaWVkICRVcENhc2UgbWF0Y2hlcyBkZWZhdWx0LiBVc2luZyAiCisJCQkJImRlZmF1bHQuIik7CisJCXJldHVybiBUUlVFOworCX0KKwl1cCgmbnRmc19sb2NrKTsKKwludGZzX2RlYnVnKCJVc2luZyB2b2x1bWUgc3BlY2lmaWVkICRVcENhc2Ugc2luY2UgaXQgZG9lcyBub3QgbWF0Y2ggIgorCQkJInRoZSBkZWZhdWx0LiIpOworCXJldHVybiBUUlVFOworaXB1dF91cGNhc2VfZmFpbGVkOgorCWlwdXQoaW5vKTsKKwludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCXZvbC0+dXBjYXNlID0gTlVMTDsKK3VwY2FzZV9mYWlsZWQ6CisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAoZGVmYXVsdF91cGNhc2UpIHsKKwkJdm9sLT51cGNhc2UgPSBkZWZhdWx0X3VwY2FzZTsKKwkJdm9sLT51cGNhc2VfbGVuID0gZGVmYXVsdF91cGNhc2VfbGVuOworCQludGZzX25yX3VwY2FzZV91c2VycysrOworCQl1cCgmbnRmc19sb2NrKTsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRVcENhc2UgZnJvbSB0aGUgdm9sdW1lLiBVc2luZyAiCisJCQkJImRlZmF1bHQuIik7CisJCXJldHVybiBUUlVFOworCX0KKwl1cCgmbnRmc19sb2NrKTsKKwludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgdXBjYXNlIHRhYmxlLiIpOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBsb2FkX3N5c3RlbV9maWxlcyAtIG9wZW4gdGhlIHN5c3RlbSBmaWxlcyB1c2luZyBub3JtYWwgZnVuY3Rpb25zCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIHN5c3RlbSBmaWxlcyB0byBsb2FkCisgKgorICogT3BlbiB0aGUgc3lzdGVtIGZpbGVzIHdpdGggbm9ybWFsIGFjY2VzcyBmdW5jdGlvbnMgYW5kIGNvbXBsZXRlIHNldHRpbmcgdXAKKyAqIHRoZSBudGZzIHN1cGVyIGJsb2NrIEB2b2wuCisgKgorICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBlcnJvci4KKyAqLworc3RhdGljIEJPT0wgbG9hZF9zeXN0ZW1fZmlsZXMobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlNRlRfUkVDT1JEICptOworCVZPTFVNRV9JTkZPUk1BVElPTiAqdmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworI2lmZGVmIE5URlNfUlcKKwkvKiBHZXQgbWZ0IG1pcnJvciBpbm9kZSBjb21wYXJlIHRoZSBjb250ZW50cyBvZiAkTUZUIGFuZCAkTUZUTWlyci4gKi8KKwlpZiAoIWxvYWRfYW5kX2luaXRfbWZ0X21pcnJvcih2b2wpIHx8ICFjaGVja19tZnRfbWlycm9yKHZvbCkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gbG9hZCAkTUZUTWlyciI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiJE1GVE1pcnIgZG9lcyBub3QgbWF0Y2ggJE1GVCI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczMgPSAiLiAgUnVuIG50ZnNmaXggYW5kL29yIGNoa2Rzay4iOworCisJCS8qIElmIGEgcmVhZC13cml0ZSBtb3VudCwgY29udmVydCBpdCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz0iCisJCQkJCQkiY29udGludWUgbm9yIG9uX2Vycm9ycz0iCisJCQkJCQkicmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQkJIXZvbC0+bWZ0bWlycl9pbm8gPyBlczEgOiBlczIsCisJCQkJCQllczMpOworCQkJCWdvdG8gaXB1dF9taXJyX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwKKwkJCQkJIXZvbC0+bWZ0bWlycl9pbm8gPyBlczEgOiBlczIsIGVzMyk7CisJCX0gZWxzZQorCQkJbnRmc193YXJuaW5nKHNiLCAiJXMuICBXaWxsIG5vdCBiZSBhYmxlIHRvIHJlbW91bnQgIgorCQkJCQkicmVhZC13cml0ZSVzIiwKKwkJCQkJIXZvbC0+bWZ0bWlycl9pbm8gPyBlczEgOiBlczIsIGVzMyk7CisJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKiBHZXQgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgaW5vZGUuICovCisJdm9sLT5tZnRibXBfaW5vID0gbnRmc19hdHRyX2lnZXQodm9sLT5tZnRfaW5vLCBBVF9CSVRNQVAsIE5VTEwsIDApOworCWlmIChJU19FUlIodm9sLT5tZnRibXBfaW5vKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJE1GVC8kQklUTUFQIGF0dHJpYnV0ZS4iKTsKKwkJZ290byBpcHV0X21pcnJfZXJyX291dDsKKwl9CisJLyogUmVhZCB1cGNhc2UgdGFibGUgYW5kIHNldHVwIEB2b2wtPnVwY2FzZSBhbmQgQHZvbC0+dXBjYXNlX2xlbi4gKi8KKwlpZiAoIWxvYWRfYW5kX2luaXRfdXBjYXNlKHZvbCkpCisJCWdvdG8gaXB1dF9tZnRibXBfZXJyX291dDsKKyNpZmRlZiBOVEZTX1JXCisJLyoKKwkgKiBSZWFkIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyB0YWJsZSBhbmQgc2V0dXAgQHZvbC0+YXR0cmRlZiBhbmQKKwkgKiBAdm9sLT5hdHRyZGVmX3NpemUuCisJICovCisJaWYgKCFsb2FkX2FuZF9pbml0X2F0dHJkZWYodm9sKSkKKwkJZ290byBpcHV0X3VwY2FzZV9lcnJfb3V0OworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKgorCSAqIEdldCB0aGUgY2x1c3RlciBhbGxvY2F0aW9uIGJpdG1hcCBpbm9kZSBhbmQgdmVyaWZ5IHRoZSBzaXplLCBubworCSAqIG5lZWQgZm9yIGFueSBsb2NraW5nIGF0IHRoaXMgc3RhZ2UgYXMgd2UgYXJlIGFscmVhZHkgcnVubmluZworCSAqIGV4Y2x1c2l2ZWx5IGFzIHdlIGFyZSBtb3VudCBpbiBwcm9ncmVzcyB0YXNrLgorCSAqLworCXZvbC0+bGNuYm1wX2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9CaXRtYXApOworCWlmIChJU19FUlIodm9sLT5sY25ibXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5sY25ibXBfaW5vKSkgeworCQlpZiAoIUlTX0VSUih2b2wtPmxjbmJtcF9pbm8pKQorCQkJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworCQlnb3RvIGJpdG1hcF9mYWlsZWQ7CisJfQorCWlmICgodm9sLT5ucl9jbHVzdGVycyArIDcpID4+IDMgPiB2b2wtPmxjbmJtcF9pbm8tPmlfc2l6ZSkgeworCQlpcHV0KHZvbC0+bGNuYm1wX2lubyk7CitiaXRtYXBfZmFpbGVkOgorCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJEJpdG1hcC4iKTsKKwkJZ290byBpcHV0X2F0dHJkZWZfZXJyX291dDsKKwl9CisJLyoKKwkgKiBHZXQgdGhlIHZvbHVtZSBpbm9kZSBhbmQgc2V0dXAgb3VyIGNhY2hlIG9mIHRoZSB2b2x1bWUgZmxhZ3MgYW5kCisJICogdmVyc2lvbi4KKwkgKi8KKwl2b2wtPnZvbF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfVm9sdW1lKTsKKwlpZiAoSVNfRVJSKHZvbC0+dm9sX2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+dm9sX2lubykpIHsKKwkJaWYgKCFJU19FUlIodm9sLT52b2xfaW5vKSkKKwkJCWlwdXQodm9sLT52b2xfaW5vKTsKK3ZvbHVtZV9mYWlsZWQ6CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCAkVm9sdW1lLiIpOworCQlnb3RvIGlwdXRfbGNuYm1wX2Vycl9vdXQ7CisJfQorCW0gPSBtYXBfbWZ0X3JlY29yZChOVEZTX0kodm9sLT52b2xfaW5vKSk7CisJaWYgKElTX0VSUihtKSkgeworaXB1dF92b2x1bWVfZmFpbGVkOgorCQlpcHV0KHZvbC0+dm9sX2lubyk7CisJCWdvdG8gdm9sdW1lX2ZhaWxlZDsKKwl9CisJaWYgKCEoY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KE5URlNfSSh2b2wtPnZvbF9pbm8pLCBtKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBnZXQgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0LiIpOworCQlnb3RvIGdldF9jdHhfdm9sX2ZhaWxlZDsKKwl9CisJaWYgKG50ZnNfYXR0cl9sb29rdXAoQVRfVk9MVU1FX0lORk9STUFUSU9OLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLAorCQkJY3R4KSB8fCBjdHgtPmF0dHItPm5vbl9yZXNpZGVudCB8fCBjdHgtPmF0dHItPmZsYWdzKSB7CitlcnJfcHV0X3ZvbDoKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CitnZXRfY3R4X3ZvbF9mYWlsZWQ6CisJCXVubWFwX21mdF9yZWNvcmQoTlRGU19JKHZvbC0+dm9sX2lubykpOworCQlnb3RvIGlwdXRfdm9sdW1lX2ZhaWxlZDsKKwl9CisJdmkgPSAoVk9MVU1FX0lORk9STUFUSU9OKikoKGNoYXIqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJLyogU29tZSBib3VuZHMgY2hlY2tzLiAqLworCWlmICgodTgqKXZpIDwgKHU4KiljdHgtPmF0dHIgfHwgKHU4Kil2aSArCisJCQlsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSA+CisJCQkodTgqKWN0eC0+YXR0ciArIGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+bGVuZ3RoKSkKKwkJZ290byBlcnJfcHV0X3ZvbDsKKwkvKiBDb3B5IHRoZSB2b2x1bWUgZmxhZ3MgYW5kIHZlcnNpb24gdG8gdGhlIG50ZnNfdm9sdW1lIHN0cnVjdHVyZS4gKi8KKwl2b2wtPnZvbF9mbGFncyA9IHZpLT5mbGFnczsKKwl2b2wtPm1ham9yX3ZlciA9IHZpLT5tYWpvcl92ZXI7CisJdm9sLT5taW5vcl92ZXIgPSB2aS0+bWlub3JfdmVyOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoTlRGU19JKHZvbC0+dm9sX2lubykpOworCXByaW50ayhLRVJOX0lORk8gIk5URlMgdm9sdW1lIHZlcnNpb24gJWkuJWkuXG4iLCB2b2wtPm1ham9yX3ZlciwKKwkJCXZvbC0+bWlub3JfdmVyKTsKKyNpZmRlZiBOVEZTX1JXCisJLyogTWFrZSBzdXJlIHRoYXQgbm8gdW5zdXBwb3J0ZWQgdm9sdW1lIGZsYWdzIGFyZSBzZXQuICovCisJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSykgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYSA9ICJWb2x1bWUgaXMgZGlydHkiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYiA9ICJWb2x1bWUgaGFzIHVuc3VwcG9ydGVkIGZsYWdzIHNldCI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2RzayBhbmQgbW91bnQgaW4gV2luZG93cy4iOworCQljb25zdCBjaGFyICplczE7CisJCQorCQllczEgPSB2b2wtPnZvbF9mbGFncyAmIFZPTFVNRV9JU19ESVJUWSA/IGVzMWEgOiBlczFiOworCQkvKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQsIGNvbnZlcnQgaXQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9IgorCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgorCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJCWVzMSwgZXMyKTsKKwkJCQlnb3RvIGlwdXRfdm9sX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsIGVzMSwgZXMyKTsKKwkJLyoKKwkJICogRG8gbm90IHNldCBOVm9sRXJyb3JzKCkgYmVjYXVzZSBudGZzX3JlbW91bnQoKSByZS1jaGVja3MgdGhlCisJCSAqIGZsYWdzIHdoaWNoIHdlIG5lZWQgdG8gZG8gaW4gY2FzZSBhbnkgZmxhZ3MgaGF2ZSBjaGFuZ2VkLgorCQkgKi8KKwl9CisJLyoKKwkgKiBHZXQgdGhlIGlub2RlIGZvciB0aGUgbG9nZmlsZSwgY2hlY2sgaXQgYW5kIGRldGVybWluZSBpZiB0aGUgdm9sdW1lCisJICogd2FzIHNodXRkb3duIGNsZWFubHkuCisJICovCisJaWYgKCFsb2FkX2FuZF9jaGVja19sb2dmaWxlKHZvbCkgfHwKKwkJCSFudGZzX2lzX2xvZ2ZpbGVfY2xlYW4odm9sLT5sb2dmaWxlX2lubykpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWEgPSAiRmFpbGVkIHRvIGxvYWQgJExvZ0ZpbGUiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYiA9ICIkTG9nRmlsZSBpcyBub3QgY2xlYW4iOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIE1vdW50IGluIFdpbmRvd3MuIjsKKwkJY29uc3QgY2hhciAqZXMxOworCisJCWVzMSA9ICF2b2wtPmxvZ2ZpbGVfaW5vID8gZXMxYSA6IGVzMWI7CisJCS8qIElmIGEgcmVhZC13cml0ZSBtb3VudCwgY29udmVydCBpdCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz0iCisJCQkJCQkiY29udGludWUgbm9yIG9uX2Vycm9ycz0iCisJCQkJCQkicmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQkJZXMxLCBlczIpOworCQkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsIGVzMSwgZXMyKTsKKwkJLyogVGhpcyB3aWxsIHByZXZlbnQgYSByZWFkLXdyaXRlIHJlbW91bnQuICovCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJLyogSWYgKHN0aWxsKSBhIHJlYWQtd3JpdGUgbW91bnQsIG1hcmsgdGhlIHZvbHVtZSBkaXJ0eS4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkJCW50ZnNfc2V0X3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gc2V0IGRpcnR5IGJpdCBpbiB2b2x1bWUgIgorCQkJCSJpbmZvcm1hdGlvbiBmbGFncyI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2Rzay4iOworCisJCS8qIENvbnZlcnQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz1jb250aW51ZSBub3IgIgorCQkJCQkib25fZXJyb3JzPXJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJZXMxLCBlczIpOworCQkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCS8qCisJCSAqIERvIG5vdCBzZXQgTlZvbEVycm9ycygpIGJlY2F1c2UgbnRmc19yZW1vdW50KCkgbWlnaHQgbWFuYWdlCisJCSAqIHRvIHNldCB0aGUgZGlydHkgZmxhZyBpbiB3aGljaCBjYXNlIGFsbCB3b3VsZCBiZSB3ZWxsLgorCQkgKi8KKwl9CisjaWYgMAorCS8vIFRPRE86IEVuYWJsZSB0aGlzIGNvZGUgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgYW55dGhpbmcgdGhhdCBpcworCS8vCSBkaWZmZXJlbnQgYmV0d2VlbiBOVEZTIDEuMiBhbmQgMy54Li4uCisJLyoKKwkgKiBJZiAoc3RpbGwpIGEgcmVhZC13cml0ZSBtb3VudCwgc2V0IHRoZSBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIG9uCisJICogbmV3ZXIgTlRGUyB2ZXJzaW9uIHZvbHVtZXMuCisJICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmICh2b2wtPm1ham9yX3ZlciA+IDEpICYmCisJCQludGZzX3NldF92b2x1bWVfZmxhZ3Modm9sLCBWT0xVTUVfTU9VTlRFRF9PTl9OVDQpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIHNldCBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBSdW4gY2hrZHNrLiI7CisKKwkJLyogQ29udmVydCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPWNvbnRpbnVlIG5vciAiCisJCQkJCSJvbl9lcnJvcnM9cmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQllczEsIGVzMik7CisJCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKyNlbmRpZgorCS8qIElmIChzdGlsbCkgYSByZWFkLXdyaXRlIG1vdW50LCBlbXB0eSB0aGUgbG9nZmlsZS4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkJCSFudGZzX2VtcHR5X2xvZ2ZpbGUodm9sLT5sb2dmaWxlX2lubykpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gZW1wdHkgJExvZ0ZpbGUiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIE1vdW50IGluIFdpbmRvd3MuIjsKKworCQkvKiBDb252ZXJ0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKKwkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCWVzMSwgZXMyKTsKKwkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCX0KKwkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKiBHZXQgdGhlIHJvb3QgZGlyZWN0b3J5IGlub2RlLiAqLworCXZvbC0+cm9vdF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfcm9vdCk7CisJaWYgKElTX0VSUih2b2wtPnJvb3RfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5yb290X2lubykpIHsKKwkJaWYgKCFJU19FUlIodm9sLT5yb290X2lubykpCisJCQlpcHV0KHZvbC0+cm9vdF9pbm8pOworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgcm9vdCBkaXJlY3RvcnkuIik7CisJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJfQorCS8qIElmIG9uIE5URlMgdmVyc2lvbnMgYmVmb3JlIDMuMCwgd2UgYXJlIGRvbmUuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyIDwgMykKKwkJcmV0dXJuIFRSVUU7CisJLyogTlRGUyAzLjArIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAqLworCS8qIEdldCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvcnMgaW5vZGUuICovCisJdm9sLT5zZWN1cmVfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX1NlY3VyZSk7CisJaWYgKElTX0VSUih2b2wtPnNlY3VyZV9pbm8pIHx8IGlzX2JhZF9pbm9kZSh2b2wtPnNlY3VyZV9pbm8pKSB7CisJCWlmICghSVNfRVJSKHZvbC0+c2VjdXJlX2lubykpCisJCQlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCAkU2VjdXJlLiIpOworCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OworCX0KKwkvLyBGSVhNRTogSW5pdGlhbGl6ZSBzZWN1cml0eS4KKwkvKiBHZXQgdGhlIGV4dGVuZGVkIHN5c3RlbSBmaWxlcycgZGlyZWN0b3J5IGlub2RlLiAqLworCXZvbC0+ZXh0ZW5kX2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9FeHRlbmQpOworCWlmIChJU19FUlIodm9sLT5leHRlbmRfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5leHRlbmRfaW5vKSkgeworCQlpZiAoIUlTX0VSUih2b2wtPmV4dGVuZF9pbm8pKQorCQkJaXB1dCh2b2wtPmV4dGVuZF9pbm8pOworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJEV4dGVuZC4iKTsKKwkJZ290byBpcHV0X3NlY19lcnJfb3V0OworCX0KKyNpZmRlZiBOVEZTX1JXCisJLyogRmluZCB0aGUgcXVvdGEgZmlsZSwgbG9hZCBpdCBpZiBwcmVzZW50LCBhbmQgc2V0IGl0IHVwLiAqLworCWlmICghbG9hZF9hbmRfaW5pdF9xdW90YSh2b2wpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIGxvYWQgJFF1b3RhIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBSdW4gY2hrZHNrLiI7CisKKwkJLyogSWYgYSByZWFkLXdyaXRlIG1vdW50LCBjb252ZXJ0IGl0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPSIKKwkJCQkJCSJjb250aW51ZSBub3Igb25fZXJyb3JzPSIKKwkJCQkJCSJyZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCQllczEsIGVzMik7CisJCQkJZ290byBpcHV0X3F1b3RhX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsIGVzMSwgZXMyKTsKKwkJLyogVGhpcyB3aWxsIHByZXZlbnQgYSByZWFkLXdyaXRlIHJlbW91bnQuICovCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJLyogSWYgKHN0aWxsKSBhIHJlYWQtd3JpdGUgbW91bnQsIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZS4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkJCSFudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlKHZvbCkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gbWFyayBxdW90YXMgb3V0IG9mIGRhdGUiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2suIjsKKworCQkvKiBDb252ZXJ0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKKwkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCWVzMSwgZXMyKTsKKwkJCWdvdG8gaXB1dF9xdW90YV9lcnJfb3V0OworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwkvLyBUT0RPOiBEZWxldGUgb3IgY2hlY2twb2ludCB0aGUgJFVzbkpybmwgaWYgaXQgZXhpc3RzLgorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwlyZXR1cm4gVFJVRTsKKyNpZmRlZiBOVEZTX1JXCitpcHV0X3F1b3RhX2Vycl9vdXQ6CisJaWYgKHZvbC0+cXVvdGFfcV9pbm8pCisJCWlwdXQodm9sLT5xdW90YV9xX2lubyk7CisJaWYgKHZvbC0+cXVvdGFfaW5vKQorCQlpcHV0KHZvbC0+cXVvdGFfaW5vKTsKKwlpcHV0KHZvbC0+ZXh0ZW5kX2lubyk7CisjZW5kaWYgLyogTlRGU19SVyAqLworaXB1dF9zZWNfZXJyX291dDoKKwlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CitpcHV0X3Jvb3RfZXJyX291dDoKKwlpcHV0KHZvbC0+cm9vdF9pbm8pOworaXB1dF9sb2dmaWxlX2Vycl9vdXQ6CisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKQorCQlpcHV0KHZvbC0+bG9nZmlsZV9pbm8pOworaXB1dF92b2xfZXJyX291dDoKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJaXB1dCh2b2wtPnZvbF9pbm8pOworaXB1dF9sY25ibXBfZXJyX291dDoKKwlpcHV0KHZvbC0+bGNuYm1wX2lubyk7CitpcHV0X2F0dHJkZWZfZXJyX291dDoKKwl2b2wtPmF0dHJkZWZfc2l6ZSA9IDA7CisJaWYgKHZvbC0+YXR0cmRlZikgeworCQludGZzX2ZyZWUodm9sLT5hdHRyZGVmKTsKKwkJdm9sLT5hdHRyZGVmID0gTlVMTDsKKwl9CisjaWZkZWYgTlRGU19SVworaXB1dF91cGNhc2VfZXJyX291dDoKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJdm9sLT51cGNhc2VfbGVuID0gMDsKKwlkb3duKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSA9PSBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX25yX3VwY2FzZV91c2Vycy0tOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCXVwKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQoraXB1dF9tZnRibXBfZXJyX291dDoKKwlpcHV0KHZvbC0+bWZ0Ym1wX2lubyk7CitpcHV0X21pcnJfZXJyX291dDoKKyNpZmRlZiBOVEZTX1JXCisJaWYgKHZvbC0+bWZ0bWlycl9pbm8pCisJCWlwdXQodm9sLT5tZnRtaXJyX2lubyk7CisjZW5kaWYgLyogTlRGU19SVyAqLworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX3B1dF9zdXBlciAtIGNhbGxlZCBieSB0aGUgdmZzIHRvIHVubW91bnQgYSB2b2x1bWUKKyAqIEBzYjoJCXZmcyBzdXBlcmJsb2NrIG9mIHZvbHVtZSB0byB1bm1vdW50CisgKgorICogbnRmc19wdXRfc3VwZXIoKSBpcyBjYWxsZWQgYnkgdGhlIFZGUyAoZnJvbSBmcy9zdXBlci5jOjpkb191bW91bnQoKSkgd2hlbgorICogdGhlIHZvbHVtZSBpcyBiZWluZyB1bm1vdW50ZWQgKHVtb3VudCBzeXN0ZW0gY2FsbCBoYXMgYmVlbiBpbnZva2VkKSBhbmQgaXQKKyAqIHJlbGVhc2VzIGFsbCBpbm9kZXMgYW5kIG1lbW9yeSBiZWxvbmdpbmcgdG8gdGhlIE5URlMgc3BlY2lmaWMgcGFydCBvZiB0aGUKKyAqIHN1cGVyIGJsb2NrLgorICovCitzdGF0aWMgdm9pZCBudGZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworI2lmZGVmIE5URlNfUlcKKwkvKgorCSAqIENvbW1pdCBhbGwgaW5vZGVzIHdoaWxlIHRoZXkgYXJlIHN0aWxsIG9wZW4gaW4gY2FzZSBzb21lIG9mIHRoZW0KKwkgKiBjYXVzZSBvdGhlcnMgdG8gYmUgZGlydGllZC4KKwkgKi8KKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnZvbF9pbm8pOworCisJLyogTlRGUyAzLjArIHNwZWNpZmljLiAqLworCWlmICh2b2wtPm1ham9yX3ZlciA+PSAzKSB7CisJCWlmICh2b2wtPnF1b3RhX3FfaW5vKQorCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5xdW90YV9xX2lubyk7CisJCWlmICh2b2wtPnF1b3RhX2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+cXVvdGFfaW5vKTsKKwkJaWYgKHZvbC0+ZXh0ZW5kX2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+ZXh0ZW5kX2lubyk7CisJCWlmICh2b2wtPnNlY3VyZV9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnNlY3VyZV9pbm8pOworCX0KKworCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+cm9vdF9pbm8pOworCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJbnRmc19jb21taXRfaW5vZGUodm9sLT5sY25ibXBfaW5vKTsKKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisKKwlkb3duX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdGJtcF9pbm8pOworCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKQorCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPmxvZ2ZpbGVfaW5vKTsKKworCWlmICh2b2wtPm1mdG1pcnJfaW5vKQorCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdG1pcnJfaW5vKTsKKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdF9pbm8pOworCisJLyoKKwkgKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQgYW5kIG5vIHZvbHVtZSBlcnJvcnMgaGF2ZSBvY2N1cmVkLCBtYXJrIHRoZQorCSAqIHZvbHVtZSBjbGVhbi4gIEFsc28sIHJlLWNvbW1pdCBhbGwgYWZmZWN0ZWQgaW5vZGVzLgorCSAqLworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlpZiAoIU5Wb2xFcnJvcnModm9sKSkgeworCQkJaWYgKG50ZnNfY2xlYXJfdm9sdW1lX2ZsYWdzKHZvbCwgVk9MVU1FX0lTX0RJUlRZKSkKKwkJCQludGZzX3dhcm5pbmcoc2IsICJGYWlsZWQgdG8gY2xlYXIgZGlydHkgYml0ICIKKwkJCQkJCSJpbiB2b2x1bWUgaW5mb3JtYXRpb24gIgorCQkJCQkJImZsYWdzLiAgUnVuIGNoa2Rzay4iKTsKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+dm9sX2lubyk7CisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnJvb3RfaW5vKTsKKwkJCWlmICh2b2wtPm1mdG1pcnJfaW5vKQorCQkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0bWlycl9pbm8pOworCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5tZnRfaW5vKTsKKwkJfSBlbHNlIHsKKwkJCW50ZnNfd2FybmluZyhzYiwgIlZvbHVtZSBoYXMgZXJyb3JzLiAgTGVhdmluZyB2b2x1bWUgIgorCQkJCQkibWFya2VkIGRpcnR5LiAgUnVuIGNoa2Rzay4iKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKwlpcHV0KHZvbC0+dm9sX2lubyk7CisJdm9sLT52b2xfaW5vID0gTlVMTDsKKworCS8qIE5URlMgMy4wKyBzcGVjaWZpYyBjbGVhbiB1cC4gKi8KKwlpZiAodm9sLT5tYWpvcl92ZXIgPj0gMykgeworI2lmZGVmIE5URlNfUlcKKwkJaWYgKHZvbC0+cXVvdGFfcV9pbm8pIHsKKwkJCWlwdXQodm9sLT5xdW90YV9xX2lubyk7CisJCQl2b2wtPnF1b3RhX3FfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT5xdW90YV9pbm8pIHsKKwkJCWlwdXQodm9sLT5xdW90YV9pbm8pOworCQkJdm9sLT5xdW90YV9pbm8gPSBOVUxMOworCQl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCQlpZiAodm9sLT5leHRlbmRfaW5vKSB7CisJCQlpcHV0KHZvbC0+ZXh0ZW5kX2lubyk7CisJCQl2b2wtPmV4dGVuZF9pbm8gPSBOVUxMOworCQl9CisJCWlmICh2b2wtPnNlY3VyZV9pbm8pIHsKKwkJCWlwdXQodm9sLT5zZWN1cmVfaW5vKTsKKwkJCXZvbC0+c2VjdXJlX2lubyA9IE5VTEw7CisJCX0KKwl9CisKKwlpcHV0KHZvbC0+cm9vdF9pbm8pOworCXZvbC0+cm9vdF9pbm8gPSBOVUxMOworCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworCXZvbC0+bGNuYm1wX2lubyA9IE5VTEw7CisJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJaXB1dCh2b2wtPm1mdGJtcF9pbm8pOworCXZvbC0+bWZ0Ym1wX2lubyA9IE5VTEw7CisJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKSB7CisJCWlwdXQodm9sLT5sb2dmaWxlX2lubyk7CisJCXZvbC0+bG9nZmlsZV9pbm8gPSBOVUxMOworCX0KKwlpZiAodm9sLT5tZnRtaXJyX2lubykgeworCQkvKiBSZS1jb21taXQgdGhlIG1mdCBtaXJyb3IgYW5kIG1mdCBqdXN0IGluIGNhc2UuICovCisJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0bWlycl9pbm8pOworCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdF9pbm8pOworCQlpcHV0KHZvbC0+bWZ0bWlycl9pbm8pOworCQl2b2wtPm1mdG1pcnJfaW5vID0gTlVMTDsKKwl9CisJLyoKKwkgKiBJZiBhbnkgZGlydHkgaW5vZGVzIGFyZSBsZWZ0LCB0aHJvdyBhd2F5IGFsbCBtZnQgZGF0YSBwYWdlIGNhY2hlCisJICogcGFnZXMgdG8gYWxsb3cgYSBjbGVhbiB1bW91bnQuICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYW55IG1vcmUKKwkgKiBkdWUgdG8gbWZ0LmM6Om50ZnNfbWZ0X3dyaXRlcGFnZSgpIGNsZWFuaW5nIGFsbCB0aGUgZGlydHkgcGFnZXMgYXMKKwkgKiB0aGUgdW5kZXJseWluZyBtZnQgcmVjb3JkcyBhcmUgd3JpdHRlbiBvdXQgYW5kIGNsZWFuZWQuICBJZiBpdCBkb2VzLAorCSAqIGhhcHBlbiBhbnl3YXksIHdlIHdhbnQgdG8ga25vdy4uLgorCSAqLworCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0X2lubyk7CisJd3JpdGVfaW5vZGVfbm93KHZvbC0+bWZ0X2lubywgMSk7CisJaWYgKCFsaXN0X2VtcHR5KCZzYi0+c19kaXJ0eSkpIHsKKwkJY29uc3QgY2hhciAqczEsICpzMjsKKworCQlkb3duKCZ2b2wtPm1mdF9pbm8tPmlfc2VtKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXModm9sLT5tZnRfaW5vLT5pX21hcHBpbmcsIDApOworCQl1cCgmdm9sLT5tZnRfaW5vLT5pX3NlbSk7CisJCXdyaXRlX2lub2RlX25vdyh2b2wtPm1mdF9pbm8sIDEpOworCQlpZiAoIWxpc3RfZW1wdHkoJnNiLT5zX2RpcnR5KSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgKl9zMSA9ICJpbm9kZXMiOworCQkJc3RhdGljIGNvbnN0IGNoYXIgKl9zMiA9ICIiOworCQkJczEgPSBfczE7CisJCQlzMiA9IF9zMjsKKwkJfSBlbHNlIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpfczEgPSAibWZ0IHBhZ2VzIjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpfczIgPSAiVGhleSBoYXZlIGJlZW4gdGhyb3duICIKKwkJCQkJImF3YXkuICAiOworCQkJczEgPSBfczE7CisJCQlzMiA9IF9zMjsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiRGlydHkgJXMgZm91bmQgYXQgdW1vdW50IHRpbWUuICAlc1lvdSBzaG91bGQgIgorCQkJCSJydW4gY2hrZHNrLiAgUGxlYXNlIGVtYWlsICIKKwkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IGFuZCBzYXkgIgorCQkJCSJ0aGF0IHlvdSBzYXcgdGhpcyBtZXNzYWdlLiAgVGhhbmsgeW91LiIsIHMxLAorCQkJCXMyKTsKKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJaXB1dCh2b2wtPm1mdF9pbm8pOworCXZvbC0+bWZ0X2lubyA9IE5VTEw7CisKKwkvKiBUaHJvdyBhd2F5IHRoZSB0YWJsZSBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuICovCisJdm9sLT5hdHRyZGVmX3NpemUgPSAwOworCWlmICh2b2wtPmF0dHJkZWYpIHsKKwkJbnRmc19mcmVlKHZvbC0+YXR0cmRlZik7CisJCXZvbC0+YXR0cmRlZiA9IE5VTEw7CisJfQorCXZvbC0+dXBjYXNlX2xlbiA9IDA7CisJLyoKKwkgKiBEZXN0cm95IHRoZSBnbG9iYWwgZGVmYXVsdCB1cGNhc2UgdGFibGUgaWYgbmVjZXNzYXJ5LiAgQWxzbyBkZWNyZWFzZQorCSAqIHRoZSBudW1iZXIgb2YgdXBjYXNlIHVzZXJzIGlmIHdlIGFyZSBhIHVzZXIuCisJICovCisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAodm9sLT51cGNhc2UgPT0gZGVmYXVsdF91cGNhc2UpIHsKKwkJbnRmc19ucl91cGNhc2VfdXNlcnMtLTsKKwkJdm9sLT51cGNhc2UgPSBOVUxMOworCX0KKwlpZiAoIW50ZnNfbnJfdXBjYXNlX3VzZXJzICYmIGRlZmF1bHRfdXBjYXNlKSB7CisJCW50ZnNfZnJlZShkZWZhdWx0X3VwY2FzZSk7CisJCWRlZmF1bHRfdXBjYXNlID0gTlVMTDsKKwl9CisJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IDQwOTYgJiYgIS0tbnRmc19ucl9jb21wcmVzc2lvbl91c2VycykKKwkJZnJlZV9jb21wcmVzc2lvbl9idWZmZXJzKCk7CisJdXAoJm50ZnNfbG9jayk7CisJaWYgKHZvbC0+dXBjYXNlKSB7CisJCW50ZnNfZnJlZSh2b2wtPnVwY2FzZSk7CisJCXZvbC0+dXBjYXNlID0gTlVMTDsKKwl9CisJaWYgKHZvbC0+bmxzX21hcCkgeworCQl1bmxvYWRfbmxzKHZvbC0+bmxzX21hcCk7CisJCXZvbC0+bmxzX21hcCA9IE5VTEw7CisJfQorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHZvbCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGdldF9ucl9mcmVlX2NsdXN0ZXJzIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyBvbiBhIHZvbHVtZQorICogQHZvbDoJbnRmcyB2b2x1bWUgZm9yIHdoaWNoIHRvIG9idGFpbiBmcmVlIGNsdXN0ZXIgY291bnQKKyAqCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBmcmVlIGNsdXN0ZXJzIG9uIHRoZSBtb3VudGVkIE5URlMgdm9sdW1lIEB2b2wuIFdlCisgKiBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB1c2UgaW5zdGVhZCBiZWNhdXNlIHRoaXMKKyAqIGFsbG93cyB1cyB0byBub3QgY2FyZSBhYm91dCBwYXJ0aWFsIHBhZ2VzIGFzIHRoZXNlIHdpbGwgYmUganVzdCB6ZXJvIGZpbGxlZAorICogYW5kIGhlbmNlIG5vdCBiZSBjb3VudGVkIGFzIGFsbG9jYXRlZCBjbHVzdGVycy4KKyAqCisgKiBUaGUgb25seSBwYXJ0aWN1bGFyaXR5IGlzIHRoYXQgY2x1c3RlcnMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxvZ2ljYWwgbnRmcworICogdm9sdW1lIHdpbGwgYmUgbWFya2VkIGFzIGFsbG9jYXRlZCB0byBwcmV2ZW50IGVycm9ycyB3aGljaCBtZWFucyB3ZSBoYXZlIHRvCisgKiBkaXNjb3VudCB0aG9zZSBhdCB0aGUgZW5kLiBUaGlzIGlzIGltcG9ydGFudCBhcyB0aGUgY2x1c3RlciBiaXRtYXAgYWx3YXlzCisgKiBoYXMgYSBzaXplIGluIG11bHRpcGxlcyBvZiA4IGJ5dGVzLCBpLmUuIHVwIHRvIDYzIGNsdXN0ZXJzIGNvdWxkIGJlIG91dHNpZGUKKyAqIHRoZSBsb2dpY2FsIHZvbHVtZSBhbmQgbWFya2VkIGluIHVzZSB3aGVuIHRoZXkgYXJlIG5vdCBhcyB0aGV5IGRvIG5vdCBleGlzdC4KKyAqCisgKiBJZiBhbnkgcGFnZXMgY2Fubm90IGJlIHJlYWQgd2UgYXNzdW1lIGFsbCBjbHVzdGVycyBpbiB0aGUgZXJyb3JpbmcgcGFnZXMgYXJlCisgKiBpbiB1c2UuIFRoaXMgbWVhbnMgd2UgcmV0dXJuIGFuIHVuZGVyZXN0aW1hdGUgb24gZXJyb3JzIHdoaWNoIGlzIGJldHRlciB0aGFuCisgKiBhbiBvdmVyZXN0aW1hdGUuCisgKi8KK3N0YXRpYyBzNjQgZ2V0X25yX2ZyZWVfY2x1c3RlcnMobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzNjQgbnJfZnJlZSA9IHZvbC0+bnJfY2x1c3RlcnM7CisJdTMyICprYWRkcjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZvbC0+bGNuYm1wX2luby0+aV9tYXBwaW5nOworCWZpbGxlcl90ICpyZWFkcGFnZSA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBTZXJpYWxpemUgYWNjZXNzZXMgdG8gdGhlIGNsdXN0ZXIgYml0bWFwLiAqLworCWRvd25fcmVhZCgmdm9sLT5sY25ibXBfbG9jayk7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSBudW1iZXIgb2YgYml0cyBpbnRvIGJ5dGVzIHJvdW5kZWQgdXAsIHRoZW4gY29udmVydCBpbnRvCisJICogbXVsdGlwbGVzIG9mIFBBR0VfQ0FDSEVfU0laRSwgcm91bmRpbmcgdXAgc28gdGhhdCBpZiB3ZSBoYXZlIG9uZQorCSAqIGZ1bGwgYW5kIG9uZSBwYXJ0aWFsIHBhZ2UgbWF4X2luZGV4ID0gMi4KKwkgKi8KKwltYXhfaW5kZXggPSAoKCh2b2wtPm5yX2NsdXN0ZXJzICsgNykgPj4gMykgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgorCQkJUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBVc2UgbXVsdGlwbGVzIG9mIDQgYnl0ZXMuICovCisJbWF4X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gMjsKKwludGZzX2RlYnVnKCJSZWFkaW5nICRCaXRtYXAsIG1heF9pbmRleCA9IDB4JWx4LCBtYXhfc2l6ZSA9IDB4JXguIiwKKwkJCW1heF9pbmRleCwgbWF4X3NpemUpOworCWZvciAoaW5kZXggPSAwVUw7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCBpOworCQkvKgorCQkgKiBSZWFkIHRoZSBwYWdlIGZyb20gcGFnZSBjYWNoZSwgZ2V0dGluZyBpdCBmcm9tIGJhY2tpbmcgc3RvcmUKKwkJICogaWYgbmVjZXNzYXJ5LCBhbmQgaW5jcmVtZW50IHRoZSB1c2UgY291bnQuCisJCSAqLworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LCAoZmlsbGVyX3QqKXJlYWRwYWdlLAorCQkJCU5VTEwpOworCQkvKiBJZ25vcmUgcGFnZXMgd2hpY2ggZXJyb3JlZCBzeW5jaHJvbm91c2x5LiAqLworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQludGZzX2RlYnVnKCJTeW5jIHJlYWRfY2FjaGVfcGFnZSgpIGVycm9yLiBTa2lwcGluZyAiCisJCQkJCSJwYWdlIChpbmRleCAweCVseCkuIiwgaW5kZXgpOworCQkJbnJfZnJlZSAtPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY29udGludWU7CisJCX0KKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJLyogSWdub3JlIHBhZ2VzIHdoaWNoIGVycm9yZWQgYXN5bmNocm9ub3VzbHkuICovCisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQludGZzX2RlYnVnKCJBc3luYyByZWFkX2NhY2hlX3BhZ2UoKSBlcnJvci4gU2tpcHBpbmcgIgorCQkJCQkicGFnZSAoaW5kZXggMHglbHgpLiIsIGluZGV4KTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCW5yX2ZyZWUgLT0gUEFHRV9DQUNIRV9TSVpFICogODsKKwkJCWNvbnRpbnVlOworCQl9CisJCWthZGRyID0gKHUzMiopa21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkvKgorCQkgKiBGb3IgZWFjaCA0IGJ5dGVzLCBzdWJ0cmFjdCB0aGUgbnVtYmVyIG9mIHNldCBiaXRzLiBJZiB0aGlzCisJCSAqIGlzIHRoZSBsYXN0IHBhZ2UgYW5kIGl0IGlzIHBhcnRpYWwgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYXMKKwkJICogaXQganVzdCBtZWFucyB3ZSBkbyBhIGxpdHRsZSBleHRyYSB3b3JrIGJ1dCBpdCB3b24ndCBhZmZlY3QKKwkJICogdGhlIHJlc3VsdCBhcyBhbGwgb3V0IG9mIHJhbmdlIGJ5dGVzIGFyZSBzZXQgdG8gemVybyBieQorCQkgKiBudGZzX3JlYWRwYWdlKCkuCisJCSAqLworCSAgCWZvciAoaSA9IDA7IGkgPCBtYXhfc2l6ZTsgaSsrKQorCQkJbnJfZnJlZSAtPSAoczY0KWh3ZWlnaHQzMihrYWRkcltpXSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwludGZzX2RlYnVnKCJGaW5pc2hlZCByZWFkaW5nICRCaXRtYXAsIGxhc3QgaW5kZXggPSAweCVseC4iLCBpbmRleCAtIDEpOworCS8qCisJICogRml4dXAgZm9yIGV2ZW50dWFsIGJpdHMgb3V0c2lkZSBsb2dpY2FsIG50ZnMgdm9sdW1lIChzZWUgZnVuY3Rpb24KKwkgKiBkZXNjcmlwdGlvbiBhYm92ZSkuCisJICovCisJaWYgKHZvbC0+bnJfY2x1c3RlcnMgJiA2MykKKwkJbnJfZnJlZSArPSA2NCAtICh2b2wtPm5yX2NsdXN0ZXJzICYgNjMpOworCXVwX3JlYWQoJnZvbC0+bGNuYm1wX2xvY2spOworCS8qIElmIGVycm9ycyBvY2N1cmVkIHdlIG1heSB3ZWxsIGhhdmUgZ29uZSBiZWxvdyB6ZXJvLCBmaXggdGhpcy4gKi8KKwlpZiAobnJfZnJlZSA8IDApCisJCW5yX2ZyZWUgPSAwOworCW50ZnNfZGVidWcoIkV4aXRpbmcuIik7CisJcmV0dXJuIG5yX2ZyZWU7Cit9CisKKy8qKgorICogX19nZXRfbnJfZnJlZV9tZnRfcmVjb3JkcyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIG9uIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHZvbHVtZSBmb3Igd2hpY2ggdG8gb2J0YWluIGZyZWUgaW5vZGUgY291bnQKKyAqCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBmcmVlIG1mdCByZWNvcmRzIChpbm9kZXMpIG9uIHRoZSBtb3VudGVkIE5URlMKKyAqIHZvbHVtZSBAdm9sLiBXZSBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBtZnQgcmVjb3JkcyBpbiB1c2UgaW5zdGVhZAorICogYmVjYXVzZSB0aGlzIGFsbG93cyB1cyB0byBub3QgY2FyZSBhYm91dCBwYXJ0aWFsIHBhZ2VzIGFzIHRoZXNlIHdpbGwgYmUganVzdAorICogemVybyBmaWxsZWQgYW5kIGhlbmNlIG5vdCBiZSBjb3VudGVkIGFzIGFsbG9jYXRlZCBtZnQgcmVjb3JkLgorICoKKyAqIElmIGFueSBwYWdlcyBjYW5ub3QgYmUgcmVhZCB3ZSBhc3N1bWUgYWxsIG1mdCByZWNvcmRzIGluIHRoZSBlcnJvcmluZyBwYWdlcworICogYXJlIGluIHVzZS4gVGhpcyBtZWFucyB3ZSByZXR1cm4gYW4gdW5kZXJlc3RpbWF0ZSBvbiBlcnJvcnMgd2hpY2ggaXMgYmV0dGVyCisgKiB0aGFuIGFuIG92ZXJlc3RpbWF0ZS4KKyAqCisgKiBOT1RFOiBDYWxsZXIgbXVzdCBob2xkIG1mdGJtcF9sb2NrIHJ3X3NlbWFwaG9yZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKG50ZnNfdm9sdW1lICp2b2wpCit7CisJczY0IG5yX2ZyZWU7CisJdTMyICprYWRkcjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZvbC0+bWZ0Ym1wX2luby0+aV9tYXBwaW5nOworCWZpbGxlcl90ICpyZWFkcGFnZSA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBOdW1iZXIgb2YgbWZ0IHJlY29yZHMgaW4gZmlsZSBzeXN0ZW0gKGF0IHRoaXMgcG9pbnQgaW4gdGltZSkuICovCisJbnJfZnJlZSA9IHZvbC0+bWZ0X2luby0+aV9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXQgYml0cyBpbnRvIGJ5dGVzIHJvdW5kZWQgdXAsIHRoZW4KKwkgKiBjb252ZXJ0IGludG8gbXVsdGlwbGVzIG9mIFBBR0VfQ0FDSEVfU0laRSwgcm91bmRpbmcgdXAgc28gdGhhdCBpZiB3ZQorCSAqIGhhdmUgb25lIGZ1bGwgYW5kIG9uZSBwYXJ0aWFsIHBhZ2UgbWF4X2luZGV4ID0gMi4KKwkgKi8KKwltYXhfaW5kZXggPSAoKCgoTlRGU19JKHZvbC0+bWZ0X2lubyktPmluaXRpYWxpemVkX3NpemUgPj4KKwkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICsgNykgPj4gMykgKworCQkJUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBVc2UgbXVsdGlwbGVzIG9mIDQgYnl0ZXMuICovCisJbWF4X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gMjsKKwludGZzX2RlYnVnKCJSZWFkaW5nICRNRlQvJEJJVE1BUCwgbWF4X2luZGV4ID0gMHglbHgsIG1heF9zaXplID0gIgorCQkJIjB4JXguIiwgbWF4X2luZGV4LCBtYXhfc2l6ZSk7CisJZm9yIChpbmRleCA9IDBVTDsgaW5kZXggPCBtYXhfaW5kZXg7IGluZGV4KyspIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCS8qCisJCSAqIFJlYWQgdGhlIHBhZ2UgZnJvbSBwYWdlIGNhY2hlLCBnZXR0aW5nIGl0IGZyb20gYmFja2luZyBzdG9yZQorCQkgKiBpZiBuZWNlc3NhcnksIGFuZCBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudC4KKwkJICovCisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsIChmaWxsZXJfdCopcmVhZHBhZ2UsCisJCQkJTlVMTCk7CisJCS8qIElnbm9yZSBwYWdlcyB3aGljaCBlcnJvcmVkIHN5bmNocm9ub3VzbHkuICovCisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCW50ZnNfZGVidWcoIlN5bmMgcmVhZF9jYWNoZV9wYWdlKCkgZXJyb3IuIFNraXBwaW5nICIKKwkJCQkJInBhZ2UgKGluZGV4IDB4JWx4KS4iLCBpbmRleCk7CisJCQlucl9mcmVlIC09IFBBR0VfQ0FDSEVfU0laRSAqIDg7CisJCQljb250aW51ZTsKKwkJfQorCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQkvKiBJZ25vcmUgcGFnZXMgd2hpY2ggZXJyb3JlZCBhc3luY2hyb25vdXNseS4gKi8KKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCW50ZnNfZGVidWcoIkFzeW5jIHJlYWRfY2FjaGVfcGFnZSgpIGVycm9yLiBTa2lwcGluZyAiCisJCQkJCSJwYWdlIChpbmRleCAweCVseCkuIiwgaW5kZXgpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJbnJfZnJlZSAtPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY29udGludWU7CisJCX0KKwkJa2FkZHIgPSAodTMyKilrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCS8qCisJCSAqIEZvciBlYWNoIDQgYnl0ZXMsIHN1YnRyYWN0IHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMuIElmIHRoaXMKKwkJICogaXMgdGhlIGxhc3QgcGFnZSBhbmQgaXQgaXMgcGFydGlhbCB3ZSBkb24ndCByZWFsbHkgY2FyZSBhcworCQkgKiBpdCBqdXN0IG1lYW5zIHdlIGRvIGEgbGl0dGxlIGV4dHJhIHdvcmsgYnV0IGl0IHdvbid0IGFmZmVjdAorCQkgKiB0aGUgcmVzdWx0IGFzIGFsbCBvdXQgb2YgcmFuZ2UgYnl0ZXMgYXJlIHNldCB0byB6ZXJvIGJ5CisJCSAqIG50ZnNfcmVhZHBhZ2UoKS4KKwkJICovCisJICAJZm9yIChpID0gMDsgaSA8IG1heF9zaXplOyBpKyspCisJCQlucl9mcmVlIC09IChzNjQpaHdlaWdodDMyKGthZGRyW2ldKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCW50ZnNfZGVidWcoIkZpbmlzaGVkIHJlYWRpbmcgJE1GVC8kQklUTUFQLCBsYXN0IGluZGV4ID0gMHglbHguIiwKKwkJCWluZGV4IC0gMSk7CisJLyogSWYgZXJyb3JzIG9jY3VyZWQgd2UgbWF5IHdlbGwgaGF2ZSBnb25lIGJlbG93IHplcm8sIGZpeCB0aGlzLiAqLworCWlmIChucl9mcmVlIDwgMCkKKwkJbnJfZnJlZSA9IDA7CisJbnRmc19kZWJ1ZygiRXhpdGluZy4iKTsKKwlyZXR1cm4gbnJfZnJlZTsKK30KKworLyoqCisgKiBudGZzX3N0YXRmcyAtIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBtb3VudGVkIE5URlMgdm9sdW1lCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBtb3VudGVkIHZvbHVtZQorICogQHNmczoJc3RhdGZzIHN0cnVjdHVyZSBpbiB3aGljaCB0byByZXR1cm4gdGhlIGluZm9ybWF0aW9uCisgKgorICogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3VudGVkIE5URlMgdm9sdW1lIEBzYiBpbiB0aGUgc3RhdGZzIHN0cnVjdHVyZQorICogcG9pbnRlZCB0byBieSBAc2ZzICh0aGlzIGlzIGluaXRpYWxpemVkIHdpdGggemVyb3MgYmVmb3JlIG50ZnNfc3RhdGZzIGlzCisgKiBjYWxsZWQpLiBXZSBpbnRlcnByZXQgdGhlIHZhbHVlcyB0byBiZSBjb3JyZWN0IG9mIHRoZSBtb21lbnQgaW4gdGltZSBhdAorICogd2hpY2ggd2UgYXJlIGNhbGxlZC4gTW9zdCB2YWx1ZXMgYXJlIHZhcmlhYmxlIG90aGVyd2lzZSBhbmQgdGhpcyBpc24ndCBqdXN0CisgKiB0aGUgZnJlZSB2YWx1ZXMgYnV0IHRoZSB0b3RhbHMgYXMgd2VsbC4gRm9yIGV4YW1wbGUgd2UgY2FuIGluY3JlYXNlIHRoZQorICogdG90YWwgbnVtYmVyIG9mIGZpbGUgbm9kZXMgaWYgd2UgcnVuIG91dCBhbmQgd2UgY2FuIGtlZXAgZG9pbmcgdGhpcyB1bnRpbAorICogdGhlcmUgaXMgbm8gbW9yZSBzcGFjZSBvbiB0aGUgdm9sdW1lIGxlZnQgYXQgYWxsLgorICoKKyAqIENhbGxlZCBmcm9tIHZmc19zdGF0ZnMgd2hpY2ggaXMgdXNlZCB0byBoYW5kbGUgdGhlIHN0YXRmcywgZnN0YXRmcywgYW5kCisgKiB1c3RhdCBzeXN0ZW0gY2FsbHMuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKnNmcykKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CisJczY0IHNpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBUeXBlIG9mIGZpbGVzeXN0ZW0uICovCisJc2ZzLT5mX3R5cGUgICA9IE5URlNfU0JfTUFHSUM7CisJLyogT3B0aW1hbCB0cmFuc2ZlciBibG9jayBzaXplLiAqLworCXNmcy0+Zl9ic2l6ZSAgPSBQQUdFX0NBQ0hFX1NJWkU7CisJLyoKKwkgKiBUb3RhbCBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplIGFuZCBzaW5jZQorCSAqIGlub2RlcyBhcmUgYWxzbyBzdG9yZWQgaW4gZGF0YSBibG9jcyAoJE1GVCBpcyBhIGZpbGUpIHRoaXMgaXMganVzdAorCSAqIHRoZSB0b3RhbCBjbHVzdGVycy4KKwkgKi8KKwlzZnMtPmZfYmxvY2tzID0gdm9sLT5ucl9jbHVzdGVycyA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBGcmVlIGRhdGEgYmxvY2tzIGluIGZpbGUgc3lzdGVtIGluIHVuaXRzIG9mIGZfYnNpemUuICovCisJc2l6ZQkgICAgICA9IGdldF9ucl9mcmVlX2NsdXN0ZXJzKHZvbCkgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHNpemUgPCAwTEwpCisJCXNpemUgPSAwTEw7CisJLyogRnJlZSBibG9ja3MgYXZhaWwgdG8gbm9uLXN1cGVydXNlciwgc2FtZSBhcyBhYm92ZSBvbiBOVEZTLiAqLworCXNmcy0+Zl9iYXZhaWwgPSBzZnMtPmZfYmZyZWUgPSBzaXplOworCS8qIFNlcmlhbGl6ZSBhY2Nlc3NlcyB0byB0aGUgaW5vZGUgYml0bWFwLiAqLworCWRvd25fcmVhZCgmdm9sLT5tZnRibXBfbG9jayk7CisJLyogTnVtYmVyIG9mIGlub2RlcyBpbiBmaWxlIHN5c3RlbSAoYXQgdGhpcyBwb2ludCBpbiB0aW1lKS4gKi8KKwlzZnMtPmZfZmlsZXMgPSB2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCS8qIEZyZWUgaW5vZGVzIGluIGZzIChiYXNlZCBvbiBjdXJyZW50IHRvdGFsIGNvdW50KS4gKi8KKwlzZnMtPmZfZmZyZWUgPSBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKHZvbCk7CisJdXBfcmVhZCgmdm9sLT5tZnRibXBfbG9jayk7CisJLyoKKwkgKiBGaWxlIHN5c3RlbSBpZC4gVGhpcyBpcyBleHRyZW1lbHkgKm5peCBmbGF2b3VyIGRlcGVuZGVudCBhbmQgZXZlbgorCSAqIHdpdGhpbiBMaW51eCBpdHNlbGYgYWxsIGZzIGRvIHRoZWlyIG93biB0aGluZy4gSSBpbnRlcnByZXQgdGhpcyB0bworCSAqIG1lYW4gYSB1bmlxdWUgaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3VudGVkIGZzIGFuZCBub3QgdGhlIGlkCisJICogYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBkcml2ZXIsIHRoZSBsYXR0ZXIgaXMgYWxyZWFkeSBnaXZlbgorCSAqIGJ5IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGluIHNmcy0+Zl90eXBlLiBUaHVzIHdlIHVzZSB0aGUgNjQtYml0CisJICogdm9sdW1lIHNlcmlhbCBudW1iZXIgc3BsaXR0aW5nIGl0IGludG8gdHdvIDMyLWJpdCBwYXJ0cy4gV2UgZW50ZXIKKwkgKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzItYml0cyBpbiBmX2ZzaWRbMF0gYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50CisJICogMzItYml0cyBpbiBmX2ZzaWRbMV0uCisJICovCisJc2ZzLT5mX2ZzaWQudmFsWzBdID0gdm9sLT5zZXJpYWxfbm8gJiAweGZmZmZmZmZmOworCXNmcy0+Zl9mc2lkLnZhbFsxXSA9ICh2b2wtPnNlcmlhbF9ubyA+PiAzMikgJiAweGZmZmZmZmZmOworCS8qIE1heGltdW0gbGVuZ3RoIG9mIGZpbGVuYW1lcy4gKi8KKwlzZnMtPmZfbmFtZWxlbgkgICA9IE5URlNfTUFYX05BTUVfTEVOOworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoZSBjb21wbGV0ZSBzdXBlciBvcGVyYXRpb25zLgorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbnRmc19zb3BzID0geworCS5hbGxvY19pbm9kZQk9IG50ZnNfYWxsb2NfYmlnX2lub2RlLAkgIC8qIFZGUzogQWxsb2NhdGUgbmV3IGlub2RlLiAqLworCS5kZXN0cm95X2lub2RlCT0gbnRmc19kZXN0cm95X2JpZ19pbm9kZSwgLyogVkZTOiBEZWFsbG9jYXRlIGlub2RlLiAqLworCS5wdXRfaW5vZGUJPSBudGZzX3B1dF9pbm9kZSwJICAvKiBWRlM6IENhbGxlZCBqdXN0IGJlZm9yZQorCQkJCQkJICAgICB0aGUgaW5vZGUgcmVmZXJlbmNlIGNvdW50CisJCQkJCQkgICAgIGlzIGRlY3JlYXNlZC4gKi8KKyNpZmRlZiBOVEZTX1JXCisJLy8uZGlydHlfaW5vZGUJPSBOVUxMLAkJCS8qIFZGUzogQ2FsbGVkIGZyb20KKwkvLwkJCQkJICAgX19tYXJrX2lub2RlX2RpcnR5KCkuICovCisJLndyaXRlX2lub2RlCT0gbnRmc193cml0ZV9pbm9kZSwJLyogVkZTOiBXcml0ZSBkaXJ0eSBpbm9kZSB0bworCQkJCQkJICAgZGlzay4gKi8KKwkvLy5kcm9wX2lub2RlCT0gTlVMTCwJCQkvKiBWRlM6IENhbGxlZCBqdXN0IGFmdGVyIHRoZQorCS8vCQkJCQkgICBpbm9kZSByZWZlcmVuY2UgY291bnQgaGFzCisJLy8JCQkJCSAgIGJlZW4gZGVjcmVhc2VkIHRvIHplcm8uCisJLy8JCQkJCSAgIE5PVEU6IFRoZSBpbm9kZSBsb2NrIGlzCisJLy8JCQkJCSAgIGhlbGQuIFNlZSBmcy9pbm9kZS5jOjoKKwkvLwkJCQkJICAgZ2VuZXJpY19kcm9wX2lub2RlKCkuICovCisJLy8uZGVsZXRlX2lub2RlCT0gTlVMTCwJCQkvKiBWRlM6IERlbGV0ZSBpbm9kZSBmcm9tIGRpc2suCisJLy8JCQkJCSAgIENhbGxlZCB3aGVuIGlfY291bnQgYmVjb21lcworCS8vCQkJCQkgICAwIGFuZCBpX25saW5rIGlzIGFsc28gMC4gKi8KKwkvLy53cml0ZV9zdXBlcgk9IE5VTEwsCQkJLyogRmx1c2ggZGlydHkgc3VwZXIgYmxvY2sgdG8KKwkvLwkJCQkJICAgZGlzay4gKi8KKwkvLy5zeW5jX2ZzCT0gTlVMTCwJCQkvKiA/ICovCisJLy8ud3JpdGVfc3VwZXJfbG9ja2ZzCT0gTlVMTCwJCS8qID8gKi8KKwkvLy51bmxvY2tmcwk9IE5VTEwsCQkJLyogPyAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkucHV0X3N1cGVyCT0gbnRmc19wdXRfc3VwZXIsCS8qIFN5c2NhbGw6IHVtb3VudC4gKi8KKwkuc3RhdGZzCQk9IG50ZnNfc3RhdGZzLAkJLyogU3lzY2FsbDogc3RhdGZzICovCisJLnJlbW91bnRfZnMJPSBudGZzX3JlbW91bnQsCQkvKiBTeXNjYWxsOiBtb3VudCAtbyByZW1vdW50LiAqLworCS5jbGVhcl9pbm9kZQk9IG50ZnNfY2xlYXJfYmlnX2lub2RlLAkvKiBWRlM6IENhbGxlZCB3aGVuIGFuIGlub2RlIGlzCisJCQkJCQkgICByZW1vdmVkIGZyb20gbWVtb3J5LiAqLworCS8vLnVtb3VudF9iZWdpbgk9IE5VTEwsCQkJLyogRm9yY2VkIHVtb3VudC4gKi8KKwkuc2hvd19vcHRpb25zCT0gbnRmc19zaG93X29wdGlvbnMsCS8qIFNob3cgbW91bnQgb3B0aW9ucyBpbgorCQkJCQkJICAgcHJvYy4gKi8KK307CisKKworLyoqCisgKiBEZWNsYXJhdGlvbnMgZm9yIE5URlMgc3BlY2lmaWMgZXhwb3J0IG9wZXJhdGlvbnMgKGZzL250ZnMvbmFtZWkuYykuCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGRfZGVudCk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmZoKTsKKworLyoqCisgKiBFeHBvcnQgb3BlcmF0aW9ucyBhbGxvd2luZyBORlMgZXhwb3J0aW5nIG9mIG1vdW50ZWQgTlRGUyBwYXJ0aXRpb25zLgorICoKKyAqIFdlIHVzZSB0aGUgZGVmYXVsdCAtPmRlY29kZV9maCgpIGFuZCAtPmVuY29kZV9maCgpIGZvciBub3cuICBOb3RlIHRoYXQgdGhleQorICogdXNlIDMyIGJpdHMgdG8gc3RvcmUgdGhlIGlub2RlIG51bWJlciB3aGljaCBpcyBhbiB1bnNpZ25lZCBsb25nIHNvIG9uIDY0LWJpdAorICogYXJjaGl0ZWN0dXJlcyBpcyB1c3VhbGx5IDY0IGJpdHMgc28gaXQgd291bGQgYWxsIGZhaWwgaG9ycmlibHkgb24gaHVnZQorICogdm9sdW1lcy4gIEkgZ3Vlc3Mgd2UgbmVlZCB0byBkZWZpbmUgb3VyIG93biBlbmNvZGUgYW5kIGRlY29kZSBmaCBmdW5jdGlvbnMKKyAqIHRoYXQgc3RvcmUgNjQtYml0IGlub2RlIG51bWJlcnMgYXQgc29tZSBwb2ludCBidXQgZm9yIG5vdyB3ZSB3aWxsIGlnbm9yZSB0aGUKKyAqIHByb2JsZW0uLi4KKyAqCisgKiBXZSBhbHNvIHVzZSB0aGUgZGVmYXVsdCAtPmdldF9uYW1lKCkgaGVscGVyICh1c2VkIGJ5IC0+ZGVjb2RlX2ZoKCkgdmlhCisgKiBmcy9leHBvcnRmcy9leHBmcy5jOjpmaW5kX2V4cG9ydGVkX2RlbnRyeSgpKSBhcyB0aGF0IGlzIGNvbXBsZXRlbHkgZnMKKyAqIGluZGVwZW5kZW50LgorICoKKyAqIFRoZSBkZWZhdWx0IC0+Z2V0X3BhcmVudCgpIGp1c3QgcmV0dXJucyAtRUFDQ0VTIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBvdXIKKyAqIG93biBhbmQgdGhlIGRlZmF1bHQgLT5nZXRfZGVudHJ5KCkgaXMgaW5jb21wYXRpYmxlIHdpdGggTlRGUyBkdWUgdG8gbm90CisgKiBhbGxvd2luZyB0aGUgaW5vZGUgbnVtYmVyIDAgd2hpY2ggaXMgdXNlZCBpbiBOVEZTIGZvciB0aGUgc3lzdGVtIGZpbGUgJE1GVAorICogYW5kIGR1ZSB0byB1c2luZyBpZ2V0KCkgd2hlcmVhcyBOVEZTIG5lZWRzIG50ZnNfaWdldCgpLgorICovCitzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIG50ZnNfZXhwb3J0X29wcyA9IHsKKwkuZ2V0X3BhcmVudAk9IG50ZnNfZ2V0X3BhcmVudCwJLyogRmluZCB0aGUgcGFyZW50IG9mIGEgZ2l2ZW4KKwkJCQkJCSAgIGRpcmVjdG9yeS4gKi8KKwkuZ2V0X2RlbnRyeQk9IG50ZnNfZ2V0X2RlbnRyeSwJLyogRmluZCBhIGRlbnRyeSBmb3IgdGhlIGlub2RlCisJCQkJCQkgICBnaXZlbiBhIGZpbGUgaGFuZGxlCisJCQkJCQkgICBzdWItZnJhZ21lbnQuICovCit9OworCisvKioKKyAqIG50ZnNfZmlsbF9zdXBlciAtIG1vdW50IGFuIG50ZnMgZmlsZXMgc3lzdGVtCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBudGZzIGZpbGUgc3lzdGVtIHRvIG1vdW50CisgKiBAb3B0OglzdHJpbmcgY29udGFpbmluZyB0aGUgbW91bnQgb3B0aW9ucworICogQHNpbGVudDoJc2lsZW5jZSBlcnJvciBvdXRwdXQKKyAqCisgKiBudGZzX2ZpbGxfc3VwZXIoKSBpcyBjYWxsZWQgYnkgdGhlIFZGUyB0byBtb3VudCB0aGUgZGV2aWNlIGRlc2NyaWJlZCBieSBAc2IKKyAqIHdpdGggdGhlIG1vdW50IG90aW9ucyBpbiBAZGF0YSB3aXRoIHRoZSBOVEZTIGZpbGUgc3lzdGVtLgorICoKKyAqIElmIEBzaWxlbnQgaXMgdHJ1ZSwgcmVtYWluIHNpbGVudCBldmVuIGlmIGVycm9ycyBhcmUgZGV0ZWN0ZWQuIFRoaXMgaXMgdXNlZAorICogZHVyaW5nIGJvb3R1cCwgd2hlbiB0aGUga2VybmVsIHRyaWVzIHRvIG1vdW50IHRoZSByb290IGZpbGUgc3lzdGVtIHdpdGggYWxsCisgKiByZWdpc3RlcmVkIGZpbGUgc3lzdGVtcyBvbmUgYWZ0ZXIgdGhlIG90aGVyIHVudGlsIG9uZSBzdWNjZWVkcy4gVGhpcyBpbXBsaWVzCisgKiB0aGF0IGFsbCBmaWxlIHN5c3RlbXMgZXhjZXB0IHRoZSBjb3JyZWN0IG9uZSB3aWxsIHF1aXRlIGNvcnJlY3RseSBhbmQKKyAqIGV4cGVjdGVkbHkgcmV0dXJuIGFuIGVycm9yLCBidXQgbm9ib2R5IHdhbnRzIHRvIHNlZSBlcnJvciBtZXNzYWdlcyB3aGVuIGluCisgKiBmYWN0IHRoaXMgaXMgd2hhdCBpcyBzdXBwb3NlZCB0byBoYXBwZW4uCisgKgorICogTk9URTogQHNiLT5zX2ZsYWdzIGNvbnRhaW5zIHRoZSBtb3VudCBvcHRpb25zIGZsYWdzLgorICovCitzdGF0aWMgaW50IG50ZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvcHQsIGNvbnN0IGludCBzaWxlbnQpCit7CisJbnRmc192b2x1bWUgKnZvbDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpbm9kZSAqdG1wX2lubzsKKwlpbnQgcmVzdWx0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisjaWZuZGVmIE5URlNfUlcKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKyNlbmRpZiAvKiAhIE5URlNfUlcgKi8KKwkvKiBBbGxvY2F0ZSBhIG5ldyBudGZzX3ZvbHVtZSBhbmQgcGxhY2UgaXQgaW4gc2ItPnNfZnNfaW5mby4gKi8KKwlzYi0+c19mc19pbmZvID0ga21hbGxvYyhzaXplb2YobnRmc192b2x1bWUpLCBHRlBfTk9GUyk7CisJdm9sID0gTlRGU19TQihzYik7CisJaWYgKCF2b2wpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiQWxsb2NhdGlvbiBvZiBOVEZTIHZvbHVtZSBzdHJ1Y3R1cmUgIgorCQkJCQkiZmFpbGVkLiBBYm9ydGluZyBtb3VudC4uLiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogSW5pdGlhbGl6ZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KHZvbCwgMCwgc2l6ZW9mKG50ZnNfdm9sdW1lKSk7CisJdm9sLT5zYiA9IHNiOworCXZvbC0+dXBjYXNlID0gTlVMTDsKKwl2b2wtPmF0dHJkZWYgPSBOVUxMOworCXZvbC0+bWZ0X2lubyA9IE5VTEw7CisJdm9sLT5tZnRibXBfaW5vID0gTlVMTDsKKwlpbml0X3J3c2VtKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKyNpZmRlZiBOVEZTX1JXCisJdm9sLT5tZnRtaXJyX2lubyA9IE5VTEw7CisJdm9sLT5sb2dmaWxlX2lubyA9IE5VTEw7CisjZW5kaWYgLyogTlRGU19SVyAqLworCXZvbC0+bGNuYm1wX2lubyA9IE5VTEw7CisJaW5pdF9yd3NlbSgmdm9sLT5sY25ibXBfbG9jayk7CisJdm9sLT52b2xfaW5vID0gTlVMTDsKKwl2b2wtPnJvb3RfaW5vID0gTlVMTDsKKwl2b2wtPnNlY3VyZV9pbm8gPSBOVUxMOworCXZvbC0+ZXh0ZW5kX2lubyA9IE5VTEw7CisjaWZkZWYgTlRGU19SVworCXZvbC0+cXVvdGFfaW5vID0gTlVMTDsKKwl2b2wtPnF1b3RhX3FfaW5vID0gTlVMTDsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJdm9sLT5ubHNfbWFwID0gTlVMTDsKKworCS8qCisJICogRGVmYXVsdCBpcyBncm91cCBhbmQgb3RoZXIgZG9uJ3QgaGF2ZSBhbnkgYWNjZXNzIHRvIGZpbGVzIG9yCisJICogZGlyZWN0b3JpZXMgd2hpbGUgb3duZXIgaGFzIGZ1bGwgYWNjZXNzLiBGdXJ0aGVyLCBmaWxlcyBieSBkZWZhdWx0CisJICogYXJlIG5vdCBleGVjdXRhYmxlIGJ1dCBkaXJlY3RvcmllcyBhcmUgb2YgY291cnNlIGJyb3dzZWFibGUuCisJICovCisJdm9sLT5mbWFzayA9IDAxNzc7CisJdm9sLT5kbWFzayA9IDAwNzc7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwkvKiBJbXBvcnRhbnQgdG8gZ2V0IHRoZSBtb3VudCBvcHRpb25zIGRlYWx0IHdpdGggbm93LiAqLworCWlmICghcGFyc2Vfb3B0aW9ucyh2b2wsIChjaGFyKilvcHQpKQorCQlnb3RvIGVycl9vdXRfbm93OworCisJLyoKKwkgKiBUT0RPOiBGYWlsIHNhZmV0eSBjaGVjay4gSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgcmVhbGx5IGJlIGFibGUgdG8KKwkgKiBjb3BlIHdpdGggdGhpcyBiZWluZyB0aGUgY2FzZSwgYnV0IGZvciBub3cganVzdCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoYmRldl9oYXJkc2VjdF9zaXplKHNiLT5zX2JkZXYpID4gTlRGU19CTE9DS19TSVpFKSB7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkRldmljZSBoYXMgdW5zdXBwb3J0ZWQgaGFyZHNlY3Rfc2l6ZS4iKTsKKwkJZ290byBlcnJfb3V0X25vdzsKKwl9CisKKwkvKiBTZXR1cCB0aGUgZGV2aWNlIGFjY2VzcyBibG9jayBzaXplIHRvIE5URlNfQkxPQ0tfU0laRS4gKi8KKwlpZiAoc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgTlRGU19CTE9DS19TSVpFKSAhPSBOVEZTX0JMT0NLX1NJWkUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiVW5hYmxlIHRvIHNldCBibG9jayBzaXplLiIpOworCQlnb3RvIGVycl9vdXRfbm93OworCX0KKworCS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgZGV2aWNlIGluIHVuaXRzIG9mIE5URlNfQkxPQ0tfU0laRSBieXRlcy4gKi8KKwl2b2wtPm5yX2Jsb2NrcyA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gTlRGU19CTE9DS19TSVpFX0JJVFM7CisKKwkvKiBSZWFkIHRoZSBib290IHNlY3RvciBhbmQgcmV0dXJuIHVubG9ja2VkIGJ1ZmZlciBoZWFkIHRvIGl0LiAqLworCWlmICghKGJoID0gcmVhZF9udGZzX2Jvb3Rfc2VjdG9yKHNiLCBzaWxlbnQpKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJOb3QgYW4gTlRGUyB2b2x1bWUuIik7CisJCWdvdG8gZXJyX291dF9ub3c7CisJfQorCisJLyoKKwkgKiBFeHRyYWN0IHRoZSBkYXRhIGZyb20gdGhlIGJvb3Qgc2VjdG9yIGFuZCBzZXR1cCB0aGUgbnRmcyBzdXBlciBibG9jaworCSAqIHVzaW5nIGl0LgorCSAqLworCXJlc3VsdCA9IHBhcnNlX250ZnNfYm9vdF9zZWN0b3Iodm9sLCAoTlRGU19CT09UX1NFQ1RPUiopYmgtPmJfZGF0YSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjbHVzdGVyIGFuZCBtZnQgYWxsb2NhdG9ycy4gKi8KKwludGZzX3NldHVwX2FsbG9jYXRvcnModm9sKTsKKworCWJyZWxzZShiaCk7CisKKwlpZiAoIXJlc3VsdCkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJVbnN1cHBvcnRlZCBOVEZTIGZpbGVzeXN0ZW0uIik7CisJCWdvdG8gZXJyX291dF9ub3c7CisJfQorCisJLyoKKwkgKiBUT0RPOiBXaGVuIHdlIHN0YXJ0IGNvcGluZyB3aXRoIHNlY3RvciBzaXplcyBkaWZmZXJlbnQgZnJvbQorCSAqIE5URlNfQkxPQ0tfU0laRSwgd2Ugbm93IHByb2JhYmx5IG5lZWQgdG8gc2V0IHRoZSBibG9ja3NpemUgb2YgdGhlCisJICogZGV2aWNlIChwcm9iYWJseSB0byBOVEZTX0JMT0NLX1NJWkUpLgorCSAqLworCisJLyogU2V0dXAgcmVtYWluaW5nIGZpZWxkcyBpbiB0aGUgc3VwZXIgYmxvY2suICovCisJc2ItPnNfbWFnaWMgPSBOVEZTX1NCX01BR0lDOworCisJLyoKKwkgKiBOdGZzIGFsbG93cyA2MyBiaXRzIGZvciB0aGUgZmlsZSBzaXplLCBpLmUuIGNvcnJlY3Qgd291bGQgYmU6CisJICoJc2ItPnNfbWF4Ynl0ZXMgPSB+MFVMTCA+PiAxOworCSAqIEJ1dCB0aGUga2VybmVsIHVzZXMgYSBsb25nIGFzIHRoZSBwYWdlIGNhY2hlIHBhZ2UgaW5kZXggd2hpY2ggb24KKwkgKiAzMi1iaXQgYXJjaGl0ZWN0dXJlcyBpcyBvbmx5IDMyLWJpdHMuIE1BWF9MRlNfRklMRVNJWkUgaXMga2VybmVsCisJICogZGVmaW5lZCB0byB0aGUgbWF4aW11bSB0aGUgcGFnZSBjYWNoZSBwYWdlIGluZGV4IGNhbiBjb3BlIHdpdGgKKwkgKiB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBpbmRleCBvciB0byAyXjYzIC0gMSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuCisJICovCisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCisJc2ItPnNfdGltZV9ncmFuID0gMTAwOworCisJLyoKKwkgKiBOb3cgbG9hZCB0aGUgbWV0YWRhdGEgcmVxdWlyZWQgZm9yIHRoZSBwYWdlIGNhY2hlIGFuZCBvdXIgYWRkcmVzcworCSAqIHNwYWNlIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24uIFdlIGRvIHRoaXMgYnkgc2V0dGluZyB1cCBhIHNwZWNpYWxpc2VkCisJICogcmVhZF9pbm9kZSBtZXRob2QgYW5kIHRoZW4ganVzdCBjYWxsaW5nIHRoZSBub3JtYWwgaWdldCgpIHRvIG9idGFpbgorCSAqIHRoZSBpbm9kZSBmb3IgJE1GVCB3aGljaCBpcyBzdWZmaWNpZW50IHRvIGFsbG93IG91ciBub3JtYWwgaW5vZGUKKwkgKiBvcGVyYXRpb25zIGFuZCBhc3NvY2lhdGVkIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyB0byBmdW5jdGlvbi4KKwkgKi8KKwlzYi0+c19vcCA9ICZudGZzX3NvcHM7CisJdG1wX2lubyA9IG5ld19pbm9kZShzYik7CisJaWYgKCF0bXBfaW5vKSB7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIGVzc2VudGlhbCBtZXRhZGF0YS4iKTsKKwkJZ290byBlcnJfb3V0X25vdzsKKwl9CisJdG1wX2luby0+aV9pbm8gPSBGSUxFX01GVDsKKwlpbnNlcnRfaW5vZGVfaGFzaCh0bXBfaW5vKTsKKwlpZiAobnRmc19yZWFkX2lub2RlX21vdW50KHRtcF9pbm8pIDwgMCkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCBlc3NlbnRpYWwgbWV0YWRhdGEuIik7CisJCWdvdG8gaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OworCX0KKwlkb3duKCZudGZzX2xvY2spOworCS8qCisJICogVGhlIGN1cnJlbnQgbW91bnQgaXMgYSBjb21wcmVzc2lvbiB1c2VyIGlmIHRoZSBjbHVzdGVyIHNpemUgaXMKKwkgKiBsZXNzIHRoYW4gb3IgZXF1YWwgNGtpQi4KKwkgKi8KKwlpZiAodm9sLT5jbHVzdGVyX3NpemUgPD0gNDA5NiAmJiAhbnRmc19ucl9jb21wcmVzc2lvbl91c2VycysrKSB7CisJCXJlc3VsdCA9IGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnMoKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJbnRmc19lcnJvcihOVUxMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgIgorCQkJCQkiZm9yIGNvbXByZXNzaW9uIGVuZ2luZS4iKTsKKwkJCW50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnMtLTsKKwkJCXVwKCZudGZzX2xvY2spOworCQkJZ290byBpcHV0X3RtcF9pbm9fZXJyX291dF9ub3c7CisJCX0KKwl9CisJLyoKKwkgKiBHZW5lcmF0ZSB0aGUgZ2xvYmFsIGRlZmF1bHQgdXBjYXNlIHRhYmxlIGlmIG5lY2Vzc2FyeS4gIEFsc28KKwkgKiB0ZW1wb3JhcmlseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiB1cGNhc2UgdXNlcnMgdG8gYXZvaWQgcmFjZQorCSAqIGNvbmRpdGlvbnMgd2l0aCBjb25jdXJyZW50ICh1KW1vdW50cy4KKwkgKi8KKwlpZiAoIWRlZmF1bHRfdXBjYXNlKQorCQlkZWZhdWx0X3VwY2FzZSA9IGdlbmVyYXRlX2RlZmF1bHRfdXBjYXNlKCk7CisJbnRmc19ucl91cGNhc2VfdXNlcnMrKzsKKwl1cCgmbnRmc19sb2NrKTsKKwkvKgorCSAqIEZyb20gbm93IG9uLCBpZ25vcmUgQHNpbGVudCBwYXJhbWV0ZXIuIElmIHdlIGZhaWwgYmVsb3cgdGhpcyBsaW5lLAorCSAqIGl0IHdpbGwgYmUgZHVlIHRvIGEgY29ycnVwdCBmcyBvciBhIHN5c3RlbSBlcnJvciwgc28gd2UgcmVwb3J0IGl0LgorCSAqLworCS8qCisJICogT3BlbiB0aGUgc3lzdGVtIGZpbGVzIHdpdGggbm9ybWFsIGFjY2VzcyBmdW5jdGlvbnMgYW5kIGNvbXBsZXRlCisJICogc2V0dGluZyB1cCB0aGUgbnRmcyBzdXBlciBibG9jay4KKwkgKi8KKwlpZiAoIWxvYWRfc3lzdGVtX2ZpbGVzKHZvbCkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIHN5c3RlbSBmaWxlcy4iKTsKKwkJZ290byB1bmxfdXBjYXNlX2lwdXRfdG1wX2lub19lcnJfb3V0X25vdzsKKwl9CisJaWYgKChzYi0+c19yb290ID0gZF9hbGxvY19yb290KHZvbC0+cm9vdF9pbm8pKSkgeworCQkvKiBXZSBpbmNyZW1lbnQgaV9jb3VudCBzaW11bGF0aW5nIGFuIG50ZnNfaWdldCgpLiAqLworCQlhdG9taWNfaW5jKCZ2b2wtPnJvb3RfaW5vLT5pX2NvdW50KTsKKwkJbnRmc19kZWJ1ZygiRXhpdGluZywgc3RhdHVzIHN1Y2Nlc3NmdWwuIik7CisJCS8qIFJlbGVhc2UgdGhlIGRlZmF1bHQgdXBjYXNlIGlmIGl0IGhhcyBubyB1c2Vycy4gKi8KKwkJZG93bigmbnRmc19sb2NrKTsKKwkJaWYgKCEtLW50ZnNfbnJfdXBjYXNlX3VzZXJzICYmIGRlZmF1bHRfdXBjYXNlKSB7CisJCQludGZzX2ZyZWUoZGVmYXVsdF91cGNhc2UpOworCQkJZGVmYXVsdF91cGNhc2UgPSBOVUxMOworCQl9CisJCXVwKCZudGZzX2xvY2spOworCQlzYi0+c19leHBvcnRfb3AgPSAmbnRmc19leHBvcnRfb3BzOworCQlsb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gMDsKKwl9CisJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByb290IGRpcmVjdG9yeS4iKTsKKwkvKiBDbGVhbiB1cCBhZnRlciB0aGUgc3VjY2Vzc2Z1bCBsb2FkX3N5c3RlbV9maWxlcygpIGNhbGwgZnJvbSBhYm92ZS4gKi8KKwkvLyBUT0RPOiBVc2UgbnRmc19wdXRfc3VwZXIoKSBpbnN0ZWFkIG9mIHJlcGVhdGluZyBhbGwgdGhpcyBjb2RlLi4uCisJLy8gRklYTUU6IFNob3VsZCBtYXJrIHRoZSB2b2x1bWUgY2xlYW4gYXMgdGhlIGVycm9yIGlzIG1vc3QgbGlrZWx5CisJLy8gCSAgLUVOT01FTS4KKwlpcHV0KHZvbC0+dm9sX2lubyk7CisJdm9sLT52b2xfaW5vID0gTlVMTDsKKwkvKiBOVEZTIDMuMCsgc3BlY2lmaWMgY2xlYW4gdXAuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyID49IDMpIHsKKyNpZmRlZiBOVEZTX1JXCisJCWlmICh2b2wtPnF1b3RhX3FfaW5vKSB7CisJCQlpcHV0KHZvbC0+cXVvdGFfcV9pbm8pOworCQkJdm9sLT5xdW90YV9xX2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+cXVvdGFfaW5vKSB7CisJCQlpcHV0KHZvbC0+cXVvdGFfaW5vKTsKKwkJCXZvbC0+cXVvdGFfaW5vID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkJaWYgKHZvbC0+ZXh0ZW5kX2lubykgeworCQkJaXB1dCh2b2wtPmV4dGVuZF9pbm8pOworCQkJdm9sLT5leHRlbmRfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT5zZWN1cmVfaW5vKSB7CisJCQlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CisJCQl2b2wtPnNlY3VyZV9pbm8gPSBOVUxMOworCQl9CisJfQorCWlwdXQodm9sLT5yb290X2lubyk7CisJdm9sLT5yb290X2lubyA9IE5VTEw7CisJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworCXZvbC0+bGNuYm1wX2lubyA9IE5VTEw7CisJaXB1dCh2b2wtPm1mdGJtcF9pbm8pOworCXZvbC0+bWZ0Ym1wX2lubyA9IE5VTEw7CisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKSB7CisJCWlwdXQodm9sLT5sb2dmaWxlX2lubyk7CisJCXZvbC0+bG9nZmlsZV9pbm8gPSBOVUxMOworCX0KKwlpZiAodm9sLT5tZnRtaXJyX2lubykgeworCQlpcHV0KHZvbC0+bWZ0bWlycl9pbm8pOworCQl2b2wtPm1mdG1pcnJfaW5vID0gTlVMTDsKKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCS8qIFRocm93IGF3YXkgdGhlIHRhYmxlIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4gKi8KKwl2b2wtPmF0dHJkZWZfc2l6ZSA9IDA7CisJaWYgKHZvbC0+YXR0cmRlZikgeworCQludGZzX2ZyZWUodm9sLT5hdHRyZGVmKTsKKwkJdm9sLT5hdHRyZGVmID0gTlVMTDsKKwl9CisJdm9sLT51cGNhc2VfbGVuID0gMDsKKwlkb3duKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSA9PSBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX25yX3VwY2FzZV91c2Vycy0tOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCXVwKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCWlmICh2b2wtPm5sc19tYXApIHsKKwkJdW5sb2FkX25scyh2b2wtPm5sc19tYXApOworCQl2b2wtPm5sc19tYXAgPSBOVUxMOworCX0KKwkvKiBFcnJvciBleGl0IGNvZGUgcGF0aC4gKi8KK3VubF91cGNhc2VfaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OgorCS8qCisJICogRGVjcmVhc2UgdGhlIG51bWJlciBvZiB1cGNhc2UgdXNlcnMgYW5kIGRlc3Ryb3kgdGhlIGdsb2JhbCBkZWZhdWx0CisJICogdXBjYXNlIHRhYmxlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlkb3duKCZudGZzX2xvY2spOworCWlmICghLS1udGZzX25yX3VwY2FzZV91c2VycyAmJiBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX2ZyZWUoZGVmYXVsdF91cGNhc2UpOworCQlkZWZhdWx0X3VwY2FzZSA9IE5VTEw7CisJfQorCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSA0MDk2ICYmICEtLW50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnMpCisJCWZyZWVfY29tcHJlc3Npb25fYnVmZmVycygpOworCXVwKCZudGZzX2xvY2spOworaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OgorCWlwdXQodG1wX2lubyk7CisJaWYgKHZvbC0+bWZ0X2lubyAmJiB2b2wtPm1mdF9pbm8gIT0gdG1wX2lubykKKwkJaXB1dCh2b2wtPm1mdF9pbm8pOworCXZvbC0+bWZ0X2lubyA9IE5VTEw7CisJLyoKKwkgKiBUaGlzIGlzIG5lZWRlZCB0byBnZXQgbnRmc19jbGVhcl9leHRlbnRfaW5vZGUoKSBjYWxsZWQgZm9yIGVhY2gKKwkgKiBpbm9kZSB3ZSBoYXZlIGV2ZXIgY2FsbGVkIG50ZnNfaWdldCgpL2lwdXQoKSBvbiwgb3RoZXJ3aXNlIHdlIEEpCisJICogbGVhayByZXNvdXJjZXMgYW5kIEIpIGEgc3Vic2VxdWVudCBtb3VudCBmYWlscyBhdXRvbWF0aWNhbGx5IGR1ZSB0bworCSAqIG50ZnNfaWdldCgpIG5ldmVyIGNhbGxpbmcgZG93biBpbnRvIG91ciBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkKKwkgKiBtZXRob2QgYWdhaW4uLi4gRklYTUU6IERvIHdlIG5lZWQgdG8gZG8gdGhpcyB0d2ljZSBub3cgYmVjYXVzZSBvZgorCSAqIGF0dHJpYnV0ZSBpbm9kZXM/IEkgdGhpbmsgbm90LCBzbyBsZWF2ZSBhcyBpcyBmb3Igbm93Li4uIChBSUEpCisJICovCisJaWYgKGludmFsaWRhdGVfaW5vZGVzKHNiKSkgeworCQludGZzX2Vycm9yKHNiLCAiQnVzeSBpbm9kZXMgbGVmdC4gVGhpcyBpcyBtb3N0IGxpa2VseSBhIE5URlMgIgorCQkJCSJkcml2ZXIgYnVnLiIpOworCQkvKiBDb3BpZWQgZnJvbSBmcy9zdXBlci5jLiBJIGp1c3QgbG92ZSB0aGlzIG1lc3NhZ2UuICgtOyAqLworCQlwcmludGsoIk5URlM6IEJ1c3kgaW5vZGVzIGFmdGVyIHVtb3VudC4gU2VsZi1kZXN0cnVjdCBpbiA1ICIKKwkJCQkic2Vjb25kcy4gIEhhdmUgYSBuaWNlIGRheS4uLlxuIik7CisJfQorCS8qIEVycm9ycyBhdCB0aGlzIHN0YWdlIGFyZSBpcnJlbGV2YW50LiAqLworZXJyX291dF9ub3c6CisJbG9ja19rZXJuZWwoKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZSh2b2wpOworCW50ZnNfZGVidWcoIkZhaWxlZCwgcmV0dXJuaW5nIC1FSU5WQUwuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgc2xhYiBjYWNoZSB0byBvcHRpbWl6ZSBhbGxvY2F0aW9ucyBhbmQgZGVhbGxvY2F0aW9ucyBvZiBVbmljb2RlCisgKiBzdHJpbmdzIG9mIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkIGJ5IE5URlMsIHdoaWNoIGlzIE5URlNfTUFYX05BTUVfTEVOCisgKiAoMjU1KSBVbmljb2RlIGNoYXJhY3RlcnMgKyBhIHRlcm1pbmF0aW5nIE5VTEwgVW5pY29kZSBjaGFyYWN0ZXIuCisgKi8KK2ttZW1fY2FjaGVfdCAqbnRmc19uYW1lX2NhY2hlOworCisvKiBTbGFiIGNhY2hlcyBmb3IgZWZmaWNpZW50IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIG9mIG9mIGlub2Rlcy4gKi8KK2ttZW1fY2FjaGVfdCAqbnRmc19pbm9kZV9jYWNoZTsKK2ttZW1fY2FjaGVfdCAqbnRmc19iaWdfaW5vZGVfY2FjaGU7CisKKy8qIEluaXQgb25jZSBjb25zdHJ1Y3RvciBmb3IgdGhlIGlub2RlIHNsYWIgY2FjaGUuICovCitzdGF0aWMgdm9pZCBudGZzX2JpZ19pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwludGZzX2lub2RlICpuaSA9IChudGZzX2lub2RlICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJCQlTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZShWRlNfSShuaSkpOworfQorCisvKgorICogU2xhYiBjYWNoZXMgdG8gb3B0aW1pemUgYWxsb2NhdGlvbnMgYW5kIGRlYWxsb2NhdGlvbnMgb2YgYXR0cmlidXRlIHNlYXJjaAorICogY29udGV4dHMgYW5kIGluZGV4IGNvbnRleHRzLCByZXNwZWN0aXZlbHkuCisgKi8KK2ttZW1fY2FjaGVfdCAqbnRmc19hdHRyX2N0eF9jYWNoZTsKK2ttZW1fY2FjaGVfdCAqbnRmc19pbmRleF9jdHhfY2FjaGU7CisKKy8qIERyaXZlciB3aWRlIHNlbWFwaG9yZS4gKi8KK0RFQ0xBUkVfTVVURVgobnRmc19sb2NrKTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbnRmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBudGZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbnRmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibnRmcyIsCisJLmdldF9zYgkJPSBudGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworLyogU3RhYmxlIG5hbWVzIGZvciB0aGUgc2xhYiBjYWNoZXMuICovCitzdGF0aWMgY29uc3QgY2hhciBudGZzX2luZGV4X2N0eF9jYWNoZV9uYW1lW10gPSAibnRmc19pbmRleF9jdHhfY2FjaGUiOworc3RhdGljIGNvbnN0IGNoYXIgbnRmc19hdHRyX2N0eF9jYWNoZV9uYW1lW10gPSAibnRmc19hdHRyX2N0eF9jYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciBudGZzX25hbWVfY2FjaGVfbmFtZVtdID0gIm50ZnNfbmFtZV9jYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciBudGZzX2lub2RlX2NhY2hlX25hbWVbXSA9ICJudGZzX2lub2RlX2NhY2hlIjsKK3N0YXRpYyBjb25zdCBjaGFyIG50ZnNfYmlnX2lub2RlX2NhY2hlX25hbWVbXSA9ICJudGZzX2JpZ19pbm9kZV9jYWNoZSI7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbnRmc19mcyh2b2lkKQoreworCWludCBlcnIgPSAwOworCisJLyogVGhpcyBtYXkgYmUgdWdseSBidXQgaXQgcmVzdWx0cyBpbiBwcmV0dHkgb3V0cHV0IHNvIHdobyBjYXJlcy4gKC04ICovCisJcHJpbnRrKEtFUk5fSU5GTyAiTlRGUyBkcml2ZXIgIiBOVEZTX1ZFUlNJT04gIiBbRmxhZ3M6IFIvIgorI2lmZGVmIE5URlNfUlcKKwkJCSJXIgorI2Vsc2UKKwkJCSJPIgorI2VuZGlmCisjaWZkZWYgREVCVUcKKwkJCSIgREVCVUciCisjZW5kaWYKKyNpZmRlZiBNT0RVTEUKKwkJCSIgTU9EVUxFIgorI2VuZGlmCisJCQkiXS5cbiIpOworCisJbnRmc19kZWJ1ZygiRGVidWcgbWVzc2FnZXMgYXJlIGVuYWJsZWQuIik7CisKKwludGZzX2luZGV4X2N0eF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfaW5kZXhfY3R4X2NhY2hlX25hbWUsCisJCQlzaXplb2YobnRmc19pbmRleF9jb250ZXh0KSwgMCAvKiBvZmZzZXQgKi8sCisJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwgLyogY3RvciAqLywgTlVMTCAvKiBkdG9yICovKTsKKwlpZiAoIW50ZnNfaW5kZXhfY3R4X2NhY2hlKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBjcmVhdGUgJXMhXG4iLAorCQkJCW50ZnNfaW5kZXhfY3R4X2NhY2hlX25hbWUpOworCQlnb3RvIGljdHhfZXJyX291dDsKKwl9CisJbnRmc19hdHRyX2N0eF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfYXR0cl9jdHhfY2FjaGVfbmFtZSwKKwkJCXNpemVvZihudGZzX2F0dHJfc2VhcmNoX2N0eCksIDAgLyogb2Zmc2V0ICovLAorCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMIC8qIGN0b3IgKi8sIE5VTEwgLyogZHRvciAqLyk7CisJaWYgKCFudGZzX2F0dHJfY3R4X2NhY2hlKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBjcmVhdGUgJXMhXG4iLAorCQkJCW50ZnNfYXR0cl9jdHhfY2FjaGVfbmFtZSk7CisJCWdvdG8gYWN0eF9lcnJfb3V0OworCX0KKworCW50ZnNfbmFtZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfbmFtZV9jYWNoZV9uYW1lLAorCQkJKE5URlNfTUFYX05BTUVfTEVOKzEpICogc2l6ZW9mKG50ZnNjaGFyKSwgMCwKKwkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKCFudGZzX25hbWVfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGNyZWF0ZSAlcyFcbiIsCisJCQkJbnRmc19uYW1lX2NhY2hlX25hbWUpOworCQlnb3RvIG5hbWVfZXJyX291dDsKKwl9CisKKwludGZzX2lub2RlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUobnRmc19pbm9kZV9jYWNoZV9uYW1lLAorCQkJc2l6ZW9mKG50ZnNfaW5vZGUpLCAwLAorCQkJU0xBQl9SRUNMQUlNX0FDQ09VTlQsIE5VTEwsIE5VTEwpOworCWlmICghbnRmc19pbm9kZV9jYWNoZSkgeworCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gY3JlYXRlICVzIVxuIiwKKwkJCQludGZzX2lub2RlX2NhY2hlX25hbWUpOworCQlnb3RvIGlub2RlX2Vycl9vdXQ7CisJfQorCisJbnRmc19iaWdfaW5vZGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShudGZzX2JpZ19pbm9kZV9jYWNoZV9uYW1lLAorCQkJc2l6ZW9mKGJpZ19udGZzX2lub2RlKSwgMCwKKwkJCVNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCW50ZnNfYmlnX2lub2RlX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFudGZzX2JpZ19pbm9kZV9jYWNoZSkgeworCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gY3JlYXRlICVzIVxuIiwKKwkJCQludGZzX2JpZ19pbm9kZV9jYWNoZV9uYW1lKTsKKwkJZ290byBiaWdfaW5vZGVfZXJyX291dDsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgbnRmcyBzeXNjdGxzLiAqLworCWVyciA9IG50ZnNfc3lzY3RsKDEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIHJlZ2lzdGVyIE5URlMgc3lzY3RscyFcbiIpOworCQlnb3RvIHN5c2N0bF9lcnJfb3V0OworCX0KKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm50ZnNfZnNfdHlwZSk7CisJaWYgKCFlcnIpIHsKKwkJbnRmc19kZWJ1ZygiTlRGUyBkcml2ZXIgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkuIik7CisJCXJldHVybiAwOyAvKiBTdWNjZXNzISAqLworCX0KKwlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gcmVnaXN0ZXIgTlRGUyBmaWxlIHN5c3RlbSBkcml2ZXIhXG4iKTsKKworc3lzY3RsX2Vycl9vdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYmlnX2lub2RlX2NhY2hlKTsKK2JpZ19pbm9kZV9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2lub2RlX2NhY2hlKTsKK2lub2RlX2Vycl9vdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfbmFtZV9jYWNoZSk7CituYW1lX2Vycl9vdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYXR0cl9jdHhfY2FjaGUpOworYWN0eF9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2luZGV4X2N0eF9jYWNoZSk7CitpY3R4X2Vycl9vdXQ6CisJaWYgKCFlcnIpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogQWJvcnRpbmcgTlRGUyBmaWxlIHN5c3RlbSBkcml2ZXIgIgorCQkJCSJyZWdpc3RyYXRpb24uLi5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9udGZzX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJVbnJlZ2lzdGVyaW5nIE5URlMgZHJpdmVyLiIpOworCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZudGZzX2ZzX3R5cGUpOworCisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2JpZ19pbm9kZV9jYWNoZSkgJiYgKGVyciA9IDEpKQorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gZGVzdG9yeSAlcy5cbiIsCisJCQkJbnRmc19iaWdfaW5vZGVfY2FjaGVfbmFtZSk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2lub2RlX2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX2lub2RlX2NhY2hlX25hbWUpOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19uYW1lX2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX25hbWVfY2FjaGVfbmFtZSk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2F0dHJfY3R4X2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX2F0dHJfY3R4X2NhY2hlX25hbWUpOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19pbmRleF9jdHhfY2FjaGUpICYmIChlcnIgPSAxKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGRlc3RvcnkgJXMuXG4iLAorCQkJCW50ZnNfaW5kZXhfY3R4X2NhY2hlX25hbWUpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IFRoaXMgY2F1c2VzIG1lbW9yeSB0byBsZWFrISBUaGVyZSBpcyAiCisJCQkJInByb2JhYmx5IGEgQlVHIGluIHRoZSBkcml2ZXIhIFBsZWFzZSByZXBvcnQgIgorCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuIik7CisJLyogVW5yZWdpc3RlciB0aGUgbnRmcyBzeXNjdGxzLiAqLworCW50ZnNfc3lzY3RsKDApOworfQorCitNT0RVTEVfQVVUSE9SKCJBbnRvbiBBbHRhcGFybWFrb3YgPGFpYTIxQGNhbnRhYi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5URlMgMS4yLzMueCBkcml2ZXIgLSBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YiKTsKK01PRFVMRV9WRVJTSU9OKE5URlNfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjaWZkZWYgREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1Z19tc2dzLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfbXNncywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcy4iKTsKKyNlbmRpZgorCittb2R1bGVfaW5pdChpbml0X250ZnNfZnMpCittb2R1bGVfZXhpdChleGl0X250ZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9udGZzL3N5c2N0bC5jIGIvZnMvbnRmcy9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTA2N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9zeXNjdGwuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogc3lzY3RsLmMgLSBDb2RlIGZvciBzeXNjdGwgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCisgKgkgICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LiBBZGFwdGVkIGZyb20gdGhlIG9sZCBOVEZTIGRyaXZlciwKKyAqCSAgICAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gdm9uIEz2d2lzLCBS6WdpcyBEdWNoZXNuZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlICJzeXNjdGwuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjZGVmaW5lIEZTX05URlMJMQorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBudGZzIHN5c2N0bC4gKi8KK3N0YXRpYyBjdGxfdGFibGUgbnRmc19zeXNjdGxzW10gPSB7CisJeyBGU19OVEZTLCAibnRmcy1kZWJ1ZyIsCQkvKiBCaW5hcnkgYW5kIHRleHQgSURzLiAqLworCSAgJmRlYnVnX21zZ3Msc2l6ZW9mKGRlYnVnX21zZ3MpLAkvKiBEYXRhIHBvaW50ZXIgYW5kIHNpemUuICovCisJICAwNjQ0LAlOVUxMLCAmcHJvY19kb2ludHZlYyB9LAkJLyogTW9kZSwgY2hpbGQsIHByb2MgaGFuZGxlci4gKi8KKwl7IDAgfQorfTsKKworLyogRGVmaW5lIHRoZSBwYXJlbnQgZGlyZWN0b3J5IC9wcm9jL3N5cy9mcy4gKi8KK3N0YXRpYyBjdGxfdGFibGUgc3lzY3Rsc19yb290W10gPSB7CisJeyBDVExfRlMsICJmcyIsIE5VTEwsIDAsIDA1NTUsIG50ZnNfc3lzY3RscyB9LAorCXsgMCB9Cit9OworCisvKiBTdG9yYWdlIGZvciB0aGUgc3lzY3RscyBoZWFkZXIuICovCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bHNfcm9vdF90YWJsZSA9IE5VTEw7CisKKy8qKgorICogbnRmc19zeXNjdGwgLSBhZGQgb3IgcmVtb3ZlIHRoZSBkZWJ1ZyBzeXNjdGwKKyAqIEBhZGQ6CWFkZCAoMSkgb3IgcmVtb3ZlICgwKSB0aGUgc3lzY3RsCisgKgorICogQWRkIG9yIHJlbW92ZSB0aGUgZGVidWcgc3lzY3RsLiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IG50ZnNfc3lzY3RsKGludCBhZGQpCit7CisJaWYgKGFkZCkgeworCQlCVUdfT04oc3lzY3Rsc19yb290X3RhYmxlKTsKKwkJc3lzY3Rsc19yb290X3RhYmxlID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bHNfcm9vdCwgMCk7CisJCWlmICghc3lzY3Rsc19yb290X3RhYmxlKQorCQkJcmV0dXJuIC1FTk9NRU07CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJLyoKKwkJICogSWYgdGhlIHByb2MgZmlsZSBzeXN0ZW0gaXMgaW4gdXNlIGFuZCB3ZSBhcmUgYSBtb2R1bGUsIG5lZWQKKwkJICogdG8gc2V0IHRoZSBvd25lciBvZiBvdXIgcHJvYyBlbnRyeSB0byBvdXIgbW9kdWxlLiBJbiB0aGUKKwkJICogbm9uLW1vZHVsYXIgY2FzZSwgVEhJU19NT0RVTEUgaXMgTlVMTCwgc28gdGhpcyBpcyBvay4KKwkJICovCisJCW50ZnNfc3lzY3Rsc1swXS5kZS0+b3duZXIgPSBUSElTX01PRFVMRTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUJVR19PTighc3lzY3Rsc19yb290X3RhYmxlKTsKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3Rsc19yb290X3RhYmxlKTsKKwkJc3lzY3Rsc19yb290X3RhYmxlID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvc3lzY3RsLmggYi9mcy9udGZzL3N5c2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzQ5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3N5c2N0bC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBzeXNjdGwuaCAtIERlZmluZXMgZm9yIHN5c2N0bCBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YKKyAqCSAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuIEFkYXB0ZWQgZnJvbSB0aGUgb2xkIE5URlMgZHJpdmVyLAorICoJICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiB2b24gTPZ3aXMsIFLpZ2lzIER1Y2hlc25lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19TWVNDVExfSAorI2RlZmluZSBfTElOVVhfTlRGU19TWVNDVExfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZiAoREVCVUcgJiYgQ09ORklHX1NZU0NUTCkKKworZXh0ZXJuIGludCBudGZzX3N5c2N0bChpbnQgYWRkKTsKKworI2Vsc2UKKworLyogSnVzdCByZXR1cm4gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfc3lzY3RsKGludCBhZGQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBERUJVRyAmJiBDT05GSUdfU1lTQ1RMICovCisjZW5kaWYgLyogX0xJTlVYX05URlNfU1lTQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdGltZS5oIGIvZnMvbnRmcy90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5YTUxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdGltZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogdGltZS5oIC0gTlRGUyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfVElNRV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgkJLyogRm9yIGN1cnJlbnRfa2VybmVsX3RpbWUoKS4gKi8KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4JCS8qIEZvciBkb19kaXYoKS4gKi8KKworI2luY2x1ZGUgImVuZGlhbi5oIgorCisjZGVmaW5lIE5URlNfVElNRV9PRkZTRVQgKChzNjQpKDM2OSAqIDM2NSArIDg5KSAqIDI0ICogMzYwMCAqIDEwMDAwMDAwKQorCisvKioKKyAqIHV0YzJudGZzIC0gY29udmVydCBMaW51eCBVVEMgdGltZSB0byBOVEZTIHRpbWUKKyAqIEB0czoJCUxpbnV4IFVUQyB0aW1lIHRvIGNvbnZlcnQgdG8gTlRGUyB0aW1lCisgKgorICogQ29udmVydCB0aGUgTGludXggVVRDIHRpbWUgQHRzIHRvIGl0cyBjb3JyZXNwb25kaW5nIE5URlMgdGltZSBhbmQgcmV0dXJuCisgKiB0aGF0IGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgorICoKKyAqIExpbnV4IHN0b3JlcyB0aW1lIGluIGEgc3RydWN0IHRpbWVzcGVjIGNvbnNpc3Rpbmcgb2YgYSB0aW1lX3QgKGxvbmcgYXQKKyAqIHByZXNlbnQpIHR2X3NlYyBhbmQgYSBsb25nIHR2X25zZWMgd2hlcmUgdHZfc2VjIGlzIHRoZSBudW1iZXIgb2YgMS1zZWNvbmQKKyAqIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxOTcwLCAwMDowMDowMCBVVEMgYW5kIHR2X25zZWMgaXMgdGhlIG51bWJlciBvZgorICogMS1uYW5vLXNlY29uZCBpbnRlcnZhbHMgc2luY2UgdGhlIHZhbHVlIG9mIHR2X3NlYy4KKyAqCisgKiBOVEZTIHVzZXMgTWljcm9zb2Z0J3Mgc3RhbmRhcmQgdGltZSBmb3JtYXQgd2hpY2ggaXMgc3RvcmVkIGluIGEgczY0IGFuZCBpcworICogbWVhc3VyZWQgYXMgdGhlIG51bWJlciBvZiAxMDAtbmFuby1zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIDFzdCBKYW51YXJ5IDE2MDEsCisgKiAwMDowMDowMCBVVEMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2xlNjQgdXRjMm50ZnMoY29uc3Qgc3RydWN0IHRpbWVzcGVjIHRzKQoreworCS8qCisJICogQ29udmVydCB0aGUgc2Vjb25kcyB0byAxMDBucyBpbnRlcnZhbHMsIGFkZCB0aGUgbmFuby1zZWNvbmRzCisJICogY29udmVydGVkIHRvIDEwMG5zIGludGVydmFscywgYW5kIHRoZW4gYWRkIHRoZSBOVEZTIHRpbWUgb2Zmc2V0LgorCSAqLworCXJldHVybiBjcHVfdG9fc2xlNjQoKHM2NCl0cy50dl9zZWMgKiAxMDAwMDAwMCArIHRzLnR2X25zZWMgLyAxMDAgKworCQkJTlRGU19USU1FX09GRlNFVCk7Cit9CisKKy8qKgorICogZ2V0X2N1cnJlbnRfbnRmc190aW1lIC0gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4gbGl0dGxlIGVuZGlhbiBOVEZTIGZvcm1hdAorICoKKyAqIEdldCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIExpbnV4IGtlcm5lbCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICogTlRGUyB0aW1lIGFuZCByZXR1cm4gdGhhdCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKyAqLworc3RhdGljIGlubGluZSBzbGU2NCBnZXRfY3VycmVudF9udGZzX3RpbWUodm9pZCkKK3sKKwlyZXR1cm4gdXRjMm50ZnMoY3VycmVudF9rZXJuZWxfdGltZSgpKTsKK30KKworLyoqCisgKiBudGZzMnV0YyAtIGNvbnZlcnQgTlRGUyB0aW1lIHRvIExpbnV4IHRpbWUKKyAqIEB0aW1lOglOVEZTIHRpbWUgKGxpdHRsZSBlbmRpYW4pIHRvIGNvbnZlcnQgdG8gTGludXggVVRDCisgKgorICogQ29udmVydCB0aGUgbGl0dGxlIGVuZGlhbiBOVEZTIHRpbWUgQHRpbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTGludXggVVRDCisgKiB0aW1lIGFuZCByZXR1cm4gdGhhdCBpbiBjcHUgZm9ybWF0LgorICoKKyAqIExpbnV4IHN0b3JlcyB0aW1lIGluIGEgc3RydWN0IHRpbWVzcGVjIGNvbnNpc3Rpbmcgb2YgYSB0aW1lX3QgKGxvbmcgYXQKKyAqIHByZXNlbnQpIHR2X3NlYyBhbmQgYSBsb25nIHR2X25zZWMgd2hlcmUgdHZfc2VjIGlzIHRoZSBudW1iZXIgb2YgMS1zZWNvbmQKKyAqIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxOTcwLCAwMDowMDowMCBVVEMgYW5kIHR2X25zZWMgaXMgdGhlIG51bWJlciBvZgorICogMS1uYW5vLXNlY29uZCBpbnRlcnZhbHMgc2luY2UgdGhlIHZhbHVlIG9mIHR2X3NlYy4KKyAqCisgKiBOVEZTIHVzZXMgTWljcm9zb2Z0J3Mgc3RhbmRhcmQgdGltZSBmb3JtYXQgd2hpY2ggaXMgc3RvcmVkIGluIGEgczY0IGFuZCBpcworICogbWVhc3VyZWQgYXMgdGhlIG51bWJlciBvZiAxMDAgbmFuby1zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIDFzdCBKYW51YXJ5IDE2MDEsCisgKiAwMDowMDowMCBVVEMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpbWVzcGVjIG50ZnMydXRjKGNvbnN0IHNsZTY0IHRpbWUpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJLyogU3VidHJhY3QgdGhlIE5URlMgdGltZSBvZmZzZXQuICovCisJczY0IHQgPSBzbGU2NF90b19jcHUodGltZSkgLSBOVEZTX1RJTUVfT0ZGU0VUOworCS8qCisJICogQ29udmVydCB0aGUgdGltZSB0byAxLXNlY29uZCBpbnRlcnZhbHMgYW5kIHRoZSByZW1haW5kZXIgdG8KKwkgKiAxLW5hbm8tc2Vjb25kIGludGVydmFscy4KKwkgKi8KKwl0cy50dl9uc2VjID0gZG9fZGl2KHQsIDEwMDAwMDAwKSAqIDEwMDsKKwl0cy50dl9zZWMgPSB0OworCXJldHVybiB0czsKK30KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy90eXBlcy5oIGIvZnMvbnRmcy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTU1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3R5cGVzLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIHR5cGVzLmggLSBEZWZpbmVzIGZvciBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIgc3BlY2lmaWMgdHlwZXMuCisgKgkgICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiBfX2xlMTYgbGUxNjsKK3R5cGVkZWYgX19sZTMyIGxlMzI7Cit0eXBlZGVmIF9fbGU2NCBsZTY0OwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2Ugc2xlMTY7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBzbGUzMjsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIHNsZTY0OworCisvKiAyLWJ5dGUgVW5pY29kZSBjaGFyYWN0ZXIgdHlwZS4gKi8KK3R5cGVkZWYgbGUxNiBudGZzY2hhcjsKKyNkZWZpbmUgVUNIQVJfVF9TSVpFX0JJVFMgMQorCisvKgorICogQ2x1c3RlcnMgYXJlIHNpZ25lZCA2NC1iaXQgdmFsdWVzIG9uIE5URlMgdm9sdW1lcy4gV2UgZGVmaW5lIHR3byB0eXBlcywgTENOCisgKiBhbmQgVkNOLCB0byBhbGxvdyBmb3IgdHlwZSBjaGVja2luZyBhbmQgYmV0dGVyIGNvZGUgcmVhZGFiaWxpdHkuCisgKi8KK3R5cGVkZWYgczY0IFZDTjsKK3R5cGVkZWYgc2xlNjQgbGVWQ047Cit0eXBlZGVmIHM2NCBMQ047Cit0eXBlZGVmIHNsZTY0IGxlTENOOworCisvKgorICogVGhlIE5URlMgam91cm5hbCAkTG9nRmlsZSB1c2VzIGxvZyBzZXF1ZW5jZSBudW1iZXJzIHdoaWNoIGFyZSBzaWduZWQgNjQtYml0CisgKiB2YWx1ZXMuICBXZSBkZWZpbmUgb3VyIG93biB0eXBlIExTTiwgdG8gYWxsb3cgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGJldHRlcgorICogY29kZSByZWFkYWJpbGl0eS4KKyAqLwordHlwZWRlZiBzNjQgTFNOOwordHlwZWRlZiBzbGU2NCBsZUxTTjsKKwordHlwZWRlZiBlbnVtIHsKKwlGQUxTRSA9IDAsCisJVFJVRSA9IDEKK30gQk9PTDsKKwordHlwZWRlZiBlbnVtIHsKKwlDQVNFX1NFTlNJVElWRSA9IDAsCisJSUdOT1JFX0NBU0UgPSAxLAorfSBJR05PUkVfQ0FTRV9CT09MOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy91bmlzdHIuYyBiL2ZzL250ZnMvdW5pc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwYjBlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdW5pc3RyLmMKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiB1bmlzdHIuYyAtIE5URlMgVW5pY29kZSBzdHJpbmcgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoKKyAqIElNUE9SVEFOVAorICogPT09PT09PT09CisgKgorICogQWxsIHRoZXNlIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoZSBVbmljb2RlIGNoYXJhY3RlcnMgYXJlIGluIGxpdHRsZSBlbmRpYW4KKyAqIGVuY29kaW5nIGluc2lkZSB0aGUgc3RyaW5ncyEhIQorICovCisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIG5hbWUgY29sbGF0aW9uIGZ1bmN0aW9ucyB0byBxdWlja2x5IGRldGVybWluZSB3aGF0CisgKiBjaGFyYWN0ZXJzIGFyZSAoaW4pdmFsaWQuCisgKi8KK3N0YXRpYyBjb25zdCB1OCBsZWdhbF9hbnNpX2NoYXJfYXJyYXlbMHg0MF0gPSB7CisJMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCisJMHgxNywgMHgwNywgMHgxOCwgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkweDE3LCAweDE3LCAweDE4LCAweDE2LCAweDE2LCAweDE3LCAweDA3LCAweDAwLAorCisJMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkweDE3LCAweDE3LCAweDA0LCAweDE2LCAweDE4LCAweDE2LCAweDE4LCAweDE4LAorfTsKKworLyoqCisgKiBudGZzX2FyZV9uYW1lc19lcXVhbCAtIGNvbXBhcmUgdHdvIFVuaWNvZGUgbmFtZXMgZm9yIGVxdWFsaXR5CisgKiBAczE6CQkJbmFtZSB0byBjb21wYXJlIHRvIEBzMgorICogQHMxX2xlbjoJCWxlbmd0aCBpbiBVbmljb2RlIGNoYXJhY3RlcnMgb2YgQHMxCisgKiBAczI6CQkJbmFtZSB0byBjb21wYXJlIHRvIEBzMQorICogQHMyX2xlbjoJCWxlbmd0aCBpbiBVbmljb2RlIGNoYXJhY3RlcnMgb2YgQHMyCisgKiBAaWM6CQkJaWdub3JlIGNhc2UgYm9vbAorICogQHVwY2FzZToJCXVwY2FzZSB0YWJsZSAob25seSBpZiBAaWMgPT0gSUdOT1JFX0NBU0UpCisgKiBAdXBjYXNlX3NpemU6CWxlbmd0aCBpbiBVbmljb2RlIGNoYXJhY3RlcnMgb2YgQHVwY2FzZSAoaWYgcHJlc2VudCkKKyAqCisgKiBDb21wYXJlIHRoZSBuYW1lcyBAczEgYW5kIEBzMiBhbmQgcmV0dXJuIFRSVUUgKDEpIGlmIHRoZSBuYW1lcyBhcmUKKyAqIGlkZW50aWNhbCwgb3IgRkFMU0UgKDApIGlmIHRoZXkgYXJlIG5vdCBpZGVudGljYWwuIElmIEBpYyBpcyBJR05PUkVfQ0FTRSwKKyAqIHRoZSBAdXBjYXNlIHRhYmxlIGlzIHVzZWQgdG8gcGVyZm9ybWEgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24uCisgKi8KK0JPT0wgbnRmc19hcmVfbmFtZXNfZXF1YWwoY29uc3QgbnRmc2NoYXIgKnMxLCBzaXplX3QgczFfbGVuLAorCQljb25zdCBudGZzY2hhciAqczIsIHNpemVfdCBzMl9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2Vfc2l6ZSkKK3sKKwlpZiAoczFfbGVuICE9IHMyX2xlbikKKwkJcmV0dXJuIEZBTFNFOworCWlmIChpYyA9PSBDQVNFX1NFTlNJVElWRSkKKwkJcmV0dXJuICFudGZzX3Vjc25jbXAoczEsIHMyLCBzMV9sZW4pOworCXJldHVybiAhbnRmc191Y3NuY2FzZWNtcChzMSwgczIsIHMxX2xlbiwgdXBjYXNlLCB1cGNhc2Vfc2l6ZSk7Cit9CisKKy8qKgorICogbnRmc19jb2xsYXRlX25hbWVzIC0gY29sbGF0ZSB0d28gVW5pY29kZSBuYW1lcworICogQG5hbWUxOglmaXJzdCBVbmljb2RlIG5hbWUgdG8gY29tcGFyZQorICogQG5hbWUyOglzZWNvbmQgVW5pY29kZSBuYW1lIHRvIGNvbXBhcmUKKyAqIEBlcnJfdmFsOglpZiBAbmFtZTEgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXIgcmV0dXJuIHRoaXMgdmFsdWUKKyAqIEBpYzoJCWVpdGhlciBDQVNFX1NFTlNJVElWRSBvciBJR05PUkVfQ0FTRQorICogQHVwY2FzZToJdXBjYXNlIHRhYmxlIChpZ25vcmVkIGlmIEBpYyBpcyBDQVNFX1NFTlNJVElWRSkKKyAqIEB1cGNhc2VfbGVuOgl1cGNhc2UgdGFibGUgc2l6ZSAoaWdub3JlZCBpZiBAaWMgaXMgQ0FTRV9TRU5TSVRJVkUpCisgKgorICogbnRmc19jb2xsYXRlX25hbWVzIGNvbGxhdGVzIHR3byBVbmljb2RlIG5hbWVzIGFuZCByZXR1cm5zOgorICoKKyAqICAtMSBpZiB0aGUgZmlyc3QgbmFtZSBjb2xsYXRlcyBiZWZvcmUgdGhlIHNlY29uZCBvbmUsCisgKiAgIDAgaWYgdGhlIG5hbWVzIG1hdGNoLAorICogICAxIGlmIHRoZSBzZWNvbmQgbmFtZSBjb2xsYXRlcyBiZWZvcmUgdGhlIGZpcnN0IG9uZSwgb3IKKyAqIEBlcnJfdmFsIGlmIGFuIGludmFsaWQgY2hhcmFjdGVyIGlzIGZvdW5kIGluIEBuYW1lMSBkdXJpbmcgdGhlIGNvbXBhcmlzb24uCisgKgorICogVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkIGludmFsaWQ6ICciJywgJyonLCAnPCcsICc+JyBhbmQgJz8nLgorICovCitpbnQgbnRmc19jb2xsYXRlX25hbWVzKGNvbnN0IG50ZnNjaGFyICpuYW1lMSwgY29uc3QgdTMyIG5hbWUxX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKm5hbWUyLCBjb25zdCB1MzIgbmFtZTJfbGVuLAorCQljb25zdCBpbnQgZXJyX3ZhbCwgY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pCit7CisJdTMyIGNudCwgbWluX2xlbjsKKwl1MTYgYzEsIGMyOworCisJbWluX2xlbiA9IG5hbWUxX2xlbjsKKwlpZiAobmFtZTFfbGVuID4gbmFtZTJfbGVuKQorCQltaW5fbGVuID0gbmFtZTJfbGVuOworCWZvciAoY250ID0gMDsgY250IDwgbWluX2xlbjsgKytjbnQpIHsKKwkJYzEgPSBsZTE2X3RvX2NwdSgqbmFtZTErKyk7CisJCWMyID0gbGUxNl90b19jcHUoKm5hbWUyKyspOworCQlpZiAoaWMpIHsKKwkJCWlmIChjMSA8IHVwY2FzZV9sZW4pCisJCQkJYzEgPSBsZTE2X3RvX2NwdSh1cGNhc2VbYzFdKTsKKwkJCWlmIChjMiA8IHVwY2FzZV9sZW4pCisJCQkJYzIgPSBsZTE2X3RvX2NwdSh1cGNhc2VbYzJdKTsKKwkJfQorCQlpZiAoYzEgPCA2NCAmJiBsZWdhbF9hbnNpX2NoYXJfYXJyYXlbYzFdICYgOCkKKwkJCXJldHVybiBlcnJfdmFsOworCQlpZiAoYzEgPCBjMikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMxID4gYzIpCisJCQlyZXR1cm4gMTsKKwl9CisJaWYgKG5hbWUxX2xlbiA8IG5hbWUyX2xlbikKKwkJcmV0dXJuIC0xOworCWlmIChuYW1lMV9sZW4gPT0gbmFtZTJfbGVuKQorCQlyZXR1cm4gMDsKKwkvKiBuYW1lMV9sZW4gPiBuYW1lMl9sZW4gKi8KKwljMSA9IGxlMTZfdG9fY3B1KCpuYW1lMSk7CisJaWYgKGMxIDwgNjQgJiYgbGVnYWxfYW5zaV9jaGFyX2FycmF5W2MxXSAmIDgpCisJCXJldHVybiBlcnJfdmFsOworCXJldHVybiAxOworfQorCisvKioKKyAqIG50ZnNfdWNzbmNtcCAtIGNvbXBhcmUgdHdvIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmdzCisgKiBAczE6CQlmaXJzdCBzdHJpbmcKKyAqIEBzMjoJCXNlY29uZCBzdHJpbmcKKyAqIEBuOgkJbWF4aW11bSB1bmljb2RlIGNoYXJhY3RlcnMgdG8gY29tcGFyZQorICoKKyAqIENvbXBhcmUgdGhlIGZpcnN0IEBuIGNoYXJhY3RlcnMgb2YgdGhlIFVuaWNvZGUgc3RyaW5ncyBAczEgYW5kIEBzMiwKKyAqIFRoZSBzdHJpbmdzIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0IGFuZCBhcHByb3ByaWF0ZSBsZTE2X3RvX2NwdSgpCisgKiBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBvbiBub24tbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvCisgKiBpZiBAczEgKG9yIHRoZSBmaXJzdCBAbiBVbmljb2RlIGNoYXJhY3RlcnMgdGhlcmVvZikgaXMgZm91bmQsIHJlc3BlY3RpdmVseSwKKyAqIHRvIGJlIGxlc3MgdGhhbiwgdG8gbWF0Y2gsIG9yIGJlIGdyZWF0ZXIgdGhhbiBAczIuCisgKi8KK2ludCBudGZzX3Vjc25jbXAoY29uc3QgbnRmc2NoYXIgKnMxLCBjb25zdCBudGZzY2hhciAqczIsIHNpemVfdCBuKQoreworCXUxNiBjMSwgYzI7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCWMxID0gbGUxNl90b19jcHUoczFbaV0pOworCQljMiA9IGxlMTZfdG9fY3B1KHMyW2ldKTsKKwkJaWYgKGMxIDwgYzIpCisJCQlyZXR1cm4gLTE7CisJCWlmIChjMSA+IGMyKQorCQkJcmV0dXJuIDE7CisJCWlmICghYzEpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbnRmc191Y3NuY2FzZWNtcCAtIGNvbXBhcmUgdHdvIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmdzLCBpZ25vcmluZyBjYXNlCisgKiBAczE6CQkJZmlyc3Qgc3RyaW5nCisgKiBAczI6CQkJc2Vjb25kIHN0cmluZworICogQG46CQkJbWF4aW11bSB1bmljb2RlIGNoYXJhY3RlcnMgdG8gY29tcGFyZQorICogQHVwY2FzZToJCXVwY2FzZSB0YWJsZQorICogQHVwY2FzZV9zaXplOgl1cGNhc2UgdGFibGUgc2l6ZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMKKyAqCisgKiBDb21wYXJlIHRoZSBmaXJzdCBAbiBjaGFyYWN0ZXJzIG9mIHRoZSBVbmljb2RlIHN0cmluZ3MgQHMxIGFuZCBAczIsCisgKiBpZ25vcmluZyBjYXNlLiBUaGUgc3RyaW5ncyBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBhbmQgYXBwcm9wcmlhdGUKKyAqIGxlMTZfdG9fY3B1KCkgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgb24gbm9uLWxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCisgKgorICogRWFjaCBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlZCB1c2luZyB0aGUgQHVwY2FzZSB0YWJsZSBiZWZvcmUgdGhlIGNvbXBhcmlzb24uCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybworICogaWYgQHMxIChvciB0aGUgZmlyc3QgQG4gVW5pY29kZSBjaGFyYWN0ZXJzIHRoZXJlb2YpIGlzIGZvdW5kLCByZXNwZWN0aXZlbHksCisgKiB0byBiZSBsZXNzIHRoYW4sIHRvIG1hdGNoLCBvciBiZSBncmVhdGVyIHRoYW4gQHMyLgorICovCitpbnQgbnRmc191Y3NuY2FzZWNtcChjb25zdCBudGZzY2hhciAqczEsIGNvbnN0IG50ZnNjaGFyICpzMiwgc2l6ZV90IG4sCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2Vfc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1MTYgYzEsIGMyOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlpZiAoKGMxID0gbGUxNl90b19jcHUoczFbaV0pKSA8IHVwY2FzZV9zaXplKQorCQkJYzEgPSBsZTE2X3RvX2NwdSh1cGNhc2VbYzFdKTsKKwkJaWYgKChjMiA9IGxlMTZfdG9fY3B1KHMyW2ldKSkgPCB1cGNhc2Vfc2l6ZSkKKwkJCWMyID0gbGUxNl90b19jcHUodXBjYXNlW2MyXSk7CisJCWlmIChjMSA8IGMyKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYzEgPiBjMikKKwkJCXJldHVybiAxOworCQlpZiAoIWMxKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG50ZnNfdXBjYXNlX25hbWUobnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbiwgY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwKKwkJY29uc3QgdTMyIHVwY2FzZV9sZW4pCit7CisJdTMyIGk7CisJdTE2IHU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJaWYgKCh1ID0gbGUxNl90b19jcHUobmFtZVtpXSkpIDwgdXBjYXNlX2xlbikKKwkJCW5hbWVbaV0gPSB1cGNhc2VbdV07Cit9CisKK3ZvaWQgbnRmc19maWxlX3VwY2FzZV92YWx1ZShGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2VfbGVuKQoreworCW50ZnNfdXBjYXNlX25hbWUoKG50ZnNjaGFyKikmZmlsZV9uYW1lX2F0dHItPmZpbGVfbmFtZSwKKwkJCWZpbGVfbmFtZV9hdHRyLT5maWxlX25hbWVfbGVuZ3RoLCB1cGNhc2UsIHVwY2FzZV9sZW4pOworfQorCitpbnQgbnRmc19maWxlX2NvbXBhcmVfdmFsdWVzKEZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjEsCisJCUZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjIsCisJCWNvbnN0IGludCBlcnJfdmFsLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbikKK3sKKwlyZXR1cm4gbnRmc19jb2xsYXRlX25hbWVzKChudGZzY2hhciopJmZpbGVfbmFtZV9hdHRyMS0+ZmlsZV9uYW1lLAorCQkJZmlsZV9uYW1lX2F0dHIxLT5maWxlX25hbWVfbGVuZ3RoLAorCQkJKG50ZnNjaGFyKikmZmlsZV9uYW1lX2F0dHIyLT5maWxlX25hbWUsCisJCQlmaWxlX25hbWVfYXR0cjItPmZpbGVfbmFtZV9sZW5ndGgsCisJCQllcnJfdmFsLCBpYywgdXBjYXNlLCB1cGNhc2VfbGVuKTsKK30KKworLyoqCisgKiBudGZzX25sc3RvdWNzIC0gY29udmVydCBOTFMgc3RyaW5nIHRvIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmcKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHdoaWNoIHdlIGFyZSB3b3JraW5nIHdpdGgKKyAqIEBpbnM6CWlucHV0IE5MUyBzdHJpbmcgYnVmZmVyCisgKiBAaW5zX2xlbjoJbGVuZ3RoIG9mIGlucHV0IHN0cmluZyBpbiBieXRlcworICogQG91dHM6CW9uIHJldHVybiBjb250YWlucyB0aGUgYWxsb2NhdGVkIG91dHB1dCBVbmljb2RlIHN0cmluZyBidWZmZXIKKyAqCisgKiBDb252ZXJ0IHRoZSBpbnB1dCBzdHJpbmcgQGlucywgd2hpY2ggaXMgaW4gd2hhdGV2ZXIgZm9ybWF0IHRoZSBsb2FkZWQgTkxTCisgKiBtYXAgZGljdGF0ZXMsIGludG8gYSBsaXR0bGUgZW5kaWFuLCAyLWJ5dGUgVW5pY29kZSBzdHJpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIHN0cmluZyBhbmQgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcga21lbV9jYWNoZV9mcmVlKG50ZnNfbmFtZV9jYWNoZSwgQG91dHMpOyB3aGVuIGZpbmlzaGVkIHdpdGggaXQuCisgKgorICogT24gc3VjY2VzcyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY2hhcmFjdGVycyB3cml0dGVuIHRvCisgKiB0aGUgb3V0cHV0IHN0cmluZyAqQG91dHMgKD49IDApLCBub3QgY291bnRpbmcgdGhlIHRlcm1pbmF0aW5nIFVuaWNvZGUgTlVMTAorICogY2hhcmFjdGVyLiAqQG91dHMgaXMgc2V0IHRvIHRoZSBhbGxvY2F0ZWQgb3V0cHV0IHN0cmluZyBidWZmZXIuCisgKgorICogT24gZXJyb3IsIGEgbmVnYXRpdmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIEluCisgKiB0aGF0IGNhc2UgdGhlIG91dHB1dCBzdHJpbmcgaXMgbm90IGFsbG9jYXRlZC4gQm90aCAqQG91dHMgYW5kICpAb3V0c19sZW4KKyAqIGFyZSB0aGVuIHVuZGVmaW5lZC4KKyAqCisgKiBUaGlzIG1pZ2h0IGxvb2sgYSBiaXQgb2RkIGR1ZSB0byBmYXN0IHBhdGggb3B0aW1pemF0aW9uLi4uCisgKi8KK2ludCBudGZzX25sc3RvdWNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IGNoYXIgKmlucywKKwkJY29uc3QgaW50IGluc19sZW4sIG50ZnNjaGFyICoqb3V0cykKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSB2b2wtPm5sc19tYXA7CisJbnRmc2NoYXIgKnVjczsKKwl3Y2hhcl90IHdjOworCWludCBpLCBvLCB3Y19sZW47CisKKwkvKiBXZSBkb24ndCB0cnVzdCBvdXRzaWRlIHNvdXJjZXMuICovCisJaWYgKGlucykgeworCQl1Y3MgPSAobnRmc2NoYXIqKWttZW1fY2FjaGVfYWxsb2MobnRmc19uYW1lX2NhY2hlLCBTTEFCX05PRlMpOworCQlpZiAodWNzKSB7CisJCQlmb3IgKGkgPSBvID0gMDsgaSA8IGluc19sZW47IGkgKz0gd2NfbGVuKSB7CisJCQkJd2NfbGVuID0gbmxzLT5jaGFyMnVuaShpbnMgKyBpLCBpbnNfbGVuIC0gaSwKKwkJCQkJCSZ3Yyk7CisJCQkJaWYgKHdjX2xlbiA+PSAwKSB7CisJCQkJCWlmICh3YykgeworCQkJCQkJdWNzW28rK10gPSBjcHVfdG9fbGUxNih3Yyk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfSAvKiBlbHNlICghd2MpICovCisJCQkJCWJyZWFrOworCQkJCX0gLyogZWxzZSAod2NfbGVuIDwgMCkgKi8KKwkJCQlnb3RvIGNvbnZlcnNpb25fZXJyOworCQkJfQorCQkJdWNzW29dID0gMDsKKwkJCSpvdXRzID0gdWNzOworCQkJcmV0dXJuIG87CisJCX0gLyogZWxzZSAoIXVjcykgKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG5hbWUgZnJvbSAiCisJCQkJIm50ZnNfbmFtZV9jYWNoZSEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSAvKiBlbHNlICghaW5zKSAqLworCW50ZnNfZXJyb3IoTlVMTCwgIlJlY2VpdmVkIE5VTEwgcG9pbnRlci4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK2NvbnZlcnNpb25fZXJyOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5hbWUgdXNpbmcgY2hhcmFjdGVyIHNldCAlcyBjb250YWlucyBjaGFyYWN0ZXJzICIKKwkJCSJ0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZS4iLCBubHMtPmNoYXJzZXQpOworCWttZW1fY2FjaGVfZnJlZShudGZzX25hbWVfY2FjaGUsIHVjcyk7CisJcmV0dXJuIC1FSUxTRVE7Cit9CisKKy8qKgorICogbnRmc191Y3N0b25scyAtIGNvbnZlcnQgbGl0dGxlIGVuZGlhbiBVbmljb2RlIHN0cmluZyB0byBOTFMgc3RyaW5nCisgKiBAdm9sOgludGZzIHZvbHVtZSB3aGljaCB3ZSBhcmUgd29ya2luZyB3aXRoCisgKiBAaW5zOglpbnB1dCBVbmljb2RlIHN0cmluZyBidWZmZXIKKyAqIEBpbnNfbGVuOglsZW5ndGggb2YgaW5wdXQgc3RyaW5nIGluIFVuaWNvZGUgY2hhcmFjdGVycworICogQG91dHM6CW9uIHJldHVybiBjb250YWlucyB0aGUgKGFsbG9jYXRlZCkgb3V0cHV0IE5MUyBzdHJpbmcgYnVmZmVyCisgKiBAb3V0c19sZW46CWxlbmd0aCBvZiBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBpbiBieXRlcworICoKKyAqIENvbnZlcnQgdGhlIGlucHV0IGxpdHRsZSBlbmRpYW4sIDItYnl0ZSBVbmljb2RlIHN0cmluZyBAaW5zLCBvZiBsZW5ndGgKKyAqIEBpbnNfbGVuIGludG8gdGhlIHN0cmluZyBmb3JtYXQgZGljdGF0ZWQgYnkgdGhlIGxvYWRlZCBOTFMuCisgKgorICogSWYgKkBvdXRzIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBzdHJpbmcgYW5kIHRoZSBjYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGtmcmVlKCpAb3V0cyk7IHdoZW4gZmluaXNoZWQgd2l0aCBpdC4gSW4gdGhpcyBjYXNlCisgKiBAb3V0c19sZW4gaXMgaWdub3JlZCBhbmQgY2FuIGJlIDAuCisgKgorICogT24gc3VjY2VzcyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICogc3RyaW5nICpAb3V0cyAoPj0gMCksIG5vdCBjb3VudGluZyB0aGUgdGVybWluYXRpbmcgTlVMTCBieXRlLiBJZiB0aGUgb3V0cHV0CisgKiBzdHJpbmcgYnVmZmVyIHdhcyBhbGxvY2F0ZWQsICpAb3V0cyBpcyBzZXQgdG8gaXQuCisgKgorICogT24gZXJyb3IsIGEgbmVnYXRpdmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIEluCisgKiB0aGF0IGNhc2UgdGhlIG91dHB1dCBzdHJpbmcgaXMgbm90IGFsbG9jYXRlZC4gVGhlIGNvbnRlbnRzIG9mICpAb3V0cyBhcmUKKyAqIHRoZW4gdW5kZWZpbmVkLgorICoKKyAqIFRoaXMgbWlnaHQgbG9vayBhIGJpdCBvZGQgZHVlIHRvIGZhc3QgcGF0aCBvcHRpbWl6YXRpb24uLi4KKyAqLworaW50IG50ZnNfdWNzdG9ubHMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgbnRmc2NoYXIgKmlucywKKwkJY29uc3QgaW50IGluc19sZW4sIHVuc2lnbmVkIGNoYXIgKipvdXRzLCBpbnQgb3V0c19sZW4pCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzID0gdm9sLT5ubHNfbWFwOworCXVuc2lnbmVkIGNoYXIgKm5zOworCWludCBpLCBvLCBuc19sZW4sIHdjOworCisJLyogV2UgZG9uJ3QgdHJ1c3Qgb3V0c2lkZSBzb3VyY2VzLiAqLworCWlmIChpbnMpIHsKKwkJbnMgPSAqb3V0czsKKwkJbnNfbGVuID0gb3V0c19sZW47CisJCWlmIChucyAmJiAhbnNfbGVuKSB7CisJCQl3YyA9IC1FTkFNRVRPT0xPTkc7CisJCQlnb3RvIGNvbnZlcnNpb25fZXJyOworCQl9CisJCWlmICghbnMpIHsKKwkJCW5zX2xlbiA9IGluc19sZW4gKiBOTFNfTUFYX0NIQVJTRVRfU0laRTsKKwkJCW5zID0gKHVuc2lnbmVkIGNoYXIqKWttYWxsb2MobnNfbGVuICsgMSwgR0ZQX05PRlMpOworCQkJaWYgKCFucykKKwkJCQlnb3RvIG1lbV9lcnJfb3V0OworCQl9CisJCWZvciAoaSA9IG8gPSAwOyBpIDwgaW5zX2xlbjsgaSsrKSB7CityZXRyeToJCQl3YyA9IG5scy0+dW5pMmNoYXIobGUxNl90b19jcHUoaW5zW2ldKSwgbnMgKyBvLAorCQkJCQluc19sZW4gLSBvKTsKKwkJCWlmICh3YyA+IDApIHsKKwkJCQlvICs9IHdjOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghd2MpCisJCQkJYnJlYWs7CisJCQllbHNlIGlmICh3YyA9PSAtRU5BTUVUT09MT05HICYmIG5zICE9ICpvdXRzKSB7CisJCQkJdW5zaWduZWQgY2hhciAqdGM7CisJCQkJLyogR3JvdyBpbiBtdWx0aXBsZXMgb2YgNjQgYnl0ZXMuICovCisJCQkJdGMgPSAodW5zaWduZWQgY2hhciopa21hbGxvYygobnNfbGVuICsgNjQpICYKKwkJCQkJCX42MywgR0ZQX05PRlMpOworCQkJCWlmICh0YykgeworCQkJCQltZW1jcHkodGMsIG5zLCBuc19sZW4pOworCQkJCQluc19sZW4gPSAoKG5zX2xlbiArIDY0KSAmIH42MykgLSAxOworCQkJCQlrZnJlZShucyk7CisJCQkJCW5zID0gdGM7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfSAvKiBObyBtZW1vcnkgc28gZ290byBjb252ZXJzaW9uX2Vycm9yOyAqLworCQkJfSAvKiB3YyA8IDAsIHJlYWwgZXJyb3IuICovCisJCQlnb3RvIGNvbnZlcnNpb25fZXJyOworCQl9CisJCW5zW29dID0gMDsKKwkJKm91dHMgPSBuczsKKwkJcmV0dXJuIG87CisJfSAvKiBlbHNlICghaW5zKSAqLworCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlJlY2VpdmVkIE5VTEwgcG9pbnRlci4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK2NvbnZlcnNpb25fZXJyOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlVuaWNvZGUgbmFtZSBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlICIKKwkJCSJjb252ZXJ0ZWQgdG8gY2hhcmFjdGVyIHNldCAlcy4iLCBubHMtPmNoYXJzZXQpOworCWlmIChucyAhPSAqb3V0cykKKwkJa2ZyZWUobnMpOworCWlmICh3YyAhPSAtRU5BTUVUT09MT05HKQorCQl3YyA9IC1FSUxTRVE7CisJcmV0dXJuIHdjOworbWVtX2Vycl9vdXQ6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG5hbWUhIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL3VwY2FzZS5jIGIvZnMvbnRmcy91cGNhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzljZGYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy91cGNhc2UuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogdXBjYXNlLmMgLSBHZW5lcmF0ZSB0aGUgZnVsbCBOVEZTIFVuaWNvZGUgdXBjYXNlIHRhYmxlIGluIGxpdHRsZSBlbmRpYW4uCisgKgkgICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIFJpY2hhcmQgUnVzc29uIDxudGZzQGZsYXRjYXAub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogTW9kaWZpZWQgZm9yIG1rbnRmcyBpbmNsdXNpb24gOSBKdW5lIDIwMDEgYnkgQW50b24gQWx0YXBhcm1ha292LgorICogTW9kaWZpZWQgZm9yIGtlcm5lbCBpbmNsdXNpb24gMTAgU2VwdGVtYmVyIDIwMDEgYnkgQW50b24gQWx0cGFybWFrb3YuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTIHNvdXJjZQorICogaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCitudGZzY2hhciAqZ2VuZXJhdGVfZGVmYXVsdF91cGNhc2Uodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IHVjX3J1bl90YWJsZVtdWzNdID0geyAvKiBTdGFydCwgRW5kLCBBZGQgKi8KKwl7MHgwMDYxLCAweDAwN0IsICAtMzJ9LCB7MHgwNDUxLCAweDA0NUQsIC04MH0sIHsweDFGNzAsIDB4MUY3MiwgIDc0fSwKKwl7MHgwMEUwLCAweDAwRjcsICAtMzJ9LCB7MHgwNDVFLCAweDA0NjAsIC04MH0sIHsweDFGNzIsIDB4MUY3NiwgIDg2fSwKKwl7MHgwMEY4LCAweDAwRkYsICAtMzJ9LCB7MHgwNTYxLCAweDA1ODcsIC00OH0sIHsweDFGNzYsIDB4MUY3OCwgMTAwfSwKKwl7MHgwMjU2LCAweDAyNTgsIC0yMDV9LCB7MHgxRjAwLCAweDFGMDgsICAgOH0sIHsweDFGNzgsIDB4MUY3QSwgMTI4fSwKKwl7MHgwMjhBLCAweDAyOEMsIC0yMTd9LCB7MHgxRjEwLCAweDFGMTYsICAgOH0sIHsweDFGN0EsIDB4MUY3QywgMTEyfSwKKwl7MHgwM0FDLCAweDAzQUQsICAtMzh9LCB7MHgxRjIwLCAweDFGMjgsICAgOH0sIHsweDFGN0MsIDB4MUY3RSwgMTI2fSwKKwl7MHgwM0FELCAweDAzQjAsICAtMzd9LCB7MHgxRjMwLCAweDFGMzgsICAgOH0sIHsweDFGQjAsIDB4MUZCMiwgICA4fSwKKwl7MHgwM0IxLCAweDAzQzIsICAtMzJ9LCB7MHgxRjQwLCAweDFGNDYsICAgOH0sIHsweDFGRDAsIDB4MUZEMiwgICA4fSwKKwl7MHgwM0MyLCAweDAzQzMsICAtMzF9LCB7MHgxRjUxLCAweDFGNTIsICAgOH0sIHsweDFGRTAsIDB4MUZFMiwgICA4fSwKKwl7MHgwM0MzLCAweDAzQ0MsICAtMzJ9LCB7MHgxRjUzLCAweDFGNTQsICAgOH0sIHsweDFGRTUsIDB4MUZFNiwgICA3fSwKKwl7MHgwM0NDLCAweDAzQ0QsICAtNjR9LCB7MHgxRjU1LCAweDFGNTYsICAgOH0sIHsweDIxNzAsIDB4MjE4MCwgLTE2fSwKKwl7MHgwM0NELCAweDAzQ0YsICAtNjN9LCB7MHgxRjU3LCAweDFGNTgsICAgOH0sIHsweDI0RDAsIDB4MjRFQSwgLTI2fSwKKwl7MHgwNDMwLCAweDA0NTAsICAtMzJ9LCB7MHgxRjYwLCAweDFGNjgsICAgOH0sIHsweEZGNDEsIDB4RkY1QiwgLTMyfSwKKwl7MH0KKwl9OworCisJc3RhdGljIGNvbnN0IGludCB1Y19kdXBfdGFibGVbXVsyXSA9IHsgLyogU3RhcnQsIEVuZCAqLworCXsweDAxMDAsIDB4MDEyRn0sIHsweDAxQTAsIDB4MDFBNn0sIHsweDAzRTIsIDB4MDNFRn0sIHsweDA0Q0IsIDB4MDRDQ30sCisJezB4MDEzMiwgMHgwMTM3fSwgezB4MDFCMywgMHgwMUI3fSwgezB4MDQ2MCwgMHgwNDgxfSwgezB4MDREMCwgMHgwNEVCfSwKKwl7MHgwMTM5LCAweDAxNDl9LCB7MHgwMUNELCAweDAxRER9LCB7MHgwNDkwLCAweDA0QkZ9LCB7MHgwNEVFLCAweDA0RjV9LAorCXsweDAxNEEsIDB4MDE3OH0sIHsweDAxREUsIDB4MDFFRn0sIHsweDA0QkYsIDB4MDRCRn0sIHsweDA0RjgsIDB4MDRGOX0sCisJezB4MDE3OSwgMHgwMTdFfSwgezB4MDFGNCwgMHgwMUY1fSwgezB4MDRDMSwgMHgwNEM0fSwgezB4MUUwMCwgMHgxRTk1fSwKKwl7MHgwMThCLCAweDAxOEJ9LCB7MHgwMUZBLCAweDAyMTh9LCB7MHgwNEM3LCAweDA0Qzh9LCB7MHgxRUEwLCAweDFFRjl9LAorCXswfQorCX07CisKKwlzdGF0aWMgY29uc3QgaW50IHVjX3dvcmRfdGFibGVbXVsyXSA9IHsgLyogT2Zmc2V0LCBWYWx1ZSAqLworCXsweDAwRkYsIDB4MDE3OH0sIHsweDAxQUQsIDB4MDFBQ30sIHsweDAxRjMsIDB4MDFGMX0sIHsweDAyNjksIDB4MDE5Nn0sCisJezB4MDE4MywgMHgwMTgyfSwgezB4MDFCMCwgMHgwMUFGfSwgezB4MDI1MywgMHgwMTgxfSwgezB4MDI2RiwgMHgwMTlDfSwKKwl7MHgwMTg1LCAweDAxODR9LCB7MHgwMUI5LCAweDAxQjh9LCB7MHgwMjU0LCAweDAxODZ9LCB7MHgwMjcyLCAweDAxOUR9LAorCXsweDAxODgsIDB4MDE4N30sIHsweDAxQkQsIDB4MDFCQ30sIHsweDAyNTksIDB4MDE4Rn0sIHsweDAyNzUsIDB4MDE5Rn0sCisJezB4MDE4QywgMHgwMThCfSwgezB4MDFDNiwgMHgwMUM0fSwgezB4MDI1QiwgMHgwMTkwfSwgezB4MDI4MywgMHgwMUE5fSwKKwl7MHgwMTkyLCAweDAxOTF9LCB7MHgwMUM5LCAweDAxQzd9LCB7MHgwMjYwLCAweDAxOTN9LCB7MHgwMjg4LCAweDAxQUV9LAorCXsweDAxOTksIDB4MDE5OH0sIHsweDAxQ0MsIDB4MDFDQX0sIHsweDAyNjMsIDB4MDE5NH0sIHsweDAyOTIsIDB4MDFCN30sCisJezB4MDFBOCwgMHgwMUE3fSwgezB4MDFERCwgMHgwMThFfSwgezB4MDI2OCwgMHgwMTk3fSwKKwl7MH0KKwl9OworCisJaW50IGksIHI7CisJbnRmc2NoYXIgKnVjOworCisJdWMgPSBudGZzX21hbGxvY19ub2ZzKGRlZmF1bHRfdXBjYXNlX2xlbiAqIHNpemVvZihudGZzY2hhcikpOworCWlmICghdWMpCisJCXJldHVybiB1YzsKKwltZW1zZXQodWMsIDAsIGRlZmF1bHRfdXBjYXNlX2xlbiAqIHNpemVvZihudGZzY2hhcikpOworCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X3VwY2FzZV9sZW47IGkrKykKKwkJdWNbaV0gPSBjcHVfdG9fbGUxNihpKTsKKwlmb3IgKHIgPSAwOyB1Y19ydW5fdGFibGVbcl1bMF07IHIrKykKKwkJZm9yIChpID0gdWNfcnVuX3RhYmxlW3JdWzBdOyBpIDwgdWNfcnVuX3RhYmxlW3JdWzFdOyBpKyspCisJCQl1Y1tpXSA9IGNwdV90b19sZTE2KChsZTE2X3RvX2NwdSh1Y1tpXSkgKworCQkJCQl1Y19ydW5fdGFibGVbcl1bMl0pKTsKKwlmb3IgKHIgPSAwOyB1Y19kdXBfdGFibGVbcl1bMF07IHIrKykKKwkJZm9yIChpID0gdWNfZHVwX3RhYmxlW3JdWzBdOyBpIDwgdWNfZHVwX3RhYmxlW3JdWzFdOyBpICs9IDIpCisJCQl1Y1tpICsgMV0gPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdSh1Y1tpICsgMV0pIC0gMSk7CisJZm9yIChyID0gMDsgdWNfd29yZF90YWJsZVtyXVswXTsgcisrKQorCQl1Y1t1Y193b3JkX3RhYmxlW3JdWzBdXSA9IGNwdV90b19sZTE2KHVjX3dvcmRfdGFibGVbcl1bMV0pOworCXJldHVybiB1YzsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdm9sdW1lLmggYi9mcy9udGZzL3ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTdmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3ZvbHVtZS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogdm9sdW1lLmggLSBEZWZpbmVzIGZvciB2b2x1bWUgc3RydWN0dXJlcyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQKKyAqCSAgICAgIG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX1ZPTFVNRV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1ZPTFVNRV9ICisKKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKworLyoKKyAqIFRoZSBOVEZTIGluIG1lbW9yeSBzdXBlciBibG9jayBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIEZJWE1FOiBSZW9yZGVyIHRvIGhhdmUgY29tbW9ubHkgdXNlZCB0b2dldGhlciBlbGVtZW50IHdpdGhpbiB0aGUKKwkgKiBzYW1lIGNhY2hlIGxpbmUsIGFpbWluZyBhdCBhIGNhY2hlIGxpbmUgc2l6ZSBvZiAzMiBieXRlcy4gQWltIGZvcgorCSAqIDY0IGJ5dGVzIGZvciBsZXNzIGNvbW1vbmx5IHVzZWQgdG9nZXRoZXIgZWxlbWVudHMuIFB1dCBtb3N0IGNvbW1vbmx5CisJICogdXNlZCBlbGVtZW50cyB0byBmcm9udCBvZiBzdHJ1Y3R1cmUuIE9idmlvdXNseSBkbyB0aGlzIG9ubHkgd2hlbiB0aGUKKwkgKiBzdHJ1Y3R1cmUgaGFzIHN0YWJpbGl6ZWQuLi4gKEFJQSkKKwkgKi8KKwkvKiBEZXZpY2Ugc3BlY2lmaWNzLiAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CQkvKiBQb2ludGVyIGJhY2sgdG8gdGhlIHN1cGVyX2Jsb2NrLAorCQkJCQkgICBzbyB3ZSBkb24ndCBoYXZlIHRvIGdldCB0aGUgb2Zmc2V0CisJCQkJCSAgIGV2ZXJ5IHRpbWUuICovCisJTENOIG5yX2Jsb2NrczsJCQkvKiBOdW1iZXIgb2YgTlRGU19CTE9DS19TSVpFIGJ5dGVzCisJCQkJCSAgIHNpemVkIGJsb2NrcyBvbiB0aGUgZGV2aWNlLiAqLworCS8qIENvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdXNlciBhdCBtb3VudCB0aW1lLiAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzLCBzZWUgYmVsb3cuICovCisJdWlkX3QgdWlkOwkJCS8qIHVpZCB0aGF0IGZpbGVzIHdpbGwgYmUgbW91bnRlZCBhcy4gKi8KKwlnaWRfdCBnaWQ7CQkJLyogZ2lkIHRoYXQgZmlsZXMgd2lsbCBiZSBtb3VudGVkIGFzLiAqLworCW1vZGVfdCBmbWFzazsJCQkvKiBUaGUgbWFzayBmb3IgZmlsZSBwZXJtaXNzaW9ucy4gKi8KKwltb2RlX3QgZG1hc2s7CQkJLyogVGhlIG1hc2sgZm9yIGRpcmVjdG9yeQorCQkJCQkgICBwZXJtaXNzaW9ucy4gKi8KKwl1OCBtZnRfem9uZV9tdWx0aXBsaWVyOwkJLyogSW5pdGlhbCBtZnQgem9uZSBtdWx0aXBsaWVyLiAqLworCXU4IG9uX2Vycm9yczsJCQkvKiBXaGF0IHRvIGRvIG9uIGZpbGUgc3lzdGVtIGVycm9ycy4gKi8KKwkvKiBOVEZTIGJvb3RzZWN0b3IgcHJvdmlkZWQgaW5mb3JtYXRpb24uICovCisJdTE2IHNlY3Rvcl9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1OCBzZWN0b3Jfc2l6ZV9iaXRzOwkJLyogbG9nMihzZWN0b3Jfc2l6ZSkgKi8KKwl1MzIgY2x1c3Rlcl9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1MzIgY2x1c3Rlcl9zaXplX21hc2s7CQkvKiBjbHVzdGVyX3NpemUgLSAxICovCisJdTggY2x1c3Rlcl9zaXplX2JpdHM7CQkvKiBsb2cyKGNsdXN0ZXJfc2l6ZSkgKi8KKwl1MzIgbWZ0X3JlY29yZF9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1MzIgbWZ0X3JlY29yZF9zaXplX21hc2s7CS8qIG1mdF9yZWNvcmRfc2l6ZSAtIDEgKi8KKwl1OCBtZnRfcmVjb3JkX3NpemVfYml0czsJLyogbG9nMihtZnRfcmVjb3JkX3NpemUpICovCisJdTMyIGluZGV4X3JlY29yZF9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1MzIgaW5kZXhfcmVjb3JkX3NpemVfbWFzazsJLyogaW5kZXhfcmVjb3JkX3NpemUgLSAxICovCisJdTggaW5kZXhfcmVjb3JkX3NpemVfYml0czsJLyogbG9nMihpbmRleF9yZWNvcmRfc2l6ZSkgKi8KKwlMQ04gbnJfY2x1c3RlcnM7CQkvKiBWb2x1bWUgc2l6ZSBpbiBjbHVzdGVycyA9PSBudW1iZXIgb2YKKwkJCQkJICAgYml0cyBpbiBsY24gYml0bWFwLiAqLworCUxDTiBtZnRfbGNuOwkJCS8qIENsdXN0ZXIgbG9jYXRpb24gb2YgbWZ0IGRhdGEuICovCisJTENOIG1mdG1pcnJfbGNuOwkJLyogQ2x1c3RlciBsb2NhdGlvbiBvZiBjb3B5IG9mIG1mdC4gKi8KKwl1NjQgc2VyaWFsX25vOwkJCS8qIFRoZSB2b2x1bWUgc2VyaWFsIG51bWJlci4gKi8KKwkvKiBNb3VudCBzcGVjaWZpYyBOVEZTIGluZm9ybWF0aW9uLiAqLworCXUzMiB1cGNhc2VfbGVuOwkJCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHVwY2FzZVtdLiAqLworCW50ZnNjaGFyICp1cGNhc2U7CQkvKiBUaGUgdXBjYXNlIHRhYmxlLiAqLworCisJczMyIGF0dHJkZWZfc2l6ZTsJCS8qIFNpemUgb2YgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCisJCQkJCSAgIHRhYmxlIGluIGJ5dGVzLiAqLworCUFUVFJfREVGICphdHRyZGVmOwkJLyogVGFibGUgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLgorCQkJCQkgICBPYnRhaW5lZCBmcm9tIEZJTEVfQXR0ckRlZi4gKi8KKworI2lmZGVmIE5URlNfUlcKKwkvKiBWYXJpYWJsZXMgdXNlZCBieSB0aGUgY2x1c3RlciBhbmQgbWZ0IGFsbG9jYXRvcnMuICovCisJczY0IG1mdF9kYXRhX3BvczsJCS8qIE1mdCByZWNvcmQgbnVtYmVyIGF0IHdoaWNoIHRvCisJCQkJCSAgIGFsbG9jYXRlIHRoZSBuZXh0IG1mdCByZWNvcmQuICovCisJTENOIG1mdF96b25lX3N0YXJ0OwkJLyogRmlyc3QgY2x1c3RlciBvZiB0aGUgbWZ0IHpvbmUuICovCisJTENOIG1mdF96b25lX2VuZDsJCS8qIEZpcnN0IGNsdXN0ZXIgYmV5b25kIHRoZSBtZnQgem9uZS4gKi8KKwlMQ04gbWZ0X3pvbmVfcG9zOwkJLyogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgbWZ0IHpvbmUuICovCisJTENOIGRhdGExX3pvbmVfcG9zOwkJLyogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlyc3QgZGF0YQorCQkJCQkgICB6b25lLiAqLworCUxDTiBkYXRhMl96b25lX3BvczsJCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHNlY29uZCBkYXRhCisJCQkJCSAgIHpvbmUuICovCisjZW5kaWYgLyogTlRGU19SVyAqLworCisJc3RydWN0IGlub2RlICptZnRfaW5vOwkJLyogVGhlIFZGUyBpbm9kZSBvZiAkTUZULiAqLworCisJc3RydWN0IGlub2RlICptZnRibXBfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yICRNRlQvJEJJVE1BUC4gKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIG1mdGJtcF9sb2NrOyAvKiBMb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3NlcyB0byB0aGUKKwkJCQkJICAgIG1mdCByZWNvcmQgYml0bWFwICgkTUZULyRCSVRNQVApLiAqLworI2lmZGVmIE5URlNfUlcKKwlzdHJ1Y3QgaW5vZGUgKm1mdG1pcnJfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRNRlRNaXJyLiAqLworCWludCBtZnRtaXJyX3NpemU7CQkvKiBTaXplIG9mIG1mdCBtaXJyb3IgaW4gbWZ0IHJlY29yZHMuICovCisKKwlzdHJ1Y3QgaW5vZGUgKmxvZ2ZpbGVfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRMb2dGaWxlLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCXN0cnVjdCBpbm9kZSAqbGNuYm1wX2lubzsJLyogVGhlIFZGUyBpbm9kZSBvZiAkQml0bWFwLiAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgbGNuYm1wX2xvY2s7IC8qIExvY2sgZm9yIHNlcmlhbGl6aW5nIGFjY2Vzc2VzIHRvIHRoZQorCQkJCQkgICAgY2x1c3RlciBiaXRtYXAgKCRCaXRtYXAvJERBVEEpLiAqLworCisJc3RydWN0IGlub2RlICp2b2xfaW5vOwkJLyogVGhlIFZGUyBpbm9kZSBvZiAkVm9sdW1lLiAqLworCVZPTFVNRV9GTEFHUyB2b2xfZmxhZ3M7CQkvKiBWb2x1bWUgZmxhZ3MuICovCisJdTggbWFqb3JfdmVyOwkJCS8qIE50ZnMgbWFqb3IgdmVyc2lvbiBvZiB2b2x1bWUuICovCisJdTggbWlub3JfdmVyOwkJCS8qIE50ZnMgbWlub3IgdmVyc2lvbiBvZiB2b2x1bWUuICovCisKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vOwkJLyogVGhlIFZGUyBpbm9kZSBvZiB0aGUgcm9vdAorCQkJCQkgICBkaXJlY3RvcnkuICovCisJc3RydWN0IGlub2RlICpzZWN1cmVfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRTZWN1cmUgKE5URlMzLjArCisJCQkJCSAgIG9ubHksIG90aGVyd2lzZSBOVUxMKS4gKi8KKwlzdHJ1Y3QgaW5vZGUgKmV4dGVuZF9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJEV4dGVuZCAoTlRGUzMuMCsKKwkJCQkJICAgb25seSwgb3RoZXJ3aXNlIE5VTEwpLiAqLworI2lmZGVmIE5URlNfUlcKKwkvKiAkUXVvdGEgc3R1ZmYgaXMgTlRGUzMuMCsgc3BlY2lmaWMuICBVbnVzZWQvTlVMTCBvdGhlcndpc2UuICovCisJc3RydWN0IGlub2RlICpxdW90YV9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJFF1b3RhLiAqLworCXN0cnVjdCBpbm9kZSAqcXVvdGFfcV9pbm87CS8qIEF0dHJpYnV0ZSBpbm9kZSBmb3IgJFF1b3RhLyRRLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfbWFwOworfSBudGZzX3ZvbHVtZTsKKworLyoKKyAqIERlZmluZWQgYml0cyBmb3IgdGhlIGZsYWdzIGZpZWxkIGluIHRoZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTlZfRXJyb3JzLAkJLyogMTogVm9sdW1lIGhhcyBlcnJvcnMsIHByZXZlbnQgcmVtb3VudCBydy4gKi8KKwlOVl9TaG93U3lzdGVtRmlsZXMsCS8qIDE6IFJldHVybiBzeXN0ZW0gZmlsZXMgaW4gbnRmc19yZWFkZGlyKCkuICovCisJTlZfQ2FzZVNlbnNpdGl2ZSwJLyogMTogVHJlYXQgZmlsZSBuYW1lcyBhcyBjYXNlIHNlbnNpdGl2ZSBhbmQKKwkJCQkgICAgICBjcmVhdGUgZmlsZW5hbWVzIGluIHRoZSBQT1NJWCBuYW1lc3BhY2UuCisJCQkJICAgICAgT3RoZXJ3aXNlIGJlIGNhc2UgaW5zZW5zaXRpdmUgYW5kIGNyZWF0ZQorCQkJCSAgICAgIGZpbGUgbmFtZXMgaW4gV0lOMzIgbmFtZXNwYWNlLiAqLworCU5WX0xvZ0ZpbGVFbXB0eSwJLyogMTogJExvZ0ZpbGUgam91cm5hbCBpcyBlbXB0eS4gKi8KKwlOVl9RdW90YU91dE9mRGF0ZSwJLyogMTogJFF1b3RhIGlzIG91dCBvZiBkYXRlLiAqLworfSBudGZzX3ZvbHVtZV9mbGFnczsKKworLyoKKyAqIE1hY3JvIHRyaWNrcyB0byBleHBhbmQgdGhlIE5Wb2xGb28oKSwgTlZvbFNldEZvbygpLCBhbmQgTlZvbENsZWFyRm9vKCkKKyAqIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBOVk9MX0ZOUyhmbGFnKQkJCQkJXAorc3RhdGljIGlubGluZSBpbnQgTlZvbCMjZmxhZyhudGZzX3ZvbHVtZSAqdm9sKQkJXAorewkJCQkJCQlcCisJcmV0dXJuIHRlc3RfYml0KE5WXyMjZmxhZywgJih2b2wpLT5mbGFncyk7CVwKK30JCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIE5Wb2xTZXQjI2ZsYWcobnRmc192b2x1bWUgKnZvbCkJXAorewkJCQkJCQlcCisJc2V0X2JpdChOVl8jI2ZsYWcsICYodm9sKS0+ZmxhZ3MpOwkJXAorfQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgTlZvbENsZWFyIyNmbGFnKG50ZnNfdm9sdW1lICp2b2wpCVwKK3sJCQkJCQkJXAorCWNsZWFyX2JpdChOVl8jI2ZsYWcsICYodm9sKS0+ZmxhZ3MpOwkJXAorfQorCisvKiBFbWl0IHRoZSBudGZzIHZvbHVtZSBiaXRvcHMgZnVuY3Rpb25zLiAqLworTlZPTF9GTlMoRXJyb3JzKQorTlZPTF9GTlMoU2hvd1N5c3RlbUZpbGVzKQorTlZPTF9GTlMoQ2FzZVNlbnNpdGl2ZSkKK05WT0xfRk5TKExvZ0ZpbGVFbXB0eSkKK05WT0xfRk5TKFF1b3RhT3V0T2ZEYXRlKQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfVk9MVU1FX0ggKi8K