LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgbWlzYyB1dGlsaXR5IGZ1bmN0aW9ucy4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGluY2x1ZGUgZmlsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgovLyAjaW5jbHVkZSA8YXNtL2lvLmg+Ci8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfd2V4dC5oPgojaW5jbHVkZSA8d2xfbWFpbi5oPgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBBIG1hdHJpeCB3aGljaCBtYXBzIGNoYW5uZWxzIHRvIGZyZXF1ZW5jaWVzICovCiNkZWZpbmUgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUyAgIDUwCnN0YXRpYyBjb25zdCBsb25nIGNoYW5fZnJlcV9saXN0W11bTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFU10gPQp7CiAgICB7MSwyNDEyfSwKICAgIHsyLDI0MTd9LAogICAgezMsMjQyMn0sCiAgICB7NCwyNDI3fSwKICAgIHs1LDI0MzJ9LAogICAgezYsMjQzN30sCiAgICB7NywyNDQyfSwKICAgIHs4LDI0NDd9LAogICAgezksMjQ1Mn0sCiAgICB7MTAsMjQ1N30sCiAgICB7MTEsMjQ2Mn0sCiAgICB7MTIsMjQ2N30sCiAgICB7MTMsMjQ3Mn0sCiAgICB7MTQsMjQ4NH0sCiAgICB7MzYsNTE4MH0sCiAgICB7NDAsNTIwMH0sCiAgICB7NDQsNTIyMH0sCiAgICB7NDgsNTI0MH0sCiAgICB7NTIsNTI2MH0sCiAgICB7NTYsNTI4MH0sCiAgICB7NjAsNTMwMH0sCiAgICB7NjQsNTMyMH0sCiAgICB7MTQ5LDU3NDV9LAogICAgezE1Myw1NzY1fSwKICAgIHsxNTcsNTc4NX0sCiAgICB7MTYxLDU4MDV9Cn07CgojaWYgREJHCmV4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOwojZW5kaWYgIC8qIERCRyAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJZGJtKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJldHVybiBhbiBlbmVyZ3kgdmFsdWUgaW4gZEJtLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB2YWx1ZSAtIHRoZSBlbmVyZ3kgdmFsdWUgdG8gYmUgY29udmVydGVkCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIHRoZSB2YWx1ZSBpbiBkQm0KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRibSggaW50IHZhbHVlICkKewogICAgLyogVHJ1bmNhdGUgdGhlIHZhbHVlIHRvIGJlIGJldHdlZW4gbWluIGFuZCBtYXguICovCiAgICBpZiggdmFsdWUgPCBIQ0ZfTUlOX1NJR05BTF9MRVZFTCApCiAgICAgICAgdmFsdWUgPSBIQ0ZfTUlOX1NJR05BTF9MRVZFTDsKCiAgICBpZiggdmFsdWUgPiBIQ0ZfTUFYX1NJR05BTF9MRVZFTCApCiAgICAgICAgdmFsdWUgPSBIQ0ZfTUFYX1NJR05BTF9MRVZFTDsKCiAgICAvKiBSZXR1cm4gdGhlIGVuZXJneSB2YWx1ZSBpbiBkQm0uICovCiAgICByZXR1cm4gKCB2YWx1ZSAtIEhDRl8wREJNX09GRlNFVCApOwp9IC8vIGRibQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcGVyY2VudCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBSZXR1cm4gYSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdmFsdWUgICAtIHRoZSB2YWx1ZSBpbiBxdWVzdGlvbgogKiAgICAgIG1pbiAgICAgLSB0aGUgbWluaW11bSByYW5nZSB2YWx1ZQogKiAgICAgIG1heCAgICAgLSB0aGUgbWF4aW11bSByYW5nZSB2YWx1ZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICB0aGUgcGVyY2VudGFnZSB2YWx1ZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgcGVyY2VudCggaW50IHZhbHVlLCBpbnQgbWluLCBpbnQgbWF4ICkKewogICAgLyogVHJ1bmNhdGUgdGhlIHZhbHVlIHRvIGJlIGJldHdlZW4gbWluIGFuZCBtYXguICovCiAgICBpZiggdmFsdWUgPCBtaW4gKQogICAgICAgIHZhbHVlID0gbWluOwoKICAgIGlmKCB2YWx1ZSA+IG1heCApCiAgICAgICAgdmFsdWUgPSBtYXg7CgogICAgLyogUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4gKi8KICAgIHJldHVybiAoKCggdmFsdWUgLSBtaW4gKSAqIDEwMCApIC8gKCBtYXggLSBtaW4gKSk7Cn0gLy8gcGVyY2VudAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJaXNfdmFsaWRfa2V5X3N0cmluZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIHRoZSBXRVAga2V5IHN0cmluZyBpcyB2YWxpZAogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBzIC0gdGhlIHN0cmluZyBpbiBxdWVzdGlvbgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBub24temVybyBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgdmFsaWQga2V5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBpc192YWxpZF9rZXlfc3RyaW5nKCBjaGFyICpzICkKewogICAgaW50IGw7CiAgICBpbnQgaTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgbCA9IHN0cmxlbiggcyApOwoKICAgIC8qIDB4IGZvbGxvd2VkIGJ5IDUgb3IgMTMgaGV4YWRlY2ltYWwgZGlnaXQgcGFpcnMgaXMgdmFsaWQgKi8KICAgIGlmKCBzWzBdID09ICcwJyAmJiAoIHNbMV0gPT0gJ3gnIHx8IHNbMV0gPT0gJ1gnICkpIHsKICAgICAgICBpZiggbCA9PSAxMiB8fCBsID09IDI4ICkgewogICAgICAgICAgICBmb3IoIGkgPSAyOyBpIDwgbDsgaSsrICkgewogICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCggc1tpXSApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyogc3RyaW5nIHdpdGggMCwgNSwgb3IgMTMgY2hhcmFjdGVycyBpcyB2YWxpZCAqLwogICAgZWxzZQogICAgewogICAgICAgIHJldHVybiggbCA9PSAwIHx8IGwgPT0gNSB8fCBsID09IDEzICk7CiAgICB9Cn0gLy8gaXNfdmFsaWRfa2V5X3N0cmluZwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJa2V5X3N0cmluZzJrZXkoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ29udmVydHMgYSBrZXlfc3RyaW5nIHRvIGEga2V5LCBBc3N1bWVzIHRoZSBrZXlfc3RyaW5nIGlzIHZhbGlkYXRlZCB3aXRoCiAqICBpc192YWxpZF9rZXlfc3RyaW5nKCkuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGtzICAtIHRoZSB2YWxpZCBrZXkgc3RyaW5nCiAqICAgICAga2V5IC0gYSBwb2ludGVyIHRvIGEgS0VZX1NUUlVDVCB3aGVyZSB0aGUgY29udmVydGVkIGtleSBpbmZvcm1hdGlvbiB3aWxsCiAqICAgICAgICAgICAgYmUgc3RvcmVkLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBrZXlfc3RyaW5nMmtleSggY2hhciAqa3MsIEtFWV9TVFJDVCAqa2V5ICkKewogICAgaW50IGwsaSxuOwogICAgY2hhciAqcDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgbCA9IHN0cmxlbigga3MgKTsKCiAgICAvKiAweCBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbCBkaWdpdCBwYWlycyAqLwogICAgaWYoIGtzWzBdID09ICcwJyAmJiAoIGtzWzFdID09ICd4JyB8fCBrc1sxXSA9PSAnWCcgKSkgewogICAgICAgIG4gPSAwOwogICAgICAgIHAgPSAoY2hhciAqKWtleS0+a2V5OwoKICAgICAgICBmb3IoIGkgPSAyOyBpIDwgbDsgaSs9MiApIHsKCQkJKnArKyA9IChoZXhfdG9fYmluKGtzW2ldKSA8PCA0KSArIGhleF90b19iaW4oa3NbaSsxXSk7CiAgICAgICAgICAgbisrOwogICAgICAgIH0KCiAgICAgICAgLyogTm90ZSB0aGF0IGVuZGlhbiB0cmFuc2xhdGlvbiBvZiB0aGUgbGVuZ3RoIGZpZWxkIGlzIG5vdCBuZWVkZWQgaGVyZQogICAgICAgICAgYmVjYXVzZSBpdCdzIHBlcmZvcm1lZCBpbiB3bF9wdXRfbHR2KCkgKi8KICAgICAgICBrZXktPmxlbiA9IG47CiAgICB9CiAgICAvKiBjaGFyYWN0ZXIgc3RyaW5nICovCiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RyY3B5KCAoY2hhciAqKWtleS0+a2V5LCBrcyApOwogICAgICAgIGtleS0+bGVuID0gbDsKICAgIH0KCiAgICByZXR1cm47Cn0gLy8ga2V5X3N0cmluZzJrZXkKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2hhc193ZXAoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzIFdFUAogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBpZmJwICAgIC0gdGhlIElGQiBwb2ludGVyIG9mIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMSBpZiBXRVAgaXMga25vd24gZW5hYmxlZCwgZWxzZSAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9oYXNfd2VwIChJRkJQIGlmYnApCnsKICAgIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRF9TVFJDVCBsdHY7CglpbnQgcmMsIHByaXZhY3k7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8qIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGRpc3RpZ3Vpc2ggYnJvbnplIGNhcmRzIGZyb20gb3RoZXIgdHlwZXMsIHRvCiAgICAgICBrbm93IGlmIFdFUCBleGlzdHMuIERvZXMgbm90IGRpc3Rpbmd1aXNoIChiZWNhdXNlIHRoZXJlJ3Mgbm8gd2F5IHRvKQogICAgICAgYmV0d2VlbiBzaWx2ZXIgYW5kIGdvbGQgY2FyZHMuICovCiAgICBsdHYubGVuID0gMjsKICAgIGx0di50eXAgPSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQ7CgoJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSAmbHR2ICk7CgoJcHJpdmFjeSA9IENOVl9MSVRUTEVfVE9fSU5UKCBsdHYucHJpdmFjeV9vcHRfaW1wbGVtZW50ZWQgKTsKCgkvL3JldHVybiByYyA/IDAgOiBwcml2YWN5OwogICAgcmV0dXJuIDE7Cn0gLy8gd2xfaGFzX3dlcAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaGNmX2Vycm9yKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJlcG9ydCB0aGUgdHlwZSBvZiBIQ0YgZXJyb3IgbWVzc2FnZQogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBub25lCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIEEgZGVzY3JpcHRpdmUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLCBxdWlldCBvdGhlcndpc2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfaGNmX2Vycm9yKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaGNmU3RhdHVzICkKewogICAgY2hhciAgICAgYnVmZmVyWzY0XSwgKnBNc2c7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIGlmKCBoY2ZTdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgc3dpdGNoKCBoY2ZTdGF0dXMgKSB7CgogICAgICAgIGNhc2UgSENGX0VSUl9USU1FX09VVDoKCiAgICAgICAgICAgIHBNc2cgPSAiRXhwZWN0ZWQgYWRhcHRlciBldmVudCBkaWQgbm90IG9jY3VyIGluIGV4cGVjdGVkIHRpbWUiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9OT19OSUM6CgogICAgICAgICAgICBwTXNnID0gIkNhcmQgbm90IGZvdW5kIChlamVjdGVkIHVuZXhwZWN0ZWRseSkiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9MRU46CgogICAgICAgICAgICBwTXNnID0gIkNvbW1hbmQgYnVmZmVyIHNpemUgaW5zdWZmaWNpZW50IjsKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIEhDRl9FUlJfSU5DT01QX1BSSToKCiAgICAgICAgICAgIHBNc2cgPSAiUHJpbWFyeSBmdW5jdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIjsKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIEhDRl9FUlJfSU5DT01QX0ZXOgoKICAgICAgICAgICAgcE1zZyA9ICJQcmltYXJ5IGZ1bmN0aW9ucyBhcmUgY29tcGF0aWJsZSwgIgogICAgICAgICAgICAgICAgInN0YXRpb24vYXAgZnVuY3Rpb25zIGFyZSBub3QiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGNhc2UgSENGX0VSUl9CVVNZOgoKICAgICAgICAgICAgcE1zZyA9ICJJbnF1aXJlIGNtZCB3aGlsZSBhbm90aGVyIElucXVpcmUgaW4gcHJvZ3Jlc3MiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIC8vY2FzZSBIQ0ZfRVJSX1NFUV9CVUc6CgogICAgICAgIC8vICAgIHBNc2cgPSAiVW5leHBlY3RlZCBjb21tYW5kIGNvbXBsZXRlZCI7CiAgICAgICAgLy8gICAgYnJlYWs7CgoKICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9BVVg6CgogICAgICAgICAgICBwTXNnID0gIlRpbWVvdXQgb24gYWNrIGZvciBlbmFibGUvZGlzYWJsZSBvZiBBVVggcmVnaXN0ZXJzIjsKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9USU1FUjoKICAgICAgICAgICAgcE1zZyA9ICJUaW1lb3V0IG9uIHRpbWVyIGNhbGlicmF0aW9uIGR1cmluZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIjsKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9USU1FX09VVDoKICAgICAgICAgICAgcE1zZyA9ICJUaW1lb3V0IG9uIEJ1c3kgYml0IGRyb3AgZHVyaW5nIEJBUCBzZXR1cCI7CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgY2FzZSBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUToKICAgICAgICAgICAgcE1zZyA9ICJIZXJtZXMgYW5kIEhDRiBhcmUgb3V0IG9mIHN5bmMiOwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIGRlZmF1bHQ6CgogICAgICAgICAgICBzcHJpbnRmKCBidWZmZXIsICJFcnJvciBjb2RlICVkIiwgaGNmU3RhdHVzICk7CiAgICAgICAgICAgIHBNc2cgPSBidWZmZXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgcHJpbnRrKCBLRVJOX0lORk8gIiVzOiBXaXJlbGVzcywgSENGIGZhaWx1cmU6IFwiJXNcIlxuIiwKICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgcE1zZyApOwogICAgfQp9IC8vIHdsX2hjZl9lcnJvcgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBEZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBkYXRhIGlzIGluIHRoZSBtYWlsYm94IGFuZCBwZXJmb3JtcyB0aGUgcHJvcGVyCiAqICBlbmRpYW4gdHJhbnNsYXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBMdHYgLSBhbiBMVFYgcG9pbnRlcgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCBsdHZfdCAqcEx0diApCnsKICAgIERCR19GVU5DKCAid2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKCiAgICBzd2l0Y2goIHBMdHYtPnR5cCApIHsKICAgIGNhc2UgQ0ZHX1RBTExJRVM6CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ0ZHX1NDQU46CiAgICAgICAgewogICAgICAgICAgICBpbnQgbnVtQVBzOwogICAgICAgICAgICBTQ0FOX1JTX1NUUkNUICpwQXBzID0gKFNDQU5fUlNfU1RSQ1QqKSZwTHR2LT51LnU4WzBdOwoKICAgICAgICAgICAgbnVtQVBzID0gKGhjZl8xNikoKCAoc2l6ZV90KSggcEx0di0+bGVuIC0gMSApICogMiApIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKCBTQ0FOX1JTX1NUUkNUICkpKTsKCiAgICAgICAgICAgIHdoaWxlKCBudW1BUHMgPj0gMSApIHsKICAgICAgICAgICAgICAgIG51bUFQcy0tOwoKICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5jaGFubmVsX2lkICAgICAgICAgICA9CiAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5jaGFubmVsX2lkICk7CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLm5vaXNlX2xldmVsICAgICAgICAgID0KICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLm5vaXNlX2xldmVsICk7CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLnNpZ25hbF9sZXZlbCAgICAgICAgID0KICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLnNpZ25hbF9sZXZlbCApOwoKICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSA9CiAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSApOwoKICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5jYXBhYmlsaXR5ICAgICAgICAgICA9CiAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5jYXBhYmlsaXR5ICk7CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLnNzaWRfbGVuICAgICAgICAgICAgID0KICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLnNzaWRfbGVuICk7CgogICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLnNzaWRfdmFsW3BBcHNbbnVtQVBzXS5zc2lkX2xlbl0gPSAwOwoKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBDRkdfQUNTX1NDQU46CiAgICAgICAgewogICAgICAgICAgICBQUk9CRV9SRVNQICpwcm9iZV9yZXNwID0gKFBST0JFX1JFU1AgKilwTHR2OwoKICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICk7CiAgICAgICAgICAgIHByb2JlX3Jlc3AtPmR1cklEICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmR1cklEICk7CiAgICAgICAgICAgIHByb2JlX3Jlc3AtPnNlcXVlbmNlICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPnNlcXVlbmNlICk7CiAgICAgICAgICAgIHByb2JlX3Jlc3AtPmRhdGFMZW5ndGggICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmRhdGFMZW5ndGggKTsKCiNpZm5kZWYgV0FSUAogICAgICAgICAgICBwcm9iZV9yZXNwLT5sZW5UeXBlICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5sZW5UeXBlICk7CiNlbmRpZiAvLyBXQVJQCgogICAgICAgICAgICBwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCApOwogICAgICAgICAgICBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICk7CiAgICAgICAgICAgIHByb2JlX3Jlc3AtPmZsYWdzICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmZsYWdzICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENGR19MSU5LX1NUQVQ6CiNkZWZpbmUgbHMgKChMSU5LX1NUQVRVU19TVFJDVCAqKXBMdHYpCiAgICAgICAgICAgIGxzLT5saW5rU3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIGxzLT5saW5rU3RhdHVzICk7CiAgICAgICAgYnJlYWs7CiN1bmRlZiBscwoKICAgIGNhc2UgQ0ZHX0FTU09DX1NUQVQ6CiAgICAgICAgewogICAgICAgICAgICBBU1NPQ19TVEFUVVNfU1RSQ1QgKnBBcyA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKilwTHR2OwoKICAgICAgICAgICAgcEFzLT5hc3NvY1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBwQXMtPmFzc29jU3RhdHVzICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENGR19TRUNVUklUWV9TVEFUOgogICAgICAgIHsKICAgICAgICAgICAgU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpwU3MgPSAoU0VDVVJJVFlfU1RBVFVTX1NUUkNUICopcEx0djsKCiAgICAgICAgICAgIHBTcy0+c2VjdXJpdHlTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggcFNzLT5zZWN1cml0eVN0YXR1cyApOwogICAgICAgICAgICBwU3MtPnJlYXNvbiAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHBTcy0+cmVhc29uICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENGR19XTVA6CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ0ZHX05VTEw6CiAgICAgICAgYnJlYWs7CgoKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCW1zZl9hc3NlcnQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUHJpbnQgc3RhdGVtZW50IHVzZWQgdG8gZGlzcGxheSBhc3NlcnRzIGZyb20gd2l0aGluIHRoZSBIQ0YuIE9ubHkgY2FsbGVkCiAqICB3aGVuIGFzc2VydHMgaW4gdGhlIEhDRiBhcmUgdHVybmVkIG9uLiBTZWUgaGNmY2ZnLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGZpbGVfbmFtZXAgIC0gdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRoZSBhc3NlcnQgb2NjdXJyZWQuCiAqICAgICAgbGluZV9udW1iZXIgLSB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGFzc2VydCBvY2N1cnJlZC4KICogICAgICB0cmFjZSAgICAgICAtIGEgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2VydC4KICogICAgICBxdWFsICAgICAgICAtIHJldHVybiBjb2RlIG9yIG90aGVyIHZhbHVlIHJlbGF0ZWQgdG8gdGhlIGFzc2VydAogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBtc2ZfYXNzZXJ0KCB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8xNiB0cmFjZSwgaGNmXzMyIHF1YWwgKQp7CiAgICBEQkdfUFJJTlQoICJIQ0YgQVNTRVJUOiBMaW5lICVkLCBWQUw6IDB4JS44eFxuIiwgbGluZV9udW1iZXIsIC8qOz8qLyh1MzIpcXVhbCApOwp9IC8vIG1zZl9hc3NlcnQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BhcnNlX2RzX2llKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBEaXJlY3QgU2VxdWVuY2UgUGFyYW1ldGVyIFNldCBJRSwgdXNlZCB0bwogKiAgICAgIGRldGVybWluZSBjaGFubmVsL2ZyZXF1ZW5jeSBpbmZvcm1hdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcHJvYmVfcnNwIC0gYSBwb2ludGVyIHRvIGEgUFJPQkVfUkVTUCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcHJvYmUKICogICAgICAgICAgICAgICAgICByZXNwb25zZS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIEJTUyByZXByZXNlbnRlZCBieSB0aGlzIHByb2JlIHJlc3BvbnNlIGlzCiAqICAgICAgdHJhbnNtaXR0aW5nLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpoY2ZfOCB3bF9wYXJzZV9kc19pZSggUFJPQkVfUkVTUCAqcHJvYmVfcnNwICkKewogICAgaW50ICAgICBpOwogICAgaW50ICAgICBpZV9sZW5ndGggPSAwOwogICAgaGNmXzggICAqYnVmOwogICAgaGNmXzggICBidWZfc2l6ZTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgaWYoIHByb2JlX3JzcCA9PSBOVUxMICkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGJ1ZiAgICAgID0gcHJvYmVfcnNwLT5yYXdEYXRhOwogICAgYnVmX3NpemUgPSBzaXplb2YoIHByb2JlX3JzcC0+cmF3RGF0YSApOwoKCiAgICBmb3IoIGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKyApIHsKICAgICAgICBpZiggYnVmW2ldID09IERTX0lORk9fRUxFTSApIHsKICAgICAgICAgICAgLyogSW5jcmVtZW50IGJ5IDEgdG8gZ2V0IHRoZSBsZW5ndGgsIGFuZCB0ZXN0IGl0OyBpbiBhIERTIGVsZW1lbnQsCiAgICAgICAgICAgICAgIGxlbmd0aCBzaG91bGQgYWx3YXlzIGJlIDEgKi8KICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBpZV9sZW5ndGggPSBidWZbaV07CgogICAgICAgICAgICBpZiggYnVmW2ldID09IDEgKSB7CiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIHJldHVybiBidWZbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGRpZG4ndCBmaW5kIGEgRFMtSUUsIHdoaWNoIGlzIHN0cmFuZ2UgKi8KICAgIHJldHVybiAwOwp9IC8vIHdsX3BhcnNlX2RzX2llCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGFyc2Vfd3BhX2llKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBQcm9iZSBSZXNwb25zZSBmb3IgYSB2YWxpZCBXUEEtSUUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHByb2JlX3JzcCAtIGEgcG9pbnRlciB0byBhIFBST0JFX1JFU1Agc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHByb2JlCiAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UKICogICAgICBsZW5ndGggICAgLSBhIHBvaW50ZXIgdG8gYW4gaGNmXzE2IGluIHdoaWNoIHRoZSBzaXplIG9mIHRoZSBXUEEtSUUgd2lsbAogKiAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZCAoaWYgZm91bmQpLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBBIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBwcm9iZSByZXNwb25zZSBidWZmZXIgd2hlcmUgYSB2YWxpZAogKiAgICAgIFdQQS1JRSBsaXZlcy4gVGhlIGxlbmd0aCBvZiB0aGlzIElFIGlzIHdyaXR0ZW4gYmFjayB0byB0aGUgJ2xlbmd0aCcKICogICAgICBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpoY2ZfOCAqIHdsX3BhcnNlX3dwYV9pZSggUFJPQkVfUkVTUCAqcHJvYmVfcnNwLCBoY2ZfMTYgKmxlbmd0aCApCnsKICAgIGludCAgICAgaTsKICAgIGludCAgICAgaWVfbGVuZ3RoID0gMDsKICAgIGhjZl84ICAgKmJ1ZjsKICAgIGhjZl84ICAgYnVmX3NpemU7CiAgICBoY2ZfOCAgIHdwYV9vdWlbXSA9IFdQQV9PVUlfVFlQRTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgaWYoIHByb2JlX3JzcCA9PSBOVUxMIHx8IGxlbmd0aCA9PSBOVUxMICkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGJ1ZiAgICAgID0gcHJvYmVfcnNwLT5yYXdEYXRhOwogICAgYnVmX3NpemUgPSBzaXplb2YoIHByb2JlX3JzcC0+cmF3RGF0YSApOwogICAgKmxlbmd0aCAgPSAwOwoKCiAgICBmb3IoIGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKyApIHsKICAgICAgICBpZiggYnVmW2ldID09IEdFTkVSSUNfSU5GT19FTEVNICkgewogICAgICAgICAgICAvKiBJbmNyZW1lbnQgYnkgb25lIHRvIGdldCB0aGUgSUUgbGVuZ3RoICovCiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaWVfbGVuZ3RoID0gcHJvYmVfcnNwLT5yYXdEYXRhW2ldOwoKICAgICAgICAgICAgLyogSW5jcmVtZW50IGJ5IG9uZSB0byBwb2ludCB0byB0aGUgSUUgcGF5bG9hZCAqLwogICAgICAgICAgICBpKys7CgogICAgICAgICAgICAvKiBEb2VzIHRoZSBJRSBjb250YWluIGEgV1BBIE9VST8gSWYgbm90LCBpdCdzIGEgcHJvcHJpZXRhcnkgSUUgKi8KICAgICAgICAgICAgaWYoIG1lbWNtcCggJmJ1ZltpXSwgJndwYV9vdWksIFdQQV9TRUxFQ1RPUl9MRU4gKSA9PSAwICkgewogICAgICAgICAgICAgICAgLyogUGFzcyBiYWNrIGxlbmd0aCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgV1BBLUlFICovCiAgICAgICAgICAgICAgICAvKiBOT1RFOiBMZW5ndGggY29udGFpbmVkIGluIHRoZSBXUEEtSUUgaXMgb25seSB0aGUgbGVuZ3RoIG9mCiAgICAgICAgICAgICAgICAgICB0aGUgcGF5bG9hZC4gVGhlIGVudGlyZSBXUEEtSUUsIGluY2x1ZGluZyB0aGUgSUUgaWRlbnRpZmllcgogICAgICAgICAgICAgICAgICAgYW5kIHRoZSBsZW5ndGgsIGlzIDIgYnl0ZXMgbGFyZ2VyICovCiAgICAgICAgICAgICAgICAqbGVuZ3RoID0gaWVfbGVuZ3RoICsgMjsKCiAgICAgICAgICAgICAgICAvKiBCYWNrIHVwIHRoZSBwb2ludGVyIDIgYnl0ZXMgdG8gaW5jbHVkZSB0aGUgSUUgaWRlbnRpZmllciBhbmQKICAgICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggaW4gdGhlIGJ1ZmZlciByZXR1cm5lZCAqLwogICAgICAgICAgICAgICAgaSAtPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuICZidWZbaV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEluY3JlbWVudCBwYXN0IHRoaXMgbm9uLVdQQSBJRSBhbmQgY29udGludWUgbG9va2luZyAqLwogICAgICAgICAgICBpICs9ICggaWVfbGVuZ3RoIC0gMSApOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBJZiB3ZSdyZSBoZXJlLCB3ZSBkaWRuJ3QgZmluZCBhIFdQQS1JRSBpbiB0aGUgYnVmZmVyICovCiAgICByZXR1cm4gTlVMTDsKfSAvLyB3bF9wYXJzZV93cGFfaWUKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wcmludF93cGFfaWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnVuY3Rpb24gdXNlZCB0byB0YWtlIGEgV1BBIEluZm9ybWF0aW9uIEVsZW1lbnQgKFdQQS1JRSkgYnVmZmVyIGFuZAogKiAgICAgIGRpc3BsYXkgaXQgaW4gYSByZWFkYWJsZSBmb3JtYXQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGJ1ZmZlciAtIHRoZSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBXUEEtSUUKICogICAgICBsZW5ndGggLSB0aGUgbGVuZ3RoIG9mIHRoZSBhYm92ZSBidWZmZXIKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBmb3JtYXR0ZWQgV1BBLUlFIHN0cmluZy4gTm90ZSB0aGF0IHRoZSBmb3JtYXQgdXNlZCBpcwogKiAgICAgIGJ5dGUtYnktYnl0ZSBwcmludGluZyBhcyAlMDJ4IGhleCB2YWx1ZXMgd2l0aCBubyBzcGFjZXMuIFRoaXMgaXMKICogICAgICByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbiB3aXRoIHNvbWUgV1BBIHN1cHBsaWNhbnRzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpoY2ZfOCAqIHdsX3ByaW50X3dwYV9pZSggaGNmXzggKmJ1ZmZlciwgaW50IGxlbmd0aCApCnsKICAgIGludCBjb3VudDsKICAgIGludCByb3dzOwogICAgaW50IHJlbWFpbmRlcjsKICAgIGludCByb3dzaXplID0gNDsKICAgIGhjZl84IHJvd19idWZbNjRdOwogICAgc3RhdGljIGhjZl84IG91dHB1dFs1MTJdOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBtZW1zZXQoIG91dHB1dCwgMCwgc2l6ZW9mKCBvdXRwdXQgKSk7CiAgICBtZW1zZXQoIHJvd19idWYsIDAsIHNpemVvZiggcm93X2J1ZiApKTsKCgogICAgLyogRGV0ZXJtaW5lIGhvdyBtYW55IHJvd3Mgd2lsbCBiZSBuZWVkZWQsIGFuZCB0aGUgcmVtYWluZGVyICovCiAgICByb3dzID0gbGVuZ3RoIC8gcm93c2l6ZTsKICAgIHJlbWFpbmRlciA9IGxlbmd0aCAlIHJvd3NpemU7CgoKICAgIC8qIEZvcm1hdCB0aGUgcm93cyAqLwogICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgcm93czsgY291bnQrKyApIHsKICAgICAgICBzcHJpbnRmKCByb3dfYnVmLCAiJTAyeCUwMnglMDJ4JTAyeCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyW2NvdW50KnJvd3NpemVdLCBidWZmZXJbY291bnQqcm93c2l6ZSsxXSwKICAgICAgICAgICAgICAgICBidWZmZXJbY291bnQqcm93c2l6ZSsyXSwgYnVmZmVyW2NvdW50KnJvd3NpemUrM10pOwogICAgICAgIHN0cmNhdCggb3V0cHV0LCByb3dfYnVmICk7CiAgICB9CgogICAgbWVtc2V0KCByb3dfYnVmLCAwLCBzaXplb2YoIHJvd19idWYgKSk7CgoKICAgIC8qIEZvcm1hdCB0aGUgcmVtYWluZGVyICovCiAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCByZW1haW5kZXI7IGNvdW50KysgKSB7CiAgICAgICAgc3ByaW50Ziggcm93X2J1ZiwgIiUwMngiLCBidWZmZXJbKHJvd3Mqcm93c2l6ZSkrY291bnRdKTsKICAgICAgICBzdHJjYXQoIG91dHB1dCwgcm93X2J1ZiApOwogICAgfQoKICAgIHJldHVybiBvdXRwdXQ7Cn0gLy8gd2xfcHJpbnRfd3BhX2llCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9pc19hX3ZhbGlkX2NoYW4oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2hlY2tzIGlmIGEgZ2l2ZW4gY2hhbm5lbCBpcyB2YWxpZAogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBjaGFubmVsIC0gdGhlIGNoYW5uZWwKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMSBpZiBUUlVFCiAqICAgICAgMCBpZiBGQUxTRQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfaXNfYV92YWxpZF9jaGFuKCBpbnQgY2hhbm5lbCApCnsKICAgIGludCBpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICAvKiBTdHJpcCBvdXQgdGhlIGhpZ2ggYml0IHNldCBieSB0aGUgRlcgZm9yIDgwMi4xMWEgY2hhbm5lbHMgKi8KICAgIGlmKCBjaGFubmVsICYgMHgxMDAgKSB7CiAgICAgICAgY2hhbm5lbCA9IGNoYW5uZWwgJiAweDBGRjsKICAgIH0KCiAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGZyZXF1ZW5jeSAqLwogICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMF0gPT0gY2hhbm5lbCApIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9IC8vIHdsX2lzX2FfdmFsaWRfY2hhbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENoZWNrcyBpZiBhIGdpdmVuIGZyZXF1ZW5jeSBpcyB2YWxpZAogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBmcmVxIC0gdGhlIGZyZXF1ZW5jeQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAxIGlmIFRSVUUKICogICAgICAwIGlmIEZBTFNFCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9pc19hX3ZhbGlkX2ZyZXEoIGxvbmcgZnJlcXVlbmN5ICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgY2hhbm5lbCAqLwogICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMV0gPT0gZnJlcXVlbmN5ICkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0gLy8gd2xfaXNfYV92YWxpZF9mcmVxCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9nZXRfZnJlcV9mcm9tX2NoYW4oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnVuY3Rpb24gdXNlZCB0byBsb29rIHVwIHRoZSBmcmVxdWVuY3kgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBvbiB3aGljaCB0aGUKICogICAgICBhZGFwdGVyIGlzIFR4L1J4LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBjaGFubmVsIC0gdGhlIGNoYW5uZWwKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgZnJlcXVlbmN5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmxvbmcgd2xfZ2V0X2ZyZXFfZnJvbV9jaGFuKCBpbnQgY2hhbm5lbCApCnsKICAgIGludCBpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICAvKiBTdHJpcCBvdXQgdGhlIGhpZ2ggYml0IHNldCBieSB0aGUgRlcgZm9yIDgwMi4xMWEgY2hhbm5lbHMgKi8KICAgIGlmKCBjaGFubmVsICYgMHgxMDAgKSB7CiAgICAgICAgY2hhbm5lbCA9IGNoYW5uZWwgJiAweDBGRjsKICAgIH0KCiAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGZyZXF1ZW5jeSAqLwogICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMF0gPT0gY2hhbm5lbCApIHsKICAgICAgICAgICAgcmV0dXJuIGNoYW5fZnJlcV9saXN0W2ldWzFdOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfSAvLyB3bF9nZXRfZnJlcV9mcm9tX2NoYW4KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2dldF9jaGFuX2Zyb21fZnJlcSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGdW5jdGlvbiB1c2VkIHRvIGxvb2sgdXAgdGhlIGNoYW5uZWwgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IG9uIHdoaWNoIHRoZQogKiAgICAgIGFkYXB0ZXIgaXMgVHgvUnguCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGZyZXF1ZW5jeSAtIHRoZSBmcmVxdWVuY3kKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCBsb25nIGZyZXF1ZW5jeSApCnsKICAgIGludCBpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGNoYW5uZWwgKi8KICAgIGZvciggaSA9IDA7IGkgPCBNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTOyBpKysgKSB7CiAgICAgICAgaWYoIGNoYW5fZnJlcV9saXN0W2ldWzFdID09IGZyZXF1ZW5jeSApIHsKICAgICAgICAgICAgcmV0dXJuIGNoYW5fZnJlcV9saXN0W2ldWzBdOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfSAvLyB3bF9nZXRfY2hhbl9mcm9tX2ZyZXEKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3Byb2Nlc3NfbGlua19zdGF0dXMoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUHJvY2VzcyB0aGUgbGluayBzdGF0dXMgbWVzc2FnZSBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcHJvY2Vzc19saW5rX3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaGNmXzE2IGxpbmtfc3RhdDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfbGlua19zdGF0dXMiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICAvL2xpbmtfc3RhdCA9IGxwLT5oY2ZDdHguSUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXOwogICAgICAgIGxpbmtfc3RhdCA9IGxwLT5oY2ZDdHguSUZCX0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsKICAgICAgICBzd2l0Y2goIGxpbmtfc3RhdCApIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQ29ubmVjdGVkXG4iICk7CiAgICAgICAgICAgIHdsX3dleHRfZXZlbnRfYXAoIGxwLT5kZXYgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IERpc2Nvbm5lY3RlZFxuIiAgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBDaGFuZ2VcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBPdXQgb2YgUmFuZ2VcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBJbiBSYW5nZVxuIiApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsIGxpbmtfc3RhdCApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9wcm9jZXNzX2xpbmtfc3RhdHVzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFByb2Nlc3MgdGhlIHByb2JlIHJlc3BvbnNlcyByZXR1bnJlZCBieSB0aGUgZGV2aWNlIGFzIGEgcmVzdWx0IG9mIGFuCiAqICAgICAgYWN0aXZlIHNjYW4uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBQUk9CRV9SRVNQICAqcHJvYmVfcnNwOwogICAgaGNmXzggICAgICAgKndwYV9pZSA9IE5VTEw7CiAgICBoY2ZfMTYgICAgICB3cGFfaWVfbGVuID0gMDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIHByb2JlX3JzcCA9IChQUk9CRV9SRVNQICopJmxwLT5Qcm9iZVJlc3A7CgogICAgICAgIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIChsdHZfdCAqKXByb2JlX3JzcCApOwoKICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpID09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGxwLT5kZXYtPm5hbWUgKTsKICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGxlbmd0aCAgICAgIDogMHglMDR4LlxuIiwgIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmxlbmd0aCApOwoKICAgICAgICBpZiggcHJvYmVfcnNwLT5sZW5ndGggPiAxICkgewogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGluZm9UeXBlICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmluZm9UeXBlICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNpZ25hbCAgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnNpZ25hbCApOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWxlbmNlICAgICA6IDB4JTAyeC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5zaWxlbmNlICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHJ4RmxvdyAgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnJ4RmxvdyApOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSByYXRlICAgICAgICA6IDB4JTAyeC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yYXRlICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZyYW1lIGNudGwgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmZyYW1lQ29udHJvbCApOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkdXJJRCAgICAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5kdXJJRCApOwoKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiglcykgYWRkcmVzczEgICAgOiAlcE1cbiIsIGxwLT5kZXYtPm5hbWUsCgkJCXByb2JlX3JzcC0+YWRkcmVzczEpOwoKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiglcykgYWRkcmVzczIgICAgOiAlcE1cbiIsIGxwLT5kZXYtPm5hbWUsCgkJCXByb2JlX3JzcC0+YWRkcmVzczIpOwoKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiglcykgQlNTSUQgICAgICAgOiAlcE1cbiIsIGxwLT5kZXYtPm5hbWUsCgkJCXByb2JlX3JzcC0+QlNTSUQpOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzZXF1ZW5jZSAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5zZXF1ZW5jZSApOwoKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiglcykgYWRkcmVzczQgICAgOiAlcE1cbiIsIGxwLT5kZXYtPm5hbWUsCgkJCXByb2JlX3JzcC0+YWRkcmVzczQpOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkYXRhbGVuZ3RoICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5kYXRhTGVuZ3RoICk7CgoJCURCR19UUkFDRShEYmdJbmZvLCAiKCVzKSBEQSAgICAgICAgICA6ICVwTVxuIiwgbHAtPmRldi0+bmFtZSwKCQkJcHJvYmVfcnNwLT5EQSk7CgoJCURCR19UUkFDRShEYmdJbmZvLCAiKCVzKSBTQSAgICAgICAgICA6ICVwTVxuIiwgbHAtPmRldi0+bmFtZSwKCQkJcHJvYmVfcnNwLT5TQSk7CgojaWZkZWYgV0FSUAoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBjaGFubmVsICAgICA6ICVkXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+Y2hhbm5lbCApOwoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBiYW5kICAgICAgICA6ICVkXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+YmFuZCApOwojZWxzZQogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGxlblR5cGUgICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmxlblR5cGUgKTsKI2VuZGlmICAvLyBXQVJQCgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHRpbWVTdGFtcCAgIDogJWQuJWQuJWQuJWQuJWQuJWQuJWQuJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFswXSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFsxXSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFsyXSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFszXSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs0XSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs1XSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs2XSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs3XSk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGJlYWNvbkludCAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmJlYWNvbkludGVydmFsICk7CgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGNhcGFiaWxpdHkgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmNhcGFiaWxpdHkgKTsKCiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCBsZW4gICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAogICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOwoKCiAgICAgICAgICAgIGlmKCBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gPiAwICkgewogICAgICAgICAgICAgICAgY2hhciBzc2lkW0hDRl9NQVhfTkFNRV9MRU5dOwoKICAgICAgICAgICAgICAgIG1lbXNldCggc3NpZCwgMCwgc2l6ZW9mKCBzc2lkICkpOwogICAgICAgICAgICAgICAgc3RybmNweSggc3NpZCwgJnByb2JlX3JzcC0+cmF3RGF0YVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOwoKICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCAgICAgICAgOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHNzaWQgKTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qIFBhcnNlIG91dCB0aGUgV1BBLUlFLCBpZiBvbmUgZXhpc3RzICovCiAgICAgICAgICAgIHdwYV9pZSA9IHdsX3BhcnNlX3dwYV9pZSggcHJvYmVfcnNwLCAmd3BhX2llX2xlbiApOwogICAgICAgICAgICBpZiggd3BhX2llICE9IE5VTEwgKSB7CiAgICAgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFdQQS1JRSAgICAgIDogJXNcbiIsCiAgICAgICAgICAgICAgICBscC0+ZGV2LT5uYW1lLCB3bF9wcmludF93cGFfaWUoIHdwYV9pZSwgd3BhX2llX2xlbiApKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBmbGFncyAgICAgICA6IDB4JTA0eC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZmxhZ3MgKTsKICAgICAgICB9CgogICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlxuIiApOwoKCiAgICAgICAgLyogSWYgcHJvYmUgcmVzcG9uc2UgbGVuZ3RoIGlzIDEsIHRoZW4gdGhlIHNjYW4gaXMgY29tcGxldGUgKi8KICAgICAgICBpZiggcHJvYmVfcnNwLT5sZW5ndGggPT0gMSApIHsKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU0NBTiBDT01QTEVURVxuIiApOwogICAgICAgICAgICBscC0+cHJvYmVfcmVzdWx0cy5udW1fYXBzID0gbHAtPnByb2JlX251bV9hcHM7CiAgICAgICAgICAgIGxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBUUlVFOwoKICAgICAgICAgICAgLyogUmVzZXQgdGhlIGNvdW50ZXIgZm9yIHRoZSBuZXh0IHNjYW4gcmVxdWVzdCAqLwogICAgICAgICAgICBscC0+cHJvYmVfbnVtX2FwcyA9IDA7CgogICAgICAgICAgICAvKiBTZW5kIGEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBldmVudCB0aGF0IHRoZSBzY2FuIGNvbXBsZXRlZCAqLwogICAgICAgICAgICB3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIGxwLT5kZXYgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBPbmx5IGNvcHkgdG8gdGhlIHRhYmxlIGlmIHRoZSBlbnRyeSBpcyB1bmlxdWU7IEFQcyBzb21ldGltZXMKICAgICAgICAgICAgICAgIHJlc3BvbmQgbW9yZSB0aGFuIG9uY2UgdG8gYSBwcm9iZSAqLwogICAgICAgICAgICBpZiggbHAtPnByb2JlX251bV9hcHMgPT0gMCApIHsKICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGluZm8gdG8gdGhlIFNjYW5SZXN1bHQgc3RydWN0dXJlIGluIHRoZSBwcml2YXRlCiAgICAgICAgICAgICAgICBhZGFwdGVyIHN0cnVjdCAqLwogICAgICAgICAgICAgICAgbWVtY3B5KCAmKCBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2xwLT5wcm9iZV9udW1fYXBzXSApLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AsIHNpemVvZiggUFJPQkVfUkVTUCApKTsKCiAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQgKi8KICAgICAgICAgICAgICAgIGxwLT5wcm9iZV9udW1fYXBzKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnQgY291bnQ7CiAgICAgICAgICAgICAgICBpbnQgdW5pcXVlID0gMTsKCiAgICAgICAgICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBscC0+cHJvYmVfbnVtX2FwczsgY291bnQrKyApIHsKICAgICAgICAgICAgICAgICAgICBpZiggbWVtY21wKCAmKCBwcm9iZV9yc3AtPkJTU0lEICksCiAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbY291bnRdLkJTU0lELAogICAgICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTiApID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCB1bmlxdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdC4gT25seSBjb3B5IGlmIHRoZXJlJ3Mgcm9vbSBpbiB0aGUKICAgICAgICAgICAgICAgICAgICB0YWJsZSAqLwogICAgICAgICAgICAgICAgICAgIGlmKCBscC0+cHJvYmVfbnVtX2FwcyA8IE1BWF9OQVBTICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AsIHNpemVvZiggUFJPQkVfUkVTUCApKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJOdW0gb2Ygc2NhbiByZXN1bHRzIGV4Y2VlZHMgc3RvcmFnZSwgdHJ1bmNhdGluZ1xuIiApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgQVBzIGRldGVjdGVkLiBOb3RlIEkgZG8gdGhpcwogICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGV2ZW4gd2hlbiBJIGRvbid0IGNvcHkgdGhlIHByb2JlIHJlc3BvbnNlIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBvdmVyZmxvdyBjb25kaXRpb24gKi8KICAgICAgICAgICAgICAgICAgICBscC0+cHJvYmVfbnVtX2FwcysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUHJvY2VzcyB0aGUgdXBkYXRlZCBpbmZvcm1hdGlvbiByZWNvcmQgbWVzc2FnZSBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdID0gQ05WX0xJVFRMRV9UT19JTlQoIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdICk7CgogICAgICAgIHN3aXRjaCggbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gKSB7CiAgICAgICAgY2FzZSBDRkdfQ1VSX0NPVU5UUllfSU5GTzoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVXBkYXRlZCBSZWNvcmQ6IENGR19DVVJfQ09VTlRSWV9JTkZPXG4iICk7CiAgICAgICAgICAgIHdsX2Nvbm5lY3QoIGxwICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENGR19QT1JUX1NUQVQ6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlVwZGF0ZWQgUmVjb3JkOiBXQUlUX0ZPUl9DT05ORUNUICgweEZENDApXG4iICk7CiAgICAgICAgICAgIC8vd2xfY29ubmVjdCggbHAgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlVOS05PV046IDB4JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBscC0+dXBkYXRlZFJlY29yZC51LnUxNlswXSApOwogICAgICAgIH0KICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBQcm9jZXNzIHRoZSBhc3NvY2lhdGlvbiBzdGF0dXMgZXZlbnQgc2lnbmFsZWQgYnkgdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBBU1NPQ19TVEFUVVNfU1RSQ1QgKmFzc29jX3N0YXQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc19hc3NvY19zdGF0dXMiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgYXNzb2Nfc3RhdCA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKikmbHAtPmFzc29jX3N0YXQ7CgogICAgICAgIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIChsdHZfdCAqKWFzc29jX3N0YXQgKTsKCiAgICAgICAgc3dpdGNoKCBhc3NvY19zdGF0LT5hc3NvY1N0YXR1cyApIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBBc3NvY2lhdGVkXG4iICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBSZWFzc29jaWF0ZWRcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIERpc2Fzc29jaWF0ZWRcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jX3N0YXQtPmFzc29jU3RhdHVzICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCglEQkdfVFJBQ0UoRGJnSW5mbywgIlNUQSBBZGRyZXNzICAgICAgICA6ICVwTVxuIiwgYXNzb2Nfc3RhdC0+c3RhQWRkcik7CgogICAgICAgIGlmKCggYXNzb2Nfc3RhdC0+YXNzb2NTdGF0dXMgPT0gMiApICAmJiAoIGFzc29jX3N0YXQtPmxlbiA9PSA4ICkpIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIk9sZCBBUCBBZGRyZXNzICAgICA6ICVwTVxuIiwKCQkJYXNzb2Nfc3RhdC0+b2xkQXBBZGRyKTsKICAgICAgICB9CiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFByb2Nlc3MgdGhlIHNlY3VyaXR5IHN0YXR1cyBtZXNzYWdlIHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpzZWNfc3RhdDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBzZWNfc3RhdCA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKikmbHAtPnNlY19zdGF0OwoKICAgICAgICB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCAobHR2X3QgKilzZWNfc3RhdCApOwoKICAgICAgICBzd2l0Y2goIHNlY19zdGF0LT5zZWN1cml0eVN0YXR1cyApIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IERpc3Nhc3NvY2lhdGUgW0FQXVxuIiApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBEZWF1dGhlbnRpY2F0ZSBbQVBdXG4iICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEF1dGhlbnRpY2F0ZSBGYWlsIFtTVEFdIG9yIFtBUF1cbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogTUlDIEZhaWxcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgNToKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogQXNzb2NpYXRlIEZhaWxcbiIgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY19zdGF0LT5zZWN1cml0eVN0YXR1cyApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgoJREJHX1RSQUNFKERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgOiAlcE1cbiIsIHNlY19zdGF0LT5zdGFBZGRyKTsKCURCR19UUkFDRShEYmdJbmZvLCAiUmVhc29uICAgICAgICAgIDogMHglMDR4XG4iLCBzZWNfc3RhdC0+cmVhc29uKTsKCiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCmludCB3bF9nZXRfdGFsbGllcyhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCgkJICAgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICp0YWxsaWVzKQp7CiAgICBpbnQgcmV0ID0gMDsKICAgIGludCBzdGF0dXM7CiAgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKnBUYWxsaWVzOwoKICAgIERCR19GVU5DKCAid2xfZ2V0X3RhbGxpZXMiICk7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CgogICAgLyogR2V0IHRoZSBjdXJyZW50IHRhbGxpZXMgZnJvbSB0aGUgYWRhcHRlciAqLwogICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgSENGX1RPVF9UQUxfQ05UICogc2l6ZW9mKGhjZl8xNik7CiAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19UQUxMSUVTOwoKICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmKGxwLT5sdHZSZWNvcmQpKTsKCiAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewoJcFRhbGxpZXMgPSAoQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICopJihscC0+bHR2UmVjb3JkLnUudTMyKTsKCW1lbWNweSh0YWxsaWVzLCBwVGFsbGllcywgc2l6ZW9mKCp0YWxsaWVzKSk7CiAgICAJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IHRhbGxpZXMgb2theSwgZGl4ZTogJWRcbiIsIHNpemVvZigqdGFsbGllcykgKTsKICAgIH0gZWxzZSB7CiAgICAJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IHRhbGxpZXMgZmFpbGVkXG4iICk7CglyZXQgPSAtRUZBVUxUOwogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwoKICAgIHJldHVybiByZXQ7Cn0KCg==