LyoKICogIE5vdGVwYWQgKEZyZW5jaCByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBUcmFuc2xhdGlvbiBieSBMYXVyZW50IEJ1ZmZsZXIgPGxhdXJlbnRAYmx1ZXdpbi5jaD4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkZpY2hpZXIiIHsKICBNRU5VSVRFTSAiJk5vdXZlYXVcdEN0cmwrTiIsICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiJk91dnJpci4uLlx0Q3RybCtPIiwgICBDTURfT1BFTgogIE1FTlVJVEVNICImRW5yZWdpc3RyZXJcdEN0cmwrUyIsIENNRF9TQVZFCiAgTUVOVUlURU0gIkVucmVnaXN0cmVyICZzb3VzLi4uIiwgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiSW0mcHJpbWVyLi4uXHRDdHJsK1AiLCAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICImTWlzZSBlbiBwYWdlLi4uIiwgIENNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIiZDb25maWd1cmF0aW9uIGRlIGwnaW1wcmltYW50ZS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZRdWl0dGVyIiwgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIskmZGl0aW9uIiB7CiAgTUVOVUlURU0gIiZBbm51bGVyXHRDdHJsK1oiLCAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQ28mdXBlclx0Q3RybCtYIiwgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpZXJcdEN0cmwrQyIsICAgQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGxlclx0Q3RybCtWIiwgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJkVmZmFjZXJcdERlbCIsICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlRvdXQgJnPpbGVjdGlvbm5lclx0Q3RybCtBIiwgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJkhldXJlL0RhdGVcdEY1IiwgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZSZXRvdXIg4CBsYSBsaWduZSIsIENNRF9XUkFQCiAgTUVOVUlURU0gIiZQb2xpY2UuLi4iLCAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZSZWNoZXJjaGVyIiB7CiAgTUVOVUlURU0gIiZSZWNoZXJjaGVyLi4uXHRDdHJsK0YiLCBDTURfU0VBUkNICiAgTUVOVUlURU0gIiZTdWl2YW50XHRGMyIsICAgICAgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICJBaWQmZSIgewogIE1FTlVJVEVNICImU29tbWFpcmUiLCAgICAgICAgIENNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZSZWNoZXJjaGVyLi4uIiwgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIiZVdGlsaXNlciBsJ2FpZGUiLCAgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLAICZwcm9wb3MgZHUgQmxvYy1ub3RlcyIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJNaXNlIGVuIHBhZ2UiCnsKTFRFWFQgICAgIiZFbi106nRlOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUGllZCBkZSBwYWdloDoiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXJnZXOgKG1pbGxpbeh0cmUpOiIsICAweDE0NCwgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImR2F1Y2hloDoiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkhhdXSgOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZEcm9pdGWgOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkJhc6A6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJBbm51bGVyIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJBaWQmZSIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICAiJmYiClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlBhZ2UgJnAiCgpTVFJJTkdfTk9URVBBRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmxvYy1ub3RlcyIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUkVVUiIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVEVOVElPTiIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzYW5zLXRpdHJlKSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3VzIGZpY2hpZXJzICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAiRmljaGllcnMgdGV4dGUgKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZSBmaWNoaWVyICclcycgZXN0IHRyb3AgZ3JhbmQgcG91ciBsZSBibG9jLW5vdGVzLlxuIFwKVmV1aWxsZXogdXRpbGlzZXIgdW4gYXV0cmUg6WRpdGV1ci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb3VzIG4nYXZleiBwYXMgZW50cukgZGUgdGV4dGUuIFwKVmV1aWxsZXogdGFwZXIgcXVlbHF1ZSBjaG9zZSBldCByZWNvbW1lbmNlciIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xubidleGlzdGUgcGFzLlxuXG4gXApWb3VsZXotdm91cyBjcullciB1biBub3V2ZWF1IGZpY2hpZXKgPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xuYSDpdOkgbW9kaWZp6VxuXG4gXApWb3VsZXotdm91cyBlbnJlZ2lzdHJlciB2b3MgbW9kaWZpY2F0aW9uc6A/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBub24gdHJvdXbpLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcyBhc3NleiBkZSBt6W1vaXJlIHBvdXIgY29tcGzpdGVyIGNldHRlIFwKdOJjaGUuXG5GZXJtZXogdW5lIG91IHBsdXNpZXVycyBhcHBsaWNhdGlvbnMgcG91ciBsaWLpcmVyXG5cCmRlIGxhIG3pbW9pcmUuIgoKfQo=