LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNpbnQuaCx2IDEuMjcgMjAwMi8wOC8zMSAyMjoxNzozMiBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GQ0lOVF9IXwojZGVmaW5lIF9GQ0lOVF9IXwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3ByaXZhdGUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3ltYm9saWMgewogICAgY29uc3QgY2hhcgkqbmFtZTsKICAgIGludAkJdmFsdWU7Cn0gRmNTeW1ib2xpYzsKCiNpZm5kZWYgRkNfQ09ORklHX1BBVEgKI2RlZmluZSBGQ19DT05GSUdfUEFUSCAiZm9udHMuY29uZiIKI2VuZGlmCgojZGVmaW5lIEZDX0ZPTlRfRklMRV9JTlZBTElECSgoRmNDaGFyOCAqKSAiLiIpCiNkZWZpbmUgRkNfRk9OVF9GSUxFX0RJUgkoKEZjQ2hhcjggKikgIi5kaXIiKQoKI2lmZGVmIF9XSU4zMgojZGVmaW5lIEZDX1NFQVJDSF9QQVRIX1NFUEFSQVRPUiAnOycKI2Vsc2UKI2RlZmluZSBGQ19TRUFSQ0hfUEFUSF9TRVBBUkFUT1IgJzonCiNlbmRpZgoKI2RlZmluZSBGQ19EQkdfTUFUQ0gJMQojZGVmaW5lIEZDX0RCR19NQVRDSFYJMgojZGVmaW5lIEZDX0RCR19FRElUCTQKI2RlZmluZSBGQ19EQkdfRk9OVFNFVAk4CiNkZWZpbmUgRkNfREJHX0NBQ0hFCTE2CiNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgojZGVmaW5lIEZDX0RCR19QQVJTRQk2NAojZGVmaW5lIEZDX0RCR19TQ0FOCTEyOAojZGVmaW5lIEZDX0RCR19TQ0FOVgkyNTYKI2RlZmluZSBGQ19EQkdfTUVNT1JZCTUxMgoKI2RlZmluZSBGQ19NRU1fQ0hBUlNFVAkgICAgMAojZGVmaW5lIEZDX01FTV9DSEFSTEVBRgkgICAgMQojZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCiNkZWZpbmUgRkNfTUVNX0ZPTlRQVFIJICAgIDMKI2RlZmluZSBGQ19NRU1fT0JKRUNUU0VUICAgIDQKI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKI2RlZmluZSBGQ19NRU1fTUFUUklYCSAgICA2CiNkZWZpbmUgRkNfTUVNX1BBVFRFUk4JICAgIDcKI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CiNkZWZpbmUgRkNfTUVNX1ZBTExJU1QJICAgIDkKI2RlZmluZSBGQ19NRU1fU1VCU1RBVEUJICAgIDEwCiNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKI2RlZmluZSBGQ19NRU1fTElTVEJVQ0sJICAgIDEyCiNkZWZpbmUgRkNfTUVNX1NUUlNFVAkgICAgMTMKI2RlZmluZSBGQ19NRU1fU1RSTElTVAkgICAgMTQKI2RlZmluZSBGQ19NRU1fQ09ORklHCSAgICAxNQojZGVmaW5lIEZDX01FTV9MQU5HU0VUCSAgICAxNgojZGVmaW5lIEZDX01FTV9BVE9NSUMJICAgIDE3CiNkZWZpbmUgRkNfTUVNX0JMQU5LUwkgICAgMTgKI2RlZmluZSBGQ19NRU1fQ0FDSEUJICAgIDE5CiNkZWZpbmUgRkNfTUVNX1NUUkJVRgkgICAgMjAKI2RlZmluZSBGQ19NRU1fU1VCU1QJICAgIDIxCiNkZWZpbmUgRkNfTUVNX09CSkVDVFRZUEUgICAyMgojZGVmaW5lIEZDX01FTV9DT05TVEFOVAkgICAgMjMKI2RlZmluZSBGQ19NRU1fVEVTVAkgICAgMjQKI2RlZmluZSBGQ19NRU1fRVhQUgkgICAgMjUKI2RlZmluZSBGQ19NRU1fVlNUQUNLCSAgICAyNgojZGVmaW5lIEZDX01FTV9BVFRSCSAgICAyNwojZGVmaW5lIEZDX01FTV9QU1RBQ0sJICAgIDI4CgojZGVmaW5lIEZDX01FTV9OVU0JICAgIDI5Cgp0eXBlZGVmIGVudW0gX0ZjVmFsdWVCaW5kaW5nIHsKICAgIEZjVmFsdWVCaW5kaW5nV2VhaywgRmNWYWx1ZUJpbmRpbmdTdHJvbmcsIEZjVmFsdWVCaW5kaW5nU2FtZQp9IEZjVmFsdWVCaW5kaW5nOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWVMaXN0IHsKICAgIHN0cnVjdCBfRmNWYWx1ZUxpc3QgICAgKm5leHQ7CiAgICBGY1ZhbHVlCQkgICAgdmFsdWU7CiAgICBGY1ZhbHVlQmluZGluZwkgICAgYmluZGluZzsKfSBGY1ZhbHVlTGlzdDsKCnR5cGVkZWYgc3RydWN0IF9GY1BhdHRlcm5FbHQgewogICAgY29uc3QgY2hhcgkgICAgKm9iamVjdDsKICAgIEZjVmFsdWVMaXN0CSAgICAqdmFsdWVzOwp9IEZjUGF0dGVybkVsdDsKCgpzdHJ1Y3QgX0ZjUGF0dGVybiB7CiAgICBpbnQJCSAgICBudW07CiAgICBpbnQJCSAgICBzaXplOwogICAgRmNQYXR0ZXJuRWx0ICAgICplbHRzOwogICAgaW50CQkgICAgcmVmOwp9OwoKdHlwZWRlZiBlbnVtIF9GY09wIHsKICAgIEZjT3BJbnRlZ2VyLCBGY09wRG91YmxlLCBGY09wU3RyaW5nLCBGY09wTWF0cml4LCBGY09wQm9vbCwgRmNPcENoYXJTZXQsIAogICAgRmNPcE5pbCwKICAgIEZjT3BGaWVsZCwgRmNPcENvbnN0LAogICAgRmNPcEFzc2lnbiwgRmNPcEFzc2lnblJlcGxhY2UsIAogICAgRmNPcFByZXBlbmRGaXJzdCwgRmNPcFByZXBlbmQsIEZjT3BBcHBlbmQsIEZjT3BBcHBlbmRMYXN0LAogICAgRmNPcFF1ZXN0LAogICAgRmNPcE9yLCBGY09wQW5kLCBGY09wRXF1YWwsIEZjT3BOb3RFcXVhbCwgCiAgICBGY09wQ29udGFpbnMsIEZjT3BMaXN0aW5nLCBGY09wTm90Q29udGFpbnMsCiAgICBGY09wTGVzcywgRmNPcExlc3NFcXVhbCwgRmNPcE1vcmUsIEZjT3BNb3JlRXF1YWwsCiAgICBGY09wUGx1cywgRmNPcE1pbnVzLCBGY09wVGltZXMsIEZjT3BEaXZpZGUsCiAgICBGY09wTm90LCBGY09wQ29tbWEsIEZjT3BGbG9vciwgRmNPcENlaWwsIEZjT3BSb3VuZCwgRmNPcFRydW5jLAogICAgRmNPcEludmFsaWQKfSBGY09wOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRXhwciB7CiAgICBGY09wICAgb3A7CiAgICB1bmlvbiB7CglpbnQJICAgIGl2YWw7Cglkb3VibGUJICAgIGR2YWw7CglGY0NoYXI4CSAgICAqc3ZhbDsKCUZjTWF0cml4ICAgICptdmFsOwoJRmNCb29sCSAgICBidmFsOwoJRmNDaGFyU2V0ICAgKmN2YWw7CgljaGFyCSAgICAqZmllbGQ7CglGY0NoYXI4CSAgICAqY29uc3RhbnQ7CglzdHJ1Y3QgewoJICAgIHN0cnVjdCBfRmNFeHByICpsZWZ0LCAqcmlnaHQ7Cgl9IHRyZWU7CiAgICB9IHU7Cn0gRmNFeHByOwoKdHlwZWRlZiBlbnVtIF9GY1F1YWwgewogICAgRmNRdWFsQW55LCBGY1F1YWxBbGwsIEZjUXVhbEZpcnN0LCBGY1F1YWxOb3RGaXJzdAp9IEZjUXVhbDsKCiNkZWZpbmUgRmNNYXRjaERlZmF1bHQJKChGY01hdGNoS2luZCkgLTEpCgp0eXBlZGVmIHN0cnVjdCBfRmNUZXN0IHsKICAgIHN0cnVjdCBfRmNUZXN0CSpuZXh0OwogICAgRmNNYXRjaEtpbmQJCWtpbmQ7CiAgICBGY1F1YWwJCXF1YWw7CiAgICBjb25zdCBjaGFyCQkqZmllbGQ7CiAgICBGY09wCQlvcDsKICAgIEZjRXhwcgkJKmV4cHI7Cn0gRmNUZXN0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRWRpdCB7CiAgICBzdHJ1Y3QgX0ZjRWRpdCAqbmV4dDsKICAgIGNvbnN0IGNoYXIJICAgICpmaWVsZDsKICAgIEZjT3AJICAgIG9wOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjVmFsdWVCaW5kaW5nICBiaW5kaW5nOwp9IEZjRWRpdDsKCnR5cGVkZWYgc3RydWN0IF9GY1N1YnN0IHsKICAgIHN0cnVjdCBfRmNTdWJzdAkqbmV4dDsKICAgIEZjVGVzdAkJKnRlc3Q7CiAgICBGY0VkaXQJCSplZGl0Owp9IEZjU3Vic3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTGVhZiB7CiAgICBGY0NoYXIzMgltYXBbMjU2LzMyXTsKfSBGY0NoYXJMZWFmOwoKI2RlZmluZSBGQ19SRUZfQ09OU1RBTlQJICAgIC0xCgpzdHJ1Y3QgX0ZjQ2hhclNldCB7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgaW50CQkgICAgbnVtOwkvKiBzaXplIG9mIGxlYXZlcyBhbmQgbnVtYmVycyBhcnJheXMgKi8KICAgIEZjQ2hhckxlYWYJICAgICoqbGVhdmVzOwogICAgRmNDaGFyMTYJICAgICpudW1iZXJzOwp9OwoKc3RydWN0IF9GY1N0clNldCB7CiAgICBpbnQJCSAgICByZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwogICAgaW50CQkgICAgbnVtOwogICAgaW50CQkgICAgc2l6ZTsKICAgIEZjQ2hhcjgJICAgICoqc3RyczsKfTsKCnN0cnVjdCBfRmNTdHJMaXN0IHsKICAgIEZjU3RyU2V0CSAgICAqc2V0OwogICAgaW50CQkgICAgbjsKfTsKCnR5cGVkZWYgc3RydWN0IF9GY1N0ckJ1ZiB7CiAgICBGY0NoYXI4ICpidWY7CiAgICBGY0Jvb2wgIGFsbG9jYXRlZDsKICAgIEZjQm9vbCAgZmFpbGVkOwogICAgaW50CSAgICBsZW47CiAgICBpbnQJICAgIHNpemU7Cn0gRmNTdHJCdWY7CgovKgogKiBUbyBtYXAgYWRvYmUgZ2x5cGggbmFtZXMgdG8gdW5pY29kZSB2YWx1ZXMsIGEgcHJlY29tcHV0ZWQgaGFzaAogKiB0YWJsZSBpcyB1c2VkCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2x5cGhOYW1lIHsKICAgIEZjQ2hhcjMyCXVjczsJCS8qIHVuaWNvZGUgdmFsdWUgKi8KICAgIEZjQ2hhcjgJbmFtZVsxXTsJLyogbmFtZSBleHRlbmRzIGJleW9uZCBzdHJ1Y3QgKi8KfSBGY0dseXBoTmFtZTsKCi8qCiAqIFRoZSBwZXItdXNlciB+Ly5mb250cy5jYWNoZS08dmVyc2lvbj4gZmlsZSBpcyBsb2FkZWQgaW50bwogKiB0aGlzIGRhdGEgc3RydWN0dXJlLiAgRWFjaCBkaXJlY3RvcnkgZ2V0cyBhIHN1YnN0cnVjdHVyZQogKiB3aGljaCBpcyB2YWxpZGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBkaXJlY3RvcnkgdGltZXN0YW1wIHdpdGgKICogdGhhdCBzYXZlZCBpbiB0aGUgY2FjaGUuICBXaGVuIHZhbGlkLCB0aGUgZW50aXJlIGRpcmVjdG9yeSBjYWNoZQogKiBjYW4gYmUgaW1tZWRpYXRlbHkgbG9hZGVkIHdpdGhvdXQgcmVhZGluZyB0aGUgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlLAogKiB0aGUgZmlsZXMgYXJlIGNoZWNrZWQgaW5kaXZpZHVhbGx5OyB1cGRhdGVkIGZpbGVzIGFyZSBsb2FkZWQgaW50byB0aGUKICogY2FjaGUgd2hpY2ggaXMgdGhlbiByZXdyaXR0ZW4gdG8gdGhlIHVzZXJzIGhvbWUgZGlyZWN0b3J5CiAqLwoKI2RlZmluZSBGQ19HTE9CQUxfQ0FDSEVfRElSX0hBU0hfU0laRQkgICAgMzcKI2RlZmluZSBGQ19HTE9CQUxfQ0FDSEVfRklMRV9IQVNIX1NJWkUJICAgIDY3Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUluZm8gewogICAgdW5zaWduZWQgaW50CQloYXNoOwogICAgRmNDaGFyOAkJCSpmaWxlOwogICAgdGltZV90CQkJdGltZTsKICAgIEZjQm9vbAkJCXJlZmVyZW5jZWQ7Cn0gRmNHbG9iYWxDYWNoZUluZm87Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUZpbGUgewogICAgc3RydWN0IF9GY0dsb2JhbENhY2hlRmlsZQkqbmV4dDsKICAgIEZjR2xvYmFsQ2FjaGVJbmZvCQlpbmZvOwogICAgaW50CQkJCWlkOwogICAgRmNDaGFyOAkJCSpuYW1lOwp9IEZjR2xvYmFsQ2FjaGVGaWxlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVEaXIgRmNHbG9iYWxDYWNoZURpcjsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlU3ViZGlyIHsKICAgIHN0cnVjdCBfRmNHbG9iYWxDYWNoZVN1YmRpcgkqbmV4dDsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJCSplbnQ7Cn0gRmNHbG9iYWxDYWNoZVN1YmRpcjsKCnN0cnVjdCBfRmNHbG9iYWxDYWNoZURpciB7CiAgICBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVEaXIJKm5leHQ7CiAgICBGY0dsb2JhbENhY2hlSW5mbyAgICAJaW5mbzsKICAgIGludAkJCQlsZW47CiAgICBGY0dsb2JhbENhY2hlRmlsZQkJKmVudHNbRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFXTsKICAgIEZjR2xvYmFsQ2FjaGVTdWJkaXIJCSpzdWJkaXJzOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGUgewogICAgRmNHbG9iYWxDYWNoZURpcgkJKmVudHNbRkNfR0xPQkFMX0NBQ0hFX0RJUl9IQVNIX1NJWkVdOwogICAgRmNCb29sCQkJdXBkYXRlZDsKICAgIEZjQm9vbAkJCWJyb2tlbjsKICAgIGludAkJCQllbnRyaWVzOwogICAgaW50CQkJCXJlZmVyZW5jZWQ7Cn0gRmNHbG9iYWxDYWNoZTsKCnN0cnVjdCBfRmNBdG9taWMgewogICAgRmNDaGFyOAkqZmlsZTsJCS8qIG9yaWdpbmFsIGZpbGUgbmFtZSAqLwogICAgRmNDaGFyOAkqbmV3OwkJLyogdGVtcCBmaWxlIG5hbWUgLS0gd3JpdGUgZGF0YSBoZXJlICovCiAgICBGY0NoYXI4CSpsY2s7CQkvKiBsb2NrZmlsZSBuYW1lICh1c2VkIGZvciBsb2NraW5nKSAqLwogICAgRmNDaGFyOAkqdG1wOwkJLyogdG1wZmlsZSBuYW1lICh1c2VkIGZvciBsb2NraW5nKSAqLwp9OwoKc3RydWN0IF9GY0JsYW5rcyB7CiAgICBpbnQJCW5ibGFuazsKICAgIGludAkJc2JsYW5rOwogICAgRmNDaGFyMzIJKmJsYW5rczsKfTsKCnN0cnVjdCBfRmNDb25maWcgewogICAgLyoKICAgICAqIEZpbGUgbmFtZXMgbG9hZGVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gLS0gc2F2ZWQgaGVyZSBhcyB0aGUKICAgICAqIGNhY2hlIGZpbGUgbXVzdCBiZSBjb25zdWx0ZWQgYmVmb3JlIHRoZSBkaXJlY3RvcmllcyBhcmUgc2Nhbm5lZCwKICAgICAqIGFuZCB0aG9zZSBkaXJlY3RpdmVzIG1heSBvY2N1ciBpbiBhbnkgb3JkZXIKICAgICAqLwogICAgRmNTdHJTZXQJKmNvbmZpZ0RpcnM7CSAgICAvKiBkaXJlY3RvcmllcyB0byBzY2FuIGZvciBmb250cyAqLwogICAgRmNDaGFyOAkqY2FjaGU7CQkgICAgLyogbmFtZSBvZiBwZXItdXNlciBjYWNoZSBmaWxlICovCiAgICAvKgogICAgICogU2V0IG9mIGFsbG93ZWQgYmxhbmsgY2hhcnMgLS0gdXNlZCB0bwogICAgICogdHJpbSBmb250cyBvZiBib2d1cyBnbHlwaHMKICAgICAqLwogICAgRmNCbGFua3MJKmJsYW5rczsKICAgIC8qCiAgICAgKiBMaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZm9udHMsCiAgICAgKiBidWlsdCBieSByZWN1cnNpdmVseSBzY2FubmluZyB0aGUgc2V0IAogICAgICogb2YgY29uZmlndXJlZCBkaXJlY3RvcmllcwogICAgICovCiAgICBGY1N0clNldAkqZm9udERpcnM7CiAgICAvKgogICAgICogTmFtZXMgb2YgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHVzZWQKICAgICAqIHRvIGNyZWF0ZSB0aGlzIGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgRmNTdHJTZXQJKmNvbmZpZ0ZpbGVzOwkgICAgLyogY29uZmlnIGZpbGVzIGxvYWRlZCAqLwogICAgLyoKICAgICAqIFN1YnN0aXR1dGlvbiBpbnN0cnVjdGlvbnMgZm9yIHBhdHRlcm5zIGFuZCBmb250czsKICAgICAqIG1heE9iamVjdHMgaXMgdXNlZCB0byBhbGxvY2F0ZSBhcHByb3ByaWF0ZSBpbnRlcm1lZGlhdGUgc3RvcmFnZQogICAgICogd2hpbGUgcGVyZm9ybWluZyBhIHdob2xlIHNldCBvZiBzdWJzdGl0dXRpb25zCiAgICAgKi8KICAgIEZjU3Vic3QJKnN1YnN0UGF0dGVybjsJICAgIC8qIHN1YnN0aXR1dGlvbnMgZm9yIHBhdHRlcm5zICovCiAgICBGY1N1YnN0CSpzdWJzdEZvbnQ7CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBmb250cyAqLwogICAgaW50CQltYXhPYmplY3RzOwkgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGVzdHMgaW4gYWxsIHN1YnN0cyAqLwogICAgLyoKICAgICAqIExpc3Qgb2YgcGF0dGVybnMgdXNlZCB0byBjb250cm9sIGZvbnQgZmlsZSBzZWxlY3Rpb24KICAgICAqLwogICAgRmNTdHJTZXQJKmFjY2VwdEdsb2JzOwogICAgRmNTdHJTZXQJKnJlamVjdEdsb2JzOwogICAgLyoKICAgICAqIFRoZSBzZXQgb2YgZm9udHMgbG9hZGVkIGZyb20gdGhlIGxpc3RlZCBkaXJlY3RvcmllczsgdGhlCiAgICAgKiBvcmRlciB3aXRoaW4gdGhlIHNldCBkb2VzIG5vdCBkZXRlcm1pbmUgdGhlIGZvbnQgc2VsZWN0aW9uLAogICAgICogZXhjZXB0IGluIHRoZSBjYXNlIG9mIGlkZW50aWNhbCBtYXRjaGVzIGluIHdoaWNoIGNhc2UgZWFybGllciBmb250cwogICAgICogbWF0Y2ggcHJlZmVycmVudGlhbGx5CiAgICAgKi8KICAgIEZjRm9udFNldAkqZm9udHNbRmNTZXRBcHBsaWNhdGlvbiArIDFdOwogICAgLyoKICAgICAqIEZvbnRjb25maWcgY2FuIHBlcmlvZGljYWxseSByZXNjYW4gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uCiAgICAgKiBhbmQgZm9udCBkaXJlY3Rvcmllcy4gIFRoaXMgcmVzY2FubmluZyBvY2N1cnMgd2hlbiBmb250CiAgICAgKiBsaXN0aW5nIHJlcXVlc3RzIGFyZSBtYWRlLCBidXQgbm8gbW9yZSBvZnRlbiB0aGFuIHJlc2NhbkludGVydmFsCiAgICAgKiBzZWNvbmRzIGFwYXJ0LgogICAgICovCiAgICB0aW1lX3QJcmVzY2FuVGltZTsJICAgIC8qIGxhc3QgdGltZSBpbmZvcm1hdGlvbiB3YXMgc2Nhbm5lZCAqLwogICAgaW50CQlyZXNjYW5JbnRlcnZhbDsJICAgIC8qIGludGVydmFsIGJldHdlZW4gc2NhbnMgKi8KfTsKIApleHRlcm4gRmNDb25maWcJKl9mY0NvbmZpZzsKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJNYXAgRmNDaGFyTWFwOwoKLyogZmNibGFua3MuYyAqLwoKLyogZmNjYWNoZS5jICovCgpGY0dsb2JhbENhY2hlICoKRmNHbG9iYWxDYWNoZUNyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjR2xvYmFsQ2FjaGVEZXN0cm95IChGY0dsb2JhbENhY2hlICpjYWNoZSk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZUNoZWNrVGltZSAoY29uc3QgRmNDaGFyOCpmaWxlLCBGY0dsb2JhbENhY2hlSW5mbyAqaW5mbyk7Cgp2b2lkCkZjR2xvYmFsQ2FjaGVSZWZlcmVuY2VkIChGY0dsb2JhbENhY2hlCSAgICAqY2FjaGUsCgkJCSBGY0dsb2JhbENhY2hlSW5mbyAgKmluZm8pOwoKdm9pZApGY0dsb2JhbENhY2hlUmVmZXJlbmNlU3ViZGlyIChGY0dsb2JhbENhY2hlICpjYWNoZSwKCQkJICAgICAgY29uc3QgRmNDaGFyOCAqZGlyKTsKCkZjR2xvYmFsQ2FjaGVEaXIgKgpGY0dsb2JhbENhY2hlRGlyR2V0IChGY0dsb2JhbENhY2hlICAqY2FjaGUsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqZGlyLAoJCSAgICAgaW50CSAgICBsZW4sCgkJICAgICBGY0Jvb2wJICAgIGNyZWF0ZV9taXNzaW5nKTsKCkZjQm9vbApGY0dsb2JhbENhY2hlU2NhbkRpciAoRmNGb250U2V0CQkqc2V0LAoJCSAgICAgIEZjU3RyU2V0CQkqZGlycywKCQkgICAgICBGY0dsb2JhbENhY2hlCSpjYWNoZSwKCQkgICAgICBjb25zdCBGY0NoYXI4CSpkaXIsCgkJICAgICAgRmNDb25maWcJCSpjb25maWcpOwoKRmNHbG9iYWxDYWNoZUZpbGUgKgpGY0dsb2JhbENhY2hlRmlsZUdldCAoRmNHbG9iYWxDYWNoZSAqY2FjaGUsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqZmlsZSwKCQkgICAgICBpbnQJICAgIGlkLAoJCSAgICAgIGludAkgICAgKmNvdW50KTsKCgp2b2lkCkZjR2xvYmFsQ2FjaGVMb2FkIChGY0dsb2JhbENhY2hlICAgICpjYWNoZSwKCQkgICBjb25zdCBGY0NoYXI4ICAgICpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0dsb2JhbENhY2hlVXBkYXRlIChGY0dsb2JhbENhY2hlICAqY2FjaGUsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqZmlsZSwKCQkgICAgIGludAkgICAgaWQsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqbmFtZSk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVNhdmUgKEZjR2xvYmFsQ2FjaGUgICAgKmNhY2hlLAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKmNhY2hlX2ZpbGUpOwoKRmNCb29sCkZjRGlyQ2FjaGVSZWFkRGlyIChGY0ZvbnRTZXQJICAgICpzZXQsIAoJCSAgIEZjU3RyU2V0CSAgICAqZGlycywKCQkgICBjb25zdCBGY0NoYXI4ICAgICpkaXIsCgkJICAgRmNDb25maWcJICAgICpjb25maWcpOwoKRmNCb29sCkZjRGlyQ2FjaGVXcml0ZURpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpOwogICAgCi8qIGZjY2ZnLmMgKi8KCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0RpciAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqZCk7CgpGY0Jvb2wKRmNDb25maWdBZGRGb250RGlyIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgY29uc3QgRmNDaGFyOCAgICpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZERpciAoRmNDb25maWcJKmNvbmZpZywKCQljb25zdCBGY0NoYXI4CSpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0ZpbGUgKEZjQ29uZmlnCQkqY29uZmlnLAoJCSAgICAgICBjb25zdCBGY0NoYXI4CSpmKTsKCkZjQm9vbApGY0NvbmZpZ1NldENhY2hlIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgY29uc3QgRmNDaGFyOAkqYyk7CgpGY0Jvb2wKRmNDb25maWdBZGRCbGFuayAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjQ2hhcjMyICAgIAlibGFuayk7CgpGY0Jvb2wKRmNDb25maWdBZGRFZGl0IChGY0NvbmZpZwkqY29uZmlnLAoJCSBGY1Rlc3QJCSp0ZXN0LAoJCSBGY0VkaXQJCSplZGl0LAoJCSBGY01hdGNoS2luZAlraW5kKTsKCnZvaWQKRmNDb25maWdTZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjRm9udFNldAkqZm9udHMsCgkJICBGY1NldE5hbWUJc2V0KTsKCkZjQm9vbApGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAoY29uc3QgRmNWYWx1ZSBtLAoJCSAgICAgIEZjT3AJICAgIG9wLAoJCSAgICAgIGNvbnN0IEZjVmFsdWUgdik7CgpGY0Jvb2wKRmNDb25maWdHbG9iQWRkIChGY0NvbmZpZwkqY29uZmlnLAoJCSBjb25zdCBGY0NoYXI4CSpnbG9iLAoJCSBGY0Jvb2wJCWFjY2VwdCk7CgpGY0Jvb2wKRmNDb25maWdBY2NlcHRGaWxlbmFtZSAoRmNDb25maWcJKmNvbmZpZywKCQkJY29uc3QgRmNDaGFyOAkqZmlsZW5hbWUpOwoKLyogZmNjaGFyc2V0LmMgKi8KRmNDaGFyU2V0ICoKRmNDaGFyU2V0RnJlZXplIChGY0NoYXJTZXQgKmNzKTsKCnZvaWQKRmNDaGFyU2V0VGhhd0FsbCAodm9pZCk7CgpGY0Jvb2wKRmNOYW1lVW5wYXJzZUNoYXJTZXQgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhclNldCAqYyk7CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZyk7CgpGY0NoYXJMZWFmICoKRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KTsKCi8qIGZjZGJnLmMgKi8Kdm9pZApGY1ZhbHVlTGlzdFByaW50IChjb25zdCBGY1ZhbHVlTGlzdCAqbCk7Cgp2b2lkCkZjTGFuZ1NldFByaW50IChjb25zdCBGY0xhbmdTZXQgKmxzKTsKCnZvaWQKRmNPcFByaW50IChGY09wIG9wKTsKCnZvaWQKRmNUZXN0UHJpbnQgKGNvbnN0IEZjVGVzdCAqdGVzdCk7Cgp2b2lkCkZjRXhwclByaW50IChjb25zdCBGY0V4cHIgKmV4cHIpOwoKdm9pZApGY0VkaXRQcmludCAoY29uc3QgRmNFZGl0ICplZGl0KTsKCnZvaWQKRmNTdWJzdFByaW50IChjb25zdCBGY1N1YnN0ICpzdWJzdCk7CgppbnQKRmNEZWJ1ZyAodm9pZCk7CgovKiBmY2Rpci5jICovCgpGY0Jvb2wKRmNGaWxlU2NhbkNvbmZpZyAoRmNGb250U2V0CSpzZXQsCgkJICBGY1N0clNldAkqZGlycywKCQkgIEZjRmlsZUNhY2hlCSpjYWNoZSwKCQkgIEZjQmxhbmtzCSpibGFua3MsCgkJICBjb25zdCBGY0NoYXI4ICpmaWxlLAoJCSAgRmNCb29sCWZvcmNlLAoJCSAgRmNDb25maWcJKmNvbmZpZyk7CgpGY0Jvb2wKRmNEaXJTY2FuQ29uZmlnIChGY0ZvbnRTZXQJKnNldCwKCQkgRmNTdHJTZXQJKmRpcnMsCgkJIEZjRmlsZUNhY2hlCSpjYWNoZSwKCQkgRmNCbGFua3MJKmJsYW5rcywKCQkgY29uc3QgRmNDaGFyOCAgKmRpciwKCQkgRmNCb29sCQlmb3JjZSwKCQkgRmNDb25maWcJKmNvbmZpZyk7CgovKiBmY2ZvbnQuYyAqLwppbnQKRmNGb250RGVidWcgKHZvaWQpOwogICAgCi8qIGZjZnJlZXR5cGUuYyAqLwpGY0Jvb2wKRmNGcmVlVHlwZUlzRXhjbHVzaXZlTGFuZyAoY29uc3QgRmNDaGFyOCAgKmxhbmcpOwoKRmNCb29sCkZjRnJlZVR5cGVIYXNMYW5nIChGY1BhdHRlcm4gKnBhdHRlcm4sIGNvbnN0IEZjQ2hhcjggKmxhbmcpOwoKRmNDaGFyMzIKRmNGcmVlVHlwZVVjczRUb1ByaXZhdGUgKEZjQ2hhcjMyIHVjczQsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKTsKCkZjQ2hhcjMyCkZjRnJlZVR5cGVQcml2YXRlVG9VY3M0IChGY0NoYXIzMiBwcml2YXRlLCBjb25zdCBGY0NoYXJNYXAgKm1hcCk7Cgpjb25zdCBGY0NoYXJNYXAgKgpGY0ZyZWVUeXBlR2V0UHJpdmF0ZU1hcCAoRlRfRW5jb2RpbmcgZW5jb2RpbmcpOwogICAgCi8qIGZjZnMuYyAqLwovKiBmY2dyYW0ueSAqLwppbnQKRmNDb25maWdwYXJzZSAodm9pZCk7CgppbnQKRmNDb25maWd3cmFwICh2b2lkKTsKICAgIAp2b2lkCkZjQ29uZmlnZXJyb3IgKGNoYXIgKmZtdCwgLi4uKTsKICAgIApjaGFyICoKRmNDb25maWdTYXZlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKTsKCkZjVGVzdCAqCkZjVGVzdENyZWF0ZSAoRmNNYXRjaEtpbmQgICBraW5kLAoJICAgICAgRmNRdWFsCSAgICBxdWFsLAoJICAgICAgY29uc3QgRmNDaGFyOCAqZmllbGQsCgkgICAgICBGY09wCSAgICBjb21wYXJlLAoJICAgICAgRmNFeHByCSAgICAqZXhwcik7Cgp2b2lkCkZjVGVzdERlc3Ryb3kgKEZjVGVzdCAqdGVzdCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVJbnRlZ2VyIChpbnQgaSk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVEb3VibGUgKGRvdWJsZSBkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZVN0cmluZyAoY29uc3QgRmNDaGFyOCAqcyk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVNYXRyaXggKGNvbnN0IEZjTWF0cml4ICptKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUJvb2wgKEZjQm9vbCBiKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU5pbCAodm9pZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlQ29uc3QgKGNvbnN0IEZjQ2hhcjggKmNvbnN0YW50KTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU9wIChGY0V4cHIgKmxlZnQsIEZjT3Agb3AsIEZjRXhwciAqcmlnaHQpOwoKdm9pZApGY0V4cHJEZXN0cm95IChGY0V4cHIgKmUpOwoKRmNFZGl0ICoKRmNFZGl0Q3JlYXRlIChjb25zdCBjaGFyICpmaWVsZCwgRmNPcCBvcCwgRmNFeHByICpleHByLCBGY1ZhbHVlQmluZGluZyBiaW5kaW5nKTsKCnZvaWQKRmNFZGl0RGVzdHJveSAoRmNFZGl0ICplKTsKCi8qIGZjaW5pdC5jICovCgp2b2lkCkZjTWVtUmVwb3J0ICh2b2lkKTsKCnZvaWQKRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKTsKCnZvaWQKRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpOwoKLyogZmNsYW5nLmMgKi8KRmNMYW5nU2V0ICoKRmNGcmVlVHlwZUxhbmdTZXQgKGNvbnN0IEZjQ2hhclNldCAgKmNoYXJzZXQsIAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKmV4Y2x1c2l2ZUxhbmcpOwoKRmNMYW5nUmVzdWx0CkZjTGFuZ0NvbXBhcmUgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMik7CiAgICAKY29uc3QgRmNDaGFyU2V0ICoKRmNDaGFyU2V0Rm9yTGFuZyAoY29uc3QgRmNDaGFyOCAqbGFuZyk7CgpGY0xhbmdTZXQgKgpGY0xhbmdTZXRQcm9tb3RlIChjb25zdCBGY0NoYXI4ICpsYW5nKTsKCkZjTGFuZ1NldCAqCkZjTmFtZVBhcnNlTGFuZ1NldCAoY29uc3QgRmNDaGFyOCAqc3RyaW5nKTsKCkZjQm9vbApGY05hbWVVbnBhcnNlTGFuZ1NldCAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNMYW5nU2V0ICpscyk7CgovKiBmY2xpc3QuYyAqLwoKLyogZmNtYXRjaC5jICovCgovKiBmY25hbWUuYyAqLwoKRmNCb29sCkZjTmFtZUJvb2wgKEZjQ2hhcjggKnYsIEZjQm9vbCAqcmVzdWx0KTsKCi8qIGZjcGF0LmMgKi8Kdm9pZApGY1ZhbHVlTGlzdERlc3Ryb3kgKEZjVmFsdWVMaXN0ICpsKTsKICAgIApGY1BhdHRlcm5FbHQgKgpGY1BhdHRlcm5GaW5kRWx0IChjb25zdCBGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCk7CgpGY1BhdHRlcm5FbHQgKgpGY1BhdHRlcm5JbnNlcnRFbHQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0KTsKCkZjQm9vbApGY1BhdHRlcm5BZGRXaXRoQmluZGluZyAgKEZjUGF0dGVybgkgICAgKnAsCgkJCSAgY29uc3QgY2hhcgkgICAgKm9iamVjdCwKCQkJICBGY1ZhbHVlCSAgICB2YWx1ZSwKCQkJICBGY1ZhbHVlQmluZGluZyAgICBiaW5kaW5nLAoJCQkgIEZjQm9vbAkgICAgYXBwZW5kKTsKCkZjUGF0dGVybiAqCkZjUGF0dGVybkZyZWV6ZSAoRmNQYXR0ZXJuICpwKTsKCnZvaWQKRmNQYXR0ZXJuVGhhd0FsbCAodm9pZCk7CgovKiBmY3JlbmRlci5jICovCgovKiBmY21hdHJpeC5jICovCgpleHRlcm4gY29uc3QgRmNNYXRyaXggICAgRmNJZGVudGl0eU1hdHJpeDsKCnZvaWQKRmNNYXRyaXhGcmVlIChGY01hdHJpeCAqbWF0KTsKCi8qIGZjc3RyLmMgKi8KRmNDaGFyOCAqCkZjU3RyUGx1cyAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKICAgIAp2b2lkCkZjU3RyRnJlZSAoRmNDaGFyOCAqcyk7Cgp2b2lkCkZjU3RyQnVmSW5pdCAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyOCAqaW5pdCwgaW50IHNpemUpOwoKdm9pZApGY1N0ckJ1ZkRlc3Ryb3kgKEZjU3RyQnVmICpidWYpOwoKRmNDaGFyOCAqCkZjU3RyQnVmRG9uZSAoRmNTdHJCdWYgKmJ1Zik7CgpGY0Jvb2wKRmNTdHJCdWZDaGFyIChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXI4IGMpOwoKRmNCb29sCkZjU3RyQnVmU3RyaW5nIChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0ckJ1ZkRhdGEgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMsIGludCBsZW4pOwoKaW50CkZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCmNvbnN0IEZjQ2hhcjggKgpGY1N0ckNvbnRhaW5zSWdub3JlQmxhbmtzQW5kQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCmNvbnN0IEZjQ2hhcjggKgpGY1N0ckNvbnRhaW5zSWdub3JlQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCkZjQm9vbApGY1N0clVzZXNIb21lIChjb25zdCBGY0NoYXI4ICpzKTsKCkZjQ2hhcjggKgpGY1N0ckxhc3RTbGFzaCAoY29uc3QgRmNDaGFyOCAgKnBhdGgpOwoKI2VuZGlmIC8qIF9GQ19JTlRfSF8gKi8K