LyogQ29weXJpZ2h0IKkgMTk5NC0xOTk5IEx1Y2VudCBUZWNobm9sb2dpZXMgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5Ny0xOTk5IFZpdGEgTnVvdmEgTGltaXRlZAogKiBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAwLTIwMDcgVml0YSBOdW92YSBIb2xkaW5ncyBMaW1pdGVkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod3d3LnZpdGFudW92YS5jb20pCiAqIFJldmlzaW9ucyBDb3B5cmlnaHQgqSAyMDAwLTIwMDcgTHVjZW50IFRlY2hub2xvZ2llcyBJbmMuIGFuZCBvdGhlcnMKICoKICogTW9kaWZpZWQgZm9yIHRoZSBBa2Fyb3Mgb3BlcmF0aW5nIHN5c3RlbToKICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQogKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBHb29nbGUgSW5jLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKICogU09GVFdBUkUuICovCgojcHJhZ21hIG9uY2UKCiNpbmNsdWRlIDxuZXQvaXAuaD4KCmVudW0gewoJUU1BWCA9IDY0ICogMTAyNCAtIDEsCglJUF9UQ1BQUk9UTyA9IDYsCgoJVENQNF9JUExFTiA9IDgsCglUQ1A0X1BIRFJTSVpFID0gMTIsCglUQ1A0X0hEUlNJWkUgPSAyMCwKCVRDUDRfVENCUEhEUlNaID0gNDAsCglUQ1A0X1BLVCA9IFRDUDRfSVBMRU4gKyBUQ1A0X1BIRFJTSVpFLAoKCVRDUDZfSVBMRU4gPSAwLAoJVENQNl9QSERSU0laRSA9IDQwLAoJVENQNl9IRFJTSVpFID0gMjAsCglUQ1A2X1RDQlBIRFJTWiA9IDYwLAoJVENQNl9QS1QgPSBUQ1A2X0lQTEVOICsgVENQNl9QSERSU0laRSwKCglUY3B0aW1lck9GRiA9IDAsCglUY3B0aW1lck9OID0gMSwKCVRjcHRpbWVyRE9ORSA9IDIsCglNQVhfVElNRSA9ICgxIDw8IDIwKSwJLyogRm9yZXZlciAqLwoJVENQX0FDSyA9IDUwLAkvKiBUaW1lZCBhY2sgc2VxdWVuY2UgaW4gbXMgKi8KCU1BWEJBQ0tNUyA9IDkgKiA2MCAqIDEwMDAsIC8qIGxvbmdlc3QgYmFja29mZiB0aW1lIChtcykgYmVmb3JlIGhhbmd1cCAqLwoKCVVSRyA9IDB4MjAsCS8qIERhdGEgbWFya2VkIHVyZ2VudCAqLwoJQUNLID0gMHgxMCwJLyogQWNrbm93bGVkZ2UgaXMgdmFsaWQgKi8KCVBTSCA9IDB4MDgsCS8qIFdob2xlIGRhdGEgcGlwZSBpcyBwdXNoZWQgKi8KCVJTVCA9IDB4MDQsCS8qIFJlc2V0IGNvbm5lY3Rpb24gKi8KCVNZTiA9IDB4MDIsCS8qIFBrdC4gaXMgc3luY2hyb25pc2UgKi8KCUZJTiA9IDB4MDEsCS8qIFN0YXJ0IGNsb3NlIGRvd24gKi8KCglFT0xPUFQgPSAwLAoJTk9PUE9QVCA9IDEsCglNU1NPUFQgPSAyLAoJTVNTX0xFTkdUSCA9IDQsCS8qIG1heCBzZWdtZW50IHNpemUgaGVhZGVyIG9wdGlvbiBsZW5ndGggKi8KCVdTT1BUID0gMywKCVdTX0xFTkdUSCA9IDMsCS8qIFdTIGhlYWRlciBvcHRpb24gbGVuZ3RoICovCglNQVhfV1NfVkFMVUUgPSAxNCwgLyogUkZDIHNwZWNpZmllZC4gIExpbWl0cyBhdmFpbGFibGUgd2luZG93IHRvIDJeMzAgKi8KCVRTX09QVCA9IDgsCglUU19MRU5HVEggPSAxMCwKCVRTX1NFTkRfUFJFUEFEID0gMiwgLyogRm9yIG5vbi1TWU5zLCBwcmUtcGFkIDIgbm9wcyBmb3IgMzIgYnl0ZSBhbGlnbiAqLwoJU0FDS19PS19PUFQgPSA0LAoJU0FDS19PS19MRU5HVEggPSAyLAoJU0FDS19PUFQgPSA1LAoJTVNMMiA9IDEwLAoJTVNQVElDSyA9IDUwLAkvKiBNaWxsaXNlY29uZHMgcGVyIHRpbWVyIHRpY2sgKi8KCURFRl9NU1MgPSAxNDYwLAkvKiBEZWZhdWx0IG1lYW4gc2VnbWVudCAqLwoJREVGX01TUzYgPSAxMjgwLAkvKiBEZWZhdWx0IG1lYW4gc2VnbWVudCAobWluKSBmb3IgdjYgKi8KCVNBQ0tfU1VQUE9SVEVEID0gVFJVRSwJLyogU0FDSyBpcyBvbiBieSBkZWZhdWx0ICovCglNQVhfTlJfU0FDS1NfUEVSX1BBQ0tFVCA9IDQsCS8qIGxpbWl0ZWQgYnkgVENQJ3Mgb3B0cyBzaXplICovCglNQVhfTlJfU05EX1NBQ0tTID0gMTAsCglNQVhfTlJfUkNWX1NBQ0tTID0gMywJLyogV2UgY291bGQgdHJ5IGZvciA0LCBidXQgZG9uJ3QgbmVlZCB0byAqLwoJREVGX1JUVCA9IDUwMCwJLyogRGVmYXVsdCByb3VuZCB0cmlwICovCglERUZfS0FUID0gMTIwMDAwLAkvKiBEZWZhdWx0IHRpbWUgKG1zKSBiZXR3ZWVuIGtlZXAgYWxpdmVzICovCglUQ1BfTElTVEVOID0gMCwJLyogTGlzdGVuIGNvbm5lY3Rpb24gKi8KCVRDUF9DT05ORUNUID0gMSwJLyogT3V0Z29pbmcgY29ubmVjdGlvbiAqLwoJU1lOQUNLX1JYVElNRVIgPSAyNTAsCS8qIG1zIGJldHdlZW4gU1lOQUNLIHJldHJhbnNtaXRzICovCgoJVENQUkVYTVRUSFJFU0ggPSAzLAkvKiBkdXBhY2sgdGhyZXNob2xkIGZvciByZWNvdmVyeSAqLwoJU0FDS19SRVRSQU5TX1JFQ09WRVJZID0gMSwKCUZBU1RfUkVUUkFOU19SRUNPVkVSWSA9IDIsCglSVE9fUkVUUkFOU19SRUNPVkVSWSA9IDMsCglDV0lORF9TQ0FMRSA9IDEwLAkvKiBpbml0aWFsIENXSU5EIHdpbGwgYmUgTVNTICogdGhpcyAqLwoKCUZPUkNFCQkJPSAxIDw8IDAsCglDTE9ORQkJCT0gMSA8PCAxLAoJQUNUSVZFCQkJPSAxIDw8IDIsCglTWU5BQ0sJCQk9IDEgPDwgMywKCVRTTwkJCQk9IDEgPDwgNCwKCglSVFRNX0FMUEhBX1NISUZUID0gMywJLyogYWxwaGEgPSAxLzggKi8KCVJUVE1fQlJBVk9fU0hJRlQgPSAyLAkvKiBicmF2byA9IDEvNCAoYmV0YSkgKi8KCglDbG9zZWQgPSAwLAkvKiBDb25uZWN0aW9uIHN0YXRlcyAqLwoJTGlzdGVuLAoJU3luX3NlbnQsCglFc3RhYmxpc2hlZCwKCUZpbndhaXQxLAoJRmlud2FpdDIsCglDbG9zZV93YWl0LAoJQ2xvc2luZywKCUxhc3RfYWNrLAoJVGltZV93YWl0LAoKCU1heGxpbWJvID0gMTAwMCwvKiBtYXhpbXVtIHByb2NzIHdhaXRpbmcgZm9yIHJlc3BvbnNlIHRvIFNZTiBBQ0sgKi8KCU5MSFQgPSAyNTYsCS8qIGhhc2ggdGFibGUgc2l6ZSwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KCUxIVE1BU0sgPSBOTEhUIC0gMSwKCglIYXZlV1MgPSAxIDw8IDgsCn07Cgp0eXBlZGVmIHN0cnVjdCB0Y3B0aW1lciBUY3B0aW1lcjsKc3RydWN0IHRjcHRpbWVyIHsKCVRjcHRpbWVyICpuZXh0OwoJVGNwdGltZXIgKnByZXY7CglUY3B0aW1lciAqcmVhZHluZXh0OwoJaW50IHN0YXRlOwoJdWludDY0X3Qgc3RhcnQ7Cgl1aW50NjRfdCBjb3VudDsKCXZvaWQgKCpmdW5jKSAodm9pZCAqKTsKCXZvaWQgKmFyZzsKfTsKCnN0cnVjdCB0Y3BoZHIgewoJdWludDhfdCB0Y3BzcG9ydFsyXTsKCXVpbnQ4X3QgdGNwZHBvcnRbMl07Cgl1aW50OF90IHRjcHNlcVs0XTsKCXVpbnQ4X3QgdGNwYWNrWzRdOwoJdWludDhfdCB0Y3BmbGFnWzJdOwoJdWludDhfdCB0Y3B3aW5bMl07Cgl1aW50OF90IHRjcGNrc3VtWzJdOwoJdWludDhfdCB0Y3B1cmdbMl07CgkvKiBPcHRpb25zIHNlZ21lbnQgKi8KCXVpbnQ4X3QgdGNwb3B0WzFdOwp9OwoKLyogdjQgYW5kIHY2IHBzZXVkbyBoZWFkZXJzIHVzZWQgZm9yIGNoZWNrc3VtbWluZyB0Y3AKICoKICogTm90ZSB0aGUgZmllbGQgbGF5b3V0IGlzIHRoZSBzYW1lIGZvciBhIHJlYWwgSVAgcGFja2V0LiAgIlVudXNlZCIgaW4gdjQgaXMKICogdGhlIFRUTCBzbG90LCBidXQgaXQncyB0aGUgJ3plcm9zJyBmb3IgdGhlIFRDUCBQSCBjc3VtLiAgU2ltaWxhcmx5LCB0Y3BsZW4gaXMKICogdGhlIElQIGNzdW0gc2xvdC4gIExhdGVyIG9uLCBpdCdsbCBnZXQgb3ZlcndyaXR0ZW4gaW4gdGhlIElQIHN0YWNrIG9yIGluCiAqIGhhcmR3YXJlLiAgVGhlIHN0cnVjdCB0Y3A0aGRyIChvciByYXRoZXIgYnAtPnJwKSB3aWxsIGJlIGNhc3QgdG8gYW4gSXA0aGRyLgogKi8KdHlwZWRlZiBzdHJ1Y3QgdGNwNGhkciBUY3A0aGRyOwpzdHJ1Y3QgdGNwNGhkciB7Cgl1aW50OF90IHZpaGw7CQkJLyogVmVyc2lvbiBhbmQgaGVhZGVyIGxlbmd0aCAqLwoJdWludDhfdCB0b3M7CQkJLyogVHlwZSBvZiBzZXJ2aWNlICovCgl1aW50OF90IGxlbmd0aFsyXTsJCS8qIHBhY2tldCBsZW5ndGggKi8KCXVpbnQ4X3QgaWRbMl07CQkJLyogSWRlbnRpZmljYXRpb24gKi8KCXVpbnQ4X3QgZnJhZ1syXTsJCS8qIEZyYWdtZW50IGluZm9ybWF0aW9uICovCgl1aW50OF90IFVudXNlZDsKCXVpbnQ4X3QgcHJvdG87Cgl1aW50OF90IHRjcGxlblsyXTsKCXVpbnQ4X3QgdGNwc3JjWzRdOwoJdWludDhfdCB0Y3Bkc3RbNF07CglzdHJ1Y3QgdGNwaGRyOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgdGNwNmhkciBUY3A2aGRyOwpzdHJ1Y3QgdGNwNmhkciB7Cgl1aW50OF90IHZjZls0XTsKCXVpbnQ4X3QgcGxvYWRsZW5bMl07Cgl1aW50OF90IHByb3RvOwoJdWludDhfdCB0dGw7Cgl1aW50OF90IHRjcHNyY1tJUGFkZHJsZW5dOwoJdWludDhfdCB0Y3Bkc3RbSVBhZGRybGVuXTsKCXN0cnVjdCB0Y3BoZHI7Cn07CgpzdHJ1Y3Qgc2Fja19ibG9jayB7Cgl1aW50MzJfdCBsZWZ0OwoJdWludDMyX3QgcmlnaHQ7Cn07CgovKgogKiAgdGhpcyByZXByZXNlbnRzIHRoZSBjb250cm9sIGluZm8KICogIGZvciBhIHNpbmdsZSBwYWNrZXQuICBJdCBpcyBkZXJpdmVkIGZyb20KICogIGEgcGFja2V0IGluIG50b2h0Y3B7NCw2fSgpIGFuZCBzdHVjayBpbnRvCiAqICBhIHBhY2tldCBpbiBodG9udGNwezQsNn0oKS4KICovCnR5cGVkZWYgc3RydWN0IHRjcCBUY3A7CnN0cnVjdCB0Y3AgewoJdWludDE2X3Qgc291cmNlOwoJdWludDE2X3QgZGVzdDsKCXVpbnQzMl90IHNlcTsKCXVpbnQzMl90IGFjazsKCXVpbnQ4X3QgZmxhZ3M7Cgl1aW50MTZfdCB3czsJCS8qIHdpbmRvdyBzY2FsZSBvcHRpb24gKGlmIG5vdCB6ZXJvKSAqLwoJdWludDMyX3Qgd25kOwoJdWludDE2X3QgdXJnOwoJdWludDE2X3QgbXNzOwkJLyogbWF4IHNlZ21lbnQgc2l6ZSBvcHRpb24gKGlmIG5vdCB6ZXJvKSAqLwoJdWludDE2X3QgbGVuOwkJLyogc2l6ZSBvZiBkYXRhICovCgl1aW50MzJfdCB0c192YWw7CS8qIHRpbWVzdGFtcCB2YWwgZnJvbSBzZW5kZXIgKi8KCXVpbnQzMl90IHRzX2VjcjsJLyogdGltZXN0YW1wIGVjaG8gcmVzcG9uc2UgZnJvbSBzZW5kZXIgKi8KCWJvb2wgc2Fja19vazsJCS8qIGhlYWRlciBoYWQvc2hvdWxkIGhhdmUgU0FDS19QRVJNSVRURUQgKi8KCXVpbnQ4X3QgbnJfc2Fja3M7CglzdHJ1Y3Qgc2Fja19ibG9jayBzYWNrc1tNQVhfTlJfU0FDS1NfUEVSX1BBQ0tFVF07Cn07CgovKgogKiAgdGhpcyBoZWFkZXIgaXMgbWFsbG9jJ2QgdG8gdGhyZWFkIHRvZ2V0aGVyIGZyYWdtZW50cwogKiAgd2FpdGluZyB0byBiZSBjb2FsZXNjZWQKICovCnR5cGVkZWYgc3RydWN0IHJlc2VxIFJlc2VxOwpzdHJ1Y3QgcmVzZXEgewoJUmVzZXEgKm5leHQ7CglUY3Agc2VnOwoJc3RydWN0IGJsb2NrICpicDsKCXVpbnQxNl90IGxlbmd0aDsKfTsKCi8qCiAqICB0aGUgcWxvY2sgaW4gdGhlIENvbnYgbG9ja3MgdGhpcyBzdHJ1Y3R1cmUKICovCnR5cGVkZWYgc3RydWN0IHRjcGN0bCBUY3BjdGw7CnN0cnVjdCB0Y3BjdGwgewoJdWludDhfdCBzdGF0ZTsJCS8qIENvbm5lY3Rpb24gc3RhdGUgKi8KCXVpbnQ4X3QgdHlwZTsJCS8qIExpc3RlbmluZyBvciBhY3RpdmUgY29ubmVjdGlvbiAqLwoJdWludDhfdCBjb2RlOwkJLyogSWNtcCBjb2RlICovCglzdHJ1Y3QgewoJCXVpbnQzMl90IHVuYTsJLyogTGVmdCBlZGdlIG9mIHVuYWNrZWQgZGF0YSByZWdpb24gKi8KCQl1aW50MzJfdCBueHQ7CS8qIE5leHQgc2VxIHRvIHNlbmQsIHJpZ2h0IGVkZ2Ugb2YgdW5hY2tlZCAqLwoJCXVpbnQzMl90IHJ0eDsJLyogTmV4dCB0byBzZW5kIGZvciByZXRyYW5zICovCgkJdWludDMyX3Qgd25kOwkvKiBUY3Agc2VuZCB3aW5kb3cgKi8KCQl1aW50MzJfdCB1cmc7CS8qIFVyZ2VudCBkYXRhIHBvaW50ZXIgKi8KCQl1aW50MzJfdCB3bDI7CgkJaW50IHNjYWxlOwkvKiBob3cgbXVjaCB0byByaWdodCBzaGlmdCB3aW5kb3cgZm9yIHhtaXQgKi8KCQl1aW50MzJfdCBpbl9mbGlnaHQ7CS8qIGVzdGltYXRlIG9mIGhvdyBtdWNoIGlzIGluIGZsaWdodCAqLwoJCXVpbnQ4X3QgbG9zc19oaW50OwkvKiBudW1iZXIgb2YgbG9zcyBoaW50cyByY3ZkICovCgkJdWludDhfdCBzYWNrX2xvc3NfaGludDsJLyogRm9yIGRldGVjdGluZyBzYWNrIHJ4bWl0IGxvc3NlcyAqLwoJCWJvb2wgZmx1c2hfc2Fja3M7CS8qIFR3byB0aW1lb3V0cyBpbiBhIHJvdyA9PSBkdW1wIHNhY2tzICovCgkJdWludDhfdCByZWNvdmVyeTsJLyogbG9zcyByZWNvdmVyeSBmbGFnICovCgkJdWludDMyX3QgcmVjb3ZlcnlfcHQ7CS8qIHJpZ2h0IHdpbmRvdyBmb3IgcmVjb3ZlcnkgcG9pbnQgKi8KCQl1aW50OF90IG5yX3NhY2tzOwoJCXN0cnVjdCBzYWNrX2Jsb2NrIHNhY2tzW01BWF9OUl9TTkRfU0FDS1NdOwoJfSBzbmQ7CglzdHJ1Y3QgewoJCXVpbnQzMl90IG54dDsJLyogUmVjZWl2ZSBwb2ludGVyIHRvIG5leHQgdWludDhfdCBzbG90ICovCgkJdWludDMyX3Qgd25kOwkvKiBSZWNlaXZlIHdpbmRvdyBpbmNvbWluZyAqLwoJCXVpbnQzMl90IHVyZzsJLyogVXJnZW50IHBvaW50ZXIgKi8KCQlpbnQgYmxvY2tlZDsKCQlpbnQgdW5hOwkvKiB1bmFja2VkIGRhdGEgc2VncyAqLwoJCWludCBzY2FsZTsJLyogaG93IG11Y2ggdG8gbGVmdCBzaGlmdCB3aW5kb3cgZm9yIHJ4ICovCgkJdWludDhfdCBucl9zYWNrczsKCQlzdHJ1Y3Qgc2Fja19ibG9jayBzYWNrc1tNQVhfTlJfUkNWX1NBQ0tTXTsKCX0gcmN2OwoJdWludDMyX3QgaXNzOwkJLyogSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgKi8KCWludCBzYXd3c29wdDsJCS8qIHRydWUgaWYgd2Ugc2F3IGEgd3NvcHQgb24gdGhlIGluY29taW5nIFNZTiAqLwoJdWludDMyX3QgY3dpbmQ7CQkvKiBDb25nZXN0aW9uIHdpbmRvdyAqLwoJaW50IHNjYWxlOwkJLyogZGVzaXJlZCBzbmQuc2NhbGUgKi8KCXVpbnQzMl90IHNzdGhyZXNoOwkvKiBTbG93IHN0YXJ0IHRocmVzaG9sZCAqLwoJaW50IGlyczsJCS8qIEluaXRpYWwgcmVjZWl2ZWQgc3F1ZW5jZSAqLwoJdWludDE2X3QgbXNzOwkJLyogTWF4IHNlZ21lbnQgc2l6ZSAqLwoJdWludDE2X3QgdHlwaWNhbF9tc3M7CS8qIE1TUyBmb3IgbW9zdCBwYWNrZXRzICg8IE1TUyBmb3Igc29tZSBvcHRzKSAqLwoJaW50IHJlcmVjdjsJCS8qIE92ZXJsYXAgb2YgZGF0YSByZXJlY2V2aXZlZCAqLwoJdWludDMyX3Qgd2luZG93OwkvKiBSZWNldml2ZSB3aW5kb3cgKi8KCXVpbnQ4X3QgYmFja29mZjsJLyogRXhwb25lbnRpYWwgYmFja29mZiBjb3VudGVyICovCglpbnQgYmFja2Vkb2ZmOwkJLyogbXMgd2UndmUgYmFja2VkIG9mZiBmb3IgcmV4bWl0cyAqLwoJdWludDhfdCBmbGFnczsJCS8qIFN0YXRlIGZsYWdzICovCglSZXNlcSAqcmVzZXE7CQkvKiBSZXNlcXVlbmNpbmcgcXVldWUgKi8KCVRjcHRpbWVyIHRpbWVyOwkJLyogQWN0aXZpdHkgdGltZXIgKi8KCVRjcHRpbWVyIGFja3RpbWVyOwkvKiBBY2tub3dsZWRnZSB0aW1lciAqLwoJVGNwdGltZXIgcnR0X3RpbWVyOwkvKiBSb3VuZCB0cmlwIHRpbWVyICovCglUY3B0aW1lciBrYXRpbWVyOwkvKiBrZWVwIGFsaXZlIHRpbWVyICovCgl1aW50MzJfdCBydHRzZXE7CS8qIFJvdW5kIHRyaXAgc2VxdWVuY2UgKi8KCWludCBzcnR0OwkJLyogU2hvcnRlbmVkIHJvdW5kIHRyaXAgKi8KCWludCBtZGV2OwkJLyogTWVhbiBkZXZpYXRpb24gb2Ygcm91bmQgdHJpcCAqLwoJaW50IGthY291bnRlcjsJCS8qIGNvdW50IGRvd24gZm9yIGtlZXAgYWxpdmUgKi8KCXVpbnQ2NF90IHNuZHN5bnRpbWU7CS8qIHRpbWUgc3luIHNlbnQgKi8KCXVpbnQ2NF90IHRpbWU7CQkvKiB0aW1lIEZpbndhaXQyIHdhcyBzZW50ICovCglpbnQgbm9jaGVja3N1bTsJCS8qIG5vbi16ZXJvIG1lYW5zIGRvbid0IHNlbmQgY2hlY2tzdW1zICovCglpbnQgZmxnY250OwkJLyogbnVtYmVyIG9mIGZsYWdzIGluIHRoZSBzZXF1ZW5jZSAoRklOLFNZTikgKi8KCXVpbnQzMl90IHRzX3JlY2VudDsJLyogdGltZXN0YW1wIHJlY2VpdmVkIGFyb3VuZCBsYXN0X2Fja19zZW50ICovCgl1aW50MzJfdCBsYXN0X2Fja19zZW50OwkvKiB0byBkZXRlcm1pbmUgd2hlbiB0byB1cGRhdGUgdGltZXN0YW1wICovCglib29sIHNhY2tfb2s7CQkvKiBDYW4gdXNlIFNBQ0sgZm9yIHRoaXMgY29ubmVjdGlvbiAqLwoJc3RydWN0IElwaWZjICppZmM7CS8qIFVuY291bnRlZCByZWYgKi8KCgl1bmlvbiB7CgkJVGNwNGhkciB0Y3A0aGRyOwoJCVRjcDZoZHIgdGNwNmhkcjsKCX0gcHJvdG9oZHI7CQkvKiBwcm90b3R5cGUgaGVhZGVyICovCn07CgovKiBOZXcgY2FsbHMgYXJlIHB1dCBpbiBsaW1ibyByYXRoZXIgdGhhbiBoYXZpbmcgYSBjb252ZXJzYXRpb24gc3RydWN0dXJlCiAqICBhbGxvY2F0ZWQuICBUaHVzLCBhIFNZTiBhdHRhY2sgcmVzdWx0cyBpbiBsb3RzIG9mIGxpbWJvJ2QgY2FsbHMgYnV0IG5vdCBhbnkKICogIHJlYWwgQ29udiBzdHJ1Y3R1cmVzIG11Y2tpbmcgdGhpbmdzIHVwLiAgQ2FsbHMgaW4gbGltYm8gcmV4bWl0IHRoZWlyIFNZTiBBQ0sKICogIGV2ZXJ5IFNZTkFDS19SWFRJTUVSIG1zIHVwIHRvIDQgdGltZXMsIGkuZS4sIHRoZXkgZGlzYXBwZWFyIGFmdGVyIDEgc2Vjb25kLgogKgogKiAgSW4gcGFydGljdWxhciB0aGV5IGFyZW4ndCBvbiBhIGxpc3RlbmVyJ3MgcXVldWUgc28gdGhhdCB0aGV5IGRvbid0IGZpZ3VyZSBpbgogKiAgdGhlIGlucHV0IHF1ZXVlIGxpbWl0LgogKgogKiAgSWYgMS8yIG9mIGEgVDMgd2FzIGF0dGFja2luZyBTWU4gcGFja2V0cywgd2UnbGQgaGF2ZSBhIHBlcm1hbmVudCBxdWV1ZSBvZgogKiAgNzAwMDAgbGltYm8nZCBjYWxscy4gIE5vdCBncmVhdCBmb3IgYSBsaW5lYXIgbGlzdCBidXQgZG9hYmxlLiAgVGhlcmVmb3JlCiAqICB0aGVyZSBpcyBubyBoYXNoaW5nIG9mIHRoaXMgbGlzdC4KICovCnR5cGVkZWYgc3RydWN0IGxpbWJvIExpbWJvOwpzdHJ1Y3QgbGltYm8gewoJTGltYm8gKm5leHQ7CgoJdWludDhfdCBsYWRkcltJUGFkZHJsZW5dOwoJdWludDhfdCByYWRkcltJUGFkZHJsZW5dOwoJdWludDE2X3QgbHBvcnQ7Cgl1aW50MTZfdCBycG9ydDsKCXVpbnQzMl90IGlyczsJCQkvKiBpbml0aWFsIHJlY2VpdmVkIHNlcXVlbmNlICovCgl1aW50MzJfdCBpc3M7CQkJLyogaW5pdGlhbCBzZW50IHNlcXVlbmNlICovCgl1aW50MTZfdCBtc3M7CQkJLyogbXNzIGZyb20gdGhlIG90aGVyIGVuZCAqLwoJdWludDE2X3QgcmN2c2NhbGU7CQkvKiBob3cgbXVjaCB0byBzY2FsZSByY3ZkIHdpbmRvd3MgKi8KCXVpbnQxNl90IHNuZHNjYWxlOwkJLyogaG93IG11Y2ggdG8gc2NhbGUgc2VudCB3aW5kb3dzICovCgl1aW50NjRfdCBsYXN0c2VuZDsJCS8qIGxhc3QgdGltZSB3ZSBzZW50IGEgc3luYWNrICovCgl1aW50OF90IHZlcnNpb247CQkvKiB2NCBvciB2NiAqLwoJdWludDhfdCByZXhtaXRzOwkJLyogbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyAqLwoJYm9vbCBzYWNrX29rOwkJCS8qIG90aGVyIHNpZGUgc2FpZCBTQUNLX09LICovCgl1aW50MzJfdCB0c192YWw7CQkvKiB0aW1lc3RhbXAgdmFsIGZyb20gc2VuZGVyICovCglzdHJ1Y3QgSXBpZmMgKmlmYzsJCS8qIFVuY291bnRlZCByZWYgKi8KfTsKCmVudW0gewoJLyogTUlCIHN0YXRzICovCglNYXhDb25uLAoJQWN0aXZlT3BlbnMsCglQYXNzaXZlT3BlbnMsCglFc3RhYlJlc2V0cywKCUN1cnJFc3RhYiwKCUluU2VncywKCU91dFNlZ3MsCglSZXRyYW5zU2VncywKCVJldHJhbnNUaW1lb3V0cywKCUluRXJycywKCU91dFJzdHMsCgoJLyogbm9uLU1JQiBzdGF0cyAqLwoJQ3N1bUVycnMsCglIbGVuRXJycywKCUxlbkVycnMsCglPdXRPZk9yZGVyLAoKCU5zdGF0cwp9OwoKdHlwZWRlZiBzdHJ1Y3QgdGNwcHJpdiBUY3Bwcml2OwpzdHJ1Y3QgdGNwcHJpdiB7CgkvKiBMaXN0IG9mIGFjdGl2ZSB0aW1lcnMgKi8KCXFsb2NrX3QgdGw7CglUY3B0aW1lciAqdGltZXJzOwoKCS8qIGhhc2ggdGFibGUgZm9yIG1hdGNoaW5nIGNvbnZlcnNhdGlvbnMgKi8KCXN0cnVjdCBJcGh0IGh0OwoKCS8qIGNhbGxzIGluIGxpbWJvIHdhaXRpbmcgZm9yIGFuIEFDSyB0byBvdXIgU1lOIEFDSyAqLwoJaW50IG5saW1ibzsKCUxpbWJvICpsaHRbTkxIVF07CgoJLyogZm9yIGtlZXBpbmcgdHJhY2sgb2YgdGNwYWNrcHJvYyAqLwoJcWxvY2tfdCBhcGw7CglpbnQgYWNrcHJvY3N0YXJ0ZWQ7CgoJdWludDMyX3Qgc3RhdHNbTnN0YXRzXTsKfTsKCnN0YXRpYyBpbmxpbmUgaW50IHNlcV93aXRoaW4odWludDMyX3QgeCwgdWludDMyX3QgbG93LCB1aW50MzJfdCBoaWdoKQp7CglpZiAobG93IDw9IGhpZ2gpIHsKCQlpZiAobG93IDw9IHggJiYgeCA8PSBoaWdoKQoJCQlyZXR1cm4gMTsKCX0gZWxzZSB7CgkJaWYgKHggPj0gbG93IHx8IHggPD0gaGlnaCkKCQkJcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSBpbnQgc2VxX2x0KHVpbnQzMl90IHgsIHVpbnQzMl90IHkpCnsKCXJldHVybiAoaW50KSh4IC0geSkgPCAwOwp9CgpzdGF0aWMgaW5saW5lIGludCBzZXFfbGUodWludDMyX3QgeCwgdWludDMyX3QgeSkKewoJcmV0dXJuIChpbnQpKHggLSB5KSA8PSAwOwp9CgpzdGF0aWMgaW5saW5lIGludCBzZXFfZ3QodWludDMyX3QgeCwgdWludDMyX3QgeSkKewoJcmV0dXJuIChpbnQpKHggLSB5KSA+IDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHNlcV9nZSh1aW50MzJfdCB4LCB1aW50MzJfdCB5KQp7CglyZXR1cm4gKGludCkoeCAtIHkpID49IDA7Cn0KCnN0YXRpYyBpbmxpbmUgdWludDMyX3Qgc2VxX21heCh1aW50MzJfdCB4LCB1aW50MzJfdCB5KQp7CglyZXR1cm4gc2VxX2dlKHgsIHkpID8geCA6IHk7Cn0KCnN0YXRpYyBpbmxpbmUgdWludDMyX3Qgc2VxX21pbih1aW50MzJfdCB4LCB1aW50MzJfdCB5KQp7CglyZXR1cm4gc2VxX2xlKHgsIHkpID8geCA6IHk7Cn0KCi8qIENhbGxlciBuZWVkcyB0byBrbm93IHdlJ3JlIFRDUCBhbmQgd2l0aCB0cmFuc3BvcnRfb2Zmc2V0IHNldCwgd2hpY2ggaXMKICogdXN1YWxseSBvbiB0aGUgb3V0Ym91bmQgbmV0d29yayBwYXRoLiAqLwpzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y3BoZHIgKnRjcF9oZHIoc3RydWN0IGJsb2NrICpicCkKewoJcmV0dXJuIChzdHJ1Y3QgdGNwaGRyKikoYnAtPnJwICsgYnAtPnRyYW5zcG9ydF9vZmZzZXQpOwp9CgpzdGF0aWMgaW5saW5lIHNpemVfdCB0Y3BfaGRybGVuKHN0cnVjdCBibG9jayAqYnApCnsKCXN0cnVjdCB0Y3BoZHIgKmhkciA9IHRjcF9oZHIoYnApOwoJdWludDhfdCBkYXRhX29mZnNldDsKCglkYXRhX29mZnNldCA9IGhkci0+dGNwZmxhZ1swXSA+PiA0OwoJcmV0dXJuIGRhdGFfb2Zmc2V0ICogNDsKfQo=