LyoKICogV2luZUZpbGUKICogRnJlbmNoIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgTWFydGluIEZ1Y2hzCiAqIENvcHlyaWdodCAyMDAyIFN0ZXZlbiBFZHdhcmRzCiAqIENvcHlyaWdodCAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKiBDb3B5cmlnaHQgMjAwMyBTeWx2YWluIFBldHJlb2xsZQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCgovKiBNZW51ICovCgpJRE1fV0lORUZJTEUgTUVOVSBGSVhFRCBJTVBVUkUKewoJUE9QVVAgIiZGaWNoaWVyIiAgewoJCU1FTlVJVEVNICImT3V2cmlyXHRFbnRy6WUiICwJCQkxMDEKCQlNRU5VSVRFTSAiJkTpcGxhY2VyLi4uXHRGNyIgLCAJCQkxMDYKCQlNRU5VSVRFTSAiJkNvcGllci4uLlx0RjgiICwJCQkxMDcKCQlNRU5VSVRFTSAiUCZyZXNzZS1QYXBpZXJzLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZFZmZhY2VyXHREZWwiICwJCQkxMDgKCQlNRU5VSVRFTSAiUmUmbm9tbWVyLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIiZQcm9wcmnpdOlzLi4uXHRBbHQrRW50cmVlIiAsIElEX0VESVRfUFJPUEVSVElFUwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJDbyZtcHJlc3Nlci4uLiIgLAkJMTE5CgkJTUVOVUlURU0gIkTpY29tcHJlJnNzZXIuLi4iICwJCTEyMAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJFJnjpY3V0ZXIuLi4iICwJCQlJRF9FWEVDVVRFCgkJTUVOVUlURU0gIiZJbXByaW1lci4uLiIgLCAJCQkxMDIKCQlNRU5VSVRFTSAiJkFzc29jaWVyLi4uIiAsCQkxMDMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiQ3LpZXIgUulwZXImdG9pcmUuLi4iICwJCQkxMTEKCQlNRU5VSVRFTSAiUmVjJmhlcmNoZXIuLi4iICwJCQkxMDQKCQlNRU5VSVRFTSAiU+lsZWN0aW9ubmVyICZGaWNoaWVycy4uLiIgLAkJCTExNgoJCU1FTlVJVEVNIFNFUEFSQVRPUgojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIiZRdWl0dGVyXHRBbHQrWCIgLCAJCQlJRF9GSUxFX0VYSVQKI2Vsc2UKCQlNRU5VSVRFTSAiJlF1aXR0ZXIiLCAJCQkJSURfRklMRV9FWElUCiNlbmRpZgoJfQoKCVBPUFVQICImRGlzcXVlIiAgewoJCU1FTlVJVEVNICImQ29waWVyIERpc3F1ZS4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICImTm9tbWVyIERpc3F1ZS4uLiIgLAkJCTIwMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImRm9ybWF0ZXIgRGlzcXVlLi4uIiAsCQkJMjAzCiNpZmRlZiBfV0lOOTUKCQlNRU5VSVRFTSAiQ3LpZXIgdW4gZGlzcXVlICpzeXN06G1lLi4uIiwgLTEJLypAQCAqLwojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiQ29ubmVjdGVyIHVuIGxlY3RldXIgJnLpc2VhdSIgLAkJCTI1MgoJCU1FTlVJVEVNICImROljb25uZWN0ZXIgdW4gbGVjdGV1ciBy6XNlYXUiICwJCTI1MwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImUGFydGFnZXIuLi4iICwJCQkyNTQKCQlNRU5VSVRFTSAiQ2Vzc2VyIGRlIHBhcnRhJmdlciIgLAkJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJDaG9pc2lyIGxlICZsZWN0ZXVyIiAsCQkJMjUxCgl9CgoJUE9QVVAgIiZS6XBlcnRvaXJlcyIgIHsKCQlNRU5VSVRFTSAiJkTpdmVsb3BwZXIgdW4gbml2ZWF1XHQrIiAsCQkJMzAxCgkJTUVOVUlURU0gIkTpdmVsb3BwZXIgdW5lICZicmFuY2hlXHQqIiAsCQkzMDIKCQlNRU5VSVRFTSAiJlRvdXQgZOl2ZWxvcHBlclx0Q3RybCsqIiAsCQkzMDMKCQlNRU5VSVRFTSAiJlLpZHVpcmUgdW5lIGJyYW5jaGVcdC0iICwJCQkzMDQKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkluZGlxdWVyIGwnYXJib3Jlc2NlbmNlIiAsCQkJCTUwNQoJfQoKCVBPUFVQICImVnVlIiAgewoJCU1FTlVJVEVNICJBcmJyZSBldCBy6SZwZXJ0b2lyZSIgLAkJCTQxMwoJCU1FTlVJVEVNICImQXJicmUgc2V1bGVtZW50IiAsCQkJNDExCgkJTUVOVUlURU0gIiZS6XBlcnRvaXJlIHNldWxlbWVudCIgLAkJCTQxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImU+lwYXJlciIgLAkJCTQxNAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImTm9tIiAsCQkJSURfVklFV19OQU1FCgkJTUVOVUlURU0gIlRvdXMgJmxlcyBE6XRhaWxzIiAsCQkJCUlEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKCQlNRU5VSVRFTSAiJkTpdGFpbHMuLi4iICwJCQlJRF9WSUVXX1NFTEVDVEVEX0FUVFJJQlVURVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiVHJpZXIgcGFyIE4mb20iICwJCTQwNAoJCU1FTlVJVEVNICJUcmllciBwYXIgJlR5cGUiICwJCTQwNQoJCU1FTlVJVEVNICJUcmllciBwYXIgVGEmaWxsZSIgLCAJCTQwNgoJCU1FTlVJVEVNICJUcmllciBwYXIgRGF0JmUiICwgCQk0MDcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiVHJpZXIgcGFyICYuLi4iICwJCQk0MDkKCX0KCglQT1BVUCAiJk9wdGlvbnMiICB7CgkJTUVOVUlURU0gIiZDb25maXJtYXRpb24uLi4iICwJCS0xCgkJTUVOVUlURU0gIiZQb2xpY2UuLi4iICwJCQktMQoJCU1FTlVJVEVNICJQZXJzb25uYWxpc2VyIGxhICZiYXJyZSBkJ091dGlscy4uLiIgLCAtMQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJCYXJyZSBkJyZPdXRpbHMiICwJCUlEX1ZJRVdfVE9PTF9CQVIsIENIRUNLRUQKCQlNRU5VSVRFTSAiQmFycmUgZGUgJkxlY3RldXIiICwJCUlEX1ZJRVdfRFJJVkVfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIkJhcnJlIGQnJsl0YXQiICwJSURfVklFV19TVEFUVVNCQVIsIENIRUNLRUQKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICJQJmxlaW4gyWNyYW5cdEN0cmwrU2hpZnQrUyIgLCAJSURfVklFV19GVUxMU0NSRUVOCiNlbmRpZgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImUulkdWlyZSBhIGwndXRpbGlzYXRpb24iICwJCS0xCgkJTUVOVUlURU0gIiZFbnJlZ2lzdHJlciBsYSBjb25maWd1cmF0aW9uIGVuIHF1aXR0YW50IiAsCQkJNTExCgl9CgoKCVBPUFVQICImU+ljdXJpdOkiICB7CgkJTUVOVUlURU0gIiZBY2Pocy4uLiIgLAkJNjA1CgkJTUVOVUlURU0gIiZTdXJ2ZWlsbGFuY2UuLi4iICwJCQk2MDYKCQlNRU5VSVRFTSAiJlByb3Byael0YWlyZS4uLiIgLAkJNjA3Cgl9CgoJUE9QVVAgIiZGZW7qdHJlIiAgewoJCU1FTlVJVEVNICJOb3V2ZWxsZSAmZmVu6nRyZSIgLAkJCUlEX1dJTkRPV19ORVcKCQlNRU5VSVRFTSAiJkVuIGNhc2NhZGVcdEN0cmwrRjUiICwJCUlEX1dJTkRPV19DQVNDQURFCgkJTUVOVUlURU0gIk1vc2HvcXVlICZob3Jpem9udGFsZSIgLAkJSURfV0lORE9XX1RJTEVfSE9SWgoJCU1FTlVJVEVNICJNb3Nh73F1ZSAmdmVydGljYWxlXHRDdHJsK0Y0IiAsCQlJRF9XSU5ET1dfVElMRV9WRVJUCiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKCQlNRU5VSVRFTSAiUulvcmdhbmlzYXRpb24gJkF1dG9tYXRpcXVlIiAsCQlJRF9XSU5ET1dfQVVUT1NPUlQKI2VuZGlmCgkJTUVOVUlURU0gIlLpb3JnYW5pc2VyIGxlcyAmaWP0bmVzIiAsCQlJRF9XSU5ET1dfQVJSQU5HRQoJCU1FTlVJVEVNICImQWN0dWFsaXNlclx0RjUiICwJCUlEX1JFRlJFU0gKCX0KCglQT1BVUCAiJkFpZGUiICB7CgkJTUVOVUlURU0gIiZTb21tYWlyZSBkZSBsJ2FpZGVcdEYxIiAsCQkJSURfSEVMUAoJCU1FTlVJVEVNICImUmVjaGVyY2hlciBkYW5zIGwnYWlkZVx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIiZVdGlsaXNlciBsJ2FpZGVcdEYxIiAsCQkJSURfSEVMUF9VU0lORwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCVBPUFVQICJJbmZvLi4uIiAgewoJCSAgTUVOVUlURU0gIkEgcHJvcG9zIGRlICZXaW5lLi4uIiAsCQkJSURfQUJPVVRfV0lORQovKgogKgkJICBNRU5VSVRFTSAiJkxpY2VuY2UuLi4iCQlJRF9MSUNFTlNFCiAqCQkgIE1FTlVJVEVNICImTk8gV0FSUkFOVFkiCQlJRF9OT19XQVJSQU5UWQogKi8KCQl9Cgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJFeOljdXRlciIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglDT05UUk9MIAkJIiIsIDEwMSwgIlN0YXRpYyIsIFNTX1NJTVBMRXxTU19OT1BSRUZJWCwgMywgNiwgMTYyLCAxMAoJQ09OVFJPTCAJCSImQ29tbWFuZGUgOiIgLCAtMSwgIlN0YXRpYyIsIFNTX0xFRlROT1dPUkRXUkFQfFdTX0dST1VQLCAzLCAxOCwgNjAsIDEwCglFRElUVEVYVAkJMjAxLCAzLCAyOSwgMTM0LCAxMiwgRVNfQVVUT0hTQ1JPTEwKCUNPTlRST0wgCQkiU291cyBmb3JtZSBkJ2lj9G5lIiAsIDIxNCwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWHxXU19UQUJTVE9QLDMsIDQ1LCA3MSwgMTIKCURFRlBVU0hCVVRUT04JIk9LIiAsIDEsIDE1OCwgNiwgNDcsIDE0CglQVVNIQlVUVE9OCQkiQW5udWxlciIgLCAyLCAxNTgsIDIzLCA0NywgMTQKCVBVU0hCVVRUT04JCSImQWlkZSIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9Cg==