From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: [PATCH v10 03/24] libxc: Implementation of XEN_XSPLICE_op in libxc Date: Wed, 27 Apr 2016 15:27:00 -0400 Message-ID: <1461785241-4481-4-git-send-email-konrad.wilk@oracle.com> References: <1461785241-4481-1-git-send-email-konrad.wilk@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1avV8R-0004lf-Sf for xen-devel@lists.xenproject.org; Wed, 27 Apr 2016 19:28:32 +0000 In-Reply-To: <1461785241-4481-1-git-send-email-konrad.wilk@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: konrad@kernel.org, xen-devel@lists.xenproject.org, sasha.levin@oracle.com, andrew.cooper3@citrix.com, ross.lagerwall@citrix.com, mpohlack@amazon.de Cc: Wei Liu , Stefano Stabellini , Ian Jackson , Konrad Rzeszutek Wilk List-Id: xen-devel@lists.xenproject.org VGhlIHVuZGVybGF5aW5nIHRvb2xzdGFjayBjb2RlIHRvIGRvIHRoZSBiYXNpYwpvcGVyYXRpb25z IHdoZW4gdXNpbmcgdGhlIFhFTl9YU1BMSUNFX29wIHN5c2NhbGxzOgogLSB1cGxvYWQgdGhlIHBh eWxvYWQsCiAtIGdldCBzdGF0dXMgb2YgYW4gcGF5bG9hZCwKIC0gbGlzdCBhbGwgdGhlIHBheWxv YWRzLAogLSBhcHBseSwgY2hlY2ssIHJlcGxhY2UsIGFuZCByZXZlcnQgdGhlIHBheWxvYWQuCgpT aWduZWQtb2ZmLWJ5OiBLb25yYWQgUnplc3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5j b20+ClNpZ25lZC1vZmYtYnk6IFJvc3MgTGFnZXJ3YWxsIDxyb3NzLmxhZ2Vyd2FsbEBjaXRyaXgu Y29tPgpBY2tlZC1ieTogV2VpIExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KUmV2aWV3ZWQtYnk6 IEFuZHJldyBDb29wZXIgPGFuZHJldy5jb29wZXIzQGNpdHJpeC5jb20+CgotLS0KQ2M6IElhbiBK YWNrc29uIDxpYW4uamFja3NvbkBldS5jaXRyaXguY29tPgpDYzogU3RlZmFubyBTdGFiZWxsaW5p IDxzc3RhYmVsbGluaUBrZXJuZWwub3JnPgpDYzogV2VpIExpdSA8d2VpLmxpdTJAY2l0cml4LmNv bT4KCnYyOiBBY3R1YWxseSBzZXQgemVybyBmb3IgdGhlIF9wYWQgZW50cmllcy4KdjM6IFNwbGl0 IHN0YXR1cyBpbnRvIHN0YXRlIGFuZCBlcnJvciBjb2RlLgogICAgQWRkIFJFUExBQ0UgYWN0aW9u LgogLSBVc2UgdGltZW91dCBhbmQgdXRpbGl6ZSBwYWRzLgogLSBVcGRhdGUgcGVyIFdlaSdzIHJl dmlldy4KIC0gRXh0cmEgc3BhY2Ugc2xpcHBlZCBpbiwgcmVtb3ZlIGl0CnY0OiBBZGQgV2VpJ3Mg cmV2aWV3LCB1cGRhdGUgY29tbWVudCBhbmQgQWNrLgp2NzogU3ByaW5rbGUgZXJybm89LUVJTlZB TCBvbiBhbGwgdGhlICdpZiAoIWxlbiknLCBldGMgY2hlY2tzLgogICAgQWRkZWQgUmV2aWV3ZWQt YnkgZnJvbSBBbmRyZXcuCnYxMDogRHJvcCBYU1BMSUNFX0FDVElPTl9DSEVDSyB1c2FnZS4KLS0t Ci0tLQogdG9vbHMvbGlieGMvaW5jbHVkZS94ZW5jdHJsLmggfCAgNjEgKysrKysrKysKIHRvb2xz L2xpYnhjL3hjX21pc2MuYyAgICAgICAgIHwgMzUwICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA0MTEgaW5zZXJ0aW9ucygrKQoKZGlm ZiAtLWdpdCBhL3Rvb2xzL2xpYnhjL2luY2x1ZGUveGVuY3RybC5oIGIvdG9vbHMvbGlieGMvaW5j bHVkZS94ZW5jdHJsLmgKaW5kZXggNDJmMjAxYi4uZGM1NDYxMiAxMDA2NDQKLS0tIGEvdG9vbHMv bGlieGMvaW5jbHVkZS94ZW5jdHJsLmgKKysrIGIvdG9vbHMvbGlieGMvaW5jbHVkZS94ZW5jdHJs LmgKQEAgLTI2MTAsNiArMjYxMCw2NyBAQCBjb25zdCB1aW50MzJfdCAqeGNfZ2V0X2ZlYXR1cmVf ZGVlcF9kZXBzKHVpbnQzMl90IGZlYXR1cmUpOwogCiAjZW5kaWYKIAoraW50IHhjX3hzcGxpY2Vf dXBsb2FkKHhjX2ludGVyZmFjZSAqeGNoLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5h bWUsIHVuc2lnbmVkIGNoYXIgKnBheWxvYWQsIHVpbnQzMl90IHNpemUpOworCitpbnQgeGNfeHNw bGljZV9nZXQoeGNfaW50ZXJmYWNlICp4Y2gsCisgICAgICAgICAgICAgICAgICAgY2hhciAqbmFt ZSwKKyAgICAgICAgICAgICAgICAgICB4ZW5feHNwbGljZV9zdGF0dXNfdCAqc3RhdHVzKTsKKwor LyoKKyAqIFRoZSBoZWFydCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdldCBhbiBhcnJheSBvZiB4 ZW5feHNwbGljZV9zdGF0dXNfdC4KKyAqCisgKiBIb3dldmVyIGl0IGlzIGNvbXBsZXggYmVjYXVz ZSBpdCBoYXMgdG8gZGVhbCB3aXRoIHRoZSBoeXBlcnZpc29yCisgKiByZXR1cm5pbmcgc29tZSBv ZiB0aGUgcmVxdWVzdGVkIGRhdGEgb3IgZGF0YSBiZWluZyBzdGFsZQorICogKGFub3RoZXIgaHlw ZXJjYWxsIG1pZ2h0IGFsdGVyIHRoZSBsaXN0KS4KKyAqCisgKiBUaGUgcGFyYW1ldGVycyB0aGF0 IHRoZSBmdW5jdGlvbiBleHBlY3RzIHRvIGNvbnRhaW4gZGF0YSBmcm9tCisgKiB0aGUgaHlwZXJ2 aXNvciBhcmU6ICdpbmZvJywgJ25hbWUnLCBhbmQgJ2xlbicuIFRoZSAnZG9uZScgYW5kCisgKiAn bGVmdCcgYXJlIGFsc28gdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgZW50cmllcyBmaWxsZWQg b3V0CisgKiBhbmQgcmVzcGVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgZW50cmllcyBsZWZ0IHRvIGdl dCBmcm9tIGh5cGVydmlzb3IuCisgKgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY2FsbGVy IG9mIHRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZQorICogJ2xlZnQnIGFuZCB1c2UgdGhlIHZh bHVlIGZvciAnc3RhcnQnLiBUaGlzIHdheSB3ZSBoYXZlIGFuCisgKiBjdXJzb3IgaW4gdGhlIGFy cmF5LiBOb3RlIHRoYXQgdGhlICdpbmZvJywnbmFtZScsIGFuZCAnbGVuJyB3aWxsCisgKiBiZSB1 cGRhdGVkIGF0IHRoZSBzdWJzZXF1ZW50IGNhbGxzLgorICoKKyAqIFRoZSAnbWF4JyBpcyB0byBi ZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyIHdpdGggdGhlIG1heGltdW0KKyAqIG51bWJlciBvZiBl bnRyaWVzIHRoYXQgJ2luZm8nLCAnbmFtZScsIGFuZCAnbGVuJyBhcnJheXMgY2FuCisgKiBiZSBm aWxsZWQgdXAgd2l0aC4KKyAqCisgKiBFYWNoIGVudHJ5IGluIHRoZSAnbmFtZScgYXJyYXkgaXMg ZXhwZWN0ZWQgdG8gYmUgb2YgWEVOX1hTUExJQ0VfTkFNRV9TSVpFCisgKiBsZW5ndGguCisgKgor ICogRWFjaCBlbnRyeSBpbiB0aGUgJ2luZm8nIGFycmF5IGlzIGV4cGVjdGVkIHRvIGJlIG9mIHhl bl94c3BsaWNlX3N0YXR1c190CisgKiBzdHJ1Y3R1cmUgc2l6ZS4KKyAqCisgKiBFYWNoIGVudHJ5 IGluIHRoZSAnbGVuJyBhcnJheSBpcyBleHBlY3RlZCB0byBiZSBvZiB1aW50MzJfdCBzaXplLgor ICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBpZiB0aGUgaHlwZXJjYWxsIGNvbXBsZXRl ZCBzdWNjZXNzZnVsbHkuCisgKiBOb3RlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBfbm90XyB0 aGUgYW1vdW50IG9mIGVudHJpZXMgZmlsbGVkCisgKiBvdXQgLSB0aGF0IGlzIHNhdmVkIGluICdk b25lJy4KKyAqCisgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcGVyZm9ybWluZyB0aGUgb3BlcmF0 aW9uLCB0aGUgcmV0dXJuIHZhbHVlCisgKiB3aWxsIGNvbnRhaW4gYW4gbmVnYXRpdmUgLUVYWCB0 eXBlIHZhbHVlLiBUaGUgJ2RvbmUnIGFuZCAnbGVmdCcKKyAqIHdpbGwgY29udGFpbiB0aGUgbnVt YmVyIG9mIGVudHJpZXMgdGhhdCBoYWQgYmVlbiBzdWNjZXNmdWxseQorICogcmV0cmlldmVkIChp ZiBhbnkpLgorICovCitpbnQgeGNfeHNwbGljZV9saXN0KHhjX2ludGVyZmFjZSAqeGNoLCB1bnNp Z25lZCBpbnQgbWF4LCB1bnNpZ25lZCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIHhl bl94c3BsaWNlX3N0YXR1c190ICppbmZvLCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAg ICB1aW50MzJfdCAqbGVuLCB1bnNpZ25lZCBpbnQgKmRvbmUsCisgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGludCAqbGVmdCk7CisKKy8qCisgKiBUaGUgb3BlcmF0aW9ucyBhcmUgYXN5bmNo cm9ub3VzIGFuZCB0aGUgaHlwZXJ2aXNvciBtYXkgdGFrZSBhIHdoaWxlCisgKiB0byBjb21wbGV0 ZSB0aGVtLiBUaGUgYHRpbWVvdXRgIG9mZmVycyBhbiBvcHRpb24gdG8gZXhwaXJlIHRoZQorICog b3BlcmF0aW9uIGlmIGl0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSBzcGVjaWZp ZWQgdGltZQorICogKGluIG1zKS4gVmFsdWUgb2YgMCBtZWFucyBsZXQgaHlwZXJ2aXNvciBkZWNp ZGUgdGhlIGJlc3QgdGltZW91dC4KKyAqLworaW50IHhjX3hzcGxpY2VfYXBwbHkoeGNfaW50ZXJm YWNlICp4Y2gsIGNoYXIgKm5hbWUsIHVpbnQzMl90IHRpbWVvdXQpOworaW50IHhjX3hzcGxpY2Vf cmV2ZXJ0KHhjX2ludGVyZmFjZSAqeGNoLCBjaGFyICpuYW1lLCB1aW50MzJfdCB0aW1lb3V0KTsK K2ludCB4Y194c3BsaWNlX3VubG9hZCh4Y19pbnRlcmZhY2UgKnhjaCwgY2hhciAqbmFtZSwgdWlu dDMyX3QgdGltZW91dCk7CitpbnQgeGNfeHNwbGljZV9yZXBsYWNlKHhjX2ludGVyZmFjZSAqeGNo LCBjaGFyICpuYW1lLCB1aW50MzJfdCB0aW1lb3V0KTsKKwogLyogQ29tcGF0IHNoaW1zICovCiAj aW5jbHVkZSAieGVuY3RybF9jb21wYXQuaCIKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGlieGMveGNf bWlzYy5jIGIvdG9vbHMvbGlieGMveGNfbWlzYy5jCmluZGV4IDdkOTk3ZDkuLmQ3M2Y2MjIgMTAw NjQ0Ci0tLSBhL3Rvb2xzL2xpYnhjL3hjX21pc2MuYworKysgYi90b29scy9saWJ4Yy94Y19taXNj LmMKQEAgLTY5Niw2ICs2OTYsMzU2IEBAIGludCB4Y19odm1faW5qZWN0X3RyYXAoCiAgICAgcmV0 dXJuIHJjOwogfQogCitpbnQgeGNfeHNwbGljZV91cGxvYWQoeGNfaW50ZXJmYWNlICp4Y2gsCisg ICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB1 bnNpZ25lZCBjaGFyICpwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNp emUpCit7CisgICAgaW50IHJjOworICAgIERFQ0xBUkVfU1lTQ1RMOworICAgIERFQ0xBUkVfSFlQ RVJDQUxMX0JVRkZFUihjaGFyLCBsb2NhbCk7CisgICAgREVDTEFSRV9IWVBFUkNBTExfQk9VTkNF KG5hbWUsIDAgLyogbGF0ZXIgKi8sIFhDX0hZUEVSQ0FMTF9CVUZGRVJfQk9VTkNFX0lOKTsKKyAg ICB4ZW5feHNwbGljZV9uYW1lX3QgZGVmX25hbWUgPSB7IC5wYWQgPSB7IDAsIDAsIDAgfSB9Owor CisgICAgaWYgKCAhbmFtZSB8fCAhcGF5bG9hZCApCisgICAgeworICAgICAgICBlcnJubyA9IEVJ TlZBTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGRlZl9uYW1lLnNpemUgPSBz dHJsZW4obmFtZSkgKyAxOworICAgIGlmICggZGVmX25hbWUuc2l6ZSA+IFhFTl9YU1BMSUNFX05B TUVfU0laRSApCisgICAgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJu IC0xOworICAgIH0KKworICAgIEhZUEVSQ0FMTF9CT1VOQ0VfU0VUX1NJWkUobmFtZSwgZGVmX25h bWUuc2l6ZSk7CisKKyAgICBpZiAoIHhjX2h5cGVyY2FsbF9ib3VuY2VfcHJlKHhjaCwgbmFtZSkg KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBsb2NhbCA9IHhjX2h5cGVyY2FsbF9idWZmZXJf YWxsb2MoeGNoLCBsb2NhbCwgc2l6ZSk7CisgICAgaWYgKCAhbG9jYWwgKQorICAgIHsKKyAgICAg ICAgeGNfaHlwZXJjYWxsX2JvdW5jZV9wb3N0KHhjaCwgbmFtZSk7CisgICAgICAgIHJldHVybiAt MTsKKyAgICB9CisgICAgbWVtY3B5KGxvY2FsLCBwYXlsb2FkLCBzaXplKTsKKworICAgIHN5c2N0 bC5jbWQgPSBYRU5fU1lTQ1RMX3hzcGxpY2Vfb3A7CisgICAgc3lzY3RsLnUueHNwbGljZS5jbWQg PSBYRU5fU1lTQ1RMX1hTUExJQ0VfVVBMT0FEOworICAgIHN5c2N0bC51LnhzcGxpY2UucGFkID0g MDsKKyAgICBzeXNjdGwudS54c3BsaWNlLnUudXBsb2FkLnNpemUgPSBzaXplOworICAgIHNldF94 ZW5fZ3Vlc3RfaGFuZGxlKHN5c2N0bC51LnhzcGxpY2UudS51cGxvYWQucGF5bG9hZCwgbG9jYWwp OworCisgICAgc3lzY3RsLnUueHNwbGljZS51LnVwbG9hZC5uYW1lID0gZGVmX25hbWU7CisgICAg c2V0X3hlbl9ndWVzdF9oYW5kbGUoc3lzY3RsLnUueHNwbGljZS51LnVwbG9hZC5uYW1lLm5hbWUs IG5hbWUpOworCisgICAgcmMgPSBkb19zeXNjdGwoeGNoLCAmc3lzY3RsKTsKKworICAgIHhjX2h5 cGVyY2FsbF9idWZmZXJfZnJlZSh4Y2gsIGxvY2FsKTsKKyAgICB4Y19oeXBlcmNhbGxfYm91bmNl X3Bvc3QoeGNoLCBuYW1lKTsKKworICAgIHJldHVybiByYzsKK30KKworaW50IHhjX3hzcGxpY2Vf Z2V0KHhjX2ludGVyZmFjZSAqeGNoLAorICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsCisg ICAgICAgICAgICAgICAgICAgeGVuX3hzcGxpY2Vfc3RhdHVzX3QgKnN0YXR1cykKK3sKKyAgICBp bnQgcmM7CisgICAgREVDTEFSRV9TWVNDVEw7CisgICAgREVDTEFSRV9IWVBFUkNBTExfQk9VTkNF KG5hbWUsIDAgLyphZGp1c3QgbGF0ZXIgKi8sIFhDX0hZUEVSQ0FMTF9CVUZGRVJfQk9VTkNFX0lO KTsKKyAgICB4ZW5feHNwbGljZV9uYW1lX3QgZGVmX25hbWUgPSB7IC5wYWQgPSB7IDAsIDAsIDAg fSB9OworCisgICAgaWYgKCAhbmFtZSApCisgICAgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsK KyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGRlZl9uYW1lLnNpemUgPSBzdHJsZW4o bmFtZSkgKyAxOworICAgIGlmICggZGVmX25hbWUuc2l6ZSA+IFhFTl9YU1BMSUNFX05BTUVfU0la RSApCisgICAgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC0xOwor ICAgIH0KKworICAgIEhZUEVSQ0FMTF9CT1VOQ0VfU0VUX1NJWkUobmFtZSwgZGVmX25hbWUuc2l6 ZSk7CisKKyAgICBpZiAoIHhjX2h5cGVyY2FsbF9ib3VuY2VfcHJlKHhjaCwgbmFtZSkgKQorICAg ICAgICByZXR1cm4gLTE7CisKKyAgICBzeXNjdGwuY21kID0gWEVOX1NZU0NUTF94c3BsaWNlX29w OworICAgIHN5c2N0bC51LnhzcGxpY2UuY21kID0gWEVOX1NZU0NUTF9YU1BMSUNFX0dFVDsKKyAg ICBzeXNjdGwudS54c3BsaWNlLnBhZCA9IDA7CisKKyAgICBzeXNjdGwudS54c3BsaWNlLnUuZ2V0 LnN0YXR1cy5zdGF0ZSA9IDA7CisgICAgc3lzY3RsLnUueHNwbGljZS51LmdldC5zdGF0dXMucmMg PSAwOworCisgICAgc3lzY3RsLnUueHNwbGljZS51LmdldC5uYW1lID0gZGVmX25hbWU7CisgICAg c2V0X3hlbl9ndWVzdF9oYW5kbGUoc3lzY3RsLnUueHNwbGljZS51LmdldC5uYW1lLm5hbWUsIG5h bWUpOworCisgICAgcmMgPSBkb19zeXNjdGwoeGNoLCAmc3lzY3RsKTsKKworICAgIHhjX2h5cGVy Y2FsbF9ib3VuY2VfcG9zdCh4Y2gsIG5hbWUpOworCisgICAgbWVtY3B5KHN0YXR1cywgJnN5c2N0 bC51LnhzcGxpY2UudS5nZXQuc3RhdHVzLCBzaXplb2YoKnN0YXR1cykpOworCisgICAgcmV0dXJu IHJjOworfQorCisvKgorICogVGhlIGhlYXJ0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IGFu IGFycmF5IG9mIHhlbl94c3BsaWNlX3N0YXR1c190LgorICoKKyAqIEhvd2V2ZXIgaXQgaXMgY29t cGxleCBiZWNhdXNlIGl0IGhhcyB0byBkZWFsIHdpdGggdGhlIGh5cGVydmlzb3IKKyAqIHJldHVy bmluZyBzb21lIG9mIHRoZSByZXF1ZXN0ZWQgZGF0YSBvciBkYXRhIGJlaW5nIHN0YWxlCisgKiAo YW5vdGhlciBoeXBlcmNhbGwgbWlnaHQgYWx0ZXIgdGhlIGxpc3QpLgorICoKKyAqIFRoZSBwYXJh bWV0ZXJzIHRoYXQgdGhlIGZ1bmN0aW9uIGV4cGVjdHMgdG8gY29udGFpbiBkYXRhIGZyb20KKyAq IHRoZSBoeXBlcnZpc29yIGFyZTogJ2luZm8nLCAnbmFtZScsIGFuZCAnbGVuJy4gVGhlICdkb25l JyBhbmQKKyAqICdsZWZ0JyBhcmUgYWxzbyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBlbnRy aWVzIGZpbGxlZCBvdXQKKyAqIGFuZCByZXNwZWN0aXZlbHkgdGhlIG51bWJlciBvZiBlbnRyaWVz IGxlZnQgdG8gZ2V0IGZyb20gaHlwZXJ2aXNvci4KKyAqCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0 IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgdGhlCisgKiAnbGVmdCcgYW5k IHVzZSB0aGUgdmFsdWUgZm9yICdzdGFydCcuIFRoaXMgd2F5IHdlIGhhdmUgYW4KKyAqIGN1cnNv ciBpbiB0aGUgYXJyYXkuIE5vdGUgdGhhdCB0aGUgJ2luZm8nLCduYW1lJywgYW5kICdsZW4nIHdp bGwKKyAqIGJlIHVwZGF0ZWQgYXQgdGhlIHN1YnNlcXVlbnQgY2FsbHMuCisgKgorICogVGhlICdt YXgnIGlzIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgd2l0aCB0aGUgbWF4aW11bQorICog bnVtYmVyIG9mIGVudHJpZXMgdGhhdCAnaW5mbycsICduYW1lJywgYW5kICdsZW4nIGFycmF5cyBj YW4KKyAqIGJlIGZpbGxlZCB1cCB3aXRoLgorICoKKyAqIEVhY2ggZW50cnkgaW4gdGhlICduYW1l JyBhcnJheSBpcyBleHBlY3RlZCB0byBiZSBvZiBYRU5fWFNQTElDRV9OQU1FX1NJWkUKKyAqIGxl bmd0aC4KKyAqCisgKiBFYWNoIGVudHJ5IGluIHRoZSAnaW5mbycgYXJyYXkgaXMgZXhwZWN0ZWQg dG8gYmUgb2YgeGVuX3hzcGxpY2Vfc3RhdHVzX3QKKyAqIHN0cnVjdHVyZSBzaXplLgorICoKKyAq IEVhY2ggZW50cnkgaW4gdGhlICdsZW4nIGFycmF5IGlzIGV4cGVjdGVkIHRvIGJlIG9mIHVpbnQz Ml90IHNpemUuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGlmIHRoZSBoeXBlcmNh bGwgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVl IGlzIF9ub3RfIHRoZSBhbW91bnQgb2YgZW50cmllcyBmaWxsZWQKKyAqIG91dCAtIHRoYXQgaXMg c2F2ZWQgaW4gJ2RvbmUnLgorICoKKyAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciBwZXJmb3JtaW5n IHRoZSBvcGVyYXRpb24sIHRoZSByZXR1cm4gdmFsdWUKKyAqIHdpbGwgY29udGFpbiBhbiBuZWdh dGl2ZSAtRVhYIHR5cGUgdmFsdWUuIFRoZSAnZG9uZScgYW5kICdsZWZ0JworICogd2lsbCBjb250 YWluIHRoZSBudW1iZXIgb2YgZW50cmllcyB0aGF0IGhhZCBiZWVuIHN1Y2Nlc2Z1bGx5CisgKiBy ZXRyaWV2ZWQgKGlmIGFueSkuCisgKi8KK2ludCB4Y194c3BsaWNlX2xpc3QoeGNfaW50ZXJmYWNl ICp4Y2gsIHVuc2lnbmVkIGludCBtYXgsIHVuc2lnbmVkIGludCBzdGFydCwKKyAgICAgICAgICAg ICAgICAgICAgeGVuX3hzcGxpY2Vfc3RhdHVzX3QgKmluZm8sCisgICAgICAgICAgICAgICAgICAg IGNoYXIgKm5hbWUsIHVpbnQzMl90ICpsZW4sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVk IGludCAqZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsZWZ0KQorewor ICAgIGludCByYzsKKyAgICBERUNMQVJFX1NZU0NUTDsKKyAgICAvKiBUaGUgc2l6ZXMgYXJlIGFk anVzdGVkIGxhdGVyIC0gaGVuY2UgemVyby4gKi8KKyAgICBERUNMQVJFX0hZUEVSQ0FMTF9CT1VO Q0UoaW5mbywgMCwgWENfSFlQRVJDQUxMX0JVRkZFUl9CT1VOQ0VfT1VUKTsKKyAgICBERUNMQVJF X0hZUEVSQ0FMTF9CT1VOQ0UobmFtZSwgMCwgWENfSFlQRVJDQUxMX0JVRkZFUl9CT1VOQ0VfT1VU KTsKKyAgICBERUNMQVJFX0hZUEVSQ0FMTF9CT1VOQ0UobGVuLCAwLCBYQ19IWVBFUkNBTExfQlVG RkVSX0JPVU5DRV9PVVQpOworICAgIHVpbnQzMl90IG1heF9iYXRjaF9zeiwgbnI7CisgICAgdWlu dDMyX3QgdmVyc2lvbiA9IDAsIHJldHJpZXMgPSAwOworICAgIHVpbnQzMl90IGFkanVzdCA9IDA7 CisgICAgc3NpemVfdCBzejsKKworICAgIGlmICggIW1heCB8fCAhaW5mbyB8fCAhbmFtZSB8fCAh bGVuICkKKyAgICB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gLTE7 CisgICAgfQorCisgICAgc3lzY3RsLmNtZCA9IFhFTl9TWVNDVExfeHNwbGljZV9vcDsKKyAgICBz eXNjdGwudS54c3BsaWNlLmNtZCA9IFhFTl9TWVNDVExfWFNQTElDRV9MSVNUOworICAgIHN5c2N0 bC51LnhzcGxpY2UucGFkID0gMDsKKyAgICBzeXNjdGwudS54c3BsaWNlLnUubGlzdC52ZXJzaW9u ID0gMDsKKyAgICBzeXNjdGwudS54c3BsaWNlLnUubGlzdC5pZHggPSBzdGFydDsKKyAgICBzeXNj dGwudS54c3BsaWNlLnUubGlzdC5wYWQgPSAwOworCisgICAgbWF4X2JhdGNoX3N6ID0gbWF4Owor ICAgIC8qIENvbnZpZW5jZSB2YWx1ZS4gKi8KKyAgICBzeiA9IHNpemVvZigqbmFtZSkgKiBYRU5f WFNQTElDRV9OQU1FX1NJWkU7CisgICAgKmRvbmUgPSAwOworICAgICpsZWZ0ID0gMDsKKyAgICBk byB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmaXJzdCB0aW1lIHdlIGdvIGluIHRoaXMg bG9vcCBvdXIgJ21heCcgbWF5IGJlIGJpZ2dlcgorICAgICAgICAgKiB0aGFuIHdoYXQgdGhlIGh5 cGVydmlzb3IgaXMgY29tZm9ydGFibGUgd2l0aCAtIGhlbmNlIHRoZSBmaXJzdAorICAgICAgICAg KiBjb3VwbGUgb2YgbG9vcHMgbWF5IGFkanVzdCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2Ugd2ls bAorICAgICAgICAgKiB3YW50IGZpbGxlZCAodHJhY2tlZCBieSAnbnInKS4KKyAgICAgICAgICoK KyAgICAgICAgICogTi5CLiBUaGlzIGlzIGEgZG8geyB9IHdoaWxlIGxvb3AgYW5kIHRoZSByaWdo dCBoYW5kIHNpZGUgb2YKKyAgICAgICAgICogdGhlIGNvbmRpdGlvbmFsIHdoZW4gYWRqdXN0aW5n IHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UgKGFzCisgICAgICAgICAqICpsZWZ0IGlzIHNldCB0byB6 ZXJvIGJlZm9yZSB0aGUgbG9vcC4gSGVuY2Ugd2UgbmVlZCB0aGlzCisgICAgICAgICAqIGFkanVz dCAtIGV2ZW4gaWYgd2UgcmVzZXQgaXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsb29wLgorICAgICAg ICAgKi8KKyAgICAgICAgaWYgKCBhZGp1c3QgKQorICAgICAgICAgICAgYWRqdXN0ID0gMDsgLyog VXNlZCB3aGVuIGFkanVzdGluZyB0aGUgJ21heF9iYXRjaF9zeicgb3IgJ3JldHJpZXMnLiAqLwor CisgICAgICAgIG5yID0gbWluKG1heCAtICpkb25lLCBtYXhfYmF0Y2hfc3opOworCisgICAgICAg IHN5c2N0bC51LnhzcGxpY2UudS5saXN0Lm5yID0gbnI7CisgICAgICAgIC8qIEZpeCB0aGUgc2l6 ZSAobWF5IHZhcnkgYmV0d2VlbiBoeXBlcmNhbGxzKS4gKi8KKyAgICAgICAgSFlQRVJDQUxMX0JP VU5DRV9TRVRfU0laRShpbmZvLCBuciAqIHNpemVvZigqaW5mbykpOworICAgICAgICBIWVBFUkNB TExfQk9VTkNFX1NFVF9TSVpFKG5hbWUsIG5yICogbnIpOworICAgICAgICBIWVBFUkNBTExfQk9V TkNFX1NFVF9TSVpFKGxlbiwgbnIgKiBzaXplb2YoKmxlbikpOworICAgICAgICAvKiBNb3ZlIHRo ZSBwb2ludGVyIHRvIHByb3BlciBvZmZzZXQgaW50byAnaW5mbycuICovCisgICAgICAgIChIWVBF UkNBTExfQlVGRkVSKGluZm8pKS0+dWJ1ZiA9IGluZm8gKyAqZG9uZTsKKyAgICAgICAgKEhZUEVS Q0FMTF9CVUZGRVIobmFtZSkpLT51YnVmID0gbmFtZSArIChzeiAqICpkb25lKTsKKyAgICAgICAg KEhZUEVSQ0FMTF9CVUZGRVIobGVuKSktPnVidWYgPSBsZW4gKyAqZG9uZTsKKyAgICAgICAgLyog QWxsb2NhdGUgbWVtb3J5LiAqLworICAgICAgICByYyA9IHhjX2h5cGVyY2FsbF9ib3VuY2VfcHJl KHhjaCwgaW5mbyk7CisgICAgICAgIGlmICggcmMgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAg ICAgICAgcmMgPSB4Y19oeXBlcmNhbGxfYm91bmNlX3ByZSh4Y2gsIG5hbWUpOworICAgICAgICBp ZiAoIHJjICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJjID0geGNfaHlwZXJjYWxs X2JvdW5jZV9wcmUoeGNoLCBsZW4pOworICAgICAgICBpZiAoIHJjICkKKyAgICAgICAgICAgIGJy ZWFrOworCisgICAgICAgIHNldF94ZW5fZ3Vlc3RfaGFuZGxlKHN5c2N0bC51LnhzcGxpY2UudS5s aXN0LnN0YXR1cywgaW5mbyk7CisgICAgICAgIHNldF94ZW5fZ3Vlc3RfaGFuZGxlKHN5c2N0bC51 LnhzcGxpY2UudS5saXN0Lm5hbWUsIG5hbWUpOworICAgICAgICBzZXRfeGVuX2d1ZXN0X2hhbmRs ZShzeXNjdGwudS54c3BsaWNlLnUubGlzdC5sZW4sIGxlbik7CisKKyAgICAgICAgcmMgPSBkb19z eXNjdGwoeGNoLCAmc3lzY3RsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogRnJvbSBoZXJlIG9u IHdlIE1VU1QgY2FsbCB4Y19oeXBlcmNhbGxfYm91bmNlLiBJZiByYyA8IDAgd2UKKyAgICAgICAg ICogZW5kIHVwIGRvaW5nIGl0IChvdXRzaWRlIHRoZSBsb29wKSwgc28gdXNpbmcgYSBicmVhayBp cyBPSy4KKyAgICAgICAgICovCisgICAgICAgIGlmICggcmMgPCAwICYmIGVycm5vID09IEUyQklH ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBtYXhfYmF0Y2hfc3ogPD0gMSApCisgICAg ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtYXhfYmF0Y2hfc3ogPj49IDE7CisgICAg ICAgICAgICBhZGp1c3QgPSAxOyAvKiBGb3IgdGhlIGxvb3AgY29uZGl0aW9uYWwgdG8gbGV0IHVz IGxvb3AgYWdhaW4uICovCisgICAgICAgICAgICAvKiBObyBtZW1vcnkgbGVha3MhICovCisgICAg ICAgICAgICB4Y19oeXBlcmNhbGxfYm91bmNlX3Bvc3QoeGNoLCBpbmZvKTsKKyAgICAgICAgICAg IHhjX2h5cGVyY2FsbF9ib3VuY2VfcG9zdCh4Y2gsIG5hbWUpOworICAgICAgICAgICAgeGNfaHlw ZXJjYWxsX2JvdW5jZV9wb3N0KHhjaCwgbGVuKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg ICAgICB9CisgICAgICAgIGVsc2UgaWYgKCByYyA8IDAgKSAvKiBGb3IgYWxsIG90aGVyIGVycm9y cyB3ZSBiYWlsIG91dC4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICggIXZl cnNpb24gKQorICAgICAgICAgICAgdmVyc2lvbiA9IHN5c2N0bC51LnhzcGxpY2UudS5saXN0LnZl cnNpb247CisKKyAgICAgICAgaWYgKCBzeXNjdGwudS54c3BsaWNlLnUubGlzdC52ZXJzaW9uICE9 IHZlcnNpb24gKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBjb3VsZCBtYWtlIHRoaXMg Y29uZmlndXJhYmxlIGFzIHBhcmFtZXRlcj8gKi8KKyAgICAgICAgICAgIGlmICggcmV0cmllcysr ID4gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAg ICAgICAgICBlcnJubyA9IEVCVVNZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg ICAgfQorICAgICAgICAgICAgKmRvbmUgPSAwOyAvKiBSZXRyeSBmcm9tIHNjcmF0Y2guICovCisg ICAgICAgICAgICB2ZXJzaW9uID0gc3lzY3RsLnUueHNwbGljZS51Lmxpc3QudmVyc2lvbjsKKyAg ICAgICAgICAgIGFkanVzdCA9IDE7IC8qIEFuZCBtYWtlIHN1cmUgd2UgY29udGludWUgaW4gdGhl IGxvb3AuICovCisgICAgICAgICAgICAvKiBObyBtZW1vcnkgbGVha3MuICovCisgICAgICAgICAg ICB4Y19oeXBlcmNhbGxfYm91bmNlX3Bvc3QoeGNoLCBpbmZvKTsKKyAgICAgICAgICAgIHhjX2h5 cGVyY2FsbF9ib3VuY2VfcG9zdCh4Y2gsIG5hbWUpOworICAgICAgICAgICAgeGNfaHlwZXJjYWxs X2JvdW5jZV9wb3N0KHhjaCwgbGVuKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9 CisKKyAgICAgICAgLyogV2Ugc2hvdWxkIG5ldmVyIGhpdCB0aGlzLCBidXQganVzdCBpbiBjYXNl LiAqLworICAgICAgICBpZiAoIHJjID4gbnIgKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJu byA9IEVPVkVSRkxPVzsgLyogT3ZlcmZsb3chICovCisgICAgICAgICAgICByYyA9IC0xOworICAg ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKmxlZnQgPSBzeXNjdGwudS54c3Bs aWNlLnUubGlzdC5ucjsgLyogVG90YWwgcmVtYWluaW5nIGNvdW50LiAqLworICAgICAgICAvKiBD b3B5IG9ubHkgdXAgJ3JjJyBvZiBkYXRhJyAtIHdlIGNvdWxkIGFkZCAnbWluKHJjLG5yKSBpZiBk ZXNpcmVkLiAqLworICAgICAgICBIWVBFUkNBTExfQk9VTkNFX1NFVF9TSVpFKGluZm8sIChyYyAq IHNpemVvZigqaW5mbykpKTsKKyAgICAgICAgSFlQRVJDQUxMX0JPVU5DRV9TRVRfU0laRShuYW1l LCAocmMgKiBzeikpOworICAgICAgICBIWVBFUkNBTExfQk9VTkNFX1NFVF9TSVpFKGxlbiwgKHJj ICogc2l6ZW9mKCpsZW4pKSk7CisgICAgICAgIC8qIEJvdW5jZSB0aGUgZGF0YSBhbmQgZnJlZSB0 aGUgYm91bmNlIGJ1ZmZlci4gKi8KKyAgICAgICAgeGNfaHlwZXJjYWxsX2JvdW5jZV9wb3N0KHhj aCwgaW5mbyk7CisgICAgICAgIHhjX2h5cGVyY2FsbF9ib3VuY2VfcG9zdCh4Y2gsIG5hbWUpOwor ICAgICAgICB4Y19oeXBlcmNhbGxfYm91bmNlX3Bvc3QoeGNoLCBsZW4pOworICAgICAgICAvKiBB bmQgdXBkYXRlIGhvdyBtYW55IGVsZW1lbnRzIG9mIGluZm8gd2UgaGF2ZSBjb3BpZWQgaW50by4g Ki8KKyAgICAgICAgKmRvbmUgKz0gcmM7CisgICAgICAgIC8qIFVwZGF0ZSBpZHguICovCisgICAg ICAgIHN5c2N0bC51LnhzcGxpY2UudS5saXN0LmlkeCA9ICpkb25lOworICAgIH0gd2hpbGUgKCBh ZGp1c3QgfHwgKCpkb25lIDwgbWF4ICYmICpsZWZ0ICE9IDApICk7CisKKyAgICBpZiAoIHJjIDwg MCApCisgICAgeworICAgICAgICB4Y19oeXBlcmNhbGxfYm91bmNlX3Bvc3QoeGNoLCBsZW4pOwor ICAgICAgICB4Y19oeXBlcmNhbGxfYm91bmNlX3Bvc3QoeGNoLCBuYW1lKTsKKyAgICAgICAgeGNf aHlwZXJjYWxsX2JvdW5jZV9wb3N0KHhjaCwgaW5mbyk7CisgICAgfQorCisgICAgcmV0dXJuIHJj ID4gMCA/IDAgOiByYzsKK30KKworc3RhdGljIGludCBfeGNfeHNwbGljZV9hY3Rpb24oeGNfaW50 ZXJmYWNlICp4Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFjdGlvbiwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaW50IHJj OworICAgIERFQ0xBUkVfU1lTQ1RMOworICAgIC8qIFRoZSBzaXplIGlzIGZpZ3VyZWQgb3V0IHdo ZW4gd2Ugc3RybGVuKG5hbWUpICovCisgICAgREVDTEFSRV9IWVBFUkNBTExfQk9VTkNFKG5hbWUs IDAsIFhDX0hZUEVSQ0FMTF9CVUZGRVJfQk9VTkNFX0lOKTsKKyAgICB4ZW5feHNwbGljZV9uYW1l X3QgZGVmX25hbWUgPSB7IC5wYWQgPSB7IDAsIDAsIDAgfSB9OworCisgICAgZGVmX25hbWUuc2l6 ZSA9IHN0cmxlbihuYW1lKSArIDE7CisKKyAgICBpZiAoIGRlZl9uYW1lLnNpemUgPiBYRU5fWFNQ TElDRV9OQU1FX1NJWkUgKQorICAgIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAg IHJldHVybiAtMTsKKyAgICB9CisKKyAgICBIWVBFUkNBTExfQk9VTkNFX1NFVF9TSVpFKG5hbWUs IGRlZl9uYW1lLnNpemUpOworCisgICAgaWYgKCB4Y19oeXBlcmNhbGxfYm91bmNlX3ByZSh4Y2gs IG5hbWUpICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc3lzY3RsLmNtZCA9IFhFTl9TWVND VExfeHNwbGljZV9vcDsKKyAgICBzeXNjdGwudS54c3BsaWNlLmNtZCA9IFhFTl9TWVNDVExfWFNQ TElDRV9BQ1RJT047CisgICAgc3lzY3RsLnUueHNwbGljZS5wYWQgPSAwOworICAgIHN5c2N0bC51 LnhzcGxpY2UudS5hY3Rpb24uY21kID0gYWN0aW9uOworICAgIHN5c2N0bC51LnhzcGxpY2UudS5h Y3Rpb24udGltZW91dCA9IHRpbWVvdXQ7CisKKyAgICBzeXNjdGwudS54c3BsaWNlLnUuYWN0aW9u Lm5hbWUgPSBkZWZfbmFtZTsKKyAgICBzZXRfeGVuX2d1ZXN0X2hhbmRsZShzeXNjdGwudS54c3Bs aWNlLnUuYWN0aW9uLm5hbWUubmFtZSwgbmFtZSk7CisKKyAgICByYyA9IGRvX3N5c2N0bCh4Y2gs ICZzeXNjdGwpOworCisgICAgeGNfaHlwZXJjYWxsX2JvdW5jZV9wb3N0KHhjaCwgbmFtZSk7CisK KyAgICByZXR1cm4gcmM7Cit9CisKK2ludCB4Y194c3BsaWNlX2FwcGx5KHhjX2ludGVyZmFjZSAq eGNoLCBjaGFyICpuYW1lLCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIHJldHVybiBfeGNfeHNw bGljZV9hY3Rpb24oeGNoLCBuYW1lLCBYU1BMSUNFX0FDVElPTl9BUFBMWSwgdGltZW91dCk7Cit9 CisKK2ludCB4Y194c3BsaWNlX3JldmVydCh4Y19pbnRlcmZhY2UgKnhjaCwgY2hhciAqbmFtZSwg dWludDMyX3QgdGltZW91dCkKK3sKKyAgICByZXR1cm4gX3hjX3hzcGxpY2VfYWN0aW9uKHhjaCwg bmFtZSwgWFNQTElDRV9BQ1RJT05fUkVWRVJULCB0aW1lb3V0KTsKK30KKworaW50IHhjX3hzcGxp Y2VfdW5sb2FkKHhjX2ludGVyZmFjZSAqeGNoLCBjaGFyICpuYW1lLCB1aW50MzJfdCB0aW1lb3V0 KQoreworICAgIHJldHVybiBfeGNfeHNwbGljZV9hY3Rpb24oeGNoLCBuYW1lLCBYU1BMSUNFX0FD VElPTl9VTkxPQUQsIHRpbWVvdXQpOworfQorCitpbnQgeGNfeHNwbGljZV9yZXBsYWNlKHhjX2lu dGVyZmFjZSAqeGNoLCBjaGFyICpuYW1lLCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIHJldHVy biBfeGNfeHNwbGljZV9hY3Rpb24oeGNoLCBuYW1lLCBYU1BMSUNFX0FDVElPTl9SRVBMQUNFLCB0 aW1lb3V0KTsKK30KKwogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKICAqIG1vZGU6IEMKLS0gCjIu NS4wCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVu LWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwOi8vbGlzdHMu eGVuLm9yZy94ZW4tZGV2ZWwK