LyoKICogc2V0dXBhcGkgKER1dGNoIHJlc291cmNlcykKICoKICogQ29weXJpZ2h0IDIwMDMgSGFucyBMZWlkZWtrZXIKICogQ29weXJpZ2h0IDIwMDkgRnJhbnMgS29vbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgICAgICBJRFNfUFJPTVBURElTSyAgICJIZXQgYmVzdGFuZCAnJXMnIG9wICVzIGlzIGJlbm9kaWdkIgogICAgICAgIElEU19VTktOT1dOICAgICAgIk9uYmVrZW5kIgogICAgICAgIElEU19DT1BZRlJPTSAgICAgIktvcGllZXIgYmVzdGFuZGVuIHZhbjoiCiAgICAgICAgSURTX0lORk8gICAgICAgICAiVm9lciBoZXQgcGFkIGluIHdhYXIgaGV0IGJlc3RhbmQgemljaCBiZXZpbmQsIGVuIGtsaWsgZGFuIG9wIE9LLiIKfQoKQ09QWUZJTEVETEdPUkQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMjAsIDIwLCAyMDgsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9OVCB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04KQ0FQVElPTiAiQmVzdGFuZGVuIHdvcmRlbiBnZWtvcGnrZXJkLi4uIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCglQVVNIQlVUVE9OICJBbm51bGVyZW4iLCBJRENBTkNFTCwgNzksIDg0LCA1MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKCUxURVhUICJCcm9uOiIsIC0xLCA3LCA3LCA3NywgMTEsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCglMVEVYVCAiIiwgU09VUkNFU1RST1JELCA3LCAxOCwgMTk0LCAxMSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKCUxURVhUICJCZXN0ZW1taW5nOiIsIC0xLCA3LCAzMCwgNzcsIDExLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAoJTFRFWFQgIiIsIERFU1RTVFJPUkQsIDcsIDQxLCAxOTQsIDIyLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAoJQ09OVFJPTCAiIiwgUFJPR1JFU1NPUkQsICJzZXR1cHhfcHJvZ3Jlc3MiLCA3LCA2MywgMTk0LCAxMywgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUApFTkQKCklEUFJPTVBURk9SRElTSyBESUFMT0cgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjUwLCAxMjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkJlc3RhbmRlbiBiZW5vZGlnZCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgoJTFRFWFQgIlZvZXIgZGUgaW5zdGFsbGF0aWUgZGlzayB2YW4gZGUgZmFicmlrYW50IGluLCBlbiB6b3JnXG5kYW4gZGF0IGRlIGNvcnJlY3RlIHNjaGlqZiBpcyBnZXNlbGVjdGVlcmQgaGllcm9uZGVyIiwgSURDX0ZJTEVORUVERUQsIDEwLCAxMCwgMTc1LCAyMiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKCUxURVhUICIiLCBJRENfSU5GTywgMTAsIDUwLCAxNzUsIDIyLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAoJTFRFWFQgIktvcGllZXIgZGUgZmFicmlrYW50J3MgYmVzdGFuZGVuIHZhbjoiLCBJRENfQ09QWUZST00sIDEwLCA5MCwgMTc1LCAxMSwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKCUNPTlRST0wgIiIsIElEQ19QQVRILCAiQ09NQk9CT1giLCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WU0NST0xMIHwgV1NfVklTSUJMRSB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfRFJPUERPV04sIDEwLCAxMDAsIDE3NSwgMTQKCVBVU0hCVVRUT04gIk9LIiwgSURPSywgMTk1LCAxMCwgNTAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCglQVVNIQlVUVE9OICJBbm51bGVyZW4iLCBJRENBTkNFTCwgMTk1LCAzMCwgNTAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCglQVVNIQlVUVE9OICJCbGFkZXJlbi4uLiIsIElEQ19SVU5ETEdfQlJPV1NFLCAxOTUsIDEwMCwgNTAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCkVORAo=