LyoKICogV2luZUZpbGUKICogQ3plY2ggTGFuZ3VhZ2UgU3VwcG9ydAogKgogKiBDb3B5cmlnaHQgMjAwMCBNYXJ0aW4gRnVjaHMKICogQ29weXJpZ2h0IDIwMDIgU3RldmVuIEVkd2FyZHMKICogQ29weXJpZ2h0IDIwMDIgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAyMDA0IERhdmlkIEtyZWRiYQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0NaRUNILCBTVUJMQU5HX0RFRkFVTFQKCi8qIE1lbnUgKi8KCklETV9XSU5FRklMRSBNRU5VIEZJWEVEIElNUFVSRQp7CglQT1BVUCAiJlNvdWJvciIgIHsKCQlNRU5VSVRFTSAiJk90ZXb47XRcdEVudGVyIiAsCQkJMTAxCgkJTUVOVUlURU0gIlD4ZSZzdW5vdXQuLi5cdEY3IiAsIAkJCUlEX0ZJTEVfTU9WRQoJCU1FTlVJVEVNICImS29w7XJvdmF0Li4uXHRGOCIgLAkJCTEwNwoJCU1FTlVJVEVNICImRG8gc2NocuFua3kuLi5cdEY5IiAsCQkxMTgKCQlNRU5VSVRFTSAiJlNtYXphdFx0RGVsIiAsCQkJMTA4CgkJTUVOVUlURU0gIlD4ZWptZSZub3ZhdC4uLiIgLAkJCTEwOQoJCU1FTlVJVEVNICJWbGFzdG5vc3QmaS4uLlx0QWx0K0VudGVyIiAsIElEX0VESVRfUFJPUEVSVElFUwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJLJm9tcHJpbW92YXQuLi4iICwJCTExOQoJCU1FTlVJVEVNICJSJm96YmFsaXQuLi4iICwJCTEyMAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJTcCZ1c3RpdC4uLiIgLAkJCUlEX0VYRUNVVEUKCQlNRU5VSVRFTSAiJlRpc2suLi4iICwgCQkJMTAyCgkJTUVOVUlURU0gIlD4afhhZGl0Li4uIiAsCQkxMDMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiVnl0dm/4aXQgJmFkcmVz4fguLi4iICwJCQkxMTEKCQlNRU5VSVRFTSAiJkhsZWRhdC4uLiIgLAkJCTEwNAoJCU1FTlVJVEVNICJWJnlicmF0IHNvdWJvcnkuLi4iICwJCQkxMTYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICImS29uZWNcdEFsdCtYIiAsIAkJCUlEX0ZJTEVfRVhJVAojZWxzZQoJCU1FTlVJVEVNICImS29uZWMiLCAJCQkJSURfRklMRV9FWElUCiNlbmRpZgoJfQoKCVBPUFVQICImRGlzayIgIHsKCQlNRU5VSVRFTSAiJktvcO1yb3ZhdCBkaXNrLi4uIiAsCQkJMjAxCgkJTUVOVUlURU0gIiZQb2ptZW5vdmF0IGRpc2suLi4iICwJCQkyMDIKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkZvcm3hdG92YXQgZGlzay4uLiIgLAkJCTIwMwojaWZkZWYgX1dJTjk1CgkJTUVOVUlURU0gIlZ5dHZv+Gl0IHN5c3TpJm1vdv0gZGlzay4uLiIsIC0xCS8qQEAgKi8KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlD4aXBvaml0IHPtu292/SAmZGlzayIgLAkJCTI1MgoJCU1FTlVJVEVNICImT2Rwb2ppdCBz7btvdv0gZGlzayIgLAkJMjUzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlNk7WxldCBqYWtvLi4uIiAsCQkJMjU0CgkJTUVOVUlURU0gIk9kc3QmcmFuaXQgc2TtbGVu7S4uLiIgLAkJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImVnlicmF0IGplZG5vdGt1Li4uIiAsCQkJMjUxCgl9CgoJUE9QVVAgIkEmZHJlc+H4ZSIgIHsKCQlNRU5VSVRFTSAiRCZhbLntIPpyb3Zl8lx0KyIgLAkJCTMwMQoJCU1FTlVJVEVNICJSb3piYWxpdCBzJnRyb21cdCoiICwJCTMwMgoJCU1FTlVJVEVNICJSb3piYWxpdCAmdrllXHRTdHJnKyoiICwJCTMwMwoJCU1FTlVJVEVNICJTYmFsaXQgc3Qmcm9tXHQtIiAsCQkJMzA0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIk96bmHoaXQgcG90byZta2EiICwJCQkJNTA1Cgl9CgoJUE9QVVAgIiZab2JyYXplbu0iICB7CgkJTUVOVUlURU0gIlN0JnJvbSBhIGFkcmVz4fgiICwJCQk0MTMKCQlNRU5VSVRFTSAiSiZlbiBzdHJvbSIgLAkJCTQxMQoJCU1FTlVJVEVNICJKZW4gYSZkcmVz4fgmIiAsCQkJNDEyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlMmbG916Gl0IiAsCQkJNDE0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZO4XpldiIgLAkJCUlEX1ZJRVdfTkFNRQoJCU1FTlVJVEVNICImVrllY2hueSBkZXRhaWx5IiAsCQkJCUlEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKCQlNRU5VSVRFTSAiViZ5YnJhbukgZGV0YWlseS4uLiIgLAkJCUlEX1ZJRVdfU0VMRUNURURfQVRUUklCVVRFUwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImVPjtZGl0IGRsZSBu4Xp2dSIgLAkJNDA0CgkJTUVOVUlURU0gIlT47WRpdCBkbGUgdCZ5cHUiICwJCTQwNQoJCU1FTlVJVEVNICJU+O1kaXQgZGxlIFZlbGlrb3N0JmkiICwgCQk0MDYKCQlNRU5VSVRFTSAiVPjtZGl0IGRsZSAmZGF0YSIgLCAJCTQwNwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJU+O1kaXQgZGxlICAmLi4uIiAsCQkJNDA5Cgl9CgoJUE9QVVAgIiZOYXN0YXZlbu0iICB7CgkJTUVOVUlURU0gIiZQb3R2cnpvduFu7S4uLiIgLAkJLTEKCQlNRU5VSVRFTSAiUO1zJm1vLi4uIiAsCQkJSURfU0VMRUNUX0ZPTlQKCQlNRU5VSVRFTSAiVXByYXZpdCBwciZ1aCBu4XN0cm9q+S4uLiIgLCAtMQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJO4XMmdHJvamUiICwJCUlEX1ZJRVdfVE9PTF9CQVIsIENIRUNLRUQKCQlNRU5VSVRFTSAiUHJ1aCAmamVkbm90ZWsiICwJSURfVklFV19EUklWRV9CQVIsIENIRUNLRUQKCQlNRU5VSVRFTSAiJlN0YXZvdv0gcHJ1aCIgLAlJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIk5hIHAmbG5vdSBvYnJhem92a3VcdEN0cmwrU2hpZnQrUyIgLCAJSURfVklFV19GVUxMU0NSRUVOCiNlbmRpZgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJTcHVzdGl0ICZtaW5pbWFsaXpvdmFu7CIgLAkJLTEKCQlNRU5VSVRFTSAiVWxvvml0IG5hJnN0YXZlbu0gcPhpIHVrb27oZW7tIiAsCTUxMQoJfQoKCglQT1BVUCAiWmEmYmV6cGXoZW7tIiAgewoJCU1FTlVJVEVNICImUPjtc3R1cC4uLiIgLAkJNjA1CgkJTUVOVUlURU0gIiZaYXpuYW1lbuF24W7tLi4uIiAsCQkJNjA2CgkJTUVOVUlURU0gIiZWbGFzdG7tay4uLiIgLAkJNjA3Cgl9CgoJUE9QVVAgIiZPa25hIiAgewoJCU1FTlVJVEVNICJOb3bpICZva25vIiAsCQkJSURfV0lORE9XX05FVwoJCU1FTlVJVEVNICJaYSBzZWJvdVx0Q3RybCtGNSIgLAkJSURfV0lORE9XX0NBU0NBREUKCQlNRU5VSVRFTSAiRGxhvmRpY2UgJnZvZG9yb3Zu7CIgLAlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIkRsYb5kaWNlICZzdmlzbGVcdEN0cmwrRjQiICwJCUlEX1dJTkRPV19USUxFX1ZFUlQKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICJWeXJvdm5hdCBhdXRvbWF0aWNreSIgLAkJSURfV0lORE9XX0FVVE9TT1JUCiNlbmRpZgoJCU1FTlVJVEVNICJWeXJvdiZuYXQiICwJCUlEX1dJTkRPV19BUlJBTkdFCgkJTUVOVUlURU0gIlD4ZWsmcmVzbGl0XHRGNSIgLAkJSURfUkVGUkVTSAoJfQoKCVBPUFVQICImPyIgIHsKCQlNRU5VSVRFTSAiT2JzYSZoIG7hcG927GR5XHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiSGxlZOFu7SB2ICZu4XBvduxk7C4uLlx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIkphayBwbya+7XZhdCBu4XBvduxkdVx0RjEiICwJCUlEX0hFTFBfVVNJTkcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlQT1BVUCAiSW5mb3JtYWNlLi4uIiAgewoJCSAgTUVOVUlURU0gIkluZm9ybWFjZSBvICZXaW5lLi4uIiAsCQkJSURfQUJPVVRfV0lORQovKgogKgkJICBNRU5VSVRFTSAiJkxpY2Vuc2UuLi4iCQlJRF9MSUNFTlNFCiAqCQkgIE1FTlVJVEVNICImTk8gV0FSUkFOVFkiCQlJRF9OT19XQVJSQU5UWQogKi8KCQl9Cgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJTcHVzdGl0IgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIiZQ+O1rYXo6IiAsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKCUVESVRURVhUCQkyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAoJQ09OVFJPTCAJCSJKYWtvICZzeW1ib2wiICwgMjE0LCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsMywgNDUsIDcxLCAxMgoJREVGUFVTSEJVVFRPTgkJIk9LIiAsIDEsIDE1OCwgNiwgNDcsIDE0CglQVVNIQlVUVE9OCQkiU3Rvcm5vIiAsIDIsIDE1OCwgMjMsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIiZO4XBvduxkYSIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpJRERfU0VMRUNUX0RFU1RJTkFUSU9OIERJQUxPRyBGSVhFRCBJTVBVUkUgMTUsIDEzLCAyMTAsIDYzClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlVy6GVu7SBj7WxlIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIkMmZXN0YToiICwgLTEsICJTdGF0aWMiLCBTU19MRUZUTk9XT1JEV1JBUHxXU19HUk9VUCwgMywgMTgsIDYwLCAxMAoJRURJVFRFWFQJCTIwMSwgMywgMjksIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMCglERUZQVVNIQlVUVE9OCQkiT0siICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJTdG9ybm8iICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiUHImb2No4XpldCIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpTVFJJTkdUQUJMRQp7CglJRFNfRk9OVF9TRUxfRExHX05BTUUJIk3sbu1tIG5hc3RhdmVu7SBw7XNtYSIKCUlEU19GT05UX1NFTF9FUlJPUgkiQ2h5YmEgcPhpIHb9YuxydSBub3bpaG8gcO1zbWEuIgp9CgpTVFJJTkdUQUJMRQp7CiBJRFNfV0lORUZJTEUgIldpbmVmaWxlIgogSURTX0VSUk9SICAiQ2h5YmEiCiBJRFNfUk9PVF9GUyAgImtv+GVub3b9IGZzIgogSURTX1VOSVhGUyAgInVuaXhmcyIKIElEU19ERVNLVE9QICAiUGxvY2hhIgogSURTX1NIRUxMICAiSW50ZXJwcmV0IgogSURTX1RJVExFRk1UICIlcyAtICVzIgogSURTX05PX0lNUEwgICJOZW7tIGRvc3VkIGltcGxlbWVudG924W5vIgogSURTX1dJTkUgICJXSU5FIgogSURTX1dJTkVfRklMRSAiV2luZSBGaWxlIgp9CgpTVFJJTkdUQUJMRQp7CiBJRFNfQ09MX05BTUUgIk7hemV2IgogSURTX0NPTF9TSVpFICJWZWxpa29zdCIKIElEU19DT0xfQ0RBVEUgIkRhdHVtIHZ5dHZv+GVu7SIKIElEU19DT0xfQURBVEUgIkRhdHVtIHBvc2xlZG7taG8gcPjtc3R1cHUiCiBJRFNfQ09MX01EQVRFICJEYXR1bSBwb3NsZWRu7SBtb2RpZmlrYWNlIgogSURTX0NPTF9JRFggICJJbmRleC9Jbm9kZSIKIElEU19DT0xfTElOS1MgIkxpbmt5IgogSURTX0NPTF9BVFRSICJBdHJpYnV0eSIKIElEU19DT0xfU0VDICAiWmFiZXpwZehlbu0iCn0K