ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWUwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9BVVRIT1JTCkBAIC0wLDAgKzEgQEAKK0tlaXRoIFBhY2thcmQgPGtlaXRocEBrZWl0aHAuY29tPgpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZDg4OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSwyMiBAQAorJFhGcmVlODY6ICQKKworQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KK2FkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KK3JlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAoraXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKK0lOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KK0VWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKwpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9DaGFuZ2VMb2cKZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OThiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsMyBAQAorVGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgKGZvbnRzLmNvbmYsIGZvbnRzLmR0ZCkgZ28gaW4gYSBuZXcgZGlyZWN0b3J5CisvZXRjL2ZvbnRzLCB0aGUgaW5zdGFsbCBzdGVwIGRvZXNuJ3QgY3VycmVudCBjcmVhdGUgdGhpcyBkaXJlY3Rvcnkgb3IgY29weQordGhlIGNvbmZpZyBmaWxlcy4KZGlmZiAtLWdpdCBhL0ltYWtlZmlsZSBiL0ltYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI2ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvSW1ha2VmaWxlCkBAIC0wLDAgKzEsMjUgQEAKKyNkZWZpbmUgSUhhdmVTdWJkaXJzCisjZGVmaW5lIFBhc3NDRGVidWdGbGFncworCitMSU5UU1VCRElSUz1zcmMgZmMtY2FjaGUgZmMtbGlzdAorCitTVUJESVJTPWZvbnRjb25maWcgJChMSU5UU1VCRElSUykKKworI2lmbmRlZiBGb250Y29uZmlnRGlyCisjZGVmaW5lIEZvbnRjb25maWdEaXIgL2V0Yy9mb250cworI2VuZGlmCisKK0ZPTlRDT05GSUdESVI9Rm9udGNvbmZpZ0RpcgorCitNYWtlU3ViZGlycygkKFNVQkRJUlMpKQorRGVwZW5kU3ViZGlycygkKFNVQkRJUlMpKQorTWFrZUxpbnRMaWJTdWJkaXJzKCQoTElOVFNVQkRJUlMpKQorTWFrZUxpbnRTdWJkaXJzKCQoTElOVFNVQkRJUlMpLGluc3RhbGwubG4saW5zdGFsbC5sbikKKworSW5zdGFsbE5vbkV4ZWNGaWxlTm9DbG9iYmVyKGZvbnRzLmNvbmYsJChGT05UQ09ORklHRElSKSkKK0luc3RhbGxOb25FeGVjRmlsZU5vQ2xvYmJlcihmb250cy5kdGQsJChGT05UQ09ORklHRElSKSkKKworYWxsOjogZm9udHMuY29uZgorCitmb250cy5jb25mOiBmb250cy5jb25mLmluCisJc2ggLi9zZXRmb250ZGlycwpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL05FV1MKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYwZmNhCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMiBAQAorCQkJRm9udGNvbmZpZworCUZvbnQgY29uZmlndXJhdGlvbiBhbmQgY3VzdG9taXphdGlvbiBsaWJyYXJ5CmRpZmYgLS1naXQgYS9hY2NvbmZpZy5oIGIvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ2MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYWNjb25maWcuaApAQCAtMCwwICsxLDIgQEAKKyN1bmRlZiBIQVZFX0ZSRUVUWVBFIAorI3VuZGVmIEZDX0ZBTExCQUNLX0ZPTlRTCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmY2JhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDIwMiBAQAorQUNfSU5JVChmb250Y29uZmlnL2ZvbnRjb25maWcuaCkKKworQUNfUFJFUkVRKDIuMTMpCisKK0ZDX01BSk9SPTEKK0ZDX01JTk9SPTAKK0ZDX1NVQj0xCitGQ19QUkU9CitGQ19JRkFDRV9BR0U9MAorRkNfQklOX0FHRT0wCisKK0FDX1NVQlNUKEZDX01BSk9SKQorQUNfU1VCU1QoRkNfTUlOT1IpCitBQ19TVUJTVChGQ19TVUIpCitBQ19TVUJTVChGQ19JRkFDRV9BR0UpCitBQ19TVUJTVChGQ19CSU5fQUdFKQorCitMVF9SRUxFQVNFPSRGQ19NQUpPUi4kRkNfTUlOT1IKK0xUX0NVUlJFTlQ9YGV4cHIgJEZDX1NVQiAtICRGQ19JRkFDRV9BR0VgCitMVF9SRVZJU0lPTj0kRkNfSUZBQ0VfQUdFCitMVF9BR0U9YGV4cHIgJEZDX0JJTl9BR0UgLSAkRkNfSUZBQ0VfQUdFYAorQUNfU1VCU1QoTFRfUkVMRUFTRSkKK0FDX1NVQlNUKExUX0NVUlJFTlQpCitBQ19TVUJTVChMVF9SRVZJU0lPTikKK0FDX1NVQlNUKExUX0FHRSkKKworQU1fSU5JVF9BVVRPTUFLRSgiZm9udGNvbmZpZyIsICRGQ19NQUpPUi4kRkNfTUlOT1IuJEZDX1NVQiRGQ19QUkUpCisKK0FDX0NBTk9OSUNBTF9IT1NUCitBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oKQorCitBQ19BUkdfV0lUSChmcmVldHlwZV9pbmNsdWRlcywgWyAgLS13aXRoLWZyZWV0eXBlLWluY2x1ZGVzPURJUiAgVXNlIEZyZWVUeXBlIGluY2x1ZGVzIGluIERJUl0sIGZyZWV0eXBlX2luY2x1ZGVzPSR3aXRodmFsLCBmcmVldHlwZV9pbmNsdWRlcz15ZXMpCitBQ19BUkdfV0lUSChmcmVldHlwZV9saWIsICAgICAgWyAgLS13aXRoLWZyZWV0eXBlLWxpYj1ESVIgICAgICAgVXNlIEZyZWVUeXBlIGxpYnJhcnkgaW4gRElSXSwgZnJlZXR5cGVfbGliPSR3aXRodmFsLCBmcmVldHlwZV9saWI9eWVzKQorQUNfQVJHX1dJVEgoZnJlZXR5cGVfY29uZmlnLCAgIFsgIC0td2l0aC1mcmVlZXR5cGUtY29uZmlnPVBST0cgIFVzZSBGcmVlVHlwZSBjb25maWd1cmF0aW9uIHByb2dyYW0gUFJPR10sIGZyZWV0eXBlX2NvbmZpZz0kd2l0aHZhbCwgZnJlZXR5cGVfY29uZmlnPXllcykKK0FDX0FSR19XSVRIKHhtbDJfaW5jbHVkZXMsICAgICBbICAtLXdpdGgteG1sMi1pbmNsdWRlcz1ESVIgICAgICBVc2UgeG1sMiBpbmNsdWRlcyBpbiBESVJdLCB4bWwyX2luY2x1ZGVzPSR3aXRodmFsLCB4bWwyX2luY2x1ZGVzPXllcykKK0FDX0FSR19XSVRIKHhtbDJfbGliLCAgICAgICAgICBbICAtLXdpdGgteG1sMi1saWI9RElSICAgICAgICAgICBVc2UgeG1sMiBsaWJyYXJ5IGluIERJUl0sIHhtbDJfbGliPSR3aXRodmFsLCB4bWwyX2xpYj15ZXMpCitBQ19BUkdfV0lUSCh4bWwyX2NvbmZpZywgICAgICAgWyAgLS13aXRoLWZyZWVldHlwZS1jb25maWc9UFJPRyAgVXNlIEZyZWVUeXBlIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbSBQUk9HXSwgeG1sMl9jb25maWc9JHdpdGh2YWwsIHhtbDJfY29uZmlnPXllcykKK0FDX0FSR19XSVRIKGZhbGxiYWNrX2ZvbnRzLCAgICBbICAtLXdpdGgtZmFsbGJhY2stZm9udHM9RElSICAgICBVc2UgZm9udHMgZnJvbSBESVIgd2hlbiBjb25maWcgaXMgYnVzdGVkXSwgZmFsbGJhY2tfZm9udHM9IiR3aXRodmFsIiwgZmFsbGJhY2tfZm9udHM9eWVzKQorQUNfSVNDX1BPU0lYCitBQ19QUk9HX0NDCitBQ19TVERDX0hFQURFUlMKK0FDX1BST0dfTUFLRV9TRVQKK0FDX1BST0dfSU5TVEFMTAorCitBQ19QUk9HX0xOX1MKKworZG5sCitkbmwgTGlidG9vbAorZG5sCitBTV9ESVNBQkxFX1NUQVRJQworQU1fUFJPR19MSUJUT09MCitBQ19TVUJTVChMSUJUT09MX0RFUFMpCitpZiBsaWJ0b29sIC0tZmVhdHVyZXMgfCBncmVwICJlbmFibGUgc3RhdGljIiA+L2Rldi9udWxsOyB0aGVuCisgIFNUQVRJQz0iLXN0YXRpYyIKK2Vsc2UKKyAgU1RBVElDPQorZmkKK0FDX1NVQlNUKFNUQVRJQykKKworQUNfU1VCU1QoREVCVUdfQ0ZMQUdTKQorQUNfU1VCU1QoR0xPQkFMX0NGTEFHUykKKworQUNfQ0hFQ0tfRlVOQ1MoZ2V0b3B0X2xvbmcgZ2V0b3B0KQorCitjYXNlICIkZnJlZXR5cGVfY29uZmlnIiBpbgorbm8pCisJOzsKK3llcykKKwlBQ19DSEVDS19QUk9HKGZ0X2NvbmZpZywgZnJlZXR5cGUtY29uZmlnLCBmcmVldHlwZS1jb25maWcsIG5vKQorCTs7CisqKQorCWZ0X2NvbmZpZz0iJGZyZWV0eXBlX2NvbmZpZyIKKwk7OworZXNhYworCitjYXNlICIkZnJlZXR5cGVfaW5jbHVkZXMiIGluCitubykKKwlmcmVldHlwZV9pbmNsdWRlcz0iIgorCTs7Cit5ZXMpCisJY2FzZSAiJGZ0X2NvbmZpZyIgaW4KKwlubykKKwkJZnJlZXR5cGVfaW5jbHVkZXM9IiIKKwkJOzsKKwkqKQorCQlmcmVldHlwZV9pbmNsdWRlcz0iYCRmdF9jb25maWcgLS1jZmxhZ3NgIgorCQk7OworCWVzYWMKKwk7OworKikKKwlmcmVldHlwZV9pbmNsdWRlcz0iLUkkZnJlZXR5cGVfaW5jbHVkZXMiCisJOzsKK2VzYWMKKworY2FzZSAiJGZyZWV0eXBlX2xpYiIgaW4KK25vKQorCWZyZWV0eXBlX2xpYj0iIgorCTs7Cit5ZXMpCisJY2FzZSAiJGZ0X2NvbmZpZyIgaW4KKwlubykKKwkJZnJlZXR5cGVfbGliPSIiCisJCTs7CisJKikKKwkJZnJlZXR5cGVfbGliPSJgJGZ0X2NvbmZpZyAtLWxpYnNgIgorCQk7OworCWVzYWMKKwk7OworKikKKwlmcmVldHlwZV9saWI9Ii1MJGZyZWV0eXBlX2xpYiAtbGZyZWV0eXBlIgorCTs7Citlc2FjCisKK2Nhc2UgIiRmYWxsYmFja19mb250cyIgaW4KK3llcykKKwlBQ19ERUZJTkVfVU5RVU9URUQoRkNfRkFMTEJBQ0tfRk9OVFMsICIvdXNyL1gxMVI2L2xpYi9YMTEvZm9udHMvVHlwZTEiKQorCTs7CisqKQorCUFDX0RFRklORV9VTlFVT1RFRChGQ19GQUxMQkFDS19GT05UUywgIiRmYWxsYmFja19mb250cyIpCisJOzsKK2VzYWMKKworc2F2ZWRfTElCUz0iJExJQlMiCitMSUJTPSIkTElCUyAkZnJlZXR5cGVfbGliIgorc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJGZyZWV0eXBlX2luY2x1ZGVzIgorQUNfQ0hFQ0tfSEVBREVSUyhmdDJidWlsZC5oKQorCitjYXNlICIkYWNfY3ZfaGVhZGVyX2Z0MmJ1aWxkX2giIGluCitubykKKwlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgorCUxJQlM9IiRzYXZlZF9MSUJTIgorCTs7Cit5ZXMpCisJQUNfQ0hFQ0tfRlVOQ1MoRlRfSW5pdF9GcmVlVHlwZSkKKwljYXNlICIkYWNfY3ZfZnVuY19GVF9Jbml0X0ZyZWVUeXBlIiBpbgorCW5vKQorCQlDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgorCQlMSUJTPSIkc2F2ZWRfTElCUyIKKwkJOzsKKwl5ZXMpCisJCUFDX0RFRklORShIQVZFX0ZSRUVUWVBFKQorCQk7OworCWVzYWMKKwk7OworZXNhYworCitjYXNlICIkeG1sMl9jb25maWciIGluCitubykKKwk7OworeWVzKQorCUFDX0NIRUNLX1BST0coeG1sMl9jb25maWdfcHJvZywgeG1sMi1jb25maWcsIHhtbDItY29uZmlnLCBubykKKwk7OworKikKKwk7OworZXNhYworCitjYXNlICIkeG1sMl9pbmNsdWRlcyIgaW4KK25vKQorCXhtbDJfaW5jbHVkZXM9IiIKKwk7OworeWVzKQorCWNhc2UgIiR4bWwyX2NvbmZpZ19wcm9nIiBpbgorCW5vKQorCQl4bWwyX2luY2x1ZGVzPSIiCisJCTs7CisJKikKKwkJeG1sMl9pbmNsdWRlcz0iYCR4bWwyX2NvbmZpZ19wcm9nIC0tY2ZsYWdzYCIKKwkJOzsKKwllc2FjCisJOzsKKyopCisJeG1sMl9pbmNsdWRlcz0iLUkkeG1sMl9pbmNsdWRlcyIKKwk7OworZXNhYworCitjYXNlICIkeG1sMl9saWIiIGluCitubykKKwl4bWwyX2xpYj0iIgorCTs7Cit5ZXMpCisJY2FzZSAiJHhtbDJfY29uZmlnX3Byb2ciIGluCisJbm8pCisJCXhtbDJfbGliPSIiCisJCTs7CisJKikKKwkJeG1sMl9saWI9ImAkeG1sMl9jb25maWdfcHJvZyAtLWxpYnNgIgorCQk7OworCWVzYWMKKwk7OworKikKKwl4bWwyX2xpYj0iLUwkeG1sMl9saWIgLWx4bWwyIgorCTs7Citlc2FjCisKK3NhdmVkX0xJQlM9IiRMSUJTIgorTElCUz0iJExJQlMgJHhtbDJfbGliIgorc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJHhtbDJfaW5jbHVkZXMiCitBQ19DSEVDS19IRUFERVJTKHhtbHZlcnNpb24uaCkKKworQUNfT1VUUFVUKE1ha2VmaWxlIHNyYy9NYWtlZmlsZSBmb250Y29uZmlnL01ha2VmaWxlIGZjLWNhY2hlL01ha2VmaWxlIGZjLWxpc3QvTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9jdnNjb21waWxlLnNoIGIvY3ZzY29tcGlsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzFmNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY3ZzY29tcGlsZS5zaApAQCAtMCwwICsxLDYgQEAKKyMhL2Jpbi9zaAorYWNsb2NhbAorYXV0b2hlYWRlcgorYXV0b21ha2UgLWEKK2F1dG9jb25mCisKZGlmZiAtLWdpdCBhL2RvYy9mb250Y29uZmlnLnRleCBiL2RvYy9mb250Y29uZmlnLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTYwYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ZvbnRjb25maWcudGV4CkBAIC0wLDAgKzEsNTUgQEAKK1xkb2N1bWVudGNsYXNzWzEwcHRde2FydGljbGV9CitcdXNlcGFja2FnZXtsYXRleHN5bX0KK1x1c2VwYWNrYWdle2Vwc2ZpZ30KK1x1c2VwYWNrYWdle3RpbWVzfQorCitcYmVnaW57ZG9jdW1lbnR9CitcZGF0ZXt9CitcdGl0bGV7VGhlIEZvbnRjb25maWcgTGlicmFyeTpcXAorQXJjaGl0ZWN0dXJlIGFuZCBVc2VycyBHdWlkZX0KK1xhdXRob3J7S2VpdGggUGFja2FyZFxcCit7XGVtIFhGcmVlODYgQ29yZSBUZWFtfVxcCitrZWl0aHBAa2VpdGhwLmNvbX0KK1xtYWtldGl0bGUKK1x0aGlzcGFnZXN0eWxle2VtcHR5fQorCitcYWJzdHJhY3QKKworVGhlIEZvbnRjb25maWcgbGlicmFyeSBwcm92aWRlcyBmb3IgY2VudHJhbCBhZG1pbmlzdHJhdGlvbiBhbmQgY29uZmlndXJhdGlvbgorb2YgZm9udHMgaW4gYSBQT1NJWCBzeXN0ZW0uICBBbGwgZm9udCBjb25zdW1lcnMgY2FuIHNoYXJlIGEgY29tbW9uIGRhdGFiYXNlCitvZiBmb250cyBhbmQgdXNlIGNvbW1vbiBtYXRjaGluZyBydWxlcyBmb3IgZm9udCBuYW1lcy4gIFRoZSBzZXQgb2YgYXZhaWxhYmxlCitmb250cyBjYW4gYmUgY29uZmlndXJlZCBmb3IgZWFjaCB1c2VyIGFuZCBhIHNldCBvZiBjb25maWd1cmFibGUgbWF0Y2hpbmcKK3J1bGVzIGFsbG93IGZvciBjdXN0b21pemluZyB0aGUgc2VsZWN0aW9uIG9mIGZvbnRzIGFuZCBjb25maWd1cmluZyB2YXJpb3VzCitwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gcmFzdGVyaXppbmcgb2YgdGhvc2UgZm9udHMgZm9yIGRpc3BsYXkgaW4gYSB2YXJpZXR5IG9mCittZWRpYS4gIFRoZSBGb250Y29uZmlnIGxpYnJhcnkgaXMgZGVzaWduZWQgdG8gY28tZXhpc3QgcGVhY2VmdWxseSB3aXRoCitleGlzdGluZyBmb250IGNvbmZpZ3VyYXRpb24gYW5kIHJhc3Rlcml6YXRpb24gbWVjaGFuaXNtczsgd2hpbGUgaXQgdXNlcyB0aGUKK0ZyZWVUeXBlIGxpYnJhcnkgdG8gZGlzY292ZXIgY2hhcmFjdGVyaXN0aWNzIG9mIGF2YWlsYWJsZSBmb250cywgdGhlcmUKK2lzIG5vIHJlcXVpcmVtZW50IHRvIHVzZSBGcmVlVHlwZSBmb3IgcmFzdGVyaXphdGlvbi4KKworXHNlY3Rpb24JCQkJe0ludHJvZHVjdGlvbn0KKworXHNlY3Rpb24JCQkJe0NvbmZpZ3VyYXRpb24gRmlsZXN9CisKK1xzZWN0aW9uCQkJCXtBcHBsaWNhdGlvbiBJbnRlcmZhY2V9CisKK1xzdWJzZWN0aW9uCQkJCXtEYXRhdHlwZXN9CisKK1xzdWJzZWN0aW9uCQkJCXtGb250IFNldCBJbnRlcmZhY2V9CisKK1xzdWJzZWN0aW9uCQkJCXtGb250IFBhdHRlcm5zfQorCitcc3Vic2VjdGlvbgkJCQl7TGlzdGluZyBBdmFpbGFibGUgRm9udHN9CisKK1xzdWJzZWN0aW9uCQkJCXtVc2luZyBGb250IE5hbWVzfQorCitcc3Vic2VjdGlvbgkJCQl7TWFuaXB1bGF0aW5nIE1hdHJpY2VzfQorCitcc3Vic2VjdGlvbgkJCQl7VVRGLTggSGVscGVyIEZ1bmN0aW9uc30KKworXHNlY3Rpb24JCQkJe0ZvbnQgU3ViLVN5c3RlbSBJbnRlcmZhY2V9CisKK1xzdWJzZWN0aW9uCQkJCXtFeHRlbmRpbmcgRm9udCBOYW1lc30KKworXHN1YnNlY3Rpb24JCQkJe0V4ZWN1dGluZyBDb25maWd1cmF0aW9uIFJ1bGVzfQorCitcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvZmMtY2FjaGUvSW1ha2VmaWxlIGIvZmMtY2FjaGUvSW1ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMjE2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mYy1jYWNoZS9JbWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgIi4uLy4uL2xpYnhtbDIvY29uZmlnLmgiCisjaWYgSEFWRV9aTElCX0gKK1pMSUI9LWx6CisjZW5kaWYKKworSU5DTFVERVM9LUkuLi8uLi9mcmVldHlwZTIgLUkvdXNyL2luY2x1ZGUvbGlieG1sMiAtSS4uCitGUkVFVFlQRTJSRVFMSUIgPSAuLi8uLi9mcmVldHlwZTIvbGliZnJlZXR5cGUuYQorWE1MMlJFUUxJQj0uLi8uLi9saWJ4bWwyLy5saWJzL2xpYnhtbDIuYSAkKFpMSUIpIC1sbQorCitMT0NBTF9MSUJSQVJJRVM9LUwuLi9zcmMgLWxmb250Y29uZmlnICQoRlJFRVRZUEUyUkVRTElCKSAkKFhNTDJSRVFMSUIpCisKK1NSQ1M9ZmMtY2FjaGUuYworT0JKUz1mYy1jYWNoZS5vCisKK0NvbXBsZXhQcm9ncmFtVGFyZ2V0KGZjLWNhY2hlKQorTGlua0J1aWxkQmluYXJ5KFByb2dyYW1UYXJnZXROYW1lKGZjLWNhY2hlKSkKKworaW5zdGFsbDo6CisJRkNfREVCVUc9MTI4IEZPTlRDT05GSUdfUEFUSD0uLiAuL2ZjLWNhY2hlIC12CmRpZmYgLS1naXQgYS9mYy1jYWNoZS9mYy1jYWNoZS5jIGIvZmMtY2FjaGUvZmMtY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg0Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvZmMtY2FjaGUvZmMtY2FjaGUuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2Vsc2UKKyNkZWZpbmUgSEFWRV9HRVRPUFQgMQorI2VuZGlmCisKKyNpZiBIQVZFX0dFVE9QVF9MT05HCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+Citjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisgICAgeyJ2ZXJzaW9uIiwgMCwgMCwgJ1YnfSwKKyAgICB7InZlcmJvc2UiLCAwLCAwLCAndid9LAorICAgIHsiaGVscCIsIDAsIDAsICc/J30sCisgICAge05VTEwsMCwwLDB9LAorfTsKKyNlbHNlCisjaWYgSEFWRV9HRVRPUFQKK2V4dGVybiBjaGFyICpvcHRhcmc7CitleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIHVzYWdlIChjaGFyICpwcm9ncmFtKQoreworICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBbLXZWP10gWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2RpcnNdXG4iLAorCSAgICAgcHJvZ3JhbSk7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQnVpbGQgZm9udCBpbmZvcm1hdGlvbiBjYWNoZXMgaW4gW2RpcnNdXG4iCisJICAgICAiKGFsbCBkaXJlY3RvcmllcyBpbiBmb250IGNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdCkuXG4iKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLXYsIC0tdmVyYm9zZSAgICAgICAgZGlzcGxheSBzdGF0dXMgaW5mb3JtYXRpb24gd2hpbGUgYnVzeVxuIik7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiICAtViwgLS12ZXJzaW9uICAgICAgICBkaXNwbGF5IGZvbnQgY29uZmlnIHZlcnNpb24gYW5kIGV4aXRcbiIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLT8sIC0taGVscCAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIpOworICAgIGV4aXQgKDEpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQJCXJldCA9IDA7CisgICAgRmNGb250U2V0CSpzZXQ7CisgICAgY2hhcgkqKmRpcnM7CisgICAgaW50CQl2ZXJib3NlID0gMDsKKyAgICBpbnQJCWk7CisjaWYgSEFWRV9HRVRPUFRfTE9ORyB8fCBIQVZFX0dFVE9QVAorICAgIGludAkJYzsKKworI2lmIEhBVkVfR0VUT1BUX0xPTkcKKyAgICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIlZ2PyIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gLTEpCisjZWxzZQorICAgIHdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgIlZ2PyIpKSAhPSAtMSkKKyNlbmRpZgorICAgIHsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICdWJzoKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9udGNvbmZpZyB2ZXJzaW9uICVkLiVkLiVkXG4iLCAKKwkJICAgICBGQ19NQUpPUiwgRkNfTUlOT1IsIEZDX1JFVklTSU9OKTsKKwkgICAgZXhpdCAoMCk7CisJY2FzZSAndic6CisJICAgIHZlcmJvc2UgPSAxOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB1c2FnZSAoYXJndlswXSk7CisJfQorICAgIH0KKyAgICBpID0gb3B0aW5kOworI2Vsc2UKKyAgICBpID0gMTsKKyNlbmRpZgorCisgICAgaWYgKCFGY0luaXRDb25maWcgKCkpCisgICAgeworCWZwcmludGYgKHN0ZGVyciwgIkNhbid0IGluaXQgZm9udCBjb25maWcgbGlicmFyeVxuIik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChhcmd2W2ldKQorCWRpcnMgPSBhcmd2K2k7CisgICAgZWxzZQorCWRpcnMgPSBGY0NvbmZpZ0dldERpcnMgKDApOworICAgIC8qCisgICAgICogTm93IHNjYW4gYWxsIG9mIHRoZSBkaXJlY3RvcmllcyBpbnRvIHNlcGFyYXRlIGRhdGFiYXNlcworICAgICAqIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdHMKKyAgICAgKi8KKyAgICB3aGlsZSAoZGlycyAmJiAqZGlycykKKyAgICB7CisJaWYgKHZlcmJvc2UpCisJICAgIHByaW50ZiAoIiVzOiBTY2FubmluZyBkaXJlY3RvcnkgXCIlc1wiXG4iLCBhcmd2WzBdLCAqZGlycyk7CisJc2V0ID0gRmNGb250U2V0Q3JlYXRlICgpOworCWlmICghc2V0KQorCXsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeSBpbiBcIiVzXCJcbiIsICpkaXJzKTsKKwkgICAgcmV0Kys7CisJfQorCWVsc2UKKwl7CisJICAgIGlmICghRmNEaXJTY2FuIChzZXQsIDAsIEZjQ29uZmlnR2V0QmxhbmtzICgwKSwgKmRpcnMsIEZjVHJ1ZSkpCisJICAgIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3Qgc2NhbiBkaXJlY3RvcnkgXCIlc1wiXG4iLCAqZGlycyk7CisJCXJldCsrOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAodmVyYm9zZSkKKwkJICAgIHByaW50ZiAoIiVzOiBTYXZpbmcgJWQgZm9udCBuYW1lcyBmb3IgXCIlc1wiXG4iLCAKKwkJCSAgICBhcmd2WzBdLCBzZXQtPm5mb250LCAqZGlycyk7CisJCWlmICghRmNEaXJTYXZlIChzZXQsICpkaXJzKSkKKwkJeworCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3Qgc2F2ZSBjYWNoZSBpbiBcIiVzXCJcbiIsICpkaXJzKTsKKwkJICAgIHJldCsrOworCQl9CisJICAgIH0KKwkgICAgRmNGb250U2V0RGVzdHJveSAoc2V0KTsKKwl9CisJKytkaXJzOworICAgIH0KKyAgICBpZiAodmVyYm9zZSkKKwlwcmludGYgKCIlczogJXNcbiIsIGFyZ3ZbMF0sIHJldCA/ICJmYWlsZWQiIDogInN1Y2NlZWRlZCIpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mYy1jYWNoZS9mYy1jYWNoZS5tYW4gYi9mYy1jYWNoZS9mYy1jYWNoZS5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjNGVkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZjLWNhY2hlL2ZjLWNhY2hlLm1hbgpAQCAtMCwwICsxLDQ1IEBACisuXCIKKy5cIiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisuXCIKKy5cIiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKy5cIiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorLlwiIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorLlwiIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKy5cIiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisuXCIgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisuXCIgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKy5cIiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKy5cIiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorLlwiCisuXCIgS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKy5cIiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisuXCIgRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorLlwiIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorLlwiIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKy5cIiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisuXCIgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKy5cIgorLlwiCisuXCIgJFhGcmVlODY6IHhjL3Byb2dyYW1zL2ZjLWNhY2hlL2ZjLWNhY2hlLm1hbix2IDEuMyAyMDAxLzAyLzA5IDAzOjQ3OjU2IHRzaSBFeHAgJAorLlwiCisuVEggRkMtQ0FDSEUgMSBfX3ZlbmRvcnZlcnNpb25fXworLlNIIE5BTUUKK2ZjLWNhY2hlLCBmb250cy5jYWNoZSBcLSBjcmVhdGUgYW4gaW5kZXggb2YgRnJlZVR5cGUgZm9udCBmaWxlcyBpbiBhIGRpcmVjdG9yeQorLlNIIFNZTk9QU0lTCisuQiAiZmMtY2FjaGUiCisuUkkgWyBkaXJlY3RvcnktbmFtZQorXHwuXHwuXHwuIF0KKy5TSCBERVNDUklQVElPTgorSWYgZGlyZWN0b3J5IGFyZ3VtZW50cyBhcmUgbm90IGdpdmVuLAorLkkgZmMtY2FjaGUKK3VzZXMgZWFjaCBkaXJlY3RvcnkgaW4gdGhlIGN1cnJlbnQgZm9udCBjb25maWd1cmF0aW9uLiAgRWFjaCBkaXJlY3RvcnkgaXMKK3NjYW5uZWQgZm9yIGZvbnQgZmlsZXMgcmVhZGFibGUgYnkgRnJlZVR5cGUuICBBIGNhY2hlIGlzIGNyZWF0ZWQgd2hpY2gKK2NvbnRhaW5zIHByb3BlcnRpZXMgb2YgZWFjaCBmb250IGFuZCB0aGUgYXNzb2NpYXRlZCBmaWxlbmFtZS4gIFRoaXMgY2FjaGUgaXMKK3VzZWQgdG8gc3BlZWQgYXBwbGljYXRpb24gc3RhcnR1cCB3aGVuIHVzaW5nIHRoZSBmb250Y29uZmlnIGxpYnJhcnkuCisuU0ggRklMRVMKKy5UUCAxNQorLkIgZm9udHMuY2FjaGUKK01hcHMgZmlsZSBuYW1lcyB0byBmb250IHByb3BlcnRpZXMuICBSZWFkIGJ5IHRoZSBmb250Y29uZmlnIGxpYnJhcnkgYXQKK2FwcGxpY2F0aW9uIHN0YXJ0dXAgdG8gbG9jYXRlIGFwcHJvcHJpYXRlIGZvbnRzLgorLlNIICJTRUUgQUxTTyIKK2ZvbnRjb25maWcoMykKZGlmZiAtLWdpdCBhL2ZjLWxpc3QvSW1ha2VmaWxlIGIvZmMtbGlzdC9JbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3M2I0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZjLWxpc3QvSW1ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIuLi8uLi9saWJ4bWwyL2NvbmZpZy5oIgorI2lmIEhBVkVfWkxJQl9ICitaTElCPS1segorI2VuZGlmCisKK0lOQ0xVREVTPS1JLi4vLi4vZnJlZXR5cGUyIC1JL3Vzci9pbmNsdWRlL2xpYnhtbDIgLUkuLgorRlJFRVRZUEUyUkVRTElCID0gLi4vLi4vZnJlZXR5cGUyL2xpYmZyZWV0eXBlLmEKK1hNTDJSRVFMSUI9Li4vLi4vbGlieG1sMi8ubGlicy9saWJ4bWwyLmEgJChaTElCKSAtbG0KKworTE9DQUxfTElCUkFSSUVTPS1MLi4vc3JjIC1sZm9udGNvbmZpZyAkKEZSRUVUWVBFMlJFUUxJQikgJChYTUwyUkVRTElCKQorREVQTElCUz0uLi9zcmMvbGliZm9udGNvbmZpZy5hCisKK1NSQ1M9ZmMtbGlzdC5jCitPQkpTPWZjLWxpc3QubworCitDb21wbGV4UHJvZ3JhbVRhcmdldChmYy1saXN0KQorTGlua0J1aWxkQmluYXJ5KFByb2dyYW1UYXJnZXROYW1lKGZjLWxpc3QpKQpkaWZmIC0tZ2l0IGEvZmMtbGlzdC9mYy1saXN0LmMgYi9mYy1saXN0L2ZjLWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q3MTIwCi0tLSAvZGV2L251bGwKKysrIGIvZmMtbGlzdC9mYy1saXN0LmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbHNlCisjZGVmaW5lIEhBVkVfR0VUT1BUIDEKKyNlbmRpZgorCisjaWYgSEFWRV9HRVRPUFRfTE9ORworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworICAgIHsidmVyc2lvbiIsIDAsIDAsICdWJ30sCisgICAgeyJ2ZXJib3NlIiwgMCwgMCwgJ3YnfSwKKyAgICB7ImhlbHAiLCAwLCAwLCAnPyd9LAorICAgIHtOVUxMLDAsMCwwfSwKK307CisjZWxzZQorI2lmIEhBVkVfR0VUT1BUCitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworI2VuZGlmCisjZW5kaWYKKwordm9pZCB1c2FnZSAoY2hhciAqcHJvZ3JhbSkKK3sKKyAgICBmcHJpbnRmIChzdGRlcnIsICJ1c2FnZTogJXMgWy12Vj9dIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIFtkaXJzXVxuIiwKKwkgICAgIHByb2dyYW0pOworICAgIGZwcmludGYgKHN0ZGVyciwgIkJ1aWxkIGZvbnQgaW5mb3JtYXRpb24gY2FjaGVzIGluIFtkaXJzXVxuIgorCSAgICAgIihhbGwgZGlyZWN0b3JpZXMgaW4gZm9udCBjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQpLlxuIik7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIC12LCAtLXZlcmJvc2UgICAgICAgIGRpc3BsYXkgc3RhdHVzIGluZm9ybWF0aW9uIHdoaWxlIGJ1c3lcbiIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLVYsIC0tdmVyc2lvbiAgICAgICAgZGlzcGxheSBmb250IGNvbmZpZyB2ZXJzaW9uIGFuZCBleGl0XG4iKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIC0/LCAtLWhlbHAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0XG4iKTsKKyAgICBleGl0ICgxKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50CQlyZXQgPSAwOworICAgIEZjRm9udFNldAkqc2V0OworICAgIGludAkJdmVyYm9zZSA9IDA7CisgICAgaW50CQlpOworICAgIEZjT2JqZWN0U2V0ICpvcyA9IEZjT2JqZWN0U2V0QnVpbGQgKEZDX0ZBTUlMWSwgRkNfTEFORywgMCk7CisgICAgRmNGb250U2V0CSpmczsKKyAgICBGY1BhdHRlcm4gICAqcGF0OworI2lmIEhBVkVfR0VUT1BUX0xPTkcgfHwgSEFWRV9HRVRPUFQKKyAgICBpbnQJCWM7CisKKyNpZiBIQVZFX0dFVE9QVF9MT05HCisgICAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJWdj8iLCBsb25nb3B0cywgTlVMTCkpICE9IC0xKQorI2Vsc2UKKyAgICB3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJWdj8iKSkgIT0gLTEpCisjZW5kaWYKKyAgICB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnVic6CisJICAgIGZwcmludGYgKHN0ZGVyciwgImZvbnRjb25maWcgdmVyc2lvbiAlZC4lZC4lZFxuIiwgCisJCSAgICAgRkNfTUFKT1IsIEZDX01JTk9SLCBGQ19SRVZJU0lPTik7CisJICAgIGV4aXQgKDApOworCWNhc2UgJ3YnOgorCSAgICB2ZXJib3NlID0gMTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgdXNhZ2UgKGFyZ3ZbMF0pOworCX0KKyAgICB9CisgICAgaSA9IG9wdGluZDsKKyNlbHNlCisgICAgaSA9IDE7CisjZW5kaWYKKworICAgIGlmICghRmNJbml0ICgpKQorICAgIHsKKwlmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBpbml0IGZvbnQgY29uZmlnIGxpYnJhcnlcbiIpOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAoYXJndltpXSkKKwlwYXQgPSBGY05hbWVQYXJzZSAoYXJndltpXSk7CisgICAgZWxzZQorCXBhdCA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKKyAgICAKKyAgICBmcyA9IEZjRm9udExpc3QgKDAsIHBhdCwgb3MpOworICAgIGlmIChwYXQpCisJRmNQYXR0ZXJuRGVzdHJveSAocGF0KTsKKworICAgIGlmIChmcykKKyAgICB7CisJaW50CWo7CisKKwlmb3IgKGogPSAwOyBqIDwgZnMtPm5mb250OyBqKyspCisJeworCSAgICBGY0NoYXI4ICpmb250OworCisJICAgIGZvbnQgPSBGY05hbWVVbnBhcnNlIChmcy0+Zm9udHNbal0pOworCSAgICBwcmludGYgKCIlc1xuIiwgZm9udCk7CisJICAgIGZyZWUgKGZvbnQpOworCX0KKwlGY0ZvbnRTZXREZXN0cm95IChmcyk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmMtbGlzdC9mYy1saXN0Lm1hbiBiL2ZjLWxpc3QvZmMtbGlzdC5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYjc5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZjLWxpc3QvZmMtbGlzdC5tYW4KQEAgLTAsMCArMSwzNiBAQAorLlwiCisuXCIgQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorLlwiCisuXCIgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisuXCIgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKy5cIiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKy5cIiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisuXCIgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorLlwiIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorLlwiIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisuXCIgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisuXCIgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKy5cIgorLlwiIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisuXCIgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworLlwiIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKy5cIiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKy5cIiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisuXCIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorLlwiIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisuXCIKKy5cIgorLlwiICRYRnJlZTg2OiB4Yy9wcm9ncmFtcy9mYy1saXN0L2ZjLWxpc3QubWFuLHYgMS4zIDIwMDEvMDIvMDkgMDM6NDc6NTYgdHNpIEV4cCAkCisuXCIKKy5USCBGQy1MSVNUIDEgX192ZW5kb3J2ZXJzaW9uX18KKy5TSCBOQU1FCitmYy1saXN0IFwtIGxpc3QgYXZhaWxhYmxlIGZvbnRzCisuU0ggU1lOT1BTSVMKKy5CICJmYy1saXN0IgorLlJJIFsgZm9udC1wYXR0ZXJuIF0KKy5TSCBERVNDUklQVElPTgorSWYgZm9udCBwYXR0ZXJuIGlzIG5vdCBnaXZlbiwKKy5JIGZjLWxpc3QKK2xpc3RzIGFsbCBhdmFpbGFibGUgZmFjZXMgYW5kIHN0eWxlcyBpbiB0aGUgY3VycmVudCBmb250IGNvbmZpZ3VyYXRpb24uCisuU0ggIlNFRSBBTFNPIgorZm9udGNvbmZpZygzKQpkaWZmIC0tZ2l0IGEvZmluZGZvbnRzIGIvZmluZGZvbnRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2NjZmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5kZm9udHMKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vc2gKK2RpcnM9Ii91c3Ivc2hhcmUvZm9udHMgL3Vzci9YMTFSNi9saWIvWDExL2ZvbnRzIgorZm9yIGQgaW4gJGRpcnM7IGRvCisgICAgZmluZCAkZCBcKCAtbmFtZSAnKi5bVHRdW1R0XVtGZl0nIC1vIC1uYW1lICcqLltQcF1bRmZdW0JiQWFdJyBcKSAtcHJpbnQKK2RvbmUgfCB3aGlsZSByZWFkIGY7IGRvCisJZGlyPWBkaXJuYW1lICRmYAorCWVjaG8gJGRpcgorZG9uZSB8IHNvcnQgLXUgfCBzZWQgJ3MvXi8JPGRpcj4vJyB8IHNlZCAnczskOzwvZGlyPjsnCmRpZmYgLS1naXQgYS9mb250Y29uZmlnL0ltYWtlZmlsZSBiL2ZvbnRjb25maWcvSW1ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWY2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9mb250Y29uZmlnL0ltYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyNkZWZpbmUgSW5jU3ViZGlyIGZvbnRjb25maWcKKworSEVBREVSUz1mY2ZyZWV0eXBlLmggZmNwcml2YXRlLmggZmN4bWwuaCBmb250Y29uZmlnLmgKKworQnVpbGRJbmNsdWRlcygkKEhFQURFUlMpLEluY1N1YmRpciwuLikKKyNpZiBCdWlsZExpYnJhcmllcworSW5zdGFsbE11bHRpcGxlRmxhZ3MoJChIRUFERVJTKSwkKElOQ0RJUikvSW5jU3ViZGlyLCQoSU5TVElOQ0ZMQUdTKSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZm9udGNvbmZpZy9mY2ZyZWV0eXBlLmggYi9mb250Y29uZmlnL2ZjZnJlZXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGYzNDJiCi0tLSAvZGV2L251bGwKKysrIGIvZm9udGNvbmZpZy9mY2ZyZWV0eXBlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRkNGUkVFVFlQRV9IXworI2RlZmluZSBfRkNGUkVFVFlQRV9IXworCitGVF9VSW50CitGY0ZyZWVUeXBlQ2hhckluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQpOworCitGY0NoYXJTZXQgKgorRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZm9udGNvbmZpZy9mY3ByaXZhdGUuaCBiL2ZvbnRjb25maWcvZmNwcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwY2EzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZvbnRjb25maWcvZmNwcml2YXRlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDEgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0ZDUFJJVkFURV9IXworI2RlZmluZSBfRkNQUklWQVRFX0hfCisKKy8qCisgKiBJIHRyaWVkIHRoaXMgd2l0aCBmdW5jdGlvbnMgdGhhdCB0b29rIHZhX2xpc3QqIGFyZ3VtZW50cworICogYnV0IHBvcnRhYmlsaXR5IGNvbmNlcm5zIG1hZGUgbWUgY2hhbmdlIHRoZXNlIGZ1bmN0aW9ucworICogaW50byBtYWNyb3MgKHNpZ2gpLgorICovCisKKyNkZWZpbmUgRmNQYXR0ZXJuVmFwQnVpbGQocmVzdWx0LCBvcmlnLCB2YSkJCQkgICAgXAorewkJCQkJCQkJICAgIFwKKyAgICBGY1BhdHRlcm4JKl9fcF9fID0gKG9yaWcpOwkJCQkgICAgXAorICAgIGNvbnN0IGNoYXIJKl9fb19fOwkJCQkJCSAgICBcCisgICAgRmNWYWx1ZQlfX3ZfXzsJCQkJCQkgICAgXAorCQkJCQkJCQkgICAgXAorICAgIGlmICghX19wX18pCQkJCQkJCSAgICBcCisgICAgewkJCQkJCQkJICAgIFwKKwlfX3BfXyA9IEZjUGF0dGVybkNyZWF0ZSAoKTsJCQkJICAgIFwKKwlpZiAoIV9fcF9fKQkJICAgIAkJCQkgICAgXAorCSAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9iYWlsMDsJCQkgICAgXAorICAgIH0JCQkJICAgIAkJCQkgICAgXAorICAgIGZvciAoOzspCQkJICAgIAkJCQkgICAgXAorICAgIHsJCQkJICAgIAkJCQkgICAgXAorCV9fb19fID0gdmFfYXJnICh2YSwgY29uc3QgY2hhciAqKTsJCQkgICAgXAorCWlmICghX19vX18pCQkgICAgCQkJCSAgICBcCisJICAgIGJyZWFrOwkJICAgIAkJCQkgICAgXAorCV9fdl9fLnR5cGUgPSB2YV9hcmcgKHZhLCBGY1R5cGUpOwkJCSAgICBcCisJc3dpdGNoIChfX3ZfXy50eXBlKSB7CSAgICAJCQkJICAgIFwKKwljYXNlIEZjVHlwZVZvaWQ6CQkJCQkgICAgXAorCSAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9iYWlsMTsgICAgICAgCQkgICAgXAorCWNhc2UgRmNUeXBlSW50ZWdlcjoJICAgIAkJCQkgICAgXAorCSAgICBfX3ZfXy51LmkgPSB2YV9hcmcgKHZhLCBpbnQpOwkJCSAgICBcCisJICAgIGJyZWFrOwkJCQkJCSAgICBcCisJY2FzZSBGY1R5cGVEb3VibGU6CQkJCQkgICAgXAorCSAgICBfX3ZfXy51LmQgPSB2YV9hcmcgKHZhLCBkb3VibGUpOwkJCSAgICBcCisJICAgIGJyZWFrOwkJCQkJCSAgICBcCisJY2FzZSBGY1R5cGVTdHJpbmc6CQkJCQkgICAgXAorCSAgICBfX3ZfXy51LnMgPSB2YV9hcmcgKHZhLCBjaGFyICopOwkJCSAgICBcCisJICAgIGJyZWFrOwkJCQkJCSAgICBcCisJY2FzZSBGY1R5cGVCb29sOgkJCQkJICAgIFwKKwkgICAgX192X18udS5iID0gdmFfYXJnICh2YSwgRmNCb29sKTsJCQkgICAgXAorCSAgICBicmVhazsJCQkJCQkgICAgXAorCWNhc2UgRmNUeXBlTWF0cml4OgkJCQkJICAgIFwKKwkgICAgX192X18udS5tID0gdmFfYXJnICh2YSwgRmNNYXRyaXggKik7CQkgICAgXAorCSAgICBicmVhazsJCQkJCQkgICAgXAorCWNhc2UgRmNUeXBlQ2hhclNldDoJCQkJCSAgICBcCisJICAgIF9fdl9fLnUuYyA9IHZhX2FyZyAodmEsIEZjQ2hhclNldCAqKTsJCSAgICBcCisJICAgIGJyZWFrOwkJCQkJCSAgICBcCisJfQkJCQkJCQkgICAgXAorCWlmICghRmNQYXR0ZXJuQWRkIChfX3BfXywgX19vX18sIF9fdl9fLCBGY1RydWUpKQkgICAgXAorCSAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9iYWlsMTsJCQkgICAgXAorICAgIH0JCQkJCQkJCSAgICBcCisgICAgcmVzdWx0ID0gX19wX187CQkJCQkJICAgIFwKKyAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9yZXR1cm47CQkJCSAgICBcCisJCQkJCQkJCSAgICBcCitfRmNQYXR0ZXJuVmFwQnVpbGRfYmFpbDE6CQkJCQkgICAgXAorICAgIGlmICghb3JpZykJCQkJCQkJICAgIFwKKwlGY1BhdHRlcm5EZXN0cm95IChfX3BfXyk7CQkJCSAgICBcCitfRmNQYXR0ZXJuVmFwQnVpbGRfYmFpbDA6CQkJCQkgICAgXAorICAgIHJlc3VsdCA9IDA7CQkJCQkJCSAgICBcCisJCQkJCQkJCSAgICBcCitfRmNQYXR0ZXJuVmFwQnVpbGRfcmV0dXJuOgkJCQkJICAgIFwKKyAgICA7CQkJCQkJCQkgICAgXAorfQorCisKKyNkZWZpbmUgRmNPYmplY3RTZXRWYXBCdWlsZChfX3JldF9fLCBfX2ZpcnN0X18sIF9fdmFfXykgCQlcCit7CQkJCQkJCQkJXAorICAgIEZjT2JqZWN0U2V0ICAgICpfX29zX187CQkJCQkJXAorICAgIGNvbnN0IGNoYXIJICAgICpfX29iX187CQkJCQkJXAorCQkJCQkJCQkJXAorICAgIF9fcmV0X18gPSAwOwkJCQkJCSAgICAJXAorICAgIF9fb3NfXyA9IEZjT2JqZWN0U2V0Q3JlYXRlICgpOwkJCQkJXAorICAgIGlmICghX19vc19fKQkJCQkJCQlcCisJZ290byBfRmNPYmplY3RTZXRWYXBCdWlsZF9iYWlsMDsJCQkJXAorICAgIF9fb2JfXyA9IF9fZmlyc3RfXzsJCQkJCQkJXAorICAgIHdoaWxlIChfX29iX18pCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorCWlmICghRmNPYmplY3RTZXRBZGQgKF9fb3NfXywgX19vYl9fKSkJCQkJXAorCSAgICBnb3RvIF9GY09iamVjdFNldFZhcEJ1aWxkX2JhaWwxOwkJCQlcCisJX19vYl9fID0gdmFfYXJnIChfX3ZhX18sIGNvbnN0IGNoYXIgKik7CQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIF9fcmV0X18gPSBfX29zX187CQkJCQkJCVwKKwkJCQkJCQkJCVwKK19GY09iamVjdFNldFZhcEJ1aWxkX2JhaWwxOgkJCQkJCVwKKyAgICBpZiAoIV9fcmV0X18gJiYgX19vc19fKQkJCQkJICAgIAlcCisJRmNPYmplY3RTZXREZXN0cm95IChfX29zX18pOwkJCQkJXAorX0ZjT2JqZWN0U2V0VmFwQnVpbGRfYmFpbDA6CQkJCQkJXAorICAgIDsJCQkJCQkJCQlcCit9CisKKyNlbmRpZiAvKiBfRkNQUklWQVRFX0hfICovCisKZGlmZiAtLWdpdCBhL2ZvbnRjb25maWcvZmN4bWwuaCBiL2ZvbnRjb25maWcvZmN4bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQxYjdkCi0tLSAvZGV2L251bGwKKysrIGIvZm9udGNvbmZpZy9mY3htbC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0ZDWE1MX0hfCisjZGVmaW5lIF9GQ1hNTF9IXworCisjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgorCit4bWxEb2NQdHIKK0ZjQ29uZmlnTG9hZCAoY29uc3QgY2hhciAqZmlsZSk7CisKK0ZjQm9vbAorRmNDb25maWdQYXJzZSAoRmNDb25maWcJICAgICpjb25maWcsCisJICAgICAgIHhtbERvY1B0ciAgICBkb2MpOworCisjZW5kaWYgLyogX0ZDWE1MX0hfICovCmRpZmYgLS1naXQgYS9mb250Y29uZmlnL2ZvbnRjb25maWcuaCBiL2ZvbnRjb25maWcvZm9udGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTA1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mb250Y29uZmlnL2ZvbnRjb25maWcuaApAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRk9OVENPTkZJR19IXworI2RlZmluZSBfRk9OVENPTkZJR19IXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcglGY0NoYXI4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlGY0NoYXIxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CUZjQ2hhcjMyOwordHlwZWRlZiBpbnQJCUZjQm9vbDsKKworLyoKKyAqIEN1cnJlbnQgRm9udGNvbmZpZyB2ZXJzaW9uIG51bWJlcgorICovCisjZGVmaW5lIEZDX01BSk9SCTEKKyNkZWZpbmUgRkNfTUlOT1IJMAorI2RlZmluZSBGQ19SRVZJU0lPTgkwCisKKyNkZWZpbmUgRkNfVkVSU0lPTgkoKEZDX01BSk9SICogMTAwMDApICsgKEZDX01JTk9SICogMTAwKSArIChGQ19SRVZJU0lPTikpCisKKyNkZWZpbmUgRmNUcnVlCQkxCisjZGVmaW5lIEZjRmFsc2UJCTAKKworI2RlZmluZSBGQ19GQU1JTFkJICAgICJmYW1pbHkiCQkvKiBTdHJpbmcgKi8KKyNkZWZpbmUgRkNfU1RZTEUJICAgICJzdHlsZSIJCS8qIFN0cmluZyAqLworI2RlZmluZSBGQ19TTEFOVAkgICAgInNsYW50IgkJLyogSW50ICovCisjZGVmaW5lIEZDX1dFSUdIVAkgICAgIndlaWdodCIJCS8qIEludCAqLworI2RlZmluZSBGQ19TSVpFCQkgICAgInNpemUiCQkvKiBEb3VibGUgKi8KKyNkZWZpbmUgRkNfUElYRUxfU0laRQkgICAgInBpeGVsc2l6ZSIJCS8qIERvdWJsZSAqLworI2RlZmluZSBGQ19TUEFDSU5HCSAgICAic3BhY2luZyIJCS8qIEludCAqLworI2RlZmluZSBGQ19GT1VORFJZCSAgICAiZm91bmRyeSIJCS8qIFN0cmluZyAqLworI2RlZmluZSBGQ19BTlRJQUxJQVMJICAgICJhbnRpYWxpYXMiCQkvKiBCb29sIChkZXBlbmRzKSAqLworI2RlZmluZSBGQ19ISU5USU5HCSAgICAiaGludGluZyIJCS8qIEJvb2wgKHRydWUpICovCisjZGVmaW5lIEZDX1ZFUlRJQ0FMX0xBWU9VVCAgInZlcnRpY2FsbGF5b3V0IgkvKiBCb29sIChmYWxzZSkgKi8KKyNkZWZpbmUgRkNfQVVUT0hJTlQJICAgICJhdXRvaGludCIJCS8qIEJvb2wgKGZhbHNlKSAqLworI2RlZmluZSBGQ19HTE9CQUxfQURWQU5DRSAgICJnbG9iYWxhZHZhbmNlIgkvKiBCb29sICh0cnVlKSAqLworI2RlZmluZSBGQ19GSUxFCQkgICAgImZpbGUiCQkvKiBTdHJpbmcgKi8KKyNkZWZpbmUgRkNfSU5ERVgJICAgICJpbmRleCIJCS8qIEludCAqLworI2RlZmluZSBGQ19SQVNURVJJWkVSCSAgICAicmFzdGVyaXplciIJLyogU3RyaW5nICovCisjZGVmaW5lIEZDX09VVExJTkUJICAgICJvdXRsaW5lIgkJLyogQm9vbCAqLworI2RlZmluZSBGQ19TQ0FMQUJMRQkgICAgInNjYWxhYmxlIgkJLyogQm9vbCAqLworI2RlZmluZSBGQ19TQ0FMRQkgICAgInNjYWxlIgkJLyogZG91YmxlICovCisjZGVmaW5lIEZDX0RQSQkJICAgICJkcGkiCQkvKiBkb3VibGUgKi8KKyNkZWZpbmUgRkNfUkdCQQkJICAgICJyZ2JhIgkJLyogSW50ICovCisjZGVmaW5lIEZDX01JTlNQQUNFCSAgICAibWluc3BhY2UiCQkvKiBCb29sIHVzZSBtaW5pbXVtIGxpbmUgc3BhY2luZyAqLworI2RlZmluZSBGQ19TT1VSQ0UJICAgICJzb3VyY2UiCQkvKiBTdHJpbmcgKFgxMSwgZnJlZXR5cGUpICovCisjZGVmaW5lIEZDX0NIQVJTRVQJICAgICJjaGFyc2V0IgkJLyogQ2hhclNldCAqLworI2RlZmluZSBGQ19MQU5HCQkgICAgImxhbmciCQkvKiBTdHJpbmcgT1MvMiBDb2RlUGFnZVJhbmdlICovCisKKyNkZWZpbmUgRkNfRElSX0NBQ0hFX0ZJTEUJICAgICJmb250cy5jYWNoZSIKKyNkZWZpbmUgRkNfVVNFUl9DQUNIRV9GSUxFCSAgICAiLmZvbnRzLmNhY2hlIgorCisvKiBBZGp1c3Qgb3V0bGluZSByYXN0ZXJpemVyICovCisjZGVmaW5lIEZDX0NIQVJfV0lEVEgJICAgICJjaGFyd2lkdGgiCS8qIEludCAqLworI2RlZmluZSBGQ19DSEFSX0hFSUdIVAkgICAgImNoYXJoZWlnaHQiLyogSW50ICovCisjZGVmaW5lIEZDX01BVFJJWAkgICAgIm1hdHJpeCIgICAgLyogRmNNYXRyaXggKi8KKworI2RlZmluZSBGQ19XRUlHSFRfTElHSFQJICAgIDAKKyNkZWZpbmUgRkNfV0VJR0hUX01FRElVTSAgICAxMDAKKyNkZWZpbmUgRkNfV0VJR0hUX0RFTUlCT0xEICAxODAKKyNkZWZpbmUgRkNfV0VJR0hUX0JPTEQJICAgIDIwMAorI2RlZmluZSBGQ19XRUlHSFRfQkxBQ0sJICAgIDIxMAorCisjZGVmaW5lIEZDX1NMQU5UX1JPTUFOCSAgICAwCisjZGVmaW5lIEZDX1NMQU5UX0lUQUxJQwkgICAgMTAwCisjZGVmaW5lIEZDX1NMQU5UX09CTElRVUUgICAgMTEwCisKKyNkZWZpbmUgRkNfUFJPUE9SVElPTkFMCSAgICAwCisjZGVmaW5lIEZDX01PTk8JCSAgICAxMDAKKyNkZWZpbmUgRkNfQ0hBUkNFTEwJICAgIDExMAorCisvKiBzdWItcGl4ZWwgb3JkZXIgKi8KKyNkZWZpbmUgRkNfUkdCQV9OT05FCSAgICAwCisjZGVmaW5lIEZDX1JHQkFfUkdCCSAgICAxCisjZGVmaW5lIEZDX1JHQkFfQkdSCSAgICAyCisjZGVmaW5lIEZDX1JHQkFfVlJHQgkgICAgMworI2RlZmluZSBGQ19SR0JBX1ZCR1IJICAgIDQKKworLyogbGFuZ3VhZ2UgZ3JvdXBzIGZyb20gdGhlIE9TLzIgQ29kZVBhZ2VSYW5nZSBiaXRzICovCisjZGVmaW5lIEZDX0xBTkdfTEFUSU5fMQkJCSJsYXRpbjEiCQkvKiAwICovCisjZGVmaW5lIEZDX0xBTkdfTEFUSU5fMl9FQVNURVJOX0VVUk9QRQkibGF0aW4yZWFzdGVybmV1cm9wZSIJLyogMSAqLworI2RlZmluZSBGQ19MQU5HX0NZUklMTElDCQkiY3lyaWxsaWMiCQkvKiAyICovCisjZGVmaW5lIEZDX0xBTkdfR1JFRUsJCQkiZ3JlZWsiCQkJLyogMyAqLworI2RlZmluZSBGQ19MQU5HX1RVUktJU0gJCQkidHVya2lzaCIJCS8qIDQgKi8KKyNkZWZpbmUgRkNfTEFOR19IRUJSRVcJCQkiaGVicmV3IgkJLyogNSAqLworI2RlZmluZSBGQ19MQU5HX0FSQUJJQwkJCSJhcmFiaWMiCQkvKiA2ICovCisjZGVmaW5lIEZDX0xBTkdfV0lORE9XU19CQUxUSUMJCSJ3aW5kb3dzYmFsdGljIgkJLyogNyAqLworI2RlZmluZSBGQ19MQU5HX1ZJRVROQU1FU0UJCSJ2aWV0bmFtZXNlIgkJLyogOCAqLworLyogOS0xNSByZXNlcnZlZCBmb3IgQWx0ZXJuYXRlIEFOU0kgKi8KKyNkZWZpbmUgRkNfTEFOR19USEFJCQkJInRoYWkiCQkJLyogMTYgKi8KKyNkZWZpbmUgRkNfTEFOR19KQVBBTkVTRQkJImphcGFuZXNlIgkJLyogMTcgKi8KKyNkZWZpbmUgRkNfTEFOR19TSU1QTElGSUVEX0NISU5FU0UJInNpbXBsaWZpZWRjaGluZXNlIgkvKiAxOCAqLworI2RlZmluZSBGQ19MQU5HX0tPUkVBTl9XQU5TVU5HCQkia29yZWFud2Fuc3VuZyIJCS8qIDE5ICovCisjZGVmaW5lIEZDX0xBTkdfVFJBRElUSU9OQUxfQ0hJTkVTRQkidHJhZGl0aW9uYWxjaGluZXNlIgkvKiAyMCAqLworI2RlZmluZSBGQ19MQU5HX0tPUkVBTl9KT0hBQgkJImtvcmVhbmpvaGFiIgkJLyogMjEgKi8KKy8qIDIyLTI4IHJlc2VydmVkIGZvciBBbHRlcm5hdGUgQU5TSSAmIE9FTSAqLworI2RlZmluZSBGQ19MQU5HX01BQ0lOVE9TSAkJIm1hY2ludG9zaCIJCS8qIDI5ICovCisjZGVmaW5lIEZDX0xBTkdfT0VNCQkJIm9lbSIJCQkvKiAzMCAqLworI2RlZmluZSBGQ19MQU5HX1NZTUJPTAkJCSJzeW1ib2wiCQkvKiAzMSAqLworLyogMzItNDcgcmVzZXJ2ZWQgZm9yIE9FTSAqLworI2RlZmluZSBGQ19MQU5HX0lCTV9HUkVFSwkJImlibWdyZWVrIgkJLyogNDggKi8KKyNkZWZpbmUgRkNfTEFOR19NU0RPU19SVVNTSUFOCQkibXNkb3NydXNzaWFuIgkJLyogNDkgKi8KKyNkZWZpbmUgRkNfTEFOR19NU0RPU19OT1JESUMJCSJtc2Rvc25vcmRpYyIJCS8qIDUwICovCisjZGVmaW5lIEZDX0xBTkdfQVJBQklDXzg2NCAgICAJCSJhcmFiaWM4NjQiCQkvKiA1MSAqLworI2RlZmluZSBGQ19MQU5HX01TRE9TX0NBTkFESUFOX0ZSRU5DSAkibXNkb3NjYW5hZGlhbmZyZW5jaCIJLyogNTIgKi8KKyNkZWZpbmUgRkNfTEFOR19IRUJSRVdfODYyCQkiaGVicmV3ODYyIgkJLyogNTMgKi8KKyNkZWZpbmUgRkNfTEFOR19NU0RPU19JQ0VMQU5ESUMJCSJtc2Rvc2ljZWxhbmRpYyIJLyogNTQgKi8KKyNkZWZpbmUgRkNfTEFOR19NU0RPU19QT1JUVUdVRVNFCSJtc2Rvc3BvcnR1Z3Vlc2UiCS8qIDU1ICovCisjZGVmaW5lIEZDX0xBTkdfSUJNX1RVUktJU0gJCSJpYm10dXJraXNoIgkJLyogNTYgKi8KKyNkZWZpbmUgRkNfTEFOR19JQk1fQ1lSSUxMSUMJCSJpYm1jeXJpbGxpYyIJCS8qIDU3ICovCisjZGVmaW5lIEZDX0xBTkdfTEFUSU5fMgkJCSJsYXRpbjIiCQkvKiA1OCAqLworI2RlZmluZSBGQ19MQU5HX01TRE9TX0JBTFRJQwkJIm1zZG9zYmFsdGljIgkJLyogNTkgKi8KKyNkZWZpbmUgRkNfTEFOR19HUkVFS180MzdfRwkJImdyZWVrNDM3ZyIJCS8qIDYwICovCisjZGVmaW5lIEZDX0xBTkdfQVJBQklDX0FTTU9fNzA4CQkiYXJhYmljYXNtbzcwOCIJCS8qIDYxICovCisjZGVmaW5lIEZDX0xBTkdfV0VfTEFUSU5fMQkJIndlbGF0aW4xIgkJLyogNjIgKi8KKyNkZWZpbmUgRkNfTEFOR19VUwkJCSJ1cyIJCQkvKiA2MyAqLworCit0eXBlZGVmIGVudW0gX0ZjVHlwZSB7CisgICAgRmNUeXBlVm9pZCwgCisgICAgRmNUeXBlSW50ZWdlciwgCisgICAgRmNUeXBlRG91YmxlLCAKKyAgICBGY1R5cGVTdHJpbmcsIAorICAgIEZjVHlwZUJvb2wsCisgICAgRmNUeXBlTWF0cml4LAorICAgIEZjVHlwZUNoYXJTZXQKK30gRmNUeXBlOworCit0eXBlZGVmIHN0cnVjdCBfRmNNYXRyaXggeworICAgIGRvdWJsZSB4eCwgeHksIHl4LCB5eTsKK30gRmNNYXRyaXg7CisKKyNkZWZpbmUgRmNNYXRyaXhJbml0KG0pCSgobSktPnh4ID0gKG0pLT55eSA9IDEsIFwKKwkJCSAobSktPnh5ID0gKG0pLT55eCA9IDApCisKKy8qCisgKiBBIGRhdGEgc3RydWN0dXJlIHRvIHJlcHJlc2VudCB0aGUgYXZhaWxhYmxlIGdseXBocyBpbiBhIGZvbnQuCisgKiBUaGlzIGlzIHJlcHJlc2VudGVkIGFzIGEgc3BhcnNlIGJvb2xlYW4gYnRyZWUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhclNldCBGY0NoYXJTZXQ7CisKK3R5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgeworICAgIGNvbnN0IGNoYXIJKm9iamVjdDsKKyAgICBGY1R5cGUJdHlwZTsKK30gRmNPYmplY3RUeXBlOworCit0eXBlZGVmIHN0cnVjdCBfRmNDb25zdGFudCB7CisgICAgY29uc3QgY2hhciAgKm5hbWU7CisgICAgY29uc3QgY2hhcgkqb2JqZWN0OworICAgIGludAkJdmFsdWU7Cit9IEZjQ29uc3RhbnQ7CisKK3R5cGVkZWYgZW51bSBfRmNSZXN1bHQgeworICAgIEZjUmVzdWx0TWF0Y2gsIEZjUmVzdWx0Tm9NYXRjaCwgRmNSZXN1bHRUeXBlTWlzbWF0Y2gsIEZjUmVzdWx0Tm9JZAorfSBGY1Jlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWUgeworICAgIEZjVHlwZQl0eXBlOworICAgIHVuaW9uIHsKKwljb25zdCBGY0NoYXI4CSpzOworCWludAkJaTsKKwlGY0Jvb2wJCWI7CisJZG91YmxlCQlkOworCWNvbnN0IEZjTWF0cml4CSptOworCWNvbnN0IEZjQ2hhclNldAkqYzsKKyAgICB9IHU7Cit9IEZjVmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IF9GY1BhdHRlcm4gICBGY1BhdHRlcm47CisKK3R5cGVkZWYgc3RydWN0IF9GY0ZvbnRTZXQgeworICAgIGludAkJbmZvbnQ7CisgICAgaW50CQlzZm9udDsKKyAgICBGY1BhdHRlcm4JKipmb250czsKK30gRmNGb250U2V0OworCit0eXBlZGVmIHN0cnVjdCBfRmNPYmplY3RTZXQgeworICAgIGludAkJbm9iamVjdDsKKyAgICBpbnQJCXNvYmplY3Q7CisgICAgY29uc3QgY2hhcgkqKm9iamVjdHM7Cit9IEZjT2JqZWN0U2V0OworICAgIAordHlwZWRlZiBlbnVtIF9GY01hdGNoS2luZCB7CisgICAgRmNNYXRjaFBhdHRlcm4sIEZjTWF0Y2hGb250IAorfSBGY01hdGNoS2luZDsKKwordHlwZWRlZiBlbnVtIF9GY1NldE5hbWUgeworICAgIEZjU2V0U3lzdGVtID0gMCwKKyAgICBGY1NldEFwcGxpY2F0aW9uID0gMQorfSBGY1NldE5hbWU7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpIC8qIGZvciBDKysgVjIuMCAqLworI2RlZmluZSBfRkNGVU5DUFJPVE9CRUdJTiBleHRlcm4gIkMiIHsJLyogZG8gbm90IGxlYXZlIG9wZW4gYWNyb3NzIGluY2x1ZGVzICovCisjZGVmaW5lIF9GQ0ZVTkNQUk9UT0VORCB9CisjZWxzZQorI2RlZmluZSBfRkNGVU5DUFJPVE9CRUdJTgorI2RlZmluZSBfRkNGVU5DUFJPVE9FTkQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfRmNDb25maWcgICAgRmNDb25maWc7CisKK3R5cGVkZWYgc3RydWN0IF9GY0ZpbGVDYWNoZSBGY0ZpbGVDYWNoZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjQmxhbmtzICAgIEZjQmxhbmtzOworCitfRkNGVU5DUFJPVE9CRUdJTgorCisvKiBmY2JsYW5rcy5jICovCitGY0JsYW5rcyAqCitGY0JsYW5rc0NyZWF0ZSAodm9pZCk7CisKK3ZvaWQKK0ZjQmxhbmtzRGVzdHJveSAoRmNCbGFua3MgKmIpOworCitGY0Jvb2wKK0ZjQmxhbmtzQWRkIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCk7CisKK0ZjQm9vbAorRmNCbGFua3NJc01lbWJlciAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpOworCisvKiBmY2NmZy5jICovCitjaGFyICoKK0ZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IGNoYXIgKnVybCk7CisgICAgCitGY0NvbmZpZyAqCitGY0NvbmZpZ0NyZWF0ZSAodm9pZCk7CisKK3ZvaWQKK0ZjQ29uZmlnRGVzdHJveSAoRmNDb25maWcgKmNvbmZpZyk7CisKK0ZjQm9vbAorRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKTsKKworRmNDb25maWcgKgorRmNDb25maWdHZXRDdXJyZW50ICh2b2lkKTsKKworRmNCb29sCitGY0NvbmZpZ0J1aWxkRm9udHMgKEZjQ29uZmlnICpjb25maWcpOworCitjaGFyICoqCitGY0NvbmZpZ0dldERpcnMgKEZjQ29uZmlnICAgKmNvbmZpZyk7CisKK2NoYXIgKioKK0ZjQ29uZmlnR2V0Q29uZmlnRmlsZXMgKEZjQ29uZmlnICAgICpjb25maWcpOworCitjaGFyICoKK0ZjQ29uZmlnR2V0Q2FjaGUgKEZjQ29uZmlnICAqY29uZmlnKTsKKworRmNCbGFua3MgKgorRmNDb25maWdHZXRCbGFua3MgKEZjQ29uZmlnICpjb25maWcpOworCitGY0ZvbnRTZXQgKgorRmNDb25maWdHZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKKwkJICBGY1NldE5hbWUJc2V0KTsKKworRmNCb29sCitGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlIChGY0NvbmZpZyAgICAqY29uZmlnLAorCQkJY29uc3QgY2hhciAgKmZpbGUpOworCitGY0Jvb2wKK0ZjQ29uZmlnQXBwRm9udEFkZERpciAoRmNDb25maWcJICAgICpjb25maWcsCisJCSAgICAgICBjb25zdCBjaGFyICAgKmRpcik7CisKK3ZvaWQKK0ZjQ29uZmlnQXBwRm9udENsZWFyIChGY0NvbmZpZwkgICAgKmNvbmZpZyk7CisKK0ZjQm9vbAorRmNDb25maWdTdWJzdGl0dXRlIChGY0NvbmZpZwkqY29uZmlnLAorCQkgICAgRmNQYXR0ZXJuCSpwLAorCQkgICAgRmNNYXRjaEtpbmQJa2luZCk7CisKKy8qIGZjY2hhcnNldC5jICovCitGY0NoYXJTZXQgKgorRmNDaGFyU2V0Q3JlYXRlICh2b2lkKTsKKwordm9pZAorRmNDaGFyU2V0RGVzdHJveSAoRmNDaGFyU2V0ICpmY3MpOworCitGY0Jvb2wKK0ZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KTsKKworRmNDaGFyU2V0ICoKK0ZjQ2hhclNldENvcHkgKEZjQ2hhclNldCAqc3JjKTsKKworRmNCb29sCitGY0NoYXJTZXRFcXVhbCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOworCitGY0NoYXJTZXQgKgorRmNDaGFyU2V0SW50ZXJzZWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CisKK0ZjQ2hhclNldCAqCitGY0NoYXJTZXRVbmlvbiAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOworCitGY0NoYXJTZXQgKgorRmNDaGFyU2V0U3VidHJhY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKKworRmNCb29sCitGY0NoYXJTZXRIYXNDaGFyIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCk7CisKK0ZjQ2hhcjMyCitGY0NoYXJTZXRDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphKTsKKworRmNDaGFyMzIKK0ZjQ2hhclNldEludGVyc2VjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CisKK0ZjQ2hhcjMyCitGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CisKKyNpZm5kZWYgRk9OVENPTkZJR19OT19GUkVFVFlQRQorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CitGVF9VSW50CitGY0ZyZWVUeXBlQ2hhckluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQpOworI2VuZGlmCisKKy8qIGZjZGJnLmMgKi8KK3ZvaWQKK0ZjUGF0dGVyblByaW50IChGY1BhdHRlcm4gKnApOworCisvKiBmY2RlZmF1bHQuYyAqLwordm9pZAorRmNEZWZhdWx0U3Vic3RpdHV0ZSAoRmNQYXR0ZXJuICpwYXR0ZXJuKTsKKworLyogZmNkaXIuYyAqLworRmNCb29sCitGY0RpclNjYW4gKEZjRm9udFNldAkqc2V0LAorCSAgIEZjRmlsZUNhY2hlCSpjYWNoZSwKKwkgICBGY0JsYW5rcwkqYmxhbmtzLAorCSAgIGNvbnN0IGNoYXIJKmRpciwKKwkgICBGY0Jvb2wJZm9yY2UpOworCitGY0Jvb2wKK0ZjRGlyU2F2ZSAoRmNGb250U2V0ICpzZXQsIGNvbnN0IGNoYXIgKmRpcik7CisKKy8qIGZjZnJlZXR5cGUuYyAqLworRmNQYXR0ZXJuICoKK0ZjRnJlZVR5cGVRdWVyeSAoY29uc3QgY2hhciAqZmlsZSwgaW50IGlkLCBGY0JsYW5rcyAqYmxhbmtzLCBpbnQgKmNvdW50KTsKKworLyogZmNmcy5jICovCisKK0ZjRm9udFNldCAqCitGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpOworCit2b2lkCitGY0ZvbnRTZXREZXN0cm95IChGY0ZvbnRTZXQgKnMpOworCitGY0Jvb2wKK0ZjRm9udFNldEFkZCAoRmNGb250U2V0ICpzLCBGY1BhdHRlcm4gKmZvbnQpOworCisvKiBmY2luaXQuYyAqLworRmNCb29sCitGY0luaXRGb250cyAodm9pZCk7CisKK0ZjQm9vbAorRmNJbml0Q29uZmlnICh2b2lkKTsKKworRmNCb29sCitGY0luaXQgKHZvaWQpOworCisvKiBmY2xpc3QuYyAqLworRmNPYmplY3RTZXQgKgorRmNPYmplY3RTZXRDcmVhdGUgKHZvaWQpOworCitGY0Jvb2wKK0ZjT2JqZWN0U2V0QWRkIChGY09iamVjdFNldCAqb3MsIGNvbnN0IGNoYXIgKm9iamVjdCk7CisKK3ZvaWQKK0ZjT2JqZWN0U2V0RGVzdHJveSAoRmNPYmplY3RTZXQgKm9zKTsKKworRmNPYmplY3RTZXQgKgorRmNPYmplY3RTZXRWYUJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgdmFfbGlzdCB2YSk7CisKK0ZjT2JqZWN0U2V0ICoKK0ZjT2JqZWN0U2V0QnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCAuLi4pOworCitGY0ZvbnRTZXQgKgorRmNGb250TGlzdCAoRmNDb25maWcJKmNvbmZpZywKKwkgICAgRmNQYXR0ZXJuCSpwLAorCSAgICBGY09iamVjdFNldCAqb3MpOworCisvKiBmY21hdGNoLmMgKi8KK0ZjUGF0dGVybiAqCitGY0ZvbnRNYXRjaCAoRmNDb25maWcJKmNvbmZpZywKKwkgICAgIEZjUGF0dGVybgkqcCwgCisJICAgICBGY1Jlc3VsdAkqcmVzdWx0KTsKKworLyogZmNtYXRyaXguYyAqLworRmNNYXRyaXggKgorRmNNYXRyaXhDb3B5IChjb25zdCBGY01hdHJpeCAqbWF0KTsKKworRmNCb29sCitGY01hdHJpeEVxdWFsIChjb25zdCBGY01hdHJpeCAqbWF0MSwgY29uc3QgRmNNYXRyaXggKm1hdDIpOworCit2b2lkCitGY01hdHJpeE11bHRpcGx5IChGY01hdHJpeCAqcmVzdWx0LCBjb25zdCBGY01hdHJpeCAqYSwgY29uc3QgRmNNYXRyaXggKmIpOworCit2b2lkCitGY01hdHJpeFJvdGF0ZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBjLCBkb3VibGUgcyk7CisKK3ZvaWQKK0ZjTWF0cml4U2NhbGUgKEZjTWF0cml4ICptLCBkb3VibGUgc3gsIGRvdWJsZSBzeSk7CisKK3ZvaWQKK0ZjTWF0cml4U2hlYXIgKEZjTWF0cml4ICptLCBkb3VibGUgc2gsIGRvdWJsZSBzdik7CisKKy8qIGZjbmFtZS5jICovCisKK0ZjQm9vbAorRmNOYW1lUmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKTsKKworRmNCb29sCitGY05hbWVVbnJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZSk7CisgICAgCitjb25zdCBGY09iamVjdFR5cGUgKgorRmNOYW1lR2V0T2JqZWN0VHlwZSAoY29uc3QgY2hhciAqb2JqZWN0KTsKKworRmNCb29sCitGY05hbWVSZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cyk7CisKK0ZjQm9vbAorRmNOYW1lVW5yZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cyk7CisgICAgCitjb25zdCBGY0NvbnN0YW50ICoKK0ZjTmFtZUdldENvbnN0YW50IChjaGFyICpzdHJpbmcpOworCitGY0Jvb2wKK0ZjTmFtZUNvbnN0YW50IChjaGFyICpzdHJpbmcsIGludCAqcmVzdWx0KTsKKworRmNQYXR0ZXJuICoKK0ZjTmFtZVBhcnNlIChjb25zdCBjaGFyICpuYW1lKTsKKworRmNDaGFyOCAqCitGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCk7CisKKy8qIGZjcGF0LmMgKi8KK0ZjUGF0dGVybiAqCitGY1BhdHRlcm5DcmVhdGUgKHZvaWQpOworCitGY1BhdHRlcm4gKgorRmNQYXR0ZXJuRHVwbGljYXRlIChGY1BhdHRlcm4gKnApOworCit2b2lkCitGY1ZhbHVlRGVzdHJveSAoRmNWYWx1ZSB2KTsKKworRmNWYWx1ZQorRmNWYWx1ZVNhdmUgKEZjVmFsdWUgdik7CisKK3ZvaWQKK0ZjUGF0dGVybkRlc3Ryb3kgKEZjUGF0dGVybiAqcCk7CisKK0ZjQm9vbAorRmNQYXR0ZXJuQWRkIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZSwgRmNCb29sIGFwcGVuZCk7CisgICAgCitGY1Jlc3VsdAorRmNQYXR0ZXJuR2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBGY1ZhbHVlICp2KTsKKyAgICAKK0ZjQm9vbAorRmNQYXR0ZXJuRGVsIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCk7CisKK0ZjQm9vbAorRmNQYXR0ZXJuQWRkSW50ZWdlciAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpKTsKKworRmNCb29sCitGY1BhdHRlcm5BZGREb3VibGUgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBkb3VibGUgZCk7CisKK0ZjQm9vbAorRmNQYXR0ZXJuQWRkU3RyaW5nIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgY2hhciAqcyk7CisKK0ZjQm9vbAorRmNQYXR0ZXJuQWRkTWF0cml4IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgRmNNYXRyaXggKnMpOworCitGY0Jvb2wKK0ZjUGF0dGVybkFkZENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY0NoYXJTZXQgKmMpOworCitGY0Jvb2wKK0ZjUGF0dGVybkFkZEJvb2wgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY0Jvb2wgYik7CisKK0ZjUmVzdWx0CitGY1BhdHRlcm5HZXRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGludCAqaSk7CisKK0ZjUmVzdWx0CitGY1BhdHRlcm5HZXREb3VibGUgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgZG91YmxlICpkKTsKKworRmNSZXN1bHQKK0ZjUGF0dGVybkdldFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBjaGFyICoqY29uc3Qgcyk7CisKK0ZjUmVzdWx0CitGY1BhdHRlcm5HZXRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNNYXRyaXggKipzKTsKKworRmNSZXN1bHQKK0ZjUGF0dGVybkdldENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNDaGFyU2V0ICoqYyk7CisKK0ZjUmVzdWx0CitGY1BhdHRlcm5HZXRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQm9vbCAqYik7CisKK0ZjUGF0dGVybiAqCitGY1BhdHRlcm5WYUJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIHZhX2xpc3QgdmEpOworICAgIAorRmNQYXR0ZXJuICoKK0ZjUGF0dGVybkJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIC4uLik7CisKKy8qIGZjc3RyLmMgKi8KKworY2hhciAqCitGY1N0ckNvcHkgKGNvbnN0IGNoYXIgKnMpOworCisjZGVmaW5lIEZjVG9Mb3dlcihjKQkoKCdBJyA8PSAoYykgJiYgKGMpIDw9ICdaJykgPyAoYykgLSAnQScgKyAnYScgOiAoYykpCisKK2ludAorRmNTdHJDbXBJZ25vcmVDYXNlIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworCitpbnQKK0ZjVXRmOFRvVWNzNCAoRmNDaGFyOCAgICpzcmNfb3JpZywKKwkgICAgICBGY0NoYXIzMiAgKmRzdCwKKwkgICAgICBpbnQJbGVuKTsKKworRmNCb29sCitGY1V0ZjhMZW4gKEZjQ2hhcjgJKnN0cmluZywKKwkgICBpbnQJCWxlbiwKKwkgICBpbnQJCSpuY2hhciwKKwkgICBpbnQJCSp3Y2hhcik7CisKKy8qIGZjeG1sLmMgKi8KK0ZjQm9vbAorRmNDb25maWdQYXJzZUFuZExvYWQgKEZjQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmZpbGUsIEZjQm9vbCBjb21wbGFpbik7CisKK19GQ0ZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX0ZPTlRDT05GSUdfSF8gKi8KZGlmZiAtLWdpdCBhL2ZvbnRzLmNvbmYuaW4gYi9mb250cy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWMwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9mb250cy5jb25mLmluCkBAIC0wLDAgKzEsMTkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBmb250Y29uZmlnIFNZU1RFTSAiZm9udHMuZHRkIj4KKzwhLS0gL2V0Yy9mb250cy5jb25mIGZpbGUgdG8gY29uZmlndXJlIHN5c3RlbSBmb250IGFjY2VzcyAtLT4KKzxmb250Y29uZmlnPgorCis8IS0tIEZPTlRQQVRIX1NUQVJUIC0tPgorCis8IS0tIAorICBDb21tb24gWDExUjYgZm9udCBkaXJlY3RvcmllcworLS0+CisKKwk8ZGlyPi91c3IvWDExUjYvbGliL1gxMS9mb250cy90cnVldHlwZTwvZGlyPgorIAk8ZGlyPi91c3IvWDExUjYvbGliL1gxMS9mb250cy9UeXBlMTwvZGlyPgorICAJPGRpcj4vdXNyL1gxMVI2L2xpYi9YMTEvZm9udHMvVHJ1ZVR5cGU8L2Rpcj4KKworPCEtLSBGT05UUEFUSF9FTkQgLS0+CisKKzwhLS0KKyAgQWNjZXB0IGRlcHJlY2F0ZWQgJ21vbm8nIGFsaWFzLCByZXBsYWNpbmcgaXQgd2l0aCAnbW9ub3NwYWNlJworLS0+CisJPG1hdGNoIHRhcmdldD0icGF0dGVybiI+CisJCTx0ZXN0IHF1YWw9ImFueSIgbmFtZT0iZmFtaWx5Ij4KKwkJCTxzdHJpbmc+bW9ubzwvc3RyaW5nPgorCQk8L3Rlc3Q+CisJCTxlZGl0IG5hbWU9ImZhbWlseSIgbW9kZT0iYXNzaWduIj4KKwkJCTxzdHJpbmc+bW9ub3NwYWNlPC9zdHJpbmc+CisJCTwvZWRpdD4KKwk8L21hdGNoPgorCis8IS0tCisgIEFjY2VwdCBkZXByZWNhdGVkICdzYW5zJyBhbGlhcywgcmVwbGFjaW5nIGl0IHdpdGggJ3NhbnMtc2VyaWYnCistLT4KKwk8bWF0Y2ggdGFyZ2V0PSJwYXR0ZXJuIj4KKwkJPHRlc3QgcXVhbD0iYW55IiBuYW1lPSJmYW1pbHkiPgorCQkJPHN0cmluZz5zYW5zPC9zdHJpbmc+CisJCTwvdGVzdD4KKwkJPGVkaXQgbmFtZT0iZmFtaWx5IiBtb2RlPSJhc3NpZ24iPgorCQkJPHN0cmluZz5zYW5zLXNlcmlmPC9zdHJpbmc+CisJCTwvZWRpdD4KKwk8L21hdGNoPgorCis8IS0tCisgIE1hcmsgY29tbW9uIGZhbWlsaWVzIHdpdGggdGhlaXIgZ2VuZXJpY3Mgc28gd2UnbGwgZ2V0CisgIHNvbWV0aGluZyByZWFzb25hYmxlCistLT4KKworPCEtLQorICBTZXJpZiBmYWNlcworIC0tPgorCTxhbGlhcz4KKwkJPGZhbWlseT5UaW1lczwvZmFtaWx5PgorCQk8ZGVmYXVsdD48ZmFtaWx5PnNlcmlmPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+CisJPGFsaWFzPgorCQk8ZmFtaWx5PlRpbWVzIE5ldyBSb21hbjwvZmFtaWx5PgorCQk8ZGVmYXVsdD48ZmFtaWx5PnNlcmlmPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+Cis8IS0tCisgIFNhbnMtc2VyaWYgZmFjZXMKKyAtLT4KKwk8YWxpYXM+CisJCTxmYW1pbHk+SGVsdmV0aWNhPC9mYW1pbHk+CisJCTxkZWZhdWx0PjxmYW1pbHk+c2Fucy1zZXJpZjwvZmFtaWx5PjwvZGVmYXVsdD4KKwk8L2FsaWFzPgorCTxhbGlhcz4KKwkJPGZhbWlseT5BcmlhbDwvZmFtaWx5PgorCQk8ZGVmYXVsdD48ZmFtaWx5PnNhbnMtc2VyaWY8L2ZhbWlseT48L2RlZmF1bHQ+CisJPC9hbGlhcz4KKwk8YWxpYXM+CisJCTxmYW1pbHk+VmVyZGFuYTwvZmFtaWx5PgorCQk8ZGVmYXVsdD48ZmFtaWx5PnNhbnMtc2VyaWY8L2ZhbWlseT48L2RlZmF1bHQ+CisJPC9hbGlhcz4KKzwhLS0KKyAgTW9ub3NwYWNlIGZhY2VzCisgLS0+CisgCTxhbGlhcz4KKwkJPGZhbWlseT5Db3VyaWVyPC9mYW1pbHk+CisJCTxkZWZhdWx0PjxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+CisJPGFsaWFzPgorCQk8ZmFtaWx5PkNvdXJpZXIgTmV3PC9mYW1pbHk+CisJCTxkZWZhdWx0PjxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+CisJPGFsaWFzPgorCQk8ZmFtaWx5PkFuZGFsZSBNb25vPC9mYW1pbHk+CisJCTxkZWZhdWx0PjxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+Cis8IS0tCisgIElmIHRoZSBmb250IHN0aWxsIGhhcyBubyBnZW5lcmljIG5hbWUsIGFkZCBzYW5zLXNlcmlmCisgLS0+CisJPG1hdGNoIHRhcmdldD0icGF0dGVybiI+CisJCTx0ZXN0IHF1YWw9ImFsbCIgbmFtZT0iZmFtaWx5IiBjb21wYXJlPSJub3RfZXEiPgorCQkJPHN0cmluZz5zYW5zLXNlcmlmPC9zdHJpbmc+CisJCTwvdGVzdD4KKwkJPHRlc3QgcXVhbD0iYWxsIiBuYW1lPSJmYW1pbHkiIGNvbXBhcmU9Im5vdF9lcSI+CisJCQk8c3RyaW5nPnNlcmlmPC9zdHJpbmc+CisJCTwvdGVzdD4KKwkJPHRlc3QgcXVhbD0iYWxsIiBuYW1lPSJmYW1pbHkiIGNvbXBhcmU9Im5vdF9lcSI+CisJCQk8c3RyaW5nPm1vbm9zcGFjZTwvc3RyaW5nPgorCQk8L3Rlc3Q+CisJCTxlZGl0IG5hbWU9ImZhbWlseSIgbW9kZT0iYXBwZW5kX2xhc3QiPgorCQkJPHN0cmluZz5zYW5zLXNlcmlmPC9zdHJpbmc+CisJCTwvZWRpdD4KKwk8L21hdGNoPgorCQorPCEtLQorICBMb2FkIHBlci11c2VyIGN1c3RvbWl6YXRpb24gZmlsZQorLS0+CisJPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+fi8uZm9udHMuY29uZjwvaW5jbHVkZT4KKworPCEtLQorICBBbGlhcyB3ZWxsIGtub3duIGZvbnQgbmFtZXMgdG8gYXZhaWxhYmxlIFRydWVUeXBlIGZvbnRzCistLT4KKwk8YWxpYXM+CisJCTxmYW1pbHk+VGltZXM8L2ZhbWlseT4KKwkJPHByZWZlcj48ZmFtaWx5PlRpbWVzIE5ldyBSb21hbjwvZmFtaWx5PjwvcHJlZmVyPgorCQk8ZGVmYXVsdD48ZmFtaWx5PnNlcmlmPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+CisJPGFsaWFzPgorCQk8ZmFtaWx5PkhlbHZldGljYTwvZmFtaWx5PgorCQk8cHJlZmVyPjxmYW1pbHk+VmVyZGFuYTwvZmFtaWx5PjwvcHJlZmVyPgorCQk8ZGVmYXVsdD48ZmFtaWx5PnNhbnMtc2VyaWY8L2ZhbWlseT48L2RlZmF1bHQ+CisJPC9hbGlhcz4KKwk8YWxpYXM+CisJCTxmYW1pbHk+QXJpYWw8L2ZhbWlseT4KKwkJPHByZWZlcj48ZmFtaWx5PlZlcmRhbmE8L2ZhbWlseT48L3ByZWZlcj4KKwkJPGRlZmF1bHQ+PGZhbWlseT5zYW5zLXNlcmlmPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+CisJPGFsaWFzPgorCQk8ZmFtaWx5PkNvdXJpZXI8L2ZhbWlseT4KKwkJPHByZWZlcj48ZmFtaWx5PkNvdXJpZXIgTmV3PC9mYW1pbHk+PC9wcmVmZXI+CisJCTxkZWZhdWx0PjxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+PC9kZWZhdWx0PgorCTwvYWxpYXM+CisKKzwhLS0KKyAgUHJvdmlkZSByZXF1aXJlZCBhbGlhc2VzIGZvciBzdGFuZGFyZCBuYW1lcworLS0+CisJPGFsaWFzPgorCQk8ZmFtaWx5PnNlcmlmPC9mYW1pbHk+CisJCTxwcmVmZXI+CisJCQk8ZmFtaWx5PlRpbWVzIE5ldyBSb21hbjwvZmFtaWx5PgorCQkJPGZhbWlseT5OaW1idXMgUm9tYW4gTm85IEw8L2ZhbWlseT4KKwkJCTxmYW1pbHk+THV4aSBTZXJpZjwvZmFtaWx5PgorCQkJPGZhbWlseT5UaW1lczwvZmFtaWx5PgorCQk8L3ByZWZlcj4KKwk8L2FsaWFzPgorCTxhbGlhcz4KKwkJPGZhbWlseT5zYW5zLXNlcmlmPC9mYW1pbHk+CisJCTxwcmVmZXI+CisJCQk8ZmFtaWx5PlZlcmRhbmE8L2ZhbWlseT4KKwkJCTxmYW1pbHk+TmltYnVzIFNhbnMgTDwvZmFtaWx5PgorCQkJPGZhbWlseT5MdXhpIFNhbnM8L2ZhbWlseT4KKwkJCTxmYW1pbHk+QXJpYWw8L2ZhbWlseT4KKwkJCTxmYW1pbHk+SGVsdmV0aWNhPC9mYW1pbHk+CisJCTwvcHJlZmVyPgorCTwvYWxpYXM+CisJPGFsaWFzPgorCQk8ZmFtaWx5Pm1vbm9zcGFjZTwvZmFtaWx5PgorCQk8cHJlZmVyPgorCQkJPGZhbWlseT5BbmRhbGUgTW9ubzwvZmFtaWx5PgorCQkJPGZhbWlseT5Db3VyaWVyIE5ldzwvZmFtaWx5PgorCQkJPGZhbWlseT5OaW1idXMgTW9ubyBMPC9mYW1pbHk+CisJCQk8ZmFtaWx5Pkx1eGkgTW9ubzwvZmFtaWx5PgorCQk8L3ByZWZlcj4KKwk8L2FsaWFzPgorCis8IS0tCisgIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBVbmljb2RlIGNoYXJzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGJsYW5rCisgIGluIGZvbnRzLiAgQWxsIG90aGVyIGJsYW5rIGNoYXJzIGFyZSBhc3N1bWVkIHRvIGJlIGJyb2tlbiBhbmQKKyAgd29uJ3QgYXBwZWFyIGluIHRoZSByZXN1bHRpbmcgY2hhcnNldHMKKyAtLT4KKwk8Y29uZmlnPjxibGFuaz4KKwkJPGludD4weDIwPC9pbnQ+CQk8IS0tIHNwYWNlIC0tPgorCQk8aW50PjB4YTA8L2ludD4JCTwhLS0gbnNicCAgLS0+CisJCTxpbnQ+MHgyMDAwPC9pbnQ+CTwhLS0gZ2VuZXJhbCBwdW5jdHVhdGlvbiBzcGFjZXMgLS0+CisJCTxpbnQ+MHgyMDAxPC9pbnQ+CisJCTxpbnQ+MHgyMDAyPC9pbnQ+CisJCTxpbnQ+MHgyMDAzPC9pbnQ+CisJCTxpbnQ+MHgyMDA0PC9pbnQ+CisJCTxpbnQ+MHgyMDA1PC9pbnQ+CisJCTxpbnQ+MHgyMDA1PC9pbnQ+CisJCTxpbnQ+MHgyMDA2PC9pbnQ+CisJCTxpbnQ+MHgyMDA3PC9pbnQ+CisJCTxpbnQ+MHgyMDA4PC9pbnQ+CisJCTxpbnQ+MHgyMDA5PC9pbnQ+CisJCTxpbnQ+MHgyMDBhPC9pbnQ+CisJCTxpbnQ+MHgyMDBiPC9pbnQ+CisJCTxpbnQ+MHgzMDAwPC9pbnQ+CTwhLS0gQ0pLIHNwYWNlIC0tPgorCTwvYmxhbms+PC9jb25maWc+CisKKzwvZm9udGNvbmZpZz4KZGlmZiAtLWdpdCBhL2ZvbnRzLmR0ZCBiL2ZvbnRzLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M5ODdiCi0tLSAvZGV2L251bGwKKysrIGIvZm9udHMuZHRkCkBAIC0wLDAgKzEsMTY1IEBACis8IS0tIFRoaXMgaXMgdGhlIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbiBmb3IgZm9udCBjb25maWd1cmF0aW9uIGZpbGVzIC0tPgorPCFFTEVNRU5UIGZvbnRjb25maWcgKGRpciB8IAorCQkgICAgICBjYWNoZSB8IAorCQkgICAgICBpbmNsdWRlIHwgCisJCSAgICAgIGNvbmZpZyB8CisJCSAgICAgIG1hdGNoIHwgCisJCSAgICAgIGFsaWFzKSogPgorCis8IS0tIAorICAgIEFkZCBhIGRpcmVjdG9yeSB0aGF0IHByb3ZpZGVzIGZvbnRzCistLT4KKzwhRUxFTUVOVCBkaXIgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGRpciB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICdwcmVzZXJ2ZSc+CisKKzwhLS0KKyAgICBEZWZpbmUgdGhlIHBlci11c2VyIGZpbGUgdGhhdCBob2xkcyBjYWNoZSBmb250IGluZm9ybWF0aW9uLgorCisgICAgSWYgdGhlIGZpbGVuYW1lIGJlZ2lucyB3aXRoICd+JywgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgdXNlcnMKKyAgICBob21lIGRpcmVjdG9yeSBwYXRoLgorLS0+Cis8IUVMRU1FTlQgY2FjaGUgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGNhY2hlIHhtbDpzcGFjZSAoZGVmYXVsdHxwcmVzZXJ2ZSkgJ3ByZXNlcnZlJz4KKworPCEtLQorICAgIFJlZmVyZW5jZSBhbm90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZTsgbm90ZSB0aGF0IHRoaXMKKyAgICBpcyBhbm90aGVyIGNvbXBsZXRlIGZvbnQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBub3QKKyAgICBqdXN0IGEgZmlsZSBpbmNsdWRlZCBieSB0aGUgWE1MIHBhcnNlci4KKworICAgIFNldCAnaWdub3JlX21pc3NpbmcnIHRvICd5ZXMnIGlmIGVycm9ycyBhcmUgdG8gYmUgaWdub3JlZC4KKworICAgIElmIHRoZSBmaWxlbmFtZSBiZWdpbnMgd2l0aCAnficsIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHVzZXJzCisgICAgaG9tZSBkaXJlY3RvcnkgcGF0aC4KKy0tPgorPCFFTEVNRU5UIGluY2x1ZGUgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGluY2x1ZGUKKwkgIGlnbm9yZV9taXNzaW5nICAgIChub3x5ZXMpCQkibm8iCisJICB4bWw6c3BhY2UJICAgIChkZWZhdWx0fHByZXNlcnZlKQkicHJlc2VydmUiPgorCis8IS0tCisgICAgR2xvYmFsIGxpYnJhcnkgY29uZmlndXJhdGlvbiBkYXRhCisgLS0+Cis8IUVMRU1FTlQgY29uZmlnIChibGFua3MpKj4KKworPCEtLQorICAgIFNwZWNpZnkgdGhlIHNldCBvZiBVbmljb2RlIGVuY29kaW5nIHZhbHVlcyB3aGljaAorICAgIHJlcHJlc2VudCBnbHlwaHMgdGhhdCBhcmUgYWxsb3dlZCB0byBjb250YWluIG5vCisgICAgZGF0YS4gIFdpdGggdGhpcyBsaXN0LCBmb250Y29uZmlnIGNhbiBleGFtaW5lCisgICAgZm9udHMgZm9yIGJyb2tlbiBnbHlwaHMgYW5kIGVsaW1pbmF0ZSB0aGVtIGZyb20KKyAgICB0aGUgc2V0IG9mIHZhbGlkIFVuaWNvZGUgY2hhcnMuICBUaGlzIGlkZWEKKyAgICB3YXMgYm9ycm93ZWQgZnJvbSBNb3ppbGxhCisgLS0+Cis8IUVMRU1FTlQgYmxhbmtzIChpbnQpKj4KKworPCEtLQorICAgIEFsaWFzZXMgYXJlIGp1c3QgYSBzcGVjaWFsIGNhc2UgZm9yIG11bHRpcGxlIG1hdGNoIGVsZW1lbnRzCisKKyAgICBUaGV5IGFyZSBzeW50YWN0aWNhbGx5IGVxdWl2YWxlbnQgdG86CisKKyAgICA8bWF0Y2g+CisJPHRlc3QgbmFtZT0iZmFtaWx5Ij4KKwkgICAgPHN0cmluZyB2YWx1ZT1bZmFtaWx5XS8+CisJPC90ZXN0PgorCTxlZGl0IG5hbWU9ImZhbWlseSIgbW9kZT0icHJlcGVuZCI+CisJICAgIDxzdHJpbmcgdmFsdWU9W3ByZWZlcl0vPgorCSAgICAuLi4KKwk8L2VkaXQ+CisJPGVkaXQgbmFtZT0iZmFtaWx5IiBtb2RlPSJhcHBlbmQiPgorCSAgICA8c3RyaW5nIHZhbHVlPVthY2NlcHRdLz4KKwkgICAgLi4uCisJPC9lZGl0PgorCTxlZGl0IG5hbWU9ImZhbWlseSIgbW9kZT0iYXBwZW5kX2xhc3QiPgorCSAgICA8c3RyaW5nIHZhbHVlPVtkZWZhdWx0XS8+CisJICAgIC4uLgorCTwvZWRpdD4KKyAgICA8L21hdGNoPgorLS0+Cis8IUVMRU1FTlQgYWxpYXMgKGZhbWlseSwgcHJlZmVyPywgYWNjZXB0PywgZGVmYXVsdD8pPgorPCFFTEVNRU5UIHByZWZlciAoZmFtaWx5KSo+Cis8IUVMRU1FTlQgYWNjZXB0IChmYW1pbHkpKj4KKzwhRUxFTUVOVCBkZWZhdWx0IChmYW1pbHkpKj4KKzwhRUxFTUVOVCBmYW1pbHkgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGZhbWlseSB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICdwcmVzZXJ2ZSc+CisKKzwhRU5USVRZICUgZXhwciAnaW50fGRvdWJsZXxzdHJpbmd8bWF0cml4fGJvb2x8Y2hhcnNldAorCQl8bmFtZXxjb25zdAorCQl8b3J8YW5kfGVxfG5vdF9lcXxsZXNzfGxlc3NfZXF8bW9yZXxtb3JlX2VxCisJCXxwbHVzfG1pbnVzfHRpbWVzfGRpdmlkZXxub3R8aWYnPgorCis8IS0tCisgICAgTWF0Y2ggYW5kIGVkaXQgcGF0dGVybnMuCisKKyAgICBJZiAndGFyZ2V0JyBpcyAncGF0dGVybicsIGV4ZWN1dGUgdGhlIG1hdGNoIGJlZm9yZSBzZWxlY3RpbmcgYSBmb250LgorICAgIGlmICd0YXJnZXQnIGlzICdmb250JywgZXhlY3V0ZSB0aGUgbWF0Y2ggb24gdGhlIHJlc3VsdCBvZiBhIGZvbnQKKyAgICBzZWxlY3Rpb24uCistLT4KKzwhRUxFTUVOVCBtYXRjaCAodGVzdCosIGVkaXQqKT4KKzwhQVRUTElTVCBtYXRjaAorCSAgdGFyZ2V0IChwYXR0ZXJufGZvbnQpCSJwYXR0ZXJuIj4KKworPCEtLQorICAgIE1hdGNoIGEgZmllbGQgaW4gYSBwYXR0ZXJuCisKKyAgICBpZiAncXVhbCcgaXMgJ2FueScsIHRoZW4gdGhlIG1hdGNoIHN1Y2NlZWRzIGlmIGFueSB2YWx1ZSBpbiB0aGUgZmllbGQgbWF0Y2hlcy4KKyAgICBpZiAncXVhbCcgaXMgJ2FsbCcsIHRoZW4gdGhlIG1hdGNoIHN1Y2NlZWRzIG9ubHkgaWYgYWxsIHZhbHVlcyBtYXRjaC4KKy0tPgorPCFFTEVNRU5UIHRlc3QgKCVleHByOyk+Cis8IUFUVExJU1QgdGVzdCAKKwkgIHF1YWwgKGFueXxhbGwpICAgICJhbnkiCisJICBuYW1lIENEQVRBCSAgICAjUkVRVUlSRUQKKwkgIGNvbXBhcmUgKGVxfG5vdF9lcXxsZXNzfGxlc3NfZXF8bW9yZXxtb3JlX2VxKQkiZXEiPgorCis8IS0tCisgICAgRWRpdCBhIGZpZWxkIGluIGEgcGF0dGVybgorCisgICAgVGhlIGVuY2xvc2VkIHZhbHVlcyBhcmUgdXNlZCB0b2dldGhlciB0byBlZGl0IHRoZSBsaXN0IG9mIHZhbHVlcworICAgIGFzc29jaWF0ZWQgd2l0aCAnbmFtZScuCisKKyAgICBJZiAnbmFtZScgbWF0Y2hlcyBvbmUgb2YgdGhvc2UgdXNlZCBpbiBhIHRlc3QgZWxlbWVudCBmb3IgdGhpcyBtYXRjaCBlbGVtZW50OgorCWlmICdtb2RlJyBpcyAnYXNzaWduJywgcmVwbGFjZSB0aGUgbWF0Y2hlZCB2YWx1ZS4KKwlpZiAnbW9kZScgaXMgJ2Fzc2lnbl9yZXBsYWNlJywgcmVwbGFjZSBhbGwgb2YgdGhlIHZhbHVlcworCWlmICdtb2RlJyBpcyAncHJlcGVuZCcsIGluc2VydCBiZWZvcmUgdGhlIG1hdGNoZWQgdmFsdWUKKwlpZiAnbW9kZScgaXMgJ2FwcGVuZCcsIGluc2VydCBhZnRlciB0aGUgbWF0Y2hlZCB2YWx1ZQorCWlmICdtb2RlJyBpcyAncHJlcGVuZF9maXJzdCcsIGluc2VydCBiZWZvcmUgYWxsIG9mIHRoZSB2YWx1ZXMKKwlpZiAnbW9kZScgaXMgJ2FwcGVuZF9sYXN0JywgaW5zZXJ0IGFmdGVyIGFsbCBvZiB0aGUgdmFsdWVzCisgICAgSWYgJ25hbWUnIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRob3NlIHVzZWQgaW4gYSB0ZXN0IGVsZW1lbnQ6CisJaWYgJ21vZGUnIGlzICdhc3NpZ24nIG9yICdhc3NpZ25fcmVwbGFjZSwgcmVwbGFjZSBhbGwgb2YgdGhlIHZhbHVlcworCWlmICdtb2RlJyBpcyAncHJlcGVuZCcgb3IgJ3ByZXBlbmRfZmlyc3QnLCBpbnNlcnQgYmVmb3JlIGFsbCBvZiB0aGUgdmFsdWVzCisJaWYgJ21vZGUnIGlzICdhcHBlbmQnIG9yICdhcHBlbmRfbGFzdCcsIGluc2VydCBhZnRlciBhbGwgb2YgdGhlIHZhbHVlcworLS0+Cis8IUVMRU1FTlQgZWRpdCAoJWV4cHI7KSo+Cis8IUFUVExJU1QgZWRpdAorCSAgbmFtZSBDREFUQQkgICAgI1JFUVVJUkVECisJICBtb2RlIChhc3NpZ258YXNzaWduX3JlcGxhY2V8cHJlcGVuZHxhcHBlbmR8cHJlcGVuZF9maXJzdHxhcHBlbmRfbGFzdCkgImFzc2lnbiI+CisKKzwhLS0KKyAgICBFbGVtZW50cyBvZiBleHByZXNzaW9ucyBmb2xsb3cKKy0tPgorPCFFTEVNRU5UIGludCAoI1BDREFUQSk+Cis8IUFUVExJU1QgaW50IHhtbDpzcGFjZSAoZGVmYXVsdHxwcmVzZXJ2ZSkgJ3ByZXNlcnZlJz4KKzwhRUxFTUVOVCBkb3VibGUgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGRvdWJsZSB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICdwcmVzZXJ2ZSc+Cis8IUVMRU1FTlQgc3RyaW5nICgjUENEQVRBKT4KKzwhQVRUTElTVCBzdHJpbmcgeG1sOnNwYWNlIChkZWZhdWx0fHByZXNlcnZlKSAncHJlc2VydmUnPgorPCFFTEVNRU5UIG1hdHJpeCAoZG91YmxlLGRvdWJsZSxkb3VibGUsZG91YmxlKT4KKzwhRUxFTUVOVCBib29sICh0cnVlfGZhbHNlKT4KKzwhRUxFTUVOVCBjaGFyc2V0ICgjUENEQVRBKT4KKzwhQVRUTElTVCBjaGFyc2V0IHhtbDpzcGFjZSAoZGVmYXVsdHxwcmVzZXJ2ZSkgJ3ByZXNlcnZlJz4KKzwhRUxFTUVOVCBuYW1lICgjUENEQVRBKT4KKzwhQVRUTElTVCBuYW1lIHhtbDpzcGFjZSAoZGVmYXVsdHxwcmVzZXJ2ZSkgJ3ByZXNlcnZlJz4KKzwhRUxFTUVOVCBjb25zdCAoI1BDREFUQSk+Cis8IUFUVExJU1QgY29uc3QgeG1sOnNwYWNlIChkZWZhdWx0fHByZXNlcnZlKSAncHJlc2VydmUnPgorPCFFTEVNRU5UIG9yICglZXhwcjspKj4KKzwhRUxFTUVOVCBhbmQgKCVleHByOykqPgorPCFFTEVNRU5UIGVxICgoJWV4cHI7KSwgKCVleHByOykpPgorPCFFTEVNRU5UIG5vdF9lcSAoKCVleHByOyksICglZXhwcjspKT4KKzwhRUxFTUVOVCBsZXNzICgoJWV4cHI7KSwgKCVleHByOykpPgorPCFFTEVNRU5UIGxlc3NfZXEgKCglZXhwcjspLCAoJWV4cHI7KSk+Cis8IUVMRU1FTlQgbW9yZSAoKCVleHByOyksICglZXhwcjspKT4KKzwhRUxFTUVOVCBtb3JlX2VxICgoJWV4cHI7KSwgKCVleHByOykpPgorPCFFTEVNRU5UIHBsdXMgKCVleHByOykqPgorPCFFTEVNRU5UIG1pbnVzICglZXhwcjspKj4KKzwhRUxFTUVOVCB0aW1lcyAoJWV4cHI7KSo+Cis8IUVMRU1FTlQgZGl2aWRlICglZXhwcjspKj4KKzwhRUxFTUVOVCBub3QgKCVleHByOyk+Cis8IUVMRU1FTlQgaWYgKCglZXhwcjspLCAoJWV4cHI7KSwgKCVleHByOykpPgpkaWZmIC0tZ2l0IGEvc2V0Zm9udGRpcnMgYi9zZXRmb250ZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmVkNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0Zm9udGRpcnMKQEAgLTAsMCArMSwxOSBAQAorIyEvYmluL3NoCitGT05URElSUz1mb250ZGlycyQkCit0cmFwICJybSAkRk9OVERJUlMiIDAKK3NoIC4vZmluZGZvbnRzID4gJEZPTlRESVJTCitjcCBmb250cy5jb25mLmluIGZvbnRzLmNvbmYKK2NobW9kICt3IGZvbnRzLmNvbmYKK2VkIGZvbnRzLmNvbmYgPDwgRU9GCisvRk9OVFBBVEhfRU5EL2EKKzwhLS0gRm9udCBkaXJlY3RvcmllcyBmb3VuZCBvbiBgZGF0ZWAgLS0+CisuCisrciAkRk9OVERJUlMKK2EKKworLgorL0ZPTlRQQVRIX1NUQVJULywvRk9OVFBBVEhfRU5EL2QKK3cKK3EKK0VPRgorCmRpZmYgLS1naXQgYS9zcmMvSW1ha2VmaWxlIGIvc3JjL0ltYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmE0Y2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0ltYWtlZmlsZQpAQCAtMCwwICsxLDkwIEBACisjaW5jbHVkZSAiLi4vLi4vbGlieG1sMi9jb25maWcuaCIKKyNpZiBIQVZFX1pMSUJfSAorWkxJQj0tbHoKKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSBTaGFyZWRMaWJGb250Y29uZmlnIFlFUworI2VuZGlmCisKKyNpZm5kZWYgU2hhcmVkTGliRm9udGNvbmZpZworI2RlZmluZSBTaGFyZWRMaWJGb250Y29uZmlnIE5PCisjZW5kaWYKKworI2lmbmRlZiBOb3JtYWxMaWJGb250Y29uZmlnCisjZGVmaW5lIE5vcm1hbExpYkZvbnRjb25maWcgKCFTaGFyZWRMaWJGb250Q29uZmlnIHwgRm9yY2VOb3JtYWxMaWIpCisjZW5kaWYKKworI2lmbmRlZiBEZWJ1Z0xpYkZvbnRjb25maWcKKyNkZWZpbmUgRGVidWdMaWJGb250Y29uZmlnCQlOTworI2VuZGlmCisKKyNpZm5kZWYgUHJvZmlsZUxpYkZvbnRjb25maWcKKyNkZWZpbmUgUHJvZmlsZUxpYkZvbnRjb25maWcJCU5PCisjZW5kaWYKKworI2RlZmluZSBMaWJIZWFkZXJzIE5PCisKK0ZPTlRDT05GSUdTUkM9LgorCitGQUxMQkFDS19GT05UUz0kKEZPTlRESVIpL1R5cGUxCisKKyNpZiBTaGFyZWRMaWJGb250Y29uZmlnCisjaWZuZGVmIFNoYXJlZEZvbnRjb25maWdSZXYKKyNkZWZpbmUgU2hhcmVkRm9udGNvbmZpZ1JldiAxLjAKKyNlbmRpZgorU2hhcmVkTGliUmVmZXJlbmNlcyhGT05UQ09ORklHLEZvbnRjb25maWcsJChGT05UQ09ORklHU1JDKSxTT1hMSUJSRVYsU2hhcmVkRm9udGNvbmZpZ1JldikKKyNlbHNlCitQcm9qZWN0VW5zaGFyZWRMaWJSZWZlcmVuY2VzKEZPTlRDT05GSUcsRm9udGNvbmZpZywkKEZPTlRDT05GSUdTUkMpLEJ1aWxkTGliRGlyKQorI2VuZGlmCisKKyNkZWZpbmUgRG9Ob3JtYWxMaWIgTm9ybWFsTGliRm9udGNvbmZpZworI2RlZmluZSBEb1NoYXJlZExpYiBTaGFyZWRMaWJGb250Y29uZmlnCisjZGVmaW5lIERvRXh0cmFMaWIgU2hhcmVkTGliRm9udGNvbmZpZworI2RlZmluZSBEb0RlYnVnTGliIERlYnVnTGliRm9udGNvbmZpZworI2RlZmluZSBEb1Byb2ZpbGVMaWIgUHJvZmlsZUxpYkZvbnRjb25maWcKKyNkZWZpbmUgSGFzU2hhcmVkRGF0YSBZRVMKKyNkZWZpbmUgTGliTmFtZSBmb250Y29uZmlnCitTT0ZPTlRDT05GSUdSRVY9MS4wCisjZGVmaW5lIFNvUmV2IFNPRk9OVENPTkZJR1JFVgorCisjaW5jbHVkZSA8VGhyZWFkcy50bXBsPgorCisjaWYgU2hhcmVkTGliRm9udGNvbmZpZworSU5DTFVERVM9LUkvdXNyL2xvY2FsL2luY2x1ZGUvZnJlZXR5cGUyIC1JL3Vzci9pbmNsdWRlL2xpYnhtbDIgLUkuLgorRlJFRVRZUEUyUkVRTElCID0gLUwvdXNyL2xvY2FsL2xpYiAtbGZyZWV0eXBlCitYTUwyUkVRTElCPS1seG1sMgorI2Vsc2UKK0lOQ0xVREVTPS1JLi4vLi4vZnJlZXR5cGUyIC1JLi4vLi4vbGlieG1sMi9pbmNsdWRlIC1JLi4KK0ZSRUVUWVBFMlJFUUxJQiA9IC4uLy4uL2ZyZWV0eXBlMi9saWJmcmVldHlwZS5hCitYTUwyUkVRTElCPS4uLy4uL2xpYnhtbDIvLmxpYnMvbGlieG1sMi5hICQoWkxJQikgLWxtCisjZW5kaWYKK0RFRklORVM9LURGQ19GQUxMQkFDS19GT05UUz0nIiQoRkFMTEJBQ0tfRk9OVFMpIicKKworUkVRVUlSRURMSUJTPSQoTERQUkVMSUJTKSAkKEZSRUVUWVBFMlJFUUxJQikgJChYTUwyUkVRTElCKQorCitTUkNTPWZjYmxhbmtzLmMgZmNjYWNoZS5jIGZjY2ZnLmMgZmNjaGFyc2V0LmMgZmNkYmcuYyBmY2RlZmF1bHQuYyBmY2Rpci5jIFwKKyAgICAgZmNmcmVldHlwZS5jIGZjZnMuYyBmY2luaXQuYyBmY2xpc3QuYyBmY21hdGNoLmMgZmNtYXRyaXguYyBmY25hbWUuYyBcCisgICAgIGZjcGF0LmMgZmNzdHIuYyBmY3htbC5jCisKK09CSlM9ZmNibGFua3MubyBmY2NhY2hlLm8gZmNjZmcubyBmY2NoYXJzZXQubyBmY2RiZy5vIGZjZGVmYXVsdC5vIGZjZGlyLm8gXAorICAgICBmY2ZyZWV0eXBlLm8gZmNmcy5vIGZjaW5pdC5vIGZjbGlzdC5vIGZjbWF0Y2gubyBmY21hdHJpeC5vIGZjbmFtZS5vIFwKKyAgICAgZmNwYXQubyBmY3N0ci5vIGZjeG1sLm8KKworI2RlZmluZSBMaWJJbnN0YWxsQnVpbGQgWUVTCisjdW5kZWYgTGlua0J1aWxkTGlicmFyeQorI2RlZmluZSBMaW5rQnVpbGRMaWJyYXJ5KGxpYikgTWFrZURpcigkKEJVSUxETElCRElSKSkJCQlAQFwKKwlSZW1vdmVGaWxlKCQoQlVJTERMSUJESVIpL2xpYikJCQkJCUBAXAorCWNkICQoQlVJTERMSUJESVIpICYmICQoTE4pICQoQlVJTERMSUJUT1ApLyQoQ1VSUkVOVF9ESVIpL2xpYiAuCisKKworI2luY2x1ZGUgPExpYnJhcnkudG1wbD4KKworI2lmIERvU2hhcmVkTGliICYmIFNoYXJlZERhdGFTZXBhcmF0aW9uCitTcGVjaWFsQ09iamVjdFJ1bGUoc2hhcmVkbGliLE51bGxQYXJhbWV0ZXIsJChTSExJQkRFRikpCisjZW5kaWYKKworTUFOU1VGRklYID0gJChMSUJNQU5TVUZGSVgpCitJbnN0YWxsTWFuUGFnZShmb250Y29uZmlnLCQoTElCTUFORElSKSkKK0RlcGVuZFRhcmdldCgpCisKZGlmZiAtLWdpdCBhL3NyYy9mY2JsYW5rcy5jIGIvc3JjL2ZjYmxhbmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzYTlhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY2JsYW5rcy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiAkWEZyZWU4NiQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZmNpbnQuaCIKKworRmNCbGFua3MgKgorRmNCbGFua3NDcmVhdGUgKHZvaWQpCit7CisgICAgRmNCbGFua3MJKmI7CisKKyAgICBiID0gbWFsbG9jIChzaXplb2YgKEZjQmxhbmtzKSk7CisgICAgaWYgKCFiKQorCXJldHVybiAwOworICAgIGItPm5ibGFuayA9IDA7CisgICAgYi0+c2JsYW5rID0gMDsKKyAgICBiLT5ibGFua3MgPSAwOworICAgIHJldHVybiBiOworfQorCit2b2lkCitGY0JsYW5rc0Rlc3Ryb3kgKEZjQmxhbmtzICpiKQoreworICAgIGlmIChiLT5ibGFua3MpCisJZnJlZSAoYi0+YmxhbmtzKTsKKyAgICBmcmVlIChiKTsKK30KKworRmNCb29sCitGY0JsYW5rc0FkZCAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpCit7CisgICAgRmNDaGFyMzIJKmM7CisgICAgaW50CQlzYmxhbms7CisKKyAgICBmb3IgKHNibGFuayA9IDA7IHNibGFuayA8IGItPm5ibGFuazsgc2JsYW5rKyspCisJaWYgKGItPmJsYW5rc1tzYmxhbmtdID09IHVjczQpCisJICAgIHJldHVybiBGY1RydWU7CisKKyAgICBpZiAoYi0+bmJsYW5rID09IGItPnNibGFuaykKKyAgICB7CisJc2JsYW5rID0gYi0+c2JsYW5rICsgMzI7CisJaWYgKGItPmJsYW5rcykKKwkgICAgYyA9IChGY0NoYXIzMiAqKSByZWFsbG9jIChiLT5ibGFua3MsIHNibGFuayAqIHNpemVvZiAoRmNDaGFyMzIpKTsKKwllbHNlCisJICAgIGMgPSAoRmNDaGFyMzIgKikgbWFsbG9jIChzYmxhbmsgKiBzaXplb2YgKEZjQ2hhcjMyKSk7CisJaWYgKCFjKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwliLT5zYmxhbmsgPSBzYmxhbms7CisJYi0+YmxhbmtzID0gYzsKKyAgICB9CisgICAgYi0+YmxhbmtzW2ItPm5ibGFuaysrXSA9IHVjczQ7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworRmNCb29sCitGY0JsYW5rc0lzTWVtYmVyIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCkKK3sKKyAgICBpbnQJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBiLT5uYmxhbms7IGkrKykKKwlpZiAoYi0+YmxhbmtzW2ldID09IHVjczQpCisJICAgIHJldHVybiBGY1RydWU7CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvZmNjYWNoZS5jIGIvc3JjL2ZjY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjUxMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjY2FjaGUuYwpAQCAtMCwwICsxLDU5MiBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImZjaW50LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK0ZjRmlsZUNhY2hlSGFzaCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICAgIHVuc2lnbmVkIGludCAgICBoID0gMDsKKyAgICBjaGFyCSAgICBjOworCisgICAgd2hpbGUgKChjID0gKnN0cmluZysrKSkKKwloID0gKGggPDwgMSkgXiBjOworICAgIHJldHVybiBoOworfQorCitjaGFyICoKK0ZjRmlsZUNhY2hlRmluZCAoRmNGaWxlQ2FjaGUJKmNhY2hlLAorCQkgY29uc3QgY2hhcgkqZmlsZSwKKwkJIGludAkJaWQsCisJCSBpbnQJCSpjb3VudCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgICAgaGFzaDsKKyAgICBjb25zdCBjaGFyCSAgICAqbWF0Y2g7CisgICAgRmNGaWxlQ2FjaGVFbnQgKmMsICpuYW1lOworICAgIGludAkJICAgIG1heGlkOworICAgIHN0cnVjdCBzdGF0CSAgICBzdGF0YjsKKyAgICAKKyAgICBtYXRjaCA9IGZpbGU7CisgICAgCisgICAgaGFzaCA9IEZjRmlsZUNhY2hlSGFzaCAobWF0Y2gpOworICAgIG5hbWUgPSAwOworICAgIG1heGlkID0gLTE7CisgICAgZm9yIChjID0gY2FjaGUtPmVudHNbaGFzaCAlIEZDX0ZJTEVfQ0FDSEVfSEFTSF9TSVpFXTsgYzsgYyA9IGMtPm5leHQpCisgICAgeworCWlmIChjLT5oYXNoID09IGhhc2ggJiYgIXN0cmNtcCAobWF0Y2gsIGMtPmZpbGUpKQorCXsKKwkgICAgaWYgKGMtPmlkID4gbWF4aWQpCisJCW1heGlkID0gYy0+aWQ7CisJICAgIGlmIChjLT5pZCA9PSBpZCkKKwkgICAgeworCQlpZiAoc3RhdCAoZmlsZSwgJnN0YXRiKSA8IDApCisJCXsKKwkJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQorCQkJcHJpbnRmICgiIGZpbGUgbWlzc2luZ1xuIik7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RhdGIuc3RfbXRpbWUgIT0gYy0+dGltZSkKKwkJeworCQkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCisJCQlwcmludGYgKCIgdGltZXN0YW1wIG1pc21hdGNoICh3YXMgJWQgaXMgJWQpXG4iLAorCQkJCShpbnQpIGMtPnRpbWUsIChpbnQpIHN0YXRiLnN0X210aW1lKTsKKwkJICAgIHJldHVybiAwOworCQl9CisJCWlmICghYy0+cmVmZXJlbmNlZCkKKwkJeworCQkgICAgY2FjaGUtPnJlZmVyZW5jZWQrKzsKKwkJICAgIGMtPnJlZmVyZW5jZWQgPSBGY1RydWU7CisJCX0KKwkJbmFtZSA9IGM7CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmICghbmFtZSkKKwlyZXR1cm4gMDsKKyAgICAqY291bnQgPSBtYXhpZCArIDE7CisgICAgcmV0dXJuIG5hbWUtPm5hbWU7Cit9CisKKy8qCisgKiBDYWNoZSBmaWxlIHN5bnRheCBpcyBxdWl0ZSBzaW1wbGU6CisgKgorICogImZpbGVfbmFtZSIgaWQgdGltZSAiZm9udF9uYW1lIiBcbgorICovCisgCitzdGF0aWMgRmNCb29sCitGY0ZpbGVDYWNoZVJlYWRTdHJpbmcgKEZJTEUgKmYsIGNoYXIgKmRlc3QsIGludCBsZW4pCit7CisgICAgaW50CSAgICBjOworICAgIEZjQm9vbCAgICBlc2NhcGU7CisKKyAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQorCWlmIChjID09ICciJykKKwkgICAgYnJlYWs7CisgICAgaWYgKGMgPT0gRU9GKQorCXJldHVybiBGY0ZhbHNlOworICAgIGlmIChsZW4gPT0gMCkKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICAKKyAgICBlc2NhcGUgPSBGY0ZhbHNlOworICAgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCisgICAgeworCWlmICghZXNjYXBlKQorCXsKKwkgICAgc3dpdGNoIChjKSB7CisJICAgIGNhc2UgJyInOgorCQkqZGVzdCsrID0gJ1wwJzsKKwkJcmV0dXJuIEZjVHJ1ZTsKKwkgICAgY2FzZSAnXFwnOgorCQllc2NhcGUgPSBGY1RydWU7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorICAgICAgICBpZiAoLS1sZW4gPD0gMSkKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisJKmRlc3QrKyA9IGM7CisJZXNjYXBlID0gRmNGYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjRmlsZUNhY2hlUmVhZFVsb25nIChGSUxFICpmLCB1bnNpZ25lZCBsb25nICpkZXN0KQoreworICAgIHVuc2lnbmVkIGxvbmcgICB0OworICAgIGludAkJICAgIGM7CisKKyAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQorICAgIHsKKwlpZiAoIWlzc3BhY2UgKGMpKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGMgPT0gRU9GKQorCXJldHVybiBGY0ZhbHNlOworICAgIHQgPSAwOworICAgIGZvciAoOzspCisgICAgeworCWlmIChjID09IEVPRiB8fCBpc3NwYWNlIChjKSkKKwkgICAgYnJlYWs7CisJaWYgKCFpc2RpZ2l0IChjKSkKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisJdCA9IHQgKiAxMCArIChjIC0gJzAnKTsKKwljID0gZ2V0YyAoZik7CisgICAgfQorICAgICpkZXN0ID0gdDsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitzdGF0aWMgRmNCb29sCitGY0ZpbGVDYWNoZVJlYWRJbnQgKEZJTEUgKmYsIGludCAqZGVzdCkKK3sKKyAgICB1bnNpZ25lZCBsb25nICAgdDsKKyAgICBGY0Jvb2wJICAgIHJldDsKKworICAgIHJldCA9IEZjRmlsZUNhY2hlUmVhZFVsb25nIChmLCAmdCk7CisgICAgaWYgKHJldCkKKwkqZGVzdCA9IChpbnQpIHQ7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEZjQm9vbAorRmNGaWxlQ2FjaGVSZWFkVGltZSAoRklMRSAqZiwgdGltZV90ICpkZXN0KQoreworICAgIHVuc2lnbmVkIGxvbmcgICB0OworICAgIEZjQm9vbAkgICAgcmV0OworCisgICAgcmV0ID0gRmNGaWxlQ2FjaGVSZWFkVWxvbmcgKGYsICZ0KTsKKyAgICBpZiAocmV0KQorCSpkZXN0ID0gKHRpbWVfdCkgdDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgRmNCb29sCitGY0ZpbGVDYWNoZUFkZCAoRmNGaWxlQ2FjaGUJKmNhY2hlLAorCQkgY29uc3QgY2hhcgkqZmlsZSwKKwkJIGludAkJaWQsCisJCSB0aW1lX3QJCXRpbWUsCisJCSBjb25zdCBjaGFyCSpuYW1lLAorCQkgRmNCb29sCQlyZXBsYWNlKQoreworICAgIEZjRmlsZUNhY2hlRW50ICAgICpjOworICAgIEZjRmlsZUNhY2hlRW50ICAgICoqcHJldiwgKm9sZDsKKyAgICB1bnNpZ25lZCBpbnQgICAgaGFzaDsKKworICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQorICAgIHsKKwlwcmludGYgKCIlcyBmYWNlICVzLyVkIGFzICVzXG4iLCByZXBsYWNlID8gIlJlcGxhY2UiIDogIkFkZCIsCisJCWZpbGUsIGlkLCBuYW1lKTsKKyAgICB9CisgICAgaGFzaCA9IEZjRmlsZUNhY2hlSGFzaCAoZmlsZSk7CisgICAgZm9yIChwcmV2ID0gJmNhY2hlLT5lbnRzW2hhc2ggJSBGQ19GSUxFX0NBQ0hFX0hBU0hfU0laRV07IAorCSAob2xkID0gKnByZXYpOworCSBwcmV2ID0gJigqcHJldiktPm5leHQpCisgICAgeworCWlmIChvbGQtPmhhc2ggPT0gaGFzaCAmJiBvbGQtPmlkID09IGlkICYmICFzdHJjbXAgKG9sZC0+ZmlsZSwgZmlsZSkpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKnByZXYpCisgICAgeworCWlmICghcmVwbGFjZSkKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisKKwlvbGQgPSAqcHJldjsKKwlpZiAob2xkLT5yZWZlcmVuY2VkKQorCSAgICBjYWNoZS0+cmVmZXJlbmNlZC0tOworCSpwcmV2ID0gb2xkLT5uZXh0OworCWZyZWUgKG9sZCk7CisJY2FjaGUtPmVudHJpZXMtLTsKKyAgICB9CisJCisgICAgYyA9IG1hbGxvYyAoc2l6ZW9mIChGY0ZpbGVDYWNoZUVudCkgKworCQlzdHJsZW4gKGZpbGUpICsgMSArCisJCXN0cmxlbiAobmFtZSkgKyAxKTsKKyAgICBpZiAoIWMpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgYy0+bmV4dCA9ICpwcmV2OworICAgICpwcmV2ID0gYzsKKyAgICBjLT5oYXNoID0gaGFzaDsKKyAgICBjLT5maWxlID0gKGNoYXIgKikgKGMgKyAxKTsKKyAgICBjLT5pZCA9IGlkOworICAgIGMtPm5hbWUgPSBjLT5maWxlICsgc3RybGVuIChmaWxlKSArIDE7CisgICAgc3RyY3B5IChjLT5maWxlLCBmaWxlKTsKKyAgICBjLT50aW1lID0gdGltZTsKKyAgICBjLT5yZWZlcmVuY2VkID0gcmVwbGFjZTsKKyAgICBzdHJjcHkgKGMtPm5hbWUsIG5hbWUpOworICAgIGNhY2hlLT5lbnRyaWVzKys7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworRmNGaWxlQ2FjaGUgKgorRmNGaWxlQ2FjaGVDcmVhdGUgKHZvaWQpCit7CisgICAgRmNGaWxlQ2FjaGUJKmNhY2hlOworICAgIGludAkJaDsKKworICAgIGNhY2hlID0gbWFsbG9jIChzaXplb2YgKEZjRmlsZUNhY2hlKSk7CisgICAgaWYgKCFjYWNoZSkKKwlyZXR1cm4gMDsKKyAgICBmb3IgKGggPSAwOyBoIDwgRkNfRklMRV9DQUNIRV9IQVNIX1NJWkU7IGgrKykKKwljYWNoZS0+ZW50c1toXSA9IDA7CisgICAgY2FjaGUtPmVudHJpZXMgPSAwOworICAgIGNhY2hlLT5yZWZlcmVuY2VkID0gMDsKKyAgICBjYWNoZS0+dXBkYXRlZCA9IEZjRmFsc2U7CisgICAgcmV0dXJuIGNhY2hlOworfQorCit2b2lkCitGY0ZpbGVDYWNoZURlc3Ryb3kgKEZjRmlsZUNhY2hlICpjYWNoZSkKK3sKKyAgICBGY0ZpbGVDYWNoZUVudCAqYywgKm5leHQ7CisgICAgaW50CQkgICAgaDsKKworICAgIGZvciAoaCA9IDA7IGggPCBGQ19GSUxFX0NBQ0hFX0hBU0hfU0laRTsgaCsrKQorICAgIHsKKwlmb3IgKGMgPSBjYWNoZS0+ZW50c1toXTsgYzsgYyA9IG5leHQpCisJeworCSAgICBuZXh0ID0gYy0+bmV4dDsKKwkgICAgZnJlZSAoYyk7CisJfQorICAgIH0KKyAgICBmcmVlIChjYWNoZSk7Cit9CisKK3ZvaWQKK0ZjRmlsZUNhY2hlTG9hZCAoRmNGaWxlQ2FjaGUJKmNhY2hlLAorCQkgY29uc3QgY2hhcgkqY2FjaGVfZmlsZSkKK3sKKyAgICBGSUxFCSAgICAqZjsKKyAgICBjaGFyCSAgICBmaWxlWzgxOTJdOworICAgIGludAkJICAgIGlkOworICAgIHRpbWVfdAkgICAgdGltZTsKKyAgICBjaGFyCSAgICBuYW1lWzgxOTJdOworCisgICAgZiA9IGZvcGVuIChjYWNoZV9maWxlLCAiciIpOworICAgIGlmICghZikKKwlyZXR1cm47CisKKyAgICBjYWNoZS0+dXBkYXRlZCA9IEZjRmFsc2U7CisgICAgd2hpbGUgKEZjRmlsZUNhY2hlUmVhZFN0cmluZyAoZiwgZmlsZSwgc2l6ZW9mIChmaWxlKSkgJiYKKwkgICBGY0ZpbGVDYWNoZVJlYWRJbnQgKGYsICZpZCkgJiYKKwkgICBGY0ZpbGVDYWNoZVJlYWRUaW1lIChmLCAmdGltZSkgJiYKKwkgICBGY0ZpbGVDYWNoZVJlYWRTdHJpbmcgKGYsIG5hbWUsIHNpemVvZiAobmFtZSkpKQorICAgIHsKKwkodm9pZCkgRmNGaWxlQ2FjaGVBZGQgKGNhY2hlLCBmaWxlLCBpZCwgdGltZSwgbmFtZSwgRmNGYWxzZSk7CisgICAgfQorICAgIGZjbG9zZSAoZik7Cit9CisKK0ZjQm9vbAorRmNGaWxlQ2FjaGVVcGRhdGUgKEZjRmlsZUNhY2hlCSpjYWNoZSwKKwkJICAgY29uc3QgY2hhcgkqZmlsZSwKKwkJICAgaW50CQlpZCwKKwkJICAgY29uc3QgY2hhcgkqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyCSAgICAqbWF0Y2g7CisgICAgc3RydWN0IHN0YXQJICAgIHN0YXRiOworICAgIEZjQm9vbAkgICAgcmV0OworCisgICAgbWF0Y2ggPSBmaWxlOworCisgICAgaWYgKHN0YXQgKGZpbGUsICZzdGF0YikgPCAwKQorCXJldHVybiBGY0ZhbHNlOworICAgIHJldCA9IEZjRmlsZUNhY2hlQWRkIChjYWNoZSwgbWF0Y2gsIGlkLCAKKwkJCSAgICBzdGF0Yi5zdF9tdGltZSwgbmFtZSwgRmNUcnVlKTsKKyAgICBpZiAocmV0KQorCWNhY2hlLT51cGRhdGVkID0gRmNUcnVlOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjRmlsZUNhY2hlV3JpdGVTdHJpbmcgKEZJTEUgKmYsIGNoYXIgKnN0cmluZykKK3sKKyAgICBjaGFyICAgIGM7CisKKyAgICBpZiAocHV0YyAoJyInLCBmKSA9PSBFT0YpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgd2hpbGUgKChjID0gKnN0cmluZysrKSkKKyAgICB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnIic6CisJY2FzZSAnXFwnOgorCSAgICBpZiAocHV0YyAoJ1xcJywgZikgPT0gRU9GKQorCQlyZXR1cm4gRmNGYWxzZTsKKwkgICAgLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkgICAgaWYgKHB1dGMgKGMsIGYpID09IEVPRikKKwkJcmV0dXJuIEZjRmFsc2U7CisJfQorICAgIH0KKyAgICBpZiAocHV0YyAoJyInLCBmKSA9PSBFT0YpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworc3RhdGljIEZjQm9vbAorRmNGaWxlQ2FjaGVXcml0ZVVsb25nIChGSUxFICpmLCB1bnNpZ25lZCBsb25nIHQpCit7CisgICAgaW50CSAgICBwb3c7CisgICAgdW5zaWduZWQgbG9uZyAgIHRlbXAsIGRpZ2l0OworCisgICAgdGVtcCA9IHQ7CisgICAgcG93ID0gMTsKKyAgICB3aGlsZSAodGVtcCA+PSAxMCkKKyAgICB7CisJdGVtcCAvPSAxMDsKKwlwb3cgKj0gMTA7CisgICAgfQorICAgIHRlbXAgPSB0OworICAgIHdoaWxlIChwb3cpCisgICAgeworCWRpZ2l0ID0gdGVtcCAvIHBvdzsKKwlpZiAocHV0YyAoKGNoYXIpIGRpZ2l0ICsgJzAnLCBmKSA9PSBFT0YpCisJICAgIHJldHVybiBGY0ZhbHNlOworCXRlbXAgPSB0ZW1wIC0gcG93ICogZGlnaXQ7CisJcG93ID0gcG93IC8gMTA7CisgICAgfQorICAgIHJldHVybiBGY1RydWU7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjRmlsZUNhY2hlV3JpdGVJbnQgKEZJTEUgKmYsIGludCBpKQoreworICAgIHJldHVybiBGY0ZpbGVDYWNoZVdyaXRlVWxvbmcgKGYsICh1bnNpZ25lZCBsb25nKSBpKTsKK30KKworc3RhdGljIEZjQm9vbAorRmNGaWxlQ2FjaGVXcml0ZVRpbWUgKEZJTEUgKmYsIHRpbWVfdCB0KQoreworICAgIHJldHVybiBGY0ZpbGVDYWNoZVdyaXRlVWxvbmcgKGYsICh1bnNpZ25lZCBsb25nKSB0KTsKK30KKworRmNCb29sCitGY0ZpbGVDYWNoZVNhdmUgKEZjRmlsZUNhY2hlCSpjYWNoZSwKKwkJIGNvbnN0IGNoYXIJKmNhY2hlX2ZpbGUpCit7CisgICAgY2hhcgkgICAgKmxjazsKKyAgICBjaGFyCSAgICAqdG1wOworICAgIEZJTEUJICAgICpmOworICAgIGludAkJICAgIGg7CisgICAgRmNGaWxlQ2FjaGVFbnQgKmM7CisKKyAgICBpZiAoIWNhY2hlLT51cGRhdGVkICYmIGNhY2hlLT5yZWZlcmVuY2VkID09IGNhY2hlLT5lbnRyaWVzKQorCXJldHVybiBGY1RydWU7CisgICAgCisgICAgbGNrID0gbWFsbG9jIChzdHJsZW4gKGNhY2hlX2ZpbGUpKjIgKyA0KTsKKyAgICBpZiAoIWxjaykKKwlnb3RvIGJhaWwwOworICAgIHRtcCA9IGxjayArIHN0cmxlbiAoY2FjaGVfZmlsZSkgKyAyOworICAgIHN0cmNweSAobGNrLCBjYWNoZV9maWxlKTsKKyAgICBzdHJjYXQgKGxjaywgIkwiKTsKKyAgICBzdHJjcHkgKHRtcCwgY2FjaGVfZmlsZSk7CisgICAgc3RyY2F0ICh0bXAsICJUIik7CisgICAgaWYgKGxpbmsgKGxjaywgY2FjaGVfZmlsZSkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkKKwlnb3RvIGJhaWwxOworICAgIGlmIChhY2Nlc3MgKHRtcCwgRl9PSykgPT0gMCkKKwlnb3RvIGJhaWwyOworICAgIGYgPSBmb3BlbiAodG1wLCAidyIpOworICAgIGlmICghZikKKwlnb3RvIGJhaWwyOworCisgICAgZm9yIChoID0gMDsgaCA8IEZDX0ZJTEVfQ0FDSEVfSEFTSF9TSVpFOyBoKyspCisgICAgeworCWZvciAoYyA9IGNhY2hlLT5lbnRzW2hdOyBjOyBjID0gYy0+bmV4dCkKKwl7CisJICAgIGlmICghYy0+cmVmZXJlbmNlZCkKKwkJY29udGludWU7CisJICAgIGlmICghRmNGaWxlQ2FjaGVXcml0ZVN0cmluZyAoZiwgYy0+ZmlsZSkpCisJCWdvdG8gYmFpbDQ7CisJICAgIGlmIChwdXRjICgnICcsIGYpID09IEVPRikKKwkJZ290byBiYWlsNDsKKwkgICAgaWYgKCFGY0ZpbGVDYWNoZVdyaXRlSW50IChmLCBjLT5pZCkpCisJCWdvdG8gYmFpbDQ7CisJICAgIGlmIChwdXRjICgnICcsIGYpID09IEVPRikKKwkJZ290byBiYWlsNDsKKwkgICAgaWYgKCFGY0ZpbGVDYWNoZVdyaXRlVGltZSAoZiwgYy0+dGltZSkpCisJCWdvdG8gYmFpbDQ7CisJICAgIGlmIChwdXRjICgnICcsIGYpID09IEVPRikKKwkJZ290byBiYWlsNDsKKwkgICAgaWYgKCFGY0ZpbGVDYWNoZVdyaXRlU3RyaW5nIChmLCBjLT5uYW1lKSkKKwkJZ290byBiYWlsNDsKKwkgICAgaWYgKHB1dGMgKCdcbicsIGYpID09IEVPRikKKwkJZ290byBiYWlsNDsKKwl9CisgICAgfQorCisgICAgaWYgKGZjbG9zZSAoZikgPT0gRU9GKQorCWdvdG8gYmFpbDM7CisgICAgCisgICAgaWYgKHJlbmFtZSAodG1wLCBjYWNoZV9maWxlKSA8IDApCisJZ290byBiYWlsMzsKKyAgICAKKyAgICB1bmxpbmsgKGxjayk7CisgICAgY2FjaGUtPnVwZGF0ZWQgPSBGY0ZhbHNlOworICAgIHJldHVybiBGY1RydWU7CisKK2JhaWw0OgorICAgIGZjbG9zZSAoZik7CitiYWlsMzoKKyAgICB1bmxpbmsgKHRtcCk7CitiYWlsMjoKKyAgICB1bmxpbmsgKGxjayk7CitiYWlsMToKKyAgICBmcmVlIChsY2spOworYmFpbDA6CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CisKK0ZjQm9vbAorRmNGaWxlQ2FjaGVSZWFkRGlyIChGY0ZvbnRTZXQgKnNldCwgY29uc3QgY2hhciAqY2FjaGVfZmlsZSkKK3sKKyAgICBGY1BhdHRlcm4JICAgICpmb250OworICAgIEZJTEUJICAgICpmOworICAgIGNoYXIJICAgICpwYXRoOworICAgIGNoYXIJICAgICpiYXNlOworICAgIGNoYXIJICAgIGZpbGVbODE5Ml07CisgICAgaW50CQkgICAgaWQ7CisgICAgY2hhcgkgICAgbmFtZVs4MTkyXTsKKyAgICBGY0Jvb2wJICAgIHJldCA9IEZjRmFsc2U7CisKKyAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRSkKKyAgICB7CisJcHJpbnRmICgiRmNGaWxlQ2FjaGVSZWFkRGlyIGNhY2hlX2ZpbGUgXCIlc1wiXG4iLCBjYWNoZV9maWxlKTsKKyAgICB9CisgICAgCisgICAgZiA9IGZvcGVuIChjYWNoZV9maWxlLCAiciIpOworICAgIGlmICghZikKKyAgICB7CisJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCisJeworCSAgICBwcmludGYgKCIgbm8gY2FjaGUgZmlsZVxuIik7CisJfQorCWdvdG8gYmFpbDA7CisgICAgfQorCisgICAgYmFzZSA9IHN0cnJjaHIgKGNhY2hlX2ZpbGUsICcvJyk7CisgICAgaWYgKCFiYXNlKQorCWdvdG8gYmFpbDE7CisgICAgYmFzZSsrOworICAgIHBhdGggPSBtYWxsb2MgKGJhc2UgLSBjYWNoZV9maWxlICsgODE5MiArIDEpOworICAgIGlmICghcGF0aCkKKwlnb3RvIGJhaWwxOworICAgIG1lbWNweSAocGF0aCwgY2FjaGVfZmlsZSwgYmFzZSAtIGNhY2hlX2ZpbGUpOworICAgIGJhc2UgPSBwYXRoICsgKGJhc2UgLSBjYWNoZV9maWxlKTsKKyAgICAKKyAgICB3aGlsZSAoRmNGaWxlQ2FjaGVSZWFkU3RyaW5nIChmLCBmaWxlLCBzaXplb2YgKGZpbGUpKSAmJgorCSAgIEZjRmlsZUNhY2hlUmVhZEludCAoZiwgJmlkKSAmJgorCSAgIEZjRmlsZUNhY2hlUmVhZFN0cmluZyAoZiwgbmFtZSwgc2l6ZW9mIChuYW1lKSkpCisgICAgeworCWZvbnQgPSBGY05hbWVQYXJzZSAobmFtZSk7CisJaWYgKGZvbnQpCisJeworCSAgICBzdHJjcHkgKGJhc2UsIGZpbGUpOworCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRVYpCisJICAgIHsKKwkJcHJpbnRmICgiIGRpciBjYWNoZSBmaWxlIFwiJXNcIlxuIiwgZmlsZSk7CisJICAgIH0KKwkgICAgRmNQYXR0ZXJuQWRkU3RyaW5nIChmb250LCBGQ19GSUxFLCBwYXRoKTsKKwkgICAgaWYgKCFGY0ZvbnRTZXRBZGQgKHNldCwgZm9udCkpCisJCWdvdG8gYmFpbDI7CisJfQorICAgIH0KKyAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRSkKKyAgICB7CisJcHJpbnRmICgiIGNhY2hlIGxvYWRlZFxuIik7CisgICAgfQorICAgIAorICAgIHJldCA9IEZjVHJ1ZTsKK2JhaWwyOgorICAgIGZyZWUgKHBhdGgpOworYmFpbDE6CisgICAgZmNsb3NlIChmKTsKK2JhaWwwOgorICAgIHJldHVybiByZXQ7Cit9CisKK0ZjQm9vbAorRmNGaWxlQ2FjaGVXcml0ZURpciAoRmNGb250U2V0ICpzZXQsIGNvbnN0IGNoYXIgKmNhY2hlX2ZpbGUpCit7CisgICAgRmNQYXR0ZXJuCSAgICAqZm9udDsKKyAgICBGSUxFCSAgICAqZjsKKyAgICBjaGFyCSAgICAqbmFtZTsKKyAgICBjaGFyCSAgICAqZmlsZSwgKmJhc2U7CisgICAgaW50CQkgICAgbjsKKyAgICBpbnQJCSAgICBpZDsKKyAgICBGY0Jvb2wJICAgIHJldDsKKworICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQorCXByaW50ZiAoIkZjRmlsZUNhY2hlV3JpdGVEaXIgY2FjaGVfZmlsZSBcIiVzXCJcbiIsIGNhY2hlX2ZpbGUpOworICAgIAorICAgIGYgPSBmb3BlbiAoY2FjaGVfZmlsZSwgInciKTsKKyAgICBpZiAoIWYpCisgICAgeworCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQorCSAgICBwcmludGYgKCIgY2FuJ3QgY3JlYXRlIFwiJXNcIlxuIiwgY2FjaGVfZmlsZSk7CisJZ290byBiYWlsMDsKKyAgICB9CisgICAgZm9yIChuID0gMDsgbiA8IHNldC0+bmZvbnQ7IG4rKykKKyAgICB7CisJZm9udCA9IHNldC0+Zm9udHNbbl07CisJaWYgKEZjUGF0dGVybkdldFN0cmluZyAoZm9udCwgRkNfRklMRSwgMCwgJmZpbGUpICE9IEZjUmVzdWx0TWF0Y2gpCisJICAgIGdvdG8gYmFpbDE7CisJYmFzZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7CisJaWYgKGJhc2UpCisJICAgIGJhc2UgPSBiYXNlICsgMTsKKwllbHNlCisJICAgIGJhc2UgPSBmaWxlOworCWlmIChGY1BhdHRlcm5HZXRJbnRlZ2VyIChmb250LCBGQ19JTkRFWCwgMCwgJmlkKSAhPSBGY1Jlc3VsdE1hdGNoKQorCSAgICBnb3RvIGJhaWwxOworCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFVikKKwkgICAgcHJpbnRmICgiIHdyaXRlIGZpbGUgXCIlc1wiXG4iLCBiYXNlKTsKKwlpZiAoIUZjRmlsZUNhY2hlV3JpdGVTdHJpbmcgKGYsIGJhc2UpKQorCSAgICBnb3RvIGJhaWwxOworCWlmIChwdXRjICgnICcsIGYpID09IEVPRikKKwkgICAgZ290byBiYWlsMTsKKwlpZiAoIUZjRmlsZUNhY2hlV3JpdGVJbnQgKGYsIGlkKSkKKwkgICAgZ290byBiYWlsMTsKKyAgICAgICAgaWYgKHB1dGMgKCcgJywgZikgPT0gRU9GKQorCSAgICBnb3RvIGJhaWwxOworCW5hbWUgPSBGY05hbWVVbnBhcnNlIChmb250KTsKKwlpZiAoIW5hbWUpCisJICAgIGdvdG8gYmFpbDE7CisJcmV0ID0gRmNGaWxlQ2FjaGVXcml0ZVN0cmluZyAoZiwgbmFtZSk7CisJZnJlZSAobmFtZSk7CisJaWYgKCFyZXQpCisJICAgIGdvdG8gYmFpbDE7CisJaWYgKHB1dGMgKCdcbicsIGYpID09IEVPRikKKwkgICAgZ290byBiYWlsMTsKKyAgICB9CisgICAgaWYgKGZjbG9zZSAoZikgPT0gRU9GKQorCWdvdG8gYmFpbDA7CisgICAgCisgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCisJcHJpbnRmICgiIGNhY2hlIHdyaXR0ZW5cbiIpOworICAgIHJldHVybiBGY1RydWU7CisgICAgCitiYWlsMToKKyAgICBmY2xvc2UgKGYpOworYmFpbDA6CisgICAgdW5saW5rIChjYWNoZV9maWxlKTsKKyAgICByZXR1cm4gRmNGYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9mY2NmZy5jIGIvc3JjL2ZjY2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4MGVlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY2NmZy5jCkBAIC0wLDAgKzEsMTM2OSBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZmNpbnQuaCIKKworc3RhdGljIEZjQ29uZmlnICAgICpmY0NvbmZpZzsKKworRmNDb25maWcgKgorRmNDb25maWdDcmVhdGUgKHZvaWQpCit7CisgICAgRmNTZXROYW1lCXNldDsKKyAgICBGY0NvbmZpZwkqY29uZmlnOworCisgICAgY29uZmlnID0gbWFsbG9jIChzaXplb2YgKEZjQ29uZmlnKSk7CisgICAgaWYgKCFjb25maWcpCisJZ290byBiYWlsMDsKKyAgICAKKyAgICBjb25maWctPmRpcnMgPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSk7CisgICAgaWYgKCFjb25maWctPmRpcnMpCisJZ290byBiYWlsMTsKKyAgICBjb25maWctPmRpcnNbMF0gPSAwOworICAgIAorICAgIGNvbmZpZy0+Y29uZmlnRmlsZXMgPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSk7CisgICAgaWYgKCFjb25maWctPmNvbmZpZ0ZpbGVzKQorCWdvdG8gYmFpbDI7CisgICAgY29uZmlnLT5jb25maWdGaWxlc1swXSA9IDA7CisgICAgCisgICAgY29uZmlnLT5jYWNoZSA9IDA7CisgICAgaWYgKCFGY0NvbmZpZ1NldENhY2hlIChjb25maWcsICJ+LyIgRkNfVVNFUl9DQUNIRV9GSUxFKSkKKwlnb3RvIGJhaWwzOworCisgICAgY29uZmlnLT5ibGFua3MgPSAwOworCisgICAgY29uZmlnLT5zdWJzdFBhdHRlcm4gPSAwOworICAgIGNvbmZpZy0+c3Vic3RGb250ID0gMDsKKyAgICBjb25maWctPm1heE9iamVjdHMgPSAwOworICAgIGZvciAoc2V0ID0gRmNTZXRTeXN0ZW07IHNldCA8PSBGY1NldEFwcGxpY2F0aW9uOyBzZXQrKykKKwljb25maWctPmZvbnRzW3NldF0gPSAwOworICAgIAorICAgIHJldHVybiBjb25maWc7CisKK2JhaWwzOgorICAgIGZyZWUgKGNvbmZpZy0+Y29uZmlnRmlsZXMpOworYmFpbDI6CisgICAgZnJlZSAoY29uZmlnLT5kaXJzKTsKK2JhaWwxOgorICAgIGZyZWUgKGNvbmZpZyk7CitiYWlsMDoKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK0ZjU3Vic3REZXN0cm95IChGY1N1YnN0ICpzKQoreworICAgIEZjU3Vic3QgKm47CisgICAgCisgICAgd2hpbGUgKHMpCisgICAgeworCW4gPSBzLT5uZXh0OworCUZjVGVzdERlc3Ryb3kgKHMtPnRlc3QpOworCUZjRWRpdERlc3Ryb3kgKHMtPmVkaXQpOworCXMgPSBuOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK0ZjQ29uZmlnRGVzdHJveVN0cmluZ3MgKGNoYXIgKipzdHJpbmdzKQoreworICAgIGNoYXIgICAgKipzOworCisgICAgZm9yIChzID0gc3RyaW5nczsgcyAmJiAqczsgcysrKQorCWZyZWUgKCpzKTsKKyAgICBpZiAoc3RyaW5ncykKKwlmcmVlIChzdHJpbmdzKTsKK30KKyAgICAKK3N0YXRpYyBGY0Jvb2wKK0ZjQ29uZmlnQWRkU3RyaW5nIChjaGFyICoqKnN0cmluZ3MsIGNoYXIgKnN0cmluZykKK3sKKyAgICBpbnQJICAgIG47CisgICAgY2hhciAgICAqKnM7CisgICAgCisgICAgbiA9IDA7CisgICAgZm9yIChzID0gKnN0cmluZ3M7IHMgJiYgKnM7IHMrKykKKwluKys7CisgICAgcyA9IG1hbGxvYyAoKG4gKyAyKSAqIHNpemVvZiAoY2hhciAqKSk7CisgICAgaWYgKCFzKQorCXJldHVybiBGY0ZhbHNlOworICAgIHNbbl0gPSBzdHJpbmc7CisgICAgc1tuKzFdID0gMDsKKyAgICBtZW1jcHkgKHMsICpzdHJpbmdzLCBuICogc2l6ZW9mIChjaGFyICopKTsKKyAgICBmcmVlICgqc3RyaW5ncyk7CisgICAgKnN0cmluZ3MgPSBzOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK3ZvaWQKK0ZjQ29uZmlnRGVzdHJveSAoRmNDb25maWcgKmNvbmZpZykKK3sKKyAgICBGY1NldE5hbWUJc2V0OworICAgIEZjQ29uZmlnRGVzdHJveVN0cmluZ3MgKGNvbmZpZy0+ZGlycyk7CisgICAgRmNDb25maWdEZXN0cm95U3RyaW5ncyAoY29uZmlnLT5jb25maWdGaWxlcyk7CisKKyAgICBmcmVlIChjb25maWctPmNhY2hlKTsKKworICAgIEZjU3Vic3REZXN0cm95IChjb25maWctPnN1YnN0UGF0dGVybik7CisgICAgRmNTdWJzdERlc3Ryb3kgKGNvbmZpZy0+c3Vic3RGb250KTsKKyAgICBmb3IgKHNldCA9IEZjU2V0U3lzdGVtOyBzZXQgPD0gRmNTZXRBcHBsaWNhdGlvbjsgc2V0KyspCisJaWYgKGNvbmZpZy0+Zm9udHNbc2V0XSkKKwkgICAgRmNGb250U2V0RGVzdHJveSAoY29uZmlnLT5mb250c1tzZXRdKTsKK30KKworLyoKKyAqIFNjYW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB0aGUgY29uZmlndXJhdGlvbgorICogYW5kIGJ1aWxkIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZvbnRzLiBVcGRhdGUgdGhlCisgKiBwZXItdXNlciBjYWNoZSBmaWxlIHRvIHJlZmxlY3QgdGhlIG5ldyBjb25maWd1cmF0aW9uCisgKi8KKworRmNCb29sCitGY0NvbmZpZ0J1aWxkRm9udHMgKEZjQ29uZmlnICpjb25maWcpCit7CisgICAgRmNGb250U2V0ICAgKmZvbnRzOworICAgIEZjRmlsZUNhY2hlICpjYWNoZTsKKyAgICBjaGFyCSoqZDsKKworICAgIGZvbnRzID0gRmNGb250U2V0Q3JlYXRlICgpOworICAgIGlmICghZm9udHMpCisJZ290byBiYWlsMDsKKyAgICAKKyAgICBjYWNoZSA9IEZjRmlsZUNhY2hlQ3JlYXRlICgpOworICAgIGlmICghY2FjaGUpCisJZ290byBiYWlsMTsKKworICAgIEZjRmlsZUNhY2hlTG9hZCAoY2FjaGUsIGNvbmZpZy0+Y2FjaGUpOworCisgICAgZm9yIChkID0gY29uZmlnLT5kaXJzOyBkICYmICpkOyBkKyspCisgICAgeworCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0ZPTlRTRVQpCisJICAgIHByaW50ZiAoInNjYW4gZGlyICVzXG4iLCAqZCk7CisJRmNEaXJTY2FuIChmb250cywgY2FjaGUsIGNvbmZpZy0+YmxhbmtzLCAqZCwgRmNGYWxzZSk7CisgICAgfQorICAgIAorICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0ZPTlRTRVQpCisJRmNGb250U2V0UHJpbnQgKGZvbnRzKTsKKworICAgIEZjRmlsZUNhY2hlU2F2ZSAoY2FjaGUsIGNvbmZpZy0+Y2FjaGUpOworICAgIEZjRmlsZUNhY2hlRGVzdHJveSAoY2FjaGUpOworCisgICAgRmNDb25maWdTZXRGb250cyAoY29uZmlnLCBmb250cywgRmNTZXRTeXN0ZW0pOworICAgIAorICAgIHJldHVybiBGY1RydWU7CitiYWlsMToKKyAgICBGY0ZvbnRTZXREZXN0cm95IChmb250cyk7CitiYWlsMDoKKyAgICByZXR1cm4gRmNGYWxzZTsKK30KKworRmNCb29sCitGY0NvbmZpZ1NldEN1cnJlbnQgKEZjQ29uZmlnICpjb25maWcpCit7CisgICAgaWYgKCFjb25maWctPmZvbnRzKQorCWlmICghRmNDb25maWdCdWlsZEZvbnRzIChjb25maWcpKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKworICAgIGlmIChmY0NvbmZpZykKKwlGY0NvbmZpZ0Rlc3Ryb3kgKGZjQ29uZmlnKTsKKyAgICBmY0NvbmZpZyA9IGNvbmZpZzsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitGY0NvbmZpZyAqCitGY0NvbmZpZ0dldEN1cnJlbnQgKHZvaWQpCit7CisgICAgcmV0dXJuIGZjQ29uZmlnOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnQWRkRGlyIChGY0NvbmZpZyAgICAqY29uZmlnLAorCQljb25zdCBjaGFyICAqZCkKK3sKKyAgICBjaGFyICAgICpkaXI7CisgICAgY2hhciAgICAqaDsKKworICAgIGlmICgqZCA9PSAnficpCisgICAgeworCWggPSBnZXRlbnYgKCJIT01FIik7CisJaWYgKCFoKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAoaCkgKyBzdHJsZW4gKGQpKTsKKwlpZiAoIWRpcikKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisJc3RyY3B5IChkaXIsIGgpOworCXN0cmNhdCAoZGlyLCBkKzEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWRpciA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChkKSArIDEpOworCWlmICghZGlyKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlzdHJjcHkgKGRpciwgZCk7CisgICAgfQorICAgIGlmICghRmNDb25maWdBZGRTdHJpbmcgKCZjb25maWctPmRpcnMsIGRpcikpCisgICAgeworCWZyZWUgKGRpcik7CisJcmV0dXJuIEZjRmFsc2U7CisgICAgfQorICAgIHJldHVybiBGY1RydWU7Cit9CisKK2NoYXIgKioKK0ZjQ29uZmlnR2V0RGlycyAoRmNDb25maWcgICAqY29uZmlnKQoreworICAgIGlmICghY29uZmlnKQorICAgIHsKKwljb25maWcgPSBGY0NvbmZpZ0dldEN1cnJlbnQgKCk7CisJaWYgKCFjb25maWcpCisJICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gY29uZmlnLT5kaXJzOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnQWRkQ29uZmlnRmlsZSAoRmNDb25maWcJICAgICpjb25maWcsCisJCSAgICAgICBjb25zdCBjaGFyICAgKmYpCit7CisgICAgY2hhciAgICAqZmlsZTsKKyAgICBmaWxlID0gRmNDb25maWdGaWxlbmFtZSAoZik7CisgICAgaWYgKCFmaWxlKQorCXJldHVybiBGY0ZhbHNlOworICAgIGlmICghRmNDb25maWdBZGRTdHJpbmcgKCZjb25maWctPmNvbmZpZ0ZpbGVzLCBmaWxlKSkKKyAgICB7CisJZnJlZSAoZmlsZSk7CisJcmV0dXJuIEZjRmFsc2U7CisgICAgfQorICAgIHJldHVybiBGY1RydWU7Cit9CisKK2NoYXIgKioKK0ZjQ29uZmlnR2V0Q29uZmlnRmlsZXMgKEZjQ29uZmlnICAgICpjb25maWcpCit7CisgICAgaWYgKCFjb25maWcpCisgICAgeworCWNvbmZpZyA9IEZjQ29uZmlnR2V0Q3VycmVudCAoKTsKKwlpZiAoIWNvbmZpZykKKwkgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBjb25maWctPmNvbmZpZ0ZpbGVzOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnU2V0Q2FjaGUgKEZjQ29uZmlnCSpjb25maWcsCisJCSAgY29uc3QgY2hhcgkqYykKK3sKKyAgICBjaGFyICAgICpuZXc7CisgICAgY2hhciAgICAqaDsKKworICAgIGlmICgqYyA9PSAnficpCisgICAgeworCWggPSBnZXRlbnYgKCJIT01FIik7CisJaWYgKCFoKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwluZXcgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAoaCkgKyBzdHJsZW4gKGMpKTsKKwlpZiAoIW5ldykKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisJc3RyY3B5IChuZXcsIGgpOworCXN0cmNhdCAobmV3LCBjKzEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCW5ldyA9IEZjU3RyQ29weSAoYyk7CisgICAgfQorICAgIGlmIChjb25maWctPmNhY2hlKQorCWZyZWUgKGNvbmZpZy0+Y2FjaGUpOworICAgIGNvbmZpZy0+Y2FjaGUgPSBuZXc7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworY2hhciAqCitGY0NvbmZpZ0dldENhY2hlIChGY0NvbmZpZyAgKmNvbmZpZykKK3sKKyAgICBpZiAoIWNvbmZpZykKKyAgICB7CisJY29uZmlnID0gRmNDb25maWdHZXRDdXJyZW50ICgpOworCWlmICghY29uZmlnKQorCSAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGNvbmZpZy0+Y2FjaGU7Cit9CisKK0ZjRm9udFNldCAqCitGY0NvbmZpZ0dldEZvbnRzIChGY0NvbmZpZwkqY29uZmlnLAorCQkgIEZjU2V0TmFtZQlzZXQpCit7CisgICAgaWYgKCFjb25maWcpCisgICAgeworCWNvbmZpZyA9IEZjQ29uZmlnR2V0Q3VycmVudCAoKTsKKwlpZiAoIWNvbmZpZykKKwkgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBjb25maWctPmZvbnRzW3NldF07Cit9CisKK3ZvaWQKK0ZjQ29uZmlnU2V0Rm9udHMgKEZjQ29uZmlnCSpjb25maWcsCisJCSAgRmNGb250U2V0CSpmb250cywKKwkJICBGY1NldE5hbWUJc2V0KQoreworICAgIGlmIChjb25maWctPmZvbnRzW3NldF0pCisJRmNGb250U2V0RGVzdHJveSAoY29uZmlnLT5mb250c1tzZXRdKTsKKyAgICBjb25maWctPmZvbnRzW3NldF0gPSBmb250czsKK30KKworRmNCbGFua3MgKgorRmNDb25maWdHZXRCbGFua3MgKEZjQ29uZmlnCSpjb25maWcpCit7CisgICAgaWYgKCFjb25maWcpCisgICAgeworCWNvbmZpZyA9IEZjQ29uZmlnR2V0Q3VycmVudCAoKTsKKwlpZiAoIWNvbmZpZykKKwkgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBjb25maWctPmJsYW5rczsKK30KKworRmNCb29sCitGY0NvbmZpZ0FkZEJsYW5rIChGY0NvbmZpZwkqY29uZmlnLAorCQkgIEZjQ2hhcjMyICAgIAlibGFuaykKK3sKKyAgICBGY0JsYW5rcwkqYjsKKyAgICAKKyAgICBiID0gY29uZmlnLT5ibGFua3M7CisgICAgaWYgKCFiKQorICAgIHsKKwliID0gRmNCbGFua3NDcmVhdGUgKCk7CisJaWYgKCFiKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgaWYgKCFGY0JsYW5rc0FkZCAoYiwgYmxhbmspKQorCXJldHVybiBGY0ZhbHNlOworICAgIGNvbmZpZy0+YmxhbmtzID0gYjsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnQWRkRWRpdCAoRmNDb25maWcJKmNvbmZpZywKKwkJIEZjVGVzdAkJKnRlc3QsCisJCSBGY0VkaXQJCSplZGl0LAorCQkgRmNNYXRjaEtpbmQJa2luZCkKK3sKKyAgICBGY1N1YnN0CSpzdWJzdCwgKipwcmV2OworICAgIEZjVGVzdAkqdDsKKyAgICBpbnQJCW51bTsKKworICAgIHN1YnN0ID0gKEZjU3Vic3QgKikgbWFsbG9jIChzaXplb2YgKEZjU3Vic3QpKTsKKyAgICBpZiAoIXN1YnN0KQorCXJldHVybiBGY0ZhbHNlOworICAgIGlmIChraW5kID09IEZjTWF0Y2hQYXR0ZXJuKQorCXByZXYgPSAmY29uZmlnLT5zdWJzdFBhdHRlcm47CisgICAgZWxzZQorCXByZXYgPSAmY29uZmlnLT5zdWJzdEZvbnQ7CisgICAgZm9yICg7ICpwcmV2OyBwcmV2ID0gJigqcHJldiktPm5leHQpOworICAgICpwcmV2ID0gc3Vic3Q7CisgICAgc3Vic3QtPm5leHQgPSAwOworICAgIHN1YnN0LT50ZXN0ID0gdGVzdDsKKyAgICBzdWJzdC0+ZWRpdCA9IGVkaXQ7CisgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfRURJVCkKKyAgICB7CisJcHJpbnRmICgiQWRkIFN1YnN0ICIpOworCUZjU3Vic3RQcmludCAoc3Vic3QpOworICAgIH0KKyAgICBudW0gPSAwOworICAgIGZvciAodCA9IHRlc3Q7IHQ7IHQgPSB0LT5uZXh0KQorCW51bSsrOworICAgIGlmIChjb25maWctPm1heE9iamVjdHMgPCBudW0pCisJY29uZmlnLT5tYXhPYmplY3RzID0gbnVtOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK3R5cGVkZWYgc3RydWN0IF9GY1N1YlN0YXRlIHsKKyAgICBGY1BhdHRlcm5FbHQgICAqZWx0OworICAgIEZjVmFsdWVMaXN0ICAgICp2YWx1ZTsKK30gRmNTdWJTdGF0ZTsKKworc3RhdGljIGNvbnN0IEZjTWF0cml4ICAgIEZjSWRlbnRpdHlNYXRyaXggPSB7IDEsIDAsIDAsIDEgfTsKKworc3RhdGljIEZjVmFsdWUKK0ZjQ29uZmlnUHJvbW90ZSAoRmNWYWx1ZSB2LCBGY1ZhbHVlIHUpCit7CisgICAgaWYgKHYudHlwZSA9PSBGY1R5cGVJbnRlZ2VyKQorICAgIHsKKwl2LnR5cGUgPSBGY1R5cGVEb3VibGU7CisJdi51LmQgPSAoZG91YmxlKSB2LnUuaTsKKyAgICB9CisgICAgZWxzZSBpZiAodi50eXBlID09IEZjVHlwZVZvaWQgJiYgdS50eXBlID09IEZjVHlwZU1hdHJpeCkKKyAgICB7CisJdi51Lm0gPSAoRmNNYXRyaXggKikgJkZjSWRlbnRpdHlNYXRyaXg7CisJdi50eXBlID0gRmNUeXBlTWF0cml4OworICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworRmNCb29sCitGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAoRmNWYWx1ZQltLAorCQkgICAgICBGY09wCW9wLAorCQkgICAgICBGY1ZhbHVlCXYpCit7CisgICAgRmNCb29sICAgIHJldCA9IEZjRmFsc2U7CisgICAgCisgICAgbSA9IEZjQ29uZmlnUHJvbW90ZSAobSwgdik7CisgICAgdiA9IEZjQ29uZmlnUHJvbW90ZSAodiwgbSk7CisgICAgaWYgKG0udHlwZSA9PSB2LnR5cGUpIAorICAgIHsKKwlyZXQgPSBGY0ZhbHNlOworCXN3aXRjaCAobS50eXBlKSB7CisJY2FzZSBGY1R5cGVJbnRlZ2VyOgorCSAgICBicmVhazsJLyogRmNDb25maWdQcm9tb3RlIHByZXZlbnRzIHRoaXMgZnJvbSBoYXBwZW5pbmcgKi8KKwljYXNlIEZjVHlwZURvdWJsZToKKwkgICAgc3dpdGNoIChvcCkgeworCSAgICBjYXNlIEZjT3BFcXVhbDoKKwkgICAgY2FzZSBGY09wQ29udGFpbnM6CisJCXJldCA9IG0udS5kID09IHYudS5kOworCQlicmVhazsKKwkgICAgY2FzZSBGY09wTm90RXF1YWw6ICAgIAorCQlyZXQgPSBtLnUuZCAhPSB2LnUuZDsKKwkJYnJlYWs7CisJICAgIGNhc2UgRmNPcExlc3M6ICAgIAorCQlyZXQgPSBtLnUuZCA8IHYudS5kOworCQlicmVhazsKKwkgICAgY2FzZSBGY09wTGVzc0VxdWFsOiAgICAKKwkJcmV0ID0gbS51LmQgPD0gdi51LmQ7CisJCWJyZWFrOworCSAgICBjYXNlIEZjT3BNb3JlOiAgICAKKwkJcmV0ID0gbS51LmQgPiB2LnUuZDsKKwkJYnJlYWs7CisJICAgIGNhc2UgRmNPcE1vcmVFcXVhbDogICAgCisJCXJldCA9IG0udS5kID49IHYudS5kOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBGY1R5cGVCb29sOgorCSAgICBzd2l0Y2ggKG9wKSB7CisJICAgIGNhc2UgRmNPcEVxdWFsOiAgICAKKwkgICAgY2FzZSBGY09wQ29udGFpbnM6CisJCXJldCA9IG0udS5iID09IHYudS5iOworCQlicmVhazsKKwkgICAgY2FzZSBGY09wTm90RXF1YWw6ICAgIAorCQlyZXQgPSBtLnUuYiAhPSB2LnUuYjsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgRmNUeXBlU3RyaW5nOgorCSAgICBzd2l0Y2ggKG9wKSB7CisJICAgIGNhc2UgRmNPcEVxdWFsOiAgICAKKwkgICAgY2FzZSBGY09wQ29udGFpbnM6CisJCXJldCA9IEZjU3RyQ21wSWdub3JlQ2FzZSAobS51LnMsIHYudS5zKSA9PSAwOworCQlicmVhazsKKwkgICAgY2FzZSBGY09wTm90RXF1YWw6ICAgIAorCQlyZXQgPSBGY1N0ckNtcElnbm9yZUNhc2UgKG0udS5zLCB2LnUucykgIT0gMDsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgRmNUeXBlTWF0cml4OgorCSAgICBzd2l0Y2ggKG9wKSB7CisJICAgIGNhc2UgRmNPcEVxdWFsOgorCSAgICBjYXNlIEZjT3BDb250YWluczoKKwkJcmV0ID0gRmNNYXRyaXhFcXVhbCAobS51Lm0sIHYudS5tKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRmNPcE5vdEVxdWFsOgorCQlyZXQgPSAhRmNNYXRyaXhFcXVhbCAobS51Lm0sIHYudS5tKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgRmNUeXBlQ2hhclNldDoKKwkgICAgc3dpdGNoIChvcCkgeworCSAgICBjYXNlIEZjT3BDb250YWluczoKKwkJLyogbSBjb250YWlucyB2IGlmIHYgLSBtIGlzIGVtcHR5ICovCisJCXJldCA9IEZjQ2hhclNldFN1YnRyYWN0Q291bnQgKHYudS5jLCBtLnUuYykgPT0gMDsKKwkJYnJlYWs7CisJICAgIGNhc2UgRmNPcEVxdWFsOgorCQlyZXQgPSBGY0NoYXJTZXRFcXVhbCAobS51LmMsIHYudS5jKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRmNPcE5vdEVxdWFsOgorCQlyZXQgPSAhRmNDaGFyU2V0RXF1YWwgKG0udS5jLCB2LnUuYyk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIEZjVHlwZVZvaWQ6CisJICAgIHN3aXRjaCAob3ApIHsKKwkgICAgY2FzZSBGY09wRXF1YWw6CisJICAgIGNhc2UgRmNPcENvbnRhaW5zOgorCQlyZXQgPSBGY1RydWU7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKG9wID09IEZjT3BOb3RFcXVhbCkKKwkgICAgcmV0ID0gRmNUcnVlOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBGY1ZhbHVlCitGY0NvbmZpZ0V2YWx1YXRlIChGY1BhdHRlcm4gKnAsIEZjRXhwciAqZSkKK3sKKyAgICBGY1ZhbHVlCXYsIHZsLCB2cjsKKyAgICBGY1Jlc3VsdAlyOworICAgIEZjTWF0cml4CSptOworICAgIEZjQ2hhcjgJKnM7CisgICAgCisgICAgc3dpdGNoIChlLT5vcCkgeworICAgIGNhc2UgRmNPcEludGVnZXI6CisJdi50eXBlID0gRmNUeXBlSW50ZWdlcjsKKwl2LnUuaSA9IGUtPnUuaXZhbDsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BEb3VibGU6CisJdi50eXBlID0gRmNUeXBlRG91YmxlOworCXYudS5kID0gZS0+dS5kdmFsOworCWJyZWFrOworICAgIGNhc2UgRmNPcFN0cmluZzoKKwl2LnR5cGUgPSBGY1R5cGVTdHJpbmc7CisJdi51LnMgPSBlLT51LnN2YWw7CisJdiA9IEZjVmFsdWVTYXZlICh2KTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BNYXRyaXg6CisJdi50eXBlID0gRmNUeXBlTWF0cml4OworCXYudS5tID0gZS0+dS5tdmFsOworCXYgPSBGY1ZhbHVlU2F2ZSAodik7CisJYnJlYWs7CisgICAgY2FzZSBGY09wQ2hhclNldDoKKwl2LnR5cGUgPSBGY1R5cGVDaGFyU2V0OworCXYudS5jID0gZS0+dS5jdmFsOworCXYgPSBGY1ZhbHVlU2F2ZSAodik7CisJYnJlYWs7CisgICAgY2FzZSBGY09wQm9vbDoKKwl2LnR5cGUgPSBGY1R5cGVCb29sOworCXYudS5iID0gZS0+dS5idmFsOworCWJyZWFrOworICAgIGNhc2UgRmNPcEZpZWxkOgorCXIgPSBGY1BhdHRlcm5HZXQgKHAsIGUtPnUuZmllbGQsIDAsICZ2KTsKKwlpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQorCSAgICB2LnR5cGUgPSBGY1R5cGVWb2lkOworCWJyZWFrOworICAgIGNhc2UgRmNPcENvbnN0OgorCWlmIChGY05hbWVDb25zdGFudCAoZS0+dS5jb25zdGFudCwgJnYudS5pKSkKKwkgICAgdi50eXBlID0gRmNUeXBlSW50ZWdlcjsKKwllbHNlCisJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJYnJlYWs7CisgICAgY2FzZSBGY09wUXVlc3Q6CisJdmwgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCBlLT51LnRyZWUubGVmdCk7CisJaWYgKHZsLnR5cGUgPT0gRmNUeXBlQm9vbCkKKwl7CisJICAgIGlmICh2bC51LmIpCisJCXYgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCBlLT51LnRyZWUucmlnaHQtPnUudHJlZS5sZWZ0KTsKKwkgICAgZWxzZQorCQl2ID0gRmNDb25maWdFdmFsdWF0ZSAocCwgZS0+dS50cmVlLnJpZ2h0LT51LnRyZWUucmlnaHQpOworCX0KKwllbHNlCisJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJRmNWYWx1ZURlc3Ryb3kgKHZsKTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BPcjoKKyAgICBjYXNlIEZjT3BBbmQ6CisgICAgY2FzZSBGY09wRXF1YWw6CisgICAgY2FzZSBGY09wQ29udGFpbnM6CisgICAgY2FzZSBGY09wTm90RXF1YWw6CisgICAgY2FzZSBGY09wTGVzczoKKyAgICBjYXNlIEZjT3BMZXNzRXF1YWw6CisgICAgY2FzZSBGY09wTW9yZToKKyAgICBjYXNlIEZjT3BNb3JlRXF1YWw6CisgICAgY2FzZSBGY09wUGx1czoKKyAgICBjYXNlIEZjT3BNaW51czoKKyAgICBjYXNlIEZjT3BUaW1lczoKKyAgICBjYXNlIEZjT3BEaXZpZGU6CisJdmwgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCBlLT51LnRyZWUubGVmdCk7CisJdnIgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCBlLT51LnRyZWUucmlnaHQpOworCXZsID0gRmNDb25maWdQcm9tb3RlICh2bCwgdnIpOworCXZyID0gRmNDb25maWdQcm9tb3RlICh2ciwgdmwpOworCWlmICh2bC50eXBlID09IHZyLnR5cGUpCisJeworCSAgICBzd2l0Y2ggKHZsLnR5cGUpIHsKKwkgICAgY2FzZSBGY1R5cGVEb3VibGU6CisJCXN3aXRjaCAoZS0+b3ApIHsKKwkJY2FzZSBGY09wUGx1czoJICAgCisJCSAgICB2LnR5cGUgPSBGY1R5cGVEb3VibGU7CisJCSAgICB2LnUuZCA9IHZsLnUuZCArIHZyLnUuZDsgCisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wTWludXM6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVEb3VibGU7CisJCSAgICB2LnUuZCA9IHZsLnUuZCAtIHZyLnUuZDsgCisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wVGltZXM6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVEb3VibGU7CisJCSAgICB2LnUuZCA9IHZsLnUuZCAqIHZyLnUuZDsgCisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wRGl2aWRlOgorCQkgICAgdi50eXBlID0gRmNUeXBlRG91YmxlOworCQkgICAgdi51LmQgPSB2bC51LmQgLyB2ci51LmQ7IAorCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcEVxdWFsOgorCQljYXNlIEZjT3BDb250YWluczoKKwkJICAgIHYudHlwZSA9IEZjVHlwZUJvb2w7IAorCQkgICAgdi51LmIgPSB2bC51LmQgPT0gdnIudS5kOworCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcE5vdEVxdWFsOiAgICAKKwkJICAgIHYudHlwZSA9IEZjVHlwZUJvb2w7IAorCQkgICAgdi51LmIgPSB2bC51LmQgIT0gdnIudS5kOworCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcExlc3M6ICAgIAorCQkgICAgdi50eXBlID0gRmNUeXBlQm9vbDsgCisJCSAgICB2LnUuYiA9IHZsLnUuZCA8IHZyLnUuZDsKKwkJICAgIGJyZWFrOworCQljYXNlIEZjT3BMZXNzRXF1YWw6ICAgIAorCQkgICAgdi50eXBlID0gRmNUeXBlQm9vbDsgCisJCSAgICB2LnUuYiA9IHZsLnUuZCA8PSB2ci51LmQ7CisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wTW9yZTogICAgCisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOyAKKwkJICAgIHYudS5iID0gdmwudS5kID4gdnIudS5kOworCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcE1vcmVFcXVhbDogICAgCisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOyAKKwkJICAgIHYudS5iID0gdmwudS5kID49IHZyLnUuZDsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgdi50eXBlID0gRmNUeXBlVm9pZDsgCisJCSAgICBicmVhazsKKwkJfQorCQlpZiAodi50eXBlID09IEZjVHlwZURvdWJsZSAmJgorCQkgICAgdi51LmQgPT0gKGRvdWJsZSkgKGludCkgdi51LmQpCisJCXsKKwkJICAgIHYudHlwZSA9IEZjVHlwZUludGVnZXI7CisJCSAgICB2LnUuaSA9IChpbnQpIHYudS5kOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIEZjVHlwZUJvb2w6CisJCXN3aXRjaCAoZS0+b3ApIHsKKwkJY2FzZSBGY09wT3I6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworCQkgICAgdi51LmIgPSB2bC51LmIgfHwgdnIudS5iOworCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcEFuZDoKKwkJICAgIHYudHlwZSA9IEZjVHlwZUJvb2w7CisJCSAgICB2LnUuYiA9IHZsLnUuYiAmJiB2ci51LmI7CisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wRXF1YWw6CisJCWNhc2UgRmNPcENvbnRhaW5zOgorCQkgICAgdi50eXBlID0gRmNUeXBlQm9vbDsKKwkJICAgIHYudS5iID0gdmwudS5iID09IHZyLnUuYjsKKwkJICAgIGJyZWFrOworCQljYXNlIEZjT3BOb3RFcXVhbDoKKwkJICAgIHYudHlwZSA9IEZjVHlwZUJvb2w7CisJCSAgICB2LnUuYiA9IHZsLnUuYiAhPSB2ci51LmI7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7IAorCQkgICAgYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgRmNUeXBlU3RyaW5nOgorCQlzd2l0Y2ggKGUtPm9wKSB7CisJCWNhc2UgRmNPcEVxdWFsOgorCQljYXNlIEZjT3BDb250YWluczoKKwkJICAgIHYudHlwZSA9IEZjVHlwZUJvb2w7CisJCSAgICB2LnUuYiA9IEZjU3RyQ21wSWdub3JlQ2FzZSAodmwudS5zLCB2ci51LnMpID09IDA7CisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wTm90RXF1YWw6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworCQkgICAgdi51LmIgPSBGY1N0ckNtcElnbm9yZUNhc2UgKHZsLnUucywgdnIudS5zKSAhPSAwOworCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcFBsdXM6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVTdHJpbmc7CisJCSAgICB2LnUucyA9IEZjU3RyUGx1cyAodmwudS5zLCB2ci51LnMpOworCQkgICAgaWYgKCF2LnUucykKKwkJCXYudHlwZSA9IEZjVHlwZVZvaWQ7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJCSAgICBicmVhazsKKwkJfQorCSAgICBjYXNlIEZjVHlwZU1hdHJpeDoKKwkJc3dpdGNoIChlLT5vcCkgeworCQljYXNlIEZjT3BFcXVhbDoKKwkJY2FzZSBGY09wQ29udGFpbnM6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworCQkgICAgdi51LmIgPSBGY01hdHJpeEVxdWFsICh2bC51Lm0sIHZyLnUubSk7CisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wTm90RXF1YWw6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworCQkgICAgdi51LmIgPSBGY01hdHJpeEVxdWFsICh2bC51Lm0sIHZyLnUubSk7CisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wVGltZXM6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVNYXRyaXg7CisJCSAgICBtID0gbWFsbG9jIChzaXplb2YgKEZjTWF0cml4KSk7CisJCSAgICBpZiAobSkKKwkJICAgIHsKKwkJCUZjTWVtQWxsb2MgKEZDX01FTV9NQVRSSVgsIHNpemVvZiAoRmNNYXRyaXgpKTsKKwkJCUZjTWF0cml4TXVsdGlwbHkgKG0sIHZsLnUubSwgdnIudS5tKTsKKwkJCXYudS5tID0gbTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCXYudHlwZSA9IEZjVHlwZVZvaWQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJCSAgICBicmVhazsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBGY1R5cGVDaGFyU2V0OgorCQlzd2l0Y2ggKGUtPm9wKSB7CisJCWNhc2UgRmNPcENvbnRhaW5zOgorCQkgICAgLyogdmwgY29udGFpbnMgdnIgaWYgdnIgLSB2bCBpcyBlbXB0eSAqLworCQkgICAgdi50eXBlID0gRmNUeXBlQm9vbDsKKwkJICAgIHYudS5iID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAodnIudS5jLCB2bC51LmMpID09IDA7CisJCSAgICBicmVhazsKKwkJY2FzZSBGY09wRXF1YWw6CisJCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworCQkgICAgdi51LmIgPSBGY0NoYXJTZXRFcXVhbCAodmwudS5jLCB2ci51LmMpOworCQkgICAgYnJlYWs7CisJCWNhc2UgRmNPcE5vdEVxdWFsOgorCQkgICAgdi50eXBlID0gRmNUeXBlQm9vbDsKKwkJICAgIHYudS5iID0gIUZjQ2hhclNldEVxdWFsICh2bC51LmMsIHZyLnUuYyk7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJCSAgICBicmVhazsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJdi50eXBlID0gRmNUeXBlVm9pZDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJZWxzZQorCSAgICB2LnR5cGUgPSBGY1R5cGVWb2lkOworCUZjVmFsdWVEZXN0cm95ICh2bCk7CisJRmNWYWx1ZURlc3Ryb3kgKHZyKTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BOb3Q6CisJdmwgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCBlLT51LnRyZWUubGVmdCk7CisJc3dpdGNoICh2bC50eXBlKSB7CisJY2FzZSBGY1R5cGVCb29sOgorCSAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworCSAgICB2LnUuYiA9ICF2bC51LmI7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJICAgIGJyZWFrOworCX0KKwlGY1ZhbHVlRGVzdHJveSAodmwpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJdi50eXBlID0gRmNUeXBlVm9pZDsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBGY1ZhbHVlTGlzdCAqCitGY0NvbmZpZ01hdGNoVmFsdWVMaXN0IChGY1BhdHRlcm4JKnAsCisJCQlGY1Rlc3QJCSp0LAorCQkJRmNWYWx1ZUxpc3QJKnYpCit7CisgICAgRmNWYWx1ZUxpc3QgICAgKnJldCA9IDA7CisgICAgRmNWYWx1ZQkgICAgdmFsdWUgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCB0LT5leHByKTsKKyAgICAKKyAgICBmb3IgKDsgdjsgdiA9IHYtPm5leHQpCisgICAgeworCWlmIChGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAodi0+dmFsdWUsIHQtPm9wLCB2YWx1ZSkpCisJeworCSAgICBpZiAoIXJldCkKKwkJcmV0ID0gdjsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKHQtPnF1YWwgPT0gRmNRdWFsQWxsKQorCSAgICB7CisJCXJldCA9IDA7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgICBGY1ZhbHVlRGVzdHJveSAodmFsdWUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBGY1ZhbHVlTGlzdCAqCitGY0NvbmZpZ1ZhbHVlcyAoRmNQYXR0ZXJuICpwLCBGY0V4cHIgKmUpCit7CisgICAgRmNWYWx1ZUxpc3QJKmw7CisgICAgCisgICAgaWYgKCFlKQorCXJldHVybiAwOworICAgIGwgPSAoRmNWYWx1ZUxpc3QgKikgbWFsbG9jIChzaXplb2YgKEZjVmFsdWVMaXN0KSk7CisgICAgaWYgKCFsKQorCXJldHVybiAwOworICAgIEZjTWVtQWxsb2MgKEZDX01FTV9WQUxMSVNULCBzaXplb2YgKEZjVmFsdWVMaXN0KSk7CisgICAgaWYgKGUtPm9wID09IEZjT3BDb21tYSkKKyAgICB7CisJbC0+dmFsdWUgPSBGY0NvbmZpZ0V2YWx1YXRlIChwLCBlLT51LnRyZWUubGVmdCk7CisJbC0+bmV4dCAgPSBGY0NvbmZpZ1ZhbHVlcyAocCwgZS0+dS50cmVlLnJpZ2h0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlsLT52YWx1ZSA9IEZjQ29uZmlnRXZhbHVhdGUgKHAsIGUpOworCWwtPm5leHQgID0gMDsKKyAgICB9CisgICAgd2hpbGUgKGwtPnZhbHVlLnR5cGUgPT0gRmNUeXBlVm9pZCkKKyAgICB7CisJRmNWYWx1ZUxpc3QJKm5leHQgPSBsLT5uZXh0OworCQorCUZjTWVtRnJlZSAoRkNfTUVNX1ZBTExJU1QsIHNpemVvZiAoRmNWYWx1ZUxpc3QpKTsKKwlmcmVlIChsKTsKKwlsID0gbmV4dDsKKyAgICB9CisgICAgcmV0dXJuIGw7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjQ29uZmlnQWRkIChGY1ZhbHVlTGlzdCAgICAqKmhlYWQsCisJICAgICBGY1ZhbHVlTGlzdCAgICAqcG9zaXRpb24sCisJICAgICBGY0Jvb2wJICAgIGFwcGVuZCwKKwkgICAgIEZjVmFsdWVMaXN0ICAgICpuZXcpCit7CisgICAgRmNWYWx1ZUxpc3QgICAgKipwcmV2LCAqbGFzdDsKKyAgICAKKyAgICBpZiAoYXBwZW5kKQorICAgIHsKKwlpZiAocG9zaXRpb24pCisJICAgIHByZXYgPSAmcG9zaXRpb24tPm5leHQ7CisJZWxzZQorCSAgICBmb3IgKHByZXYgPSBoZWFkOyAqcHJldjsgcHJldiA9ICYoKnByZXYpLT5uZXh0KQorCQk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKHBvc2l0aW9uKQorCXsKKwkgICAgZm9yIChwcmV2ID0gaGVhZDsgKnByZXY7IHByZXYgPSAmKCpwcmV2KS0+bmV4dCkKKwkgICAgeworCQlpZiAoKnByZXYgPT0gcG9zaXRpb24pCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIHByZXYgPSBoZWFkOworCisJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfRURJVCkKKwl7CisJICAgIGlmICghKnByZXYpCisJCXByaW50ZiAoInBvc2l0aW9uIG5vdCBvbiBsaXN0XG4iKTsKKwl9CisgICAgfQorCisgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfRURJVCkKKyAgICB7CisJcHJpbnRmICgiJXMgbGlzdCBiZWZvcmUgIiwgYXBwZW5kID8gIkFwcGVuZCIgOiAiUHJlcGVuZCIpOworCUZjVmFsdWVMaXN0UHJpbnQgKCpoZWFkKTsKKwlwcmludGYgKCJcbiIpOworICAgIH0KKyAgICAKKyAgICBpZiAobmV3KQorICAgIHsKKwlsYXN0ID0gbmV3OworCXdoaWxlIChsYXN0LT5uZXh0KQorCSAgICBsYXN0ID0gbGFzdC0+bmV4dDsKKyAgICAKKwlsYXN0LT5uZXh0ID0gKnByZXY7CisJKnByZXYgPSBuZXc7CisgICAgfQorICAgIAorICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0VESVQpCisgICAgeworCXByaW50ZiAoIiVzIGxpc3QgYWZ0ZXIgIiwgYXBwZW5kID8gIkFwcGVuZCIgOiAiUHJlcGVuZCIpOworCUZjVmFsdWVMaXN0UHJpbnQgKCpoZWFkKTsKKwlwcmludGYgKCJcbiIpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitzdGF0aWMgdm9pZAorRmNDb25maWdEZWwgKEZjVmFsdWVMaXN0ICAgICoqaGVhZCwKKwkgICAgIEZjVmFsdWVMaXN0ICAgICpwb3NpdGlvbikKK3sKKyAgICBGY1ZhbHVlTGlzdCAgICAqKnByZXY7CisKKyAgICBmb3IgKHByZXYgPSBoZWFkOyAqcHJldjsgcHJldiA9ICYoKnByZXYpLT5uZXh0KQorICAgIHsKKwlpZiAoKnByZXYgPT0gcG9zaXRpb24pCisJeworCSAgICAqcHJldiA9IHBvc2l0aW9uLT5uZXh0OworCSAgICBwb3NpdGlvbi0+bmV4dCA9IDA7CisJICAgIEZjVmFsdWVMaXN0RGVzdHJveSAocG9zaXRpb24pOworCSAgICBicmVhazsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorRmNDb25maWdQYXR0ZXJuQWRkIChGY1BhdHRlcm4JKnAsCisJCSAgICBjb25zdCBjaGFyCSpvYmplY3QsCisJCSAgICBGY1ZhbHVlTGlzdAkqbGlzdCwKKwkJICAgIEZjQm9vbAlhcHBlbmQpCit7CisgICAgaWYgKGxpc3QpCisgICAgeworCUZjUGF0dGVybkVsdCAgICAqZSA9IEZjUGF0dGVybkZpbmQgKHAsIG9iamVjdCwgRmNUcnVlKTsKKyAgICAKKwlpZiAoIWUpCisJICAgIHJldHVybjsKKwlGY0NvbmZpZ0FkZCAoJmUtPnZhbHVlcywgMCwgYXBwZW5kLCBsaXN0KTsKKyAgICB9Cit9CisKKy8qCisgKiBEZWxldGUgYWxsIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBmaWVsZAorICovCitzdGF0aWMgdm9pZAorRmNDb25maWdQYXR0ZXJuRGVsIChGY1BhdHRlcm4JKnAsCisJCSAgICBjb25zdCBjaGFyCSpvYmplY3QpCit7CisgICAgRmNQYXR0ZXJuRWx0ICAgICplID0gRmNQYXR0ZXJuRmluZCAocCwgb2JqZWN0LCBGY0ZhbHNlKTsKKyAgICBpZiAoIWUpCisJcmV0dXJuOworICAgIHdoaWxlIChlLT52YWx1ZXMpCisJRmNDb25maWdEZWwgKCZlLT52YWx1ZXMsIGUtPnZhbHVlcyk7Cit9CisKK3N0YXRpYyB2b2lkCitGY0NvbmZpZ1BhdHRlcm5DYW5vbiAoRmNQYXR0ZXJuCSAgICAqcCwKKwkJICAgICAgY29uc3QgY2hhciAgICAqb2JqZWN0KQoreworICAgIEZjUGF0dGVybkVsdCAgICAqZSA9IEZjUGF0dGVybkZpbmQgKHAsIG9iamVjdCwgRmNGYWxzZSk7CisgICAgaWYgKCFlKQorCXJldHVybjsKKyAgICBpZiAoIWUtPnZhbHVlcykKKwlGY1BhdHRlcm5EZWwgKHAsIG9iamVjdCk7Cit9CisKK0ZjQm9vbAorRmNDb25maWdTdWJzdGl0dXRlIChGY0NvbmZpZwkqY29uZmlnLAorCQkgICAgRmNQYXR0ZXJuCSpwLAorCQkgICAgRmNNYXRjaEtpbmQJa2luZCkKK3sKKyAgICBGY1N1YnN0CSAgICAqczsKKyAgICBGY1N1YlN0YXRlCSAgICAqc3Q7CisgICAgaW50CQkgICAgaTsKKyAgICBGY1Rlc3QJICAgICp0OworICAgIEZjRWRpdAkgICAgKmU7CisgICAgRmNWYWx1ZUxpc3QJICAgICpsOworCisgICAgaWYgKCFjb25maWcpCisgICAgeworCWNvbmZpZyA9IEZjQ29uZmlnR2V0Q3VycmVudCAoKTsKKwlpZiAoIWNvbmZpZykKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisgICAgfQorCisgICAgc3QgPSAoRmNTdWJTdGF0ZSAqKSBtYWxsb2MgKGNvbmZpZy0+bWF4T2JqZWN0cyAqIHNpemVvZiAoRmNTdWJTdGF0ZSkpOworICAgIGlmICghc3QgJiYgY29uZmlnLT5tYXhPYmplY3RzKQorCXJldHVybiBGY0ZhbHNlOworICAgIEZjTWVtQWxsb2MgKEZDX01FTV9TVUJTVEFURSwgY29uZmlnLT5tYXhPYmplY3RzICogc2l6ZW9mIChGY1N1YlN0YXRlKSk7CisKKyAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19FRElUKQorICAgIHsKKwlwcmludGYgKCJGY0NvbmZpZ1N1YnN0aXR1dGUgIik7CisJRmNQYXR0ZXJuUHJpbnQgKHApOworICAgIH0KKyAgICBpZiAoa2luZCA9PSBGY01hdGNoUGF0dGVybikKKwlzID0gY29uZmlnLT5zdWJzdFBhdHRlcm47CisgICAgZWxzZQorCXMgPSBjb25maWctPnN1YnN0Rm9udDsKKyAgICBmb3IgKDsgczsgcyA9IHMtPm5leHQpCisgICAgeworCS8qCisJICogQ2hlY2sgdGhlIHRlc3RzIHRvIHNlZSBpZgorCSAqIHRoZXkgYWxsIG1hdGNoIHRoZSBwYXR0ZXJuCisJICovCisJZm9yICh0ID0gcy0+dGVzdCwgaSA9IDA7IHQ7IHQgPSB0LT5uZXh0LCBpKyspCisJeworCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19FRElUKQorCSAgICB7CisJCXByaW50ZiAoIkZjQ29uZmlnU3Vic3RpdHV0ZSB0ZXN0ICIpOworCQlGY1Rlc3RQcmludCAodCk7CisJICAgIH0KKwkgICAgc3RbaV0uZWx0ID0gRmNQYXR0ZXJuRmluZCAocCwgdC0+ZmllbGQsIEZjRmFsc2UpOworCSAgICAvKgorCSAgICAgKiBJZiB0aGVyZSdzIG5vIHN1Y2ggZmllbGQgaW4gdGhlIGZvbnQsCisJICAgICAqIHRoZW4gRmNRdWFsQWxsIG1hdGNoZXMgd2hpbGUgRmNRdWFsQW55IGRvZXMgbm90CisJICAgICAqLworCSAgICBpZiAoIXN0W2ldLmVsdCkKKwkgICAgeworCQlpZiAodC0+cXVhbCA9PSBGY1F1YWxBbGwpCisJCXsKKwkJICAgIHN0W2ldLnZhbHVlID0gMDsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJCWVsc2UKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIC8qCisJICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1hdGNoLCBtYXJrIHRoZSBsb2NhdGlvbgorCSAgICAgKiB0byBhcHBseSBtYXRjaC1yZWxhdGl2ZSBlZGl0cworCSAgICAgKi8KKwkgICAgc3RbaV0udmFsdWUgPSBGY0NvbmZpZ01hdGNoVmFsdWVMaXN0IChwLCB0LCBzdFtpXS5lbHQtPnZhbHVlcyk7CisJICAgIGlmICghc3RbaV0udmFsdWUpCisJCWJyZWFrOworCX0KKwlpZiAodCkKKwl7CisJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0VESVQpCisJCXByaW50ZiAoIk5vIG1hdGNoXG4iKTsKKwkgICAgY29udGludWU7CisJfQorCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0VESVQpCisJeworCSAgICBwcmludGYgKCJTdWJzdGl0dXRlICIpOworCSAgICBGY1N1YnN0UHJpbnQgKHMpOworCX0KKwlmb3IgKGUgPSBzLT5lZGl0OyBlOyBlID0gZS0+bmV4dCkKKwl7CisJICAgIC8qCisJICAgICAqIEV2YWx1YXRlIHRoZSBsaXN0IG9mIGV4cHJlc3Npb25zCisJICAgICAqLworCSAgICBsID0gRmNDb25maWdWYWx1ZXMgKHAsIGUtPmV4cHIpOworCSAgICAvKgorCSAgICAgKiBMb2NhdGUgYW55IHRlc3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGQKKwkgICAgICovCisJICAgIGZvciAodCA9IHMtPnRlc3QsIGkgPSAwOyB0OyB0ID0gdC0+bmV4dCwgaSsrKQorCQlpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAodC0+ZmllbGQsIGUtPmZpZWxkKSkKKwkJICAgIGJyZWFrOworCSAgICBzd2l0Y2ggKGUtPm9wKSB7CisJICAgIGNhc2UgRmNPcEFzc2lnbjoKKwkJLyoKKwkJICogSWYgdGhlcmUgd2FzIGEgdGVzdCwgdGhlbiByZXBsYWNlIHRoZSBtYXRjaGVkCisJCSAqIHZhbHVlIHdpdGggdGhlIG5ldyBsaXN0IG9mIHZhbHVlcworCQkgKi8KKwkJaWYgKHQpCisJCXsKKwkJICAgIEZjVmFsdWVMaXN0CSp0aGlzVmFsdWUgPSBzdFtpXS52YWx1ZTsKKwkJICAgIEZjVmFsdWVMaXN0CSpuZXh0VmFsdWUgPSB0aGlzVmFsdWUgPyB0aGlzVmFsdWUtPm5leHQgOiAwOworCQkgICAgCisJCSAgICAvKgorCQkgICAgICogQXBwZW5kIHRoZSBuZXcgbGlzdCBvZiB2YWx1ZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgdmFsdWUKKwkJICAgICAqLworCQkgICAgRmNDb25maWdBZGQgKCZzdFtpXS5lbHQtPnZhbHVlcywgdGhpc1ZhbHVlLCBGY1RydWUsIGwpOworCQkgICAgLyoKKwkJICAgICAqIEFkanVzdCBhbnkgcG9pbnRlcnMgaW50byB0aGUgdmFsdWUgbGlzdCB0byBlbnN1cmUKKwkJICAgICAqIGZ1dHVyZSBlZGl0cyBvY2N1ciBhdCB0aGUgc2FtZSBwbGFjZQorCQkgICAgICovCisJCSAgICBmb3IgKHQgPSBzLT50ZXN0LCBpID0gMDsgdDsgdCA9IHQtPm5leHQsIGkrKykKKwkJICAgIHsKKwkJCWlmIChzdFtpXS52YWx1ZSA9PSB0aGlzVmFsdWUpCisJCQkgICAgc3RbaV0udmFsdWUgPSBuZXh0VmFsdWU7CisJCSAgICB9CisJCSAgICAvKgorCQkgICAgICogRGVsZXRlIHRoZSBtYXJrZWQgdmFsdWUKKwkJICAgICAqLworCQkgICAgRmNDb25maWdEZWwgKCZzdFtpXS5lbHQtPnZhbHVlcywgdGhpc1ZhbHVlKTsKKwkJICAgIGJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAuLi4gKi8KKwkgICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZToKKwkJLyoKKwkJICogRGVsZXRlIGFsbCBvZiB0aGUgdmFsdWVzIGFuZCBpbnNlcnQKKwkJICogdGhlIG5ldyBzZXQKKwkJICovCisJCUZjQ29uZmlnUGF0dGVybkRlbCAocCwgZS0+ZmllbGQpOworCQlGY0NvbmZpZ1BhdHRlcm5BZGQgKHAsIGUtPmZpZWxkLCBsLCBGY1RydWUpOworCQkvKgorCQkgKiBBZGp1c3QgYW55IHBvaW50ZXJzIGludG8gdGhlIHZhbHVlIGxpc3QgYXMgdGhleSBubworCQkgKiBsb25nZXIgcG9pbnQgdG8gYW55dGhpbmcgdmFsaWQKKwkJICovCisJCWlmICh0KQorCQl7CisJCSAgICBGY1BhdHRlcm5FbHQgICAgKnRoaXNFbHQgPSBzdFtpXS5lbHQ7CisJCSAgICBmb3IgKHQgPSBzLT50ZXN0LCBpID0gMDsgdDsgdCA9IHQtPm5leHQsIGkrKykKKwkJICAgIHsKKwkJCWlmIChzdFtpXS5lbHQgPT0gdGhpc0VsdCkKKwkJCSAgICBzdFtpXS52YWx1ZSA9IDA7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgRmNPcFByZXBlbmQ6CisJCWlmICh0KQorCQl7CisJCSAgICBGY0NvbmZpZ0FkZCAoJnN0W2ldLmVsdC0+dmFsdWVzLCBzdFtpXS52YWx1ZSwgRmNGYWxzZSwgbCk7CisJCSAgICBicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggLi4uICovCisJICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDoKKwkJRmNDb25maWdQYXR0ZXJuQWRkIChwLCBlLT5maWVsZCwgbCwgRmNGYWxzZSk7CisJCWJyZWFrOworCSAgICBjYXNlIEZjT3BBcHBlbmQ6CisJCWlmICh0KQorCQl7CisJCSAgICBGY0NvbmZpZ0FkZCAoJnN0W2ldLmVsdC0+dmFsdWVzLCBzdFtpXS52YWx1ZSwgRmNUcnVlLCBsKTsKKwkJICAgIGJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAuLi4gKi8KKwkgICAgY2FzZSBGY09wQXBwZW5kTGFzdDoKKwkJRmNDb25maWdQYXR0ZXJuQWRkIChwLCBlLT5maWVsZCwgbCwgRmNUcnVlKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJfQorCS8qCisJICogTm93IGdvIHRocm91Z2ggdGhlIHBhdHRlcm4gYW5kIGVsaW1pbmF0ZQorCSAqIGFueSBwcm9wZXJ0aWVzIHdpdGhvdXQgZGF0YQorCSAqLworCWZvciAoZSA9IHMtPmVkaXQ7IGU7IGUgPSBlLT5uZXh0KQorCSAgICBGY0NvbmZpZ1BhdHRlcm5DYW5vbiAocCwgZS0+ZmllbGQpOworCisJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfRURJVCkKKwl7CisJICAgIHByaW50ZiAoIkZjQ29uZmlnU3Vic3RpdHV0ZSBlZGl0Iik7CisJICAgIEZjUGF0dGVyblByaW50IChwKTsKKwl9CisgICAgfQorICAgIEZjTWVtRnJlZSAoRkNfTUVNX1NVQlNUQVRFLCBjb25maWctPm1heE9iamVjdHMgKiBzaXplb2YgKEZjU3ViU3RhdGUpKTsKKyAgICBmcmVlIChzdCk7CisgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfRURJVCkKKyAgICB7CisJcHJpbnRmICgiRmNDb25maWdTdWJzdGl0dXRlIGRvbmUiKTsKKwlGY1BhdHRlcm5QcmludCAocCk7CisgICAgfQorICAgIHJldHVybiBGY1RydWU7Cit9CisKKyNpZm5kZWYgRk9OVENPTkZJR19QQVRICisjZGVmaW5lIEZPTlRDT05GSUdfUEFUSAkiL2V0Yy9mb250cyIKKyNlbmRpZgorCisjaWZuZGVmIEZPTlRDT05GSUdfRklMRQorI2RlZmluZSBGT05UQ09ORklHX0ZJTEUJImZvbnRzLmNvbmYiCisjZW5kaWYKKworc3RhdGljIGNoYXIgKgorRmNDb25maWdGaWxlRXhpc3RzIChjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisgICAgY2hhciAgICAqcGF0aDsKKworICAgIGlmICghZGlyKQorCWRpciA9ICIiOworICAgIHBhdGggPSBtYWxsb2MgKHN0cmxlbiAoZGlyKSArIDEgKyBzdHJsZW4gKGZpbGUpICsgMSk7CisgICAgaWYgKCFwYXRoKQorCXJldHVybiAwOworCisgICAgc3RyY3B5IChwYXRoLCBkaXIpOworICAgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGEgc2luZ2xlIHNlcGFyYXRpbmcgLyAqLworICAgIGlmICgoIXBhdGhbMF0gfHwgcGF0aFtzdHJsZW4ocGF0aCktMV0gIT0gJy8nKSAmJiBmaWxlWzBdICE9ICcvJykKKwlzdHJjYXQgKHBhdGgsICIvIik7CisgICAgc3RyY2F0IChwYXRoLCBmaWxlKTsKKworICAgIGlmIChhY2Nlc3MgKHBhdGgsIFJfT0spID09IDApCisJcmV0dXJuIHBhdGg7CisgICAgCisgICAgZnJlZSAocGF0aCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICoqCitGY0NvbmZpZ0dldFBhdGggKHZvaWQpCit7CisgICAgY2hhciAgICAqKnBhdGg7CisgICAgY2hhciAgICAqZW52LCAqZSwgKmNvbG9uOworICAgIGNoYXIgICAgKmRpcjsKKyAgICBpbnQJICAgIG5wYXRoOworICAgIGludAkgICAgaTsKKworICAgIG5wYXRoID0gMjsJLyogZGVmYXVsdCBkaXIgKyBudWxsICovCisgICAgZW52ID0gZ2V0ZW52ICgiRk9OVENPTkZJR19QQVRIIik7CisgICAgaWYgKGVudikKKyAgICB7CisJZSA9IGVudjsKKwlucGF0aCsrOworCXdoaWxlICgqZSkKKwkgICAgaWYgKCplKysgPT0gJzonKQorCQlucGF0aCsrOworICAgIH0KKyAgICBwYXRoID0gY2FsbG9jIChucGF0aCwgc2l6ZW9mIChjaGFyICopKTsKKyAgICBpZiAoIXBhdGgpCisJZ290byBiYWlsMDsKKyAgICBpID0gMDsKKworICAgIGlmIChlbnYpCisgICAgeworCWUgPSBlbnY7CisJd2hpbGUgKCplKSAKKwl7CisJICAgIGNvbG9uID0gc3RyY2hyIChlLCAnOicpOworCSAgICBpZiAoIWNvbG9uKQorCQljb2xvbiA9IGUgKyBzdHJsZW4gKGUpOworCSAgICBwYXRoW2ldID0gbWFsbG9jIChjb2xvbiAtIGUgKyAxKTsKKwkgICAgaWYgKCFwYXRoW2ldKQorCQlnb3RvIGJhaWwxOworCSAgICBzdHJuY3B5IChwYXRoW2ldLCBlLCBjb2xvbiAtIGUpOworCSAgICBwYXRoW2ldW2NvbG9uIC0gZV0gPSAnXDAnOworCSAgICBpZiAoKmNvbG9uKQorCQllID0gY29sb24gKyAxOworCSAgICBlbHNlCisJCWUgPSBjb2xvbjsKKwkgICAgaSsrOworCX0KKyAgICB9CisgICAgCisgICAgZGlyID0gRk9OVENPTkZJR19QQVRIOworICAgIHBhdGhbaV0gPSBtYWxsb2MgKHN0cmxlbiAoZGlyKSArIDEpOworICAgIGlmICghcGF0aFtpXSkKKwlnb3RvIGJhaWwxOworICAgIHN0cmNweSAocGF0aFtpXSwgZGlyKTsKKyAgICByZXR1cm4gcGF0aDsKKworYmFpbDE6CisgICAgZm9yIChpID0gMDsgcGF0aFtpXTsgaSsrKQorCWZyZWUgKHBhdGhbaV0pOworICAgIGZyZWUgKHBhdGgpOworYmFpbDA6CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitGY0NvbmZpZ0ZyZWVQYXRoIChjaGFyICoqcGF0aCkKK3sKKyAgICBjaGFyICAgICoqcDsKKworICAgIGZvciAocCA9IHBhdGg7ICpwOyBwKyspCisJZnJlZSAoKnApOworICAgIGZyZWUgKHBhdGgpOworfQorCitjaGFyICoKK0ZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgICBjaGFyICAgICpmaWxlLCAqZGlyLCAqKnBhdGgsICoqcDsKKyAgICAKKyAgICBpZiAoIXVybCB8fCAhKnVybCkKKyAgICB7CisJdXJsID0gZ2V0ZW52ICgiRk9OVENPTkZJR19GSUxFIik7CisJaWYgKCF1cmwpCisJICAgIHVybCA9IEZPTlRDT05GSUdfRklMRTsKKyAgICB9CisgICAgc3dpdGNoICgqdXJsKSB7CisgICAgY2FzZSAnfic6CisJZGlyID0gZ2V0ZW52ICgiSE9NRSIpOworCWlmIChkaXIpCisJICAgIGZpbGUgPSBGY0NvbmZpZ0ZpbGVFeGlzdHMgKGRpciwgdXJsICsgMSk7CisJZWxzZQorCSAgICBmaWxlID0gMDsKKwlicmVhazsKKyAgICBjYXNlICcvJzoKKwlmaWxlID0gRmNDb25maWdGaWxlRXhpc3RzICgwLCB1cmwpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcGF0aCA9IEZjQ29uZmlnR2V0UGF0aCAoKTsKKwlpZiAoIXBhdGgpCisJICAgIHJldHVybiAwOworCWZvciAocCA9IHBhdGg7ICpwOyBwKyspCisJeworCSAgICBmaWxlID0gRmNDb25maWdGaWxlRXhpc3RzICgqcCwgdXJsKTsKKwkgICAgaWYgKGZpbGUpCisJCWJyZWFrOworCX0KKwlGY0NvbmZpZ0ZyZWVQYXRoIChwYXRoKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZpbGU7Cit9CisKKy8qCisgKiBNYW5hZ2UgdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZvbnRzCisgKi8KKworRmNCb29sCitGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlIChGY0NvbmZpZyAgICAqY29uZmlnLAorCQkJY29uc3QgY2hhciAgKmZpbGUpCit7CisgICAgRmNGb250U2V0CSpzZXQ7CisKKyAgICBpZiAoIWNvbmZpZykKKyAgICB7CisJY29uZmlnID0gRmNDb25maWdHZXRDdXJyZW50ICgpOworCWlmICghY29uZmlnKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKyAgICB9CisKKyAgICBzZXQgPSBGY0NvbmZpZ0dldEZvbnRzIChjb25maWcsIEZjU2V0QXBwbGljYXRpb24pOworICAgIGlmICghc2V0KQorICAgIHsKKwlzZXQgPSBGY0ZvbnRTZXRDcmVhdGUgKCk7CisJaWYgKCFzZXQpCisJICAgIHJldHVybiBGY0ZhbHNlOworCUZjQ29uZmlnU2V0Rm9udHMgKGNvbmZpZywgc2V0LCBGY1NldEFwcGxpY2F0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIEZjRmlsZVNjYW4gKHNldCwgMCwgY29uZmlnLT5ibGFua3MsIGZpbGUsIEZjRmFsc2UpOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnQXBwRm9udEFkZERpciAoRmNDb25maWcJICAgICpjb25maWcsCisJCSAgICAgICBjb25zdCBjaGFyICAgKmRpcikKK3sKKyAgICBGY0ZvbnRTZXQJKnNldDsKKyAgICAKKyAgICBpZiAoIWNvbmZpZykKKyAgICB7CisJY29uZmlnID0gRmNDb25maWdHZXRDdXJyZW50ICgpOworCWlmICghY29uZmlnKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgc2V0ID0gRmNDb25maWdHZXRGb250cyAoY29uZmlnLCBGY1NldEFwcGxpY2F0aW9uKTsKKyAgICBpZiAoIXNldCkKKyAgICB7CisJc2V0ID0gRmNGb250U2V0Q3JlYXRlICgpOworCWlmICghc2V0KQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlGY0NvbmZpZ1NldEZvbnRzIChjb25maWcsIHNldCwgRmNTZXRBcHBsaWNhdGlvbik7CisgICAgfQorICAgIHJldHVybiBGY0RpclNjYW4gKHNldCwgMCwgY29uZmlnLT5ibGFua3MsIGRpciwgRmNGYWxzZSk7Cit9CisKK3ZvaWQKK0ZjQ29uZmlnQXBwRm9udENsZWFyIChGY0NvbmZpZwkgICAgKmNvbmZpZykKK3sKKyAgICBGY0NvbmZpZ1NldEZvbnRzIChjb25maWcsIDAsIEZjU2V0QXBwbGljYXRpb24pOworfQpkaWZmIC0tZ2l0IGEvc3JjL2ZjY2hhcnNldC5jIGIvc3JjL2ZjY2hhcnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWE0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmNjaGFyc2V0LmMKQEAgLTAsMCArMSwxNTIxIEBACisvKgorICogJFhGcmVlODY6ICQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZmNpbnQuaCIKKworLyogI2RlZmluZSBDSEVDSyAqLworCitzdGF0aWMgaW50CitGY0NoYXJTZXRMZXZlbHMgKEZjQ2hhcjMyIHVjczQpCit7CisgICAgaWYgKHVjczQgPD0gMHhmZikKKwlyZXR1cm4gMTsKKyAgICBpZiAodWNzNCA8PSAweGZmZmYpCisJcmV0dXJuIDI7CisgICAgaWYgKHVjczQgPD0gMHhmZmZmZmYpCisJcmV0dXJuIDM7CisgICAgcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjQ2hhclNldENoZWNrTGV2ZWwgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQoreworICAgIGludAlsZXZlbCA9IEZjQ2hhclNldExldmVscyAodWNzNCk7CisgICAgCisgICAgaWYgKGxldmVsIDw9IGZjcy0+bGV2ZWxzKQorCXJldHVybiBGY1RydWU7CisgICAgd2hpbGUgKGZjcy0+bGV2ZWxzIDwgbGV2ZWwpCisgICAgeworCWlmIChmY3MtPmxldmVscyA9PSAwKQorCXsKKwkgICAgRmNDaGFyTGVhZgkgICAgKmxlYWY7CisKKwkgICAgbGVhZiA9IChGY0NoYXJMZWFmICopIGNhbGxvYyAoMSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CisJICAgIGlmICghbGVhZikKKwkJcmV0dXJuIEZjRmFsc2U7CisJICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CisJICAgIGZjcy0+bm9kZS5sZWFmID0gbGVhZjsKKwl9CisJZWxzZQorCXsKKwkgICAgRmNDaGFyQnJhbmNoICAgICpicmFuY2g7CisgICAgCisJICAgIGJyYW5jaCA9IChGY0NoYXJCcmFuY2ggKikgY2FsbG9jICgxLCBzaXplb2YgKEZjQ2hhckJyYW5jaCkpOworCSAgICBpZiAoIWJyYW5jaCkKKwkJcmV0dXJuIEZjRmFsc2U7CisJICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJCcmFuY2gpKTsKKwkgICAgYnJhbmNoLT5ub2Rlc1swXSA9IGZjcy0+bm9kZTsKKwkgICAgZmNzLT5ub2RlLmJyYW5jaCA9IGJyYW5jaDsKKwl9CisJKytmY3MtPmxldmVsczsKKyAgICB9CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworRmNDaGFyU2V0ICoKK0ZjQ2hhclNldENyZWF0ZSAodm9pZCkKK3sKKyAgICBGY0NoYXJTZXQJKmZjczsKKworICAgIGZjcyA9IChGY0NoYXJTZXQgKikgbWFsbG9jIChzaXplb2YgKEZjQ2hhclNldCkpOworICAgIGlmICghZmNzKQorCXJldHVybiAwOworICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSU0VULCBzaXplb2YgKEZjQ2hhclNldCkpOworICAgIGZjcy0+cmVmID0gMTsKKyAgICBmY3MtPmxldmVscyA9IDA7CisgICAgZmNzLT5ub2RlLmxlYWYgPSAwOworICAgIGZjcy0+Y29uc3RhbnQgPSBGY0ZhbHNlOworICAgIHJldHVybiBmY3M7Cit9CisKK0ZjQ2hhclNldCAqCitGY0NoYXJTZXROZXcgKHZvaWQpOworICAgIAorRmNDaGFyU2V0ICoKK0ZjQ2hhclNldE5ldyAodm9pZCkKK3sKKyAgICByZXR1cm4gRmNDaGFyU2V0Q3JlYXRlICgpOworfQorCitzdGF0aWMgdm9pZAorRmNDaGFyTm9kZURlc3Ryb3kgKEZjQ2hhck5vZGUgbm9kZSwgaW50IGxldmVsKQoreworICAgIGludAlpOworCisgICAgc3dpdGNoIChsZXZlbCkgeworICAgIGNhc2UgMDoKKwlicmVhazsKKyAgICBjYXNlIDE6CisJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUk5PREUsIHNpemVvZiAoRmNDaGFyTGVhZikpOworCWZyZWUgKG5vZGUubGVhZik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJICAgIGlmIChub2RlLmJyYW5jaC0+bm9kZXNbaV0uYnJhbmNoKQorCQlGY0NoYXJOb2RlRGVzdHJveSAobm9kZS5icmFuY2gtPm5vZGVzW2ldLCBsZXZlbCAtIDEpOworICAgICAgICBGY01lbUZyZWUgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJCcmFuY2gpKTsKKwlmcmVlIChub2RlLmJyYW5jaCk7CisgICAgfQorfQorCit2b2lkCitGY0NoYXJTZXREZXN0cm95IChGY0NoYXJTZXQgKmZjcykKK3sKKyAgICBpZiAoZmNzLT5jb25zdGFudCkKKwlyZXR1cm47CisgICAgaWYgKC0tZmNzLT5yZWYgPD0gMCkKKyAgICB7CisJRmNDaGFyTm9kZURlc3Ryb3kgKGZjcy0+bm9kZSwgZmNzLT5sZXZlbHMpOworCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJTRVQsIHNpemVvZiAoRmNDaGFyU2V0KSk7CisJZnJlZSAoZmNzKTsKKyAgICB9Cit9CisKKy8qCisgKiBMb2NhdGUgdGhlIGxlYWYgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGNoYXIsIHJldHVybmluZworICogbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0CisgKi8KKworc3RhdGljIEZjQ2hhckxlYWYgKgorRmNDaGFyU2V0RmluZExlYWYgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQoreworICAgIGludAkJCWw7CisgICAgY29uc3QgRmNDaGFyTm9kZQkqcHJldjsKKyAgICBGY0NoYXJOb2RlCQlub2RlOworICAgIEZjQ2hhcjgJCWk7CisKKyAgICBwcmV2ID0gJmZjcy0+bm9kZTsKKyAgICBsID0gZmNzLT5sZXZlbHM7CisgICAgd2hpbGUgKC0tbCA+IDApCisgICAgeworCW5vZGUgPSAqcHJldjsKKwlpZiAoIW5vZGUuYnJhbmNoKQorCSAgICByZXR1cm4gMDsKKwlpID0gKHVjczQgPj4gKGwgPDwgMykpICYgMHhmZjsKKwlwcmV2ID0gJm5vZGUuYnJhbmNoLT5ub2Rlc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHByZXYtPmxlYWY7Cit9CisKKy8qCisgKiBMb2NhdGUgdGhlIGxlYWYgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGNoYXIsIGNyZWF0aW5nIGl0CisgKiBpZiBkZXNpcmVkCisgKi8KKworc3RhdGljIEZjQ2hhckxlYWYgKgorRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQoreworICAgIGludAkJbDsKKyAgICBGY0NoYXJOb2RlICAqcHJldiwgbm9kZTsKKyAgICBGY0NoYXI4CWk7CisKKyAgICBpZiAoIUZjQ2hhclNldENoZWNrTGV2ZWwgKGZjcywgdWNzNCkpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgcHJldiA9ICZmY3MtPm5vZGU7CisgICAgbCA9IGZjcy0+bGV2ZWxzOworICAgIHdoaWxlICgtLWwgPiAwKQorICAgIHsKKwlub2RlID0gKnByZXY7CisJaWYgKCFub2RlLmJyYW5jaCkKKwl7CisJICAgIG5vZGUuYnJhbmNoID0gY2FsbG9jICgxLCBzaXplb2YgKEZjQ2hhckJyYW5jaCkpOworCSAgICBpZiAoIW5vZGUuYnJhbmNoKQorCQlyZXR1cm4gMDsKKwkgICAgRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJOT0RFLCBzaXplb2YgKEZjQ2hhckJyYW5jaCkpOworCSAgICAqcHJldiA9IG5vZGU7CisJfQorCWkgPSAodWNzNCA+PiAobCA8PCAzKSkgJiAweGZmOworCXByZXYgPSAmbm9kZS5icmFuY2gtPm5vZGVzW2ldOworICAgIH0KKyAgICBub2RlID0gKnByZXY7CisgICAgaWYgKCFub2RlLmxlYWYpCisgICAgeworCW5vZGUubGVhZiA9IGNhbGxvYyAoMSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CisJaWYgKCFub2RlLmxlYWYpCisJICAgIHJldHVybiAwOworCUZjTWVtQWxsb2MgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CisJKnByZXYgPSBub2RlOworICAgIH0KKyAgICByZXR1cm4gbm9kZS5sZWFmOworfQorCitGY0Jvb2wKK0ZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQoreworICAgIEZjQ2hhckxlYWYJKmxlYWY7CisgICAgRmNDaGFyMzIJKmI7CisgICAgCisgICAgaWYgKGZjcy0+Y29uc3RhbnQpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOworICAgIGlmICghbGVhZikKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICBiID0gJmxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdOworICAgICpiIHw9ICgxIDw8ICh1Y3M0ICYgMHgxZikpOworICAgIHJldHVybiBGY1RydWU7Cit9CisKKy8qCisgKiBBbiBpdGVyYXRvciBmb3IgdGhlIGxlYXZlcyBvZiBhIGNoYXJzZXQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfZmNDaGFyU2V0SXRlciB7CisgICAgRmNDaGFyTGVhZgkgICAgKmxlYWY7CisgICAgRmNDaGFyMzIJICAgIHVjczQ7Cit9IEZjQ2hhclNldEl0ZXI7CisKKy8qCisgKiBGaW5kIHRoZSBuZWFyZXN0IGxlYWYgYXQgb3IgYmV5b25kICp1Y3M0LCByZXR1cm4gMCBpZiBubyBsZWFmCisgKiBleGlzdHMKKyAqLworc3RhdGljIEZjQ2hhckxlYWYgKgorRmNDaGFyU2V0SXRlckxlYWYgKEZjQ2hhck5vZGUgbm9kZSwgaW50IGxldmVsLCBGY0NoYXIzMiAqdWNzNCkKK3sKKyAgICBpZiAobGV2ZWwgPD0gMSkKKyAgICAgICAgcmV0dXJuIG5vZGUubGVhZjsKKyAgICBlbHNlIGlmICghbm9kZS5icmFuY2gpCisJcmV0dXJuIDA7CisgICAgZWxzZQorICAgIHsKKwlpbnQJICAgIHNoaWZ0ID0gKChsZXZlbCAtIDEpIDw8IDMpOworCUZjQ2hhcjMyICAgIGluYyA9IDEgPDwgc2hpZnQ7CisJRmNDaGFyMzIgICAgbWFzayA9IH4oaW5jIC0gMSk7CisJRmNDaGFyOAkgICAgYnl0ZSA9ICgqdWNzNCA+PiBzaGlmdCkgJiAweGZmOworCUZjQ2hhckxlYWYgICpsZWFmOworCisJZm9yICg7OykKKwl7CisJICAgIGxlYWYgPSBGY0NoYXJTZXRJdGVyTGVhZiAobm9kZS5icmFuY2gtPm5vZGVzW2J5dGVdLCAKKwkJCQkgICAgICBsZXZlbCAtIDEsIAorCQkJCSAgICAgIHVjczQpOworCSAgICBpZiAobGVhZikKKwkJYnJlYWs7CisJICAgIC8qIHN0ZXAgdG8gbmV4dCBicmFuY2gsIHJlc2V0dGluZyBsb3dlciBpbmRpY2VzICovCisJICAgICp1Y3M0ID0gKCp1Y3M0ICYgbWFzaykgKyBpbmM7CisJICAgIGJ5dGUrKzsKKwkgICAgaWYgKGJ5dGUgPT0gMCkKKwkJYnJlYWs7CisJfQorCXJldHVybiBsZWFmOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK0ZjQ2hhclNldEl0ZXJTZXQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQoreworICAgIGlmIChGY0NoYXJTZXRMZXZlbHMgKGl0ZXItPnVjczQpID4gZmNzLT5sZXZlbHMpCisJaXRlci0+bGVhZiA9IDA7CisgICAgZWxzZQorCWl0ZXItPmxlYWYgPSBGY0NoYXJTZXRJdGVyTGVhZiAoZmNzLT5ub2RlLCBmY3MtPmxldmVscywKKwkJCQkJJml0ZXItPnVjczQpOworICAgIGlmICghaXRlci0+bGVhZikKKwlpdGVyLT51Y3M0ID0gfjA7Cit9CisKK3N0YXRpYyB2b2lkCitGY0NoYXJTZXRJdGVyTmV4dCAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhclNldEl0ZXIgKml0ZXIpCit7CisgICAgaXRlci0+dWNzNCArPSAweDEwMDsKKyAgICBGY0NoYXJTZXRJdGVyU2V0IChmY3MsIGl0ZXIpOworfQorCitzdGF0aWMgdm9pZAorRmNDaGFyU2V0SXRlclN0YXJ0IChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyU2V0SXRlciAqaXRlcikKK3sKKyAgICBpdGVyLT51Y3M0ID0gMDsKKyAgICBGY0NoYXJTZXRJdGVyU2V0IChmY3MsIGl0ZXIpOworfQorCitGY0NoYXJTZXQgKgorRmNDaGFyU2V0Q29weSAoRmNDaGFyU2V0ICpzcmMpCit7CisgICAgc3JjLT5yZWYrKzsKKyAgICByZXR1cm4gc3JjOworfQorCitGY0Jvb2wKK0ZjQ2hhclNldEVxdWFsIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK3sKKyAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOworICAgIGludAkJICAgIGk7CisgICAgCisgICAgaWYgKGEgPT0gYikKKwlyZXR1cm4gRmNUcnVlOworICAgIGZvciAoRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpLCBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CisJIGFpLmxlYWYgJiYgYmkubGVhZjsKKwkgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpKQorICAgIHsKKwlpZiAoYWkudWNzNCAhPSBiaS51Y3M0KQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCisJICAgIGlmIChhaS5sZWFmLT5tYXBbaV0gIT0gYmkubGVhZi0+bWFwW2ldKQorCQlyZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGFpLmxlYWYgPT0gYmkubGVhZjsKK30KKworc3RhdGljIEZjQm9vbAorRmNDaGFyU2V0QWRkTGVhZiAoRmNDaGFyU2V0CSpmY3MsCisJCSAgRmNDaGFyMzIJdWNzNCwKKwkJICBGY0NoYXJMZWFmCSpsZWFmKQoreworICAgIEZjQ2hhckxlYWYgICAqbmV3ID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CisgICAgaWYgKCFuZXcpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgKm5ldyA9ICpsZWFmOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK3N0YXRpYyBGY0NoYXJTZXQgKgorRmNDaGFyU2V0T3BlcmF0ZSAoY29uc3QgRmNDaGFyU2V0ICAgKmEsCisJCSAgY29uc3QgRmNDaGFyU2V0ICAgKmIsCisJCSAgRmNCb29sCSAgICAoKm92ZXJsYXApIChGY0NoYXJMZWFmCSAgICAqcmVzdWx0LAorCQkJCQkJY29uc3QgRmNDaGFyTGVhZiAgICAqYWwsCisJCQkJCQljb25zdCBGY0NoYXJMZWFmICAgICpibCksCisJCSAgRmNCb29sCWFvbmx5LAorCQkgIEZjQm9vbAlib25seSkKK3sKKyAgICBGY0NoYXJTZXQJICAgICpmY3M7CisgICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKKworICAgIGZjcyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKKyAgICBpZiAoIWZjcykKKwlnb3RvIGJhaWwwOworICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsKKyAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CisgICAgd2hpbGUgKChhaS5sZWFmIHx8IGJvbmx5KSAmJiAoYmkubGVhZiB8fCBhb25seSkpCisgICAgeworCWlmIChhaS51Y3M0IDwgYmkudWNzNCkKKwl7CisJICAgIGlmIChhb25seSkKKwkgICAgeworCQlpZiAoIUZjQ2hhclNldEFkZExlYWYgKGZjcywgYWkudWNzNCwgYWkubGVhZikpCisJCSAgICBnb3RvIGJhaWwxOworCQlGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJYWkudWNzNCA9IGJpLnVjczQ7CisJCUZjQ2hhclNldEl0ZXJTZXQgKGEsICZhaSk7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoYmkudWNzNCA8IGFpLnVjczQgKQorCXsKKwkgICAgaWYgKGJvbmx5KQorCSAgICB7CisJCWlmICghRmNDaGFyU2V0QWRkTGVhZiAoZmNzLCBiaS51Y3M0LCBiaS5sZWFmKSkKKwkJICAgIGdvdG8gYmFpbDE7CisJCUZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQliaS51Y3M0ID0gYWkudWNzNDsKKwkJRmNDaGFyU2V0SXRlclNldCAoYiwgJmJpKTsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBGY0NoYXJMZWFmICBsZWFmOworCisJICAgIGlmICgoKm92ZXJsYXApICgmbGVhZiwgYWkubGVhZiwgYmkubGVhZikpCisJICAgIHsKKwkJaWYgKCFGY0NoYXJTZXRBZGRMZWFmIChmY3MsIGFpLnVjczQsICZsZWFmKSkKKwkJICAgIGdvdG8gYmFpbDE7CisJICAgIH0KKwkgICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CisJICAgIEZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpOworCX0KKyAgICB9CisgICAgcmV0dXJuIGZjczsKK2JhaWwxOgorICAgIEZjQ2hhclNldERlc3Ryb3kgKGZjcyk7CitiYWlsMDoKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEZjQm9vbAorRmNDaGFyU2V0SW50ZXJzZWN0TGVhZiAoRmNDaGFyTGVhZiAqcmVzdWx0LAorCQkJY29uc3QgRmNDaGFyTGVhZiAqYWwsCisJCQljb25zdCBGY0NoYXJMZWFmICpibCkKK3sKKyAgICBpbnQJICAgIGk7CisgICAgRmNCb29sICBub25lbXB0eSA9IEZjRmFsc2U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCisJaWYgKChyZXN1bHQtPm1hcFtpXSA9IGFsLT5tYXBbaV0gJiBibC0+bWFwW2ldKSkKKwkgICAgbm9uZW1wdHkgPSBGY1RydWU7CisgICAgcmV0dXJuIG5vbmVtcHR5OworfQorCitGY0NoYXJTZXQgKgorRmNDaGFyU2V0SW50ZXJzZWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK3sKKyAgICByZXR1cm4gRmNDaGFyU2V0T3BlcmF0ZSAoYSwgYiwgRmNDaGFyU2V0SW50ZXJzZWN0TGVhZiwgRmNGYWxzZSwgRmNGYWxzZSk7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjQ2hhclNldFVuaW9uTGVhZiAoRmNDaGFyTGVhZiAqcmVzdWx0LAorCQkgICAgY29uc3QgRmNDaGFyTGVhZiAqYWwsCisJCSAgICBjb25zdCBGY0NoYXJMZWFmICpibCkKK3sKKyAgICBpbnQJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKKwlyZXN1bHQtPm1hcFtpXSA9IGFsLT5tYXBbaV0gfCBibC0+bWFwW2ldOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK0ZjQ2hhclNldCAqCitGY0NoYXJTZXRVbmlvbiAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCit7CisgICAgcmV0dXJuIEZjQ2hhclNldE9wZXJhdGUgKGEsIGIsIEZjQ2hhclNldFVuaW9uTGVhZiwgRmNUcnVlLCBGY1RydWUpOworfQorCitzdGF0aWMgRmNCb29sCitGY0NoYXJTZXRTdWJ0cmFjdExlYWYgKEZjQ2hhckxlYWYgKnJlc3VsdCwKKwkJICAgICAgIGNvbnN0IEZjQ2hhckxlYWYgKmFsLAorCQkgICAgICAgY29uc3QgRmNDaGFyTGVhZiAqYmwpCit7CisgICAgaW50CSAgICBpOworICAgIEZjQm9vbCAgbm9uZW1wdHkgPSBGY0ZhbHNlOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQorCWlmICgocmVzdWx0LT5tYXBbaV0gPSBhbC0+bWFwW2ldICYgfmJsLT5tYXBbaV0pKQorCSAgICBub25lbXB0eSA9IEZjVHJ1ZTsKKyAgICByZXR1cm4gbm9uZW1wdHk7Cit9CisKK0ZjQ2hhclNldCAqCitGY0NoYXJTZXRTdWJ0cmFjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCit7CisgICAgcmV0dXJuIEZjQ2hhclNldE9wZXJhdGUgKGEsIGIsIEZjQ2hhclNldFN1YnRyYWN0TGVhZiwgRmNUcnVlLCBGY0ZhbHNlKTsKK30KKworRmNCb29sCitGY0NoYXJTZXRIYXNDaGFyIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKK3sKKyAgICBGY0NoYXJMZWFmCSpsZWFmID0gRmNDaGFyU2V0RmluZExlYWYgKGZjcywgdWNzNCk7CisgICAgaWYgKCFsZWFmKQorCXJldHVybiBGY0ZhbHNlOworICAgIHJldHVybiAobGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV0gJiAoMSA8PCAodWNzNCAmIDB4MWYpKSkgIT0gMDsKK30KKworc3RhdGljIEZjQ2hhcjMyCitGY0NoYXJTZXRQb3BDb3VudCAoRmNDaGFyMzIgYzEpCit7CisgICAgLyogaGFja21lbSAxNjkgKi8KKyAgICBGY0NoYXIzMgljMiA9IChjMSA+PiAxKSAmIDAzMzMzMzMzMzMzMzsKKyAgICBjMiA9IGMxIC0gYzIgLSAoKGMyID4+IDEpICYgMDMzMzMzMzMzMzMzKTsKKyAgICByZXR1cm4gKCgoYzIgKyAoYzIgPj4gMykpICYgMDMwNzA3MDcwNzA3KSAlIDA3Nyk7Cit9CisKK0ZjQ2hhcjMyCitGY0NoYXJTZXRJbnRlcnNlY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCit7CisgICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKKyAgICBGY0NoYXIzMgkgICAgY291bnQgPSAwOworICAgIAorICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsKKyAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CisgICAgd2hpbGUgKGFpLmxlYWYgJiYgYmkubGVhZikKKyAgICB7CisJaWYgKGFpLnVjczQgPT0gYmkudWNzNCkKKwl7CisJICAgIEZjQ2hhcjMyCSphbSA9IGFpLmxlYWYtPm1hcDsKKwkgICAgRmNDaGFyMzIJKmJtID0gYmkubGVhZi0+bWFwOworCSAgICBpbnQJCWkgPSAyNTYvMzI7CisJICAgIHdoaWxlIChpLS0pCisJCWNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyAmICpibSsrKTsKKwkgICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CisJfSAKKwllbHNlIGlmIChhaS51Y3M0IDwgYmkudWNzNCkKKwl7CisJICAgIGFpLnVjczQgPSBiaS51Y3M0OworCSAgICBGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOworCX0KKwlpZiAoYmkudWNzNCA8IGFpLnVjczQpCisJeworCSAgICBiaS51Y3M0ID0gYWkudWNzNDsKKwkgICAgRmNDaGFyU2V0SXRlclNldCAoYiwgJmJpKTsKKwl9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworRmNDaGFyMzIKK0ZjQ2hhclNldENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEpCit7CisgICAgRmNDaGFyU2V0SXRlciAgIGFpOworICAgIEZjQ2hhcjMyCSAgICBjb3VudCA9IDA7CisgICAgCisgICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7IGFpLmxlYWY7IEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpKQorICAgIHsKKwlpbnQJCSAgICBpID0gMjU2LzMyOworCUZjQ2hhcjMyCSAgICAqYW0gPSBhaS5sZWFmLT5tYXA7CisKKwl3aGlsZSAoaS0tKQorCSAgICBjb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKyspOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK0ZjQ2hhcjMyCitGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK3sKKyAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOworICAgIEZjQ2hhcjMyCSAgICBjb3VudCA9IDA7CisgICAgCisgICAgRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpOworICAgIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKKyAgICB3aGlsZSAoYWkubGVhZikKKyAgICB7CisJaWYgKGFpLnVjczQgPD0gYmkudWNzNCkKKwl7CisJICAgIEZjQ2hhcjMyCSphbSA9IGFpLmxlYWYtPm1hcDsKKwkgICAgaW50CQlpID0gMjU2LzMyOworCSAgICBpZiAoYWkudWNzNCA9PSBiaS51Y3M0KQorCSAgICB7CisJCUZjQ2hhcjMyCSpibSA9IGJpLmxlYWYtPm1hcDs7CisJCXdoaWxlIChpLS0pCisJCSAgICBjb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKysgJiB+KmJtKyspOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQl3aGlsZSAoaS0tKQorCQkgICAgY291bnQgKz0gRmNDaGFyU2V0UG9wQ291bnQgKCphbSsrKTsKKwkgICAgfQorCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKKwl9CisJZWxzZSBpZiAoYmkubGVhZikKKwl7CisJICAgIGJpLnVjczQgPSBhaS51Y3M0OworCSAgICBGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOworCX0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisvKgorICogQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgY2hhcnNldHMuCisgKiAKKyAqIEVhY2ggbGVhZiBpcyByZXByZXNlbnRlZCBhcyA5IDMyLWJpdCB2YWx1ZXMsIHRoZSBjb2RlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93ZWQKKyAqIGJ5IDggMzIgYml0IHZhbHVlcyBmb3IgdGhlIGxlYWYgaXRzZWxmLiAgRWFjaCB2YWx1ZSBpcyBlbmNvZGVkIGFzIDUgQVNDSUkgY2hhcmFjdGVycywKKyAqIG9ubHkgODUgZGlmZmVyZW50IHZhbHVlcyBhcmUgdXNlZCB0byBhdm9pZCBjb250cm9sIGNoYXJhY3RlcnMgYXMgd2VsbCBhcyB0aGUgb3RoZXIKKyAqIGNoYXJhY3RlcnMgdXNlZCB0byBlbmNvZGUgZm9udCBuYW1lcy4gIDg1Kio1ID4gMl4zMiBzbyB0aGluZ3Mgd29yayBvdXQsIGJ1dAorICogaXQncyBub3QgZXhhY3RseSBodW1hbiByZWFkYWJsZSBvdXRwdXQuICBBcyBhIHNwZWNpYWwgY2FzZSwgMCBpcyBlbmNvZGVkIGFzIGEgc3BhY2UKKyAqLworCitzdGF0aWMgRmNDaGFyOAljaGFyVG9WYWx1ZVsyNTZdID0geworICAgIC8qICAgICAiIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogICAiXGIiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKKyAgICAvKiAiXDAyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAorICAgIC8qICJcMDMwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogICAgIiAiICovIDB4ZmYsICAweDAwLCAgMHhmZiwgIDB4MDEsICAweDAyLCAgMHgwMywgIDB4MDQsICAweGZmLCAKKyAgICAvKiAgICAiKCIgKi8gMHgwNSwgIDB4MDYsICAweDA3LCAgMHgwOCwgIDB4ZmYsICAweGZmLCAgMHgwOSwgIDB4MGEsIAorICAgIC8qICAgICIwIiAqLyAweDBiLCAgMHgwYywgIDB4MGQsICAweDBlLCAgMHgwZiwgIDB4MTAsICAweDExLCAgMHgxMiwgCisgICAgLyogICAgIjgiICovIDB4MTMsICAweDE0LCAgMHhmZiwgIDB4MTUsICAweDE2LCAgMHhmZiwgIDB4MTcsICAweDE4LCAKKyAgICAvKiAgICAiQCIgKi8gMHgxOSwgIDB4MWEsICAweDFiLCAgMHgxYywgIDB4MWQsICAweDFlLCAgMHgxZiwgIDB4MjAsIAorICAgIC8qICAgICJIIiAqLyAweDIxLCAgMHgyMiwgIDB4MjMsICAweDI0LCAgMHgyNSwgIDB4MjYsICAweDI3LCAgMHgyOCwgCisgICAgLyogICAgIlAiICovIDB4MjksICAweDJhLCAgMHgyYiwgIDB4MmMsICAweDJkLCAgMHgyZSwgIDB4MmYsICAweDMwLCAKKyAgICAvKiAgICAiWCIgKi8gMHgzMSwgIDB4MzIsICAweDMzLCAgMHgzNCwgIDB4ZmYsICAweDM1LCAgMHgzNiwgIDB4ZmYsIAorICAgIC8qICAgICJgIiAqLyAweGZmLCAgMHgzNywgIDB4MzgsICAweDM5LCAgMHgzYSwgIDB4M2IsICAweDNjLCAgMHgzZCwgCisgICAgLyogICAgImgiICovIDB4M2UsICAweDNmLCAgMHg0MCwgIDB4NDEsICAweDQyLCAgMHg0MywgIDB4NDQsICAweDQ1LCAKKyAgICAvKiAgICAicCIgKi8gMHg0NiwgIDB4NDcsICAweDQ4LCAgMHg0OSwgIDB4NGEsICAweDRiLCAgMHg0YywgIDB4NGQsIAorICAgIC8qICAgICJ4IiAqLyAweDRlLCAgMHg0ZiwgIDB4NTAsICAweDUxLCAgMHg1MiwgIDB4NTMsICAweDU0LCAgMHhmZiwgCisgICAgLyogIlwyMDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKKyAgICAvKiAiXDIxMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAorICAgIC8qICJcMjIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogIlwyMzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKKyAgICAvKiAiXDI0MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAorICAgIC8qICJcMjUwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogIlwyNjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKKyAgICAvKiAiXDI3MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAorICAgIC8qICJcMzAwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogIlwzMTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKKyAgICAvKiAiXDMyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAorICAgIC8qICJcMzMwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogIlwzNDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKKyAgICAvKiAiXDM1MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAorICAgIC8qICJcMzYwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCisgICAgLyogIlwzNzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKK307CisKK3N0YXRpYyBGY0NoYXI4IHZhbHVlVG9DaGFyWzB4NTVdID0geworICAgIC8qIDB4MDAgKi8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcoJywgJyknLCAnKicsCisgICAgLyogMHgwOCAqLyAnKycsICcuJywgJy8nLCAnMCcsICcxJywgJzInLCAnMycsICc0JywKKyAgICAvKiAweDEwICovICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnOycsICc8JywgJz4nLAorICAgIC8qIDB4MTggKi8gJz8nLCAnQCcsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsCisgICAgLyogMHgyMCAqLyAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywKKyAgICAvKiAweDI4ICovICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLAorICAgIC8qIDB4MzAgKi8gJ1cnLCAnWCcsICdZJywgJ1onLCAnWycsICddJywgJ14nLCAnYScsCisgICAgLyogMHgzOCAqLyAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywKKyAgICAvKiAweDQwICovICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLAorICAgIC8qIDB4NDggKi8gJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsCisgICAgLyogMHg1MCAqLyAneicsICd7JywgJ3wnLCAnfScsICd+JywKK307CisKK3N0YXRpYyBGY0NoYXI4ICoKK0ZjQ2hhclNldFBhcnNlVmFsdWUgKEZjQ2hhcjggKnN0cmluZywgRmNDaGFyMzIgKnZhbHVlKQoreworICAgIGludAkJaTsKKyAgICBGY0NoYXIzMgl2OworICAgIEZjQ2hhcjgJYzsKKyAgICAKKyAgICBpZiAoKnN0cmluZyA9PSAnICcpCisgICAgeworCXYgPSAwOworCXN0cmluZysrOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXYgPSAwOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJeworCSAgICBpZiAoIShjID0gKnN0cmluZysrKSkKKwkJcmV0dXJuIDA7CisJICAgIGMgPSBjaGFyVG9WYWx1ZVtjXTsKKwkgICAgaWYgKGMgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisJICAgIHYgPSB2ICogODUgKyBjOworCX0KKyAgICB9CisgICAgKnZhbHVlID0gdjsKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitzdGF0aWMgRmNCb29sCitGY0NoYXJTZXRVbnBhcnNlVmFsdWUgKEZjTmFtZUJ1ZiAqYnVmLCBGY0NoYXIzMiB2YWx1ZSkKK3sKKyAgICBpbnQJICAgIGk7CisgICAgaWYgKHZhbHVlID09IDApCisgICAgeworCXJldHVybiBGY05hbWVCdWZDaGFyIChidWYsICcgJyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJRmNDaGFyOAlzdHJpbmdbNl07CisJRmNDaGFyOAkqcyA9IHN0cmluZyArIDU7CisJc3RyaW5nWzVdID0gJ1wwJzsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCXsKKwkgICAgKi0tcyA9IHZhbHVlVG9DaGFyW3ZhbHVlICUgODVdOworCSAgICB2YWx1ZSAvPSA4NTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkgICAgaWYgKCFGY05hbWVCdWZDaGFyIChidWYsICpzKyspKQorCQlyZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworRmNDaGFyU2V0ICoKK0ZjTmFtZVBhcnNlQ2hhclNldCAoRmNDaGFyOCAqc3RyaW5nKQoreworICAgIEZjQ2hhclNldAkqYzsKKyAgICBGY0NoYXIzMgl1Y3M0OworICAgIEZjQ2hhckxlYWYJKmxlYWY7CisgICAgaW50CQlpOworCisgICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKKyAgICBpZiAoIWMpCisJZ290byBiYWlsMDsKKyAgICB3aGlsZSAoKnN0cmluZykKKyAgICB7CisJc3RyaW5nID0gRmNDaGFyU2V0UGFyc2VWYWx1ZSAoc3RyaW5nLCAmdWNzNCk7CisJaWYgKCFzdHJpbmcpCisJICAgIGdvdG8gYmFpbDE7CisJbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChjLCB1Y3M0KTsKKwlpZiAoIWxlYWYpCisJICAgIGdvdG8gYmFpbDE7CisJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQorCXsKKwkgICAgc3RyaW5nID0gRmNDaGFyU2V0UGFyc2VWYWx1ZSAoc3RyaW5nLCAmbGVhZi0+bWFwW2ldKTsKKwkgICAgaWYgKCFzdHJpbmcpCisJCWdvdG8gYmFpbDE7CisJfQorICAgIH0KKyAgICByZXR1cm4gYzsKK2JhaWwxOgorICAgIEZjQ2hhclNldERlc3Ryb3kgKGMpOworYmFpbDA6CisgICAgcmV0dXJuIDA7Cit9CisKK0ZjQm9vbAorRmNOYW1lVW5wYXJzZUNoYXJTZXQgKEZjTmFtZUJ1ZiAqYnVmLCBjb25zdCBGY0NoYXJTZXQgKmMpCit7CisgICAgRmNDaGFyU2V0SXRlciAgIGNpOworICAgIGludAkJICAgIGk7CisjaWZkZWYgQ0hFQ0sKKyAgICBpbnQJCSAgICBsZW4gPSBidWYtPmxlbjsKKyNlbmRpZgorCisgICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGMsICZjaSk7CisJIGNpLmxlYWY7CisJIEZjQ2hhclNldEl0ZXJOZXh0IChjLCAmY2kpKQorICAgIHsKKwlpZiAoIUZjQ2hhclNldFVucGFyc2VWYWx1ZSAoYnVmLCBjaS51Y3M0KSkKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQorCSAgICBpZiAoIUZjQ2hhclNldFVucGFyc2VWYWx1ZSAoYnVmLCBjaS5sZWFmLT5tYXBbaV0pKQorCQlyZXR1cm4gRmNGYWxzZTsKKyAgICB9CisjaWZkZWYgQ0hFQ0sKKyAgICB7CisJRmNDaGFyU2V0CSpjaGVjazsKKwlGY0NoYXIzMgltaXNzaW5nOworCUZjQ2hhclNldEl0ZXIJY2ksIGNoZWNraTsKKwkKKwkvKiBudWxsIHRlcm1pbmF0ZSBmb3IgcGFyc2VyICovCisJRmNOYW1lQnVmQ2hhciAoYnVmLCAnXDAnKTsKKwkvKiBzdGVwIGJhY2sgb3ZlciBudWxsIGZvciBsaWZlIGFmdGVyIHRlc3QgKi8KKwlidWYtPmxlbi0tOworCWNoZWNrID0gRmNOYW1lUGFyc2VDaGFyU2V0IChidWYtPmJ1ZiArIGxlbik7CisJRmNDaGFyU2V0SXRlclN0YXJ0IChjLCAmY2kpOworCUZjQ2hhclNldEl0ZXJTdGFydCAoY2hlY2ssICZjaGVja2kpOworCXdoaWxlIChjaS5sZWFmIHx8IGNoZWNraS5sZWFmKQorCXsKKwkgICAgaWYgKGNpLnVjczQgPCBjaGVja2kudWNzNCkKKwkgICAgeworCQlwcmludGYgKCJNaXNzaW5nIGxlYWYgbm9kZSBhdCAweCV4XG4iLCBjaS51Y3M0KTsKKwkJRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoY2hlY2tpLnVjczQgPCBjaS51Y3M0KQorCSAgICB7CisJCXByaW50ZiAoIkV4dHJhIGxlYWYgbm9kZSBhdCAweCV4XG4iLCBjaGVja2kudWNzNCk7CisJCUZjQ2hhclNldEl0ZXJOZXh0IChjaGVjaywgJmNoZWNraSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWludAkgICAgaSA9IDI1Ni8zMjsKKwkJRmNDaGFyMzIgICAgKmNtID0gY2kubGVhZi0+bWFwOworCQlGY0NoYXIzMiAgICAqY2hlY2ttID0gY2hlY2tpLmxlYWYtPm1hcDsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDMyKQorCQl7CisJCSAgICBpZiAoKmNtICE9ICpjaGVja20pCisJCQlwcmludGYgKCJNaXNtYXRjaGluZyBzZXRzIGF0IDB4JTA4eDogMHglMDh4ICE9IDB4JTA4eFxuIiwKKwkJCQljaS51Y3M0ICsgaSwgKmNtLCAqY2hlY2ttKTsKKwkJICAgIGNtKys7CisJCSAgICBjaGVja20rKzsKKwkJfQorCQlGY0NoYXJTZXRJdGVyTmV4dCAoYywgJmNpKTsKKwkJRmNDaGFyU2V0SXRlck5leHQgKGNoZWNrLCAmY2hlY2tpKTsKKwkgICAgfQorCX0KKwlpZiAoKG1pc3NpbmcgPSBGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjLCBjaGVjaykpKQorCSAgICBwcmludGYgKCIlZCBtaXNzaW5nIGluIHJlcGFyc2VkIHJlc3VsdFxuIiwgbWlzc2luZyk7CisJaWYgKChtaXNzaW5nID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY2hlY2ssIGMpKSkKKwkgICAgcHJpbnRmICgiJWQgZXh0cmEgaW4gcmVwYXJzZWQgcmVzdWx0XG4iLCBtaXNzaW5nKTsKKwlGY0NoYXJTZXREZXN0cm95IChjaGVjayk7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY2ZyZWV0eXBlLmg+CisKKy8qCisgKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIGF2YWlsYWJsZSBmcmVldHlwZSBoYXMgRlRfR2V0X05leHRfQ2hhcgorICovCisKKyNpZiBGUkVFVFlQRV9NQUpPUiA+IDIKKyMgZGVmaW5lIEhBU19ORVhUX0NIQVIKKyNlbHNlCisjIGlmIEZSRUVUWVBFX01BSk9SID09IDIKKyMgIGlmIEZSRUVUWVBFX01JTk9SID4gMAorIyAgIGRlZmluZSBIQVNfTkVYVF9DSEFSCisjICBlbHNlCisjICAgaWYgRlJFRVRZUEVfTUlOT1IgPT0gMAorIyAgICBpZiBGUkVFVFlQRV9QQVRDSCA+PSA4CisjICAgICBkZWZpbmUgSEFTX05FWFRfQ0hBUgorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBGb3Igb3VyIHB1cnBvc2VzLCB0aGlzIGFwcHJveGltYXRpb24gaXMgc3VmZmljaWVudAorICovCisjaWZuZGVmIEhBU19ORVhUX0NIQVIKKyNkZWZpbmUgRlRfR2V0X05leHRfQ2hhcihmYWNlLCB1Y3M0KSAoKHVjczQpID49IDB4ZmZmZmZmID8gMCA6ICh1Y3M0KSArIDEpCisjd2FybmluZyAiTm8gRlRfR2V0X05leHRfQ2hhciIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfRmNDaGFyRW50IHsKKyAgICBGY0NoYXIxNglibXA7CisgICAgRmNDaGFyOAllbmNvZGU7Cit9IEZjQ2hhckVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhck1hcCB7CisgICAgY29uc3QgRmNDaGFyRW50ICplbnQ7CisgICAgaW50CQkgICAgbmVudDsKK30gRmNDaGFyTWFwOworCit0eXBlZGVmIHN0cnVjdCBfRmNGb250RGVjb2RlIHsKKyAgICBGVF9FbmNvZGluZwkgICAgZW5jb2Rpbmc7CisgICAgY29uc3QgRmNDaGFyTWFwICptYXA7CisgICAgRmNDaGFyMzIJICAgIG1heDsKK30gRmNGb250RGVjb2RlOworCitzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFwcGxlUm9tYW47CitzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFkb2JlU3ltYm9sOworICAgIAorc3RhdGljIGNvbnN0IEZjRm9udERlY29kZSBmY0ZvbnREZWNvZGVyc1tdID0geworICAgIHsgZnRfZW5jb2RpbmdfdW5pY29kZSwJMCwJCSgxIDw8IDIxKSAtIDEgfSwKKyAgICB7IGZ0X2VuY29kaW5nX3N5bWJvbCwJJkFkb2JlU3ltYm9sLAkoMSA8PCAxNikgLSAxIH0sCisgICAgeyBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiwJJkFwcGxlUm9tYW4sCSgxIDw8IDE2KSAtIDEgfSwKK307CisKKyNkZWZpbmUgTlVNX0RFQ09ERSAgKHNpemVvZiAoZmNGb250RGVjb2RlcnMpIC8gc2l6ZW9mIChmY0ZvbnREZWNvZGVyc1swXSkpCisKK3N0YXRpYyBGVF9VTG9uZworRmNGcmVlVHlwZU1hcENoYXIgKEZjQ2hhcjMyIHVjczQsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKQoreworICAgIGludAkJbG93LCBoaWdoLCBtaWQ7CisgICAgRmNDaGFyMTYJYm1wOworCisgICAgbG93ID0gMDsKKyAgICBoaWdoID0gbWFwLT5uZW50IC0gMTsKKyAgICBpZiAodWNzNCA8IG1hcC0+ZW50W2xvd10uYm1wIHx8IG1hcC0+ZW50W2hpZ2hdLmJtcCA8IHVjczQpCisJcmV0dXJuIH4wOworICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkKKyAgICB7CisJbWlkID0gKGhpZ2ggKyBsb3cpID4+IDE7CisJYm1wID0gbWFwLT5lbnRbbWlkXS5ibXA7CisJaWYgKHVjczQgPT0gYm1wKQorCSAgICByZXR1cm4gKEZUX1VMb25nKSBtYXAtPmVudFttaWRdLmVuY29kZTsKKwlpZiAodWNzNCA8IGJtcCkKKwkgICAgaGlnaCA9IG1pZDsKKwllbHNlCisJICAgIGxvdyA9IG1pZDsKKyAgICB9CisgICAgZm9yIChtaWQgPSBsb3c7IG1pZCA8PSBoaWdoOyBtaWQrKykKKyAgICB7CisJaWYgKHVjczQgPT0gbWFwLT5lbnRbbWlkXS5ibXApCisJICAgIHJldHVybiAoRlRfVUxvbmcpIG1hcC0+ZW50W21pZF0uZW5jb2RlOworICAgIH0KKyAgICByZXR1cm4gfjA7Cit9CisKKy8qCisgKiBNYXAgYSBVQ1M0IGdseXBoIHRvIGEgZ2x5cGggaW5kZXguICBVc2UgYWxsIGF2YWlsYWJsZSBlbmNvZGluZworICogdGFibGVzIHRvIHRyeSBhbmQgZmluZCBvbmUgdGhhdCB3b3Jrcy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQKKyAqIHRvIGJlIGNhY2hlZCBieSBoaWdoZXIgbGV2ZWxzLCBzbyBwZXJmb3JtYW5jZSBpc24ndCBjcml0aWNhbAorICovCisKK0ZUX1VJbnQKK0ZjRnJlZVR5cGVDaGFySW5kZXggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCkKK3sKKyAgICBpbnQJCSAgICBpbml0aWFsLCBvZmZzZXQsIGRlY29kZTsKKyAgICBGVF9VSW50CSAgICBnbHlwaGluZGV4OworICAgIEZUX1VMb25nCSAgICBjaGFyY29kZTsKKworICAgIGluaXRpYWwgPSAwOworICAgIC8qCisgICAgICogRmluZCB0aGUgY3VycmVudCBlbmNvZGluZworICAgICAqLworICAgIGlmIChmYWNlLT5jaGFybWFwKQorICAgIHsKKwlmb3IgKDsgaW5pdGlhbCA8IE5VTV9ERUNPREU7IGluaXRpYWwrKykKKwkgICAgaWYgKGZjRm9udERlY29kZXJzW2luaXRpYWxdLmVuY29kaW5nID09IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nKQorCQlicmVhazsKKwlpZiAoaW5pdGlhbCA9PSBOVU1fREVDT0RFKQorCSAgICBpbml0aWFsID0gMDsKKyAgICB9CisgICAgLyoKKyAgICAgKiBDaGVjayBlYWNoIGVuY29kaW5nIGZvciB0aGUgZ2x5cGgsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgb25lCisgICAgICovCisgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBOVU1fREVDT0RFOyBvZmZzZXQrKykKKyAgICB7CisJZGVjb2RlID0gKGluaXRpYWwgKyBvZmZzZXQpICUgTlVNX0RFQ09ERTsKKwlpZiAoIWZhY2UtPmNoYXJtYXAgfHwgZmFjZS0+Y2hhcm1hcC0+ZW5jb2RpbmcgIT0gZmNGb250RGVjb2RlcnNbZGVjb2RlXS5lbmNvZGluZykKKwkgICAgaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKSAhPSAwKQorCQljb250aW51ZTsKKwlpZiAoZmNGb250RGVjb2RlcnNbZGVjb2RlXS5tYXApCisJeworCSAgICBjaGFyY29kZSA9IEZjRnJlZVR5cGVNYXBDaGFyICh1Y3M0LCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCk7CisJICAgIGlmIChjaGFyY29kZSA9PSB+MCkKKwkJY29udGludWU7CisJfQorCWVsc2UKKwkgICAgY2hhcmNvZGUgPSAoRlRfVUxvbmcpIHVjczQ7CisJZ2x5cGhpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCBjaGFyY29kZSk7CisJaWYgKGdseXBoaW5kZXgpCisJICAgIHJldHVybiBnbHlwaGluZGV4OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEZjQm9vbAorRmNGcmVlVHlwZUNoZWNrR2x5cGggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCwgCisJCSAgICAgIEZUX1VJbnQgZ2x5cGgsIEZjQmxhbmtzICpibGFua3MpCit7CisgICAgRlRfSW50CSAgICBsb2FkX2ZsYWdzID0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKKyAgICBGVF9HbHlwaFNsb3QgICAgc2xvdDsKKyAgICAKKyAgICAvKgorICAgICAqIFdoZW4gdXNpbmcgc2NhbGFibGUgZm9udHMsIG9ubHkgcmVwb3J0IHRob3NlIGdseXBocworICAgICAqIHdoaWNoIGNhbiBiZSBzY2FsZWQ7IG90aGVyd2lzZSB0aG9zZSBmb250cyB3aWxsCisgICAgICogb25seSBiZSBhdmFpbGFibGUgYXQgc29tZSBzaXplcywgYW5kIG5ldmVyIHdoZW4KKyAgICAgKiB0cmFuc2Zvcm1lZC4gIEF2b2lkIHRoaXMgYnkgc2ltcGx5IHJlcG9ydGluZyBiaXRtYXAtb25seQorICAgICAqIGdseXBocyBhcyBtaXNzaW5nCisgICAgICovCisgICAgaWYgKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpCisJbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0JJVE1BUDsKKyAgICAKKyAgICBpZiAoRlRfTG9hZF9HbHlwaCAoZmFjZSwgZ2x5cGgsIGxvYWRfZmxhZ3MpKQorCXJldHVybiBGY0ZhbHNlOworICAgIAorICAgIHNsb3QgPSBmYWNlLT5nbHlwaDsKKyAgICBpZiAoIWdseXBoKQorCXJldHVybiBGY0ZhbHNlOworICAgIAorICAgIHN3aXRjaCAoc2xvdC0+Zm9ybWF0KSB7CisgICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOgorCS8qCisJICogQml0bWFwcyBhcmUgYXNzdW1lZCB0byBiZSByZWFzb25hYmxlOyBpZgorCSAqIHRoaXMgcHJvdmVzIHRvIGJlIGEgcmFzaCBhc3N1bXB0aW9uLCB0aGlzCisJICogY29kZSBjYW4gYmUgZWFzaWx5IG1vZGlmaWVkCisJICovCisJcmV0dXJuIEZjVHJ1ZTsKKyAgICBjYXNlIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lOgorCS8qCisJICogR2x5cGhzIHdpdGggY29udG91cnMgYXJlIGFsd2F5cyBPSworCSAqLworCWlmIChzbG90LT5vdXRsaW5lLm5fY29udG91cnMgIT0gMCkKKwkgICAgcmV0dXJuIEZjVHJ1ZTsKKwkvKgorCSAqIEdseXBocyB3aXRoIG5vIGNvbnRvdXJzIGFyZSBvbmx5IE9LIGlmCisJICogdGhleSdyZSBtZW1iZXJzIG9mIHRoZSBCbGFua3Mgc2V0IHNwZWNpZmllZAorCSAqIGluIHRoZSBjb25maWd1cmF0aW9uLiAgSWYgYmxhbmtzIGlzbid0IHNldCwKKwkgKiB0aGVuIGFsbG93IGFueSBnbHlwaCB0byBiZSBibGFuaworCSAqLworCWlmICghYmxhbmtzIHx8IEZjQmxhbmtzSXNNZW1iZXIgKGJsYW5rcywgdWNzNCkpCisJICAgIHJldHVybiBGY1RydWU7CisJLyogZmFsbCB0aHJvdWdoIC4uLiAqLworICAgIGRlZmF1bHQ6CisgICAgfQorICAgIHJldHVybiBGY0ZhbHNlOworfQorCitGY0NoYXJTZXQgKgorRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcykKK3sKKyAgICBGY0NoYXIzMgkgICAgcGFnZSwgb2ZmLCBtYXgsIHVjczQ7CisjaWZkZWYgQ0hFQ0sKKyAgICBGY0NoYXIzMgkgICAgZm9udF9tYXggPSAwOworI2VuZGlmCisgICAgRmNDaGFyU2V0CSAgICAqZmNzOworICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOworICAgIGNvbnN0IEZjQ2hhck1hcCAqbWFwOworICAgIGludAkJICAgIG87CisgICAgaW50CQkgICAgaTsKKyAgICBGVF9VSW50CSAgICBnbHlwaDsKKworICAgIGZjcyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKKyAgICBpZiAoIWZjcykKKwlnb3RvIGJhaWwwOworICAgIAorICAgIGZvciAobyA9IDA7IG8gPCBOVU1fREVDT0RFOyBvKyspCisgICAgeworCWlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbb10uZW5jb2RpbmcpICE9IDApCisJICAgIGNvbnRpbnVlOworCW1hcCA9IGZjRm9udERlY29kZXJzW29dLm1hcDsKKwlpZiAobWFwKQorCXsKKwkgICAgLyoKKwkgICAgICogTm9uLVVuaWNvZGUgdGFibGVzIGFyZSBlYXN5OyB0aGVyZSdzIGEgbGlzdCBvZiBhbGwgcG9zc2libGUKKwkgICAgICogY2hhcmFjdGVycworCSAgICAgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IG1hcC0+bmVudDsgaSsrKQorCSAgICB7CisJCXVjczQgPSBtYXAtPmVudFtpXS5ibXA7CisJCWdseXBoID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIG1hcC0+ZW50W2ldLmVuY29kZSk7CisJCWlmIChnbHlwaCAmJiBGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgZ2x5cGgsIGJsYW5rcykpCisJCXsKKwkJICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKKwkJICAgIGlmICghbGVhZikKKwkJCWdvdG8gYmFpbDE7CisJCSAgICBsZWFmLT5tYXBbKHVjczQgJiAweGZmKSA+PiA1XSB8PSAoMSA8PCAodWNzNCAmIDB4MWYpKTsKKyNpZmRlZiBDSEVDSworCQkgICAgaWYgKHVjczQgPiBmb250X21heCkKKwkJCWZvbnRfbWF4ID0gdWNzNDsKKyNlbmRpZgorCQl9CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgbWF4ID0gZmNGb250RGVjb2RlcnNbb10ubWF4OworCSAgCisJICAgIC8qCisJICAgICAqIEZpbmQgdGhlIGZpcnN0IGVuY29kZWQgY2hhcmFjdGVyIGluIHRoZSBmb250CisJICAgICAqLworCSAgICB1Y3M0ID0gMDsKKwkgICAgaWYgKEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCAwKSkKKwkJdWNzNCA9IDA7CisJICAgIGVsc2UKKwkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIDApOworCisJICAgIGZvciAoOzspCisJICAgIHsKKwkJcGFnZSA9IHVjczQgPj4gODsKKwkJbGVhZiA9IDA7CisJCXdoaWxlICgodWNzNCA+PiA4KSA9PSBwYWdlKQorCQl7CisJCSAgICBnbHlwaCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KTsKKwkJICAgIGlmIChnbHlwaCAmJiBGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgCisJCQkJCQkgICAgICAgZ2x5cGgsIGJsYW5rcykpCisJCSAgICB7CisJCQlpZiAoIWxlYWYpCisJCQl7CisJCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOworCQkJICAgIGlmICghbGVhZikKKwkJCQlnb3RvIGJhaWwxOworCQkJfQorCQkJb2ZmID0gdWNzNCAmIDB4ZmY7CisJCQlsZWFmLT5tYXBbb2ZmID4+IDVdIHw9ICgxIDw8IChvZmYgJiAweDFmKSk7CisjaWZkZWYgQ0hFQ0sKKwkJCWlmICh1Y3M0ID4gZm9udF9tYXgpCisJCQkgICAgZm9udF9tYXggPSB1Y3M0OworI2VuZGlmCisJCSAgICB9CisJCSAgICB1Y3M0Kys7CisJCX0KKwkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIHVjczQgLSAxKTsKKwkJaWYgKCF1Y3M0KQorCQkgICAgYnJlYWs7CisJICAgIH0KKyNpZmRlZiBDSEVDSworCSAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDwgMHgxMDAwMDsgdWNzNCsrKQorCSAgICB7CisJCUZjQm9vbAkgICAgRlRfSGFzLCBGQ19IYXM7CisKKwkJRlRfSGFzID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIHVjczQpICE9IDA7CisJCUZDX0hhcyA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CisJCWlmIChGVF9IYXMgIT0gRkNfSGFzKQorCQl7CisJCSAgICBwcmludGYgKCIweCUwOHggRlQgc2F5cyAlZCBGQyBzYXlzICVkXG4iLCB1Y3M0LCBGVF9IYXMsIEZDX0hhcyk7CisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorICAgIH0KKyNpZmRlZiBDSEVDSworICAgIHByaW50ZiAoIiVkIGdseXBocyAlZCBlbmNvZGVkXG4iLCAoaW50KSBmYWNlLT5udW1fZ2x5cGhzLCBGY0NoYXJTZXRDb3VudCAoZmNzKSk7CisgICAgZm9yICh1Y3M0ID0gMDsgdWNzNCA8PSBmb250X21heDsgdWNzNCsrKQorICAgIHsKKwlGY0Jvb2wJaGFzX2NoYXIgPSBGY0ZyZWVUeXBlQ2hhckluZGV4IChmYWNlLCB1Y3M0KSAhPSAwOworCUZjQm9vbAloYXNfYml0ID0gRmNDaGFyU2V0SGFzQ2hhciAoZmNzLCB1Y3M0KTsKKworCWlmIChoYXNfY2hhciAmJiAhaGFzX2JpdCkKKwkgICAgcHJpbnRmICgiQml0bWFwIG1pc3NpbmcgY2hhciAweCV4XG4iLCB1Y3M0KTsKKwllbHNlIGlmICghaGFzX2NoYXIgJiYgaGFzX2JpdCkKKwkgICAgcHJpbnRmICgiQml0bWFwIGV4dHJhIGNoYXIgMHgleFxuIiwgdWNzNCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGZjczsKK2JhaWwxOgorICAgIEZjQ2hhclNldERlc3Ryb3kgKGZjcyk7CitiYWlsMDoKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBcHBsZVJvbWFuRW50W10gPSB7CisgICAgeyAweDAwMjAsIDB4MjAgfSwgLyogU1BBQ0UgKi8KKyAgICB7IDB4MDAyMSwgMHgyMSB9LCAvKiBFWENMQU1BVElPTiBNQVJLICovCisgICAgeyAweDAwMjIsIDB4MjIgfSwgLyogUVVPVEFUSU9OIE1BUksgKi8KKyAgICB7IDB4MDAyMywgMHgyMyB9LCAvKiBOVU1CRVIgU0lHTiAqLworICAgIHsgMHgwMDI0LCAweDI0IH0sIC8qIERPTExBUiBTSUdOICovCisgICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOICovCisgICAgeyAweDAwMjYsIDB4MjYgfSwgLyogQU1QRVJTQU5EICovCisgICAgeyAweDAwMjcsIDB4MjcgfSwgLyogQVBPU1RST1BIRSAqLworICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMgKi8KKyAgICB7IDB4MDAyOSwgMHgyOSB9LCAvKiBSSUdIVCBQQVJFTlRIRVNJUyAqLworICAgIHsgMHgwMDJBLCAweDJBIH0sIC8qIEFTVEVSSVNLICovCisgICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOICovCisgICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEgKi8KKyAgICB7IDB4MDAyRCwgMHgyRCB9LCAvKiBIWVBIRU4tTUlOVVMgKi8KKyAgICB7IDB4MDAyRSwgMHgyRSB9LCAvKiBGVUxMIFNUT1AgKi8KKyAgICB7IDB4MDAyRiwgMHgyRiB9LCAvKiBTT0xJRFVTICovCisgICAgeyAweDAwMzAsIDB4MzAgfSwgLyogRElHSVQgWkVSTyAqLworICAgIHsgMHgwMDMxLCAweDMxIH0sIC8qIERJR0lUIE9ORSAqLworICAgIHsgMHgwMDMyLCAweDMyIH0sIC8qIERJR0lUIFRXTyAqLworICAgIHsgMHgwMDMzLCAweDMzIH0sIC8qIERJR0lUIFRIUkVFICovCisgICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUiAqLworICAgIHsgMHgwMDM1LCAweDM1IH0sIC8qIERJR0lUIEZJVkUgKi8KKyAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVggKi8KKyAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTiAqLworICAgIHsgMHgwMDM4LCAweDM4IH0sIC8qIERJR0lUIEVJR0hUICovCisgICAgeyAweDAwMzksIDB4MzkgfSwgLyogRElHSVQgTklORSAqLworICAgIHsgMHgwMDNBLCAweDNBIH0sIC8qIENPTE9OICovCisgICAgeyAweDAwM0IsIDB4M0IgfSwgLyogU0VNSUNPTE9OICovCisgICAgeyAweDAwM0MsIDB4M0MgfSwgLyogTEVTUy1USEFOIFNJR04gKi8KKyAgICB7IDB4MDAzRCwgMHgzRCB9LCAvKiBFUVVBTFMgU0lHTiAqLworICAgIHsgMHgwMDNFLCAweDNFIH0sIC8qIEdSRUFURVItVEhBTiBTSUdOICovCisgICAgeyAweDAwM0YsIDB4M0YgfSwgLyogUVVFU1RJT04gTUFSSyAqLworICAgIHsgMHgwMDQwLCAweDQwIH0sIC8qIENPTU1FUkNJQUwgQVQgKi8KKyAgICB7IDB4MDA0MSwgMHg0MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBICovCisgICAgeyAweDAwNDIsIDB4NDIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiAqLworICAgIHsgMHgwMDQzLCAweDQzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgKi8KKyAgICB7IDB4MDA0NCwgMHg0NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEICovCisgICAgeyAweDAwNDUsIDB4NDUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSAqLworICAgIHsgMHgwMDQ2LCAweDQ2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEYgKi8KKyAgICB7IDB4MDA0NywgMHg0NyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHICovCisgICAgeyAweDAwNDgsIDB4NDggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCAqLworICAgIHsgMHgwMDQ5LCAweDQ5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgKi8KKyAgICB7IDB4MDA0QSwgMHg0QSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovCisgICAgeyAweDAwNEIsIDB4NEIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyAqLworICAgIHsgMHgwMDRDLCAweDRDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEwgKi8KKyAgICB7IDB4MDA0RCwgMHg0RCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovCisgICAgeyAweDAwNEUsIDB4NEUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiAqLworICAgIHsgMHgwMDRGLCAweDRGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gKi8KKyAgICB7IDB4MDA1MCwgMHg1MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovCisgICAgeyAweDAwNTEsIDB4NTEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUSAqLworICAgIHsgMHgwMDUyLCAweDUyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFIgKi8KKyAgICB7IDB4MDA1MywgMHg1MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTICovCisgICAgeyAweDAwNTQsIDB4NTQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCAqLworICAgIHsgMHgwMDU1LCAweDU1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgKi8KKyAgICB7IDB4MDA1NiwgMHg1NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWICovCisgICAgeyAweDAwNTcsIDB4NTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyAqLworICAgIHsgMHgwMDU4LCAweDU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFggKi8KKyAgICB7IDB4MDA1OSwgMHg1OSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZICovCisgICAgeyAweDAwNUEsIDB4NUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiAqLworICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgKi8KKyAgICB7IDB4MDA1QywgMHg1QyB9LCAvKiBSRVZFUlNFIFNPTElEVVMgKi8KKyAgICB7IDB4MDA1RCwgMHg1RCB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCAqLworICAgIHsgMHgwMDVFLCAweDVFIH0sIC8qIENJUkNVTUZMRVggQUNDRU5UICovCisgICAgeyAweDAwNUYsIDB4NUYgfSwgLyogTE9XIExJTkUgKi8KKyAgICB7IDB4MDA2MCwgMHg2MCB9LCAvKiBHUkFWRSBBQ0NFTlQgKi8KKyAgICB7IDB4MDA2MSwgMHg2MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLworICAgIHsgMHgwMDYyLCAweDYyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBCICovCisgICAgeyAweDAwNjMsIDB4NjMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEMgKi8KKyAgICB7IDB4MDA2NCwgMHg2NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLworICAgIHsgMHgwMDY1LCAweDY1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFICovCisgICAgeyAweDAwNjYsIDB4NjYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgKi8KKyAgICB7IDB4MDA2NywgMHg2NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLworICAgIHsgMHgwMDY4LCAweDY4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBIICovCisgICAgeyAweDAwNjksIDB4NjkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgKi8KKyAgICB7IDB4MDA2QSwgMHg2QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSiAqLworICAgIHsgMHgwMDZCLCAweDZCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBLICovCisgICAgeyAweDAwNkMsIDB4NkMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEwgKi8KKyAgICB7IDB4MDA2RCwgMHg2RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTSAqLworICAgIHsgMHgwMDZFLCAweDZFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBOICovCisgICAgeyAweDAwNkYsIDB4NkYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gKi8KKyAgICB7IDB4MDA3MCwgMHg3MCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUCAqLworICAgIHsgMHgwMDcxLCAweDcxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBRICovCisgICAgeyAweDAwNzIsIDB4NzIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFIgKi8KKyAgICB7IDB4MDA3MywgMHg3MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUyAqLworICAgIHsgMHgwMDc0LCAweDc0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBUICovCisgICAgeyAweDAwNzUsIDB4NzUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgKi8KKyAgICB7IDB4MDA3NiwgMHg3NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgViAqLworICAgIHsgMHgwMDc3LCAweDc3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBXICovCisgICAgeyAweDAwNzgsIDB4NzggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFggKi8KKyAgICB7IDB4MDA3OSwgMHg3OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSAqLworICAgIHsgMHgwMDdBLCAweDdBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBaICovCisgICAgeyAweDAwN0IsIDB4N0IgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUICovCisgICAgeyAweDAwN0MsIDB4N0MgfSwgLyogVkVSVElDQUwgTElORSAqLworICAgIHsgMHgwMDdELCAweDdEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgKi8KKyAgICB7IDB4MDA3RSwgMHg3RSB9LCAvKiBUSUxERSAqLworICAgIHsgMHgwMEEwLCAweENBIH0sIC8qIE5PLUJSRUFLIFNQQUNFICovCisgICAgeyAweDAwQTEsIDB4QzEgfSwgLyogSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSyAqLworICAgIHsgMHgwMEEyLCAweEEyIH0sIC8qIENFTlQgU0lHTiAqLworICAgIHsgMHgwMEEzLCAweEEzIH0sIC8qIFBPVU5EIFNJR04gKi8KKyAgICB7IDB4MDBBNSwgMHhCNCB9LCAvKiBZRU4gU0lHTiAqLworICAgIHsgMHgwMEE3LCAweEE0IH0sIC8qIFNFQ1RJT04gU0lHTiAqLworICAgIHsgMHgwMEE4LCAweEFDIH0sIC8qIERJQUVSRVNJUyAqLworICAgIHsgMHgwMEE5LCAweEE5IH0sIC8qIENPUFlSSUdIVCBTSUdOICovCisgICAgeyAweDAwQUEsIDB4QkIgfSwgLyogRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyAgICB7IDB4MDBBQiwgMHhDNyB9LCAvKiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgIHsgMHgwMEFDLCAweEMyIH0sIC8qIE5PVCBTSUdOICovCisgICAgeyAweDAwQUUsIDB4QTggfSwgLyogUkVHSVNURVJFRCBTSUdOICovCisgICAgeyAweDAwQUYsIDB4RjggfSwgLyogTUFDUk9OICovCisgICAgeyAweDAwQjAsIDB4QTEgfSwgLyogREVHUkVFIFNJR04gKi8KKyAgICB7IDB4MDBCMSwgMHhCMSB9LCAvKiBQTFVTLU1JTlVTIFNJR04gKi8KKyAgICB7IDB4MDBCNCwgMHhBQiB9LCAvKiBBQ1VURSBBQ0NFTlQgKi8KKyAgICB7IDB4MDBCNSwgMHhCNSB9LCAvKiBNSUNSTyBTSUdOICovCisgICAgeyAweDAwQjYsIDB4QTYgfSwgLyogUElMQ1JPVyBTSUdOICovCisgICAgeyAweDAwQjcsIDB4RTEgfSwgLyogTUlERExFIERPVCAqLworICAgIHsgMHgwMEI4LCAweEZDIH0sIC8qIENFRElMTEEgKi8KKyAgICB7IDB4MDBCQSwgMHhCQyB9LCAvKiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyAgICB7IDB4MDBCQiwgMHhDOCB9LCAvKiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICB7IDB4MDBCRiwgMHhDMCB9LCAvKiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLICovCisgICAgeyAweDAwQzAsIDB4Q0IgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCisgICAgeyAweDAwQzEsIDB4RTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCisgICAgeyAweDAwQzIsIDB4RTUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICB7IDB4MDBDMywgMHhDQyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi8KKyAgICB7IDB4MDBDNCwgMHg4MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCisgICAgeyAweDAwQzUsIDB4ODEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KKyAgICB7IDB4MDBDNiwgMHhBRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLworICAgIHsgMHgwMEM3LCAweDgyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCisgICAgeyAweDAwQzgsIDB4RTkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCisgICAgeyAweDAwQzksIDB4ODMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCisgICAgeyAweDAwQ0EsIDB4RTYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICB7IDB4MDBDQiwgMHhFOCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCisgICAgeyAweDAwQ0MsIDB4RUQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCisgICAgeyAweDAwQ0QsIDB4RUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCisgICAgeyAweDAwQ0UsIDB4RUIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICB7IDB4MDBDRiwgMHhFQyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCisgICAgeyAweDAwRDEsIDB4ODQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCisgICAgeyAweDAwRDIsIDB4RjEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCisgICAgeyAweDAwRDMsIDB4RUUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCisgICAgeyAweDAwRDQsIDB4RUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyAgICB7IDB4MDBENSwgMHhDRCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgKi8KKyAgICB7IDB4MDBENiwgMHg4NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCisgICAgeyAweDAwRDgsIDB4QUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworICAgIHsgMHgwMEQ5LCAweEY0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLworICAgIHsgMHgwMERBLCAweEYyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLworICAgIHsgMHgwMERCLCAweEYzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCisgICAgeyAweDAwREMsIDB4ODYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLworICAgIHsgMHgwMERGLCAweEE3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTICovCisgICAgeyAweDAwRTAsIDB4ODggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLworICAgIHsgMHgwMEUxLCAweDg3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KKyAgICB7IDB4MDBFMiwgMHg4OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICB7IDB4MDBFMywgMHg4QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovCisgICAgeyAweDAwRTQsIDB4OEEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KKyAgICB7IDB4MDBFNSwgMHg4QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KKyAgICB7IDB4MDBFNiwgMHhCRSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KKyAgICB7IDB4MDBFNywgMHg4RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KKyAgICB7IDB4MDBFOCwgMHg4RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCisgICAgeyAweDAwRTksIDB4OEUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLworICAgIHsgMHgwMEVBLCAweDkwIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgIHsgMHgwMEVCLCAweDkxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCisgICAgeyAweDAwRUMsIDB4OTMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLworICAgIHsgMHgwMEVELCAweDkyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KKyAgICB7IDB4MDBFRSwgMHg5NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICB7IDB4MDBFRiwgMHg5NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLworICAgIHsgMHgwMEYxLCAweDk2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUgKi8KKyAgICB7IDB4MDBGMiwgMHg5OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCisgICAgeyAweDAwRjMsIDB4OTcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLworICAgIHsgMHgwMEY0LCAweDk5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgIHsgMHgwMEY1LCAweDlCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUgKi8KKyAgICB7IDB4MDBGNiwgMHg5QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLworICAgIHsgMHgwMEY3LCAweEQ2IH0sIC8qIERJVklTSU9OIFNJR04gKi8KKyAgICB7IDB4MDBGOCwgMHhCRiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworICAgIHsgMHgwMEY5LCAweDlEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KKyAgICB7IDB4MDBGQSwgMHg5QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCisgICAgeyAweDAwRkIsIDB4OUUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCisgICAgeyAweDAwRkMsIDB4OUYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KKyAgICB7IDB4MDBGRiwgMHhEOCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLworICAgIHsgMHgwMTMxLCAweEY1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkgKi8KKyAgICB7IDB4MDE1MiwgMHhDRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FICovCisgICAgeyAweDAxNTMsIDB4Q0YgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgT0UgKi8KKyAgICB7IDB4MDE3OCwgMHhEOSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCisgICAgeyAweDAxOTIsIDB4QzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCisgICAgeyAweDAyQzYsIDB4RjYgfSwgLyogTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UICovCisgICAgeyAweDAyQzcsIDB4RkYgfSwgLyogQ0FST04gKi8KKyAgICB7IDB4MDJEOCwgMHhGOSB9LCAvKiBCUkVWRSAqLworICAgIHsgMHgwMkQ5LCAweEZBIH0sIC8qIERPVCBBQk9WRSAqLworICAgIHsgMHgwMkRBLCAweEZCIH0sIC8qIFJJTkcgQUJPVkUgKi8KKyAgICB7IDB4MDJEQiwgMHhGRSB9LCAvKiBPR09ORUsgKi8KKyAgICB7IDB4MDJEQywgMHhGNyB9LCAvKiBTTUFMTCBUSUxERSAqLworICAgIHsgMHgwMkRELCAweEZEIH0sIC8qIERPVUJMRSBBQ1VURSBBQ0NFTlQgKi8KKyAgICB7IDB4MDNBOSwgMHhCRCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSAqLworICAgIHsgMHgwM0MwLCAweEI5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSSAqLworICAgIHsgMHgyMDEzLCAweEQwIH0sIC8qIEVOIERBU0ggKi8KKyAgICB7IDB4MjAxNCwgMHhEMSB9LCAvKiBFTSBEQVNIICovCisgICAgeyAweDIwMTgsIDB4RDQgfSwgLyogTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICB7IDB4MjAxOSwgMHhENSB9LCAvKiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICB7IDB4MjAxQSwgMHhFMiB9LCAvKiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KKyAgICB7IDB4MjAxQywgMHhEMiB9LCAvKiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLworICAgIHsgMHgyMDFELCAweEQzIH0sIC8qIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLworICAgIHsgMHgyMDFFLCAweEUzIH0sIC8qIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLworICAgIHsgMHgyMDIwLCAweEEwIH0sIC8qIERBR0dFUiAqLworICAgIHsgMHgyMDIxLCAweEUwIH0sIC8qIERPVUJMRSBEQUdHRVIgKi8KKyAgICB7IDB4MjAyMiwgMHhBNSB9LCAvKiBCVUxMRVQgKi8KKyAgICB7IDB4MjAyNiwgMHhDOSB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTICovCisgICAgeyAweDIwMzAsIDB4RTQgfSwgLyogUEVSIE1JTExFIFNJR04gKi8KKyAgICB7IDB4MjAzOSwgMHhEQyB9LCAvKiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgIHsgMHgyMDNBLCAweEREIH0sIC8qIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgIHsgMHgyMDQ0LCAweERBIH0sIC8qIEZSQUNUSU9OIFNMQVNIICovCisgICAgeyAweDIwQUMsIDB4REIgfSwgLyogRVVSTyBTSUdOICovCisgICAgeyAweDIxMjIsIDB4QUEgfSwgLyogVFJBREUgTUFSSyBTSUdOICovCisgICAgeyAweDIyMDIsIDB4QjYgfSwgLyogUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KKyAgICB7IDB4MjIwNiwgMHhDNiB9LCAvKiBJTkNSRU1FTlQgKi8KKyAgICB7IDB4MjIwRiwgMHhCOCB9LCAvKiBOLUFSWSBQUk9EVUNUICovCisgICAgeyAweDIyMTEsIDB4QjcgfSwgLyogTi1BUlkgU1VNTUFUSU9OICovCisgICAgeyAweDIyMUEsIDB4QzMgfSwgLyogU1FVQVJFIFJPT1QgKi8KKyAgICB7IDB4MjIxRSwgMHhCMCB9LCAvKiBJTkZJTklUWSAqLworICAgIHsgMHgyMjJCLCAweEJBIH0sIC8qIElOVEVHUkFMICovCisgICAgeyAweDIyNDgsIDB4QzUgfSwgLyogQUxNT1NUIEVRVUFMIFRPICovCisgICAgeyAweDIyNjAsIDB4QUQgfSwgLyogTk9UIEVRVUFMIFRPICovCisgICAgeyAweDIyNjQsIDB4QjIgfSwgLyogTEVTUy1USEFOIE9SIEVRVUFMIFRPICovCisgICAgeyAweDIyNjUsIDB4QjMgfSwgLyogR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPICovCisgICAgeyAweDI1Q0EsIDB4RDcgfSwgLyogTE9aRU5HRSAqLworICAgIHsgMHhGOEZGLCAweEYwIH0sIC8qIEFwcGxlIGxvZ28gKi8KKyAgICB7IDB4RkIwMSwgMHhERSB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSSAqLworICAgIHsgMHhGQjAyLCAweERGIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIEZMICovCit9OworCitzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFwcGxlUm9tYW4gPSB7CisgICAgQXBwbGVSb21hbkVudCwKKyAgICBzaXplb2YgKEFwcGxlUm9tYW5FbnQpIC8gc2l6ZW9mIChBcHBsZVJvbWFuRW50WzBdKQorfTsKKworc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBZG9iZVN5bWJvbEVudFtdID0geworICAgIHsgMHgwMDIwLCAweDIwIH0sIC8qIFNQQUNFCSMgc3BhY2UgKi8KKyAgICB7IDB4MDAyMSwgMHgyMSB9LCAvKiBFWENMQU1BVElPTiBNQVJLCSMgZXhjbGFtICovCisgICAgeyAweDAwMjMsIDB4MjMgfSwgLyogTlVNQkVSIFNJR04JIyBudW1iZXJzaWduICovCisgICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOCSMgcGVyY2VudCAqLworICAgIHsgMHgwMDI2LCAweDI2IH0sIC8qIEFNUEVSU0FORAkjIGFtcGVyc2FuZCAqLworICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMJIyBwYXJlbmxlZnQgKi8KKyAgICB7IDB4MDAyOSwgMHgyOSB9LCAvKiBSSUdIVCBQQVJFTlRIRVNJUwkjIHBhcmVucmlnaHQgKi8KKyAgICB7IDB4MDAyQiwgMHgyQiB9LCAvKiBQTFVTIFNJR04JIyBwbHVzICovCisgICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEJIyBjb21tYSAqLworICAgIHsgMHgwMDJFLCAweDJFIH0sIC8qIEZVTEwgU1RPUAkjIHBlcmlvZCAqLworICAgIHsgMHgwMDJGLCAweDJGIH0sIC8qIFNPTElEVVMJIyBzbGFzaCAqLworICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8JIyB6ZXJvICovCisgICAgeyAweDAwMzEsIDB4MzEgfSwgLyogRElHSVQgT05FCSMgb25lICovCisgICAgeyAweDAwMzIsIDB4MzIgfSwgLyogRElHSVQgVFdPCSMgdHdvICovCisgICAgeyAweDAwMzMsIDB4MzMgfSwgLyogRElHSVQgVEhSRUUJIyB0aHJlZSAqLworICAgIHsgMHgwMDM0LCAweDM0IH0sIC8qIERJR0lUIEZPVVIJIyBmb3VyICovCisgICAgeyAweDAwMzUsIDB4MzUgfSwgLyogRElHSVQgRklWRQkjIGZpdmUgKi8KKyAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVgJIyBzaXggKi8KKyAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTgkjIHNldmVuICovCisgICAgeyAweDAwMzgsIDB4MzggfSwgLyogRElHSVQgRUlHSFQJIyBlaWdodCAqLworICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUJIyBuaW5lICovCisgICAgeyAweDAwM0EsIDB4M0EgfSwgLyogQ09MT04JIyBjb2xvbiAqLworICAgIHsgMHgwMDNCLCAweDNCIH0sIC8qIFNFTUlDT0xPTgkjIHNlbWljb2xvbiAqLworICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOCSMgbGVzcyAqLworICAgIHsgMHgwMDNELCAweDNEIH0sIC8qIEVRVUFMUyBTSUdOCSMgZXF1YWwgKi8KKyAgICB7IDB4MDAzRSwgMHgzRSB9LCAvKiBHUkVBVEVSLVRIQU4gU0lHTgkjIGdyZWF0ZXIgKi8KKyAgICB7IDB4MDAzRiwgMHgzRiB9LCAvKiBRVUVTVElPTiBNQVJLCSMgcXVlc3Rpb24gKi8KKyAgICB7IDB4MDA1QiwgMHg1QiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUCSMgYnJhY2tldGxlZnQgKi8KKyAgICB7IDB4MDA1RCwgMHg1RCB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAkjIGJyYWNrZXRyaWdodCAqLworICAgIHsgMHgwMDVGLCAweDVGIH0sIC8qIExPVyBMSU5FCSMgdW5kZXJzY29yZSAqLworICAgIHsgMHgwMDdCLCAweDdCIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVAkjIGJyYWNlbGVmdCAqLworICAgIHsgMHgwMDdDLCAweDdDIH0sIC8qIFZFUlRJQ0FMIExJTkUJIyBiYXIgKi8KKyAgICB7IDB4MDA3RCwgMHg3RCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VyaWdodCAqLworICAgIHsgMHgwMEEwLCAweDIwIH0sIC8qIE5PLUJSRUFLIFNQQUNFCSMgc3BhY2UgKi8KKyAgICB7IDB4MDBBQywgMHhEOCB9LCAvKiBOT1QgU0lHTgkjIGxvZ2ljYWxub3QgKi8KKyAgICB7IDB4MDBCMCwgMHhCMCB9LCAvKiBERUdSRUUgU0lHTgkjIGRlZ3JlZSAqLworICAgIHsgMHgwMEIxLCAweEIxIH0sIC8qIFBMVVMtTUlOVVMgU0lHTgkjIHBsdXNtaW51cyAqLworICAgIHsgMHgwMEI1LCAweDZEIH0sIC8qIE1JQ1JPIFNJR04JIyBtdSAqLworICAgIHsgMHgwMEQ3LCAweEI0IH0sIC8qIE1VTFRJUExJQ0FUSU9OIFNJR04JIyBtdWx0aXBseSAqLworICAgIHsgMHgwMEY3LCAweEI4IH0sIC8qIERJVklTSU9OIFNJR04JIyBkaXZpZGUgKi8KKyAgICB7IDB4MDE5MiwgMHhBNiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sJIyBmbG9yaW4gKi8KKyAgICB7IDB4MDM5MSwgMHg0MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQkjIEFscGhhICovCisgICAgeyAweDAzOTIsIDB4NDIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQkjIEJldGEgKi8KKyAgICB7IDB4MDM5MywgMHg0NyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQkjIEdhbW1hICovCisgICAgeyAweDAzOTQsIDB4NDQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEJIyBEZWx0YSAqLworICAgIHsgMHgwMzk1LCAweDQ1IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04JIyBFcHNpbG9uICovCisgICAgeyAweDAzOTYsIDB4NUEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQkjIFpldGEgKi8KKyAgICB7IDB4MDM5NywgMHg0OCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEJIyBFdGEgKi8KKyAgICB7IDB4MDM5OCwgMHg1MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQkjIFRoZXRhICovCisgICAgeyAweDAzOTksIDB4NDkgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQkjIElvdGEgKi8KKyAgICB7IDB4MDM5QSwgMHg0QiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQkjIEthcHBhICovCisgICAgeyAweDAzOUIsIDB4NEMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEJIyBMYW1iZGEgKi8KKyAgICB7IDB4MDM5QywgMHg0RCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQkjIE11ICovCisgICAgeyAweDAzOUQsIDB4NEUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUJIyBOdSAqLworICAgIHsgMHgwMzlFLCAweDU4IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCSMgWGkgKi8KKyAgICB7IDB4MDM5RiwgMHg0RiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCSMgT21pY3JvbiAqLworICAgIHsgMHgwM0EwLCAweDUwIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCSMgUGkgKi8KKyAgICB7IDB4MDNBMSwgMHg1MiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8JIyBSaG8gKi8KKyAgICB7IDB4MDNBMywgMHg1MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQkjIFNpZ21hICovCisgICAgeyAweDAzQTQsIDB4NTQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCSMgVGF1ICovCisgICAgeyAweDAzQTUsIDB4NTUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgkjIFVwc2lsb24gKi8KKyAgICB7IDB4MDNBNiwgMHg0NiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkJIyBQaGkgKi8KKyAgICB7IDB4MDNBNywgMHg0MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkJIyBDaGkgKi8KKyAgICB7IDB4MDNBOCwgMHg1OSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kJIyBQc2kgKi8KKyAgICB7IDB4MDNBOSwgMHg1NyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQkjIE9tZWdhICovCisgICAgeyAweDAzQjEsIDB4NjEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCSMgYWxwaGEgKi8KKyAgICB7IDB4MDNCMiwgMHg2MiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQkjIGJldGEgKi8KKyAgICB7IDB4MDNCMywgMHg2NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEJIyBnYW1tYSAqLworICAgIHsgMHgwM0I0LCAweDY0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQkjIGRlbHRhICovCisgICAgeyAweDAzQjUsIDB4NjUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04JIyBlcHNpbG9uICovCisgICAgeyAweDAzQjYsIDB4N0EgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEJIyB6ZXRhICovCisgICAgeyAweDAzQjcsIDB4NjggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVUQQkjIGV0YSAqLworICAgIHsgMHgwM0I4LCAweDcxIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQkjIHRoZXRhICovCisgICAgeyAweDAzQjksIDB4NjkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIElPVEEJIyBpb3RhICovCisgICAgeyAweDAzQkEsIDB4NkIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCSMga2FwcGEgKi8KKyAgICB7IDB4MDNCQiwgMHg2QyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEJIyBsYW1iZGEgKi8KKyAgICB7IDB4MDNCQywgMHg2RCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTVUJIyBtdSAqLworICAgIHsgMHgwM0JELCAweDZFIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBOVQkjIG51ICovCisgICAgeyAweDAzQkUsIDB4NzggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFhJCSMgeGkgKi8KKyAgICB7IDB4MDNCRiwgMHg2RiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgkjIG9taWNyb24gKi8KKyAgICB7IDB4MDNDMCwgMHg3MCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEkJIyBwaSAqLworICAgIHsgMHgwM0MxLCAweDcyIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBSSE8JIyByaG8gKi8KKyAgICB7IDB4MDNDMiwgMHg1NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEJIyBzaWdtYTEgKi8KKyAgICB7IDB4MDNDMywgMHg3MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEJIyBzaWdtYSAqLworICAgIHsgMHgwM0M0LCAweDc0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUJIyB0YXUgKi8KKyAgICB7IDB4MDNDNSwgMHg3NSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgkjIHVwc2lsb24gKi8KKyAgICB7IDB4MDNDNiwgMHg2NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCSMgcGhpICovCisgICAgeyAweDAzQzcsIDB4NjMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIENISQkjIGNoaSAqLworICAgIHsgMHgwM0M4LCAweDc5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kJIyBwc2kgKi8KKyAgICB7IDB4MDNDOSwgMHg3NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EJIyBvbWVnYSAqLworICAgIHsgMHgwM0QxLCAweDRBIH0sIC8qIEdSRUVLIFRIRVRBIFNZTUJPTAkjIHRoZXRhMSAqLworICAgIHsgMHgwM0QyLCAweEExIH0sIC8qIEdSRUVLIFVQU0lMT04gV0lUSCBIT09LIFNZTUJPTAkjIFVwc2lsb24xICovCisgICAgeyAweDAzRDUsIDB4NkEgfSwgLyogR1JFRUsgUEhJIFNZTUJPTAkjIHBoaTEgKi8KKyAgICB7IDB4MDNENiwgMHg3NiB9LCAvKiBHUkVFSyBQSSBTWU1CT0wJIyBvbWVnYTEgKi8KKyAgICB7IDB4MjAyMiwgMHhCNyB9LCAvKiBCVUxMRVQJIyBidWxsZXQgKi8KKyAgICB7IDB4MjAyNiwgMHhCQyB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTCSMgZWxsaXBzaXMgKi8KKyAgICB7IDB4MjAzMiwgMHhBMiB9LCAvKiBQUklNRQkjIG1pbnV0ZSAqLworICAgIHsgMHgyMDMzLCAweEIyIH0sIC8qIERPVUJMRSBQUklNRQkjIHNlY29uZCAqLworICAgIHsgMHgyMDQ0LCAweEE0IH0sIC8qIEZSQUNUSU9OIFNMQVNICSMgZnJhY3Rpb24gKi8KKyAgICB7IDB4MjBBQywgMHhBMCB9LCAvKiBFVVJPIFNJR04JIyBFdXJvICovCisgICAgeyAweDIxMTEsIDB4QzEgfSwgLyogQkxBQ0stTEVUVEVSIENBUElUQUwgSQkjIElmcmFrdHVyICovCisgICAgeyAweDIxMTgsIDB4QzMgfSwgLyogU0NSSVBUIENBUElUQUwgUAkjIHdlaWVyc3RyYXNzICovCisgICAgeyAweDIxMUMsIDB4QzIgfSwgLyogQkxBQ0stTEVUVEVSIENBUElUQUwgUgkjIFJmcmFrdHVyICovCisgICAgeyAweDIxMjYsIDB4NTcgfSwgLyogT0hNIFNJR04JIyBPbWVnYSAqLworICAgIHsgMHgyMTM1LCAweEMwIH0sIC8qIEFMRUYgU1lNQk9MCSMgYWxlcGggKi8KKyAgICB7IDB4MjE5MCwgMHhBQyB9LCAvKiBMRUZUV0FSRFMgQVJST1cJIyBhcnJvd2xlZnQgKi8KKyAgICB7IDB4MjE5MSwgMHhBRCB9LCAvKiBVUFdBUkRTIEFSUk9XCSMgYXJyb3d1cCAqLworICAgIHsgMHgyMTkyLCAweEFFIH0sIC8qIFJJR0hUV0FSRFMgQVJST1cJIyBhcnJvd3JpZ2h0ICovCisgICAgeyAweDIxOTMsIDB4QUYgfSwgLyogRE9XTldBUkRTIEFSUk9XCSMgYXJyb3dkb3duICovCisgICAgeyAweDIxOTQsIDB4QUIgfSwgLyogTEVGVCBSSUdIVCBBUlJPVwkjIGFycm93Ym90aCAqLworICAgIHsgMHgyMUI1LCAweEJGIH0sIC8qIERPV05XQVJEUyBBUlJPVyBXSVRIIENPUk5FUiBMRUZUV0FSRFMJIyBjYXJyaWFnZXJldHVybiAqLworICAgIHsgMHgyMUQwLCAweERDIH0sIC8qIExFRlRXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibGxlZnQgKi8KKyAgICB7IDB4MjFEMSwgMHhERCB9LCAvKiBVUFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsdXAgKi8KKyAgICB7IDB4MjFEMiwgMHhERSB9LCAvKiBSSUdIVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJscmlnaHQgKi8KKyAgICB7IDB4MjFEMywgMHhERiB9LCAvKiBET1dOV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxkb3duICovCisgICAgeyAweDIxRDQsIDB4REIgfSwgLyogTEVGVCBSSUdIVCBET1VCTEUgQVJST1cJIyBhcnJvd2RibGJvdGggKi8KKyAgICB7IDB4MjIwMCwgMHgyMiB9LCAvKiBGT1IgQUxMCSMgdW5pdmVyc2FsICovCisgICAgeyAweDIyMDIsIDB4QjYgfSwgLyogUEFSVElBTCBESUZGRVJFTlRJQUwJIyBwYXJ0aWFsZGlmZiAqLworICAgIHsgMHgyMjAzLCAweDI0IH0sIC8qIFRIRVJFIEVYSVNUUwkjIGV4aXN0ZW50aWFsICovCisgICAgeyAweDIyMDUsIDB4QzYgfSwgLyogRU1QVFkgU0VUCSMgZW1wdHlzZXQgKi8KKyAgICB7IDB4MjIwNiwgMHg0NCB9LCAvKiBJTkNSRU1FTlQJIyBEZWx0YSAqLworICAgIHsgMHgyMjA3LCAweEQxIH0sIC8qIE5BQkxBCSMgZ3JhZGllbnQgKi8KKyAgICB7IDB4MjIwOCwgMHhDRSB9LCAvKiBFTEVNRU5UIE9GCSMgZWxlbWVudCAqLworICAgIHsgMHgyMjA5LCAweENGIH0sIC8qIE5PVCBBTiBFTEVNRU5UIE9GCSMgbm90ZWxlbWVudCAqLworICAgIHsgMHgyMjBCLCAweDI3IH0sIC8qIENPTlRBSU5TIEFTIE1FTUJFUgkjIHN1Y2h0aGF0ICovCisgICAgeyAweDIyMEYsIDB4RDUgfSwgLyogTi1BUlkgUFJPRFVDVAkjIHByb2R1Y3QgKi8KKyAgICB7IDB4MjIxMSwgMHhFNSB9LCAvKiBOLUFSWSBTVU1NQVRJT04JIyBzdW1tYXRpb24gKi8KKyAgICB7IDB4MjIxMiwgMHgyRCB9LCAvKiBNSU5VUyBTSUdOCSMgbWludXMgKi8KKyAgICB7IDB4MjIxNSwgMHhBNCB9LCAvKiBESVZJU0lPTiBTTEFTSAkjIGZyYWN0aW9uICovCisgICAgeyAweDIyMTcsIDB4MkEgfSwgLyogQVNURVJJU0sgT1BFUkFUT1IJIyBhc3Rlcmlza21hdGggKi8KKyAgICB7IDB4MjIxQSwgMHhENiB9LCAvKiBTUVVBUkUgUk9PVAkjIHJhZGljYWwgKi8KKyAgICB7IDB4MjIxRCwgMHhCNSB9LCAvKiBQUk9QT1JUSU9OQUwgVE8JIyBwcm9wb3J0aW9uYWwgKi8KKyAgICB7IDB4MjIxRSwgMHhBNSB9LCAvKiBJTkZJTklUWQkjIGluZmluaXR5ICovCisgICAgeyAweDIyMjAsIDB4RDAgfSwgLyogQU5HTEUJIyBhbmdsZSAqLworICAgIHsgMHgyMjI3LCAweEQ5IH0sIC8qIExPR0lDQUwgQU5ECSMgbG9naWNhbGFuZCAqLworICAgIHsgMHgyMjI4LCAweERBIH0sIC8qIExPR0lDQUwgT1IJIyBsb2dpY2Fsb3IgKi8KKyAgICB7IDB4MjIyOSwgMHhDNyB9LCAvKiBJTlRFUlNFQ1RJT04JIyBpbnRlcnNlY3Rpb24gKi8KKyAgICB7IDB4MjIyQSwgMHhDOCB9LCAvKiBVTklPTgkjIHVuaW9uICovCisgICAgeyAweDIyMkIsIDB4RjIgfSwgLyogSU5URUdSQUwJIyBpbnRlZ3JhbCAqLworICAgIHsgMHgyMjM0LCAweDVDIH0sIC8qIFRIRVJFRk9SRQkjIHRoZXJlZm9yZSAqLworICAgIHsgMHgyMjNDLCAweDdFIH0sIC8qIFRJTERFIE9QRVJBVE9SCSMgc2ltaWxhciAqLworICAgIHsgMHgyMjQ1LCAweDQwIH0sIC8qIEFQUFJPWElNQVRFTFkgRVFVQUwgVE8JIyBjb25ncnVlbnQgKi8KKyAgICB7IDB4MjI0OCwgMHhCQiB9LCAvKiBBTE1PU1QgRVFVQUwgVE8JIyBhcHByb3hlcXVhbCAqLworICAgIHsgMHgyMjYwLCAweEI5IH0sIC8qIE5PVCBFUVVBTCBUTwkjIG5vdGVxdWFsICovCisgICAgeyAweDIyNjEsIDB4QkEgfSwgLyogSURFTlRJQ0FMIFRPCSMgZXF1aXZhbGVuY2UgKi8KKyAgICB7IDB4MjI2NCwgMHhBMyB9LCAvKiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8JIyBsZXNzZXF1YWwgKi8KKyAgICB7IDB4MjI2NSwgMHhCMyB9LCAvKiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8JIyBncmVhdGVyZXF1YWwgKi8KKyAgICB7IDB4MjI4MiwgMHhDQyB9LCAvKiBTVUJTRVQgT0YJIyBwcm9wZXJzdWJzZXQgKi8KKyAgICB7IDB4MjI4MywgMHhDOSB9LCAvKiBTVVBFUlNFVCBPRgkjIHByb3BlcnN1cGVyc2V0ICovCisgICAgeyAweDIyODQsIDB4Q0IgfSwgLyogTk9UIEEgU1VCU0VUIE9GCSMgbm90c3Vic2V0ICovCisgICAgeyAweDIyODYsIDB4Q0QgfSwgLyogU1VCU0VUIE9GIE9SIEVRVUFMIFRPCSMgcmVmbGV4c3Vic2V0ICovCisgICAgeyAweDIyODcsIDB4Q0EgfSwgLyogU1VQRVJTRVQgT0YgT1IgRVFVQUwgVE8JIyByZWZsZXhzdXBlcnNldCAqLworICAgIHsgMHgyMjk1LCAweEM1IH0sIC8qIENJUkNMRUQgUExVUwkjIGNpcmNsZXBsdXMgKi8KKyAgICB7IDB4MjI5NywgMHhDNCB9LCAvKiBDSVJDTEVEIFRJTUVTCSMgY2lyY2xlbXVsdGlwbHkgKi8KKyAgICB7IDB4MjJBNSwgMHg1RSB9LCAvKiBVUCBUQUNLCSMgcGVycGVuZGljdWxhciAqLworICAgIHsgMHgyMkM1LCAweEQ3IH0sIC8qIERPVCBPUEVSQVRPUgkjIGRvdG1hdGggKi8KKyAgICB7IDB4MjMyMCwgMHhGMyB9LCAvKiBUT1AgSEFMRiBJTlRFR1JBTAkjIGludGVncmFsdHAgKi8KKyAgICB7IDB4MjMyMSwgMHhGNSB9LCAvKiBCT1RUT00gSEFMRiBJTlRFR1JBTAkjIGludGVncmFsYnQgKi8KKyAgICB7IDB4MjMyOSwgMHhFMSB9LCAvKiBMRUZULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZWxlZnQgKi8KKyAgICB7IDB4MjMyQSwgMHhGMSB9LCAvKiBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUCSMgYW5nbGVyaWdodCAqLworICAgIHsgMHgyNUNBLCAweEUwIH0sIC8qIExPWkVOR0UJIyBsb3plbmdlICovCisgICAgeyAweDI2NjAsIDB4QUEgfSwgLyogQkxBQ0sgU1BBREUgU1VJVAkjIHNwYWRlICovCisgICAgeyAweDI2NjMsIDB4QTcgfSwgLyogQkxBQ0sgQ0xVQiBTVUlUCSMgY2x1YiAqLworICAgIHsgMHgyNjY1LCAweEE5IH0sIC8qIEJMQUNLIEhFQVJUIFNVSVQJIyBoZWFydCAqLworICAgIHsgMHgyNjY2LCAweEE4IH0sIC8qIEJMQUNLIERJQU1PTkQgU1VJVAkjIGRpYW1vbmQgKi8KKyAgICB7IDB4RjZEOSwgMHhEMyB9LCAvKiBDT1BZUklHSFQgU0lHTiBTRVJJRgkjIGNvcHlyaWdodHNlcmlmIChDVVMpICovCisgICAgeyAweEY2REEsIDB4RDIgfSwgLyogUkVHSVNURVJFRCBTSUdOIFNFUklGCSMgcmVnaXN0ZXJzZXJpZiAoQ1VTKSAqLworICAgIHsgMHhGNkRCLCAweEQ0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTRVJJRgkjIHRyYWRlbWFya3NlcmlmIChDVVMpICovCisgICAgeyAweEY4RTUsIDB4NjAgfSwgLyogUkFESUNBTCBFWFRFTkRFUgkjIHJhZGljYWxleCAoQ1VTKSAqLworICAgIHsgMHhGOEU2LCAweEJEIH0sIC8qIFZFUlRJQ0FMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3d2ZXJ0ZXggKENVUykgKi8KKyAgICB7IDB4RjhFNywgMHhCRSB9LCAvKiBIT1JJWk9OVEFMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3dob3JpemV4IChDVVMpICovCisgICAgeyAweEY4RTgsIDB4RTIgfSwgLyogUkVHSVNURVJFRCBTSUdOIFNBTlMgU0VSSUYJIyByZWdpc3RlcnNhbnMgKENVUykgKi8KKyAgICB7IDB4RjhFOSwgMHhFMyB9LCAvKiBDT1BZUklHSFQgU0lHTiBTQU5TIFNFUklGCSMgY29weXJpZ2h0c2FucyAoQ1VTKSAqLworICAgIHsgMHhGOEVBLCAweEU0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTQU5TIFNFUklGCSMgdHJhZGVtYXJrc2FucyAoQ1VTKSAqLworICAgIHsgMHhGOEVCLCAweEU2IH0sIC8qIExFRlQgUEFSRU4gVE9QCSMgcGFyZW5sZWZ0dHAgKENVUykgKi8KKyAgICB7IDB4RjhFQywgMHhFNyB9LCAvKiBMRUZUIFBBUkVOIEVYVEVOREVSCSMgcGFyZW5sZWZ0ZXggKENVUykgKi8KKyAgICB7IDB4RjhFRCwgMHhFOCB9LCAvKiBMRUZUIFBBUkVOIEJPVFRPTQkjIHBhcmVubGVmdGJ0IChDVVMpICovCisgICAgeyAweEY4RUUsIDB4RTkgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBUT1AJIyBicmFja2V0bGVmdHRwIChDVVMpICovCisgICAgeyAweEY4RUYsIDB4RUEgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNrZXRsZWZ0ZXggKENVUykgKi8KKyAgICB7IDB4RjhGMCwgMHhFQiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRsZWZ0YnQgKENVUykgKi8KKyAgICB7IDB4RjhGMSwgMHhFQyB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgVE9QCSMgYnJhY2VsZWZ0dHAgKENVUykgKi8KKyAgICB7IDB4RjhGMiwgMHhFRCB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgTUlECSMgYnJhY2VsZWZ0bWlkIChDVVMpICovCisgICAgeyAweEY4RjMsIDB4RUUgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlbGVmdGJ0IChDVVMpICovCisgICAgeyAweEY4RjQsIDB4RUYgfSwgLyogQ1VSTFkgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNlZXggKENVUykgKi8KKyAgICB7IDB4RjhGNSwgMHhGNCB9LCAvKiBJTlRFR1JBTCBFWFRFTkRFUgkjIGludGVncmFsZXggKENVUykgKi8KKyAgICB7IDB4RjhGNiwgMHhGNiB9LCAvKiBSSUdIVCBQQVJFTiBUT1AJIyBwYXJlbnJpZ2h0dHAgKENVUykgKi8KKyAgICB7IDB4RjhGNywgMHhGNyB9LCAvKiBSSUdIVCBQQVJFTiBFWFRFTkRFUgkjIHBhcmVucmlnaHRleCAoQ1VTKSAqLworICAgIHsgMHhGOEY4LCAweEY4IH0sIC8qIFJJR0hUIFBBUkVOIEJPVFRPTQkjIHBhcmVucmlnaHRidCAoQ1VTKSAqLworICAgIHsgMHhGOEY5LCAweEY5IH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRyaWdodHRwIChDVVMpICovCisgICAgeyAweEY4RkEsIDB4RkEgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgRVhURU5ERVIJIyBicmFja2V0cmlnaHRleCAoQ1VTKSAqLworICAgIHsgMHhGOEZCLCAweEZCIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRyaWdodGJ0IChDVVMpICovCisgICAgeyAweEY4RkMsIDB4RkMgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZXJpZ2h0dHAgKENVUykgKi8KKyAgICB7IDB4RjhGRCwgMHhGRCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIE1JRAkjIGJyYWNlcmlnaHRtaWQgKENVUykgKi8KKyAgICB7IDB4RjhGRSwgMHhGRSB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlcmlnaHRidCAoQ1VTKSAqLworfTsKKworc3RhdGljIGNvbnN0IEZjQ2hhck1hcCBBZG9iZVN5bWJvbCA9IHsKKyAgICBBZG9iZVN5bWJvbEVudCwKKyAgICBzaXplb2YgKEFkb2JlU3ltYm9sRW50KSAvIHNpemVvZiAoQWRvYmVTeW1ib2xFbnRbMF0pLAorfTsKZGlmZiAtLWdpdCBhL3NyYy9mY2RiZy5jIGIvc3JjL2ZjZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZjYzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY2RiZy5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogJFhGcmVlODY6ICQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmY2ludC5oIgorCit2b2lkCitGY1ZhbHVlUHJpbnQgKEZjVmFsdWUgdikKK3sKKyAgICBzd2l0Y2ggKHYudHlwZSkgeworICAgIGNhc2UgRmNUeXBlVm9pZDoKKwlwcmludGYgKCIgPHZvaWQ+Iik7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgorCXByaW50ZiAoIiAlZCIsIHYudS5pKTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZURvdWJsZToKKwlwcmludGYgKCIgJWciLCB2LnUuZCk7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVTdHJpbmc6CisJcHJpbnRmICgiIFwiJXNcIiIsIHYudS5zKTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZUJvb2w6CisJcHJpbnRmICgiICVzIiwgdi51LmIgPyAiRmNUcnVlIiA6ICJGY0ZhbHNlIik7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVNYXRyaXg6CisJcHJpbnRmICgiICglZiAlZjsgJWYgJWYpIiwgdi51Lm0tPnh4LCB2LnUubS0+eHksIHYudS5tLT55eCwgdi51Lm0tPnl5KTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6CS8qIFhYWCAqLworCXByaW50ZiAoIiBzZXQiKTsKKwlicmVhazsKKyAgICB9Cit9CisKK3ZvaWQKK0ZjVmFsdWVMaXN0UHJpbnQgKEZjVmFsdWVMaXN0ICpsKQoreworICAgIGZvciAoOyBsOyBsID0gbC0+bmV4dCkKKwlGY1ZhbHVlUHJpbnQgKGwtPnZhbHVlKTsKK30KKwordm9pZAorRmNQYXR0ZXJuUHJpbnQgKEZjUGF0dGVybiAqcCkKK3sKKyAgICBpbnQJCSAgICBpOworICAgIEZjUGF0dGVybkVsdCAgICplOworICAgIAorICAgIGlmICghcCkKKyAgICB7CisJcHJpbnRmICgiTnVsbCBwYXR0ZXJuXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHByaW50ZiAoIlBhdHRlcm4gJWQgb2YgJWRcbiIsIHAtPm51bSwgcC0+c2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQorICAgIHsKKwllID0gJnAtPmVsdHNbaV07CisJcHJpbnRmICgiXHQlczoiLCBlLT5vYmplY3QpOworCUZjVmFsdWVMaXN0UHJpbnQgKGUtPnZhbHVlcyk7CisJcHJpbnRmICgiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmICgiXG4iKTsKK30KKwordm9pZAorRmNPcFByaW50IChGY09wIG9wKQoreworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEZjT3BJbnRlZ2VyOiBwcmludGYgKCJJbnRlZ2VyIik7IGJyZWFrOworICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiRG91YmxlIik7IGJyZWFrOworICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiU3RyaW5nIik7IGJyZWFrOworICAgIGNhc2UgRmNPcE1hdHJpeDogcHJpbnRmICgiTWF0cml4Iik7IGJyZWFrOworICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIkJvb2wiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiQ2hhclNldCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BGaWVsZDogcHJpbnRmICgiRmllbGQiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wQ29uc3Q6IHByaW50ZiAoIkNvbnN0Iik7IGJyZWFrOworICAgIGNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOworICAgIGNhc2UgRmNPcEFzc2lnblJlcGxhY2U6IHByaW50ZiAoIkFzc2lnblJlcGxhY2UiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6IHByaW50ZiAoIlByZXBlbmRGaXJzdCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BBcHBlbmQ6IHByaW50ZiAoIkFwcGVuZCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OiBwcmludGYgKCJBcHBlbmRMYXN0Iik7IGJyZWFrOworICAgIGNhc2UgRmNPcFF1ZXN0OiBwcmludGYgKCJRdWVzdCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BPcjogcHJpbnRmICgiT3IiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wQW5kOiBwcmludGYgKCJBbmQiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOworICAgIGNhc2UgRmNPcENvbnRhaW5zOiBwcmludGYgKCJDb250YWlucyIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BOb3RFcXVhbDogcHJpbnRmICgiTm90RXF1YWwiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BMZXNzRXF1YWw6IHByaW50ZiAoIkxlc3NFcXVhbCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BNb3JlOiBwcmludGYgKCJNb3JlIik7IGJyZWFrOworICAgIGNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOworICAgIGNhc2UgRmNPcFBsdXM6IHByaW50ZiAoIlBsdXMiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wTWludXM6IHByaW50ZiAoIk1pbnVzIik7IGJyZWFrOworICAgIGNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BEaXZpZGU6IHByaW50ZiAoIkRpdmlkZSIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BOb3Q6IHByaW50ZiAoIk5vdCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BOaWw6IHByaW50ZiAoIk5pbCIpOyBicmVhazsKKyAgICBjYXNlIEZjT3BDb21tYTogcHJpbnRmICgiQ29tbWEiKTsgYnJlYWs7CisgICAgY2FzZSBGY09wSW52YWxpZDogcHJpbnRmICgiSW52YWxpZCIpOyBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQKK0ZjRXhwclByaW50IChGY0V4cHIgKmV4cHIpCit7CisgICAgc3dpdGNoIChleHByLT5vcCkgeworICAgIGNhc2UgRmNPcEludGVnZXI6IHByaW50ZiAoIiVkIiwgZXhwci0+dS5pdmFsKTsgYnJlYWs7CisgICAgY2FzZSBGY09wRG91YmxlOiBwcmludGYgKCIlZyIsIGV4cHItPnUuZHZhbCk7IGJyZWFrOworICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiXCIlc1wiIiwgZXhwci0+dS5zdmFsKTsgYnJlYWs7CisgICAgY2FzZSBGY09wTWF0cml4OiBwcmludGYgKCJbJWcgJWcgJWcgJWddIiwKKwkJCSAgICAgIGV4cHItPnUubXZhbC0+eHgsCisJCQkgICAgICBleHByLT51Lm12YWwtPnh5LAorCQkJICAgICAgZXhwci0+dS5tdmFsLT55eCwKKwkJCSAgICAgIGV4cHItPnUubXZhbC0+eXkpOworICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5idmFsID8gInRydWUiIDogImZhbHNlIik7IGJyZWFrOworICAgIGNhc2UgRmNPcEZpZWxkOiBwcmludGYgKCIlcyIsIGV4cHItPnUuZmllbGQpOyBicmVhazsKKyAgICBjYXNlIEZjT3BRdWVzdDoKKwlGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOworCXByaW50ZiAoIiBxdWVzdCAiKTsKKwlGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0LT51LnRyZWUubGVmdCk7CisJcHJpbnRmICgiIGNvbG9uICIpOworCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQtPnUudHJlZS5yaWdodCk7CisJYnJlYWs7CisgICAgY2FzZSBGY09wT3I6CisgICAgY2FzZSBGY09wQW5kOgorICAgIGNhc2UgRmNPcEVxdWFsOgorICAgIGNhc2UgRmNPcENvbnRhaW5zOgorICAgIGNhc2UgRmNPcE5vdEVxdWFsOgorICAgIGNhc2UgRmNPcExlc3M6CisgICAgY2FzZSBGY09wTGVzc0VxdWFsOgorICAgIGNhc2UgRmNPcE1vcmU6CisgICAgY2FzZSBGY09wTW9yZUVxdWFsOgorICAgIGNhc2UgRmNPcFBsdXM6CisgICAgY2FzZSBGY09wTWludXM6CisgICAgY2FzZSBGY09wVGltZXM6CisgICAgY2FzZSBGY09wRGl2aWRlOgorCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CisJcHJpbnRmICgiICIpOworCXN3aXRjaCAoZXhwci0+b3ApIHsKKwljYXNlIEZjT3BPcjogcHJpbnRmICgiT3IiKTsgYnJlYWs7CisJY2FzZSBGY09wQW5kOiBwcmludGYgKCJBbmQiKTsgYnJlYWs7CisJY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOworCWNhc2UgRmNPcENvbnRhaW5zOiBwcmludGYgKCJDb250YWlucyIpOyBicmVhazsKKwljYXNlIEZjT3BOb3RFcXVhbDogcHJpbnRmICgiTm90RXF1YWwiKTsgYnJlYWs7CisJY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKKwljYXNlIEZjT3BMZXNzRXF1YWw6IHByaW50ZiAoIkxlc3NFcXVhbCIpOyBicmVhazsKKwljYXNlIEZjT3BNb3JlOiBwcmludGYgKCJNb3JlIik7IGJyZWFrOworCWNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOworCWNhc2UgRmNPcFBsdXM6IHByaW50ZiAoIlBsdXMiKTsgYnJlYWs7CisJY2FzZSBGY09wTWludXM6IHByaW50ZiAoIk1pbnVzIik7IGJyZWFrOworCWNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKKwljYXNlIEZjT3BEaXZpZGU6IHByaW50ZiAoIkRpdmlkZSIpOyBicmVhazsKKwlkZWZhdWx0OiBicmVhazsKKwl9CisJcHJpbnRmICgiICIpOworCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQpOworCWJyZWFrOworICAgIGNhc2UgRmNPcE5vdDoKKwlwcmludGYgKCJOb3QgIik7CisJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KK30KKwordm9pZAorRmNUZXN0UHJpbnQgKEZjVGVzdCAqdGVzdCkKK3sKKyAgICBzd2l0Y2ggKHRlc3QtPnF1YWwpIHsKKyAgICBjYXNlIEZjUXVhbEFueToKKwlwcmludGYgKCJhbnkgIik7CisJYnJlYWs7CisgICAgY2FzZSBGY1F1YWxBbGw6CisJcHJpbnRmICgiYWxsICIpOworCWJyZWFrOworICAgIH0KKyAgICBwcmludGYgKCIlcyAiLCB0ZXN0LT5maWVsZCk7CisgICAgRmNPcFByaW50ICh0ZXN0LT5vcCk7CisgICAgcHJpbnRmICgiICIpOworICAgIEZjRXhwclByaW50ICh0ZXN0LT5leHByKTsKKyAgICBwcmludGYgKCJcbiIpOworfQorCit2b2lkCitGY0VkaXRQcmludCAoRmNFZGl0ICplZGl0KQoreworICAgIHByaW50ZiAoIkVkaXQgJXMgIiwgZWRpdC0+ZmllbGQpOworICAgIEZjT3BQcmludCAoZWRpdC0+b3ApOworICAgIHByaW50ZiAoIiAiKTsKKyAgICBGY0V4cHJQcmludCAoZWRpdC0+ZXhwcik7Cit9CisKK3ZvaWQKK0ZjU3Vic3RQcmludCAoRmNTdWJzdCAqc3Vic3QpCit7CisgICAgRmNFZGl0CSplOworICAgIEZjVGVzdAkqdDsKKyAgICAKKyAgICBwcmludGYgKCJtYXRjaFxuIik7CisgICAgZm9yICh0ID0gc3Vic3QtPnRlc3Q7IHQ7IHQgPSB0LT5uZXh0KQorICAgIHsKKwlwcmludGYgKCJcdCIpOworCUZjVGVzdFByaW50ICh0KTsKKyAgICB9CisgICAgcHJpbnRmICgiZWRpdFxuIik7CisgICAgZm9yIChlID0gc3Vic3QtPmVkaXQ7IGU7IGUgPSBlLT5uZXh0KQorICAgIHsKKwlwcmludGYgKCJcdCIpOworCUZjRWRpdFByaW50IChlKTsKKwlwcmludGYgKCI7XG4iKTsKKyAgICB9CisgICAgcHJpbnRmICgiXG4iKTsKK30KKwordm9pZAorRmNGb250U2V0UHJpbnQgKEZjRm9udFNldCAqcykKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBwcmludGYgKCJGb250U2V0ICVkIG9mICVkXG4iLCBzLT5uZm9udCwgcy0+c2ZvbnQpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uZm9udDsgaSsrKQorICAgIHsKKwlwcmludGYgKCJGb250ICVkICIsIGkpOworCUZjUGF0dGVyblByaW50IChzLT5mb250c1tpXSk7CisgICAgfQorfQorCitpbnQKK0ZjRGVidWcgKHZvaWQpCit7CisgICAgc3RhdGljIGludCAgaW5pdGlhbGl6ZWQ7CisgICAgc3RhdGljIGludCAgZGVidWc7CisKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgIHsKKwljaGFyICAgICplOworCisJaW5pdGlhbGl6ZWQgPSAxOworCWUgPSBnZXRlbnYgKCJGQ19ERUJVRyIpOworCWlmIChlKQorCXsKKwkgICAgcHJpbnRmICgiRkNfREVCVUc9JXNcbiIsIGUpOworCSAgICBkZWJ1ZyA9IGF0b2kgKGUpOworCSAgICBpZiAoZGVidWcgPCAwKQorCQlkZWJ1ZyA9IDA7CisJfQorICAgIH0KKyAgICByZXR1cm4gZGVidWc7Cit9CmRpZmYgLS1naXQgYS9zcmMvZmNkZWZhdWx0LmMgYi9zcmMvZmNkZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1NTk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY2RlZmF1bHQuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogJFhGcmVlODY6ICQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZmNpbnQuaCIKKworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhcgkqZmllbGQ7CisgICAgRmNCb29sCXZhbHVlOworfSBGY0Jvb2xEZWZhdWx0c1tdID0geworICAgIHsgRkNfSElOVElORywJICAgIEZjVHJ1ZQl9LCAgLyogIUZUX0xPQURfTk9fSElOVElORyAqLworICAgIHsgRkNfVkVSVElDQUxfTEFZT1VULCAgIEZjRmFsc2UJfSwgIC8qIEZDX0xPQURfVkVSVElDQUxfTEFZT1VUICovCisgICAgeyBGQ19BVVRPSElOVCwJICAgIEZjRmFsc2UJfSwgIC8qIEZDX0xPQURfRk9SQ0VfQVVUT0hJTlQgKi8KKyAgICB7IEZDX0dMT0JBTF9BRFZBTkNFLCAgICBGY1RydWUJfSwgIC8qICFGQ19MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCAqLworfTsKKworI2RlZmluZSBOVU1fRkNfQk9PTF9ERUZBVUxUUwkoc2l6ZW9mIEZjQm9vbERlZmF1bHRzIC8gc2l6ZW9mIEZjQm9vbERlZmF1bHRzWzBdKQorCit2b2lkCitGY0RlZmF1bHRTdWJzdGl0dXRlIChGY1BhdHRlcm4gKnBhdHRlcm4pCit7CisgICAgRmNWYWx1ZSB2OworICAgIGludAkgICAgaTsKKworICAgIGlmIChGY1BhdHRlcm5HZXQgKHBhdHRlcm4sIEZDX1NUWUxFLCAwLCAmdikgPT0gRmNSZXN1bHROb01hdGNoKQorICAgIHsKKwlpZiAoRmNQYXR0ZXJuR2V0IChwYXR0ZXJuLCBGQ19XRUlHSFQsIDAsICZ2KSA9PSBGY1Jlc3VsdE5vTWF0Y2ggKQorCXsKKwkgICAgRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0dGVybiwgRkNfV0VJR0hULCBGQ19XRUlHSFRfTUVESVVNKTsKKwl9CisJaWYgKEZjUGF0dGVybkdldCAocGF0dGVybiwgRkNfU0xBTlQsIDAsICZ2KSA9PSBGY1Jlc3VsdE5vTWF0Y2gpCisJeworCSAgICBGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXR0ZXJuLCBGQ19TTEFOVCwgRkNfU0xBTlRfUk9NQU4pOworCX0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZDX0JPT0xfREVGQVVMVFM7IGkrKykKKwlpZiAoRmNQYXR0ZXJuR2V0IChwYXR0ZXJuLCBGY0Jvb2xEZWZhdWx0c1tpXS5maWVsZCwgMCwgJnYpID09IEZjUmVzdWx0Tm9NYXRjaCkKKwkgICAgRmNQYXR0ZXJuQWRkQm9vbCAocGF0dGVybiwgRmNCb29sRGVmYXVsdHNbaV0uZmllbGQsIEZjQm9vbERlZmF1bHRzW2ldLnZhbHVlKTsKKyAgICAKKyAgICBpZiAoRmNQYXR0ZXJuR2V0IChwYXR0ZXJuLCBGQ19QSVhFTF9TSVpFLCAwLCAmdikgPT0gRmNSZXN1bHROb01hdGNoKQorICAgIHsKKwlkb3VibGUJZHBpLCBzaXplLCBzY2FsZTsKKworCWlmIChGY1BhdHRlcm5HZXREb3VibGUgKHBhdHRlcm4sIEZDX1NJWkUsIDAsICZzaXplKSAhPSBGY1Jlc3VsdE1hdGNoKQorCXsKKwkgICAgc2l6ZSA9IDEyLjA7CisJICAgICh2b2lkKSBGY1BhdHRlcm5EZWwgKHBhdHRlcm4sIEZDX1NJWkUpOworCSAgICBGY1BhdHRlcm5BZGREb3VibGUgKHBhdHRlcm4sIEZDX1NJWkUsIHNpemUpOworCX0KKwlpZiAoRmNQYXR0ZXJuR2V0RG91YmxlIChwYXR0ZXJuLCBGQ19TQ0FMRSwgMCwgJnNjYWxlKSAhPSBGY1Jlc3VsdE1hdGNoKQorCXsKKwkgICAgc2NhbGUgPSAxLjA7CisJICAgICh2b2lkKSBGY1BhdHRlcm5EZWwgKHBhdHRlcm4sIEZDX1NDQUxFKTsKKwkgICAgRmNQYXR0ZXJuQWRkRG91YmxlIChwYXR0ZXJuLCBGQ19TQ0FMRSwgc2NhbGUpOworCX0KKwlzaXplICo9IHNjYWxlOworCWlmIChGY1BhdHRlcm5HZXREb3VibGUgKHBhdHRlcm4sIEZDX0RQSSwgMCwgJmRwaSkgIT0gRmNSZXN1bHRNYXRjaCkKKwl7CisJICAgIGRwaSA9IDc1LjA7CisJICAgICh2b2lkKSBGY1BhdHRlcm5EZWwgKHBhdHRlcm4sIEZDX0RQSSk7CisJICAgIEZjUGF0dGVybkFkZERvdWJsZSAocGF0dGVybiwgRkNfRFBJLCBkcGkpOworCX0KKwlzaXplICo9IGRwaSAvIDcyLjA7CisJRmNQYXR0ZXJuQWRkRG91YmxlIChwYXR0ZXJuLCBGQ19QSVhFTF9TSVpFLCBzaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvZmNkaXIuYyBiL3NyYy9mY2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmNkaXIuYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImZjaW50LmgiCisKKyNkZWZpbmUgRkNfSU5WQUxJRF9GT05UX0ZJTEUgIi4iCisKK0ZjQm9vbAorRmNGaWxlU2NhbiAoRmNGb250U2V0CSpzZXQsCisJICAgIEZjRmlsZUNhY2hlCSpjYWNoZSwKKwkgICAgRmNCbGFua3MJKmJsYW5rcywKKwkgICAgY29uc3QgY2hhcgkqZmlsZSwKKwkgICAgRmNCb29sCWZvcmNlKQoreworICAgIGludAkJICAgIGlkOworICAgIGNoYXIJICAgICpuYW1lOworICAgIEZjUGF0dGVybgkgICAgKmZvbnQ7CisgICAgRmNCb29sCSAgICByZXQgPSBGY1RydWU7CisgICAgaW50CQkgICAgY291bnQ7CisgICAgCisgICAgaWQgPSAwOworICAgIGRvCisgICAgeworCWlmICghZm9yY2UgJiYgY2FjaGUpCisJICAgIG5hbWUgPSBGY0ZpbGVDYWNoZUZpbmQgKGNhY2hlLCBmaWxlLCBpZCwgJmNvdW50KTsKKwllbHNlCisJICAgIG5hbWUgPSAwOworCWlmIChuYW1lKQorCXsKKwkgICAgLyogIi4iIG1lYW5zIHRoZSBmaWxlIGRvZXNuJ3QgY29udGFpbiBhIGZvbnQgKi8KKwkgICAgaWYgKHN0cmNtcCAobmFtZSwgRkNfSU5WQUxJRF9GT05UX0ZJTEUpICE9IDApCisJICAgIHsKKwkJZm9udCA9IEZjTmFtZVBhcnNlIChuYW1lKTsKKwkJaWYgKGZvbnQpCisJCSAgICBGY1BhdHRlcm5BZGRTdHJpbmcgKGZvbnQsIEZDX0ZJTEUsIGZpbGUpOworCSAgICB9CisJICAgIGVsc2UKKwkJZm9udCA9IDA7CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU4pCisJICAgIHsKKwkJcHJpbnRmICgiXHRTY2FubmluZyBmaWxlICVzLi4uIiwgZmlsZSk7CisJCWZmbHVzaCAoc3Rkb3V0KTsKKwkgICAgfQorCSAgICBmb250ID0gRmNGcmVlVHlwZVF1ZXJ5IChmaWxlLCBpZCwgYmxhbmtzLCAmY291bnQpOworCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19TQ0FOKQorCQlwcmludGYgKCJkb25lXG4iKTsKKwkgICAgaWYgKCFmb3JjZSAmJiBjYWNoZSkKKwkgICAgeworCQlpZiAoZm9udCkKKwkJeworCQkgICAgRmNDaGFyOAkqdW5wYXJzZTsKKworCQkgICAgdW5wYXJzZSA9IEZjTmFtZVVucGFyc2UgKGZvbnQpOworCQkgICAgaWYgKHVucGFyc2UpCisJCSAgICB7CisJCQkodm9pZCkgRmNGaWxlQ2FjaGVVcGRhdGUgKGNhY2hlLCBmaWxlLCBpZCwgdW5wYXJzZSk7CisJCQlmcmVlICh1bnBhcnNlKTsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIG5lZ2F0aXZlIGNhY2hlIGZpbGVzIG5vdCBjb250YWluaW5nIGZvbnRzICovCisJCSAgICBGY0ZpbGVDYWNoZVVwZGF0ZSAoY2FjaGUsIGZpbGUsIGlkLCBGQ19JTlZBTElEX0ZPTlRfRklMRSk7CisJCX0KKwkgICAgfQorCX0KKwlpZiAoZm9udCkKKwl7CisJICAgIGlmICghRmNGb250U2V0QWRkIChzZXQsIGZvbnQpKQorCSAgICB7CisJCUZjUGF0dGVybkRlc3Ryb3kgKGZvbnQpOworCQlmb250ID0gMDsKKwkJcmV0ID0gRmNGYWxzZTsKKwkgICAgfQorCX0KKwlpZCsrOworICAgIH0gd2hpbGUgKGZvbnQgJiYgcmV0ICYmIGlkIDwgY291bnQpOworICAgIHJldHVybiByZXQ7Cit9CisKK0ZjQm9vbAorRmNEaXJTY2FuIChGY0ZvbnRTZXQJKnNldCwKKwkgICBGY0ZpbGVDYWNoZQkqY2FjaGUsCisJICAgRmNCbGFua3MJKmJsYW5rcywKKwkgICBjb25zdCBjaGFyCSpkaXIsCisJICAgRmNCb29sCWZvcmNlKQoreworICAgIERJUgkJICAgICpkOworICAgIHN0cnVjdCBkaXJlbnQgICAqZTsKKyAgICBjaGFyCSAgICAqZmlsZTsKKyAgICBjaGFyCSAgICAqYmFzZTsKKyAgICBGY0Jvb2wJICAgIHJldCA9IEZjVHJ1ZTsKKworICAgIGZpbGUgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAoZGlyKSArIDEgKyAyNTYgKyAxKTsKKyAgICBpZiAoIWZpbGUpCisJcmV0dXJuIEZjRmFsc2U7CisKKyAgICBzdHJjcHkgKGZpbGUsIGRpcik7CisgICAgc3RyY2F0IChmaWxlLCAiLyIpOworICAgIGJhc2UgPSBmaWxlICsgc3RybGVuIChmaWxlKTsKKyAgICBpZiAoIWZvcmNlKQorICAgIHsKKwlzdHJjcHkgKGJhc2UsIEZDX0RJUl9DQUNIRV9GSUxFKTsKKwkKKwlpZiAoRmNGaWxlQ2FjaGVSZWFkRGlyIChzZXQsIGZpbGUpKQorCXsKKwkgICAgZnJlZSAoZmlsZSk7CisJICAgIHJldHVybiBGY1RydWU7CisJfQorICAgIH0KKyAgICAKKyAgICBkID0gb3BlbmRpciAoZGlyKTsKKyAgICBpZiAoIWQpCisgICAgeworCWZyZWUgKGZpbGUpOworCXJldHVybiBGY0ZhbHNlOworICAgIH0KKyAgICB3aGlsZSAocmV0ICYmIChlID0gcmVhZGRpciAoZCkpKQorICAgIHsKKwlpZiAoZS0+ZF9uYW1lWzBdICE9ICcuJykKKwl7CisJICAgIHN0cmNweSAoYmFzZSwgZS0+ZF9uYW1lKTsKKwkgICAgRmNGaWxlU2NhbiAoc2V0LCBjYWNoZSwgYmxhbmtzLCBmaWxlLCBmb3JjZSk7CisJfQorICAgIH0KKyAgICBmcmVlIChmaWxlKTsKKyAgICBjbG9zZWRpciAoZCk7CisgICAgcmV0dXJuIHJldDsKK30KKworRmNCb29sCitGY0RpclNhdmUgKEZjRm9udFNldCAqc2V0LCBjb25zdCBjaGFyICpkaXIpCit7CisgICAgY2hhcgkgICAgKmZpbGU7CisgICAgY2hhcgkgICAgKmJhc2U7CisgICAgRmNCb29sCSAgICByZXQ7CisgICAgCisgICAgZmlsZSA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChkaXIpICsgMSArIDI1NiArIDEpOworICAgIGlmICghZmlsZSkKKwlyZXR1cm4gRmNGYWxzZTsKKworICAgIHN0cmNweSAoZmlsZSwgZGlyKTsKKyAgICBzdHJjYXQgKGZpbGUsICIvIik7CisgICAgYmFzZSA9IGZpbGUgKyBzdHJsZW4gKGZpbGUpOworICAgIHN0cmNweSAoYmFzZSwgRkNfRElSX0NBQ0hFX0ZJTEUpOworICAgIHJldCA9IEZjRmlsZUNhY2hlV3JpdGVEaXIgKHNldCwgZmlsZSk7CisgICAgZnJlZSAoZmlsZSk7CisgICAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2ZjZnJlZXR5cGUuYyBiL3NyYy9mY2ZyZWV0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4Yjg1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY2ZyZWV0eXBlLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDEgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImZjaW50LmgiCisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhYmxlcy5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQJICAgIGJpdDsKKyAgICBjaGFyICAgICpuYW1lOworfSBGY0NvZGVQYWdlUmFuZ2VbXSA9IHsKKyAgICB7IDAsCUZDX0xBTkdfTEFUSU5fMSB9LAorICAgIHsgMSwJRkNfTEFOR19MQVRJTl8yX0VBU1RFUk5fRVVST1BFIH0sCisgICAgeyAyLAlGQ19MQU5HX0NZUklMTElDIH0sCisgICAgeyAzLAlGQ19MQU5HX0dSRUVLIH0sCisgICAgeyA0LAlGQ19MQU5HX1RVUktJU0ggfSwKKyAgICB7IDUsCUZDX0xBTkdfSEVCUkVXIH0sCisgICAgeyA2LAlGQ19MQU5HX0FSQUJJQyB9LAorICAgIHsgNywJRkNfTEFOR19XSU5ET1dTX0JBTFRJQyB9LAorICAgIHsgOCwJRkNfTEFOR19WSUVUTkFNRVNFIH0sCisvKiA5LTE1IHJlc2VydmVkIGZvciBBbHRlcm5hdGUgQU5TSSAqLworICAgIHsgMTYsCUZDX0xBTkdfVEhBSSB9LAorICAgIHsgMTcsCUZDX0xBTkdfSkFQQU5FU0UgfSwKKyAgICB7IDE4LAlGQ19MQU5HX1NJTVBMSUZJRURfQ0hJTkVTRSB9LAorICAgIHsgMTksCUZDX0xBTkdfS09SRUFOX1dBTlNVTkcgfSwKKyAgICB7IDIwLAlGQ19MQU5HX1RSQURJVElPTkFMX0NISU5FU0UgfSwKKyAgICB7IDIxLAlGQ19MQU5HX0tPUkVBTl9KT0hBQiB9LAorLyogMjItMjggcmVzZXJ2ZWQgZm9yIEFsdGVybmF0ZSBBTlNJICYgT0VNICovCisgICAgeyAyOSwJRkNfTEFOR19NQUNJTlRPU0ggfSwKKyAgICB7IDMwLAlGQ19MQU5HX09FTSB9LAorICAgIHsgMzEsCUZDX0xBTkdfU1lNQk9MIH0sCisvKiAzMi00NyByZXNlcnZlZCBmb3IgT0VNICovCisgICAgeyA0OCwJRkNfTEFOR19JQk1fR1JFRUsgfSwKKyAgICB7IDQ5LAlGQ19MQU5HX01TRE9TX1JVU1NJQU4gfSwKKyAgICB7IDUwLAlGQ19MQU5HX01TRE9TX05PUkRJQyB9LAorICAgIHsgNTEsCUZDX0xBTkdfQVJBQklDXzg2NCB9LAorICAgIHsgNTIsCUZDX0xBTkdfTVNET1NfQ0FOQURJQU5fRlJFTkNIIH0sCisgICAgeyA1MywJRkNfTEFOR19IRUJSRVdfODYyIH0sCisgICAgeyA1NCwJRkNfTEFOR19NU0RPU19JQ0VMQU5ESUMgfSwKKyAgICB7IDU1LAlGQ19MQU5HX01TRE9TX1BPUlRVR1VFU0UgfSwKKyAgICB7IDU2LAlGQ19MQU5HX0lCTV9UVVJLSVNIIH0sCisgICAgeyA1NywJRkNfTEFOR19JQk1fQ1lSSUxMSUMgfSwKKyAgICB7IDU4LAlGQ19MQU5HX0xBVElOXzIgfSwKKyAgICB7IDU5LAlGQ19MQU5HX01TRE9TX0JBTFRJQyB9LAorICAgIHsgNjAsCUZDX0xBTkdfR1JFRUtfNDM3X0cgfSwKKyAgICB7IDYxLAlGQ19MQU5HX0FSQUJJQ19BU01PXzcwOCB9LAorICAgIHsgNjIsCUZDX0xBTkdfV0VfTEFUSU5fMSB9LAorICAgIHsgNjMsCUZDX0xBTkdfVVMgfSwKK307CisKKyNkZWZpbmUgTlVNX0NPREVfUEFHRV9SQU5HRSAoc2l6ZW9mIEZjQ29kZVBhZ2VSYW5nZSAvIHNpemVvZiBGY0NvZGVQYWdlUmFuZ2VbMF0pCisKK0ZjUGF0dGVybiAqCitGY0ZyZWVUeXBlUXVlcnkgKGNvbnN0IGNoYXIgKmZpbGUsCisJCSBpbnQJICAgIGlkLAorCQkgRmNCbGFua3MgICAqYmxhbmtzLAorCQkgaW50CSAgICAqY291bnQpCit7CisgICAgRlRfRmFjZQlmYWNlOworICAgIEZjUGF0dGVybgkqcGF0OworICAgIGludAkJc2xhbnQ7CisgICAgaW50CQl3ZWlnaHQ7CisgICAgaW50CQlpOworICAgIEZjQ2hhclNldAkqY3M7CisgICAgRlRfTGlicmFyeQlmdExpYnJhcnk7CisgICAgY29uc3QgY2hhcgkqZmFtaWx5OworICAgIFRUX09TMgkqb3MyOworCisgICAgaWYgKEZUX0luaXRfRnJlZVR5cGUgKCZmdExpYnJhcnkpKQorCXJldHVybiAwOworICAgIAorICAgIGlmIChGVF9OZXdfRmFjZSAoZnRMaWJyYXJ5LCBmaWxlLCBpZCwgJmZhY2UpKQorCWdvdG8gYmFpbDsKKworICAgICpjb3VudCA9IGZhY2UtPm51bV9mYWNlczsKKworICAgIHBhdCA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKKyAgICBpZiAoIXBhdCkKKwlnb3RvIGJhaWwwOworCisgICAgaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX09VVExJTkUsCisJCQkgICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkgIT0gMCkpCisJZ290byBiYWlsMTsKKworICAgIGlmICghRmNQYXR0ZXJuQWRkQm9vbCAocGF0LCBGQ19TQ0FMQUJMRSwKKwkJCSAgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSAhPSAwKSkKKwlnb3RvIGJhaWwxOworCisKKyAgICBzbGFudCA9IEZDX1NMQU5UX1JPTUFOOworICAgIGlmIChmYWNlLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDKQorCXNsYW50ID0gRkNfU0xBTlRfSVRBTElDOworCisgICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1NMQU5ULCBzbGFudCkpCisJZ290byBiYWlsMTsKKworICAgIHdlaWdodCA9IEZDX1dFSUdIVF9NRURJVU07CisgICAgaWYgKGZhY2UtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19CT0xEKQorCXdlaWdodCA9IEZDX1dFSUdIVF9CT0xEOworCisgICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1dFSUdIVCwgd2VpZ2h0KSkKKwlnb3RvIGJhaWwxOworCisgICAgZmFtaWx5ID0gZmFjZS0+ZmFtaWx5X25hbWU7CisgICAgaWYgKCFmYW1pbHkpCisgICAgeworCWZhbWlseSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7CisJaWYgKGZhbWlseSkKKwkgICAgZmFtaWx5Kys7CisJZWxzZQorCSAgICBmYW1pbHkgPSBmaWxlOworICAgIH0KKyAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19GQU1JTFksIGZhbWlseSkpCisJZ290byBiYWlsMTsKKworICAgIGlmIChmYWNlLT5zdHlsZV9uYW1lKQorICAgIHsKKwlpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19TVFlMRSwgZmFjZS0+c3R5bGVfbmFtZSkpCisJICAgIGdvdG8gYmFpbDE7CisgICAgfQorCisgICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRklMRSwgZmlsZSkpCisJZ290byBiYWlsMTsKKworICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19JTkRFWCwgaWQpKQorCWdvdG8gYmFpbDE7CisKKyAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19TT1VSQ0UsICJGcmVlVHlwZSIpKQorCWdvdG8gYmFpbDE7CisKKyNpZiAwCisgICAgaWYgKChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIKSAhPSAwKQorCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19TUEFDSU5HLCBGQ19NT05PKSkKKwkgICAgZ290byBiYWlsMTsKKyNlbmRpZgorCisgICAgY3MgPSBGY0ZyZWVUeXBlQ2hhclNldCAoZmFjZSwgYmxhbmtzKTsKKyAgICBpZiAoIWNzKQorCWdvdG8gYmFpbDE7CisKKyAgICAvKgorICAgICAqIFNraXAgb3ZlciBQQ0YgZm9udHMgdGhhdCBoYXZlIG5vIGVuY29kZWQgY2hhcmFjdGVyczsgdGhleSdyZQorICAgICAqIHVzdWFsbHkganVzdCBVbmljb2RlIGZvbnRzIHRyYW5zY29kZWQgdG8gc29tZSBsZWdhY3kgZW5jb2RpbmcKKyAgICAgKi8KKyAgICBpZiAoRmNDaGFyU2V0Q291bnQgKGNzKSA9PSAwKQorICAgIHsKKwlpZiAoIXN0cmNtcChGVF9NT0RVTEVfQ0xBU1MoJmZhY2UtPmRyaXZlci0+cm9vdCktPm1vZHVsZV9uYW1lLCAicGNmIikpCisJICAgIGdvdG8gYmFpbDI7CisgICAgfQorCisgICAgaWYgKCFGY1BhdHRlcm5BZGRDaGFyU2V0IChwYXQsIEZDX0NIQVJTRVQsIGNzKSkKKwlnb3RvIGJhaWwyOworICAgIC8qCisgICAgICogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBjaGFyc2V0CisgICAgICovCisgICAgRmNDaGFyU2V0RGVzdHJveSAoY3MpOworICAgIAorICAgIGlmICghKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgZmFjZS0+bnVtX2ZpeGVkX3NpemVzOyBpKyspCisJICAgIGlmICghRmNQYXR0ZXJuQWRkRG91YmxlIChwYXQsIEZDX1BJWEVMX1NJWkUsCisJCQkJICAgICAoZG91YmxlKSBmYWNlLT5hdmFpbGFibGVfc2l6ZXNbaV0uaGVpZ2h0KSkKKwkJZ290byBiYWlsMTsKKwlpZiAoIUZjUGF0dGVybkFkZEJvb2wgKHBhdCwgRkNfQU5USUFMSUFTLCBGY0ZhbHNlKSkKKwkgICAgZ290byBiYWlsMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgT1MvMiB0YWJsZSBhbmQgcG9rZSBhYm91dAorICAgICAqLworICAgIG9zMiA9IChUVF9PUzIgKikgRlRfR2V0X1NmbnRfVGFibGUgKGZhY2UsIGZ0X3NmbnRfb3MyKTsKKyAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFX1BBR0VfUkFOR0U7IGkrKykKKwl7CisJICAgIEZUX1VMb25nCWJpdHM7CisJICAgIGludAkJYml0OworCSAgICBpZiAoRmNDb2RlUGFnZVJhbmdlW2ldLmJpdCA8IDMyKQorCSAgICB7CisJCWJpdHMgPSBvczItPnVsQ29kZVBhZ2VSYW5nZTE7CisJCWJpdCA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5iaXQ7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWJpdHMgPSBvczItPnVsQ29kZVBhZ2VSYW5nZTI7CisJCWJpdCA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5iaXQgLSAzMjsKKwkgICAgfQorCSAgICBpZiAoYml0cyAmICgxIDw8IGJpdCkpCisJICAgIHsKKwkJaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfTEFORywKKwkJCQkJIEZjQ29kZVBhZ2VSYW5nZVtpXS5uYW1lKSkKKwkJICAgIGdvdG8gYmFpbDE7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgRlRfRG9uZV9GYWNlIChmYWNlKTsKKyAgICBGVF9Eb25lX0ZyZWVUeXBlIChmdExpYnJhcnkpOworICAgIHJldHVybiBwYXQ7CisKK2JhaWwyOgorICAgIEZjQ2hhclNldERlc3Ryb3kgKGNzKTsKK2JhaWwxOgorICAgIEZjUGF0dGVybkRlc3Ryb3kgKHBhdCk7CitiYWlsMDoKKyAgICBGVF9Eb25lX0ZhY2UgKGZhY2UpOworYmFpbDoKKyAgICBGVF9Eb25lX0ZyZWVUeXBlIChmdExpYnJhcnkpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2ZjZnMuYyBiL3NyYy9mY2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMDcxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY2ZzLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZjaW50LmgiCisKK0ZjRm9udFNldCAqCitGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpCit7CisgICAgRmNGb250U2V0CSpzOworCisgICAgcyA9IChGY0ZvbnRTZXQgKikgbWFsbG9jIChzaXplb2YgKEZjRm9udFNldCkpOworICAgIGlmICghcykKKwlyZXR1cm4gMDsKKyAgICBGY01lbUFsbG9jIChGQ19NRU1fRk9OVFNFVCwgc2l6ZW9mIChGY0ZvbnRTZXQpKTsKKyAgICBzLT5uZm9udCA9IDA7CisgICAgcy0+c2ZvbnQgPSAwOworICAgIHMtPmZvbnRzID0gMDsKKyAgICByZXR1cm4gczsKK30KKwordm9pZAorRmNGb250U2V0RGVzdHJveSAoRmNGb250U2V0ICpzKQoreworICAgIGludAkgICAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uZm9udDsgaSsrKQorCUZjUGF0dGVybkRlc3Ryb3kgKHMtPmZvbnRzW2ldKTsKKyAgICBpZiAocy0+Zm9udHMpCisgICAgeworCUZjTWVtRnJlZSAoRkNfTUVNX0ZPTlRQVFIsIHMtPnNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOworCWZyZWUgKHMtPmZvbnRzKTsKKyAgICB9CisgICAgRmNNZW1GcmVlIChGQ19NRU1fRk9OVFNFVCwgc2l6ZW9mIChGY0ZvbnRTZXQpKTsKKyAgICBmcmVlIChzKTsKK30KKworRmNCb29sCitGY0ZvbnRTZXRBZGQgKEZjRm9udFNldCAqcywgRmNQYXR0ZXJuICpmb250KQoreworICAgIEZjUGF0dGVybgkqKmY7CisgICAgaW50CQlzZm9udDsKKyAgICAKKyAgICBpZiAocy0+bmZvbnQgPT0gcy0+c2ZvbnQpCisgICAgeworCXNmb250ID0gcy0+c2ZvbnQgKyAzMjsKKwlpZiAocy0+Zm9udHMpCisJICAgIGYgPSAoRmNQYXR0ZXJuICoqKSByZWFsbG9jIChzLT5mb250cywgc2ZvbnQgKiBzaXplb2YgKEZjUGF0dGVybiAqKSk7CisJZWxzZQorCSAgICBmID0gKEZjUGF0dGVybiAqKikgbWFsbG9jIChzZm9udCAqIHNpemVvZiAoRmNQYXR0ZXJuICopKTsKKwlpZiAoIWYpCisJICAgIHJldHVybiBGY0ZhbHNlOworCWlmIChzLT5zZm9udCkKKwkgICAgRmNNZW1GcmVlIChGQ19NRU1fRk9OVFBUUiwgcy0+c2ZvbnQgKiBzaXplb2YgKEZjUGF0dGVybiAqKSk7CisJRmNNZW1BbGxvYyAoRkNfTUVNX0ZPTlRQVFIsIHNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOworCXMtPnNmb250ID0gc2ZvbnQ7CisJcy0+Zm9udHMgPSBmOworICAgIH0KKyAgICBzLT5mb250c1tzLT5uZm9udCsrXSA9IGZvbnQ7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9mY2luaXQuYyBiL3NyYy9mY2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJlMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjaW5pdC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogJFhGcmVlODY6ICQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZmNpbnQuaCIKKworRmNCb29sCitGY0luaXRGb250cyAodm9pZCkKK3sKKyAgICBGY0NvbmZpZwkqY29uZmlnOworCisgICAgY29uZmlnID0gRmNDb25maWdHZXRDdXJyZW50ICgpOworICAgIGlmICghY29uZmlnKQorCXJldHVybiBGY0ZhbHNlOworCisgICAgaWYgKEZjQ29uZmlnR2V0Rm9udHMgKGNvbmZpZywgRmNTZXRTeXN0ZW0pKQorCXJldHVybiBGY1RydWU7CisKKyAgICByZXR1cm4gRmNDb25maWdCdWlsZEZvbnRzIChjb25maWcpOworfQorCitzdGF0aWMgRmNCb29sCitGY0luaXRGYWxsYmFja0NvbmZpZyAodm9pZCkKK3sKKyAgICBGY0NvbmZpZwkqY29uZmlnOworCisgICAgY29uZmlnID0gRmNDb25maWdDcmVhdGUgKCk7CisgICAgaWYgKCFjb25maWcpCisJZ290byBiYWlsMDsKKyAgICBpZiAoIUZjQ29uZmlnQWRkRGlyIChjb25maWcsIEZDX0ZBTExCQUNLX0ZPTlRTKSkKKwlnb3RvIGJhaWwxOworICAgIEZjQ29uZmlnU2V0Q3VycmVudCAoY29uZmlnKTsKKyAgICByZXR1cm4gRmNUcnVlOworCitiYWlsMToKKyAgICBGY0NvbmZpZ0Rlc3Ryb3kgKGNvbmZpZyk7CitiYWlsMDoKKyAgICByZXR1cm4gRmNGYWxzZTsKK30KKworLyoKKyAqIExvY2F0ZSBhbmQgcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorICovCitGY0Jvb2wKK0ZjSW5pdENvbmZpZyAodm9pZCkKK3sKKyAgICBGY0NvbmZpZyAgICAqY29uZmlnOworICAgIAorICAgIGlmIChGY0NvbmZpZ0dldEN1cnJlbnQgKCkpCisJcmV0dXJuIEZjVHJ1ZTsKKyAgICAKKyAgICBjb25maWcgPSBGY0NvbmZpZ0NyZWF0ZSAoKTsKKyAgICBpZiAoIWNvbmZpZykKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICAKKyAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkIChjb25maWcsIDAsIEZjVHJ1ZSkpCisgICAgeworCUZjQ29uZmlnRGVzdHJveSAoY29uZmlnKTsKKwlyZXR1cm4gRmNJbml0RmFsbGJhY2tDb25maWcgKCk7CisgICAgfQorICAgIAorICAgIEZjQ29uZmlnU2V0Q3VycmVudCAoY29uZmlnKTsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitGY0Jvb2wKK0ZjSW5pdCAodm9pZCkKK3sKKyAgICByZXR1cm4gRmNJbml0Q29uZmlnICgpICYmIEZjSW5pdEZvbnRzICgpOworfQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBjaGFyICAgICpuYW1lOworICAgIGludAkgICAgYWxsb2NfY291bnQ7CisgICAgaW50CSAgICBhbGxvY19tZW07CisgICAgaW50CSAgICBmcmVlX2NvdW50OworICAgIGludAkgICAgZnJlZV9tZW07Cit9IEZjSW5Vc2VbRkNfTUVNX05VTV0gPSB7CisgICAgeyAiY2hhcnNldCIsIDAsIDAgfSwKKyAgICB7ICJjaGFybm9kZSIsIDAgLDAgfSwKKyAgICB7ICJmb250c2V0IiwgMCwgMCB9LAorICAgIHsgImZvbnRwdHIiLCAwLCAwIH0sCisgICAgeyAib2JqZWN0c2V0IiwgMCwgMCB9LAorICAgIHsgIm9iamVjdHB0ciIsIDAsIDAgfSwKKyAgICB7ICJtYXRyaXgiLCAwLCAwIH0sCisgICAgeyAicGF0dGVybiIsIDAsIDAgfSwKKyAgICB7ICJwYXRlbHQiLCAwLCAwIH0sCisgICAgeyAidmFsbGlzdCIsIDAsIDAgfSwKKyAgICB7ICJzdWJzdGF0ZSIsIDAsIDAgfSwKKyAgICB7ICJzdHJpbmciLCAwLCAwIH0sCisgICAgeyAibGlzdGJ1Y2siLCAwLCAwIH0sCit9OworCitzdGF0aWMgaW50ICBGY0FsbG9jQ291bnQsIEZjQWxsb2NNZW07CitzdGF0aWMgaW50ICBGY0ZyZWVDb3VudCwgRmNGcmVlTWVtOworCitzdGF0aWMgaW50ICBGY01lbU5vdGljZSA9IDEqMTAyNCoxMDI0OworCitzdGF0aWMgaW50ICBGY0FsbG9jTm90aWZ5LCBGY0ZyZWVOb3RpZnk7CisKK3ZvaWQKK0ZjTWVtUmVwb3J0ICh2b2lkKQoreworICAgIGludAlpOworICAgIHByaW50ZiAoIkZjIE1lbW9yeSBVc2FnZTpcbiIpOworICAgIHByaW50ZiAoIlx0ICAgV2hpY2ggICAgICAgQWxsb2MgICAgICAgICAgIEZyZWUgICAgICAgICAgIEFjdGl2ZVxuIik7CisgICAgcHJpbnRmICgiXHQgICAgICAgICAgIGNvdW50ICAgYnl0ZXMgICBjb3VudCAgIGJ5dGVzICAgY291bnQgICBieXRlc1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IEZDX01FTV9OVU07IGkrKykKKwlwcmludGYgKCJcdCU4LjhzJThkJThkJThkJThkJThkJThkXG4iLAorCQlGY0luVXNlW2ldLm5hbWUsCisJCUZjSW5Vc2VbaV0uYWxsb2NfY291bnQsIEZjSW5Vc2VbaV0uYWxsb2NfbWVtLAorCQlGY0luVXNlW2ldLmZyZWVfY291bnQsIEZjSW5Vc2VbaV0uZnJlZV9tZW0sCisJCUZjSW5Vc2VbaV0uYWxsb2NfY291bnQgLSBGY0luVXNlW2ldLmZyZWVfY291bnQsCisJCUZjSW5Vc2VbaV0uYWxsb2NfbWVtIC0gRmNJblVzZVtpXS5mcmVlX21lbSk7CisgICAgcHJpbnRmICgiXHQlOC44cyU4ZCU4ZCU4ZCU4ZCU4ZCU4ZFxuIiwKKwkgICAgIlRvdGFsIiwKKwkgICAgRmNBbGxvY0NvdW50LCBGY0FsbG9jTWVtLAorCSAgICBGY0ZyZWVDb3VudCwgRmNGcmVlTWVtLAorCSAgICBGY0FsbG9jQ291bnQgLSBGY0ZyZWVDb3VudCwKKwkgICAgRmNBbGxvY01lbSAtIEZjRnJlZU1lbSk7CisgICAgRmNBbGxvY05vdGlmeSA9IDA7CisgICAgRmNGcmVlTm90aWZ5ID0gMDsKK30KKwordm9pZAorRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKQoreworICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfTUVNT1JZKQorICAgIHsKKwlGY0luVXNlW2tpbmRdLmFsbG9jX2NvdW50Kys7CisJRmNJblVzZVtraW5kXS5hbGxvY19tZW0gKz0gc2l6ZTsKKwlGY0FsbG9jQ291bnQrKzsKKwlGY0FsbG9jTWVtICs9IHNpemU7CisJRmNBbGxvY05vdGlmeSArPSBzaXplOworCWlmIChGY0FsbG9jTm90aWZ5ID4gRmNNZW1Ob3RpY2UpCisJICAgIEZjTWVtUmVwb3J0ICgpOworICAgIH0KK30KKwordm9pZAorRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpCit7CisgICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19NRU1PUlkpCisgICAgeworCUZjSW5Vc2Vba2luZF0uZnJlZV9jb3VudCsrOworCUZjSW5Vc2Vba2luZF0uZnJlZV9tZW0gKz0gc2l6ZTsKKwlGY0ZyZWVDb3VudCsrOworCUZjRnJlZU1lbSArPSBzaXplOworCUZjRnJlZU5vdGlmeSArPSBzaXplOworCWlmIChGY0ZyZWVOb3RpZnkgPiBGY01lbU5vdGljZSkKKwkgICAgRmNNZW1SZXBvcnQgKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2ZjaW50LmggYi9zcmMvZmNpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzlkZjNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjaW50LmgKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0ZDSU5UX0hfCisjZGVmaW5lIF9GQ0lOVF9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+CisjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3ByaXZhdGUuaD4KKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZjeG1sLmg+CisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9GY01hdGNoZXIgeworICAgIGNoYXIgICAgKm9iamVjdDsKKyAgICBkb3VibGUgICgqY29tcGFyZSkgKGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZTEsIEZjVmFsdWUgdmFsdWUyKTsKK30gRmNNYXRjaGVyOworCit0eXBlZGVmIHN0cnVjdCBfRmNTeW1ib2xpYyB7CisgICAgY29uc3QgY2hhcgkqbmFtZTsKKyAgICBpbnQJCXZhbHVlOworfSBGY1N5bWJvbGljOworCisjaWZuZGVmIEZDX0NPTkZJR19QQVRICisjZGVmaW5lIEZDX0NPTkZJR19QQVRIICJmb250cy5jb25mIgorI2VuZGlmCisKKyNkZWZpbmUgRkNfREJHX01BVENICTEKKyNkZWZpbmUgRkNfREJHX01BVENIVgkyCisjZGVmaW5lIEZDX0RCR19FRElUCTQKKyNkZWZpbmUgRkNfREJHX0ZPTlRTRVQJOAorI2RlZmluZSBGQ19EQkdfQ0FDSEUJMTYKKyNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgorI2RlZmluZSBGQ19EQkdfUEFSU0UJNjQKKyNkZWZpbmUgRkNfREJHX1NDQU4JMTI4CisjZGVmaW5lIEZDX0RCR19NRU1PUlkJNTEyCisKKyNkZWZpbmUgRkNfTUVNX0NIQVJTRVQJICAgIDAKKyNkZWZpbmUgRkNfTUVNX0NIQVJOT0RFCSAgICAxCisjZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCisjZGVmaW5lIEZDX01FTV9GT05UUFRSCSAgICAzCisjZGVmaW5lIEZDX01FTV9PQkpFQ1RTRVQgICAgNAorI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKKyNkZWZpbmUgRkNfTUVNX01BVFJJWAkgICAgNgorI2RlZmluZSBGQ19NRU1fUEFUVEVSTgkgICAgNworI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CisjZGVmaW5lIEZDX01FTV9WQUxMSVNUCSAgICA5CisjZGVmaW5lIEZDX01FTV9TVUJTVEFURQkgICAgMTAKKyNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKKyNkZWZpbmUgRkNfTUVNX0xJU1RCVUNLCSAgICAxMgorI2RlZmluZSBGQ19NRU1fTlVNCSAgICAxMworCit0eXBlZGVmIHN0cnVjdCBfRmNWYWx1ZUxpc3QgeworICAgIHN0cnVjdCBfRmNWYWx1ZUxpc3QgICAgKm5leHQ7CisgICAgRmNWYWx1ZQkJICAgIHZhbHVlOworfSBGY1ZhbHVlTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjUGF0dGVybkVsdCB7CisgICAgY29uc3QgY2hhcgkgICAgKm9iamVjdDsKKyAgICBGY1ZhbHVlTGlzdCAgICAqdmFsdWVzOworfSBGY1BhdHRlcm5FbHQ7CisKK3N0cnVjdCBfRmNQYXR0ZXJuIHsKKyAgICBpbnQJCSAgICBudW07CisgICAgaW50CQkgICAgc2l6ZTsKKyAgICBGY1BhdHRlcm5FbHQgICAqZWx0czsKK307CisKK3R5cGVkZWYgZW51bSBfRmNPcCB7CisgICAgRmNPcEludGVnZXIsIEZjT3BEb3VibGUsIEZjT3BTdHJpbmcsIEZjT3BNYXRyaXgsIEZjT3BCb29sLCBGY09wQ2hhclNldCwgCisgICAgRmNPcE5pbCwKKyAgICBGY09wRmllbGQsIEZjT3BDb25zdCwKKyAgICBGY09wQXNzaWduLCBGY09wQXNzaWduUmVwbGFjZSwgCisgICAgRmNPcFByZXBlbmRGaXJzdCwgRmNPcFByZXBlbmQsIEZjT3BBcHBlbmQsIEZjT3BBcHBlbmRMYXN0LAorICAgIEZjT3BRdWVzdCwKKyAgICBGY09wT3IsIEZjT3BBbmQsIEZjT3BFcXVhbCwgRmNPcE5vdEVxdWFsLCBGY09wQ29udGFpbnMsCisgICAgRmNPcExlc3MsIEZjT3BMZXNzRXF1YWwsIEZjT3BNb3JlLCBGY09wTW9yZUVxdWFsLAorICAgIEZjT3BQbHVzLCBGY09wTWludXMsIEZjT3BUaW1lcywgRmNPcERpdmlkZSwKKyAgICBGY09wTm90LCBGY09wQ29tbWEsIEZjT3BJbnZhbGlkCit9IEZjT3A7CisKK3R5cGVkZWYgc3RydWN0IF9GY0V4cHIgeworICAgIEZjT3AgICBvcDsKKyAgICB1bmlvbiB7CisJaW50CSAgICBpdmFsOworCWRvdWJsZQkgICAgZHZhbDsKKwljaGFyCSAgICAqc3ZhbDsKKwlGY01hdHJpeCAgICAqbXZhbDsKKwlGY0Jvb2wJICAgIGJ2YWw7CisJRmNDaGFyU2V0ICAgKmN2YWw7CisJY2hhcgkgICAgKmZpZWxkOworCWNoYXIJICAgICpjb25zdGFudDsKKwlzdHJ1Y3QgeworCSAgICBzdHJ1Y3QgX0ZjRXhwciAqbGVmdCwgKnJpZ2h0OworCX0gdHJlZTsKKyAgICB9IHU7Cit9IEZjRXhwcjsKKwordHlwZWRlZiBlbnVtIF9GY1F1YWwgeworICAgIEZjUXVhbEFueSwgRmNRdWFsQWxsCit9IEZjUXVhbDsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjVGVzdCB7CisgICAgc3RydWN0IF9GY1Rlc3QJKm5leHQ7CisgICAgRmNRdWFsCQlxdWFsOworICAgIGNvbnN0IGNoYXIJCSpmaWVsZDsKKyAgICBGY09wCQlvcDsKKyAgICBGY0V4cHIJCSpleHByOworfSBGY1Rlc3Q7CisKK3R5cGVkZWYgc3RydWN0IF9GY0VkaXQgeworICAgIHN0cnVjdCBfRmNFZGl0ICpuZXh0OworICAgIGNvbnN0IGNoYXIJICAgICpmaWVsZDsKKyAgICBGY09wCSAgICBvcDsKKyAgICBGY0V4cHIJICAgICpleHByOworfSBGY0VkaXQ7CisKK3R5cGVkZWYgc3RydWN0IF9GY1N1YnN0IHsKKyAgICBzdHJ1Y3QgX0ZjU3Vic3QJKm5leHQ7CisgICAgRmNUZXN0CQkqdGVzdDsKKyAgICBGY0VkaXQJCSplZGl0OworfSBGY1N1YnN0OworCit0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTGVhZiBGY0NoYXJMZWFmOwordHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhckJyYW5jaCBGY0NoYXJCcmFuY2g7Cit0eXBlZGVmIHVuaW9uICBfRmNDaGFyTm9kZSBGY0NoYXJOb2RlOworCitzdHJ1Y3QgX0ZjQ2hhckxlYWYgeworICAgIEZjQ2hhcjMyCW1hcFsyNTYvMzJdOworfTsKKwordW5pb24gX0ZjQ2hhck5vZGUgeworICAgIEZjQ2hhckJyYW5jaCAgICAqYnJhbmNoOworICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOworfTsKKworc3RydWN0IF9GY0NoYXJCcmFuY2ggeworICAgIEZjQ2hhck5vZGUJICAgIG5vZGVzWzI1Nl07Cit9OworCitzdHJ1Y3QgX0ZjQ2hhclNldCB7CisgICAgaW50CQkgICAgbGV2ZWxzOworICAgIGludAkJICAgIHJlZjsJLyogcmVmZXJlbmNlIGNvdW50ICovCisgICAgRmNCb29sCSAgICBjb25zdGFudDsJLyogc2hhcmVkIGNvbnN0YW50ICovCisgICAgRmNDaGFyTm9kZQkgICAgbm9kZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9GY05hbWVCdWYgeworICAgIEZjQ2hhcjggKmJ1ZjsKKyAgICBGY0Jvb2wgIGFsbG9jYXRlZDsKKyAgICBGY0Jvb2wgIGZhaWxlZDsKKyAgICBpbnQJICAgIGxlbjsKKyAgICBpbnQJICAgIHNpemU7Cit9IEZjTmFtZUJ1ZjsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjRmlsZUNhY2hlRW50IHsKKyAgICBzdHJ1Y3QgX0ZjRmlsZUNhY2hlRW50ICpuZXh0OworICAgIHVuc2lnbmVkIGludAkgICAgaGFzaDsKKyAgICBjaGFyCQkgICAgKmZpbGU7CisgICAgaW50CQkJICAgIGlkOworICAgIHRpbWVfdAkJICAgIHRpbWU7CisgICAgY2hhcgkJICAgICpuYW1lOworICAgIEZjQm9vbAkJICAgIHJlZmVyZW5jZWQ7Cit9IEZjRmlsZUNhY2hlRW50OworCisjZGVmaW5lIEZDX0ZJTEVfQ0FDSEVfSEFTSF9TSVpFICAgNTA5CisKK3N0cnVjdCBfRmNGaWxlQ2FjaGUgeworICAgIEZjRmlsZUNhY2hlRW50CSplbnRzW0ZDX0ZJTEVfQ0FDSEVfSEFTSF9TSVpFXTsKKyAgICBGY0Jvb2wJCXVwZGF0ZWQ7CisgICAgaW50CQkJZW50cmllczsKKyAgICBpbnQJCQlyZWZlcmVuY2VkOworfTsKKworc3RydWN0IF9GY0JsYW5rcyB7CisgICAgaW50CQluYmxhbms7CisgICAgaW50CQlzYmxhbms7CisgICAgRmNDaGFyMzIJKmJsYW5rczsKK307CisKK3N0cnVjdCBfRmNDb25maWcgeworICAgIC8qCisgICAgICogRmlsZSBuYW1lcyBsb2FkZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiAtLSBzYXZlZCBoZXJlIGFzIHRoZQorICAgICAqIGNhY2hlIGZpbGUgbXVzdCBiZSBjb25zdWx0ZWQgYmVmb3JlIHRoZSBkaXJlY3RvcmllcyBhcmUgc2Nhbm5lZCwKKyAgICAgKiBhbmQgdGhvc2UgZGlyZWN0aXZlcyBtYXkgb2NjdXIgaW4gYW55IG9yZGVyCisgICAgICovCisgICAgY2hhcgkqKmRpcnM7CQkgICAgLyogZGlyZWN0b3JpZXMgY29udGFpbmluZyBmb250cyAqLworICAgIGNoYXIJKmNhY2hlOwkJICAgIC8qIG5hbWUgb2YgcGVyLXVzZXIgY2FjaGUgZmlsZSAqLworICAgIC8qCisgICAgICogU2V0IG9mIGFsbG93ZWQgYmxhbmsgY2hhcnMgLS0gdXNlZCB0bworICAgICAqIHRyaW0gZm9udHMgb2YgYm9ndXMgZ2x5cGhzCisgICAgICovCisgICAgRmNCbGFua3MJKmJsYW5rczsKKyAgICAvKgorICAgICAqIE5hbWVzIG9mIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkCisgICAgICogdG8gY3JlYXRlIHRoaXMgY29uZmlndXJhdGlvbgorICAgICAqLworICAgIGNoYXIJKipjb25maWdGaWxlczsJICAgIC8qIGNvbmZpZyBmaWxlcyBsb2FkZWQgKi8KKyAgICAvKgorICAgICAqIFN1YnN0aXR1dGlvbiBpbnN0cnVjdGlvbnMgZm9yIHBhdHRlcm5zIGFuZCBmb250czsKKyAgICAgKiBtYXhPYmplY3RzIGlzIHVzZWQgdG8gYWxsb2NhdGUgYXBwcm9wcmlhdGUgaW50ZXJtZWRpYXRlIHN0b3JhZ2UKKyAgICAgKiB3aGlsZSBwZXJmb3JtaW5nIGEgd2hvbGUgc2V0IG9mIHN1YnN0aXR1dGlvbnMKKyAgICAgKi8KKyAgICBGY1N1YnN0CSpzdWJzdFBhdHRlcm47CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBwYXR0ZXJucyAqLworICAgIEZjU3Vic3QJKnN1YnN0Rm9udDsJICAgIC8qIHN1YnN0aXR1dGlvbnMgZm9yIGZvbnRzICovCisgICAgaW50CQltYXhPYmplY3RzOwkgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGVzdHMgaW4gYWxsIHN1YnN0cyAqLworICAgIC8qCisgICAgICogVGhlIHNldCBvZiBmb250cyBsb2FkZWQgZnJvbSB0aGUgbGlzdGVkIGRpcmVjdG9yaWVzOyB0aGUKKyAgICAgKiBvcmRlciB3aXRoaW4gdGhlIHNldCBkb2VzIG5vdCBkZXRlcm1pbmUgdGhlIGZvbnQgc2VsZWN0aW9uLAorICAgICAqIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBpZGVudGljYWwgbWF0Y2hlcyBpbiB3aGljaCBjYXNlIGVhcmxpZXIgZm9udHMKKyAgICAgKiBtYXRjaCBwcmVmZXJyZW50aWFsbHkKKyAgICAgKi8KKyAgICBGY0ZvbnRTZXQJKmZvbnRzW0ZjU2V0QXBwbGljYXRpb24gKyAxXTsKK307CisgCisvKiBmY2JsYW5rcy5jICovCisKKy8qIGZjY2FjaGUuYyAqLworCitGY0ZpbGVDYWNoZSAqCitGY0ZpbGVDYWNoZUNyZWF0ZSAodm9pZCk7CisKK2NoYXIgKgorRmNGaWxlQ2FjaGVGaW5kIChGY0ZpbGVDYWNoZQkqY2FjaGUsCisJCSBjb25zdCBjaGFyCSpmaWxlLAorCQkgaW50CQlpZCwKKwkJIGludAkJKmNvdW50KTsKKwordm9pZAorRmNGaWxlQ2FjaGVEZXN0cm95IChGY0ZpbGVDYWNoZQkqY2FjaGUpOworCit2b2lkCitGY0ZpbGVDYWNoZUxvYWQgKEZjRmlsZUNhY2hlCSpjYWNoZSwKKwkJIGNvbnN0IGNoYXIJKmNhY2hlX2ZpbGUpOworCitGY0Jvb2wKK0ZjRmlsZUNhY2hlVXBkYXRlIChGY0ZpbGVDYWNoZQkqY2FjaGUsCisJCSAgIGNvbnN0IGNoYXIJKmZpbGUsCisJCSAgIGludAkJaWQsCisJCSAgIGNvbnN0IGNoYXIJKm5hbWUpOworCitGY0Jvb2wKK0ZjRmlsZUNhY2hlU2F2ZSAoRmNGaWxlQ2FjaGUJKmNhY2hlLAorCQkgY29uc3QgY2hhcgkqY2FjaGVfZmlsZSk7CisKK0ZjQm9vbAorRmNGaWxlQ2FjaGVSZWFkRGlyIChGY0ZvbnRTZXQgKnNldCwgY29uc3QgY2hhciAqY2FjaGVfZmlsZSk7CisKK0ZjQm9vbAorRmNGaWxlQ2FjaGVXcml0ZURpciAoRmNGb250U2V0ICpzZXQsIGNvbnN0IGNoYXIgKmNhY2hlX2ZpbGUpOworICAgIAorLyogZmNjZmcuYyAqLworCitGY0Jvb2wKK0ZjQ29uZmlnQWRkRGlyIChGY0NvbmZpZyAgICAqY29uZmlnLAorCQljb25zdCBjaGFyICAqZCk7CisKK0ZjQm9vbAorRmNDb25maWdBZGRDb25maWdGaWxlIChGY0NvbmZpZwkgICAgKmNvbmZpZywKKwkJICAgICAgIGNvbnN0IGNoYXIgICAqZik7CisKK0ZjQm9vbAorRmNDb25maWdTZXRDYWNoZSAoRmNDb25maWcJKmNvbmZpZywKKwkJICBjb25zdCBjaGFyCSpjKTsKKworRmNCb29sCitGY0NvbmZpZ0FkZEJsYW5rIChGY0NvbmZpZwkqY29uZmlnLAorCQkgIEZjQ2hhcjMyICAgIAlibGFuayk7CisKK0ZjQm9vbAorRmNDb25maWdBZGRFZGl0IChGY0NvbmZpZwkqY29uZmlnLAorCQkgRmNUZXN0CQkqdGVzdCwKKwkJIEZjRWRpdAkJKmVkaXQsCisJCSBGY01hdGNoS2luZAlraW5kKTsKKwordm9pZAorRmNDb25maWdTZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKKwkJICBGY0ZvbnRTZXQJKmZvbnRzLAorCQkgIEZjU2V0TmFtZQlzZXQpOworCitGY0Jvb2wKK0ZjQ29uZmlnQ29tcGFyZVZhbHVlIChjb25zdCBGY1ZhbHVlIG0sCisJCSAgICAgIEZjT3AJICAgIG9wLAorCQkgICAgICBjb25zdCBGY1ZhbHVlIHYpOworCisvKiBmY2NoYXJzZXQuYyAqLworRmNCb29sCitGY05hbWVVbnBhcnNlQ2hhclNldCAoRmNOYW1lQnVmICpidWYsIGNvbnN0IEZjQ2hhclNldCAqYyk7CisKK0ZjQ2hhclNldCAqCitGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZyk7CisKKy8qIGZjZGJnLmMgKi8KK3ZvaWQKK0ZjVmFsdWVQcmludCAoRmNWYWx1ZSB2KTsKKwordm9pZAorRmNWYWx1ZUxpc3RQcmludCAoRmNWYWx1ZUxpc3QgKmwpOworCit2b2lkCitGY1BhdHRlcm5QcmludCAoRmNQYXR0ZXJuICpwKTsKKwordm9pZAorRmNPcFByaW50IChGY09wIG9wKTsKKwordm9pZAorRmNUZXN0UHJpbnQgKEZjVGVzdCAqdGVzdCk7CisKK3ZvaWQKK0ZjRXhwclByaW50IChGY0V4cHIgKmV4cHIpOworCit2b2lkCitGY0VkaXRQcmludCAoRmNFZGl0ICplZGl0KTsKKwordm9pZAorRmNTdWJzdFByaW50IChGY1N1YnN0ICpzdWJzdCk7CisKK3ZvaWQKK0ZjRm9udFNldFByaW50IChGY0ZvbnRTZXQgKnMpOworCitpbnQKK0ZjRGVidWcgKHZvaWQpOworCisvKiBmY2Rpci5jICovCitGY0Jvb2wKK0ZjRmlsZVNjYW4gKEZjRm9udFNldAkqc2V0LAorCSAgICBGY0ZpbGVDYWNoZQkqY2FjaGUsCisJICAgIEZjQmxhbmtzCSpibGFua3MsCisJICAgIGNvbnN0IGNoYXIJKmZpbGUsCisJICAgIEZjQm9vbAlmb3JjZSk7CisKK0ZjQm9vbAorRmNEaXJTY2FuIChGY0ZvbnRTZXQJKnNldCwKKwkgICBGY0ZpbGVDYWNoZQkqY2FjaGUsCisJICAgRmNCbGFua3MJKmJsYW5rcywKKwkgICBjb25zdCBjaGFyCSpkaXIsCisJICAgRmNCb29sCWZvcmNlKTsKKworRmNCb29sCitGY0RpclNhdmUgKEZjRm9udFNldCAqc2V0LCBjb25zdCBjaGFyICpkaXIpOworCisvKiBmY2ZvbnQuYyAqLworaW50CitGY0ZvbnREZWJ1ZyAodm9pZCk7CisgICAgCisvKiBmY2ZzLmMgKi8KKy8qIGZjZ3JhbS55ICovCitpbnQKK0ZjQ29uZmlncGFyc2UgKHZvaWQpOworCitpbnQKK0ZjQ29uZmlnd3JhcCAodm9pZCk7CisgICAgCit2b2lkCitGY0NvbmZpZ2Vycm9yIChjaGFyICpmbXQsIC4uLik7CisgICAgCitjaGFyICoKK0ZjQ29uZmlnU2F2ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCk7CisKK0ZjVGVzdCAqCitGY1Rlc3RDcmVhdGUgKEZjUXVhbCBxdWFsLCBjb25zdCBjaGFyICpmaWVsZCwgRmNPcCBjb21wYXJlLCBGY0V4cHIgKmV4cHIpOworCit2b2lkCitGY1Rlc3REZXN0cm95IChGY1Rlc3QgKnRlc3QpOworCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlSW50ZWdlciAoaW50IGkpOworCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlRG91YmxlIChkb3VibGUgZCk7CisKK0ZjRXhwciAqCitGY0V4cHJDcmVhdGVTdHJpbmcgKGNvbnN0IGNoYXIgKnMpOworCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlTWF0cml4IChjb25zdCBGY01hdHJpeCAqbSk7CisKK0ZjRXhwciAqCitGY0V4cHJDcmVhdGVCb29sIChGY0Jvb2wgYik7CisKK0ZjRXhwciAqCitGY0V4cHJDcmVhdGVOaWwgKHZvaWQpOworCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKTsKKworRmNFeHByICoKK0ZjRXhwckNyZWF0ZUNvbnN0IChjb25zdCBjaGFyICpjb25zdGFudCk7CisKK0ZjRXhwciAqCitGY0V4cHJDcmVhdGVPcCAoRmNFeHByICpsZWZ0LCBGY09wIG9wLCBGY0V4cHIgKnJpZ2h0KTsKKwordm9pZAorRmNFeHByRGVzdHJveSAoRmNFeHByICplKTsKKworRmNFZGl0ICoKK0ZjRWRpdENyZWF0ZSAoY29uc3QgY2hhciAqZmllbGQsIEZjT3Agb3AsIEZjRXhwciAqZXhwcik7CisKK3ZvaWQKK0ZjRWRpdERlc3Ryb3kgKEZjRWRpdCAqZSk7CisKKy8qIGZjaW5pdC5jICovCisKK3ZvaWQKK0ZjTWVtUmVwb3J0ICh2b2lkKTsKKwordm9pZAorRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKTsKKwordm9pZAorRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpOworCisvKiBmY2xpc3QuYyAqLworCisvKiBmY21hdGNoLmMgKi8KKworLyogZmNuYW1lLmMgKi8KK0ZjQm9vbAorRmNOYW1lQ29uc3RhbnQgKGNoYXIgKnN0cmluZywgaW50ICpyZXN1bHQpOworCitGY0Jvb2wKK0ZjTmFtZUJvb2wgKGNoYXIgKnYsIEZjQm9vbCAqcmVzdWx0KTsKKworRmNCb29sCitGY05hbWVCdWZDaGFyIChGY05hbWVCdWYgKmJ1ZiwgRmNDaGFyOCBjKTsKKworRmNCb29sCitGY05hbWVCdWZTdHJpbmcgKEZjTmFtZUJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKTsKKworLyogZmNwYXQuYyAqLwordm9pZAorRmNWYWx1ZUxpc3REZXN0cm95IChGY1ZhbHVlTGlzdCAqbCk7CisgICAgCitGY1BhdHRlcm5FbHQgKgorRmNQYXR0ZXJuRmluZCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBpbnNlcnQpOworCisvKiBmY3JlbmRlci5jICovCisKKy8qIGZjbWF0cml4LmMgKi8KK3ZvaWQKK0ZjTWF0cml4RnJlZSAoRmNNYXRyaXggKm1hdCk7CisKKy8qIGZjc3RyLmMgKi8KK2NoYXIgKgorRmNTdHJQbHVzIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworICAgIAordm9pZAorRmNTdHJGcmVlIChjaGFyICpzKTsKKworI2VuZGlmIC8qIF9GQ19JTlRfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9mY2xpc3QuYyBiL3NyYy9mY2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JmZWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjbGlzdC5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogJFhGcmVlODY6ICQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZmNpbnQuaCIKKworRmNPYmplY3RTZXQgKgorRmNPYmplY3RTZXRDcmVhdGUgKHZvaWQpCit7CisgICAgRmNPYmplY3RTZXQgICAgKm9zOworCisgICAgb3MgPSAoRmNPYmplY3RTZXQgKikgbWFsbG9jIChzaXplb2YgKEZjT2JqZWN0U2V0KSk7CisgICAgaWYgKCFvcykKKwlyZXR1cm4gMDsKKyAgICBGY01lbUFsbG9jIChGQ19NRU1fT0JKRUNUU0VULCBzaXplb2YgKEZjT2JqZWN0U2V0KSk7CisgICAgb3MtPm5vYmplY3QgPSAwOworICAgIG9zLT5zb2JqZWN0ID0gMDsKKyAgICBvcy0+b2JqZWN0cyA9IDA7CisgICAgcmV0dXJuIG9zOworfQorCitGY0Jvb2wKK0ZjT2JqZWN0U2V0QWRkIChGY09iamVjdFNldCAqb3MsIGNvbnN0IGNoYXIgKm9iamVjdCkKK3sKKyAgICBpbnQJCXM7CisgICAgY29uc3QgY2hhcgkqKm9iamVjdHM7CisgICAgCisgICAgaWYgKG9zLT5ub2JqZWN0ID09IG9zLT5zb2JqZWN0KQorICAgIHsKKwlzID0gb3MtPnNvYmplY3QgKyA0OworCWlmIChvcy0+b2JqZWN0cykKKwkgICAgb2JqZWN0cyA9IChjb25zdCBjaGFyICoqKSByZWFsbG9jICgodm9pZCAqKSBvcy0+b2JqZWN0cywKKwkJCQkJICAgICAgIHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworCWVsc2UKKwkgICAgb2JqZWN0cyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworCWlmICghb2JqZWN0cykKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisJaWYgKG9zLT5zb2JqZWN0KQorCSAgICBGY01lbUZyZWUgKEZDX01FTV9PQkpFQ1RQVFIsIG9zLT5zb2JqZWN0ICogc2l6ZW9mIChjb25zdCBjaGFyICopKTsKKwlGY01lbUFsbG9jIChGQ19NRU1fT0JKRUNUUFRSLCBzICogc2l6ZW9mIChjb25zdCBjaGFyICopKTsKKwlvcy0+b2JqZWN0cyA9IG9iamVjdHM7CisJb3MtPnNvYmplY3QgPSBzOworICAgIH0KKyAgICBvcy0+b2JqZWN0c1tvcy0+bm9iamVjdCsrXSA9IG9iamVjdDsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCit2b2lkCitGY09iamVjdFNldERlc3Ryb3kgKEZjT2JqZWN0U2V0ICpvcykKK3sKKyAgICBpZiAob3MtPm9iamVjdHMpCisgICAgeworCUZjTWVtRnJlZSAoRkNfTUVNX09CSkVDVFBUUiwgb3MtPnNvYmplY3QgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworCWZyZWUgKCh2b2lkICopIG9zLT5vYmplY3RzKTsKKyAgICB9CisgICAgRmNNZW1GcmVlIChGQ19NRU1fT0JKRUNUU0VULCBzaXplb2YgKEZjT2JqZWN0U2V0KSk7CisgICAgZnJlZSAob3MpOworfQorCitGY09iamVjdFNldCAqCitGY09iamVjdFNldFZhQnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCB2YV9saXN0IHZhKQoreworICAgIEZjT2JqZWN0U2V0ICAgICpyZXQ7CisKKyAgICBGY09iamVjdFNldFZhcEJ1aWxkIChyZXQsIGZpcnN0LCB2YSk7CisgICAgcmV0dXJuIHJldDsKK30KKworRmNPYmplY3RTZXQgKgorRmNPYmplY3RTZXRCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIC4uLikKK3sKKyAgICB2YV9saXN0CSAgICB2YTsKKyAgICBGY09iamVjdFNldCAgICAqb3M7CisKKyAgICB2YV9zdGFydCAodmEsIGZpcnN0KTsKKyAgICBGY09iamVjdFNldFZhcEJ1aWxkIChvcywgZmlyc3QsIHZhKTsKKyAgICB2YV9lbmQgKHZhKTsKKyAgICByZXR1cm4gb3M7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjTGlzdFZhbHVlTGlzdE1hdGNoQW55IChGY1ZhbHVlTGlzdCAqdjFvcmlnLAorCQkJIEZjVmFsdWVMaXN0ICp2Mm9yaWcpCit7CisgICAgRmNWYWx1ZUxpc3QJICAgICp2MSwgKnYyOworCisgICAgZm9yICh2MSA9IHYxb3JpZzsgdjE7IHYxID0gdjEtPm5leHQpCisJZm9yICh2MiA9IHYyb3JpZzsgdjI7IHYyID0gdjItPm5leHQpCisJICAgIGlmIChGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAodjItPnZhbHVlLCBGY09wQ29udGFpbnMsIHYxLT52YWx1ZSkpCisJCXJldHVybiBGY1RydWU7CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjTGlzdFZhbHVlTGlzdEVxdWFsIChGY1ZhbHVlTGlzdCAgICp2MW9yaWcsCisJCSAgICAgIEZjVmFsdWVMaXN0ICAgKnYyb3JpZykKK3sKKyAgICBGY1ZhbHVlTGlzdAkgICAgKnYxLCAqdjI7CisKKyAgICBmb3IgKHYxID0gdjFvcmlnOyB2MTsgdjEgPSB2MS0+bmV4dCkKKyAgICB7CisJZm9yICh2MiA9IHYyb3JpZzsgdjI7IHYyID0gdjItPm5leHQpCisJICAgIGlmIChGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAodjEtPnZhbHVlLCBGY09wRXF1YWwsIHYyLT52YWx1ZSkpCisJCWJyZWFrOworCWlmICghdjIpCisJICAgIHJldHVybiBGY0ZhbHNlOworICAgIH0KKyAgICBmb3IgKHYyID0gdjJvcmlnOyB2MjsgdjIgPSB2Mi0+bmV4dCkKKyAgICB7CisJZm9yICh2MSA9IHYxb3JpZzsgdjE7IHYxID0gdjEtPm5leHQpCisJICAgIGlmIChGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAodjEtPnZhbHVlLCBGY09wRXF1YWwsIHYyLT52YWx1ZSkpCisJCWJyZWFrOworCWlmICghdjEpCisJICAgIHJldHVybiBGY0ZhbHNlOworICAgIH0KKyAgICByZXR1cm4gRmNUcnVlOworfQorCisvKgorICogRmNUcnVlIGlmZiBhbGwgb2JqZWN0cyBpbiAicCIgbWF0Y2ggImZvbnQiCisgKi8KKworc3RhdGljIEZjQm9vbAorRmNMaXN0UGF0dGVybk1hdGNoQW55IChGY1BhdHRlcm4gKnAsCisJCSAgICAgICBGY1BhdHRlcm4gKmZvbnQpCit7CisgICAgaW50CQkgICAgaTsKKyAgICBGY1BhdHRlcm5FbHQgICAqZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwLT5udW07IGkrKykKKyAgICB7CisJZSA9IEZjUGF0dGVybkZpbmQgKGZvbnQsIHAtPmVsdHNbaV0ub2JqZWN0LCBGY0ZhbHNlKTsKKwlpZiAoIWUpCisJICAgIHJldHVybiBGY0ZhbHNlOworCWlmICghRmNMaXN0VmFsdWVMaXN0TWF0Y2hBbnkgKHAtPmVsdHNbaV0udmFsdWVzLCBlLT52YWx1ZXMpKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworc3RhdGljIEZjQm9vbAorRmNMaXN0UGF0dGVybkVxdWFsIChGY1BhdHRlcm4JKnAxLAorCQkgICAgRmNQYXR0ZXJuCSpwMiwKKwkJICAgIEZjT2JqZWN0U2V0CSpvcykKK3sKKyAgICBpbnQJCSAgICBpOworICAgIEZjUGF0dGVybkVsdCAgICAqZTEsICplMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvcy0+bm9iamVjdDsgaSsrKQorICAgIHsKKwllMSA9IEZjUGF0dGVybkZpbmQgKHAxLCBvcy0+b2JqZWN0c1tpXSwgRmNGYWxzZSk7CisJZTIgPSBGY1BhdHRlcm5GaW5kIChwMiwgb3MtPm9iamVjdHNbaV0sIEZjRmFsc2UpOworCWlmICghZTEgJiYgIWUyKQorCSAgICByZXR1cm4gRmNUcnVlOworCWlmICghZTEgfHwgIWUyKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlpZiAoIUZjTGlzdFZhbHVlTGlzdEVxdWFsIChlMS0+dmFsdWVzLCBlMi0+dmFsdWVzKSkKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisgICAgfQorICAgIHJldHVybiBGY1RydWU7Cit9CisKK3N0YXRpYyBGY0NoYXIzMgorRmNMaXN0U3RyaW5nSGFzaCAoY29uc3QgRmNDaGFyOAkqcykKK3sKKyAgICBGY0NoYXIzMgloID0gMDsKKyAgICBGY0NoYXI4CWM7CisKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICB7CisJYyA9IEZjVG9Mb3dlciAoYyk7CisJaCA9ICgoaCA8PCAzKSBeIChoID4+IDMpKSBeIGM7CisgICAgfQorICAgIHJldHVybiBoOworfQorCitzdGF0aWMgRmNDaGFyMzIKK0ZjTGlzdE1hdHJpeEhhc2ggKGNvbnN0IEZjTWF0cml4ICptKQoreworICAgIGludAkgICAgeHggPSAoaW50KSAobS0+eHggKiAxMDApLCAKKwkgICAgeHkgPSAoaW50KSAobS0+eHkgKiAxMDApLCAKKwkgICAgeXggPSAoaW50KSAobS0+eXggKiAxMDApLAorCSAgICB5eSA9IChpbnQpIChtLT55eSAqIDEwMCk7CisKKyAgICByZXR1cm4gKChGY0NoYXIzMikgeHgpIF4gKChGY0NoYXIzMikgeHkpIF4gKChGY0NoYXIzMikgeXgpIF4gKChGY0NoYXIzMikgeXkpOworfQorCitzdGF0aWMgRmNDaGFyMzIKK0ZjTGlzdFZhbHVlSGFzaCAoRmNWYWx1ZSAgICB2KQoreworICAgIHN3aXRjaCAodi50eXBlKSB7CisgICAgY2FzZSBGY1R5cGVWb2lkOgorCXJldHVybiAwOworICAgIGNhc2UgRmNUeXBlSW50ZWdlcjoKKwlyZXR1cm4gKEZjQ2hhcjMyKSB2LnUuaTsKKyAgICBjYXNlIEZjVHlwZURvdWJsZToKKwlyZXR1cm4gKEZjQ2hhcjMyKSAoaW50KSB2LnUuZDsKKyAgICBjYXNlIEZjVHlwZVN0cmluZzoKKwlyZXR1cm4gRmNMaXN0U3RyaW5nSGFzaCAodi51LnMpOworICAgIGNhc2UgRmNUeXBlQm9vbDoKKwlyZXR1cm4gKEZjQ2hhcjMyKSB2LnUuYjsKKyAgICBjYXNlIEZjVHlwZU1hdHJpeDoKKwlyZXR1cm4gRmNMaXN0TWF0cml4SGFzaCAodi51Lm0pOworICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKKwlyZXR1cm4gRmNDaGFyU2V0Q291bnQgKHYudS5jKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBGY0NoYXIzMgorRmNMaXN0VmFsdWVMaXN0SGFzaCAoRmNWYWx1ZUxpc3QgICAgKmxpc3QpCit7CisgICAgRmNDaGFyMzIJaCA9IDA7CisgICAgCisgICAgd2hpbGUgKGxpc3QpCisgICAgeworCWggPSBoIF4gRmNMaXN0VmFsdWVIYXNoIChsaXN0LT52YWx1ZSk7CisJbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBoOworfQorCitzdGF0aWMgRmNDaGFyMzIKK0ZjTGlzdFBhdHRlcm5IYXNoIChGY1BhdHRlcm4JKmZvbnQsCisJCSAgIEZjT2JqZWN0U2V0CSpvcykKK3sKKyAgICBpbnQJCSAgICBuOworICAgIEZjUGF0dGVybkVsdCAgICAqZTsKKyAgICBGY0NoYXIzMgkgICAgaCA9IDA7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3MtPm5vYmplY3Q7IG4rKykKKyAgICB7CisJZSA9IEZjUGF0dGVybkZpbmQgKGZvbnQsIG9zLT5vYmplY3RzW25dLCBGY0ZhbHNlKTsKKwlpZiAoZSkKKwkgICAgaCA9IGggXiBGY0xpc3RWYWx1ZUxpc3RIYXNoIChlLT52YWx1ZXMpOworICAgIH0KKyAgICByZXR1cm4gaDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX0ZjTGlzdEJ1Y2tldCB7CisgICAgc3RydWN0IF9GY0xpc3RCdWNrZXQgICAgKm5leHQ7CisgICAgRmNDaGFyMzIJCSAgICBoYXNoOworICAgIEZjUGF0dGVybgkJICAgICpwYXR0ZXJuOworfSBGY0xpc3RCdWNrZXQ7CisKKyNkZWZpbmUgRkNfTElTVF9IQVNIX1NJWkUgICA0MDk5CisKK3R5cGVkZWYgc3RydWN0IF9GY0xpc3RIYXNoVGFibGUgeworICAgIGludAkJICAgIGVudHJpZXM7CisgICAgRmNMaXN0QnVja2V0ICAgICpidWNrZXRzW0ZDX0xJU1RfSEFTSF9TSVpFXTsKK30gRmNMaXN0SGFzaFRhYmxlOworICAgIAorc3RhdGljIHZvaWQKK0ZjTGlzdEhhc2hUYWJsZUluaXQgKEZjTGlzdEhhc2hUYWJsZSAqdGFibGUpCit7CisgICAgdGFibGUtPmVudHJpZXMgPSAwOworICAgIG1lbXNldCAodGFibGUtPmJ1Y2tldHMsICdcMCcsIHNpemVvZiAodGFibGUtPmJ1Y2tldHMpKTsKK30KKworc3RhdGljIHZvaWQKK0ZjTGlzdEhhc2hUYWJsZUNsZWFudXAgKEZjTGlzdEhhc2hUYWJsZSAqdGFibGUpCit7CisgICAgaW50CWk7CisgICAgRmNMaXN0QnVja2V0ICAgICpidWNrZXQsICpuZXh0OworCisgICAgZm9yIChpID0gMDsgaSA8IEZDX0xJU1RfSEFTSF9TSVpFOyBpKyspCisgICAgeworCWZvciAoYnVja2V0ID0gdGFibGUtPmJ1Y2tldHNbaV07IGJ1Y2tldDsgYnVja2V0ID0gbmV4dCkKKwl7CisJICAgIG5leHQgPSBidWNrZXQtPm5leHQ7CisJICAgIEZjUGF0dGVybkRlc3Ryb3kgKGJ1Y2tldC0+cGF0dGVybik7CisJICAgIEZjTWVtRnJlZSAoRkNfTUVNX0xJU1RCVUNLLCBzaXplb2YgKEZjTGlzdEJ1Y2tldCkpOworCSAgICBmcmVlIChidWNrZXQpOworCX0KKwl0YWJsZS0+YnVja2V0c1tpXSA9IDA7CisgICAgfQorICAgIHRhYmxlLT5lbnRyaWVzID0gMDsKK30KKworc3RhdGljIEZjQm9vbAorRmNMaXN0QXBwZW5kIChGY0xpc3RIYXNoVGFibGUJKnRhYmxlLAorCSAgICAgIEZjUGF0dGVybgkJKmZvbnQsCisJICAgICAgRmNPYmplY3RTZXQJKm9zKQoreworICAgIGludAkJICAgIG87CisgICAgRmNQYXR0ZXJuRWx0ICAgICplOworICAgIEZjVmFsdWVMaXN0CSAgICAqdjsKKyAgICBGY0NoYXIzMgkgICAgaGFzaDsKKyAgICBGY0xpc3RCdWNrZXQgICAgKipwcmV2LCAqYnVja2V0OworCisgICAgaGFzaCA9IEZjTGlzdFBhdHRlcm5IYXNoIChmb250LCBvcyk7CisgICAgZm9yIChwcmV2ID0gJnRhYmxlLT5idWNrZXRzW2hhc2ggJSBGQ19MSVNUX0hBU0hfU0laRV07CisJIChidWNrZXQgPSAqcHJldik7IHByZXYgPSAmKGJ1Y2tldC0+bmV4dCkpCisgICAgeworCWlmIChidWNrZXQtPmhhc2ggPT0gaGFzaCAmJiAKKwkgICAgRmNMaXN0UGF0dGVybkVxdWFsIChidWNrZXQtPnBhdHRlcm4sIGZvbnQsIG9zKSkKKwkgICAgcmV0dXJuIEZjVHJ1ZTsKKyAgICB9CisgICAgYnVja2V0ID0gKEZjTGlzdEJ1Y2tldCAqKSBtYWxsb2MgKHNpemVvZiAoRmNMaXN0QnVja2V0KSk7CisgICAgaWYgKCFidWNrZXQpCisJZ290byBiYWlsMDsKKyAgICBGY01lbUFsbG9jIChGQ19NRU1fTElTVEJVQ0ssIHNpemVvZiAoRmNMaXN0QnVja2V0KSk7CisgICAgYnVja2V0LT5uZXh0ID0gMDsKKyAgICBidWNrZXQtPmhhc2ggPSBoYXNoOworICAgIGJ1Y2tldC0+cGF0dGVybiA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKKyAgICBpZiAoIWJ1Y2tldC0+cGF0dGVybikKKwlnb3RvIGJhaWwxOworICAgIAorICAgIGZvciAobyA9IDA7IG8gPCBvcy0+bm9iamVjdDsgbysrKQorICAgIHsKKwllID0gRmNQYXR0ZXJuRmluZCAoZm9udCwgb3MtPm9iamVjdHNbb10sIEZjRmFsc2UpOworCWlmIChlKQorCXsKKwkgICAgZm9yICh2ID0gZS0+dmFsdWVzOyB2OyB2ID0gdi0+bmV4dCkKKwkgICAgeworCQlpZiAoIUZjUGF0dGVybkFkZCAoYnVja2V0LT5wYXR0ZXJuLCAKKwkJCQkgICBvcy0+b2JqZWN0c1tvXSwgCisJCQkJICAgdi0+dmFsdWUsIEZjVHJ1ZSkpCisJCSAgICBnb3RvIGJhaWwyOworCSAgICB9CisJfQorICAgIH0KKyAgICAqcHJldiA9IGJ1Y2tldDsKKyAgICArK3RhYmxlLT5lbnRyaWVzOworCisgICAgcmV0dXJuIEZjVHJ1ZTsKKyAgICAKK2JhaWwyOgorICAgIEZjUGF0dGVybkRlc3Ryb3kgKGJ1Y2tldC0+cGF0dGVybik7CitiYWlsMToKKyAgICBGY01lbUZyZWUgKEZDX01FTV9MSVNUQlVDSywgc2l6ZW9mIChGY0xpc3RCdWNrZXQpKTsKKyAgICBmcmVlIChidWNrZXQpOworYmFpbDA6CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CisKK0ZjRm9udFNldCAqCitGY0ZvbnRMaXN0IChGY0NvbmZpZwkqY29uZmlnLAorCSAgICBGY1BhdHRlcm4JKnAsCisJICAgIEZjT2JqZWN0U2V0ICpvcykKK3sKKyAgICBGY0ZvbnRTZXQJICAgICpyZXQ7CisgICAgRmNGb250U2V0CSAgICAqczsKKyAgICBpbnQJCSAgICBmOworICAgIEZjU2V0TmFtZQkgICAgc2V0OworICAgIEZjTGlzdEhhc2hUYWJsZSB0YWJsZTsKKyAgICBpbnQJCSAgICBpOworICAgIEZjTGlzdEJ1Y2tldCAgICAqYnVja2V0OworCisgICAgaWYgKCFjb25maWcpCisgICAgeworCWNvbmZpZyA9IEZjQ29uZmlnR2V0Q3VycmVudCAoKTsKKwlpZiAoIWNvbmZpZykKKwkgICAgZ290byBiYWlsMDsKKyAgICB9CisgICAgRmNMaXN0SGFzaFRhYmxlSW5pdCAoJnRhYmxlKTsKKyAgICAvKgorICAgICAqIFdhbGsgYWxsIGF2YWlsYWJsZSBmb250cyBhZGRpbmcgdGhvc2UgdGhhdAorICAgICAqIG1hdGNoIHRvIHRoZSBoYXNoIHRhYmxlCisgICAgICovCisgICAgZm9yIChzZXQgPSBGY1NldFN5c3RlbTsgc2V0IDw9IEZjU2V0QXBwbGljYXRpb247IHNldCsrKQorICAgIHsKKwlzID0gY29uZmlnLT5mb250c1tzZXRdOworCWlmICghcykKKwkgICAgY29udGludWU7CisJZm9yIChmID0gMDsgZiA8IHMtPm5mb250OyBmKyspCisJICAgIGlmIChGY0xpc3RQYXR0ZXJuTWF0Y2hBbnkgKHAsIHMtPmZvbnRzW2ZdKSkKKwkJaWYgKCFGY0xpc3RBcHBlbmQgKCZ0YWJsZSwgcy0+Zm9udHNbZl0sIG9zKSkKKwkJICAgIGdvdG8gYmFpbDE7CisgICAgfQorI2lmIDAKKyAgICB7CisJaW50CW1heCA9IDA7CisJaW50CWZ1bGwgPSAwOworCWludAllbnRzID0gMDsKKwlpbnQJbGVuOworCWZvciAoaSA9IDA7IGkgPCBGQ19MSVNUX0hBU0hfU0laRTsgaSsrKQorCXsKKwkgICAgaWYgKChidWNrZXQgPSB0YWJsZS5idWNrZXRzW2ldKSkKKwkgICAgeworCQlsZW4gPSAwOworCQlmb3IgKDsgYnVja2V0OyBidWNrZXQgPSBidWNrZXQtPm5leHQpCisJCXsKKwkJICAgIGVudHMrKzsKKwkJICAgIGxlbisrOworCQl9CisJCWlmIChsZW4gPiBtYXgpCisJCSAgICBtYXggPSBsZW47CisJCWZ1bGwrKzsKKwkgICAgfQorCX0KKwlwcmludGYgKCJ1c2VkOiAlZCBtYXg6ICVkIGF2ZzogJWdcbiIsIGZ1bGwsIG1heCwgCisJCShkb3VibGUpIGVudHMgLyBGQ19MSVNUX0hBU0hfU0laRSk7CisgICAgfQorI2VuZGlmCisgICAgLyoKKyAgICAgKiBXYWxrIHRoZSBoYXNoIHRhYmxlIGFuZCBidWlsZAorICAgICAqIGEgZm9udCBzZXQKKyAgICAgKi8KKyAgICByZXQgPSBGY0ZvbnRTZXRDcmVhdGUgKCk7CisgICAgaWYgKCFyZXQpCisJZ290byBiYWlsMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkNfTElTVF9IQVNIX1NJWkU7IGkrKykKKwl3aGlsZSAoKGJ1Y2tldCA9IHRhYmxlLmJ1Y2tldHNbaV0pKQorCXsKKwkgICAgaWYgKCFGY0ZvbnRTZXRBZGQgKHJldCwgYnVja2V0LT5wYXR0ZXJuKSkKKwkJZ290byBiYWlsMjsKKwkgICAgdGFibGUuYnVja2V0c1tpXSA9IGJ1Y2tldC0+bmV4dDsKKwkgICAgRmNNZW1GcmVlIChGQ19NRU1fTElTVEJVQ0ssIHNpemVvZiAoRmNMaXN0QnVja2V0KSk7CisJICAgIGZyZWUgKGJ1Y2tldCk7CisJfQorICAgIAorICAgIHJldHVybiByZXQ7CisKK2JhaWwyOgorICAgIEZjRm9udFNldERlc3Ryb3kgKHJldCk7CitiYWlsMToKKyAgICBGY0xpc3RIYXNoVGFibGVDbGVhbnVwICgmdGFibGUpOworYmFpbDA6CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvZmNtYXRjaC5jIGIvc3JjL2ZjbWF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlmNjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjbWF0Y2guYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZmNpbnQuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZG91YmxlCitGY0NvbXBhcmVJbnRlZ2VyIChjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUxLCBGY1ZhbHVlIHZhbHVlMikKK3sKKyAgICBpbnQJdjsKKyAgICAKKyAgICBpZiAodmFsdWUyLnR5cGUgIT0gRmNUeXBlSW50ZWdlciB8fCB2YWx1ZTEudHlwZSAhPSBGY1R5cGVJbnRlZ2VyKQorCXJldHVybiAtMS4wOworICAgIHYgPSB2YWx1ZTIudS5pIC0gdmFsdWUxLnUuaTsKKyAgICBpZiAodiA8IDApCisJdiA9IC12OworICAgIHJldHVybiAoZG91YmxlKSB2OworfQorCitzdGF0aWMgZG91YmxlCitGY0NvbXBhcmVTdHJpbmcgKGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZTEsIEZjVmFsdWUgdmFsdWUyKQoreworICAgIGlmICh2YWx1ZTIudHlwZSAhPSBGY1R5cGVTdHJpbmcgfHwgdmFsdWUxLnR5cGUgIT0gRmNUeXBlU3RyaW5nKQorCXJldHVybiAtMS4wOworICAgIHJldHVybiAoZG91YmxlKSBGY1N0ckNtcElnbm9yZUNhc2UgKHZhbHVlMS51LnMsIHZhbHVlMi51LnMpICE9IDA7Cit9CisKK3N0YXRpYyBkb3VibGUKK0ZjQ29tcGFyZUJvb2wgKGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZTEsIEZjVmFsdWUgdmFsdWUyKQoreworICAgIGlmICh2YWx1ZTIudHlwZSAhPSBGY1R5cGVCb29sIHx8IHZhbHVlMS50eXBlICE9IEZjVHlwZUJvb2wpCisJcmV0dXJuIC0xLjA7CisgICAgcmV0dXJuIChkb3VibGUpIHZhbHVlMi51LmIgIT0gdmFsdWUxLnUuYjsKK30KKworc3RhdGljIGRvdWJsZQorRmNDb21wYXJlQ2hhclNldCAoY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlMSwgRmNWYWx1ZSB2YWx1ZTIpCit7CisgICAgaWYgKHZhbHVlMi50eXBlICE9IEZjVHlwZUNoYXJTZXQgfHwgdmFsdWUxLnR5cGUgIT0gRmNUeXBlQ2hhclNldCkKKwlyZXR1cm4gLTEuMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgRmNDaGFyU2V0U3VidHJhY3RDb3VudCAodmFsdWUxLnUuYywgdmFsdWUyLnUuYyk7Cit9CisKK3N0YXRpYyBkb3VibGUKK0ZjQ29tcGFyZVNpemUgKGNoYXIgKm9iamVjdCwgRmNWYWx1ZSB2YWx1ZTEsIEZjVmFsdWUgdmFsdWUyKQoreworICAgIGRvdWJsZSAgdjEsIHYyLCB2OworCisgICAgc3dpdGNoICh2YWx1ZTEudHlwZSkgeworICAgIGNhc2UgRmNUeXBlSW50ZWdlcjoKKwl2MSA9IHZhbHVlMS51Lmk7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVEb3VibGU6CisJdjEgPSB2YWx1ZTEudS5kOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBzd2l0Y2ggKHZhbHVlMi50eXBlKSB7CisgICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgorCXYyID0gdmFsdWUyLnUuaTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZURvdWJsZToKKwl2MiA9IHZhbHVlMi51LmQ7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh2MiA9PSAwKQorCXJldHVybiAwOworICAgIHYgPSB2MiAtIHYxOworICAgIGlmICh2IDwgMCkKKwl2ID0gLXY7CisgICAgcmV0dXJuIHY7Cit9CisKKy8qCisgKiBPcmRlciBpcyBzaWduaWZpY2FudCwgaXQgZGVmaW5lcyB0aGUgcHJlY2VkZW5jZSBvZgorICogZWFjaCB2YWx1ZSwgZWFybGllciB2YWx1ZXMgYXJlIG1vcmUgc2lnbmlmaWNhbnQgdGhhbgorICogbGF0ZXIgdmFsdWVzCisgKi8KK3N0YXRpYyBGY01hdGNoZXIgX0ZjTWF0Y2hlcnMgW10gPSB7CisgICAgeyBGQ19GT1VORFJZLAlGY0NvbXBhcmVTdHJpbmcsIH0sCisgICAgeyBGQ19DSEFSU0VULAlGY0NvbXBhcmVDaGFyU2V0IH0sCisgICAgeyBGQ19BTlRJQUxJQVMsCUZjQ29tcGFyZUJvb2wsIH0sCisgICAgeyBGQ19MQU5HLAkJRmNDb21wYXJlU3RyaW5nIH0sCisgICAgeyBGQ19GQU1JTFksCUZjQ29tcGFyZVN0cmluZywgfSwKKyAgICB7IEZDX1NQQUNJTkcsCUZjQ29tcGFyZUludGVnZXIsIH0sCisgICAgeyBGQ19QSVhFTF9TSVpFLAlGY0NvbXBhcmVTaXplLCB9LAorICAgIHsgRkNfU1RZTEUsCQlGY0NvbXBhcmVTdHJpbmcsIH0sCisgICAgeyBGQ19TTEFOVCwJCUZjQ29tcGFyZUludGVnZXIsIH0sCisgICAgeyBGQ19XRUlHSFQsCUZjQ29tcGFyZUludGVnZXIsIH0sCisgICAgeyBGQ19SQVNURVJJWkVSLAlGY0NvbXBhcmVTdHJpbmcsIH0sCisgICAgeyBGQ19PVVRMSU5FLAlGY0NvbXBhcmVCb29sLCB9LAorfTsKKworI2RlZmluZSBOVU1fTUFUQ0hFUiAoc2l6ZW9mIF9GY01hdGNoZXJzIC8gc2l6ZW9mIF9GY01hdGNoZXJzWzBdKQorCitzdGF0aWMgRmNCb29sCitGY0NvbXBhcmVWYWx1ZUxpc3QgKGNvbnN0IGNoYXIgICpvYmplY3QsCisJCSAgICBGY1ZhbHVlTGlzdAkqdjFvcmlnLAkvKiBwYXR0ZXJuICovCisJCSAgICBGY1ZhbHVlTGlzdCAqdjJvcmlnLAkvKiB0YXJnZXQgKi8KKwkJICAgIEZjVmFsdWUJKmJlc3RWYWx1ZSwKKwkJICAgIGRvdWJsZQkqdmFsdWUsCisJCSAgICBGY1Jlc3VsdAkqcmVzdWx0KQoreworICAgIEZjVmFsdWVMaXN0ICAgICp2MSwgKnYyOworICAgIGRvdWJsZSAgICAJICAgIHYsIGJlc3Q7CisgICAgaW50CQkgICAgajsKKyAgICBpbnQJCSAgICBpOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUFUQ0hFUjsgaSsrKQorICAgIHsKKwlpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAoX0ZjTWF0Y2hlcnNbaV0ub2JqZWN0LCBvYmplY3QpKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gTlVNX01BVENIRVIpCisgICAgeworCWlmIChiZXN0VmFsdWUpCisJICAgICpiZXN0VmFsdWUgPSB2Mm9yaWctPnZhbHVlOworCXJldHVybiBGY1RydWU7CisgICAgfQorICAgIAorICAgIGJlc3QgPSAxZTk5OworICAgIGogPSAwOworICAgIGZvciAodjEgPSB2MW9yaWc7IHYxOyB2MSA9IHYxLT5uZXh0KQorICAgIHsKKwlmb3IgKHYyID0gdjJvcmlnOyB2MjsgdjIgPSB2Mi0+bmV4dCkKKwl7CisJICAgIHYgPSAoKl9GY01hdGNoZXJzW2ldLmNvbXBhcmUpIChfRmNNYXRjaGVyc1tpXS5vYmplY3QsCisJCQkJCSAgICB2MS0+dmFsdWUsCisJCQkJCSAgICB2Mi0+dmFsdWUpOworCSAgICBpZiAodiA8IDApCisJICAgIHsKKwkJKnJlc3VsdCA9IEZjUmVzdWx0VHlwZU1pc21hdGNoOworCQlyZXR1cm4gRmNGYWxzZTsKKwkgICAgfQorCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19NQVRDSFYpCisJCXByaW50ZiAoIiB2ICVnIGogJWQgIiwgdiwgaik7CisJICAgIHYgPSB2ICogMTAwICsgajsKKwkgICAgaWYgKHYgPCBiZXN0KQorCSAgICB7CisJCWlmIChiZXN0VmFsdWUpCisJCSAgICAqYmVzdFZhbHVlID0gdjItPnZhbHVlOworCQliZXN0ID0gdjsKKwkgICAgfQorCX0KKwlqKys7CisgICAgfQorICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX01BVENIVikKKyAgICB7CisJcHJpbnRmICgiICVzOiAlZyAiLCBvYmplY3QsIGJlc3QpOworCUZjVmFsdWVMaXN0UHJpbnQgKHYxb3JpZyk7CisJcHJpbnRmICgiLCAiKTsKKwlGY1ZhbHVlTGlzdFByaW50ICh2Mm9yaWcpOworCXByaW50ZiAoIlxuIik7CisgICAgfQorICAgIHZhbHVlW2ldICs9IGJlc3Q7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworLyoKKyAqIFJldHVybiBhIHZhbHVlIGluZGljYXRpbmcgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBsaXN0cyBvZgorICogdmFsdWVzCisgKi8KKworc3RhdGljIEZjQm9vbAorRmNDb21wYXJlIChGY1BhdHRlcm4JKnBhdCwKKwkgICBGY1BhdHRlcm4JKmZudCwKKwkgICBkb3VibGUJKnZhbHVlLAorCSAgIEZjUmVzdWx0CSpyZXN1bHQpCit7CisgICAgaW50CQkgICAgaSwgaTEsIGkyOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUFUQ0hFUjsgaSsrKQorCXZhbHVlW2ldID0gMC4wOworICAgIAorICAgIGZvciAoaTEgPSAwOyBpMSA8IHBhdC0+bnVtOyBpMSsrKQorICAgIHsKKwlmb3IgKGkyID0gMDsgaTIgPCBmbnQtPm51bTsgaTIrKykKKwl7CisJICAgIGlmICghRmNTdHJDbXBJZ25vcmVDYXNlIChwYXQtPmVsdHNbaTFdLm9iamVjdCwKKwkJCQkgICAgIGZudC0+ZWx0c1tpMl0ub2JqZWN0KSkKKwkgICAgeworCQlpZiAoIUZjQ29tcGFyZVZhbHVlTGlzdCAocGF0LT5lbHRzW2kxXS5vYmplY3QsCisJCQkJCSBwYXQtPmVsdHNbaTFdLnZhbHVlcywKKwkJCQkJIGZudC0+ZWx0c1tpMl0udmFsdWVzLAorCQkJCQkgMCwKKwkJCQkJIHZhbHVlLAorCQkJCQkgcmVzdWx0KSkKKwkJICAgIHJldHVybiBGY0ZhbHNlOworCQlicmVhazsKKwkgICAgfQorCX0KKyNpZiAwCisJLyoKKwkgKiBPdmVyc3BlY2lmaWVkIHBhdHRlcm5zIGFyZSBzbGlnaHRseSBwZW5hbGl6ZWQgaW4KKwkgKiBjYXNlIHNvbWUgb3RoZXIgZm9udCBpbmNsdWRlcyB0aGUgcmVxdWVzdGVkIGZpZWxkCisJICovCisJaWYgKGkyID09IGZudC0+bnVtKQorCXsKKwkgICAgZm9yIChpMiA9IDA7IGkyIDwgTlVNX01BVENIRVI7IGkyKyspCisJICAgIHsKKwkJaWYgKCFGY1N0ckNtcElnbm9yZUNhc2UgKF9GY01hdGNoZXJzW2kyXS5vYmplY3QsCisJCQkJCSBwYXQtPmVsdHNbaTFdLm9iamVjdCkpCisJCXsKKwkJICAgIHZhbHVlW2kyXSA9IDEuMDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworRmNQYXR0ZXJuICoKK0ZjRm9udE1hdGNoIChGY0NvbmZpZwkqY29uZmlnLAorCSAgICAgRmNQYXR0ZXJuCSpwLCAKKwkgICAgIEZjUmVzdWx0CSpyZXN1bHQpCit7CisgICAgZG91YmxlICAgIAkgICAgc2NvcmVbTlVNX01BVENIRVJdLCBiZXN0c2NvcmVbTlVNX01BVENIRVJdOworICAgIGludAkJICAgIGY7CisgICAgRmNGb250U2V0CSAgICAqczsKKyAgICBGY1BhdHRlcm4JICAgICpiZXN0OworICAgIEZjUGF0dGVybgkgICAgKm5ldzsKKyAgICBGY1BhdHRlcm5FbHQgICAqZmUsICpwZTsKKyAgICBGY1ZhbHVlCSAgICB2OworICAgIGludAkJICAgIGk7CisgICAgRmNTZXROYW1lCSAgICBzZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01BVENIRVI7IGkrKykKKwliZXN0c2NvcmVbaV0gPSAwOworICAgIGJlc3QgPSAwOworICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX01BVENIKQorICAgIHsKKwlwcmludGYgKCJNYXRjaCAiKTsKKwlGY1BhdHRlcm5QcmludCAocCk7CisgICAgfQorICAgIGlmICghY29uZmlnKQorICAgIHsKKwljb25maWcgPSBGY0NvbmZpZ0dldEN1cnJlbnQgKCk7CisJaWYgKCFjb25maWcpCisJICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKHNldCA9IEZjU2V0U3lzdGVtOyBzZXQgPD0gRmNTZXRBcHBsaWNhdGlvbjsgc2V0KyspCisgICAgeworCXMgPSBjb25maWctPmZvbnRzW3NldF07CisJaWYgKCFzKQorCSAgICBjb250aW51ZTsKKwlmb3IgKGYgPSAwOyBmIDwgcy0+bmZvbnQ7IGYrKykKKwl7CisJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX01BVENIVikKKwkgICAgeworCQlwcmludGYgKCJGb250ICVkICIsIGYpOworCQlGY1BhdHRlcm5QcmludCAocy0+Zm9udHNbZl0pOworCSAgICB9CisJICAgIGlmICghRmNDb21wYXJlIChwLCBzLT5mb250c1tmXSwgc2NvcmUsIHJlc3VsdCkpCisJCXJldHVybiAwOworCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19NQVRDSFYpCisJICAgIHsKKwkJcHJpbnRmICgiU2NvcmUiKTsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9NQVRDSEVSOyBpKyspCisJCXsKKwkJICAgIHByaW50ZiAoIiAlZyIsIHNjb3JlW2ldKTsKKwkJfQorCQlwcmludGYgKCJcbiIpOworCSAgICB9CisJICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUFUQ0hFUjsgaSsrKQorCSAgICB7CisJCWlmIChiZXN0ICYmIGJlc3RzY29yZVtpXSA8IHNjb3JlW2ldKQorCQkgICAgYnJlYWs7CisJCWlmICghYmVzdCB8fCBzY29yZVtpXSA8IGJlc3RzY29yZVtpXSkKKwkJeworCQkgICAgZm9yIChpID0gMDsgaSA8IE5VTV9NQVRDSEVSOyBpKyspCisJCQliZXN0c2NvcmVbaV0gPSBzY29yZVtpXTsKKwkJICAgIGJlc3QgPSBzLT5mb250c1tmXTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX01BVENIKQorICAgIHsKKwlwcmludGYgKCJCZXN0IHNjb3JlIik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9NQVRDSEVSOyBpKyspCisJICAgIHByaW50ZiAoIiAlZyIsIGJlc3RzY29yZVtpXSk7CisJRmNQYXR0ZXJuUHJpbnQgKGJlc3QpOworICAgIH0KKyAgICBpZiAoIWJlc3QpCisgICAgeworCSpyZXN1bHQgPSBGY1Jlc3VsdE5vTWF0Y2g7CisJcmV0dXJuIDA7CisgICAgfQorICAgIG5ldyA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKKyAgICBpZiAoIW5ldykKKwlyZXR1cm4gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmVzdC0+bnVtOyBpKyspCisgICAgeworCWZlID0gJmJlc3QtPmVsdHNbaV07CisJcGUgPSBGY1BhdHRlcm5GaW5kIChwLCBmZS0+b2JqZWN0LCBGY0ZhbHNlKTsKKwlpZiAocGUpCisJeworCSAgICBpZiAoIUZjQ29tcGFyZVZhbHVlTGlzdCAocGUtPm9iamVjdCwgcGUtPnZhbHVlcywgCisJCQkJICAgICBmZS0+dmFsdWVzLCAmdiwgc2NvcmUsIHJlc3VsdCkpCisJICAgIHsKKwkJRmNQYXR0ZXJuRGVzdHJveSAobmV3KTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisJZWxzZQorCSAgICB2ID0gZmUtPnZhbHVlcy0+dmFsdWU7CisJRmNQYXR0ZXJuQWRkIChuZXcsIGZlLT5vYmplY3QsIHYsIEZjVHJ1ZSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBwLT5udW07IGkrKykKKyAgICB7CisJcGUgPSAmcC0+ZWx0c1tpXTsKKwlmZSA9IEZjUGF0dGVybkZpbmQgKGJlc3QsIHBlLT5vYmplY3QsIEZjRmFsc2UpOworCWlmICghZmUpCisJICAgIEZjUGF0dGVybkFkZCAobmV3LCBwZS0+b2JqZWN0LCBwZS0+dmFsdWVzLT52YWx1ZSwgRmNUcnVlKTsKKyAgICB9CisgICAgRmNDb25maWdTdWJzdGl0dXRlIChjb25maWcsIG5ldywgRmNNYXRjaEZvbnQpOworICAgIHJldHVybiBuZXc7Cit9CmRpZmYgLS1naXQgYS9zcmMvZmNtYXRyaXguYyBiL3NyYy9mY21hdHJpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTlmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmNtYXRyaXguYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICRYRnJlZTg2OiAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBUdW9tYXMgSi4gTHVra2EKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFR1b21hcyBMdWtrYSBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVHVvbWFzIEx1a2thIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVFVPTUFTIExVS0tBIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVFVPTUFTIExVS0tBIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImZjaW50LmgiCisKK0ZjTWF0cml4ICoKK0ZjTWF0cml4Q29weSAoY29uc3QgRmNNYXRyaXggKm1hdCkgCit7CisgICAgRmNNYXRyaXggKnI7CisgICAgaWYoIW1hdCkgCisJcmV0dXJuIDA7CisgICAgciA9IChGY01hdHJpeCAqKSBtYWxsb2MgKHNpemVvZiAoKnIpICk7CisgICAgaWYgKCFyKQorCXJldHVybiAwOworICAgIEZjTWVtQWxsb2MgKEZDX01FTV9NQVRSSVgsIHNpemVvZiAoRmNNYXRyaXgpKTsKKyAgICAqciA9ICptYXQ7CisgICAgcmV0dXJuIHI7Cit9CisKK3ZvaWQKK0ZjTWF0cml4RnJlZSAoRmNNYXRyaXggKm1hdCkKK3sKKyAgICBGY01lbUZyZWUgKEZDX01FTV9NQVRSSVgsIHNpemVvZiAoRmNNYXRyaXgpKTsKKyAgICBmcmVlIChtYXQpOworfQorCitGY0Jvb2wKK0ZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0MikKK3sKKyAgICBpZihtYXQxID09IG1hdDIpIHJldHVybiBGY1RydWU7CisgICAgaWYobWF0MSA9PSAwIHx8IG1hdDIgPT0gMCkgcmV0dXJuIEZjRmFsc2U7CisgICAgcmV0dXJuIG1hdDEtPnh4ID09IG1hdDItPnh4ICYmIAorCSAgIG1hdDEtPnh5ID09IG1hdDItPnh5ICYmCisJICAgbWF0MS0+eXggPT0gbWF0Mi0+eXggJiYKKwkgICBtYXQxLT55eSA9PSBtYXQyLT55eTsKK30KKwordm9pZAorRmNNYXRyaXhNdWx0aXBseSAoRmNNYXRyaXggKnJlc3VsdCwgY29uc3QgRmNNYXRyaXggKmEsIGNvbnN0IEZjTWF0cml4ICpiKQoreworICAgIEZjTWF0cml4CXI7CisKKyAgICByLnh4ID0gYS0+eHggKiBiLT54eCArIGEtPnh5ICogYi0+eXg7CisgICAgci54eSA9IGEtPnh4ICogYi0+eHkgKyBhLT54eSAqIGItPnl5OworICAgIHIueXggPSBhLT55eCAqIGItPnh4ICsgYS0+eXkgKiBiLT55eDsKKyAgICByLnl5ID0gYS0+eXggKiBiLT54eSArIGEtPnl5ICogYi0+eXk7CisgICAgKnJlc3VsdCA9IHI7Cit9CisKK3ZvaWQKK0ZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKQoreworICAgIEZjTWF0cml4CXI7CisKKyAgICAvKgorICAgICAqIFggQ29vcmRpbmF0ZSBzeXN0ZW0gaXMgdXBzaWRlIGRvd24sIHN3YXAgdG8gbWFrZQorICAgICAqIHJvdGF0aW9ucyBjb3VudGVyY2xvY2t3aXNlCisgICAgICovCisgICAgci54eCA9IGM7CisgICAgci54eSA9IC1zOworICAgIHIueXggPSBzOworICAgIHIueXkgPSBjOworICAgIEZjTWF0cml4TXVsdGlwbHkgKG0sICZyLCBtKTsKK30KKwordm9pZAorRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KQoreworICAgIEZjTWF0cml4CXI7CisKKyAgICByLnh4ID0gc3g7CisgICAgci54eSA9IDA7CisgICAgci55eCA9IDA7CisgICAgci55eSA9IHN5OworICAgIEZjTWF0cml4TXVsdGlwbHkgKG0sICZyLCBtKTsKK30KKwordm9pZAorRmNNYXRyaXhTaGVhciAoRmNNYXRyaXggKm0sIGRvdWJsZSBzaCwgZG91YmxlIHN2KQoreworICAgIEZjTWF0cml4CXI7CisKKyAgICByLnh4ID0gMTsKKyAgICByLnh5ID0gc2g7CisgICAgci55eCA9IHN2OworICAgIHIueXkgPSAxOworICAgIEZjTWF0cml4TXVsdGlwbHkgKG0sICZyLCBtKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9mY25hbWUuYyBiL3NyYy9mY25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjbmFtZS5jCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogJFhGcmVlODY6IHhjL2xpYi9GYy94ZnRuYW1lLmMsdiAxLjEwIDIwMDEvMDMvMzAgMTg6NTA6MTgga2VpdGhwIEV4cCAkCisgKgorICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJmY2ludC5oIgorCitzdGF0aWMgY29uc3QgRmNPYmplY3RUeXBlIF9GY0Jhc2VPYmplY3RUeXBlc1tdID0geworICAgIHsgRkNfRkFNSUxZLAlGY1R5cGVTdHJpbmcsIH0sCisgICAgeyBGQ19TVFlMRSwJCUZjVHlwZVN0cmluZywgfSwKKyAgICB7IEZDX1NMQU5ULAkJRmNUeXBlSW50ZWdlciwgfSwKKyAgICB7IEZDX1dFSUdIVCwJRmNUeXBlSW50ZWdlciwgfSwKKyAgICB7IEZDX1NJWkUsCQlGY1R5cGVEb3VibGUsIH0sCisgICAgeyBGQ19QSVhFTF9TSVpFLAlGY1R5cGVEb3VibGUsIH0sCisgICAgeyBGQ19TUEFDSU5HLAlGY1R5cGVJbnRlZ2VyLCB9LAorICAgIHsgRkNfRk9VTkRSWSwJRmNUeXBlU3RyaW5nLCB9LAorLyogICAgeyBGQ19DT1JFLAkJRmNUeXBlQm9vbCwgfSwgKi8KKyAgICB7IEZDX0FOVElBTElBUywJRmNUeXBlQm9vbCwgfSwKKy8qICAgIHsgRkNfWExGRCwJCUZjVHlwZVN0cmluZywgfSwgKi8KKyAgICB7IEZDX0ZJTEUsCQlGY1R5cGVTdHJpbmcsIH0sCisgICAgeyBGQ19JTkRFWCwJCUZjVHlwZUludGVnZXIsIH0sCisgICAgeyBGQ19SQVNURVJJWkVSLAlGY1R5cGVTdHJpbmcsIH0sCisgICAgeyBGQ19PVVRMSU5FLAlGY1R5cGVCb29sLCB9LAorICAgIHsgRkNfU0NBTEFCTEUsCUZjVHlwZUJvb2wsIH0sCisgICAgeyBGQ19SR0JBLAkJRmNUeXBlSW50ZWdlciwgfSwKKyAgICB7IEZDX1NDQUxFLAkJRmNUeXBlRG91YmxlLCB9LAorLyogICAgeyBGQ19SRU5ERVIsCUZjVHlwZUJvb2wsIH0sKi8KKyAgICB7IEZDX01JTlNQQUNFLAlGY1R5cGVCb29sLCB9LAorICAgIHsgRkNfQ0hBUl9XSURUSCwJRmNUeXBlSW50ZWdlciB9LAorICAgIHsgRkNfQ0hBUl9IRUlHSFQsCUZjVHlwZUludGVnZXIgfSwKKyAgICB7IEZDX01BVFJJWCwJRmNUeXBlTWF0cml4IH0sCisgICAgeyBGQ19DSEFSU0VULAlGY1R5cGVDaGFyU2V0IH0sCisgICAgeyBGQ19MQU5HLAkJRmNUeXBlU3RyaW5nIH0sCit9OworCisjZGVmaW5lIE5VTV9PQkpFQ1RfVFlQRVMgICAgKHNpemVvZiBfRmNCYXNlT2JqZWN0VHlwZXMgLyBzaXplb2YgX0ZjQmFzZU9iamVjdFR5cGVzWzBdKQorCit0eXBlZGVmIHN0cnVjdCBfRmNPYmplY3RUeXBlTGlzdCAgICBGY09iamVjdFR5cGVMaXN0OworCitzdHJ1Y3QgX0ZjT2JqZWN0VHlwZUxpc3QgeworICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QgICpuZXh0OworICAgIGNvbnN0IEZjT2JqZWN0VHlwZQkgICAgKnR5cGVzOworICAgIGludAkJCSAgICBudHlwZXM7Cit9OworCitzdGF0aWMgY29uc3QgRmNPYmplY3RUeXBlTGlzdCBfRmNCYXNlT2JqZWN0VHlwZXNMaXN0ID0geworICAgIDAsCisgICAgX0ZjQmFzZU9iamVjdFR5cGVzLAorICAgIE5VTV9PQkpFQ1RfVFlQRVMKK307CisKK3N0YXRpYyBjb25zdCBGY09iamVjdFR5cGVMaXN0CSpfRmNPYmplY3RUeXBlcyA9ICZfRmNCYXNlT2JqZWN0VHlwZXNMaXN0OworCitGY0Jvb2wKK0ZjTmFtZVJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZXMpCit7CisgICAgRmNPYmplY3RUeXBlTGlzdAkqbDsKKworICAgIGwgPSAoRmNPYmplY3RUeXBlTGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNPYmplY3RUeXBlTGlzdCkpOworICAgIGlmICghbCkKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICBsLT50eXBlcyA9IHR5cGVzOworICAgIGwtPm50eXBlcyA9IG50eXBlczsKKyAgICBsLT5uZXh0ID0gX0ZjT2JqZWN0VHlwZXM7CisgICAgX0ZjT2JqZWN0VHlwZXMgPSBsOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK0ZjQm9vbAorRmNOYW1lVW5yZWdpc3Rlck9iamVjdFR5cGVzIChjb25zdCBGY09iamVjdFR5cGUgKnR5cGVzLCBpbnQgbnR5cGVzKQoreworICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QJKmwsICoqcHJldjsKKworICAgIGZvciAocHJldiA9ICZfRmNPYmplY3RUeXBlczsgCisJIChsID0gKnByZXYpOyAKKwkgcHJldiA9IChjb25zdCBGY09iamVjdFR5cGVMaXN0ICoqKSAmKGwtPm5leHQpKQorICAgIHsKKwlpZiAobC0+dHlwZXMgPT0gdHlwZXMgJiYgbC0+bnR5cGVzID09IG50eXBlcykKKwl7CisJICAgICpwcmV2ID0gbC0+bmV4dDsKKwkgICAgZnJlZSAoKHZvaWQgKikgbCk7CisJICAgIHJldHVybiBGY1RydWU7CisJfQorICAgIH0KKyAgICByZXR1cm4gRmNGYWxzZTsKK30KKworY29uc3QgRmNPYmplY3RUeXBlICoKK0ZjTmFtZUdldE9iamVjdFR5cGUgKGNvbnN0IGNoYXIgKm9iamVjdCkKK3sKKyAgICBpbnQJCQkgICAgaTsKKyAgICBjb25zdCBGY09iamVjdFR5cGVMaXN0ICAqbDsKKyAgICBjb25zdCBGY09iamVjdFR5cGUJICAgICp0OworICAgIAorICAgIGZvciAobCA9IF9GY09iamVjdFR5cGVzOyBsOyBsID0gbC0+bmV4dCkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IGwtPm50eXBlczsgaSsrKQorCXsKKwkgICAgdCA9ICZsLT50eXBlc1tpXTsKKwkgICAgaWYgKCFGY1N0ckNtcElnbm9yZUNhc2UgKG9iamVjdCwgdC0+b2JqZWN0KSkKKwkJcmV0dXJuIHQ7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEZjQ29uc3RhbnQgX0ZjQmFzZUNvbnN0YW50c1tdID0geworICAgIHsgImxpZ2h0IiwJCSJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9MSUdIVCwgfSwKKyAgICB7ICJtZWRpdW0iLAkJIndlaWdodCIsICAgRkNfV0VJR0hUX01FRElVTSwgfSwKKyAgICB7ICJkZW1pYm9sZCIsCSJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9ERU1JQk9MRCwgfSwKKyAgICB7ICJib2xkIiwJCSJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9CT0xELCB9LAorICAgIHsgImJsYWNrIiwJCSJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9CTEFDSywgfSwKKworICAgIHsgInJvbWFuIiwJCSJzbGFudCIsICAgIEZDX1NMQU5UX1JPTUFOLCB9LAorICAgIHsgIml0YWxpYyIsCQkic2xhbnQiLCAgICBGQ19TTEFOVF9JVEFMSUMsIH0sCisgICAgeyAib2JsaXF1ZSIsCSJzbGFudCIsICAgIEZDX1NMQU5UX09CTElRVUUsIH0sCisKKyAgICB7ICJwcm9wb3J0aW9uYWwiLAkic3BhY2luZyIsICBGQ19QUk9QT1JUSU9OQUwsIH0sCisgICAgeyAibW9ubyIsCQkic3BhY2luZyIsICBGQ19NT05PLCB9LAorICAgIHsgImNoYXJjZWxsIiwJInNwYWNpbmciLCAgRkNfQ0hBUkNFTEwsIH0sCisKKyAgICB7ICJyZ2IiLAkJInJnYmEiLAkgICAgRkNfUkdCQV9SR0IsIH0sCisgICAgeyAiYmdyIiwJCSJyZ2JhIiwJICAgIEZDX1JHQkFfQkdSLCB9LAorICAgIHsgInZyZ2IiLAkJInJnYmEiLAkgICAgRkNfUkdCQV9WUkdCIH0sCisgICAgeyAidmJnciIsCQkicmdiYSIsCSAgICBGQ19SR0JBX1ZCR1IgfSwKK307CisKKyNkZWZpbmUgTlVNX0ZDX0NPTlNUQU5UUyAgIChzaXplb2YgX0ZjQmFzZUNvbnN0YW50cy9zaXplb2YgX0ZjQmFzZUNvbnN0YW50c1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX0ZjQ29uc3RhbnRMaXN0IEZjQ29uc3RhbnRMaXN0OworCitzdHJ1Y3QgX0ZjQ29uc3RhbnRMaXN0IHsKKyAgICBjb25zdCBGY0NvbnN0YW50TGlzdCAgICAqbmV4dDsKKyAgICBjb25zdCBGY0NvbnN0YW50CSAgICAqY29uc3RzOworICAgIGludAkJCSAgICBuY29uc3RzOworfTsKKworc3RhdGljIGNvbnN0IEZjQ29uc3RhbnRMaXN0IF9GY0Jhc2VDb25zdGFudExpc3QgPSB7CisgICAgMCwKKyAgICBfRmNCYXNlQ29uc3RhbnRzLAorICAgIE5VTV9GQ19DT05TVEFOVFMKK307CisKK3N0YXRpYyBjb25zdCBGY0NvbnN0YW50TGlzdAkqX0ZjQ29uc3RhbnRzID0gJl9GY0Jhc2VDb25zdGFudExpc3Q7CisKK0ZjQm9vbAorRmNOYW1lUmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpCit7CisgICAgRmNDb25zdGFudExpc3QJKmw7CisKKyAgICBsID0gKEZjQ29uc3RhbnRMaXN0ICopIG1hbGxvYyAoc2l6ZW9mIChGY0NvbnN0YW50TGlzdCkpOworICAgIGlmICghbCkKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICBsLT5jb25zdHMgPSBjb25zdHM7CisgICAgbC0+bmNvbnN0cyA9IG5jb25zdHM7CisgICAgbC0+bmV4dCA9IF9GY0NvbnN0YW50czsKKyAgICBfRmNDb25zdGFudHMgPSBsOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK0ZjQm9vbAorRmNOYW1lVW5yZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cykKK3sKKyAgICBjb25zdCBGY0NvbnN0YW50TGlzdAkqbCwgKipwcmV2OworCisgICAgZm9yIChwcmV2ID0gJl9GY0NvbnN0YW50czsgCisJIChsID0gKnByZXYpOyAKKwkgcHJldiA9IChjb25zdCBGY0NvbnN0YW50TGlzdCAqKikgJihsLT5uZXh0KSkKKyAgICB7CisJaWYgKGwtPmNvbnN0cyA9PSBjb25zdHMgJiYgbC0+bmNvbnN0cyA9PSBuY29uc3RzKQorCXsKKwkgICAgKnByZXYgPSBsLT5uZXh0OworCSAgICBmcmVlICgodm9pZCAqKSBsKTsKKwkgICAgcmV0dXJuIEZjVHJ1ZTsKKwl9CisgICAgfQorICAgIHJldHVybiBGY0ZhbHNlOworfQorCitjb25zdCBGY0NvbnN0YW50ICoKK0ZjTmFtZUdldENvbnN0YW50IChjaGFyICpzdHJpbmcpCit7CisgICAgY29uc3QgRmNDb25zdGFudExpc3QgICAgKmw7CisgICAgaW50CQkJICAgIGk7CisgICAgCisgICAgZm9yIChsID0gX0ZjQ29uc3RhbnRzOyBsOyBsID0gbC0+bmV4dCkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IGwtPm5jb25zdHM7IGkrKykKKwkgICAgaWYgKCFGY1N0ckNtcElnbm9yZUNhc2UgKHN0cmluZywgbC0+Y29uc3RzW2ldLm5hbWUpKQorCQlyZXR1cm4gJmwtPmNvbnN0c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0ZjQm9vbAorRmNOYW1lQ29uc3RhbnQgKGNoYXIgKnN0cmluZywgaW50ICpyZXN1bHQpCit7CisgICAgY29uc3QgRmNDb25zdGFudAkqYzsKKworICAgIGlmICgoYyA9IEZjTmFtZUdldENvbnN0YW50KHN0cmluZykpKQorICAgIHsKKwkqcmVzdWx0ID0gYy0+dmFsdWU7CisJcmV0dXJuIEZjVHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CisKK0ZjQm9vbAorRmNOYW1lQm9vbCAoY2hhciAqdiwgRmNCb29sICpyZXN1bHQpCit7CisgICAgY2hhciAgICBjMCwgYzE7CisKKyAgICBjMCA9ICp2OworICAgIGlmIChpc3VwcGVyIChjMCkpCisJYzAgPSB0b2xvd2VyIChjMCk7CisgICAgaWYgKGMwID09ICd0JyB8fCBjMCA9PSAneScgfHwgYzAgPT0gJzEnKQorICAgIHsKKwkqcmVzdWx0ID0gRmNUcnVlOworCXJldHVybiBGY1RydWU7CisgICAgfQorICAgIGlmIChjMCA9PSAnZicgfHwgYzAgPT0gJ24nIHx8IGMwID09ICcwJykKKyAgICB7CisJKnJlc3VsdCA9IEZjRmFsc2U7CisJcmV0dXJuIEZjVHJ1ZTsKKyAgICB9CisgICAgaWYgKGMwID09ICdvJykKKyAgICB7CisJYzEgPSB2WzFdOworCWlmIChpc3VwcGVyIChjMSkpCisJICAgIGMxID0gdG9sb3dlciAoYzEpOworCWlmIChjMSA9PSAnbicpCisJeworCSAgICAqcmVzdWx0ID0gRmNUcnVlOworCSAgICByZXR1cm4gRmNUcnVlOworCX0KKwlpZiAoYzEgPT0gJ2YnKQorCXsKKwkgICAgKnJlc3VsdCA9IEZjRmFsc2U7CisJICAgIHJldHVybiBGY1RydWU7CisJfQorICAgIH0KKyAgICByZXR1cm4gRmNGYWxzZTsKK30KKworc3RhdGljIEZjVmFsdWUKK0ZjTmFtZUNvbnZlcnQgKEZjVHlwZSB0eXBlLCBjaGFyICpzdHJpbmcsIEZjTWF0cml4ICptKQoreworICAgIEZjVmFsdWUJdjsKKworICAgIHYudHlwZSA9IHR5cGU7CisgICAgc3dpdGNoICh2LnR5cGUpIHsKKyAgICBjYXNlIEZjVHlwZUludGVnZXI6CisJaWYgKCFGY05hbWVDb25zdGFudCAoc3RyaW5nLCAmdi51LmkpKQorCSAgICB2LnUuaSA9IGF0b2kgKHN0cmluZyk7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVTdHJpbmc6CisJdi51LnMgPSBzdHJpbmc7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVCb29sOgorCWlmICghRmNOYW1lQm9vbCAoc3RyaW5nLCAmdi51LmIpKQorCSAgICB2LnUuYiA9IEZjRmFsc2U7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVEb3VibGU6CisJdi51LmQgPSBzdHJ0b2QgKHN0cmluZywgMCk7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVNYXRyaXg6CisJdi51Lm0gPSBtOworCXNzY2FuZiAoc3RyaW5nLCAiJWxnICVsZyAlbGcgJWxnIiwgJm0tPnh4LCAmbS0+eHksICZtLT55eCwgJm0tPnl5KTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6CisJdi51LmMgPSBGY05hbWVQYXJzZUNoYXJTZXQgKHN0cmluZyk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK0ZjTmFtZUZpbmROZXh0IChjb25zdCBjaGFyICpjdXIsIGNvbnN0IGNoYXIgKmRlbGltLCBjaGFyICpzYXZlLCBjaGFyICpsYXN0KQoreworICAgIGNoYXIgICAgYzsKKyAgICAKKyAgICB3aGlsZSAoKGMgPSAqY3VyKSkKKyAgICB7CisJaWYgKGMgPT0gJ1xcJykKKwl7CisJICAgICsrY3VyOworCSAgICBpZiAoIShjID0gKmN1cikpCisJCWJyZWFrOworCX0KKwllbHNlIGlmIChzdHJjaHIgKGRlbGltLCBjKSkKKwkgICAgYnJlYWs7CisJKytjdXI7CisJKnNhdmUrKyA9IGM7CisgICAgfQorICAgICpzYXZlID0gMDsKKyAgICAqbGFzdCA9ICpjdXI7CisgICAgaWYgKCpjdXIpCisJY3VyKys7CisgICAgcmV0dXJuIGN1cjsKK30KKworRmNQYXR0ZXJuICoKK0ZjTmFtZVBhcnNlIChjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNoYXIJCSpzYXZlOworICAgIEZjUGF0dGVybgkJKnBhdDsKKyAgICBkb3VibGUJCWQ7CisgICAgY2hhcgkJKmU7CisgICAgY2hhcgkJZGVsaW07CisgICAgRmNWYWx1ZQkJdjsKKyAgICBGY01hdHJpeAkJbTsKKyAgICBjb25zdCBGY09iamVjdFR5cGUJKnQ7CisgICAgY29uc3QgRmNDb25zdGFudAkqYzsKKworICAgIHNhdmUgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKKyAgICBpZiAoIXNhdmUpCisJZ290byBiYWlsMDsKKyAgICBwYXQgPSBGY1BhdHRlcm5DcmVhdGUgKCk7CisgICAgaWYgKCFwYXQpCisJZ290byBiYWlsMTsKKworICAgIGZvciAoOzspCisgICAgeworCW5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIi0sOiIsIHNhdmUsICZkZWxpbSk7CisJaWYgKHNhdmVbMF0pCisJeworCSAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19GQU1JTFksIHNhdmUpKQorCQlnb3RvIGJhaWwyOworCX0KKwlpZiAoZGVsaW0gIT0gJywnKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGRlbGltID09ICctJykKKyAgICB7CisJZm9yICg7OykKKwl7CisJICAgIG5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIi0sOiIsIHNhdmUsICZkZWxpbSk7CisJICAgIGQgPSBzdHJ0b2QgKHNhdmUsICZlKTsKKwkgICAgaWYgKGUgIT0gc2F2ZSkKKwkgICAgeworCQlpZiAoIUZjUGF0dGVybkFkZERvdWJsZSAocGF0LCBGQ19TSVpFLCBkKSkKKwkJICAgIGdvdG8gYmFpbDI7CisJICAgIH0KKwkgICAgaWYgKGRlbGltICE9ICcsJykKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICB3aGlsZSAoZGVsaW0gPT0gJzonKQorICAgIHsKKwluYW1lID0gRmNOYW1lRmluZE5leHQgKG5hbWUsICI9XzoiLCBzYXZlLCAmZGVsaW0pOworCWlmIChzYXZlWzBdKQorCXsKKwkgICAgaWYgKGRlbGltID09ICc9JyB8fCBkZWxpbSA9PSAnXycpCisJICAgIHsKKwkJdCA9IEZjTmFtZUdldE9iamVjdFR5cGUgKHNhdmUpOworCQlmb3IgKDs7KQorCQl7CisJCSAgICBuYW1lID0gRmNOYW1lRmluZE5leHQgKG5hbWUsICI6LCIsIHNhdmUsICZkZWxpbSk7CisJCSAgICBpZiAoc2F2ZVswXSAmJiB0KQorCQkgICAgeworCQkJdiA9IEZjTmFtZUNvbnZlcnQgKHQtPnR5cGUsIHNhdmUsICZtKTsKKwkJCWlmICghRmNQYXR0ZXJuQWRkIChwYXQsIHQtPm9iamVjdCwgdiwgRmNUcnVlKSkKKwkJCXsKKwkJCSAgICBpZiAodi50eXBlID09IEZjVHlwZUNoYXJTZXQpCisJCQkJRmNDaGFyU2V0RGVzdHJveSAoKEZjQ2hhclNldCAqKSB2LnUuYyk7CisJCQkgICAgZ290byBiYWlsMjsKKwkJCX0KKwkJCWlmICh2LnR5cGUgPT0gRmNUeXBlQ2hhclNldCkKKwkJCSAgICBGY0NoYXJTZXREZXN0cm95ICgoRmNDaGFyU2V0ICopIHYudS5jKTsKKwkJICAgIH0KKwkJICAgIGlmIChkZWxpbSAhPSAnLCcpCisJCQlicmVhazsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoKGMgPSBGY05hbWVHZXRDb25zdGFudCAoc2F2ZSkpKQorCQl7CisJCSAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgYy0+b2JqZWN0LCBjLT52YWx1ZSkpCisJCQlnb3RvIGJhaWwyOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgZnJlZSAoc2F2ZSk7CisgICAgcmV0dXJuIHBhdDsKKworYmFpbDI6CisgICAgRmNQYXR0ZXJuRGVzdHJveSAocGF0KTsKK2JhaWwxOgorICAgIGZyZWUgKHNhdmUpOworYmFpbDA6CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitGY05hbWVCdWZJbml0IChGY05hbWVCdWYgKmJ1ZiwgRmNDaGFyOCAqaW5pdCwgaW50IHNpemUpCit7CisgICAgYnVmLT5idWYgPSBpbml0OworICAgIGJ1Zi0+YWxsb2NhdGVkID0gRmNGYWxzZTsKKyAgICBidWYtPmZhaWxlZCA9IEZjRmFsc2U7CisgICAgYnVmLT5sZW4gPSAwOworICAgIGJ1Zi0+c2l6ZSA9IHNpemU7Cit9CisKK3N0YXRpYyB2b2lkCitGY05hbWVCdWZEZXN0cm95IChGY05hbWVCdWYgKmJ1ZikKK3sKKyAgICBpZiAoYnVmLT5hbGxvY2F0ZWQpCisJZnJlZSAoYnVmLT5idWYpOworfQorCitzdGF0aWMgRmNDaGFyOCAqCitGY05hbWVCdWZEb25lIChGY05hbWVCdWYgKmJ1ZikKK3sKKyAgICBGY0NoYXI4ICpyZXQ7CisKKyAgICByZXQgPSBtYWxsb2MgKGJ1Zi0+bGVuICsgMSk7CisgICAgaWYgKHJldCkKKyAgICB7CisJbWVtY3B5IChyZXQsIGJ1Zi0+YnVmLCBidWYtPmxlbik7CisJcmV0W2J1Zi0+bGVuXSA9ICdcMCc7CisgICAgfQorICAgIEZjTmFtZUJ1ZkRlc3Ryb3kgKGJ1Zik7CisgICAgcmV0dXJuIHJldDsKK30KKworRmNCb29sCitGY05hbWVCdWZDaGFyIChGY05hbWVCdWYgKmJ1ZiwgRmNDaGFyOCBjKQoreworICAgIGlmIChidWYtPmxlbiA9PSBidWYtPnNpemUpCisgICAgeworCUZjQ2hhcjgJICAgICpuZXc7CisJaW50CSAgICBzaXplOworCisJaWYgKGJ1Zi0+YWxsb2NhdGVkKQorCXsKKwkgICAgc2l6ZSA9IGJ1Zi0+c2l6ZSAqIDI7CisJICAgIG5ldyA9IHJlYWxsb2MgKGJ1Zi0+YnVmLCBzaXplKTsKKwl9CisJZWxzZQorCXsKKwkgICAgc2l6ZSA9IGJ1Zi0+c2l6ZSArIDEwMjQ7CisJICAgIG5ldyA9IG1hbGxvYyAoc2l6ZSk7CisJICAgIGlmIChuZXcpCisJICAgIHsKKwkJYnVmLT5hbGxvY2F0ZWQgPSBGY1RydWU7CisJCW1lbWNweSAobmV3LCBidWYtPmJ1ZiwgYnVmLT5sZW4pOworCSAgICB9CisJfQorCWlmICghbmV3KQorCXsKKwkgICAgYnVmLT5mYWlsZWQgPSBGY1RydWU7CisJICAgIHJldHVybiBGY0ZhbHNlOworCX0KKwlidWYtPnNpemUgPSBzaXplOworCWJ1Zi0+YnVmID0gbmV3OworICAgIH0KKyAgICBidWYtPmJ1ZltidWYtPmxlbisrXSA9IGM7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworRmNCb29sCitGY05hbWVCdWZTdHJpbmcgKEZjTmFtZUJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKQoreworICAgIEZjQ2hhcjggYzsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKwlpZiAoIUZjTmFtZUJ1ZkNoYXIgKGJ1ZiwgYykpCisJICAgIHJldHVybiBGY0ZhbHNlOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjTmFtZVVucGFyc2VTdHJpbmcgKEZjTmFtZUJ1ZgkgICAgKmJ1ZiwgCisJCSAgICAgY29uc3QgRmNDaGFyOCAgKnN0cmluZywKKwkJICAgICBjb25zdCBGY0NoYXI4ICAqZXNjYXBlKQoreworICAgIEZjQ2hhcjggYzsKKyAgICB3aGlsZSAoKGMgPSAqc3RyaW5nKyspKQorICAgIHsKKwlpZiAoZXNjYXBlICYmIHN0cmNociAoKGNoYXIgKikgZXNjYXBlLCAoY2hhcikgYykpCisJeworCSAgICBpZiAoIUZjTmFtZUJ1ZkNoYXIgKGJ1ZiwgZXNjYXBlWzBdKSkKKwkJcmV0dXJuIEZjRmFsc2U7CisJfQorCWlmICghRmNOYW1lQnVmQ2hhciAoYnVmLCBjKSkKKwkgICAgcmV0dXJuIEZjRmFsc2U7CisgICAgfQorICAgIHJldHVybiBGY1RydWU7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjTmFtZVVucGFyc2VWYWx1ZSAoRmNOYW1lQnVmCSpidWYsCisJCSAgICBGY1ZhbHVlCXYsCisJCSAgICBGY0NoYXI4CSplc2NhcGUpCit7CisgICAgRmNDaGFyOAl0ZW1wWzEwMjRdOworICAgIAorICAgIHN3aXRjaCAodi50eXBlKSB7CisgICAgY2FzZSBGY1R5cGVWb2lkOgorCXJldHVybiBGY1RydWU7CisgICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgorCXNwcmludGYgKChjaGFyICopIHRlbXAsICIlZCIsIHYudS5pKTsKKwlyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB0ZW1wLCAwKTsKKyAgICBjYXNlIEZjVHlwZURvdWJsZToKKwlzcHJpbnRmICgoY2hhciAqKSB0ZW1wLCAiJWciLCB2LnUuZCk7CisJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1ZiwgdGVtcCwgMCk7CisgICAgY2FzZSBGY1R5cGVTdHJpbmc6CisJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1Ziwgdi51LnMsIGVzY2FwZSk7CisgICAgY2FzZSBGY1R5cGVCb29sOgorCXJldHVybiBGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsIHYudS5iID8gIlRydWUiIDogIkZhbHNlIiwgMCk7CisgICAgY2FzZSBGY1R5cGVNYXRyaXg6CisJc3ByaW50ZiAoKGNoYXIgKikgdGVtcCwgIiVnICVnICVnICVnIiwgCisJCSB2LnUubS0+eHgsIHYudS5tLT54eSwgdi51Lm0tPnl4LCB2LnUubS0+eXkpOworCXJldHVybiBGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsIHRlbXAsIDApOworICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKKwlyZXR1cm4gRmNOYW1lVW5wYXJzZUNoYXJTZXQgKGJ1Ziwgdi51LmMpOworICAgIH0KKyAgICByZXR1cm4gRmNGYWxzZTsKK30KKworc3RhdGljIEZjQm9vbAorRmNOYW1lVW5wYXJzZVZhbHVlTGlzdCAoRmNOYW1lQnVmCSpidWYsCisJCQlGY1ZhbHVlTGlzdAkqdiwKKwkJCWNoYXIJCSplc2NhcGUpCit7CisgICAgd2hpbGUgKHYpCisgICAgeworCWlmICghRmNOYW1lVW5wYXJzZVZhbHVlIChidWYsIHYtPnZhbHVlLCBlc2NhcGUpKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlpZiAoKHYgPSB2LT5uZXh0KSkKKwkgICAgaWYgKCFGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsICIsIiwgMCkpCisJCXJldHVybiBGY0ZhbHNlOworICAgIH0KKyAgICByZXR1cm4gRmNUcnVlOworfQorCisjZGVmaW5lIEZDX0VTQ0FQRV9GSVhFRCAgICAiXFwtOiwiCisjZGVmaW5lIEZDX0VTQ0FQRV9WQVJJQUJMRSAiXFw9XzosIgorCitGY0NoYXI4ICoKK0ZjTmFtZVVucGFyc2UgKEZjUGF0dGVybiAqcGF0KQoreworICAgIEZjTmFtZUJ1ZgkJICAgIGJ1ZjsKKyAgICBGY0NoYXI4CQkgICAgYnVmX3N0YXRpY1s4MTkyXTsKKyAgICBpbnQJCQkgICAgaTsKKyAgICBGY1BhdHRlcm5FbHQJICAgICplOworICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QgICpsOworICAgIGNvbnN0IEZjT2JqZWN0VHlwZQkgICAgKm87CisKKyAgICBGY05hbWVCdWZJbml0ICgmYnVmLCBidWZfc3RhdGljLCBzaXplb2YgKGJ1Zl9zdGF0aWMpKTsKKyAgICBlID0gRmNQYXR0ZXJuRmluZCAocGF0LCBGQ19GQU1JTFksIEZjRmFsc2UpOworICAgIGlmIChlKQorICAgIHsKKwlpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgRkNfRVNDQVBFX0ZJWEVEKSkKKwkgICAgZ290byBiYWlsMDsKKyAgICB9CisgICAgZSA9IEZjUGF0dGVybkZpbmQgKHBhdCwgRkNfU0laRSwgRmNGYWxzZSk7CisgICAgaWYgKGUpCisgICAgeworCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgIi0iLCAwKSkKKwkgICAgZ290byBiYWlsMDsKKwlpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgRkNfRVNDQVBFX0ZJWEVEKSkKKwkgICAgZ290byBiYWlsMDsKKyAgICB9CisgICAgZm9yIChsID0gX0ZjT2JqZWN0VHlwZXM7IGw7IGwgPSBsLT5uZXh0KQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgbC0+bnR5cGVzOyBpKyspCisJeworCSAgICBvID0gJmwtPnR5cGVzW2ldOworCSAgICBpZiAoIXN0cmNtcCAoby0+b2JqZWN0LCBGQ19GQU1JTFkpIHx8IAorCQkhc3RyY21wIChvLT5vYmplY3QsIEZDX1NJWkUpIHx8CisJCSFzdHJjbXAgKG8tPm9iamVjdCwgRkNfRklMRSkpCisJCWNvbnRpbnVlOworCSAgICAKKwkgICAgZSA9IEZjUGF0dGVybkZpbmQgKHBhdCwgby0+b2JqZWN0LCBGY0ZhbHNlKTsKKwkgICAgaWYgKGUpCisJICAgIHsKKwkJaWYgKCFGY05hbWVVbnBhcnNlU3RyaW5nICgmYnVmLCAiOiIsIDApKQorCQkgICAgZ290byBiYWlsMDsKKwkJaWYgKCFGY05hbWVVbnBhcnNlU3RyaW5nICgmYnVmLCBvLT5vYmplY3QsIEZDX0VTQ0FQRV9WQVJJQUJMRSkpCisJCSAgICBnb3RvIGJhaWwwOworCQlpZiAoIUZjTmFtZVVucGFyc2VTdHJpbmcgKCZidWYsICI9IiwgMCkpCisJCSAgICBnb3RvIGJhaWwwOworCQlpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgCisJCQkJCSAgICAgRkNfRVNDQVBFX1ZBUklBQkxFKSkKKwkJICAgIGdvdG8gYmFpbDA7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiBGY05hbWVCdWZEb25lICgmYnVmKTsKK2JhaWwwOgorICAgIEZjTmFtZUJ1ZkRlc3Ryb3kgKCZidWYpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2ZjcGF0LmMgYi9zcmMvZmNwYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZkNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZjcGF0LmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmY2ludC5oIgorCitGY1BhdHRlcm4gKgorRmNQYXR0ZXJuQ3JlYXRlICh2b2lkKQoreworICAgIEZjUGF0dGVybgkqcDsKKworICAgIHAgPSAoRmNQYXR0ZXJuICopIG1hbGxvYyAoc2l6ZW9mIChGY1BhdHRlcm4pKTsKKyAgICBpZiAoIXApCisJcmV0dXJuIDA7CisgICAgRmNNZW1BbGxvYyAoRkNfTUVNX1BBVFRFUk4sIHNpemVvZiAoRmNQYXR0ZXJuKSk7CisgICAgcC0+bnVtID0gMDsKKyAgICBwLT5zaXplID0gMDsKKyAgICBwLT5lbHRzID0gMDsKKyAgICByZXR1cm4gcDsKK30KKwordm9pZAorRmNWYWx1ZURlc3Ryb3kgKEZjVmFsdWUgdikKK3sKKyAgICBzd2l0Y2ggKHYudHlwZSkgeworICAgIGNhc2UgRmNUeXBlU3RyaW5nOgorCUZjU3RyRnJlZSAoKEZjQ2hhcjggKikgdi51LnMpOworCWJyZWFrOworICAgIGNhc2UgRmNUeXBlTWF0cml4OgorCUZjTWF0cml4RnJlZSAoKEZjTWF0cml4ICopIHYudS5tKTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6CisJRmNDaGFyU2V0RGVzdHJveSAoKEZjQ2hhclNldCAqKSB2LnUuYyk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9Cit9CisKK0ZjVmFsdWUKK0ZjVmFsdWVTYXZlIChGY1ZhbHVlIHYpCit7CisgICAgc3dpdGNoICh2LnR5cGUpIHsKKyAgICBjYXNlIEZjVHlwZVN0cmluZzoKKwl2LnUucyA9IEZjU3RyQ29weSAodi51LnMpOworCWlmICghdi51LnMpCisJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVNYXRyaXg6CisJdi51Lm0gPSBGY01hdHJpeENvcHkgKHYudS5tKTsKKwlpZiAoIXYudS5tKQorCSAgICB2LnR5cGUgPSBGY1R5cGVWb2lkOworCWJyZWFrOworICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKKwl2LnUuYyA9IEZjQ2hhclNldENvcHkgKChGY0NoYXJTZXQgKikgdi51LmMpOworCWlmICghdi51LmMpCisJICAgIHYudHlwZSA9IEZjVHlwZVZvaWQ7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKK3ZvaWQKK0ZjVmFsdWVMaXN0RGVzdHJveSAoRmNWYWx1ZUxpc3QgKmwpCit7CisgICAgRmNWYWx1ZUxpc3QgICAgKm5leHQ7CisgICAgZm9yICg7IGw7IGwgPSBuZXh0KQorICAgIHsKKwlzd2l0Y2ggKGwtPnZhbHVlLnR5cGUpIHsKKwljYXNlIEZjVHlwZVN0cmluZzoKKwkgICAgRmNTdHJGcmVlICgoRmNDaGFyOCAqKSBsLT52YWx1ZS51LnMpOworCSAgICBicmVhazsKKwljYXNlIEZjVHlwZU1hdHJpeDoKKwkgICAgRmNNYXRyaXhGcmVlICgoRmNNYXRyaXggKikgbC0+dmFsdWUudS5tKTsKKwkgICAgYnJlYWs7CisJY2FzZSBGY1R5cGVDaGFyU2V0OgorCSAgICBGY0NoYXJTZXREZXN0cm95ICgoRmNDaGFyU2V0ICopIGwtPnZhbHVlLnUuYyk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKwluZXh0ID0gbC0+bmV4dDsKKwlGY01lbUZyZWUgKEZDX01FTV9WQUxMSVNULCBzaXplb2YgKEZjVmFsdWVMaXN0KSk7CisJZnJlZSAobCk7CisgICAgfQorfQorCit2b2lkCitGY1BhdHRlcm5EZXN0cm95IChGY1BhdHRlcm4gKnApCit7CisgICAgaW50CQkgICAgaTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtOyBpKyspCisJRmNWYWx1ZUxpc3REZXN0cm95IChwLT5lbHRzW2ldLnZhbHVlcyk7CisKKyAgICBwLT5udW0gPSAwOworICAgIGlmIChwLT5lbHRzKQorICAgIHsKKwlGY01lbUZyZWUgKEZDX01FTV9QQVRFTFQsIHAtPnNpemUgKiBzaXplb2YgKEZjUGF0dGVybkVsdCkpOworCWZyZWUgKHAtPmVsdHMpOworCXAtPmVsdHMgPSAwOworICAgIH0KKyAgICBwLT5zaXplID0gMDsKKyAgICBGY01lbUZyZWUgKEZDX01FTV9QQVRURVJOLCBzaXplb2YgKEZjUGF0dGVybikpOworICAgIGZyZWUgKHApOworfQorCitGY1BhdHRlcm5FbHQgKgorRmNQYXR0ZXJuRmluZCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjQm9vbCBpbnNlcnQpCit7CisgICAgaW50CQkgICAgaTsKKyAgICBpbnQJCSAgICBzOworICAgIEZjUGF0dGVybkVsdCAgICplOworICAgIAorICAgIC8qIG1hdGNoIGV4aXN0aW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQorICAgIHsKKwlpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAob2JqZWN0LCBwLT5lbHRzW2ldLm9iamVjdCkpCisJICAgIHJldHVybiAmcC0+ZWx0c1tpXTsKKyAgICB9CisKKyAgICBpZiAoIWluc2VydCkKKwlyZXR1cm4gRmNGYWxzZTsKKworICAgIC8qIGdyb3cgYXJyYXkgKi8KKyAgICBpZiAoaSA9PSBwLT5zaXplKQorICAgIHsKKwlzID0gcC0+c2l6ZSArIDE2OworCWlmIChwLT5lbHRzKQorCSAgICBlID0gKEZjUGF0dGVybkVsdCAqKSByZWFsbG9jIChwLT5lbHRzLCBzICogc2l6ZW9mIChGY1BhdHRlcm5FbHQpKTsKKwllbHNlCisJICAgIGUgPSAoRmNQYXR0ZXJuRWx0ICopIG1hbGxvYyAocyAqIHNpemVvZiAoRmNQYXR0ZXJuRWx0KSk7CisJaWYgKCFlKQorCSAgICByZXR1cm4gRmNGYWxzZTsKKwlwLT5lbHRzID0gZTsKKwlpZiAocC0+c2l6ZSkKKwkgICAgRmNNZW1GcmVlIChGQ19NRU1fUEFURUxULCBwLT5zaXplICogc2l6ZW9mIChGY1BhdHRlcm5FbHQpKTsKKwlGY01lbUFsbG9jIChGQ19NRU1fUEFURUxULCBzICogc2l6ZW9mIChGY1BhdHRlcm5FbHQpKTsKKwl3aGlsZSAocC0+c2l6ZSA8IHMpCisJeworCSAgICBwLT5lbHRzW3AtPnNpemVdLm9iamVjdCA9IDA7CisJICAgIHAtPmVsdHNbcC0+c2l6ZV0udmFsdWVzID0gMDsKKwkgICAgcC0+c2l6ZSsrOworCX0KKyAgICB9CisgICAgCisgICAgLyogYnVtcCBjb3VudCAqLworICAgIHAtPm51bSsrOworICAgIAorICAgIHAtPmVsdHNbaV0ub2JqZWN0ID0gb2JqZWN0OworICAgIAorICAgIHJldHVybiAmcC0+ZWx0c1tpXTsKK30KKworRmNCb29sCitGY1BhdHRlcm5BZGQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKQoreworICAgIEZjUGF0dGVybkVsdCAgICplOworICAgIEZjVmFsdWVMaXN0ICAgICpuZXcsICoqcHJldjsKKworICAgIG5ldyA9IChGY1ZhbHVlTGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNWYWx1ZUxpc3QpKTsKKyAgICBpZiAoIW5ldykKKwlnb3RvIGJhaWwwOworCisgICAgRmNNZW1BbGxvYyAoRkNfTUVNX1ZBTExJU1QsIHNpemVvZiAoRmNWYWx1ZUxpc3QpKTsKKyAgICAvKiBkdXAgc3RyaW5nICovCisgICAgdmFsdWUgPSBGY1ZhbHVlU2F2ZSAodmFsdWUpOworICAgIGlmICh2YWx1ZS50eXBlID09IEZjVHlwZVZvaWQpCisJZ290byBiYWlsMTsKKworICAgIG5ldy0+dmFsdWUgPSB2YWx1ZTsKKyAgICBuZXctPm5leHQgPSAwOworICAgIAorICAgIGUgPSBGY1BhdHRlcm5GaW5kIChwLCBvYmplY3QsIEZjVHJ1ZSk7CisgICAgaWYgKCFlKQorCWdvdG8gYmFpbDI7CisgICAgCisgICAgaWYgKGFwcGVuZCkKKyAgICB7CisJZm9yIChwcmV2ID0gJmUtPnZhbHVlczsgKnByZXY7IHByZXYgPSAmKCpwcmV2KS0+bmV4dCk7CisJKnByZXYgPSBuZXc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbmV3LT5uZXh0ID0gZS0+dmFsdWVzOworCWUtPnZhbHVlcyA9IG5ldzsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEZjVHJ1ZTsKKworYmFpbDI6ICAgIAorICAgIHN3aXRjaCAodmFsdWUudHlwZSkgeworICAgIGNhc2UgRmNUeXBlU3RyaW5nOgorCUZjU3RyRnJlZSAoKEZjQ2hhcjggKikgdmFsdWUudS5zKTsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZU1hdHJpeDoKKwlGY01hdHJpeEZyZWUgKChGY01hdHJpeCAqKSB2YWx1ZS51Lm0pOworCWJyZWFrOworICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKKwlGY0NoYXJTZXREZXN0cm95ICgoRmNDaGFyU2V0ICopIHZhbHVlLnUuYyk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9CitiYWlsMToKKyAgICBGY01lbUZyZWUgKEZDX01FTV9WQUxMSVNULCBzaXplb2YgKEZjVmFsdWVMaXN0KSk7CisgICAgZnJlZSAobmV3KTsKK2JhaWwwOgorICAgIHJldHVybiBGY0ZhbHNlOworfQorCitGY0Jvb2wKK0ZjUGF0dGVybkRlbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpCit7CisgICAgRmNQYXR0ZXJuRWx0ICAgKmU7CisgICAgaW50CQkgICAgaTsKKworICAgIGUgPSBGY1BhdHRlcm5GaW5kIChwLCBvYmplY3QsIEZjRmFsc2UpOworICAgIGlmICghZSkKKwlyZXR1cm4gRmNGYWxzZTsKKworICAgIGkgPSBlIC0gcC0+ZWx0czsKKyAgICAKKyAgICAvKiBkZXN0cm95IHZhbHVlICovCisgICAgRmNWYWx1ZUxpc3REZXN0cm95IChlLT52YWx1ZXMpOworICAgIAorICAgIC8qIHNodWZmbGUgZXhpc3Rpbmcgb25lcyBkb3duICovCisgICAgbWVtbW92ZSAoZSwgZSsxLCAocC0+ZWx0cyArIHAtPm51bSAtIChlICsgMSkpICogc2l6ZW9mIChGY1BhdHRlcm5FbHQpKTsKKyAgICBwLT5udW0tLTsKKyAgICBwLT5lbHRzW3AtPm51bV0ub2JqZWN0ID0gMDsKKyAgICBwLT5lbHRzW3AtPm51bV0udmFsdWVzID0gMDsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitGY0Jvb2wKK0ZjUGF0dGVybkFkZEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaSkKK3sKKyAgICBGY1ZhbHVlCXY7CisKKyAgICB2LnR5cGUgPSBGY1R5cGVJbnRlZ2VyOworICAgIHYudS5pID0gaTsKKyAgICByZXR1cm4gRmNQYXR0ZXJuQWRkIChwLCBvYmplY3QsIHYsIEZjVHJ1ZSk7Cit9CisKK0ZjQm9vbAorRmNQYXR0ZXJuQWRkRG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgZG91YmxlIGQpCit7CisgICAgRmNWYWx1ZQl2OworCisgICAgdi50eXBlID0gRmNUeXBlRG91YmxlOworICAgIHYudS5kID0gZDsKKyAgICByZXR1cm4gRmNQYXR0ZXJuQWRkIChwLCBvYmplY3QsIHYsIEZjVHJ1ZSk7Cit9CisKKworRmNCb29sCitGY1BhdHRlcm5BZGRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBjaGFyICpzKQoreworICAgIEZjVmFsdWUJdjsKKworICAgIHYudHlwZSA9IEZjVHlwZVN0cmluZzsKKyAgICB2LnUucyA9IChjaGFyICopIHM7CisgICAgcmV0dXJuIEZjUGF0dGVybkFkZCAocCwgb2JqZWN0LCB2LCBGY1RydWUpOworfQorCitGY0Jvb2wKK0ZjUGF0dGVybkFkZE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjTWF0cml4ICpzKQoreworICAgIEZjVmFsdWUJdjsKKworICAgIHYudHlwZSA9IEZjVHlwZU1hdHJpeDsKKyAgICB2LnUubSA9IChGY01hdHJpeCAqKSBzOworICAgIHJldHVybiBGY1BhdHRlcm5BZGQgKHAsIG9iamVjdCwgdiwgRmNUcnVlKTsKK30KKworCitGY0Jvb2wKK0ZjUGF0dGVybkFkZEJvb2wgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY0Jvb2wgYikKK3sKKyAgICBGY1ZhbHVlCXY7CisKKyAgICB2LnR5cGUgPSBGY1R5cGVCb29sOworICAgIHYudS5iID0gYjsKKyAgICByZXR1cm4gRmNQYXR0ZXJuQWRkIChwLCBvYmplY3QsIHYsIEZjVHJ1ZSk7Cit9CisKK0ZjQm9vbAorRmNQYXR0ZXJuQWRkQ2hhclNldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjQ2hhclNldCAqYykKK3sKKyAgICBGY1ZhbHVlCXY7CisKKyAgICB2LnR5cGUgPSBGY1R5cGVDaGFyU2V0OworICAgIHYudS5jID0gKEZjQ2hhclNldCAqKSBjOworICAgIHJldHVybiBGY1BhdHRlcm5BZGQgKHAsIG9iamVjdCwgdiwgRmNUcnVlKTsKK30KKworRmNSZXN1bHQKK0ZjUGF0dGVybkdldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdikKK3sKKyAgICBGY1BhdHRlcm5FbHQgICAqZTsKKyAgICBGY1ZhbHVlTGlzdCAgICAqbDsKKworICAgIGUgPSBGY1BhdHRlcm5GaW5kIChwLCBvYmplY3QsIEZjRmFsc2UpOworICAgIGlmICghZSkKKwlyZXR1cm4gRmNSZXN1bHROb01hdGNoOworICAgIGZvciAobCA9IGUtPnZhbHVlczsgbDsgbCA9IGwtPm5leHQpCisgICAgeworCWlmICghaWQpCisJeworCSAgICAqdiA9IGwtPnZhbHVlOworCSAgICByZXR1cm4gRmNSZXN1bHRNYXRjaDsKKwl9CisJaWQtLTsKKyAgICB9CisgICAgcmV0dXJuIEZjUmVzdWx0Tm9JZDsKK30KKworRmNSZXN1bHQKK0ZjUGF0dGVybkdldEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaWQsIGludCAqaSkKK3sKKyAgICBGY1ZhbHVlCXY7CisgICAgRmNSZXN1bHQJcjsKKworICAgIHIgPSBGY1BhdHRlcm5HZXQgKHAsIG9iamVjdCwgaWQsICZ2KTsKKyAgICBpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQorCXJldHVybiByOworICAgIHN3aXRjaCAodi50eXBlKSB7CisgICAgY2FzZSBGY1R5cGVEb3VibGU6CisJKmkgPSAoaW50KSB2LnUuZDsKKwlicmVhazsKKyAgICBjYXNlIEZjVHlwZUludGVnZXI6CisJKmkgPSB2LnUuaTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRmNSZXN1bHRUeXBlTWlzbWF0Y2g7CisgICAgfQorICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOworfQorCitGY1Jlc3VsdAorRmNQYXR0ZXJuR2V0RG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBkb3VibGUgKmQpCit7CisgICAgRmNWYWx1ZQl2OworICAgIEZjUmVzdWx0CXI7CisKKyAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CisgICAgaWYgKHIgIT0gRmNSZXN1bHRNYXRjaCkKKwlyZXR1cm4gcjsKKyAgICBzd2l0Y2ggKHYudHlwZSkgeworICAgIGNhc2UgRmNUeXBlRG91YmxlOgorCSpkID0gdi51LmQ7CisJYnJlYWs7CisgICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgorCSpkID0gKGRvdWJsZSkgdi51Lmk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEZjUmVzdWx0VHlwZU1pc21hdGNoOworICAgIH0KKyAgICByZXR1cm4gRmNSZXN1bHRNYXRjaDsKK30KKworRmNSZXN1bHQKK0ZjUGF0dGVybkdldFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgY2hhciAqKiBzKQoreworICAgIEZjVmFsdWUJdjsKKyAgICBGY1Jlc3VsdAlyOworCisgICAgciA9IEZjUGF0dGVybkdldCAocCwgb2JqZWN0LCBpZCwgJnYpOworICAgIGlmIChyICE9IEZjUmVzdWx0TWF0Y2gpCisJcmV0dXJuIHI7CisgICAgaWYgKHYudHlwZSAhPSBGY1R5cGVTdHJpbmcpCisgICAgICAgIHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaDsKKyAgICAqcyA9IChjaGFyICopIHYudS5zOworICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOworfQorCitGY1Jlc3VsdAorRmNQYXR0ZXJuR2V0TWF0cml4IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBGY01hdHJpeCAqKm0pCit7CisgICAgRmNWYWx1ZQl2OworICAgIEZjUmVzdWx0CXI7CisKKyAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CisgICAgaWYgKHIgIT0gRmNSZXN1bHRNYXRjaCkKKwlyZXR1cm4gcjsKKyAgICBpZiAodi50eXBlICE9IEZjVHlwZU1hdHJpeCkKKyAgICAgICAgcmV0dXJuIEZjUmVzdWx0VHlwZU1pc21hdGNoOworICAgICptID0gKEZjTWF0cml4ICopIHYudS5tOworICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOworfQorCisKK0ZjUmVzdWx0CitGY1BhdHRlcm5HZXRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBGY0Jvb2wgKmIpCit7CisgICAgRmNWYWx1ZQl2OworICAgIEZjUmVzdWx0CXI7CisKKyAgICByID0gRmNQYXR0ZXJuR2V0IChwLCBvYmplY3QsIGlkLCAmdik7CisgICAgaWYgKHIgIT0gRmNSZXN1bHRNYXRjaCkKKwlyZXR1cm4gcjsKKyAgICBpZiAodi50eXBlICE9IEZjVHlwZUJvb2wpCisgICAgICAgIHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaDsKKyAgICAqYiA9IHYudS5iOworICAgIHJldHVybiBGY1Jlc3VsdE1hdGNoOworfQorCitGY1Jlc3VsdAorRmNQYXR0ZXJuR2V0Q2hhclNldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNDaGFyU2V0ICoqYykKK3sKKyAgICBGY1ZhbHVlCXY7CisgICAgRmNSZXN1bHQJcjsKKworICAgIHIgPSBGY1BhdHRlcm5HZXQgKHAsIG9iamVjdCwgaWQsICZ2KTsKKyAgICBpZiAociAhPSBGY1Jlc3VsdE1hdGNoKQorCXJldHVybiByOworICAgIGlmICh2LnR5cGUgIT0gRmNUeXBlQ2hhclNldCkKKyAgICAgICAgcmV0dXJuIEZjUmVzdWx0VHlwZU1pc21hdGNoOworICAgICpjID0gKEZjQ2hhclNldCAqKSB2LnUuYzsKKyAgICByZXR1cm4gRmNSZXN1bHRNYXRjaDsKK30KKworRmNQYXR0ZXJuICoKK0ZjUGF0dGVybkR1cGxpY2F0ZSAoRmNQYXR0ZXJuICpvcmlnKQoreworICAgIEZjUGF0dGVybgkgICAgKm5ldzsKKyAgICBpbnQJCSAgICBpOworICAgIEZjVmFsdWVMaXN0ICAgICpsOworCisgICAgbmV3ID0gRmNQYXR0ZXJuQ3JlYXRlICgpOworICAgIGlmICghbmV3KQorCWdvdG8gYmFpbDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3JpZy0+bnVtOyBpKyspCisgICAgeworCWZvciAobCA9IG9yaWctPmVsdHNbaV0udmFsdWVzOyBsOyBsID0gbC0+bmV4dCkKKwkgICAgaWYgKCFGY1BhdHRlcm5BZGQgKG5ldywgb3JpZy0+ZWx0c1tpXS5vYmplY3QsIGwtPnZhbHVlLCBGY1RydWUpKQorCQlnb3RvIGJhaWwxOworICAgIH0KKworICAgIHJldHVybiBuZXc7CisKK2JhaWwxOgorICAgIEZjUGF0dGVybkRlc3Ryb3kgKG5ldyk7CitiYWlsMDoKKyAgICByZXR1cm4gMDsKK30KKworRmNQYXR0ZXJuICoKK0ZjUGF0dGVyblZhQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgdmFfbGlzdCB2YSkKK3sKKyAgICBGY1BhdHRlcm4JKnJldDsKKyAgICAKKyAgICBGY1BhdHRlcm5WYXBCdWlsZCAocmV0LCBvcmlnLCB2YSk7CisgICAgcmV0dXJuIHJldDsKK30KKworRmNQYXR0ZXJuICoKK0ZjUGF0dGVybkJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIC4uLikKK3sKKyAgICB2YV9saXN0CXZhOworICAgIAorICAgIHZhX3N0YXJ0ICh2YSwgb3JpZyk7CisgICAgRmNQYXR0ZXJuVmFwQnVpbGQgKG9yaWcsIG9yaWcsIHZhKTsKKyAgICB2YV9lbmQgKHZhKTsKKyAgICByZXR1cm4gb3JpZzsKK30KZGlmZiAtLWdpdCBhL3NyYy9mY3N0ci5jIGIvc3JjL2Zjc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4ODkwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mY3N0ci5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogJFhGcmVlODY6ICQKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmY2ludC5oIgorCitjaGFyICoKK0ZjU3RyQ29weSAoY29uc3QgY2hhciAqcykKK3sKKyAgICBjaGFyCSpyOworCisgICAgaWYgKCFzKQorCXJldHVybiAwOworICAgIHIgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAocykgKyAxKTsKKyAgICBpZiAoIXIpCisJcmV0dXJuIDA7CisgICAgRmNNZW1BbGxvYyAoRkNfTUVNX1NUUklORywgc3RybGVuIChzKSArIDEpOworICAgIHN0cmNweSAociwgcyk7CisgICAgcmV0dXJuIHI7Cit9CisKK2NoYXIgKgorRmNTdHJQbHVzIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgICAgaW50CSAgICBsID0gc3RybGVuIChzMSkgKyBzdHJsZW4gKHMyKSArIDE7CisgICAgY2hhciAgICAqcyA9IG1hbGxvYyAobCk7CisKKyAgICBpZiAoIXMpCisJcmV0dXJuIDA7CisgICAgRmNNZW1BbGxvYyAoRkNfTUVNX1NUUklORywgbCk7CisgICAgc3RyY3B5IChzLCBzMSk7CisgICAgc3RyY2F0IChzLCBzMik7CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQKK0ZjU3RyRnJlZSAoY2hhciAqcykKK3sKKyAgICBGY01lbUZyZWUgKEZDX01FTV9TVFJJTkcsIHN0cmxlbiAocykgKyAxKTsKKyAgICBmcmVlIChzKTsKK30KKworaW50CitGY1N0ckNtcElnbm9yZUNhc2UgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKyAgICBjaGFyICAgIGMxLCBjMjsKKyAgICAKKyAgICBmb3IgKDs7KSAKKyAgICB7CisJYzEgPSAqczErKzsKKwljMiA9ICpzMisrOworCWlmICghYzEgfHwgIWMyKQorCSAgICBicmVhazsKKwljMSA9IEZjVG9Mb3dlciAoYzEpOworCWMyID0gRmNUb0xvd2VyIChjMik7CisJaWYgKGMxICE9IGMyKQorCSAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpIGMyIC0gKGludCkgYzE7Cit9CisKK2ludAorRmNVdGY4VG9VY3M0IChGY0NoYXI4ICAgKnNyY19vcmlnLAorCSAgICAgIEZjQ2hhcjMyICAqZHN0LAorCSAgICAgIGludAlsZW4pCit7CisgICAgRmNDaGFyOAkqc3JjID0gc3JjX29yaWc7CisgICAgRmNDaGFyOAlzOworICAgIGludAkJZXh0cmE7CisgICAgRmNDaGFyMzIJcmVzdWx0OworCisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybiAwOworICAgIAorICAgIHMgPSAqc3JjKys7CisgICAgbGVuLS07CisgICAgCisgICAgaWYgKCEocyAmIDB4ODApKQorICAgIHsKKwlyZXN1bHQgPSBzOworCWV4dHJhID0gMDsKKyAgICB9IAorICAgIGVsc2UgaWYgKCEocyAmIDB4NDApKQorICAgIHsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCEocyAmIDB4MjApKQorICAgIHsKKwlyZXN1bHQgPSBzICYgMHgxZjsKKwlleHRyYSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKCEocyAmIDB4MTApKQorICAgIHsKKwlyZXN1bHQgPSBzICYgMHhmOworCWV4dHJhID0gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoIShzICYgMHgwOCkpCisgICAgeworCXJlc3VsdCA9IHMgJiAweDA3OworCWV4dHJhID0gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoIShzICYgMHgwNCkpCisgICAgeworCXJlc3VsdCA9IHMgJiAweDAzOworCWV4dHJhID0gNDsKKyAgICB9CisgICAgZWxzZSBpZiAoICEgKHMgJiAweDAyKSkKKyAgICB7CisJcmVzdWx0ID0gcyAmIDB4MDE7CisJZXh0cmEgPSA1OworICAgIH0KKyAgICBlbHNlCisgICAgeworCXJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGV4dHJhID4gbGVuKQorCXJldHVybiAtMTsKKyAgICAKKyAgICB3aGlsZSAoZXh0cmEtLSkKKyAgICB7CisJcmVzdWx0IDw8PSA2OworCXMgPSAqc3JjKys7CisJCisJaWYgKChzICYgMHhjMCkgIT0gMHg4MCkKKwkgICAgcmV0dXJuIC0xOworCQorCXJlc3VsdCB8PSBzICYgMHgzZjsKKyAgICB9CisgICAgKmRzdCA9IHJlc3VsdDsKKyAgICByZXR1cm4gc3JjIC0gc3JjX29yaWc7Cit9CisKK0ZjQm9vbAorRmNVdGY4TGVuIChGY0NoYXI4CSpzdHJpbmcsCisJICAgIGludAkJbGVuLAorCSAgICBpbnQJCSpuY2hhciwKKwkgICAgaW50CQkqd2NoYXIpCit7CisgICAgaW50CQluOworICAgIGludAkJY2xlbjsKKyAgICBGY0NoYXIzMgljOworICAgIEZjQ2hhcjMyCW1heDsKKyAgICAKKyAgICBuID0gMDsKKyAgICBtYXggPSAwOworICAgIHdoaWxlIChsZW4pCisgICAgeworCWNsZW4gPSBGY1V0ZjhUb1VjczQgKHN0cmluZywgJmMsIGxlbik7CisJaWYgKGNsZW4gPD0gMCkJLyogbWFsZm9ybWVkIFVURjggc3RyaW5nICovCisJICAgIHJldHVybiBGY0ZhbHNlOworCWlmIChjID4gbWF4KQorCSAgICBtYXggPSBjOworCXN0cmluZyArPSBjbGVuOworCWxlbiAtPSBjbGVuOworCW4rKzsKKyAgICB9CisgICAgKm5jaGFyID0gbjsKKyAgICBpZiAobWF4ID49IDB4MTAwMDApCisJKndjaGFyID0gNDsKKyAgICBlbHNlIGlmIChtYXggPiAweDEwMCkKKwkqd2NoYXIgPSAyOworICAgIGVsc2UKKwkqd2NoYXIgPSAxOworICAgIHJldHVybiBGY1RydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvZmN4bWwuYyBiL3NyYy9mY3htbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTI0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmN4bWwuYwpAQCAtMCwwICsxLDEwMzIgQEAKKy8qCisgKiAkWEZyZWU4NjogJAorICoKKyAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJmY2ludC5oIgorCitzdGF0aWMgeG1sUGFyc2VySW5wdXRQdHIKK0ZjRW50aXR5TG9hZGVyIChjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKmlkLCB4bWxQYXJzZXJDdHh0UHRyIGN0eHQpCit7CisgICAgeG1sUGFyc2VySW5wdXRQdHIJcmV0OworICAgIGNoYXIJCSpmaWxlOworCisgICAgZmlsZSA9IEZjQ29uZmlnRmlsZW5hbWUgKHVybCk7CisgICAgaWYgKCFmaWxlKQorCXJldHVybiAwOworICAgIHJldCA9IHhtbE5ld0lucHV0RnJvbUZpbGUgKGN0eHQsIGZpbGUpOworICAgIGZyZWUgKGZpbGUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3htbERvY1B0cgorRmNDb25maWdMb2FkIChjb25zdCBjaGFyICpmaWxlKQoreworICAgIHhtbERvY1B0cgkJICAgIGRvYzsKKyAgICB4bWxFeHRlcm5hbEVudGl0eUxvYWRlciBwcmV2aW91czsKKworICAgIHByZXZpb3VzID0geG1sR2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIgKCk7CisgICAgeG1sU2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIgKEZjRW50aXR5TG9hZGVyKTsKKyAgICBkb2MgPSB4bWxQYXJzZUZpbGUgKGZpbGUpOworICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyIChwcmV2aW91cyk7CisgICAgcmV0dXJuIGRvYzsKK30KKworI2lmIDAKK2ludAorRmNDb25maWdTYXZlIChjaGFyICpmaWxlLCB4bWxEb2NQdHIgZG9jKQoreworfQorI2VuZGlmCisKK0ZjVGVzdCAqCitGY1Rlc3RDcmVhdGUgKEZjUXVhbCBxdWFsLCBjb25zdCBjaGFyICpmaWVsZCwgRmNPcCBjb21wYXJlLCBGY0V4cHIgKmV4cHIpCit7CisgICAgRmNUZXN0CSp0ZXN0ID0gKEZjVGVzdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNUZXN0KSk7OworCisgICAgaWYgKHRlc3QpCisgICAgeworCXRlc3QtPm5leHQgPSAwOworCXRlc3QtPnF1YWwgPSBxdWFsOworCXRlc3QtPmZpZWxkID0gRmNTdHJDb3B5IChmaWVsZCk7CisJdGVzdC0+b3AgPSBjb21wYXJlOworCXRlc3QtPmV4cHIgPSBleHByOworICAgIH0KKyAgICByZXR1cm4gdGVzdDsKK30KKwordm9pZAorRmNUZXN0RGVzdHJveSAoRmNUZXN0ICp0ZXN0KQoreworICAgIGlmICh0ZXN0LT5uZXh0KQorCUZjVGVzdERlc3Ryb3kgKHRlc3QtPm5leHQpOworICAgIEZjRXhwckRlc3Ryb3kgKHRlc3QtPmV4cHIpOworICAgIEZjU3RyRnJlZSAoKEZjQ2hhcjggKikgdGVzdC0+ZmllbGQpOworICAgIGZyZWUgKHRlc3QpOworfQorCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlSW50ZWdlciAoaW50IGkpCit7CisgICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+b3AgPSBGY09wSW50ZWdlcjsKKwllLT51Lml2YWwgPSBpOworICAgIH0KKyAgICByZXR1cm4gZTsKK30KKworRmNFeHByICoKK0ZjRXhwckNyZWF0ZURvdWJsZSAoZG91YmxlIGQpCit7CisgICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+b3AgPSBGY09wRG91YmxlOworCWUtPnUuZHZhbCA9IGQ7CisgICAgfQorICAgIHJldHVybiBlOworfQorCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlU3RyaW5nIChjb25zdCBjaGFyICpzKQoreworICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOworCisgICAgaWYgKGUpCisgICAgeworCWUtPm9wID0gRmNPcFN0cmluZzsKKwllLT51LnN2YWwgPSBGY1N0ckNvcHkgKHMpOworICAgIH0KKyAgICByZXR1cm4gZTsKK30KKworRmNFeHByICoKK0ZjRXhwckNyZWF0ZU1hdHJpeCAoY29uc3QgRmNNYXRyaXggKm0pCit7CisgICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+b3AgPSBGY09wTWF0cml4OworCWUtPnUubXZhbCA9IEZjTWF0cml4Q29weSAobSk7CisgICAgfQorICAgIHJldHVybiBlOworfQorCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlQm9vbCAoRmNCb29sIGIpCit7CisgICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+b3AgPSBGY09wQm9vbDsKKwllLT51LmJ2YWwgPSBiOworICAgIH0KKyAgICByZXR1cm4gZTsKK30KKworRmNFeHByICoKK0ZjRXhwckNyZWF0ZU5pbCAodm9pZCkKK3sKKyAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKKworICAgIGlmIChlKQorICAgIHsKKwllLT5vcCA9IEZjT3BOaWw7CisgICAgfQorICAgIHJldHVybiBlOworfQorCitGY0V4cHIgKgorRmNFeHByQ3JlYXRlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKQoreworICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOworCisgICAgaWYgKGUpCisgICAgeworCWUtPm9wID0gRmNPcEZpZWxkOworCWUtPnUuZmllbGQgPSBGY1N0ckNvcHkgKGZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGU7Cit9CisKK0ZjRXhwciAqCitGY0V4cHJDcmVhdGVDb25zdCAoY29uc3QgY2hhciAqY29uc3RhbnQpCit7CisgICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+b3AgPSBGY09wQ29uc3Q7CisJZS0+dS5jb25zdGFudCA9IEZjU3RyQ29weSAoY29uc3RhbnQpOworICAgIH0KKyAgICByZXR1cm4gZTsKK30KKworRmNFeHByICoKK0ZjRXhwckNyZWF0ZU9wIChGY0V4cHIgKmxlZnQsIEZjT3Agb3AsIEZjRXhwciAqcmlnaHQpCit7CisgICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+b3AgPSBvcDsKKwllLT51LnRyZWUubGVmdCA9IGxlZnQ7CisJZS0+dS50cmVlLnJpZ2h0ID0gcmlnaHQ7CisgICAgfQorICAgIHJldHVybiBlOworfQorCit2b2lkCitGY0V4cHJEZXN0cm95IChGY0V4cHIgKmUpCit7CisgICAgc3dpdGNoIChlLT5vcCkgeworICAgIGNhc2UgRmNPcEludGVnZXI6CisJYnJlYWs7CisgICAgY2FzZSBGY09wRG91YmxlOgorCWJyZWFrOworICAgIGNhc2UgRmNPcFN0cmluZzoKKwlGY1N0ckZyZWUgKGUtPnUuc3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBGY09wTWF0cml4OgorCUZjTWF0cml4RnJlZSAoZS0+dS5tdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BDaGFyU2V0OgorCUZjQ2hhclNldERlc3Ryb3kgKGUtPnUuY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBGY09wQm9vbDoKKwlicmVhazsKKyAgICBjYXNlIEZjT3BGaWVsZDoKKwlGY1N0ckZyZWUgKGUtPnUuZmllbGQpOworCWJyZWFrOworICAgIGNhc2UgRmNPcENvbnN0OgorCUZjU3RyRnJlZSAoZS0+dS5jb25zdGFudCk7CisJYnJlYWs7CisgICAgY2FzZSBGY09wQXNzaWduOgorICAgIGNhc2UgRmNPcEFzc2lnblJlcGxhY2U6CisgICAgY2FzZSBGY09wUHJlcGVuZDoKKyAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6CisgICAgY2FzZSBGY09wQXBwZW5kOgorICAgIGNhc2UgRmNPcEFwcGVuZExhc3Q6CisJYnJlYWs7CisgICAgY2FzZSBGY09wT3I6CisgICAgY2FzZSBGY09wQW5kOgorICAgIGNhc2UgRmNPcEVxdWFsOgorICAgIGNhc2UgRmNPcENvbnRhaW5zOgorICAgIGNhc2UgRmNPcE5vdEVxdWFsOgorICAgIGNhc2UgRmNPcExlc3M6CisgICAgY2FzZSBGY09wTGVzc0VxdWFsOgorICAgIGNhc2UgRmNPcE1vcmU6CisgICAgY2FzZSBGY09wTW9yZUVxdWFsOgorICAgIGNhc2UgRmNPcFBsdXM6CisgICAgY2FzZSBGY09wTWludXM6CisgICAgY2FzZSBGY09wVGltZXM6CisgICAgY2FzZSBGY09wRGl2aWRlOgorICAgIGNhc2UgRmNPcFF1ZXN0OgorICAgIGNhc2UgRmNPcENvbW1hOgorCUZjRXhwckRlc3Ryb3kgKGUtPnUudHJlZS5yaWdodCk7CisJLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBGY09wTm90OgorCUZjRXhwckRlc3Ryb3kgKGUtPnUudHJlZS5sZWZ0KTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BOaWw6CisgICAgY2FzZSBGY09wSW52YWxpZDoKKwlicmVhazsKKyAgICB9CisgICAgZnJlZSAoZSk7Cit9CisKK0ZjRWRpdCAqCitGY0VkaXRDcmVhdGUgKGNvbnN0IGNoYXIgKmZpZWxkLCBGY09wIG9wLCBGY0V4cHIgKmV4cHIpCit7CisgICAgRmNFZGl0ICplID0gKEZjRWRpdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNFZGl0KSk7CisKKyAgICBpZiAoZSkKKyAgICB7CisJZS0+bmV4dCA9IDA7CisJZS0+ZmllbGQgPSBmaWVsZDsgICAvKiBhbHJlYWR5IHNhdmVkIGluIGdyYW1tYXIgKi8KKwllLT5vcCA9IG9wOworCWUtPmV4cHIgPSBleHByOworICAgIH0KKyAgICByZXR1cm4gZTsKK30KKwordm9pZAorRmNFZGl0RGVzdHJveSAoRmNFZGl0ICplKQoreworICAgIGlmIChlLT5uZXh0KQorCUZjRWRpdERlc3Ryb3kgKGUtPm5leHQpOworICAgIEZjU3RyRnJlZSAoKEZjQ2hhcjggKikgZS0+ZmllbGQpOworICAgIGlmIChlLT5leHByKQorCUZjRXhwckRlc3Ryb3kgKGUtPmV4cHIpOworfQorCitjaGFyICoKK0ZjQ29uZmlnU2F2ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCkKK3sKKyAgICByZXR1cm4gRmNTdHJDb3B5IChmaWVsZCk7Cit9CisKK3N0YXRpYyB2b2lkCitGY0NvbmZpZ1BhcnNlRXJyb3IgKGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QJYXJnczsKKworICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworICAgIGZwcmludGYgKHN0ZGVyciwgImZvbnQgY29uZmlndXJhdGlvbiBlcnJvcjogIik7CisgICAgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIHZhX2VuZCAoYXJncyk7Cit9CisKK3N0YXRpYyBjaGFyICoKK0ZjQ29uZmlnQ29udGVudCAoeG1sRG9jUHRyICAgIGRvYywKKwkJIHhtbE5vZGVQdHIgICBub2RlKQoreworICAgIGNoYXIJICAgICpjb250ZW50OworICAgIAorICAgIGNvbnRlbnQgPSB4bWxOb2RlTGlzdEdldFN0cmluZyAoZG9jLCBub2RlLT5jaGlsZHJlbiwgMSk7CisgICAgaWYgKCFjb250ZW50KQorICAgIHsKKwlGY0NvbmZpZ1BhcnNlRXJyb3IgKCI8JXM+IG11c3QgaGF2ZSBjb250ZW50IiwKKwkJCSAgICBub2RlLT5uYW1lKTsKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKK3N0YXRpYyBjaGFyICoKK0ZjQ29uZmlnQXR0ciAoeG1sRG9jUHRyCSAgICBkb2MsCisJICAgICAgeG1sQXR0clB0ciAgICBhdHRyKQoreworICAgIGNoYXIJICAgICpjb250ZW50OworICAgIAorICAgIGNvbnRlbnQgPSB4bWxOb2RlTGlzdEdldFN0cmluZyAoZG9jLCBhdHRyLT5jaGlsZHJlbiwgMSk7CisgICAgaWYgKCFjb250ZW50KQorICAgIHsKKwlGY0NvbmZpZ1BhcnNlRXJyb3IgKCJhdHRyaWJ1dGUgJXMgbXVzdCBoYXZlIGEgdmFsdWUiLAorCQkJICAgIGF0dHItPm5hbWUpOworCXJldHVybiBGY0ZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY29udGVudDsKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhciAgICAqbmFtZTsKKyAgICBGY09wICAgIG9wOworfSBmY09wc1tdID0geworICAgIHsgImludCIsCQlGY09wSW50ZWdlcgkgICAgfSwKKyAgICB7ICJkb3VibGUiLAkJRmNPcERvdWJsZQkgICAgfSwKKyAgICB7ICJzdHJpbmciLAkJRmNPcFN0cmluZwkgICAgfSwKKyAgICB7ICJtYXRyaXgiLAkJRmNPcE1hdHJpeAkgICAgfSwKKyAgICB7ICJib29sIiwJCUZjT3BCb29sCSAgICB9LAorICAgIHsgImNoYXJzZXQiLAlGY09wQ2hhclNldAkgICAgfSwKKyAgICB7ICJuYW1lIiwJCUZjT3BGaWVsZAkgICAgfSwKKyAgICB7ICJjb25zdCIsCQlGY09wQ29uc3QJICAgIH0sCisgICAgeyAiZmllbGQiLAkJRmNPcEZpZWxkCSAgICB9LAorICAgIHsgImlmIiwJCUZjT3BRdWVzdAkgICAgfSwKKyAgICB7ICJvciIsCQlGY09wT3IJCSAgICB9LAorICAgIHsgImFuZCIsCQlGY09wQW5kCQkgICAgfSwKKyAgICB7ICJlcSIsCQlGY09wRXF1YWwJICAgIH0sCisgICAgeyAibm90X2VxIiwJCUZjT3BOb3RFcXVhbAkgICAgfSwKKyAgICB7ICJsZXNzIiwJCUZjT3BMZXNzCSAgICB9LAorICAgIHsgImxlc3NfZXEiLAlGY09wTGVzc0VxdWFsCSAgICB9LAorICAgIHsgIm1vcmUiLAkJRmNPcE1vcmUJICAgIH0sCisgICAgeyAibW9yZV9lcSIsCUZjT3BNb3JlRXF1YWwJICAgIH0sCisgICAgeyAicGx1cyIsCQlGY09wUGx1cwkgICAgfSwKKyAgICB7ICJtaW51cyIsCQlGY09wTWludXMJICAgIH0sCisgICAgeyAidGltZXMiLAkJRmNPcFRpbWVzCSAgICB9LAorICAgIHsgImRpdmlkZSIsCQlGY09wRGl2aWRlCSAgICB9LAorICAgIHsgIm5vdCIsCQlGY09wTm90CQkgICAgfSwKKyAgICB7ICJhc3NpZ24iLAkJRmNPcEFzc2lnbgkgICAgfSwKKyAgICB7ICJhc3NpZ25fcmVwbGFjZSIsCUZjT3BBc3NpZ25SZXBsYWNlICAgfSwKKyAgICB7ICJwcmVwZW5kIiwJRmNPcFByZXBlbmQJICAgIH0sCisgICAgeyAicHJlcGVuZF9maXJzdCIsCUZjT3BQcmVwZW5kRmlyc3QgICAgfSwKKyAgICB7ICJhcHBlbmQiLAkJRmNPcEFwcGVuZAkgICAgfSwKKyAgICB7ICJhcHBlbmRfbGFzdCIsCUZjT3BBcHBlbmRMYXN0CSAgICB9LAorfTsKKworI2RlZmluZSBOVU1fT1BTIChzaXplb2YgZmNPcHMgLyBzaXplb2YgZmNPcHNbMF0pCisKK3N0YXRpYyBGY09wCitGY0NvbmZpZ0xleE9wIChjb25zdCBjaGFyICpvcCkKK3sKKyAgICBpbnQJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fT1BTOyBpKyspCisJaWYgKCFzdHJjbXAgKG9wLCBmY09wc1tpXS5uYW1lKSkgcmV0dXJuIGZjT3BzW2ldLm9wOworICAgIHJldHVybiBGY09wSW52YWxpZDsKK30KKworc3RhdGljIEZjQm9vbAorRmNDb25maWdMZXhCb29sIChjb25zdCBjaGFyICpib29sKQoreworICAgIGlmICgqYm9vbCA9PSAndCcgfHwgKmJvb2wgPT0gJ1QnKQorCXJldHVybiBGY1RydWU7CisgICAgaWYgKCpib29sID09ICd5JyB8fCAqYm9vbCA9PSAnWScpCisJcmV0dXJuIEZjVHJ1ZTsKKyAgICBpZiAoKmJvb2wgPT0gJzEnKQorCXJldHVybiBGY1RydWU7CisgICAgcmV0dXJuIEZjRmFsc2U7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjQ29uZmlnUGFyc2VEaXIgKEZjQ29uZmlnCSpjb25maWcsCisJCSAgeG1sRG9jUHRyCWRvYywKKwkJICB4bWxOb2RlUHRyCWRpcikKK3sKKyAgICBjaGFyICAgICpjb250ZW50ID0gRmNDb25maWdDb250ZW50IChkb2MsIGRpcik7CisKKyAgICBpZiAoIWNvbnRlbnQpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgcmV0dXJuIEZjQ29uZmlnQWRkRGlyIChjb25maWcsIGNvbnRlbnQpOworfQorCitzdGF0aWMgRmNCb29sCitGY0NvbmZpZ1BhcnNlQ2FjaGUgKEZjQ29uZmlnCSpjb25maWcsCisJCSAgICB4bWxEb2NQdHIJZG9jLAorCQkgICAgeG1sTm9kZVB0cglkaXIpCit7CisgICAgY2hhciAgICAqY29udGVudCA9IEZjQ29uZmlnQ29udGVudCAoZG9jLCBkaXIpOworCisgICAgaWYgKCFjb250ZW50KQorCXJldHVybiBGY0ZhbHNlOworICAgIHJldHVybiBGY0NvbmZpZ1NldENhY2hlIChjb25maWcsIGNvbnRlbnQpOworfQorCitzdGF0aWMgRmNCb29sCitGY0NvbmZpZ1BhcnNlSW5jbHVkZSAoRmNDb25maWcJICAgICpjb25maWcsCisJCSAgICAgIHhtbERvY1B0cgkgICAgZG9jLAorCQkgICAgICB4bWxOb2RlUHRyICAgIGluYykKK3sKKyAgICBjaGFyCSpjb250ZW50ID0gRmNDb25maWdDb250ZW50IChkb2MsIGluYyk7CisgICAgeG1sQXR0cgkqYXR0cjsKKyAgICBGY0Jvb2wJY29tcGxhaW4gPSBGY1RydWU7CisKKyAgICBpZiAoIWNvbnRlbnQpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgCisgICAgZm9yIChhdHRyID0gaW5jLT5wcm9wZXJ0aWVzOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKKyAgICB7CisJaWYgKGF0dHItPnR5cGUgIT0gWE1MX0FUVFJJQlVURV9OT0RFKQorCSAgICBjb250aW51ZTsKKwlpZiAoIXN0cmNtcCAoYXR0ci0+bmFtZSwgImlnbm9yZV9taXNzaW5nIikpCisJICAgIGNvbXBsYWluID0gIUZjQ29uZmlnTGV4Qm9vbCAoRmNDb25maWdBdHRyIChkb2MsIGF0dHIpKTsKKyAgICB9CisgICAgcmV0dXJuIEZjQ29uZmlnUGFyc2VBbmRMb2FkIChjb25maWcsIGNvbnRlbnQsIGNvbXBsYWluKTsKK30KKworc3RhdGljIEZjQm9vbAorRmNDb25maWdQYXJzZUJsYW5rIChGY0NvbmZpZwkgICAgKmNvbmZpZywKKwkJICAgIHhtbERvY1B0cgkgICAgZG9jLAorCQkgICAgeG1sTm9kZVB0cgkgICAgYmxhbmspCit7CisgICAgeG1sTm9kZQkqbm9kZTsKKyAgICBGY0NoYXIzMgl1Y3M0OworCisgICAgZm9yIChub2RlID0gYmxhbmstPmNoaWxkcmVuOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKKyAgICB7CisJaWYgKG5vZGUtPnR5cGUgIT0gWE1MX0VMRU1FTlRfTk9ERSkKKwkgICAgY29udGludWU7CisJaWYgKCFzdHJjbXAgKG5vZGUtPm5hbWUsICJpbnQiKSkKKwl7CisJICAgIHVjczQgPSAoRmNDaGFyMzIpIHN0cnRvbCAoRmNDb25maWdDb250ZW50IChkb2MsIG5vZGUpLCAwLCAwKTsKKwkgICAgaWYgKCFjb25maWctPmJsYW5rcykKKwkgICAgeworCQljb25maWctPmJsYW5rcyA9IEZjQmxhbmtzQ3JlYXRlICgpOworCQlpZiAoIWNvbmZpZy0+YmxhbmtzKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKCFGY0JsYW5rc0FkZCAoY29uZmlnLT5ibGFua3MsIHVjczQpKQorCQlicmVhazsKKwl9CisgICAgfQorICAgIGlmIChub2RlKQorCXJldHVybiBGY0ZhbHNlOworICAgIHJldHVybiBGY1RydWU7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjQ29uZmlnUGFyc2VDb25maWcgKEZjQ29uZmlnCSAgICAqY29uZmlnLAorCQkgICAgIHhtbERvY1B0cgkgICAgZG9jLAorCQkgICAgIHhtbE5vZGVQdHIJICAgIGNmZykKK3sKKyAgICB4bWxOb2RlCSpub2RlOworCisgICAgZm9yIChub2RlID0gY2ZnLT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisgICAgeworCWlmIChub2RlLT50eXBlICE9IFhNTF9FTEVNRU5UX05PREUpCisJICAgIGNvbnRpbnVlOworCWlmICghc3RyY21wIChub2RlLT5uYW1lLCAiYmxhbmsiKSkKKwl7CisJICAgIGlmICghRmNDb25maWdQYXJzZUJsYW5rIChjb25maWcsIGRvYywgbm9kZSkpCisJCWJyZWFrOworCX0KKyAgICB9CisgICAgaWYgKG5vZGUpCisJcmV0dXJuIEZjRmFsc2U7CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworc3RhdGljIEZjTWF0cml4ICoKK0ZjQ29uZmlnUGFyc2VNYXRyaXggKHhtbERvY1B0cglkb2MsCisJCSAgICAgeG1sTm9kZVB0cglub2RlKQoreworICAgIHN0YXRpYyBGY01hdHJpeCBtOworICAgIGVudW0geyBtX3h4LCBtX3h5LCBtX3l4LCBtX3l5LCBtX2RvbmUgfSBtYXRyaXhfc3RhdGUgPSBtX3h4OworICAgIGRvdWJsZSAgdjsKKyAgICBjaGFyICAgICp0ZXh0OworICAgIAorICAgIEZjTWF0cml4SW5pdCAoJm0pOworCisgICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQorICAgIHsKKwlpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQorCSAgICBjb250aW51ZTsKKwlpZiAoc3RyY21wIChub2RlLT5uYW1lLCAiZG91YmxlIikpCisJICAgIGNvbnRpbnVlOworCXRleHQgPSBGY0NvbmZpZ0NvbnRlbnQgKGRvYywgbm9kZSk7CisJaWYgKCF0ZXh0KQorCSAgICBjb250aW51ZTsKKwl2ID0gc3RydG9kICh0ZXh0LCAwKTsKKwlzd2l0Y2ggKG1hdHJpeF9zdGF0ZSkgeworCWNhc2UgbV94eDogbS54eCA9IHY7IGJyZWFrOworCWNhc2UgbV94eTogbS54eSA9IHY7IGJyZWFrOworCWNhc2UgbV95eDogbS55eCA9IHY7IGJyZWFrOworCWNhc2UgbV95eTogbS55eSA9IHY7IGJyZWFrOworCWRlZmF1bHQ6IGJyZWFrOworCX0KKwltYXRyaXhfc3RhdGUrKzsKKyAgICB9CisJIAorICAgIHJldHVybiAmbTsKK30KKworc3RhdGljIEZjRXhwciAqCitGY0NvbmZpZ1BhcnNlRXhwciAoeG1sRG9jUHRyCWRvYywKKwkJICAgeG1sTm9kZVB0cglleHByKQoreworICAgIEZjT3AJb3AgPSBGY0NvbmZpZ0xleE9wIChleHByLT5uYW1lKTsKKyAgICB4bWxOb2RlUHRyCW5vZGU7CisgICAgRmNFeHByCSpsID0gMCwgKmUgPSAwLCAqciA9IDAsICpjID0gMDsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEZjT3BJbnRlZ2VyOgorCWwgPSBGY0V4cHJDcmVhdGVJbnRlZ2VyIChzdHJ0b2wgKEZjQ29uZmlnQ29udGVudCAoZG9jLCBleHByKSwgMCwgMCkpOworCWJyZWFrOworICAgIGNhc2UgRmNPcERvdWJsZToKKwlsID0gRmNFeHByQ3JlYXRlRG91YmxlIChzdHJ0b2QgKEZjQ29uZmlnQ29udGVudCAoZG9jLCBleHByKSwgMCkpOworCWJyZWFrOworICAgIGNhc2UgRmNPcFN0cmluZzoKKwlsID0gRmNFeHByQ3JlYXRlU3RyaW5nIChGY0NvbmZpZ0NvbnRlbnQgKGRvYywgZXhwcikpOworCWJyZWFrOworICAgIGNhc2UgRmNPcE1hdHJpeDoKKwlsID0gRmNFeHByQ3JlYXRlTWF0cml4IChGY0NvbmZpZ1BhcnNlTWF0cml4IChkb2MsIGV4cHIpKTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BCb29sOgorCWwgPSBGY0V4cHJDcmVhdGVCb29sIChGY0NvbmZpZ0xleEJvb2woRmNDb25maWdDb250ZW50IChkb2MsIGV4cHIpKSk7CisJYnJlYWs7CisgICAgY2FzZSBGY09wQ2hhclNldDoKKwkvKiBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUgeWV0ICovCisJYnJlYWs7CisgICAgY2FzZSBGY09wRmllbGQ6CisJbCA9IEZjRXhwckNyZWF0ZUZpZWxkIChGY0NvbmZpZ0NvbnRlbnQgKGRvYywgZXhwcikpOworCWJyZWFrOworICAgIGNhc2UgRmNPcENvbnN0OgorCWwgPSBGY0V4cHJDcmVhdGVDb25zdCAoRmNDb25maWdDb250ZW50IChkb2MsIGV4cHIpKTsKKwlicmVhazsKKyAgICBjYXNlIEZjT3BRdWVzdDoKKwlmb3IgKG5vZGUgPSBleHByLT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisJeworCSAgICBpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQorCQljb250aW51ZTsKKwkgICAgZSA9IEZjQ29uZmlnUGFyc2VFeHByIChkb2MsIG5vZGUpOworCSAgICBpZiAoIWUpCisJCWJyZWFrOworCSAgICBpZiAoIWwpCisJCWwgPSBlOworCSAgICBlbHNlIGlmICghYykKKwkJYyA9IGU7CisJICAgIGVsc2UgaWYgKCFyKQorCQlyID0gZTsKKwkgICAgZWxzZQorCQlGY0V4cHJEZXN0cm95IChlKTsKKwl9CisJZSA9IDA7CisJaWYgKCFub2RlICYmIGwgJiYgYyAmJiByKQorCXsKKwkgICAgZSA9IEZjRXhwckNyZWF0ZU9wIChjLCBGY09wUXVlc3QsIHIpOworCSAgICBpZiAoZSkKKwkgICAgeworCQlyID0gZTsKKwkJYyA9IDA7CisJCWUgPSBGY0V4cHJDcmVhdGVPcCAobCwgRmNPcFF1ZXN0LCByKTsKKwkgICAgfQorCSAgICBpZiAoIWUpCisJCW5vZGUgPSBleHByLT5jaGlsZHJlbjsKKwl9CisJaWYgKG5vZGUgfHwgIWwgfHwgIWMgfHwgIXIgfHwgIWUpCisJeworCSAgICBpZiAobCkKKwkJRmNFeHByRGVzdHJveSAobCk7CisJICAgIGlmIChjKQorCQlGY0V4cHJEZXN0cm95IChjKTsKKwkgICAgaWYgKHIpCisJCUZjRXhwckRlc3Ryb3kgKHIpOworCSAgICByZXR1cm4gMDsKKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlmb3IgKG5vZGUgPSBleHByLT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisJeworCSAgICBpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQorCQljb250aW51ZTsKKwkgICAgZSA9IEZjQ29uZmlnUGFyc2VFeHByIChkb2MsIG5vZGUpOworCSAgICBpZiAoIWUpCisJCWJyZWFrOworCSAgICBpZiAoIWwpCisJCWwgPSBlOworCSAgICBlbHNlCisJICAgIHsKKwkJciA9IGU7CisJCWUgPSBGY0V4cHJDcmVhdGVPcCAobCwgb3AsIHIpOworCQlpZiAoIWUpCisJCXsKKwkJICAgIEZjRXhwckRlc3Ryb3kgKHIpOworCQkgICAgYnJlYWs7CisJCX0KKwkJbCA9IGU7CisJICAgIH0KKwl9CisJaWYgKG5vZGUgfHwgIWwpCisJeworCSAgICBpZiAobCkKKwkJRmNFeHByRGVzdHJveSAobCk7CisJICAgIHJldHVybiAwOworCX0KKwkvKgorCSAqIFNwZWNpYWwgY2FzZSBmb3IgdW5hcnkgb3BzIAorCSAqLworCWlmICghcikKKwl7CisJICAgIGUgPSBGY0V4cHJDcmVhdGVPcCAobCwgb3AsIDApOworCSAgICBpZiAoIWUpCisJICAgIHsKKwkJRmNFeHByRGVzdHJveSAobCk7CisJCXJldHVybiAwOworCSAgICB9CisJfQorCWJyZWFrOworICAgIAorICAgIGNhc2UgRmNPcEludmFsaWQ6CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBsOworfQorCitzdGF0aWMgRmNUZXN0ICoKK0ZjQ29uZmlnUGFyc2VUZXN0ICh4bWxEb2NQdHIJZG9jLAorCQkgICB4bWxOb2RlUHRyCXRlc3QpCit7CisgICAgeG1sTm9kZVB0cglub2RlOworICAgIHhtbEF0dHJQdHIJYXR0cjsKKyAgICBGY1F1YWwJcXVhbCA9IEZjUXVhbEFueTsKKyAgICBGY09wCW9wID0gRmNPcEVxdWFsOworICAgIGNoYXIJKmZpZWxkID0gMDsKKyAgICBGY0V4cHIJKmV4cHIgPSAwOworCisgICAgZm9yIChhdHRyID0gdGVzdC0+cHJvcGVydGllczsgYXR0cjsgYXR0ciA9IGF0dHItPm5leHQpCisgICAgeworCWlmIChhdHRyLT50eXBlICE9IFhNTF9BVFRSSUJVVEVfTk9ERSkKKwkgICAgY29udGludWU7CisJaWYgKCFzdHJjbXAgKGF0dHItPm5hbWUsICJxdWFsIikpCisJeworCSAgICBjaGFyICAgICpxdWFsX25hbWUgPSBGY0NvbmZpZ0F0dHIgKGRvYywgYXR0cik7CisJICAgIGlmICghcXVhbF9uYW1lKQorCQk7CisJICAgIGVsc2UgaWYgKCFzdHJjbXAgKHF1YWxfbmFtZSwgImFueSIpKQorCQlxdWFsID0gRmNRdWFsQW55OworCSAgICBlbHNlIGlmICghc3RyY21wIChxdWFsX25hbWUsICJhbGwiKSkKKwkJcXVhbCA9IEZjUXVhbEFsbDsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcCAoYXR0ci0+bmFtZSwgIm5hbWUiKSkKKwl7CisJICAgIGZpZWxkID0gRmNDb25maWdBdHRyIChkb2MsIGF0dHIpOworCX0KKwllbHNlIGlmICghc3RyY21wIChhdHRyLT5uYW1lLCAiY29tcGFyZSIpKQorCXsKKwkgICAgY2hhciAgICAqY29tcGFyZSA9IEZjQ29uZmlnQXR0ciAoZG9jLCBhdHRyKTsKKwkgICAgCisJICAgIGlmICghY29tcGFyZSB8fCAob3AgPSBGY0NvbmZpZ0xleE9wIChjb21wYXJlKSkgPT0gRmNPcEludmFsaWQpCisJICAgIHsKKwkJRmNDb25maWdQYXJzZUVycm9yICgiSW52YWxpZCBjb21wYXJpc29uICVzIiwgCisJCQkJICAgIGNvbXBhcmUgPyBjb21wYXJlIDogIjxtaXNzaW5nPiIpOworCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGF0dHIpCisJcmV0dXJuIDA7CisKKyAgICBmb3IgKG5vZGUgPSB0ZXN0LT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisgICAgeworCWlmIChub2RlLT50eXBlICE9IFhNTF9FTEVNRU5UX05PREUpCisJICAgIGNvbnRpbnVlOworCWV4cHIgPSBGY0NvbmZpZ1BhcnNlRXhwciAoZG9jLCBub2RlKTsKKwlpZiAoIWV4cHIpCisJICAgIHJldHVybiAwOworCWJyZWFrOworICAgIH0KKworICAgIGlmICghZXhwcikKKyAgICB7CisJRmNDb25maWdQYXJzZUVycm9yICgiTWlzc2luZyB0ZXN0IGV4cHJlc3Npb24iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEZjVGVzdENyZWF0ZSAocXVhbCwgZmllbGQsIG9wLCBleHByKTsKK30KKworc3RhdGljIEZjRXhwciAqCitGY0NvbmZpZ1BhcnNlRXhwckxpc3QgKHhtbERvY1B0ciAgICBkb2MsCisJCSAgICAgICB4bWxOb2RlUHRyICAgZXhwcikKK3sKKyAgICBGY0V4cHIgICpsLCAqZSwgKnI7CisgICAgCisgICAgaWYgKCFleHByKQorCXJldHVybiAwOworICAgIAorICAgIGUgPSBGY0NvbmZpZ1BhcnNlRXhwckxpc3QgKGRvYywgZXhwci0+bmV4dCk7CisKKyAgICBpZiAoZXhwci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKQorICAgIHsKKwlyID0gZTsKKwlsID0gRmNDb25maWdQYXJzZUV4cHIgKGRvYywgZXhwcik7CisJaWYgKCFsKQorCSAgICBnb3RvIGJhaWw7CisJaWYgKHIpCisJeworCSAgICBlID0gRmNFeHByQ3JlYXRlT3AgKGwsIEZjT3BDb21tYSwgcik7CisJICAgIGlmICghZSkKKwkJZ290byBiYWlsOworCX0KKwllbHNlCisJICAgIGUgPSBsOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZTsKK2JhaWw6CisgICAgaWYgKGwpCisJRmNFeHByRGVzdHJveSAobCk7CisgICAgaWYgKHIpCisJRmNFeHByRGVzdHJveSAocik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBGY0VkaXQgKgorRmNDb25maWdQYXJzZUVkaXQgKHhtbERvY1B0cglkb2MsCisJCSAgIHhtbE5vZGVQdHIJZWRpdCkKK3sKKyAgICB4bWxBdHRyUHRyCWF0dHI7CisgICAgY2hhcgkqbmFtZSA9IDA7CisgICAgRmNPcAltb2RlID0gRmNPcEFzc2lnbjsKKyAgICBGY0V4cHIJKmU7CisgICAgRmNFZGl0CSplZDsKKworICAgIGZvciAoYXR0ciA9IGVkaXQtPnByb3BlcnRpZXM7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQorICAgIHsKKwlpZiAoYXR0ci0+dHlwZSAhPSBYTUxfQVRUUklCVVRFX05PREUpCisJICAgIGNvbnRpbnVlOworCWlmICghc3RyY21wIChhdHRyLT5uYW1lLCAibmFtZSIpKQorCSAgICBuYW1lID0gRmNDb25maWdBdHRyIChkb2MsIGF0dHIpOworCWVsc2UgaWYgKCFzdHJjbXAgKGF0dHItPm5hbWUsICJtb2RlIikpCisJICAgIG1vZGUgPSBGY0NvbmZpZ0xleE9wIChGY0NvbmZpZ0F0dHIgKGRvYywgYXR0cikpOworICAgIH0KKworICAgIGUgPSBGY0NvbmZpZ1BhcnNlRXhwckxpc3QgKGRvYywgZWRpdC0+Y2hpbGRyZW4pOworCisgICAgZWQgPSBGY0VkaXRDcmVhdGUgKG5hbWUsIG1vZGUsIGUpOworICAgIGlmICghZWQpCisJRmNFeHByRGVzdHJveSAoZSk7CisgICAgcmV0dXJuIGVkOworfQorCitzdGF0aWMgRmNCb29sCitGY0NvbmZpZ1BhcnNlTWF0Y2ggKEZjQ29uZmlnCSpjb25maWcsCisJCSAgICB4bWxEb2NQdHIJZG9jLAorCQkgICAgeG1sTm9kZVB0cgltYXRjaCkKK3sKKyAgICB4bWxOb2RlUHRyCW5vZGU7CisgICAgeG1sQXR0clB0cglhdHRyOworICAgIEZjVGVzdAkqdGVzdHMgPSAwLCAqKnByZXZUZXN0ID0gJnRlc3RzLCAqdGVzdDsKKyAgICBGY0VkaXQJKmVkaXRzID0gMCwgKipwcmV2RWRpdCA9ICZlZGl0cywgKmVkaXQ7CisgICAgRmNNYXRjaEtpbmQJa2luZDsKKyAgICBGY0Jvb2wJZm91bmRfa2luZCA9IEZjRmFsc2U7CisKKyAgICBmb3IgKG5vZGUgPSBtYXRjaC0+Y2hpbGRyZW47IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQorICAgIHsKKwlpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQorCSAgICBjb250aW51ZTsKKwlpZiAoIXN0cmNtcCAobm9kZS0+bmFtZSwgInRlc3QiKSkKKwl7CisJICAgIHRlc3QgPSBGY0NvbmZpZ1BhcnNlVGVzdCAoZG9jLCBub2RlKTsKKwkgICAgaWYgKCF0ZXN0KQorCQlicmVhazsKKwkgICAgKnByZXZUZXN0ID0gdGVzdDsKKwkgICAgcHJldlRlc3QgPSAmdGVzdC0+bmV4dDsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcCAobm9kZS0+bmFtZSwgImVkaXQiKSkKKwl7CisJICAgIGVkaXQgPSBGY0NvbmZpZ1BhcnNlRWRpdCAoZG9jLCBub2RlKTsKKwkgICAgaWYgKCFlZGl0KQorCQlicmVhazsKKwkgICAgKnByZXZFZGl0ID0gZWRpdDsKKwkgICAgcHJldkVkaXQgPSAmZWRpdC0+bmV4dDsKKwl9CisgICAgfQorCisgICAgZm9yIChhdHRyID0gbWF0Y2gtPnByb3BlcnRpZXM7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQorICAgIHsKKwlpZiAoYXR0ci0+dHlwZSAhPSBYTUxfQVRUUklCVVRFX05PREUpCisJICAgIGNvbnRpbnVlOworCWlmICghc3RyY21wIChhdHRyLT5uYW1lLCAidGFyZ2V0IikpCisJeworCSAgICBjaGFyICAgICp0YXJnZXQgPSBGY0NvbmZpZ0F0dHIgKGRvYywgYXR0cik7CisJICAgIGlmICghdGFyZ2V0KQorCSAgICB7CisJCUZjQ29uZmlnUGFyc2VFcnJvciAoIk1pc3NpbmcgbWF0Y2ggdGFyZ2V0Iik7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKCFzdHJjbXAgKHRhcmdldCwgInBhdHRlcm4iKSkKKwkgICAgeworCQlraW5kID0gRmNNYXRjaFBhdHRlcm47CisJCWZvdW5kX2tpbmQgPSBGY1RydWU7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoIXN0cmNtcCAodGFyZ2V0LCAiZm9udCIpKQorCSAgICB7CisJCWtpbmQgPSBGY01hdGNoRm9udDsKKwkJZm91bmRfa2luZCA9IEZjVHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAobm9kZSB8fCBhdHRyIHx8ICFmb3VuZF9raW5kIHx8IAorCSFGY0NvbmZpZ0FkZEVkaXQgKGNvbmZpZywgdGVzdHMsIGVkaXRzLCBraW5kKSkKKyAgICB7CisJaWYgKHRlc3RzKQorCSAgICBGY1Rlc3REZXN0cm95ICh0ZXN0cyk7CisJaWYgKGVkaXRzKQorCSAgICBGY0VkaXREZXN0cm95IChlZGl0cyk7CisJcmV0dXJuIEZjRmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KKworc3RhdGljIEZjRXhwciAqCitGY0NvbmZpZ1BhcnNlRmFtaWxpZXMgKHhtbERvY1B0ciAgICBkb2MsCisJCSAgICAgICB4bWxOb2RlUHRyICAgZmFtaWx5KQoreworICAgIEZjRXhwciAgKm5leHQgPSAwLCAqdGhpcyA9IDAsICpleHByID0gMDsKKyAgICAKKyAgICBpZiAoIWZhbWlseSkKKwlyZXR1cm4gMDsKKyAgICBuZXh0ID0gRmNDb25maWdQYXJzZUZhbWlsaWVzIChkb2MsIGZhbWlseS0+bmV4dCk7CisgICAgCisgICAgaWYgKGZhbWlseS0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFICYmICFzdHJjbXAgKGZhbWlseS0+bmFtZSwgImZhbWlseSIpKQorICAgIHsKKwl0aGlzID0gRmNFeHByQ3JlYXRlU3RyaW5nIChGY0NvbmZpZ0NvbnRlbnQgKGRvYywgZmFtaWx5KSk7CisJaWYgKCF0aGlzKQorCSAgICBnb3RvIGJhaWw7CisJaWYgKG5leHQpCisJeworCSAgICBleHByID0gRmNFeHByQ3JlYXRlT3AgKHRoaXMsIEZjT3BDb21tYSwgbmV4dCk7CisJICAgIGlmICghZXhwcikKKwkJZ290byBiYWlsOworCX0KKwllbHNlCisJICAgIGV4cHIgPSB0aGlzOworICAgIH0KKyAgICBlbHNlCisJZXhwciA9IG5leHQ7CisgICAgcmV0dXJuIGV4cHI7CisKK2JhaWw6CisgICAgaWYgKGV4cHIpCisJRmNFeHByRGVzdHJveSAoZXhwcik7CisgICAgaWYgKHRoaXMpCisJRmNFeHByRGVzdHJveSAodGhpcyk7CisgICAgaWYgKG5leHQpCisJRmNFeHByRGVzdHJveSAobmV4dCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBGY0Jvb2wKK0ZjQ29uZmlnUGFyc2VBbGlhcyAoRmNDb25maWcJKmNvbmZpZywKKwkJICAgIHhtbERvY1B0cglkb2MsCisJCSAgICB4bWxOb2RlUHRyCWFsaWFzKQoreworICAgIHhtbE5vZGVQdHIJbm9kZTsKKyAgICBGY0V4cHIJKnByZWZlciA9IDAsICphY2NlcHQgPSAwLCAqZGVmID0gMDsKKyAgICBGY0V4cHIJKmZhbWlseTsKKyAgICBGY0VkaXQJKmVkaXQgPSAwLCAqbmV4dDsKKyAgICBGY1Rlc3QJKnRlc3Q7CisKKyAgICBmb3IgKG5vZGUgPSBhbGlhcy0+Y2hpbGRyZW47IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQorICAgIHsKKwlpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQorCSAgICBjb250aW51ZTsKKwlpZiAoIXN0cmNtcCAobm9kZS0+bmFtZSwgImZhbWlseSIpKQorCSAgICBmYW1pbHkgPSBGY0V4cHJDcmVhdGVTdHJpbmcgKEZjQ29uZmlnQ29udGVudCAoZG9jLCBub2RlKSk7CisJZWxzZSBpZiAoIXN0cmNtcCAobm9kZS0+bmFtZSwgInByZWZlciIpKQorCSAgICBwcmVmZXIgPSBGY0NvbmZpZ1BhcnNlRmFtaWxpZXMgKGRvYywgbm9kZS0+Y2hpbGRyZW4pOworCWVsc2UgaWYgKCFzdHJjbXAgKG5vZGUtPm5hbWUsICJhY2NlcHQiKSkKKwkgICAgYWNjZXB0ID0gRmNDb25maWdQYXJzZUZhbWlsaWVzIChkb2MsIG5vZGUtPmNoaWxkcmVuKTsKKwllbHNlIGlmICghc3RyY21wIChub2RlLT5uYW1lLCAiZGVmYXVsdCIpKQorCSAgICBkZWYgPSBGY0NvbmZpZ1BhcnNlRmFtaWxpZXMgKGRvYywgbm9kZS0+Y2hpbGRyZW4pOworICAgIH0KKyAgICAKKyAgICBpZiAocHJlZmVyKQorICAgIHsKKwllZGl0ID0gRmNFZGl0Q3JlYXRlIChGY0NvbmZpZ1NhdmVGaWVsZCAoImZhbWlseSIpLAorCQkJICAgICBGY09wUHJlcGVuZCwKKwkJCSAgICAgcHJlZmVyKTsKKwlpZiAoZWRpdCkKKwkgICAgZWRpdC0+bmV4dCA9IDA7CisgICAgfQorICAgIGlmIChhY2NlcHQpCisgICAgeworCW5leHQgPSBlZGl0OworCWVkaXQgPSBGY0VkaXRDcmVhdGUgKEZjQ29uZmlnU2F2ZUZpZWxkICgiZmFtaWx5IiksCisJCQkgICAgIEZjT3BBcHBlbmQsCisJCQkgICAgIGFjY2VwdCk7CisJaWYgKGVkaXQpCisJICAgIGVkaXQtPm5leHQgPSBuZXh0OworICAgIH0KKyAgICBpZiAoZGVmKQorICAgIHsKKwluZXh0ID0gZWRpdDsKKwllZGl0ID0gRmNFZGl0Q3JlYXRlIChGY0NvbmZpZ1NhdmVGaWVsZCAoImZhbWlseSIpLAorCQkJICAgICAgRmNPcEFwcGVuZExhc3QsCisJCQkgICAgICBkZWYpOworCWlmIChlZGl0KQorCSAgICBlZGl0LT5uZXh0ID0gbmV4dDsKKyAgICB9CisgICAgaWYgKGVkaXQpCisgICAgeworCXRlc3QgPSBGY1Rlc3RDcmVhdGUgKEZjUXVhbEFueSwKKwkJCSAgICAgRmNDb25maWdTYXZlRmllbGQgKCJmYW1pbHkiKSwKKwkJCSAgICAgRmNPcEVxdWFsLAorCQkJICAgICBmYW1pbHkpOworCWlmICh0ZXN0KQorCSAgICBGY0NvbmZpZ0FkZEVkaXQgKGNvbmZpZywgdGVzdCwgZWRpdCwgRmNNYXRjaFBhdHRlcm4pOworICAgIH0KKyAgICByZXR1cm4gRmNUcnVlOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnUGFyc2UgKEZjQ29uZmlnCSAgICAqY29uZmlnLAorCSAgICAgICB4bWxEb2NQdHIgICAgZG9jKQoreworICAgIHhtbE5vZGVQdHIJY3VyOworICAgIHhtbE5vZGVQdHIJbm9kZTsKKyAgICAKKyAgICBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudCAoZG9jKTsKKworICAgIGZvciAobm9kZSA9IGN1ci0+Y2hpbGRyZW47IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQorICAgIHsKKwlpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQorCSAgICBjb250aW51ZTsKKwlpZiAoIXN0cmNtcCAobm9kZS0+bmFtZSwgImRpciIpKQorCXsKKwkgICAgaWYgKCFGY0NvbmZpZ1BhcnNlRGlyIChjb25maWcsIGRvYywgbm9kZSkpCisJCWJyZWFrOworCX0KKwllbHNlIGlmICghc3RyY21wIChub2RlLT5uYW1lLCAiY2FjaGUiKSkKKwl7CisJICAgIGlmICghRmNDb25maWdQYXJzZUNhY2hlIChjb25maWcsIGRvYywgbm9kZSkpCisJCWJyZWFrOworCX0KKwllbHNlIGlmICghc3RyY21wIChub2RlLT5uYW1lLCAiaW5jbHVkZSIpKQorCXsKKwkgICAgaWYgKCFGY0NvbmZpZ1BhcnNlSW5jbHVkZSAoY29uZmlnLCBkb2MsIG5vZGUpKQorCQlicmVhazsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcCAobm9kZS0+bmFtZSwgImNvbmZpZyIpKQorCXsKKwkgICAgaWYgKCFGY0NvbmZpZ1BhcnNlQ29uZmlnIChjb25maWcsIGRvYywgbm9kZSkpCisJCWJyZWFrOworCX0KKwllbHNlIGlmICghc3RyY21wIChub2RlLT5uYW1lLCAibWF0Y2giKSkKKwl7CisJICAgIGlmICghRmNDb25maWdQYXJzZU1hdGNoIChjb25maWcsIGRvYywgbm9kZSkpCisJCWJyZWFrOworCX0KKwllbHNlIGlmICghc3RyY21wIChub2RlLT5uYW1lLCAiYWxpYXMiKSkKKwl7CisJICAgIGlmICghRmNDb25maWdQYXJzZUFsaWFzIChjb25maWcsIGRvYywgbm9kZSkpCisJCWJyZWFrOworCX0KKwllbHNlCisJeworCSAgICBGY0NvbmZpZ1BhcnNlRXJyb3IgKCJpbnZhbGlkIGVsZW1lbnQgJXMiLCBub2RlLT5uYW1lKTsKKwkgICAgYnJlYWs7CisJfSAgIAorICAgIH0KKyAgICBpZiAobm9kZSkKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICByZXR1cm4gRmNUcnVlOworfQorCitGY0Jvb2wKK0ZjQ29uZmlnUGFyc2VBbmRMb2FkIChGY0NvbmZpZwkgICAgKmNvbmZpZywKKwkJICAgICAgY29uc3QgY2hhciAgICAqZmlsZSwKKwkJICAgICAgRmNCb29sCSAgICBjb21wbGFpbikKK3sKKyAgICB4bWxEb2NQdHIJZG9jOworICAgIEZjQm9vbAlyZXQ7CisKKyAgICBkb2MgPSBGY0NvbmZpZ0xvYWQgKGZpbGUpOworICAgIGlmIChkb2MpCisgICAgeworCXJldCA9IEZjQ29uZmlnQWRkQ29uZmlnRmlsZSAoY29uZmlnLCBmaWxlKTsKKwlpZiAocmV0KQorCSAgICByZXQgPSBGY0NvbmZpZ1BhcnNlIChjb25maWcsIGRvYyk7CisJeG1sRnJlZURvYyAoZG9jKTsKKwlyZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoY29tcGxhaW4pCisgICAgeworCWlmIChmaWxlKQorCSAgICBGY0NvbmZpZ1BhcnNlRXJyb3IgKCJDYW5ub3QgbG9hZCBjb25maWcgZmlsZSBcIiVzXCIiLCBmaWxlKTsKKwllbHNlCisJICAgIEZjQ29uZmlnUGFyc2VFcnJvciAoIkNhbm5vdCBsb2FkIGRlZmF1bHQgY29uZmlnIGZpbGUiKTsKKwlyZXR1cm4gRmNGYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEZjVHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9mb250Y29uZmlnLm1hbiBiL3NyYy9mb250Y29uZmlnLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk5MTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZvbnRjb25maWcubWFuCkBAIC0wLDAgKzEsMTExMyBAQAorLlwiCisuXCIgJFhGcmVlODY6IGZvbnRjb25maWcubWFuLHYgMS4yIDIwMDAvMTEvMzAgMDY6NTk6NDUga2VpdGhwIEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisuXCIKKy5cIiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKy5cIiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorLlwiIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorLlwiIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKy5cIiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisuXCIgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisuXCIgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKy5cIiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKy5cIiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorLlwiCisuXCIgS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKy5cIiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisuXCIgRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorLlwiIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorLlwiIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKy5cIiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisuXCIgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKy5cIgorLmRlIFRRCisuYnIKKy5ucworLlRQIFxcJDEKKy4uCisuVEggRk9OVENPTkZJRyAzICJWZXJzaW9uIDEuMCIgIlhGcmVlODYiCisKKy5TSCBOQU1FCitmb250Y29uZmlnIFwtIEZvbnQgY29uZmlndXJhdGlvbiBhbmQgY3VzdG9taXphdGlvbiBsaWJyYXJ5CisKKy5TSCBTWU5PUFNJUworLm5mCisuQiAjaW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+CisuQiAjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY2ZyZWV0eXBlLmg+CisuQiAjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3htbC5oPgorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIEZvbnRjb25maWcKK2lzIGEgbGlicmFyeSBkZXNpZ25lZCB0byBwcm92aWRlIHN5c3RlbS13aWRlIGZvbnQgY29uZmlndXJhdGlvbiwKK2N1c3RvbWl6YXRpb24gYW5kIGFwcGxpY2F0aW9uIGFjY2Vzcy4KKworLlNIIEZVTkNUSU9OQUwgT1ZFUlZJRVcKK0ZvbnRjb25maWcgY29udGFpbnMgdHdvIGVzc2VudGlhbCBtb2R1bGVzLCB0aGUgY29uZmlndXJhdGlvbiBtb2R1bGUgd2hpY2gKK2J1aWxkcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIGZyb20gWE1MIGZpbGVzIGFuZCB0aGUgbWF0Y2hpbmcgbW9kdWxlCit3aGljaCBhY2NlcHRzIGZvbnQgcGF0dGVybnMgYW5kIHJldHVybnMgdGhlIG5lYXJlc3QgbWF0Y2hpbmcgZm9udC4KKworLlNTIEZPTlQgQ09ORklHVVJBVElPTgorVGhlIGNvbmZpZ3VyYXRpb24gbW9kdWxlIGNvbnNpc3RzIG9mIHRoZSBGY0NvbmZpZyBkYXRhdHlwZSwgbGlieG1sMiBhbmQKK0ZjQ29uZmlnUGFyc2Ugd2hpY2ggd2Fsa3Mgb3ZlciBhbiBYTUwgdHJlZSBhbmQgYW1tZW5kcyBhIGNvbmZpZ3VyYXRpb24gd2l0aAorZGF0YSBmb3VuZCB3aXRoaW4uICBGcm9tIGFuIGV4dGVybmFsIHBlcnNwZWN0aXZlLCBjb25maWd1cmF0aW9uIG9mIHRoZQorbGlicmFyeSBjb25zaXN0cyBvZiBnZW5lcmF0aW5nIGEgdmFsaWQgWE1MIHRyZWUgYW5kIGZlZWRpbmcgdGhhdCB0bworRmNDb25maWdQYXJzZS4gIFRoZSBvbmx5IG90aGVyIG1lY2hhbmlzbSBwcm92aWRlZCB0byBhcHBsaWNhdGlvbnMgZm9yCitjaGFuZ2luZyB0aGUgcnVubmluZyBjb25maWd1cmF0aW9uIGlzIHRvIGFkZCBmb250cyBhbmQgZGlyZWN0b3JpZXMgdG8gdGhlCitsaXN0IG9mIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGZvbnQgZmlsZXMuICAKKy5QCitUaGUgaW50ZW50IGlzIHRvIG1ha2UgZm9udCBjb25maWd1cmF0aW9ucyByZWxhdGl2ZWx5IHN0YXRpYywgYW5kIHNoYXJlZCBieQorYXMgbWFueSBhcHBsaWNhdGlvbnMgYXMgcG9zc2libGUuICBJdCBpcyBob3BlZCB0aGF0IHRoaXMgd2lsbCBsZWFkIHRvIG1vcmUKK3N0YWJsZSBmb250IHNlbGVjdGlvbiB3aGVuIHBhc3NpbmcgbmFtZXMgZnJvbSBvbmUgYXBwbGljYXRpb24gdG8gYW5vdGhlci4KK1hNTCB3YXMgY2hvc2VuIGFzIGEgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdCBiZWNhdXNlIGl0IHByb3ZpZGVzIGEgZm9ybWF0Cit3aGljaCBpcyBlYXN5IGZvciBleHRlcm5hbCBhZ2VudHMgdG8gZWRpdCB3aGlsZSByZXRhaW5pbmcgdGhlIGNvcnJlY3QKK3N0cnVjdHVyZSBhbmQgc3ludGF4LgorLlAKK0ZvbnQgY29uZmlndXJhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGZvbnQgbWF0Y2hpbmc7IGFwcGxpY2F0aW9ucyBuZWVkaW5nIHRvCitkbyB0aGVpciBvd24gbWF0Y2hpbmcgY2FuIGFjY2VzcyB0aGUgYXZhaWxhYmxlIGZvbnRzIGZyb20gdGhlIGxpYnJhcnkgYW5kCitwZXJmb3JtIHByaXZhdGUgbWF0Y2hpbmcuICBUaGUgaW50ZW50IGlzIHRvIHBlcm1pdCBhcHBsaWNhdGlvbnMgdG8gcGljayBhbmQKK2Nob29zZSBhcHByb3ByaWF0ZSBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGxpYnJhcnkgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZW0gdG8KK2Nob29zZSBiZXR3ZWVuIHRoaXMgbGlicmFyeSBhbmQgYSBwcml2YXRlIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtLiAgVGhlIGhvcGUKK2lzIHRoYXQgdGhpcyB3aWxsIGVuc3VyZSB0aGF0IGNvbmZpZ3VyYXRpb24gb2YgZm9udHMgZm9yIGFsbCBhcHBsaWNhdGlvbnMKK2NhbiBiZSBjZW50cmFsaXplZCBpbiBvbmUgcGxhY2UuICBDZW50cmFsaXppbmcgZm9udCBjb25maWd1cmF0aW9uIHdpbGwgbWFrZQorc2ltcGxpZnkgYW5kIHJlZ3VsYXJpemUgZm9udCBpbnN0YWxsYXRpb24gYW5kIGN1c3RvbWl6YXRpb24uCisKKy5TUyBGT05UIFBST1BFUlRJRVMKK1doaWxlIGZvbnQgcGF0dGVybnMgbWF5IGNvbnRhaW4gZXNzZW50aWFsbHkgYW55IHByb3BlcnRpZXMsIHRoZXJlIGFyZSBzb21lCit3ZWxsIGtub3duIHByb3BlcnRpZXMgd2l0aCBhc3NvY2lhdGVkIHR5cGVzLiAgRm9udGNvbmZpZyB1c2VzIHNvbWUgb2YgdGhlc2UKK3Byb3BlcnRpZXMgZm9yIGZvbnQgbWF0Y2hpbmcgYW5kIGZvbnQgY29tcGxldGlvbi4gIE90aGVycyBhcmUgcHJvdmlkZWQgYXMgYQorY29udmVuaWVuY2UgZm9yIHRoZSBhcHBsaWNhdGlvbnMgcmVuZGVyaW5nIG1lY2hhbmlzbS4KKy5zcAorLm5mCisudGEgMWkgMi43NWkgMy41aSA1LjVpCisubGMgXChlbQorUHJvcGVydHkJQ1BQIHN5bWJvbAlUeXBlCURlc2NyaXB0aW9uCisBAQEBCitmYW1pbHkJRkNfRkFNSUxZCVN0cmluZwlGb250IGZhbWlseSBuYW1lCitzdHlsZQlGQ19TVFlMRQlTdHJpbmcJRm9udCBzdHlsZS4gT3ZlcnJpZGVzIHdlaWdodCBhbmQgc2xhbnQKK3NsYW50CUZDX1NMQU5UCUludAlJdGFsaWMsIG9ibGlxdWUgb3Igcm9tYW4KK3dlaWdodAlGQ19XRUlHSFQJSW50CUxpZ2h0LCBtZWRpdW0sIGRlbWlib2xkLCBib2xkIG9yIGJsYWNrCitzaXplCUZDX1NJWkUJRG91YmxlCVBvaW50IHNpemUKK3BpeGVsc2l6ZQlGQ19QSVhFTF9TSVpFCURvdWJsZQlQaXhlbCBzaXplCitzcGFjaW5nCUZDX1NQQUNJTkcJSW50CVByb3BvcnRpb25hbCwgbW9ub3NwYWNlIG9yIGNoYXJjZWxsCitmb3VuZHJ5CUZDX0ZPVU5EUlkJU3RyaW5nCUZvbnQgZm91bmRyeSBuYW1lCithbnRpYWxpYXMJRkNfQU5USUFMSUFTCUJvb2wJV2hldGhlciBnbHlwaHMgY2FuIGJlIGFudGlhbGlhc2VkCitoaW50aW5nCUZDX0hJTlRJTkcJQm9vbAlXaGV0aGVyIHRoZSByYXN0ZXJpemVyIHNob3VsZCB1c2UgaGludGluZwordmVydGljYWxsYXlvdXQJRkNfVkVSVElDQUxfTEFZT1VUCUJvb2wJVXNlIHZlcnRpY2FsIGxheW91dAorZ2xvYmFsYWR2YW5jZQlGQ19HTE9CQUxfQURWQU5DRQlCb29sCVVzZSBmb250IGdsb2JhbCBhZHZhbmNlIGRhdGEKK2ZpbGUJRkNfRklMRQlTdHJpbmcJVGhlIGZpbGVuYW1lIGhvbGRpbmcgdGhlIGZvbnQKK2luZGV4CUZDX0lOREVYCUludAlUaGUgaW5kZXggb2YgdGhlIGZvbnQgd2l0aGluIHRoZSBmaWxlCityYXN0ZXJpemVyCUZDX1JBU1RFUklaRVIJU3RyaW5nCVdoaWNoIHJhc3Rlcml6ZXIgaXMgaW4gdXNlCitvdXRsaW5lCUZDX09VVExJTkUJQm9vbAlXaGV0aGVyIHRoZSBnbHlwaHMgYXJlIG91dGxpbmVzCitzY2FsYWJsZQlGQ19TQ0FMQUJMRQlCb29sCVdoZXRoZXIgZ2x5cGhzIGNhbiBiZSBzY2FsZWQKK3NjYWxlCUZDX1NDQUxFCURvdWJsZQlTY2FsZSBmYWN0b3IgZm9yIHBvaW50LT5waXhlbCBjb252ZXJzaW9ucworZHBpCUZDX0RQSQlEb3VibGUJVGFyZ2V0IGRvdHMgcGVyIGluY2gKK3JnYmEJRkNfUkdCQQlJbnQJcmdiLCBiZ3IsIHZyZ2IsIHZiZ3IgLSBzdWJwaXhlbCBnZW9tZXRyeQorbWluc3BhY2UJRkNfTUlOU1BBQ0UJQm9vbAlFbGltaW5hdGUgbGVhZGluZyBmcm9tIGxpbmUgc3BhY2luZworY2hhcnNldAlGQ19DSEFSU0VUCUNoYXJTZXQJVW5pY29kZSBjaGFycyBlbmNvZGVkIGJ5IHRoZSBmb250CitsYW5nCUZDX0xBTkcJU3RyaW5nCUxpc3Qgb2YgbGFuZ3VhZ2UgZ3JvdXBzIHRoaXMgZm9udCBpcyBkZXNpZ25lZCBmb3IKKy5EVAorLmZpCisKKy5TUyBGT05UIE1BVENISU5HCitGb250Y29uZmlnIHBlcmZvcm1zIG1hdGNoaW5nIGJ5IG1lYXN1cmluZyB0aGUgZGlzdGFuY2UgZnJvbSBhIHByb3ZpZGVkCitwYXR0ZXJuIHRvIGFsbCBvZiB0aGUgYXZhaWxhYmxlIGZvbnRzIGluIHRoZSBzeXN0ZW0uICBUaGUgY2xvc2VzdCBtYXRjaGluZworZm9udCBpcyBzZWxlY3RlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgZm9udCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCwgYnV0Citkb2Vzbid0IGVuc3VyZSB0aGF0IGl0IGlzIGFueXRoaW5nIGxpa2UgdGhlIHJlcXVlc3RlZCBwYXR0ZXJuLgorLlAKK0ZvbnQgbWF0Y2hpbmcgc3RhcnRzIHdpdGggYW4gYXBwbGljYXRpb24gY29uc3RydWN0ZWQgcGF0dGVybi4gIFRoZSBkZXNpcmVkCithdHRyaWJ1dGVzIG9mIHRoZSByZXN1bHRpbmcgZm9udCBhcmUgY29sbGVjdGVkIHRvZ2V0aGVyIGluIGFuIEZjUGF0dGVybgorb2JqZWN0LiAgRWFjaCBwcm9wZXJ0eSBvZiB0aGUgcGF0dGVybiBjYW4gY29udGFpbiBvbmUgb3IgbW9yZSB2YWx1ZXM7IHRoZXNlCithcmUgbGlzdGVkIGluIHByaW9yaXR5IG9yZGVyOyBtYXRjaGVzIGVhcmxpZXIgaW4gdGhlIGxpc3QgYXJlIGNvbnNpZGVyZWQKKyJjbG9zZXIiIHRoYW4gbWF0Y2hlcyBsYXRlciBpbiB0aGUgbGlzdC4KKy5QCitUaGUgaW5pdGlhbCBwYXR0ZXJuIGlzIG1vZGlmaWVkIGJ5IGFwcGx5aW5nIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zCitzcGVjaWZpYyB0byBwYXR0ZXJucyBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbjsgZWFjaCBjb25zaXN0cyBvZiBhIG1hdGNoCitwcmVkaWNhdGUgYW5kIGEgc2V0IG9mIGVkaXRpbmcgb3BlcmF0aW9ucy4gIFRoZXkgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlcgordGhleSBhcHBlYXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbi4gIEVhY2ggbWF0Y2ggY2F1c2VzIHRoZSBhc3NvY2lhdGVkCitzZXF1ZW5jZSBvZiBlZGl0aW5nIG9wZXJhdGlvbnMgdG8gYmUgYXBwbGllZC4KKy5QCitBZnRlciB0aGUgcGF0dGVybiBoYXMgYmVlbiBlZGl0ZWQsIGEgc2VxdWVuY2Ugb2YgZGVmYXVsdCBzdWJzdGl0dXRpb25zIGFyZQorcGVyZm9ybWVkIHRvIGNhbm9uaWNhbGl6ZSB0aGUgc2V0IG9mIGF2YWlsYWJsZSBwcm9wZXJ0aWVzOyB0aGlzIGF2b2lkcyB0aGUKK25lZWQgZm9yIHRoZSBsb3dlciBsYXllcnMgdG8gY29uc3RhbnRseSBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvciB2YXJpb3VzCitmb250IHByb3BlcnRpZXMgZHVyaW5nIHJlbmRlcmluZy4KKy5QCitUaGUgY2Fub25pY2FsIGZvbnQgcGF0dGVybiBpcyBmaW5hbGx5IG1hdGNoZWQgYWdhaW5zdCBhbGwgYXZhaWxhYmxlIGZvbnRzLgorVGhlIGRpc3RhbmNlIGZyb20gdGhlIHBhdHRlcm4gdG8gdGhlIGZvbnQgaXMgbWVhc3VyZWQgZm9yIGVhY2ggb2Ygc2V2ZXJhbAorcHJvcGVydGllczogZm91bmRyeSwgY2hhcnNldCwgYW50aWFsaWFzLCBmYW1pbHksIHNwYWNpbmcsIHBpeGVsc2l6ZSwgc3R5bGUsCitzbGFudCwgd2VpZ2h0LCByYXN0ZXJpemVyIGFuZCBvdXRsaW5lLiAgVGhpcyBsaXN0IGlzIGluIHByaW9yaXR5IG9yZGVyIC0tCityZXN1bHRzIG9mIGNvbXBhcmluZyBlYXJsaWVyIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCB3ZWlnaCBtb3JlIGhlYXZpbHkgdGhhbgorbGF0ZXIgZWxlbWVudHMuCisuUAorVGhlIHBhdHRlcm4gcmVwcmVzZW50aW5nIHRoYXQgZm9udCBpcyBhdWdtZW50ZWQgdG8gaW5jbHVkZSBhbnkgcHJvcGVydGllcworZm91bmQgaW4gdGhlIHBhdHRlcm4gYnV0IG5vdCBmb3VuZCBpbiB0aGUgZm9udCBpdHNlbGY7IHRoaXMgcGVybWl0cyB0aGUKK2FwcGxpY2F0aW9uIHRvIHBhc3MgcmVuZGVyaW5nIGluc3RydWN0aW9ucyBvciBhbnkgb3RoZXIgZGF0YSB0aHJvdWdoIHRoZQorbWF0Y2hpbmcgc3lzdGVtLiAgRmluYWxseSwgdGhlIGxpc3Qgb2YgZWRpdGluZyBpbnN0cnVjdGlvbnMgc3BlY2lmaWMgdG8KK2ZvbnRzIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZSBhcHBsaWVkIHRvIHRoZSBwYXR0ZXJuLiAgVGhpcyBtb2RpZmllZAorcGF0dGVybiBpcyByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24uCisuUAorVGhlIHJldHVybiB2YWx1ZSBjb250YWlucyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGxvY2F0ZSBhbmQgcmFzdGVyaXplIHRoZQorZm9udCwgaW5jbHVkaW5nIHRoZSBmaWxlIG5hbWUsIHBpeGVsIHNpemUgYW5kIG90aGVyIHJlbmRlcmluZyBkYXRhLiAgQXMKK25vbmUgb2YgdGhlIGluZm9ybWF0aW9uIGludm9sdmVkIHBlcnRhaW5zIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LAorYXBwbGljYXRpb25zIGFyZSBmcmVlIHRvIHVzZSBhbnkgcmFzdGVyaXphdGlvbiBlbmdpbmUgb3IgZXZlbiB0byB0YWtlCit0aGUgaWRlbnRpZmllZCBmb250IGZpbGUgYW5kIGFjY2VzcyBpdCBkaXJlY3RseS4KKy5QCitUaGUgbWF0Y2gvZWRpdCBzZXF1ZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJlIHBlcmZvcm1lZCBpbiB0d28gcGFzc2VzCitiZWNhdXNlIHRoZXJlIGFyZSBlc3NlbnRpYWxseSB0d28gZGlmZmVyZW50IG9wZXJhdGlvbnMgbmVjZXNzYXJ5IC0tIHRoZQorZmlyc3QgaXMgdG8gbW9kaWZ5IGhvdyBmb250cyBhcmUgc2VsZWN0ZWQ7IGFsaWFzaW5nIGZhbWlsaWVzIGFuZCBhZGRpbmcKK3N1aXRhYmxlIGRlZmF1bHRzLiAgVGhlIHNlY29uZCBpcyB0byBtb2RpZnkgaG93IHRoZSBzZWxlY3RlZCBmb250cyBhcmUKK3Jhc3Rlcml6ZWQuICBUaG9zZSBtdXN0IGFwcGx5IHRvIHRoZSBzZWxlY3RlZCBmb250LCBub3QgdGhlIG9yaWdpbmFsIHBhdHRlcm4KK2FzIGZhbHNlIG1hdGNoZXMgd2lsbCBvZnRlbiBvY2N1ci4KKy5TUyBGT05UIE5BTUVTCitGb250Y29uZmlnIHByb3ZpZGVzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBmb3IgcGF0dGVybnMgdGhhdCB0aGUgbGlicmFyeQorY2FuIGJvdGggYWNjZXB0IGFuZCBnZW5lcmF0ZS4gIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpbiB0aHJlZSBwYXJ0cywgZmlyc3QgYQorbGlzdCBvZiBmYW1pbHkgbmFtZXMsIHNlY29uZCBhIGxpc3Qgb2YgcG9pbnQgc2l6ZXMgYW5kIGZpbmFsbHkgYSBsaXN0IG9mCithZGRpdGlvbmFsIHByb3BlcnRpZXM6CisubmYKKwk8ZmFtaWxpZXM+LTxwb2ludCBzaXplcz46PG5hbWUxPj08dmFsdWVzMT46PG5hbWUyPj08dmFsdWVzMj4uLi4KKy5maQorVmFsdWVzIGluIGEgbGlzdCBhcmUgc2VwYXJhdGVkIHdpdGggY29tbWFzLiAgVGhlIG5hbWUgbmVlZG4ndCBpbmNsdWRlIGVpdGhlcgorZmFtaWxpZXMgb3IgcG9pbnQgc2l6ZXM7IHRoZXkgY2FuIGJlIGVsaWRlZC4gIEluIGFkZGl0aW9uLCB0aGVyZSBhcmUKK3N5bWJvbGljIGNvbnN0YW50cyB0aGF0IHNpbXVsdGFuZW91c2x5IGluZGljYXRlIGJvdGggYSBuYW1lIGFuZCBhIHZhbHVlLgorSGVyZSBhcmUgc29tZSBleGFtcGxlczoKKy5zcAorLm5mCisudGEgMWkgM2kKKwlUaW1lcy0xMgkxMiBwb2ludCBUaW1lcyBSb21hbgorCVRpbWVzLTEyOmJvbGQJMTIgcG9pbnQgVGltZXMgQm9sZAorCUNvdXJpZXI6aXRhbGljCUNvdXJpZXIgSXRhbGljIGluIHRoZSBkZWZhdWx0IHNpemUKKwlNb25vc3BhY2U6bWF0cml4PTEgLjEgMCAxCVRoZSB1c2VycyBwcmVmZXJyZWQgbW9ub3NwYWNlIGZvbnQKKwkJd2l0aCBhcnRpZmljaWFsIG9ibGlxdWluZworLmZpCisuRFQKKworLlNIIERBVEFUWVBFUworCisuVFAKKy5CIEZjQ2hhcjgKKy5UUQorLkIgRmNDaGFyMTYKKy5UUQorLkIgRmNDaGFyMzIKKy5UUQorLkIgRmNCb29sCitUaGVzZSBhcmUgcHJpbWl0aXZlIGRhdGF0eXBlczsgdGhlIEZjQ2hhciogdHlwZXMgaG9sZCBwcmVjaXNlbHkgdGhlIG51bWJlcgorb2YgYml0cyBzdGF0ZWQgKGlmIHN1cHBvcnRlZCBieSB0aGUgQyBpbXBsZW1lbnRhdGlvbikuICBGY0Jvb2wgaG9sZHMKK29uZSBvZiB0d28gQ1BQIHN5bWJvbHM6IEZjRmFsc2Ugb3IgRmNUcnVlLgorCisuVFAKKy5CIEZjTWF0cml4CitBbiBGY01hdHJpeCBob2xkcyBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24sIHVzdWFsbHkgdXNlZCB0byByZXNoYXBlIGdseXBocy4KK0Egc21hbGwgc2V0IG9mIG1hdHJpeCBvcGVyYXRpb25zIGFyZSBwcm92aWRlZCB0byBtYW5pcHVsYXRlIHRoZXNlLgorLnNwCisubmYKKwl0eXBlZGVmIHN0cnVjdCBfRmNNYXRyaXggeworCQlkb3VibGUgeHgsIHh5LCB5eCwgeXk7CisJfSBGY01hdHJpeDsKKy5maQorCisuVFAKKy5CIEZjQ2hhclNldAorQW4gRmNDaGFyU2V0IGlzIGFuIGFic3RyYWN0IHR5cGUgdGhhdCBob2xkcyB0aGUgc2V0IG9mIGVuY29kZWQgdW5pY29kZSBjaGFycworaW4gYSBmb250LiAgT3BlcmF0aW9ucyB0byBidWlsZCBhbmQgY29tcGFyZSB0aGVzZSBzZXRzIGFyZSBwcm92aWRlZC4KKworLlRQCisuQiBGY1R5cGUKK1RhZ3MgdGhlIGtpbmQgb2YgZGF0YSBzdG9yZWQgaW4gYW4gRmNWYWx1ZS4KKworLlRQCisuQiBGY1ZhbHVlCitBbiBGY1ZhbHVlIG9iamVjdCBob2xkcyBhIHNpbmdsZSB2YWx1ZSB3aXRoIG9uZSBvZiBhIG51bWJlciBvZiBkaWZmZXJlbnQKK3R5cGVzLiAgVGhlICd0eXBlJyB0YWcgaW5kaWNhdGVzIHdoaWNoIG1lbWJlciBpcyB2YWxpZC4KKy5zcAorLm5mCisJdHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWUgeworCQlGY1R5cGUgdHlwZTsKKwkJdW5pb24geworCQkJY29uc3QgRmNDaGFyOCAqczsKKwkJCWludCBpOworCQkJRmNCb29sIGI7CisJCQlkb3VibGUgZDsKKwkJCWNvbnN0IEZjTWF0cml4ICptOworCQkJY29uc3QgRmNDaGFyU2V0ICpjOworCQl9IHU7CisJfSBGY1ZhbHVlOworLmZpCisuUAorLnRhIDFpIDJpIDNpIDRpCisubmYKKy5sYyBcKGVtCisJdHlwZQlVbmlvbiBtZW1iZXIJRGF0YXR5cGUKKwkBAQEKKwlGY1R5cGVWb2lkCShub25lKQkobm9uZSkKKwlGY1R5cGVJbnRlZ2VyCWkJaW50CisJRmNUeXBlRG91YmxlCWQJZG91YmxlCisJRmNUeXBlU3RyaW5nCXMJY2hhciAqCisJRmNUeXBlQm9vbAliCWIKKwlGY1R5cGVNYXRyaXgJbQlGY01hdHJpeCAqCisJRmNUeXBlQ2hhclNldAljCUZjQ2hhclNldCAqCisuZmkKKy5EVAorLlRQCisuQiBGY1BhdHRlcm4KK2hvbGRzIGEgc2V0IG9mIG5hbWVzIHdpdGggYXNzb2NpYXRlZCB2YWx1ZSBsaXN0czsgZWFjaCBuYW1lIHJlZmVycyB0byBhCitwcm9wZXJ0eSBvZiBhIGZvbnQuICBGY1BhdHRlcm5zIGFyZSB1c2VkIGFzIGlucHV0cyB0byB0aGUgbWF0Y2hpbmcgY29kZSBhcword2VsbCBhcyBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGZvbnRzLiAgRWFjaCBwcm9wZXJ0eSBjYW4gaG9sZAorb25lIG9yIG1vcmUgdmFsdWVzOyBjb252ZW50aW9uYWxseSBhbGwgb2YgdGhlIHNhbWUgdHlwZSwgYWx0aG91Z2ggdGhlCitpbnRlcmZhY2UgZG9lc24ndCBkZW1hbmQgdGhhdC4KKworLlRQCisuQiBGY0ZvbnRTZXQKKy5zcAorLm5mCisJdHlwZWRlZiBzdHJ1Y3QgX0ZjRm9udFNldCB7CisJCWludCBuZm9udDsKKwkJaW50IHNmb250OworCQlGY1BhdHRlcm4gKipmb250czsKKwl9IEZjRm9udFNldDsKKy5maQkKK0FuIEZjRm9udFNldCBjb250YWlucyBhIGxpc3Qgb2YgRmNQYXR0ZXJucy4gIEludGVybmFsbHkgZm9udGNvbmZpZyB1c2VzIHRoaXMKK2RhdGEgc3RydWN0dXJlIHRvIGhvbGQgc2V0cyBvZiBmb250cy4gIEV4dGVybmFsbHksIGZvbnRjb25maWcgcmV0dXJucyB0aGUKK3Jlc3VsdHMgb2YgbGlzdGluZyBmb250cyBpbiB0aGlzIGZvcm1hdC4gICduZm9udCcgaG9sZHMgdGhlIG51bWJlciBvZgorcGF0dGVybnMgaW4gdGhlICdmb250cycgYXJyYXk7ICdzZm9udCcgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGF0CithcnJheS4KKworLlRQCisuQiBGY09iamVjdFNldAorLnNwCisubmYKKwl0eXBlZGVmIHN0cnVjdCBfRmNPYmplY3RTZXQgeworCQlpbnQgbm9iamVjdDsKKwkJaW50IHNvYmplY3Q7CisJCWNvbnN0IGNoYXIgKipvYmplY3RzOworCX0gRmNPYmplY3RTZXQ7CisuZmkKK2hvbGRzIGEgc2V0IG9mIG5hbWVzIGFuZCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGZyb20gZm9udHMgYXJlCitwbGFjZWQgaW4gdGhlIHRoZSBsaXN0IG9mIHJldHVybmVkIHBhdHRlcm5zIHdoZW4gbGlzdGluZyBmb250cy4KKworLlRQCisuQiBGY0JsYW5rcworaG9sZHMgYSBsaXN0IG9mIFVuaWNvZGUgY2hhcnMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIGJlIGJsYW5rOyB1bmV4cGVjdGVkbHkKK2JsYW5rIGNoYXJzIGFyZSBhc3N1bWVkIHRvIGJlIGludmFsaWQgYW5kIGFyZSBlbGlkZWQgZnJvbSB0aGUgY2hhcnNldAorYXNzb2NpYXRlZCB3aXRoIHRoZSBmb250LgorCisuVFAKKy5CIEZjRmlsZUNhY2hlCitob2xkcyB0aGUgcGVyLXVzZXIgY2FjaGUgaW5mb3JtYXRpb24gZm9yIHVzZSB3aGlsZSBsb2FkaW5nIHRoZSBmb250CitkYXRhYmFzZS4gVGhpcyBpcyBidWlsdCBhdXRvbWF0aWNhbGx5IGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdoZW4KK3RoYXQgaXMgbG9hZGVkLiAgQXBwbGljYXRpb25zIG11c3QgYWx3YXlzIHBhc3MgJzAnIHdoZW4gb25lIGlzIHJlcXVlc3RlZC4KKworLlRQCisuQiBGY0NvbmZpZworaG9sZHMgYSBjb21wbGV0ZSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaWJyYXJ5OyB0aGVyZSBpcyBvbmUgZGVmYXVsdAorY29uZmlndXJhdGlvbiwgb3RoZXIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gWE1MIGRhdGEgc3RydWN0dXJlcy4gIEFsbAorcHVibGljIGVudHJ5IHBvaW50cyB0aGF0IG5lZWQgZ2xvYmFsIGRhdGEgY2FuIHRha2UgYW4gb3B0aW9uYWwgRmNDb25maWcqCithcmd1bWVudDsgcGFzc2luZyAwIHVzZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIEZjQ29uZmlnIG9iamVjdHMgaG9sZCB0d28KK3NldHMgb2YgZm9udHMsIHRoZSBmaXJzdCBjb250YWlucyB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIHRoZQorc2Vjb25kIHNldCBob2xkcyB0aG9zZSBhZGRlZCBieSB0aGUgYXBwbGljYXRpb24gYXQgcnVuLXRpbWUuICBJbnRlcmZhY2VzCit0aGF0IG5lZWQgdG8gcmVmZXJlbmNlIGEgcGFydGljdWxhdCBzZXQgdXNlIG9uZSBvZiB0aGUgRmNTZXROYW1lIGVudW1lcmF0ZWQKK3ZhbHVlcy4KKworLlRQCisuQiBGY1NldE5hbWUKK1NwZWNpZmllcyBvbmUgb2YgdGhlIHR3byBzZXRzIG9mIGZvbnRzIGF2YWlsYWJsZSBpbiBhIGNvbmZpZ3VyYXRpb247CitGY1NldFN5c3RlbSBmb3IgdGhvc2UgZm9udHMgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGFuZAorRmNTZXRBcHBsaWNhdGlvbiB3aGljaCBob2xkcyBmb250cyBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24uCisKKy5UUAorLkIgRmNSZXN1bHQKK1VzZWQgYXMgYSByZXR1cm4gdHlwZSBmb3IgZnVuY3Rpb25zIG1hbmlwdWxhdGluZyBGY1BhdHRlcm4gb2JqZWN0cy4KKy5QCisudGEgMWkgM2kgNGkKKy5sYyBcKGVtCisJUmVzdWx0IGNvZGUJTWVhbmluZworLmJyCisJAQEKKy5icgorCUZjUmVzdWx0TWF0Y2gJT2JqZWN0IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQKKy5icgorCUZjUmVzdWx0Tm9NYXRjaAlPYmplY3QgZG9lc24ndCBleGlzdCBhdCBhbGwKKy5icgorCUZjUmVzdWx0VHlwZU1pc21hdGNoCU9iamVjdCBleGlzdHMsIGJ1dCB0aGUgdHlwZSBkb2Vzbid0IG1hdGNoCisuYnIKKwlGY1Jlc3VsdE5vSWQJT2JqZWN0IGV4aXN0cywgYnV0IGhhcyBmZXdlciB2YWx1ZXMgdGhhbiBzcGVjaWZpZWQKKy5icgorLkRUCisKKy5TSCBGVU5DVElPTlMKKworLlNTIEZjTWF0cml4CitGY01hdHJpeCBzdHJ1Y3R1cmVzIGhvbGQgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIGluIG1hdHJpeCBmb3JtLgorLlRQCisjZGVmaW5lIEZjTWF0cml4SW5pdChtKQkoKG0pLT54eCA9IChtKS0+eXkgPSAxLCAobSktPnh5ID0gKG0pLT55eCA9IDApCitJbml0aWFsaXplcyBhIG1hdHJpeCB0byB0aGUgaWRlbnRpZnkgdHJhbnNmb3JtYXRpb24uCisKKy5UUAorRmNNYXRyaXggKkZjTWF0cml4Q29weSAoY29uc3QgRmNNYXRyaXggKm1hdCkKK0FsbG9jYXRlcyBhIG5ldyBGY01hdHJpeCBhbmQgY29waWVzICdtYXQnIGludG8gaXQuCisKKy5UUAorRmNCb29sIEZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0MikKK1JldHVybnMgRmNUcnVlIGlmICdtYXQxJyBhbmQgJ21hdDInIGFyZSBlcXVhbCwgZWxzZSBGY0ZhbHNlLgorCisuVFAKK3ZvaWQgRmNNYXRyaXhNdWx0aXBseSAoRmNNYXRyaXggKnJlc3VsdCwgY29uc3QgRmNNYXRyaXggKmEsIGNvbnN0IEZjTWF0cml4ICpiKQorTXVsdGlwbGllcyAnYScgYW5kICdiJyB0b2dldGhlciwgcGxhY2luZyB0aGUgcmVzdWx0IGluCisncmVzdWx0Jy4gICdyZXN1bHQnIG1heSByZWZlciB0byB0aGUgc2FtIG1hdHJpeCBhcyBlaXRoZXIgJ2EnIG9yICdiJy4KKworLlRQCit2b2lkIEZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKQorSWYgJ2MnIGlzIGNvcyhhbmdsZSkgYW5kICdzJyBpcyBzaW4oYW5nbGUpLCBGY01hdHJpeFJvdGF0ZSByb3RhdGVzIHRoZQorbWF0cml4IGJ5ICdhbmdsZScuCisKKy5UUAordm9pZCBGY01hdHJpeFNjYWxlIChGY01hdHJpeCAqbSwgZG91YmxlIHN4LCBkb3VibGUgc3kpCitTY2FsZXMgJ20nIGJ5ICdzeCcgaW4gdGhlIGhvcml6b250YWwgZGltZW5zaW9uIGFuZCAnc3knIGluIHRoZQordmVydGljYWwgZGltZW5zaW9uLgorCisuVFAKK3ZvaWQgRmNNYXRyaXhTaGVhciAoRmNNYXRyaXggKm0sIGRvdWJsZSBzaCwgZG91YmxlIHN2KQorU2hlYXJzICdtJyBieSAnc2gnIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiBhbmQgJ3N2JyBpbiB0aGUKK3ZlcnRpY2FsIGRpcmVjdGlvbi4KKworLlNTIEZjQ2hhclNldAorQW4gRmNDaGFyU2V0IGlzIGEgYm9vbGVhbiBhcnJheSBpbmRpY2F0aW5nIGEgc2V0IG9mIHVuaWNvZGUgY2hhcnMuICBUaG9zZQorYXNzb2NpYXRlZCB3aXRoIGEgZm9udCBhcmUgbWFya2VkIGNvbnN0YW50IGFuZCBjYW5ub3QgYmUgZWRpdGVkLgorRmNDaGFyU2V0cyBtYXkgYmUgcmVmZXJlbmNlIGNvdW50ZWQgaW50ZXJuYWxseSB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uOwordGhpcyBtYXkgYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgYXMgdGhlIHJlc3VsdCBvZiBGY0NoYXJTZXRDb3B5IG1heQorcmV0dXJuIGl0J3MgYXJndW1lbnQsIGFuZCB0aGF0IENoYXJTZXQgbWF5IHJlbWFpbiB1bm1vZGlmaWFibGUuCisKKy5UUAorRmNDaGFyU2V0ICpGY0NoYXJTZXRDcmVhdGUgKHZvaWQpCitDcmVhdGVzIGFuIGVtcHR5IEZjQ2hhclNldCBvYmplY3QuCisKKy5UUAordm9pZCBGY0NoYXJTZXREZXN0cm95IChGY0NoYXJTZXQgKmZjcykKK0ZyZWVzIGFuIEZjQ2hhclNldCBvYmplY3QuCisKKy5UUAorRmNCb29sIEZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQorQWRkcyBhIHNpbmdsZSB1bmljb2RlIGNoYXIgdG8gdGhlIHNldCwgcmV0dXJuaW5nIEZjRmFsc2Ugb24KK2ZhaWx1cmUsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiBhIGNvbnN0YW50IHNldCBvciBmcm9tIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeS4KKworLlRQCitGY0NoYXJTZXQgKkZjQ2hhclNldENvcHkgKEZjQ2hhclNldCAqc3JjKQorTWFrZXMgYSBjb3B5IG9mICdzcmMnOyBub3RlIHRoYXQgdGhpcyBtYXkgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIG1vcmUgdGhhbgoraW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gJ3NyYycuCisKKy5UUAorRmNCb29sIEZjQ2hhclNldEVxdWFsIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK1JldHVybnMgd2hldGhlciAnYScgYW5kICdiJyBjb250YWluIHRoZSBzYW1lIHNldCBvZiB1bmljb2RlIGNoYXJzLgorCisuVFAKK0ZjQ2hhclNldCAqRmNDaGFyU2V0SW50ZXJzZWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK1JldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gYm90aCAnYScgYW5kICdiJy4KKworLlRQCitGY0NoYXJTZXQgKkZjQ2hhclNldFVuaW9uIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CitSZXR1cm5zIGEgc2V0IGluY2x1ZGluZyBvbmx5IHRob3NlIGNoYXJzIGZvdW5kIGluIGVpdGhlciAnYScgb3IgJ2InLgorCisuVFAgCitGY0NoYXJTZXQgKkZjQ2hhclNldFN1YnRyYWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK1JldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gJ2EnIGJ1dCBub3QgJ2InLgorCisuVFAKK0ZjQm9vbCBGY0NoYXJTZXRIYXNDaGFyIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKK1JldHVybnMgd2hldGhlciAnZmNzJyBjb250YWlucyB0aGUgY2hhciAndWNzNCcuCisKKy5UUAorRmNDaGFyMzIgRmNDaGFyU2V0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSkKK1JldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiB1bmljb2RlIGNoYXJzIGluICdhJy4KKworLlRQCitGY0NoYXIzMiBGY0NoYXJTZXRJbnRlcnNlY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCitSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcnMgdGhhdCBhcmUgaW4gYm90aCAnYScgYW5kICdiJy4KKworLlRQCitGY0NoYXIzMiBGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKK1JldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyB0aGF0IGFyZSBpbiAnYScgYnV0IG5vdCBpbiAnYicuCisKKy5TUyBGY1ZhbHVlCitGY1ZhbHVlIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSB0eXBlIHRhZyBhbmQgYSB1bmlvbiBvZiBhbGwgcG9zc2libGUKK2RhdGF0eXBlcy4gIFRoZSB0YWcgaXMgYW4gZW51bSBvZiB0eXBlIAorLkIgRmNUeXBlCithbmQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIG1lYXN1cmUgb2YgcnVuLXRpbWUKK3R5cGVjaGVja2luZywgYWx0aG91Z2ggdGhhdCBkZXBlbmRzIG9uIGNhcmVmdWwgcHJvZ3JhbW1pbmcuCisKKy5UUAordm9pZCBGY1ZhbHVlRGVzdHJveSAoRmNWYWx1ZSB2KQorRnJlZXMgYW55IG1lbW9yeSByZWZlcmVuY2VkIGJ5IGB2Jy4gIFZhbHVlcyBvZiB0eXBlIEZjVHlwZVN0cmluZywKK0ZjVHlwZU1hdHJpeCBhbmQgRmNUeXBlQ2hhclNldCByZWZlcmVuY2UgbWVtb3J5LCB0aGUgb3RoZXIgdHlwZXMgZG8gbm90LgorCisuVFAKK0ZjVmFsdWUgRmNWYWx1ZVNhdmUgKEZjVmFsdWUgdikKK1JldHVybnMgYSBjb3B5IG9mIGB2JyBkdXBsaWNhdGluZyBhbnkgb2JqZWN0IHJlZmVyZW5jZWQgYnkgaXQgc28gdGhhdCBgdicKK21heSBiZSBzYWZlbHkgZGVzdHJveWVkIHdpdGhvdXQgaGFybWluZyB0aGUgbmV3IHZhbHVlLgorCisuU1MgRmNQYXR0ZXJuCitBbiBGY1BhdHRlcm4gaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBob2xkcyBib3RoIHBhdHRlcm5zIHRvIG1hdGNoIGFnYWluc3QgdGhlCithdmFpbGFibGUgZm9udHMsIGFzIHdlbGwgYXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZm9udC4KKworLlRQCitGY1BhdHRlcm4gKkZjUGF0dGVybkNyZWF0ZSAodm9pZCkKK0NyZWF0ZXMgYSBwYXR0ZXJuIHdpdGggbm8gcHJvcGVydGllczsgdXNlZCB0byBidWlsZCBwYXR0ZXJucyBmcm9tIHNjcmF0Y2guCisKKy5UUAordm9pZCBGY1BhdHRlcm5EZXN0cm95IChGY1BhdHRlcm4gKnApCitEZXN0cm95cyBhIHBhdHRlcm4sIGluIHRoZSBwcm9jZXNzIGRlc3Ryb3lpbmcgYWxsIHJlbGF0ZWQgdmFsdWVzLgorCisuVFAKK0ZjQm9vbCBGY1BhdHRlcm5BZGQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKQorQWRkcyBhIHNpbmdsZSB2YWx1ZSB0byB0aGUgbGlzdCBvZiB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lZAorYG9iamVjdCcuICBJZiBgYXBwZW5kJyBpcyBGY1RydWUsIHRoZSB2YWx1ZSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIGFueQorZXhpc3RpbmcgbGlzdCwgb3RoZXJ3aXNlIGl0IGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbmluZy4gIGB2YWx1ZScgaXMgc2F2ZWQKKyh3aXRoIEZjVmFsdWVTYXZlKSB3aGVuIGluc2VydGVkIGludG8gdGhlIHBhdHRlcm4gc28gdGhhdCB0aGUgbGlicmFyeQorcmV0YWlucyBubyByZWZlcmVuY2UgdG8gYW55IGFwcGxpY2F0aW9uLXN1cHBsaWVkIGRhdGEgc3RydWN0dXJlLgorCisuVFAKK0ZjQm9vbCBGY1BhdHRlcm5BZGRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGkpCisuVFEKK0ZjQm9vbCBGY1BhdHRlcm5BZGREb3VibGUgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBkb3VibGUgZCkKKy5UUQorRmNCb29sIEZjUGF0dGVybkFkZFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IGNoYXIgKnMpCisuVFEKK0ZjQm9vbCBGY1BhdHRlcm5BZGRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY01hdHJpeCAqcykKKy5UUQorRmNCb29sIEZjUGF0dGVybkFkZENoYXJTZXQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY0NoYXJTZXQgKmMpCisuVFEKK0ZjQm9vbCBGY1BhdHRlcm5BZGRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNCb29sIGIpCitUaGVzZSBhcmUgYWxsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0aGF0IGluc2VydCBvYmplY3RzIG9mIHRoZSBzcGVjaWZpZWQKK3R5cGUgaW50byB0aGUgcGF0dGVybi4gIFVzZSB0aGVzZSBpbiBwcmVmZXJlbmNlIHRvIEZjUGF0dGVybkFkZCBhcyB0aGV5Cit3aWxsIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4gIFRoZXNlIGFsbCBhcHBlbmQgdmFsdWVzIHRvCithbnkgZXhpc3RpbmcgbGlzdCBvZiB2YWx1ZXMuCisKKy5UUAorRmNSZXN1bHQgRmNQYXR0ZXJuR2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGlkLCBGY1ZhbHVlICp2KQorUmV0dXJucyBpbiBgdicgdGhlIGBpZCd0aCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGBvYmplY3QnLgorVGhlIHZhbHVlIHJldHVybmVkIGlzIG5vdCBhIGNvcHksIGJ1dCByYXRoZXIgcmVmZXJzIHRvIHRoZSBkYXRhIHN0b3JlZAord2l0aGluIHRoZSBwYXR0ZXJuIGRpcmVjdGx5LiAgQXBwbGljYXRpb25zIG11c3Qgbm90IGZyZWUgdGhpcyB2YWx1ZS4KKworLlRQCitGY1Jlc3VsdCBGY1BhdHRlcm5HZXRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGludCAqaSk7CisuVFEKK0ZjUmVzdWx0IEZjUGF0dGVybkdldERvdWJsZSAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBkb3VibGUgKmQpOworLlRRCitGY1Jlc3VsdCBGY1BhdHRlcm5HZXRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgY2hhciAqKmNvbnN0IHMpOworLlRRCitGY1Jlc3VsdCBGY1BhdHRlcm5HZXRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNNYXRyaXggKipzKTsKKy5UUQorRmNSZXN1bHQgRmNQYXR0ZXJuR2V0Q2hhclNldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY0NoYXJTZXQgKipjKTsKKy5UUQorRmNSZXN1bHQgRmNQYXR0ZXJuR2V0Qm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY0Jvb2wgKmIpOworVGhlc2UgYXJlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0aGF0IGNhbGwgRmNQYXR0ZXJuR2V0IGFuZCB2ZXJpZnkgdGhhdCB0aGUKK3JldHVybmVkIGRhdGEgaXMgb2YgdGhlIGV4cGVjdGVkIHR5cGUuIFRoZXkgcmV0dXJuIEZjUmVzdWx0VHlwZU1pc21hdGNoIGlmCit0aGlzIGlzIG5vdCB0aGUgY2FzZS4gIE5vdGUgdGhhdCB0aGVzZSAobGlrZSBGY1BhdHRlcm5HZXQpIGRvIG5vdCBtYWtlIGEKK2NvcHkgb2YgYW55IGRhdGEgc3RydWN0dXJlIHJlZmVyZW5jZWQgYnkgdGhlIHJldHVybiB2YWx1ZS4gIFVzZSB0aGVzZQoraW4gcHJlZmVyZW5jZSB0byBGY1BhdHRlcm5HZXQgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUgdHlwZWNoZWNraW5nLgorCisuVFAKK0ZjUGF0dGVybiAqRmNQYXR0ZXJuQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgLi4uKTsKKy5UUQorRmNQYXR0ZXJuICpGY1BhdHRlcm5WYUJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIHZhX2xpc3QgdmEpCitCdWlsZHMgYSBwYXR0ZXJuIHVzaW5nIGEgbGlzdCBvZiBvYmplY3RzLCB0eXBlcyBhbmQgdmFsdWVzLiAgRWFjaAordmFsdWUgdG8gYmUgZW50ZXJlZCBpbiB0aGUgcGF0dGVybiBpcyBzcGVjaWZpZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6CisuSVAKKzEuIE9iamVjdCBuYW1lLCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0eSB0byBiZSBhZGRlZC4KKy5JUAorMi4gT2JqZWN0IHR5cGUsIG9uZSBvZiB0aGUgRmNUeXBlIGVudW1lcmF0ZWQgdmFsdWVzCisuSVAKKzMuIFZhbHVlLCBub3QgYW4gRmNWYWx1ZSwgYnV0IHRoZSByYXcgdHlwZSBhcyBwYXNzZWQgdG8gYW55IG9mIHRoZQorRmNQYXR0ZXJuQWRkPHR5cGU+IGZ1bmN0aW9ucy4gIE11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KKy5JUAorVGhlIGFyZ3VtZW50IGxpc3QgaXMgdGVybWluYXRlZCBieSBhIG51bGwgb2JqZWN0IG5hbWUsIG5vIG9iamVjdCB0eXBlIG5vcgordmFsdWUgbmVlZCBiZSBwYXNzZWQgZm9yIHRoaXMuICBUaGUgdmFsdWVzIGFyZSBhZGRlZCB0byBgcGF0dGVybicsIGlmCitgcGF0dGVybicgaXMgbnVsbCwgYSBuZXcgcGF0dGVybiBpcyBjcmVhdGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwYXR0ZXJuIGlzCityZXR1cm5lZC4gRXhhbXBsZToKKy5SUworLklQCitwYXR0ZXJuID0gRmNQYXR0ZXJuQnVpbGQgKDAsIEZDX0ZBTUlMWSwgRnRUeXBlU3RyaW5nLCAiVGltZXMiLCAoY2hhciAqKSAwKTsKKy5SRQorLklQCitGY1BhdHRlcm5WYUJ1aWxkIGlzIHVzZWQgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGluIHRoZSBmb3JtIG9mIGEKK3ZhcmFyZ3MgdmFsdWUuCisKKy5UUAorRmNCb29sIEZjUGF0dGVybkRlbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpCitEZWxldGVzIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBgb2JqZWN0JywgcmV0dXJuaW5nIAord2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RlZCBvciBub3QuCisKKy5UUAordm9pZCBGY1BhdHRlcm5QcmludCAoRmNQYXR0ZXJuICpwKQorUHJpbnRzIGFuIGVhc2lseSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBwYXR0ZXJuIHRvIHN0ZG91dC4gIFRoZXJlIGlzCitubyBwcm92aXNpb24gZm9yIHJlcGFyc2luZyBkYXRhIGluIHRoaXMgZm9ybWF0LCBpdCdzIGp1c3QgZm9yIGRpYWdub3N0aWNzCithbmQgZGVidWdnaW5nLgorCisuVFAKK3ZvaWQgRmNEZWZhdWx0U3Vic3RpdHV0ZSAoRmNQYXR0ZXJuICpwYXR0ZXJuKQorU3VwcGxpZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIHVuZGVyc3BlY2lmaWVkIGZvbnQgcGF0dGVybnM6CisuUlMKKy5JUCBcKGJ1IAorUGF0dGVybnMgd2l0aG91dCBhIHNwZWNpZmllZCBzdHlsZSBvciB3ZWlnaHQgYXJlIHNldCB0byBNZWRpdW0KKy5JUCBcKGJ1CitQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHN0eWxlIG9yIHNsYW50IGFyZSBzZXQgdG8gUm9tYW4KKy5JUCBcKGJ1CitQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHBpeGVsIHNpemUgYXJlIGdpdmVuIG9uZSBjb21wdXRlZCBmcm9tCithbnkgc3BlY2lmaWVkIHBvaW50IHNpemUgKGRlZmF1bHQgMTIpLCBkcGkgKGRlZmF1bHQgNzUpIGFuZCBzY2FsZSAoZGVmYXVsdAorMSkuCisuUkUKKworLlRQCitGY1BhdHRlcm4gKkZjTmFtZVBhcnNlIChjb25zdCBjaGFyICpuYW1lKQorQ29udmVydHMgJ25hbWUnIGZyb20gdGhlIHN0YW5kYXJkIHRleHQgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSBpbnRvIGEgcGF0dGVybi4KKworLlRQCitGY0NoYXI4ICpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCkKK0NvbnZlcnRzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gdGhlIHN0YW5kYXJkIHRleHQgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZS4KK1RoZSByZXR1cm4gdmFsdWUgaXMgbm90IHN0YXRpYywgYnV0IGluc3RlYWQgcmVmZXJzIHRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkKK3doaWNoIHNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorCisuU1MgRmNGb250U2V0CitBbiBGY0ZvbnRTZXQgc2ltcGx5IGhvbGRzIGEgbGlzdCBvZiBwYXR0ZXJuczsgdGhlc2UgYXJlIHVzZWQgdG8gcmV0dXJuIHRoZQorcmVzdWx0cyBvZiBsaXN0aW5nIGF2YWlsYWJsZSBmb250cy4KKy5UUAorRmNGb250U2V0ICpGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpCitDcmVhdGVzIGFuIGVtcHR5IGZvbnQgc2V0LgorCisuVFAKK3ZvaWQgRmNGb250U2V0RGVzdHJveSAoRmNGb250U2V0ICpzKTsKK0Rlc3Ryb3lzIGEgZm9udCBzZXQuICBOb3RlIHRoYXQgdGhpcyBkZXN0cm95cyBhbnkgcmVmZXJlbmNlZCBwYXR0ZXJucyBhcword2VsbC4KKworLlRQIAorRmNCb29sIEZjRm9udFNldEFkZCAoRmNGb250U2V0ICpzLCBGY1BhdHRlcm4gKmZvbnQpCitBZGRzIGEgcGF0dGVybiB0byBhIGZvbnQgc2V0LiAgTm90ZSB0aGF0IHRoZSBwYXR0ZXJuIGlzIG5vdCBjb3BpZWQgYmVmb3JlCitiZWluZyBpbnNlcnRlZCBpbnRvIHRoZSBzZXQuCisKKy5TUyBGY09iamVjdFNldAorQW4gRmNPYmplY3RTZXQgaG9sZHMgYSBsaXN0IG9mIHBhdHRlcm4gcHJvcGVydHkgbmFtZXM7IGl0IGlzIHVzZWQgdG8KK2luZGljaWF0ZSB3aGljaCBwcm9wZXJ0aWVzIGFyZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgcGF0dGVybnMgZnJvbQorRmNGb250TGlzdC4KKworLlRQCitGY09iamVjdFNldCAqRmNPYmplY3RTZXRDcmVhdGUgKHZvaWQpCitDcmVhdGVzIGFuIGVtcHR5IHNldC4KKworLlRQCitGY0Jvb2wgRmNPYmplY3RTZXRBZGQgKEZjT2JqZWN0U2V0ICpvcywgY29uc3QgY2hhciAqb2JqZWN0KQorQWRkcyBhIHByb3ByZXR5IG5hbWUgdG8gdGhlIHNldC4KKworLlRQCit2b2lkIEZjT2JqZWN0U2V0RGVzdHJveSAoRmNPYmplY3RTZXQgKm9zKQorRGVzdHJveXMgYW4gb2JqZWN0IHNldC4KKworCisuVFAKK0ZjT2JqZWN0U2V0ICpGY09iamVjdFNldEJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgLi4uKQorLlRRCitGY09iamVjdFNldCAqRmNPYmplY3RTZXRWYUJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgdmFfbGlzdCB2YSkKK1RoZXNlIGJ1aWxkIGFuIG9iamVjdCBzZXQgZnJvbSBhIG51bGwtdGVybWluYXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzLgorCisuU1MgRmNCbGFua3MKK0FuIEZjQmxhbmtzIG9iamVjdCBob2xkcyBhIGxpc3Qgb2YgVW5pY29kZSBjaGFycyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8KK2JlIGJsYW5rIHdoZW4gZHJhd24uICBXaGVuIHNjYW5uaW5nIG5ldyBmb250cywgYW55IGdseXBocyB3aGljaCBhcmUKK2VtcHR5IGFuZCBub3QgaW4gdGhpcyBsaXN0IHdpbGwgYmUgYXNzdW1lZCB0byBiZSBicm9rZW4gYW5kIG5vdCBwbGFjZWQgaW4KK3RoZSBGY0NoYXJTZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmb250LiAgVGhpcyBwcm92aWRlcyBhIHNpZ25pZmljYW50bHkgbW9yZQorYWNjdXJhdGUgQ2hhclNldCBmb3IgYXBwbGljYXRpb25zLgorCisuVFAKK0ZjQmxhbmtzICpGY0JsYW5rc0NyZWF0ZSAodm9pZCkKK0NyZWF0ZXMgYW4gZW1wdHkgRmNCbGFua3Mgb2JqZWN0LgorCisuVFAKK3ZvaWQgRmNCbGFua3NEZXN0cm95IChGY0JsYW5rcyAqYikKK0Rlc3Ryb3lzIGFuIEZjQmxhbmtzIG9iamVjdCwgZnJlZWluZyBhbnkgYXNzb2NpYXRlZCBtZW1vcnkuCisKKy5UUAorRmNCb29sIEZjQmxhbmtzQWRkIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCkKK0FkZHMgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIGFuIEZjQmxhbmtzIG9iamVjdCwgcmV0dXJuaW5nIEZjRmFsc2UKK2lmIHRoaXMgcHJvY2VzcyByYW4gb3V0IG9mIG1lbW9yeS4KKworLlRQCitGY0Jvb2wgRmNCbGFua3NJc01lbWJlciAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpCitSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGY0JsYW5rcyBvYmplY3QgY29udGFpbnMgdGhlIGluZGljYXRlZCBVbmljb2RlCit2YWx1ZS4KKworLlNTIEZjQ29uZmlnCitBbiBGY0NvbmZpZyBvYmplY3QgaG9sZHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgY29uZmlndXJhdGlvbi4KK1RoZXJlIGlzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdoaWNoIGFwcGxpY2F0aW9ucyBtYXkgdXNlIGJ5IHBhc3NpbmcgMCB0bworYW55IGZ1bmN0aW9uIHVzaW5nIHRoZSBkYXRhIHdpdGhpbiBhbiBGY0NvbmZpZy4KKworLlRQCitGY0NvbmZpZyAqRmNDb25maWdDcmVhdGUgKHZvaWQpCitDcmVhdGVzIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb24uCisKKy5UUCAKK3ZvaWQgRmNDb25maWdEZXN0cm95IChGY0NvbmZpZyAqY29uZmlnKQorRGVzdHJveXMgYSBjb25maWd1cmF0aW9uIGFuZCBhbnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQuICBOb3RlIHRoYXQgY2FsbGluZwordGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByZXR1cm4gZnJvbSBGY0NvbmZpZ0dldEN1cnJlbnQgd2lsbCBwbGFjZSB0aGUgbGlicmFyeQoraW4gYW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZS4KKworLlRQCitGY0Jvb2wgRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKQorU2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gJ2NvbmZpZycuICBJbXBsaWNpdGx5IGNhbGxzCitGY0NvbmZpZ0J1aWxkRm9udHMgaWYgbmVjZXNzYXJ5LCByZXR1cm5pbmcgRmNGYWxzZSBpZiB0aGF0IGNhbGwgZmFpbHMuCisKKy5UUAorRmNDb25maWcgKkZjQ29uZmlnR2V0Q3VycmVudCAodm9pZCkKK1JldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorCisuVFAKK0ZjQm9vbCBGY0NvbmZpZ0J1aWxkRm9udHMgKEZjQ29uZmlnICpjb25maWcpCitCdWlsZHMgdGhlIHNldCBvZiBhdmFpbGFibGUgZm9udHMgZm9yIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiAgTm90ZSB0aGF0CithbnkgY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbiBhZnRlciB0aGlzIGNhbGwgaGF2ZSBpbmRldGVybWluYXRlIGVmZmVjdHMuCitSZXR1cm5zIEZjRmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5LgorCisuVFAKK2NoYXIgKipGY0NvbmZpZ0dldERpcnMgKEZjQ29uZmlnICpjb25maWcpCitSZXR1cm5zIHRoZSBsaXN0IG9mIGZvbnQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluICdjb25maWcnLgorCisuVFAgCitjaGFyICoqRmNDb25maWdHZXRDb25maWdGaWxlcyAoRmNDb25maWcgKmNvbmZpZykKK1JldHVybnMgdGhlIGxpc3Qgb2Yga25vd24gY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkIHRvIGdlbmVyYXRlICdjb25maWcnLgorTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgaW5jbHVkZSBhbnkgY29uZmlndXJhdGlvbiBkb25lIHdpdGggRmNDb25maWdQYXJzZS4KKworLlRQCitjaGFyICpGY0NvbmZpZ0dldENhY2hlIChGY0NvbmZpZyAqY29uZmlnKQorUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB1c2VkIHRvIHN0b3JlIHBlci11c2VyIGZvbnQgaW5mb3JtYXRpb24uCisKKy5UUAorRmNGb250U2V0ICpGY0NvbmZpZ0dldEZvbnRzIChGY0NvbmZpZyAqY29uZmlnLCBGY1NldE5hbWUgc2V0KQorUmV0dXJucyBvbmUgb2YgdGhlIHR3byBzZXRzIG9mIGZvbnRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gYXMgc3BlY2lmaWVkIAorYnkgJ3NldCcuCisKKy5UUAorRmNCbGFua3MgKkZjQ29uZmlnR2V0QmxhbmtzIChGY0NvbmZpZyAqY29uZmlnKQorUmV0dXJucyB0aGUgRmNCbGFua3Mgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiwgaWYgbm8KK2JsYW5rcyB3ZXJlIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMC4KKworLlRQCitGY0Jvb2wgRmNDb25maWdBcHBGb250QWRkRmlsZSAoRmNDb25maWcgKmNvbmZpZywgY29uc3QgY2hhciAqZmlsZSkKK0FkZHMgYW4gYXBwbGljYXRpb24tc3BlY2lmaWMgZm9udCB0byB0aGUgY29uZmlndXJhdGlvbi4KKworLlRQIAorRmNCb29sIEZjQ29uZmlnQXBwRm9udEFkZERpciAoRmNDb25maWcgKmNvbmZpZywgY29uc3QgY2hhciAqZGlyKQorU2NhbnMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGZvbnRzLCBhZGRpbmcgZWFjaCBvbmUgZm91bmQgdG8gdGhlCithcHBsaWNhdGlvbi1zcGVjaWZpYyBzZXQgb2YgZm9udHMuCisKKy5UUCAKK3ZvaWQgRmNDb25maWdBcHBGb250Q2xlYXIgKEZjQ29uZmlnICpjb25maWcpCitDbGVhcnMgdGhlIHNldCBvZiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBmb250cy4KKworLlRQCitGY0Jvb2wgRmNDb25maWdTdWJzdGl0dXRlIChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjTWF0Y2hLaW5kIGtpbmQpCitQZXJmb3JtcyB0aGUgc2VxdWVuY2Ugb2YgcGF0dGVybiBtb2RpZmljYXRpb24gb3BlcmF0aW9ucywgaWYgJ2tpbmQnIGlzCitGY01hdGNoUGF0dGVybiwgdGhlbiB0aG9zZSB0YWdnZWQgYXMgcGF0dGVybiBvcGVyYXRpb25zIGFyZSBhcHBsaWVkLCBlbHNlIAoraWYgJ2tpbmQnIGlzIEZjTWF0Y2hGb250LCB0aG9zZSB0YWdnZWQgYXMgZm9udCBvcGVyYXRpb25zIGFyZSBhcHBsaWVkLgorCisuVFAKK0ZjUGF0dGVybiAqRmNGb250TWF0Y2ggKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNSZXN1bHQgKnJlc3VsdCkKK1JldHVybnMgdGhlIGZvbnQgaW4gJ2NvbmZpZycgbW9zdCBjbG9zZSBtYXRjaGluZyAncCcuICBUaGlzIGZ1bmN0aW9uCitzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgRmNDb25maWdTdWJzdGl0dXRlIGFuZCBGY0RlZmF1bHRTdWJzdGl0dXRlIGhhdmUKK2JlZW4gY2FsbGVkOyBvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBiZSBsZXNzIHVzZWZ1bC4KKworLlRQCitGY0ZvbnRTZXQgKkZjRm9udExpc3QgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNPYmplY3RTZXQgKm9zKQorU2VsZWN0cyBmb250cyBtYXRjaGluZyAncCcsIGNyZWF0ZXMgcGF0dGVybnMgZnJvbSB0aG9zZSBmb250cyBjb250YWluaW5nCitvbmx5IHRoZSBvYmplY3RzIGluICdvcycgYW5kIHJldHVybnMgdGhlIHNldCBvZiB1bmlxdWUgc3VjaCBwYXR0ZXJucy4KKworLlRQCitjaGFyICpGY0NvbmZpZ0ZpbGVuYW1lIChjb25zdCBjaGFyICpuYW1lKQorR2l2ZW4gdGhlIHNwZWNpZmllZCBleHRlcm5hbCBlbnRpdHkgbmFtZSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGZpbGVuYW1lLgorVGhpcyBwcm92aWRlcyBhcHBsaWNhdGlvbnMgYSB3YXkgdG8gY29udmVydCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gZmlsZQorcmVmZXJlbmNlcyBpbnRvIGZpbGVuYW1lIGZvcm0uIAorLlAKK0EgbnVsbCBvciBlbXB0eSAnbmFtZScgaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIHNob3VsZAorYmUgdXNlZDsgd2hpY2ggZmlsZSB0aGlzIHJlZmVyZW5jZXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKK0ZDX0NPTkZJR19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLiAgTmV4dCwgaWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggJ34nLCBpdAorcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCB1c2VycyBob21lIGRpcmVjdG9yeS4gIE90aGVyd2lzZSBpZiB0aGUgbmFtZQorZG9lc24ndCBzdGFydCB3aXRoICcvJywgaXQgcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCitkaXJlY3Rvcnk7IHRoZSBidWlsdC1pbiBkZWZhdWx0IGRpcmVjdG9yeSBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQorRkNfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworLlNTIEluaXRpYWxpemF0aW9uCitUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIGxpYnJhcnkgaXMgaW5pdGlhbGl6ZWQuCisKKy5UUAorRmNCb29sIEZjSW5pdENvbmZpZyAodm9pZCkKK0luaXRpYWxpemVzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlCisKKy5UUAorRmNCb29sIEZjSW5pdEZvbnRzICh2b2lkKQorSW5pdGlhbGl6ZXMgdGhlIHNldCBvZiBmb250cyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorCisuVFAKK0ZjQm9vbCBGY0luaXQgKHZvaWQpCitDYWxscyBGY0luaXRDb25maWcgYW5kIEZjSW5pdEZvbnRzIHRvIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdAorY29uZmlndXJhdGlvbi4KKworLlNTIEZyZWVUeXBlIHNwZWNpZmljIGZ1bmN0aW9ucworLm5mCisuQiAjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY2ZyZWV0eXBlLmg+CisuZmkKK1doaWxlIHRoZSBmb250Y29uZmlnIGxpYnJhcnkgZG9lc24ndCBpbnNpc3QgdGhhdCBGcmVlVHlwZSBiZSB1c2VkIGFzIHRoZQorcmFzdGVyaXphdGlvbiBtZWNoYW5pc20gZm9yIGZvbnRzLCBpdCBkb2VzIHByb3ZpZGUgc29tZSBjb252ZW5pZW5jZQorZnVuY3Rpb25zLgorCisuVFAKK0ZUX1VJbnQgRmNGcmVlVHlwZUNoYXJJbmRleCAoRlRfRmFjZSBmYWNlLCBGY0NoYXIzMiB1Y3M0KQorTWFwcyBhIFVuaWNvZGUgY2hhciB0byBhIGdseXBoIGluZGV4LiAgVGhpcyBmdW5jdGlvbiB1c2VzIGluZm9ybWF0aW9uIGZyb20KK3NldmVyYWwgcG9zc2libGUgdW5kZXJseWluZyBlbmNvZGluZyB0YWJsZXMgdG8gd29yayBhcm91bmQgYnJva2VuIGZvbnRzLgorQXMgYSByZXN1bHQsIHRoaXMgZnVuY3Rpb24gaXNuJ3QgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiBwZXJmb3JtYW5jZQorc2Vuc2l0aXZlIGFyZWFzOyByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgY2FjaGVkIGJ5CitoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zLgorCisuVFAKK0ZjQ2hhclNldCAqRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcykgU2NhbnMgYQorRnJlZVR5cGUgZmFjZSBhbmQgcmV0dXJucyB0aGUgc2V0IG9mIGVuY29kZWQgVW5pY29kZSBjaGFycy4gIFRoaXMgc2NhbnMKK3NldmVyYWwgZW5jb2RpbmcgdGFibGVzIHRvIGJ1aWxkIGFzIGNvbXBsZXRlIGEgbGlzdCBhcyBwb3NzaWJsZS4gIElmCisnYmxhbmtzJyBpcyBub3QgMCwgdGhlIGdseXBocyBpbiB0aGUgZm9udCBhcmUgZXhhbWluZWQgYW5kIGFueSBibGFuayBnbHlwaHMKK25vdCBpbiAnYmxhbmtzJyBhcmUgbm90IHBsYWNlZCBpbiB0aGUgcmV0dXJuZWQgRmNDaGFyU2V0LgorCisuVFAKK0ZjUGF0dGVybiAqRmNGcmVlVHlwZVF1ZXJ5IChjb25zdCBjaGFyICpmaWxlLCBpbnQgaWQsIEZjQmxhbmtzICpibGFua3MsIGludCAqY291bnQpCitDb25zdHJ1Y3RzIGEgcGF0dGVybiByZXByZXNlbnRpbmcgdGhlICdpZCd0aCBmb250IGluICdmaWxlJy4gIFRoZSBudW1iZXIKK29mIGZvbnRzIGluICdmaWxlJyBpcyByZXR1cm5lZCBpbiAnY291bnQnLgorCisuU1MgWE1MIHNwZWNpZmljIGZ1bmN0aW9ucworLm5mCisuQiAjaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3htbC5oPgorLmZpCitUaGVzZSBmdW5jdGlvbnMgZXhwb3NlIHRoZSBsaWJ4bWwyIGRhdGF0eXBlcyB1c2VkIGZvciBmb250IGNvbmZpZ3VyYXRpb24uCisKKy5UUAoreG1sRG9jUHRyIEZjQ29uZmlnTG9hZCAoY29uc3QgY2hhciAqZmlsZSkKK0xvYWRzIGEgY29uZmlndXJhdGlvbiBmaWxlIG1hcHBpbmcgJ2ZpbGUnIGludG8gYSBmaWxlbmFtZSB3aXRoCitGY0NvbmZpZ0ZpbGVuYW1lLiAgVGhpcyBkb2Vzbid0IGxvYWQgYSBjb21wbGV0ZSBjb25maWd1cmF0aW9uIGFzIGFueQoraW5jbHVkZSBmaWxlcyByZWZlcmVuY2VkIGZyb20gJ2ZpbGUnIHdpbGwgbm90IGJlIGxvYWRlZC4KKworLlRQCitGY0Jvb2wgRmNDb25maWdQYXJzZSAoRmNDb25maWcgKmNvbmZpZywgeG1sRG9jUHRyIGRvYykKK1dhbGtzIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGFuZCBjb25zdHJ1Y3RzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBpbgorJ2NvbmZpZycuICBBbnkgaW5jbHVkZSBmaWxlcyByZWZlcmVuY2VkIGZyb20gd2l0aGluICdkb2MnIHdpbGwgYmUgbG9hZGVkCit3aXRoIEZjQ29uZmlnTG9hZCBhbmQgYWxzbyBwYXJzZWQuCisKKy5TUyBGaWxlIGFuZCBEaXJlY3Rvcnkgcm91dGluZXMKKworLlRQCitGY0Jvb2wgRmNGaWxlU2NhbiAoRmNGb250U2V0ICpzZXQsIEZjRmlsZUNhY2hlICpjYWNoZSwgRmNCbGFua3MgKmJsYW5rcywgY29uc3QgY2hhciAqZmlsZSwgRmNCb29sIGZvcmNlKQorU2NhbnMgYSBzaW5nbGUgZmlsZSBhbmQgYWRkcyBhbGwgZm9udHMgZm91bmQgdG8gJ3NldCcuICBJZiAnZm9yY2UnIGlzIEZjVHJ1ZSwKK3RoZW4gdGhlIGZpbGUgaXMgc2Nhbm5lZCBldmVuIGlmIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gaXMgZm91bmQgaW4gJ2NhY2hlJy4KKworLlRQCitGY0Jvb2wgRmNEaXJTY2FuIChGY0ZvbnRTZXQgKnNldCwgRmNGaWxlQ2FjaGUgKmNhY2hlLCBGY0JsYW5rcyAqYmxhbmtzLCBjb25zdCBjaGFyICpkaXIsIEZjQm9vbCBmb3JjZSkKK1NjYW5zIGFuIGVudGlyZSBkaXJlY3RvcnkgYW5kIGFkZHMgYWxsIGZvbnRzIGZvdW5kIHRvICdzZXQnLiAgSWYgJ2ZvcmNlJyBpcworRmNUcnVlLCB0aGVuIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCBmaWxlcyB3aXRoaW4gaXQgYXJlIHNjYW5uZWQgZXZlbiBpZgoraW5mb3JtYXRpb24gaXMgcHJlc2VudCBpbiB0aGUgcGVyLWRpcmVjdG9yeSBjYWNoZSBmaWxlIG9yICdjYWNoZScuCisKKy5UUAorRmNCb29sIEZjRGlyU2F2ZSAoRmNGb250U2V0ICpzZXQsIGNvbnN0IGNoYXIgKmRpcikKK0NyZWF0ZXMgdGhlIHBlci1kaXJlY3RvcnkgY2FjaGUgZmlsZSBmb3IgJ2RpcicgYW5kIHBvcHVsYXRlcyBpdCB3aXRoIHRoZQorZm9udHMgaW4gJ3NldCcuCisKKy5TUyBTdHJpbmcgdXRpbGl0aWVzCisKKy5UUAoraW50IEZjVXRmOFRvVWNzNCAoRmNDaGFyOCAqc3JjLCBGY0NoYXIzMiAqZHN0LCBpbnQgbGVuKQorQ29udmVydHMgdGhlIG5leHQgVW5pY29kZSBjaGFyIGZyb20gJ3NyYycgaW50byAnZHN0JyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyCitvZiBieXRlcyBjb250YWluaW5nIHRoZSBjaGFyLiAgJ3NyYycgbnVzdCBiZSBhdCBsZWFzdCAnbGVuJyBieXRlcyBsb25nLgorCisuVFAKK0ZjQm9vbCBGY1V0ZjhMZW4gKEZjQ2hhcjggKnN0cmluZywgaW50IGxlbiwgaW50ICpuY2hhciwgaW50ICp3Y2hhcikKK0NvdW50cyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY2hhcnMgaW4gJ2xlbicgYnl0ZXMgb2YgJ3N0cmluZycuICBQbGFjZXMgdGhhdAorY291bnQgaW4gJ25jaGFyJy4gICd3Y2hhcicgY29udGFpbnMgMSwgMiBvciA0IGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mCitieXRlcyBuZWVkZWQgdG8gaG9sZCB0aGUgbGFyZ2VzdCB1bmljb2RlIGNoYXIgY291bnRlZC4gIFRoZSByZXR1cm4gdmFsdWUKK2luZGljYXRlcyB3aGV0aGVyICdzdHJpbmcnIGlzIGEgd2VsbC1mb3JtZWQgVVRGOCBzdHJpbmcuCisKKy5UUAorY2hhciAqRmNTdHJDb3B5IChjb25zdCBjaGFyICpzKQorQWxsb2NhdGVzIG1lbW9yeSwgY29waWVzICdzJyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGJ1ZmZlci4gIFllcywgdGhpcyBpcworJ3N0cmR1cCcsIGJ1dCB0aGF0IGZ1bmN0aW9uIGlzbid0IGF2YWlsYWJsZSBvbiBldmVyeSBwbGF0Zm9ybS4KKworLlRQCitpbnQgRmNTdHJDbXBJZ25vcmVDYXNlIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCitSZXR1cm5zIHRoZSB1c3VhbCA8MCwgMCwgPjAgcmVzdWx0IG9mIGNvbXBhcmluZyAnczEnIGFuZCAnczInLiAgVGhpcyB0ZXN0CitpcyBjYXNlLWluc2Vuc2l0aXZlIGluIHRoZSBBU0NJSSByYW5nZSBhbmQgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggVVRGOAorZW5jb2RlZCBzdHJpbmdzLCBhbHRob3VnaCBpdCBkb2VzIG5vdCBjaGVjayBmb3Igd2VsbCBmb3JtZWQgc3RyaW5ncy4KKworLlNIIENPTkZJR1VSQVRJT04gRklMRSBGT1JNQVQKK0NvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGZvbnRjb25maWcgYXJlIHN0b3JlZCBpbiBYTUwgZm9ybWF0OyB0aGlzCitmb3JtYXQgbWFrZXMgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiB0b29scyBlYXNpZXIgdG8gd3JpdGUgYW5kIGVuc3VyZXMgdGhhdAordGhleSB3aWxsIGdlbmVyYXRlIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBjb25maWd1cmF0aW9uIGZpbGVzLiAgQXMgWE1MCitmaWxlcyBhcmUgcGxhaW4gdGV4dCwgdGhleSBjYW4gYWxzbyBiZSBtYW5pcHVsYXRlZCBieSB0aGUgZXhwZXJ0IHVzZXIgdXNpbmcKK2EgdGV4dCBlZGl0b3IuCisuUAorVGhlIGZvbnRjb25maWcgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIHJlc2lkZXMgaW4gdGhlIGV4dGVybmFsIGVudGl0eQorImZvbnRzLmR0ZCI7IHRoaXMgaXMgbm9ybWFsbHkgc3RvcmVkIGluIHRoZSBkZWZhdWx0IGZvbnQgY29uZmlndXJhdGlvbgorZGlyZWN0b3J5ICgvZXRjL2ZvbnRzKS4gIEVhY2ggY29uZmlndXJhdGlvbiBmaWxlIHNob3VsZCBjb250YWluIHRoZQorZm9sbG93aW5nIHN0cnVjdHVyZToKKy5zcAorLm5mCisJPD94bWwgdmVyc2lvbj0iMS4wIj8+CisJPCFET0NUWVBFIGZvbnRjb25maWcgU1lTVEVNICJmb250cy5kdGQiPgorCTxmb250Y29uZmlnPgorCS4uLgorCTwvZm9udGNvbmZpZz4KKy5maQorLlAKKy5TUyA8Zm9udGNvbmZpZz4KK1RoaXMgaXMgdGhlIHRvcCBsZXZlbCBlbGVtZW50IGZvciBhIGZvbnQgY29uZmlndXJhdGlvbiBhbmQgY2FuIGNvbnRhaW4KKzxkaXI+LCA8Y2FjaGU+LCA8aW5jbHVkZT4sIDxtYXRjaD4gYW5kIDxhbGlhcz4gZWxlbWVudHMgaW4gYW55IG9yZGVyLgorCisuU1MgPGRpcj4KK1RoaXMgZWxlbWVudCBjb250YWlucyBhIGRpcmVjdG9yeSBuYW1lIHdoaWNoIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZm9udCBmaWxlcwordG8gaW5jbHVkZSBpbiB0aGUgc2V0IG9mIGF2YWlsYWJsZSBmb250cy4KKworLlNTIDxjYWNoZT4KK1RoaXMgZWxlbWVudCBjb250YWlucyBhIGZpbGUgbmFtZSBmb3IgdGhlIHBlci11c2VyIGNhY2hlIG9mIGZvbnQKK2luZm9ybWF0aW9uLiAgSWYgaXQgc3RhcnRzIHdpdGggJ34nLCBpdCByZWZlcnMgdG8gYSBmaWxlIGluIHRoZSB1c2VycworaG9tZSBkaXJlY3RvcnkuICBUaGlzIGZpbGUgaXMgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGZvbnRzIHRoYXQKK2lzbid0IHByZXNlbnQgaW4gdGhlIHBlci1kaXJlY3RvcnkgY2FjaGUgZmlsZXMuICBJdCBpcyBhdXRvbWF0aWNhbGx5CittYWludGFpbmVkIGJ5IHRoZSBmb250Y29uZmlnIGxpYnJhcnkuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBmaWxlIAoraXMgYGB+Ly5mb250cy5jYWNoZScnLgorCisuU1MgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9Im5vIj4KK1RoaXMgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFdoZW4KK3RoZSBYTUwgZGF0YXR5cGUgaXMgdHJhdmVyc2VkIGJ5IEZjQ29uZmlnUGFyc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQord2lsbCBhbHNvIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBjb25maWd1cmF0aW9uIGJ5IHBhc3NpbmcgdGhlIGZpbGVuYW1lIHRvCitGY0NvbmZpZ0xvYWRBbmRQYXJzZS4gIElmICdpZ25vcmVfbWlzc2luZycgaXMgc2V0IHRvICJ5ZXMiIGluc3RlYWQgb2YgdGhlCitkZWZhdWx0ICJubyIsIGEgbWlzc2luZyBmaWxlIHdpbGwgZWxpY2l0IG5vIHdhcm5pbmcgbWVzc2FnZSBmcm9tIHRoZSBsaWJyYXJ5LgorCisuU1MgPG1hdGNoIHRhcmdldD0icGF0dGVybiI+CitUaGlzIGVsZW1lbnQgaG9sZHMgZmlyc3QgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgdGVzdHMgYW5kIHRoZW4gYQorKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIGVkaXRzLiAgUGF0dGVybnMgd2hpY2ggbWF0Y2ggYWxsIG9mIHRoZSB0ZXN0cyBhcmUKK3N1YmplY3RlZCB0byBhbGwgdGhlIGVkaXRzLiAgSWYgJ3RhcmdldCcgaXMgc2V0IHRvICJmb250IiBpbnN0ZWFkIG9mIHRoZQorZGVmYXVsdCAicGF0dGVybiIsIHRoZW4gdGhpcyBlbGVtZW50IGFwcGxpZXMgdG8gdGhlIGZvbnQgbmFtZSByZXN1bHRpbmcgZnJvbQorYSBtYXRjaCByYXRoZXIgdGhhbiBhIGZvbnQgcGF0dGVybiB0byBiZSBtYXRjaGVkLgorCisuU1MgPHRlc3QgcXVhbD0iYW55IiBuYW1lPSJwcm9wZXJ0eSIgY29tcGFyZT0iZXEiPgorVGhpcyBlbGVtZW50IGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlIHdoaWNoIGlzIGNvbXBhcmVkIHdpdGggdGhlIHBhdHRlcm4KK3Byb3BlcnR5ICJwcm9wZXJ0eSIgKHN1YnN0aXR1dGUgYW55IG9mIHRoZSBwcm9wZXJ0eSBuYW1lcyBzZWVuIGFib3ZlKS4KKydjb21wYXJlJyBjYW4gYmUgb25lIG9mICJlcSIsICJub3RfZXEiLCAibGVzcyIsICJsZXNzX2VxIiwgIm1vcmUiLCBvcgorIm1vcmVfZXEiLiAgJ3F1YWwnIG1heSBlaXRoZXIgYmUgdGhlIGRlZmF1bHQsICJhbnkiLCBpbiB3aGljaCBjYXNlIHRoZSBtYXRjaAorc3VjY2VlZHMgaWYgYW55IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbWF0Y2hlcyB0aGUgdGVzdCB2YWx1ZSwgb3IKKyJhbGwiLCBpbiB3aGljaCBjYXNlIGFsbCBvZiB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbXVzdAorbWF0Y2ggdGhlIHRlc3QgdmFsdWUuCisKKy5TUyA8ZWRpdCBuYW1lPSJwcm9wZXJ0eSIgbW9kZT0iYXNzaWduIj4KK1RoaXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgZXhwcmVzc2lvbiBlbGVtZW50cyAoYW55IG9mIHRoZSB2YWx1ZSBvcgorb3BlcmF0b3IgZWxlbWVudHMpLiAgVGhlIGV4cHJlc3Npb24gZWxlbWVudHMgYXJlIGV2YWx1YXRlZCBhdCBydW4tdGltZSBhbmQKK21vZGlmeSB0aGUgcHJvcGVydHkgInByb3BlcnR5Ii4gIFRoZSBtb2RpZmljYXRpb24gZGVwZW5kcyBvbiB3aGV0aGVyCisicHJvcGVydHkiIHdhcyBtYXRjaGVkIGJ5IG9uZSBvZiB0aGUgYXNzb2NpYXRlZCA8dGVzdD4gZWxlbWVudHMsIGlmIHNvLCB0aGUKK21vZGlmaWNhdGlvbiBtYXkgYWZmZWN0IHRoZSBmaXJzdCBtYXRjaGVkIHZhbHVlLiAgJ21vZGUnIGlzIG9uZSBvZjoKKy5uZgorLlJTCisudGEgMWkgM2kgNWkKK01vZGUJT3BlcmF0aW9uIHdpdGggbWF0Y2gJT3BlcmF0aW9uIHdpdGhvdXQgbWF0Y2gKKwEBAQorImFzc2lnbiIJUmVwbGFjZSBtYXRjaGluZyB2YWx1ZQlSZXBsYWNlIGFsbCB2YWx1ZXMKKyJhc3NpZ25fcmVwbGFjZSIJUmVwbGFjZSBhbGwgdmFsdWVzCVJlcGxhY2UgYWxsIHZhbHVlcworInByZXBlbmQiCUluc2VydCBiZWZvcmUgbWF0Y2hpbmcgdmFsdWUJSW5zZXJ0IGF0IGhlYWQgb2YgbGlzdAorInByZXBlbmRfZmlyc3QiCUluc2VydCBhdCBoZWFkIG9mIGxpc3QJSW5zZXJ0IGF0IGhlYWQgb2YgbGlzdAorImFwcGVuZCIJQXBwZW5kIGFmdGVyIG1hdGNoaW5nIHZhbHVlCUFwcGVuZCBhdCBlbmQgb2YgbGlzdAorImFwcGVuZF9sYXN0IglBcHBlbmQgYXQgZW5kIG9mIGxpc3QJQXBwZW5kIGF0IGVuZCBvZiBsaXN0CisuUkUKKy5EVAorLmZpCisuU1MgPGludD4KKy5TUyA8ZG91YmxlPgorLlNTIDxzdHJpbmc+CisuU1MgPGJvb2w+CitUaGVzZSBlbGVtZW50cyBob2xkIGEgc2luZ2xlIHZhbHVlIG9mIHRoZSBpbmRpY2F0ZWQgdHlwZS4gIDxib29sPiBlbGVtZW50cworaG9sZCBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KKy5TUyA8bWF0cml4PgorVGhpcyBlbGVtZW50IGhvbGRzIHRoZSBmb3VyIDxkb3VibGU+IGVsZW1lbnRzIG9mIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbi4KKy5TUyA8bmFtZT4KK0hvbGRzIGEgcHJvcGVydHkgbmFtZS4gIEV2YWx1YXRlcyB0byB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgcHJvcGVydHkgb2YKK3RoZSBmb250LCBub3QgdGhlIHBhdHRlcm4uCisuU1MgPGNvbnN0PgorSG9sZHMgdGhlIG5hbWUgb2YgYSBjb25zdGFudDsgdGhlc2UgYXJlIGFsd2F5cyBpbnRlZ2VycyBhbmQgc2VydmUgYXMKK3N5bWJvbGljIG5hbWVzIGZvciBjb21tb24gZm9udCB2YWx1ZXM6CisuUlMKKy5zcAorLm5mCisudGEgMWkgMmkgM2kKKy5sYyBcKGVtCitDb25zdGFudAlQcm9wZXJ0eQlDUFAgc3ltYm9sCisBAQEKK2xpZ2h0CXdlaWdodAlGQ19XRUlHSFRfTElHSFQKK21lZGl1bQl3ZWlnaHQJRkNfV0VJR0hUX01FRElVTQorZGVtaWJvbGQJd2VpZ2h0CUZDX1dFSUdIVF9ERU1JQk9MRAorYm9sZAl3ZWlnaHQJRkNfV0VJR0hUX0JPTEQKK2JsYWNrCXdlaWdodAlGQ19XRUlHSFRfQkxBQ0sKK3JvbWFuCXNsYW50CUZDX1NMQU5UX1JPTUFOCitpdGFsaWMJc2xhbnQJRkNfU0xBTlRfSVRBTElDCitvYmxpcXVlCXNsYW50CUZDX1NMQU5UX09CTElRVUUKK3Byb3BvcnRpb25hbAlzcGFjaW5nCUZDX1BST1BPUlRJT05BTAorbW9ubwlzcGFjaW5nCUZDX01PTk8KK2NoYXJjZWxsCXNwYWNpbmcJRkNfQ0hBUkNFTEwKK3JnYglyZ2JhCUZDX1JHQkFfUkdCCitiZ3IJcmdiYQlGQ19SR0JBX0JHUgordnJnYglyZ2JhCUZDX1JHQkFfVlJHQgordmJncglyZ2JhCUZDX1JHQkFfVkJHUgorLkRUCisuZmkKKy5SRQorLlNTIDxvcj4KKy5TUyA8YW5kPgorLlNTIDxwbHVzPgorLlNTIDxtaW51cz4KKy5TUyA8dGltZXM+CisuU1MgPGRpdmlkZT4KK1RoZXNlIGVsZW1lbnRzIHBlcmZvcm0gdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gb24gYSBsaXN0IG9mIGV4cHJlc3Npb24KK2VsZW1lbnRzLiAgPG9yPiBhbmQgPGFuZD4gYXJlIGJvb2xlYW4sIG5vdCBiaXR3aXNlLgorLlNTIDxlcT4KKy5TUyA8bm90X2VxPgorLlNTIDxsZXNzPgorLlNTIDxsZXNzX2VxPgorLlNTIDxtb3JlPgorLlNTIDxtb3JlX2VxPgorVGhlc2UgZWxlbWVudHMgY29tcGFyZSB0d28gdmFsdWVzLCBwcm9kdWNpbmcgYSBib29sZWFuIHJlc3VsdC4KKy5TUyA8bm90PgorSW52ZXJ0cyB0aGUgYm9vbGVhbiBzZW5zZSBvZiBpdHMgb25lIGV4cHJlc3Npb24gZWxlbWVudAorLlNTIDxpZj4KK1RoaXMgZWxlbWVudCB0YWtlcyB0aHJlZSBleHByZXNzaW9uIGVsZW1lbnRzOyBpZiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGlzCit0cnVlLCBpdCBwcm9kdWNlcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCwgb3RoZXJ3aXNlIGl0IHByb2R1Y2VzIHRoZSB2YWx1ZQorb2YgdGhlIHRoaXJkLgorLlNTIDxhbGlhcz4KK0FsaWFzIGVsZW1lbnRzIHByb3ZpZGUgYSBzaG9ydGhhbmQgbm90YXRpb24gZm9yIHRoZSBzZXQgb2YgY29tbW9uIG1hdGNoCitvcGVyYXRpb25zIG5lZWRlZCB0byBzdWJzdGl0dXRlIG9uZSBmb250IGZhbWlseSBmb3IgYW5vdGhlci4gIFRoZXkgY29udGFpbiBhCis8ZmFtaWx5PiBlbGVtZW50IGZvbGxvd2VkIGJ5IG9wdGlvbmFsIDxwcmVmZXI+LCA8YWNjZXB0PiBhbmQgPGRlZmF1bHQ+CitlbGVtZW50cy4gIEZvbnRzIG1hdGNoaW5nIHRoZSA8ZmFtaWx5PiBlbGVtZW50IGFyZSBlZGl0ZWQgdG8gcHJlcGVuZCB0aGUKK2xpc3Qgb2YgPHByZWZlcj5lZCBmYW1pbGllcyBiZWZvcmUgdGhlIG1hdGNoaW5nIDxmYW1pbHk+LCBhcHBlbmQgdGhlCis8YWNjZXB0PmFibGUgZmFtaWx5cyBhZnRlciB0aGUgbWF0Y2hpbmcgPGZhbWlseT4gYW5kIGFwcGVuZCB0aGUgPGRlZmF1bHQ+CitmYW1pbGllcyB0byB0aGUgZW5kIG9mIHRoZSBmYW1pbHkgbGlzdC4KKy5TUyA8ZmFtaWx5PgorSG9sZHMgYSBzaW5nbGUgZm9udCBmYW1pbHkgbmFtZQorLlNTIDxwcmVmZXI+CisuU1MgPGFjY2VwdD4KKy5TUyA8ZGVmYXVsdD4KK1RoZXNlIGhvbGQgYSBsaXN0IG9mIDxmYW1pbHk+IGVsZW1lbnRzIHRvIGJlIHVzZWQgYnkgdGhlIDxhbGlhcz4gZWxlbWVudC4KKy5TSCBFWEFNUExFIENPTkZJR1VSQVRJT04gRklMRQorLlNTIFN5c3RlbSBjb25maWd1cmF0aW9uIGZpbGUKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZQorLnNwCisubmYKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGZvbnRjb25maWcgU1lTVEVNICJmb250cy5kdGQiPgorPCEtLSAvZXRjL2ZvbnRzL2ZvbnRzLmNvbmYgZmlsZSB0byBjb25maWd1cmUgc3lzdGVtIGZvbnQgYWNjZXNzIC0tPgorPGZvbnRjb25maWc+Cis8IS0tIAorCUZpbmQgZm9udHMgaW4gdGhlc2UgZGlyZWN0b3JpZXMKKy0tPgorPGRpcj4vdXNyL1gxMVI2L2xpYi9YMTEvZm9udHMvdHJ1ZXR5cGU8L2Rpcj4KKzxkaXI+L3Vzci9YMTFSNi9saWIvWDExL2ZvbnRzL1R5cGUxPC9kaXI+CisKKzwhLS0KKwlBY2NlcHQgZGVwcmVjYXRlZCAnbW9ubycgYWxpYXMsIHJlcGxhY2luZyBpdCB3aXRoICdtb25vc3BhY2UnCistLT4KKzxtYXRjaCB0YXJnZXQ9InBhdHRlcm4iPgorCTx0ZXN0IHF1YWw9ImFueSIgbmFtZT0iZmFtaWx5Ij48c3RyaW5nPm1vbm88L3N0cmluZz48L3Rlc3Q+CisJPGVkaXQgbmFtZT0iZmFtaWx5IiBtb2RlPSJhc3NpZ24iPjxzdHJpbmc+bW9ub3NwYWNlPC9zdHJpbmc+PC9lZGl0PgorPC9tYXRjaD4KKworPCEtLQorCU5hbWVzIG5vdCBpbmNsdWRpbmcgYW55IHdlbGwga25vd24gYWxpYXMgYXJlIGdpdmVuICdzYW5zJworLS0+Cis8bWF0Y2ggdGFyZ2V0PSJwYXR0ZXJuIj4KKwk8dGVzdCBxdWFsPSJhbGwiIG5hbWU9ImZhbWlseSIgbW9kZT0ibm90X2VxIj5zYW5zPC90ZXN0PgorCTx0ZXN0IHF1YWw9ImFsbCIgbmFtZT0iZmFtaWx5IiBtb2RlPSJub3RfZXEiPnNlcmlmPC90ZXN0PgorCTx0ZXN0IHF1YWw9ImFsbCIgbmFtZT0iZmFtaWx5IiBtb2RlPSJub3RfZXEiPm1vbm9zcGFjZTwvdGVzdD4KKwk8ZWRpdCBuYW1lPSJmYW1pbHkiIG1vZGU9ImFwcGVuZF9sYXN0Ij48c3RyaW5nPnNhbnM8L3N0cmluZz48L2VkaXQ+Cis8L21hdGNoPgorCis8IS0tCisJTG9hZCBwZXItdXNlciBjdXN0b21pemF0aW9uIGZpbGUsIGJ1dCBkb24ndCBjb21wbGFpbgorCWlmIGl0IGRvZXNuJ3QgZXhpc3QKKy0tPgorPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+fi8uZm9udHMuY29uZjwvaW5jbHVkZT4KKworPCEtLQorCUFsaWFzIHdlbGwga25vd24gZm9udCBuYW1lcyB0byBhdmFpbGFibGUgVHJ1ZVR5cGUgZm9udHMuCisJVGhlc2Ugc3Vic3RpdHV0ZSBUcnVlVHlwZSBmYWNlcyBmb3Igc2ltaWxhciBUeXBlMQorCWZhY2VzIHRvIGltcHJvdmUgc2NyZWVuIGFwcGVhcmFuY2UuCistLT4KKzxhbGlhcz4KKwk8ZmFtaWx5PlRpbWVzPC9mYW1pbHk+CisJPHByZWZlcj48ZmFtaWx5PlRpbWVzIE5ldyBSb21hbjwvZmFtaWx5PjwvcHJlZmVyPgorCTxkZWZhdWx0PjxmYW1pbHk+c2VyaWY8L2ZhbWlseT48L2RlZmF1bHQ+Cis8L2FsaWFzPgorPGFsaWFzPgorCTxmYW1pbHk+SGVsdmV0aWNhPC9mYW1pbHk+CisJPHByZWZlcj48ZmFtaWx5PlZlcmRhbmE8L2ZhbWlseT48L3ByZWZlcj4KKwk8ZGVmYXVsdD48ZmFtaWx5PnNhbnM8L2ZhbWlseT48L2RlZmF1bHQ+Cis8L2FsaWFzPgorPGFsaWFzPgorCTxmYW1pbHk+Q291cmllcjwvZmFtaWx5PgorCTxwcmVmZXI+PGZhbWlseT5Db3VyaWVyIE5ldzwvZmFtaWx5PjwvcHJlZmVyPgorCTxkZWZhdWx0PjxmYW1pbHk+bW9ub3NwYWNlPC9mYW1pbHk+PC9kZWZhdWx0PgorPC9hbGlhcz4KKworPCEtLQorCVByb3ZpZGUgcmVxdWlyZWQgYWxpYXNlcyBmb3Igc3RhbmRhcmQgbmFtZXMKKwlEbyB0aGVzZSBhZnRlciB0aGUgdXNlcnMgY29uZmlndXJhdGlvbiBmaWxlIHNvIHRoYXQKKwlhbnkgYWxpYXNlcyB0aGVyZSBhcmUgdXNlZCBwcmVmZXJlbnRpYWxseQorLS0+Cis8YWxpYXM+CisJPGZhbWlseT5zZXJpZjwvZmFtaWx5PgorCTxwcmVmZXI+PGZhbWlseT5UaW1lcyBOZXcgUm9tYW48L2ZhbWlseT48L3ByZWZlcj4KKzwvYWxpYXM+Cis8YWxpYXM+CisJPGZhbWlseT5zYW5zPC9mYW1pbHk+CisJPHByZWZlcj48ZmFtaWx5PlZlcmRhbmE8L2ZhbWlseT48L3ByZWZlcj4KKzwvYWxpYXM+Cis8YWxpYXM+CisJPGZhbWlseT5tb25vc3BhY2U8L2ZhbWlseT4KKwk8cHJlZmVyPjxmYW1pbHk+QW5kYWxlIE1vbm88L2ZhbWlseT48L3ByZWZlcj4KKzwvYWxpYXM+Cis8L2ZvbnRjb25maWc+CisuZmkKKy5TUyBVc2VyIGNvbmZpZ3VyYXRpb24gZmlsZQorVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgbGl2ZXMgaW4KK34vLmZvbnRzLmNvbmYKKy5zcAorLm5mCis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBmb250Y29uZmlnIFNZU1RFTSAiZm9udHMuZHRkIj4KKzwhLS0gfi8uZm9udHMuY29uZiBmb3IgcGVyLXVzZXIgZm9udCBjb25maWd1cmF0aW9uIC0tPgorPGZvbnRjb25maWc+CisKKzwhLS0KKwlQcml2YXRlIGZvbnQgZGlyZWN0b3J5CistLT4KKzxkaXI+fi9taXNjL2ZvbnRzPC9kaXI+CisKKzwhLS0KKwl1c2UgcmdiIHN1Yi1waXhlbCBvcmRlcmluZyB0byBpbXByb3ZlIGdseXBoIGFwcGVhcmFuY2Ugb24KKwlMQ0Qgc2NyZWVucy4gIENoYW5nZXMgYWZmZWN0aW5nIHJlbmRlcmluZywgYnV0IG5vdCBtYXRjaGluZworCXNob3VsZCBhbHdheXMgdXNlIHRhcmdldD0iZm9udCIuCistLT4KKzxtYXRjaCB0YXJnZXQ9ImZvbnQiPgorCTxlZGl0IG5hbWU9InJnYmEiIG1vZGU9ImFzc2lnbiI+PGNvbnN0PnJnYjwvY29uc3Q+PC9lZGl0PgorPC9tYXRjaD4KKzwvZm9udGNvbmZpZz4KKy5maQorLlNIIEZJTEVTCisuQiBmb250cy5jb25mCitjb250YWlucyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5Citjb25zaXN0aW5nIG9mIGRpcmVjdG9yaWVzIHRvIGxvb2sgYXQgZm9yIGZvbnQgaW5mb3JtYXRpb24gYXMgd2VsbCBhcworaW5zdHJ1Y3Rpb25zIG9uIGVkaXRpbmcgcHJvZ3JhbSBzcGVjaWZpZWQgZm9udCBwYXR0ZXJucyBiZWZvcmUgYXR0ZW1wdGluZyB0bworbWF0Y2ggdGhlIGF2YWlsYWJsZSBmb250cy4gIEl0IGlzIGluIHhtbCBmb3JtYXQuCisKKy5CIGZvbnRzLmR0ZCAKK2lzIGEgRFREIHRoYXQgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKy5CIH4vLmZvbnRzLmNvbmYKK2lzIHRoZSBjb252ZW50aW9uYWwgbG9jYXRpb24gZm9yIHBlci11c2VyIGZvbnQgY29uZmlndXJhdGlvbiwgYWx0aG91Z2ggdGhlCithY3R1YWwgbG9jYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBnbG9iYWwgZm9udHMuY29uZiBmaWxlLgorCisuQiB+Ly5mb250cy5jYWNoZQoraXMgdGhlIGNvbnZlbnRpb25hbCByZXBvc2l0b3J5IG9mIGZvbnQgaW5mb3JtYXRpb24gdGhhdCBpc24ndCBmb3VuZCBpbiB0aGUKK3Blci1kaXJlY3RvcnkgY2FjaGVzLiAgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW5lZCBieSBmb250Y29uZmlnLgorCisuU0ggQVVUSE9SCitLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgdGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgo=