LyoNCiAgICBGcmVlUlRPUyBWNi4xLjAgLSBDb3B5cmlnaHQgKEMpIDIwMTAgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqIElmIHlvdSBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqICAgICsgTmV3IHRvIEZyZWVSVE9TLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqICAgICsgV2FudGluZyB0byBsZWFybiBGcmVlUlRPUyBvciBtdWx0aXRhc2tpbmcgaW4gZ2VuZXJhbCBxdWlja2x5ICAgICAgICoNCiAgICAqICAgICsgTG9va2luZyBmb3IgYmFzaWMgdHJhaW5pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqICAgICsgV2FudGluZyB0byBpbXByb3ZlIHlvdXIgRnJlZVJUT1Mgc2tpbGxzIGFuZCBwcm9kdWN0aXZpdHkgICAgICAgICAgICoNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqIHRoZW4gdGFrZSBhIGxvb2sgYXQgdGhlIEZyZWVSVE9TIGJvb2tzIC0gYXZhaWxhYmxlIGFzIFBERiBvciBwYXBlcmJhY2sgICoNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqICAgICAgICAiVXNpbmcgdGhlIEZyZWVSVE9TIFJlYWwgVGltZSBLZXJuZWwgLSBhIFByYWN0aWNhbCBHdWlkZSIgICAgICAgICoNCiAgICAqICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRG9jdW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICoNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqIEEgcGRmIHJlZmVyZW5jZSBtYW51YWwgaXMgYWxzbyBhdmFpbGFibGUuICBCb3RoIGFyZSB1c3VhbGx5IGRlbGl2ZXJlZCAgICoNCiAgICAqIHRvIHlvdXIgaW5ib3ggd2l0aGluIDIwIG1pbnV0ZXMgdG8gdHdvIGhvdXJzIHdoZW4gcHVyY2hhc2VkIGJldHdlZW4gOGFtICoNCiAgICAqIGFuZCA4cG0gR01UIChhbHRob3VnaCBwbGVhc2UgYWxsb3cgdXAgdG8gMjQgaG91cnMgaW4gY2FzZSBvZiAgICAgICAgICAgICoNCiAgICAqIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMpLiAgVGhhbmsgeW91IGZvciB5b3VyIHN1cHBvcnQhICAgICAgICAgICAgICAgICoNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUyBkaXN0cmlidXRpb24uDQoNCiAgICBGcmVlUlRPUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQogICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQgYnkgdGhlDQogICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEFORCBNT0RJRklFRCBCWSB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KICAgICoqKk5PVEUqKiogVGhlIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGlzIGluY2x1ZGVkIHRvIGFsbG93IHlvdSB0byBkaXN0cmlidXRlDQogICAgYSBjb21iaW5lZCB3b3JrIHRoYXQgaW5jbHVkZXMgRnJlZVJUT1Mgd2l0aG91dCBiZWluZyBvYmxpZ2VkIHRvIHByb3ZpZGUgdGhlDQogICAgc291cmNlIGNvZGUgZm9yIHByb3ByaWV0YXJ5IGNvbXBvbmVudHMgb3V0c2lkZSBvZiB0aGUgRnJlZVJUT1Mga2VybmVsLg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUDQogICAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQogICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcg0KICAgIG1vcmUgZGV0YWlscy4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIA0KICAgIExpY2Vuc2UgYW5kIHRoZSBGcmVlUlRPUyBsaWNlbnNlIGV4Y2VwdGlvbiBhbG9uZyB3aXRoIEZyZWVSVE9TOyBpZiBub3QgaXQgDQogICAgY2FuIGJlIHZpZXdlZCBoZXJlOiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTQuaHRtbCBhbmQgYWxzbyBvYnRhaW5lZCANCiAgICBieSB3cml0aW5nIHRvIFJpY2hhcmQgQmFycnksIGNvbnRhY3QgZGV0YWlscyBmb3Igd2hvbSBhcmUgYXZhaWxhYmxlIG9uIHRoZQ0KICAgIEZyZWVSVE9TIFdFQiBzaXRlLg0KDQogICAgMSB0YWIgPT0gNCBzcGFjZXMhDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyAtIERvY3VtZW50YXRpb24sIGxhdGVzdCBpbmZvcm1hdGlvbiwgbGljZW5zZSBhbmQNCiAgICBjb250YWN0IGRldGFpbHMuDQoNCiAgICBodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEEgdmVyc2lvbiB0aGF0IGlzIGNlcnRpZmllZCBmb3IgdXNlIGluIHNhZmV0eQ0KICAgIGNyaXRpY2FsIHN5c3RlbXMuDQoNCiAgICBodHRwOi8vd3d3Lk9wZW5SVE9TLmNvbSAtIENvbW1lcmNpYWwgc3VwcG9ydCwgZGV2ZWxvcG1lbnQsIHBvcnRpbmcsDQogICAgbGljZW5zaW5nIGFuZCB0cmFpbmluZyBzZXJ2aWNlcy4NCiovDQoNCg0KLyoNCiAqIENyZWF0ZXMgYWxsIHRoZSBkZW1vIGFwcGxpY2F0aW9uIHRhc2tzLCB0aGVuIHN0YXJ0cyB0aGUgc2NoZWR1bGVyLiAgVGhlIFdFQg0KICogZG9jdW1lbnRhdGlvbiBwcm92aWRlcyBtb3JlIGRldGFpbHMgb2YgdGhlIHN0YW5kYXJkIGRlbW8gYXBwbGljYXRpb24gdGFza3MNCiAqICh3aGljaCBqdXN0IGV4aXN0IHRvIHRlc3QgdGhlIGtlcm5lbCBwb3J0IGFuZCBwcm92aWRlIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZQ0KICogZWFjaCBGcmVlUlRPUyBBUEkgZnVuY3Rpb24pLg0KICoNCiAqIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBkZW1vIHRhc2tzLCB0aGUgZm9sbG93aW5nIHRhc2tzIGFuZCB0ZXN0cyBhcmUNCiAqIGRlZmluZWQgYW5kL29yIGNyZWF0ZWQgd2l0aGluIHRoaXMgZmlsZToNCiAqDQogKiAiQ2hlY2siIHRhc2sgLSBUaGlzIG9ubHkgZXhlY3V0ZXMgZXZlcnkgZml2ZSBzZWNvbmRzIGJ1dCBoYXMgdGhlIGhpZ2hlc3QNCiAqIHByaW9yaXR5IHNvIGlzIGd1YXJhbnRlZWQgdG8gZ2V0IHByb2Nlc3NvciB0aW1lLiAgSXRzIG1haW4gZnVuY3Rpb24gaXMgdG8gDQogKiBjaGVjayB0aGF0IGFsbCB0aGUgc3RhbmRhcmQgZGVtbyB0YXNrcyBhcmUgc3RpbGwgb3BlcmF0aW9uYWwuIFRoZSBjaGVjayB0YXNrDQogKiB3aWxsIHRvZ2dsZSBMRUQgMyAoUEIxMSkgZXZlcnkgZml2ZSBzZWNvbmRzIHNvIGxvbmcgYXMgbm8gZXJyb3JzIGhhdmUgYmVlbg0KICogZGV0ZWN0ZWQuICBUaGUgdG9nZ2xlIHJhdGUgd2lsbCBpbmNyZWFzZSB0byBoYWxmIGEgc2Vjb25kIGlmIGFuIGVycm9yIGhhcyANCiAqIGJlZW4gZm91bmQgaW4gYW55IHRhc2suDQogKg0KICogIkVjaG8iIHRhc2sgLSBUaGlzIGlzIGEgdmVyeSBiYXNpYyB0YXNrIHRoYXQgc2ltcGx5IGVjaG9lcyBhbnkgY2hhcmFjdGVycyANCiAqIHJlY2VpdmVkIG9uIENPTTAgKFVTQVJUMSkuICBUaGlzIGNhbiBiZSB0ZXN0ZWQgYnkgdHJhbnNtaXR0aW5nIGEgdGV4dCBmaWxlDQogKiBmcm9tIGEgZHVtYiB0ZXJtaW5hbCB0byB0aGUgU1RNMzIgVVNBUlQgdGhlbiBvYnNlcnZpbmcgb3IgY2FwdHVyaW5nIHRoZSB0ZXh0DQogKiB0aGF0IGlzIGVjaG9lZCBiYWNrLiAgTWlzc2luZyBjaGFyYWN0ZXJzIHdpbGwgYmUgYWxsIHRoZSBtb3JlIG9idmlvdXMgaWYgdGhlIA0KICogZmlsZSBjb250YWlucyBhIHNpbXBsZSByZXBlYXRpbmcgc3RyaW5nIG9mIGZpeGVkIHdpZHRoLg0KICoNCiAqIEN1cnJlbnRseSB0aGlzIGRlbW8gZG9lcyBub3QgaW5jbHVkZSBpbnRlcnJ1cHQgbmVzdGluZyBleGFtcGxlcy4gIEhpZ2ggDQogKiBmcmVxdWVuY3kgdGltZXIgYW5kIHNpbXBsZXIgbmVzdGluZyBleGFtcGxlcyBjYW4gYmUgZm91bmQgaW4gbW9zdCBDb3J0ZXggTTMNCiAqIGRlbW8gYXBwbGljYXRpb25zLg0KICoNCiAqIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbml0aWFsaXNlLCBzZXQgYW5kIGNsZWFyIExFRCBvdXRwdXRzIGFyZSBub3JtYWxseSANCiAqIGRlZmluZWQgaW4gcGFydGVzdC5jLiAgVGhpcyBkZW1vIGluY2x1ZGVzIHR3byBwYXJ0ZXN0IGZpbGVzLCBvbmUgdGhhdCBpcyANCiAqIGNvbmZpZ3VyZWQgZm9yIHVzZSB3aXRoIHRoZSBLZWlsIE1DQlNUTTMyIGV2YWx1YXRpb24gYm9hcmQgKGNhbGxlZCANCiAqIFBhclRlc3RfTUNCU1RNMzIuYykgYW5kIG9uZSB0aGF0IGlzIGNvbmZpZ3VyZWQgZm9yIHVzZSB3aXRoIHRoZSBvZmZpY2lhbA0KICogU1QgRXZhbCBib2FyZCAoY2FsbGVkIFBhclRlc3RfU1RfRXZhbC5jKS4gIE9uZSBvbmUgb2YgdGhlc2UgZmlsZXMgc2hvdWxkIGJlDQogKiBpbmNsdWRlZCBpbiB0aGUgYnVpbGQgYXQgYW55IG9uZSB0aW1lLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGhhcmR3YXJlIA0KICogYWN0dWFsbHkgYmVpbmcgdXNlZC4NCiAqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAidGFzay5oIg0KI2luY2x1ZGUgInF1ZXVlLmgiDQoNCi8qIExpYnJhcnkgaW5jbHVkZXMuICovDQojaW5jbHVkZSAic3RtMzJmMTB4X2l0LmgiDQoNCi8qIERlbW8gYXBwIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkJsb2NrUS5oIg0KI2luY2x1ZGUgImludGVnZXIuaCINCiNpbmNsdWRlICJmbGFzaC5oIg0KI2luY2x1ZGUgInBhcnRlc3QuaCINCiNpbmNsdWRlICJzZW10ZXN0LmgiDQojaW5jbHVkZSAiR2VuUVRlc3QuaCINCiNpbmNsdWRlICJRUGVlay5oIg0KI2luY2x1ZGUgInJlY211dGV4LmgiDQoNCi8qIERyaXZlciBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJTVE0zMl9VU0FSVC5oIg0KDQoNCi8qIFRoZSB0aW1lIGJldHdlZW4gY3ljbGVzIG9mIHRoZSAnY2hlY2snIHRhc2sgLSB3aGljaCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlDQpjaGVjayB0YXNrIGhhcyBkZXRlY3RlZCBhbiBlcnJvciBvciBub3QuICovDQojZGVmaW5lIG1haW5DSEVDS19ERUxBWV9OT19FUlJPUgkJCSggKCBwb3J0VGlja1R5cGUgKSA1MDAwIC8gcG9ydFRJQ0tfUkFURV9NUyApDQojZGVmaW5lIG1haW5DSEVDS19ERUxBWV9FUlJPUgkJCQkoICggcG9ydFRpY2tUeXBlICkgNTAwIC8gcG9ydFRJQ0tfUkFURV9NUyApDQoNCi8qIFRoZSBMRUQgY29udHJvbGxlZCBieSB0aGUgJ2NoZWNrJyB0YXNrLiAqLw0KI2RlZmluZSBtYWluQ0hFQ0tfTEVECQkJCQkJKCAzICkNCg0KLyogVGFzayBwcmlvcml0aWVzLiAqLw0KI2RlZmluZSBtYWluU0VNX1RFU1RfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMSApDQojZGVmaW5lIG1haW5CTE9DS19RX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDIgKQ0KI2RlZmluZSBtYWluQ0hFQ0tfVEFTS19QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAzICkNCiNkZWZpbmUgbWFpbkZMQVNIX1RBU0tfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMiApDQojZGVmaW5lIG1haW5FQ0hPX1RBU0tfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMSApDQojZGVmaW5lIG1haW5JTlRFR0VSX1RBU0tfUFJJT1JJVFkgICAgICAgICAgICggdHNrSURMRV9QUklPUklUWSApDQojZGVmaW5lIG1haW5HRU5fUVVFVUVfVEFTS19QUklPUklUWQkJCSggdHNrSURMRV9QUklPUklUWSApDQoNCi8qIENPTSBwb3J0IGFuZCBiYXVkIHJhdGUgdXNlZCBieSB0aGUgZWNobyB0YXNrLiAqLw0KI2RlZmluZSBtYWluQ09NMAkJCQkJCQkoIDAgKQ0KI2RlZmluZSBtYWluQkFVRF9SQVRFCQkJCQkJKCAxMTUyMDAgKQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoNCiAqIENvbmZpZ3VyZSB0aGUgaGFyZHdhcmUgZm9yIHRoZSBkZW1vLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEhhcmR3YXJlKCB2b2lkICk7DQoNCi8qIFRoZSAnY2hlY2snIHRhc2sgYXMgZGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAqLw0Kc3RhdGljIHZvaWQgcHJ2Q2hlY2tUYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKTsNCg0KLyogQSBzaW1wbGUgdGFzayB0aGF0IGVjaG9lcyBhbGwgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgcmVjZWl2ZWQgb24gQ09NMCANCihVU0FSVDEpLiAqLw0Kc3RhdGljIHZvaWQgcHJ2VVNBUlRFY2hvVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQppbnQgbWFpbiggdm9pZCApDQp7DQojaWZkZWYgREVCVUcNCiAgZGVidWcoKTsNCiNlbmRpZg0KDQoJLyogU2V0IHVwIHRoZSBjbG9ja3MgYW5kIG1lbW9yeSBpbnRlcmZhY2UuICovDQoJcHJ2U2V0dXBIYXJkd2FyZSgpOw0KDQoJLyogU3RhcnQgdGhlIHN0YW5kYXJkIGRlbW8gdGFza3MuICBUaGVzZSBhcmUganVzdCBoZXJlIHRvIGV4ZXJjaXNlIHRoZQ0KCWtlcm5lbCBwb3J0IGFuZCBwcm92aWRlIGV4YW1wbGVzIG9mIGhvdyB0aGUgRnJlZVJUT1MgQVBJIGNhbiBiZSB1c2VkLiAqLw0KCXZTdGFydEJsb2NraW5nUXVldWVUYXNrcyggbWFpbkJMT0NLX1FfUFJJT1JJVFkgKTsNCiAgICB2U3RhcnRTZW1hcGhvcmVUYXNrcyggbWFpblNFTV9URVNUX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0SW50ZWdlck1hdGhUYXNrcyggbWFpbklOVEVHRVJfVEFTS19QUklPUklUWSApOw0KICAgIHZTdGFydEdlbmVyaWNRdWV1ZVRhc2tzKCBtYWluR0VOX1FVRVVFX1RBU0tfUFJJT1JJVFkgKTsNCgl2U3RhcnRMRURGbGFzaFRhc2tzKCBtYWluRkxBU0hfVEFTS19QUklPUklUWSApOw0KICAgIHZTdGFydFF1ZXVlUGVla1Rhc2tzKCk7DQogICAgdlN0YXJ0UmVjdXJzaXZlTXV0ZXhUYXNrcygpOw0KDQoJLyogQ3JlYXRlIHRoZSAnZWNobycgdGFzaywgd2hpY2ggaXMgYWxzbyBkZWZpbmVkIHdpdGhpbiB0aGlzIGZpbGUuICovDQoJeFRhc2tDcmVhdGUoIHBydlVTQVJURWNob1Rhc2ssICggc2lnbmVkIGNoYXIgKiApICJFY2hvIiwgY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFLCBOVUxMLCBtYWluRUNIT19UQVNLX1BSSU9SSVRZLCBOVUxMICk7DQoNCgkvKiBDcmVhdGUgdGhlICdjaGVjaycgdGFzaywgd2hpY2ggaXMgYWxzbyBkZWZpbmVkIHdpdGhpbiB0aGlzIGZpbGUuICovDQoJeFRhc2tDcmVhdGUoIHBydkNoZWNrVGFzaywgKCBzaWduZWQgY2hhciAqICkgIkNoZWNrIiwgY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFLCBOVUxMLCBtYWluQ0hFQ0tfVEFTS19QUklPUklUWSwgTlVMTCApOw0KDQogICAgLyogU3RhcnQgdGhlIHNjaGVkdWxlci4gKi8NCgl2VGFza1N0YXJ0U2NoZWR1bGVyKCk7DQoNCiAgICAvKiBXaWxsIG9ubHkgZ2V0IGhlcmUgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBpZGxlDQogICAgdGFzay4gIFRoZSBpZGxlIHRhc2sgaXMgY3JlYXRlZCB3aXRoaW4gdlRhc2tTdGFydFNjaGVkdWxlcigpLiAqLw0KCWZvciggOzsgKTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBEZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuICovDQpzdGF0aWMgdm9pZCBwcnZDaGVja1Rhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApDQp7DQpwb3J0VGlja1R5cGUgeExhc3RFeGVjdXRpb25UaW1lOw0KdW5zaWduZWQgbG9uZyB1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX05PX0VSUk9SOw0KDQoJLyogSnVzdCB0byByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdGhlIHVudXNlZCBwYXJhbWV0ZXIuICovDQoJKCB2b2lkICkgcHZQYXJhbWV0ZXJzOw0KDQoJLyogSW5pdGlhbGlzZSB0aGUgdmFyaWFibGUgdXNlZCB0byBjb250cm9sIG91ciBpdGVyYXRpb24gcmF0ZSBwcmlvciB0bw0KCWl0cyBmaXJzdCB1c2UuICovDQoJeExhc3RFeGVjdXRpb25UaW1lID0geFRhc2tHZXRUaWNrQ291bnQoKTsNCg0KCWZvciggOzsgKQ0KCXsNCgkJLyogV2FpdCB1bnRpbCBpdCBpcyB0aW1lIHRvIHJ1biB0aGUgdGVzdHMgYWdhaW4uICovDQoJCXZUYXNrRGVsYXlVbnRpbCggJnhMYXN0RXhlY3V0aW9uVGltZSwgdWxUaWNrc1RvV2FpdCApOw0KDQoJCS8qIEhhcyBhbiBlcnJvciBiZWVuIGZvdW5kIGluIGFueSB0YXNrPyAqLw0KCQlpZiggeEFyZUdlbmVyaWNRdWV1ZVRhc2tzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkJew0KCQkJLyogUmVkdWNlIHRoZSB0aW1lIGJldHdlZW4gY3ljbGVzIG9mIHRoaXMgdGFzayAtIHdoaWNoIGhhcyB0aGUNCgkJCWVmZmVjdCBvZiBpbmNyZWFzaW5nIHRoZSByYXRlIGF0IHdoaWNoIHRoZSAnY2hlY2snIExFRCB0b2dnbGVzIHRvDQoJCQlpbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIGFuIGVycm9yIHRvIGFuIG9ic2VydmVyLiAqLw0KCQkJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkJfQ0KCQllbHNlIGlmKCB4QXJlUXVldWVQZWVrVGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCQl7DQoJCQl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCQl9DQoJCWVsc2UgaWYoIHhBcmVCbG9ja2luZ1F1ZXVlc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJCXsNCgkJCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJCX0NCgkgICAgZWxzZSBpZiggeEFyZVNlbWFwaG9yZVRhc2tzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkgICAgew0KCSAgICAgICAgdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkgICAgfQ0KCSAgICBlbHNlIGlmKCB4QXJlSW50ZWdlck1hdGhzVGFza1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJICAgIHsNCgkgICAgICAgIHVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJICAgIH0NCgkgICAgZWxzZSBpZiggeEFyZVJlY3Vyc2l2ZU11dGV4VGFza3NTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCSAgICB7DQoJICAgIAl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCSAgICB9DQoNCgkJdlBhclRlc3RUb2dnbGVMRUQoIG1haW5DSEVDS19MRUQgKTsNCgl9DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogRGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAqLw0Kc3RhdGljIHZvaWQgcHJ2VVNBUlRFY2hvVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkNCnsNCnNpZ25lZCBjaGFyIGNDaGFyOw0KDQovKiBTdHJpbmcgZGVjbGFyZWQgc3RhdGljIHRvIGVuc3VyZSBpdCBkb2VzIG5vdCBlbmQgdXAgb24gdGhlIHN0YWNrLCBubyBtYXR0ZXINCndoYXQgdGhlIG9wdGltaXNhdGlvbiBsZXZlbC4gKi8NCnN0YXRpYyBjb25zdCBjaGFyICpwY0xvbmdpc2hTdHJpbmcgPSANCiJBQkJBIHdhcyBhIFN3ZWRpc2ggcG9wIG11c2ljIGdyb3VwIGZvcm1lZCBpbiBTdG9ja2hvbG0gaW4gMTk3MiwgY29uc2lzdGluZyBvZiBBbm5pLUZyaWQgRnJpZGEgTHluZ3N0YWQsICINCiJCavZybiBVbHZhZXVzLCBCZW5ueSBBbmRlcnNzb24gYW5kIEFnbmV0aGEgRuRsdHNrb2cuIFRocm91Z2hvdXQgdGhlIGJhbmQncyBleGlzdGVuY2UsIEbkbHRza29nIGFuZCBVbHZhZXVzICINCiJ3ZXJlIGEgbWFycmllZCBjb3VwbGUsIGFzIHdlcmUgTHluZ3N0YWQgYW5kIEFuZGVyc3NvbiAtIGFsdGhvdWdoIGJvdGggY291cGxlcyBsYXRlciBkaXZvcmNlZC4gVGhleSBiZWNhbWUgb25lICINCiJvZiB0aGUgbW9zdCBjb21tZXJjaWFsbHkgc3VjY2Vzc2Z1bCBhY3RzIGluIHRoZSBoaXN0b3J5IG9mIHBvcHVsYXIgbXVzaWMsIGFuZCB0aGV5IHRvcHBlZCB0aGUgY2hhcnRzIHdvcmxkd2lkZSAiDQoiZnJvbSAxOTcyIHRvIDE5ODMuICBBQkJBIGdhaW5lZCBpbnRlcm5hdGlvbmFsIHBvcHVsYXJpdHkgZW1wbG95aW5nIGNhdGNoeSBzb25nIGhvb2tzLCBzaW1wbGUgbHlyaWNzLCBzb3VuZCAiDQoiZWZmZWN0cyAocmV2ZXJiLCBwaGFzaW5nKSBhbmQgYSBXYWxsIG9mIFNvdW5kIGFjaGlldmVkIGJ5IG92ZXJkdWJiaW5nIHRoZSBmZW1hbGUgc2luZ2Vycycgdm9pY2VzIGluIG11bHRpcGxlICINCiJoYXJtb25pZXMuIEFzIHRoZWlyIHBvcHVsYXJpdHkgZ3JldywgdGhleSB3ZXJlIHNvdWdodCBhZnRlciB0byB0b3VyIEV1cm9wZSwgQXVzdHJhbGlhLCBhbmQgTm9ydGggQW1lcmljYSwgZHJhd2luZyAiDQoiY3Jvd2RzIG9mIGFyZGVudCBmYW5zLCBub3RhYmx5IGluIEF1c3RyYWxpYS4gVG91cmluZyBiZWNhbWUgYSBjb250ZW50aW91cyBpc3N1ZSwgYmVpbmcgcGFydGljdWxhcmx5IGN1bWJlcnNvbWUgZm9yICINCiJG5Gx0c2tvZywgYnV0IHRoZXkgY29udGludWVkIHRvIHJlbGVhc2Ugc3R1ZGlvIGFsYnVtcyB0byB3aWRlc3ByZWFkIGNvbW1lcmNpYWwgc3VjY2Vzcy4gQXQgdGhlIGhlaWdodCBvZiB0aGVpciAiDQoicG9wdWxhcml0eSwgaG93ZXZlciwgYm90aCByZWxhdGlvbnNoaXBzIGJlZ2FuIHN1ZmZlcmluZyBzdHJhaW4gdGhhdCBsZWQgdWx0aW1hdGVseSB0byB0aGUgY29sbGFwc2Ugb2YgZmlyc3QgdGhlICINCiJVbHZhZXVzLUbkbHRza29nIG1hcnJpYWdlIChpbiAxOTc5KSBhbmQgdGhlbiBvZiB0aGUgQW5kZXJzc29uLUx5bmdzdGFkIG1hcnJpYWdlIGluIDE5ODEuIEluIHRoZSBsYXRlIDE5NzBzIGFuZCBlYXJseSAiDQoiMTk4MHMgdGhlc2UgcmVsYXRpb25zaGlwIGNoYW5nZXMgYmVnYW4gbWFuaWZlc3RpbmcgaW4gdGhlIGdyb3VwJ3MgbXVzaWMsIGFzIHRoZXkgcHJvZHVjZWQgbW9yZSB0aG91Z2h0ZnVsLCAiDQoiaW50cm9zcGVjdGl2ZSBseXJpY3Mgd2l0aCBkaWZmZXJlbnQgY29tcG9zaXRpb25zLiI7DQoNCgkvKiBKdXN0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLiAqLw0KCSggdm9pZCApIHB2UGFyYW1ldGVyczsNCg0KCS8qIEluaXRpYWxpc2UgQ09NMCwgd2hpY2ggaXMgVVNBUlQxIGFjY29yZGluZyB0byB0aGUgU1RNMzIgbGlicmFyaWVzLiAqLw0KCWxDT01Qb3J0SW5pdCggbWFpbkNPTTAsIG1haW5CQVVEX1JBVEUgKTsNCg0KCS8qIFRyeSBzZW5kaW5nIG91dCBhIHN0cmluZyBhbGwgaW4gb25lIGdvLCBhcyBhIHZlcnkgYmFzaWMgdGVzdCBvZiB0aGUNCiAgICBsU2VyaWFsUHV0U3RyaW5nKCkgZnVuY3Rpb24uICovDQogICAgbFNlcmlhbFB1dFN0cmluZyggbWFpbkNPTTAsIHBjTG9uZ2lzaFN0cmluZywgc3RybGVuKCBwY0xvbmdpc2hTdHJpbmcgKSApOw0KDQoJZm9yKCA7OyApDQoJew0KCQkvKiBCbG9jayB0byB3YWl0IGZvciBhIGNoYXJhY3RlciB0byBiZSByZWNlaXZlZCBvbiBDT00wLiAqLw0KCQl4U2VyaWFsR2V0Q2hhciggbWFpbkNPTTAsICZjQ2hhciwgcG9ydE1BWF9ERUxBWSApOw0KDQoJCS8qIFdyaXRlIHRoZSByZWNlaXZlZCBjaGFyYWN0ZXIgYmFjayB0byBDT00wLiAqLw0KCQl4U2VyaWFsUHV0Q2hhciggbWFpbkNPTTAsIGNDaGFyLCAwICk7DQoJfQ0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwSGFyZHdhcmUoIHZvaWQgKQ0Kew0KCS8qIFJDQyBzeXN0ZW0gcmVzZXQoZm9yIGRlYnVnIHB1cnBvc2UpLiAqLw0KCVJDQ19EZUluaXQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiAgICAvKiBFbmFibGUgSFNFLiAqLw0KCVJDQ19IU0VDb25maWcoIFJDQ19IU0VfT04gKTsgICAgICAgICAgIA0KCQ0KCS8qIFdhaXQgdGlsbCBIU0UgaXMgcmVhZHkuICovDQoJd2hpbGUgKFJDQ19HZXRGbGFnU3RhdHVzKFJDQ19GTEFHX0hTRVJEWSkgPT0gUkVTRVQpOw0KCQ0KICAgIC8qIEhDTEsgPSBTWVNDTEsuICovDQoJUkNDX0hDTEtDb25maWcoIFJDQ19TWVNDTEtfRGl2MSApOyAgIA0KDQogICAgLyogUENMSzIgID0gSENMSy4gKi8NCglSQ0NfUENMSzJDb25maWcoIFJDQ19IQ0xLX0RpdjEgKTsgICAgIA0KDQogICAgLyogUENMSzEgID0gSENMSy8yLiAqLw0KCVJDQ19QQ0xLMUNvbmZpZyggUkNDX0hDTEtfRGl2MiApOyAgICAgDQoNCgkvKiBBRENDTEsgPSBQQ0xLMi80LiAqLw0KCVJDQ19BRENDTEtDb25maWcoIFJDQ19QQ0xLMl9EaXY0ICk7ICAgIA0KCQ0KICAgIC8qIEZsYXNoIDIgd2FpdCBzdGF0ZS4gKi8NCgkqKCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAqICkweDQwMDIyMDAwID0gMHgwMTsgICAgICAgICAgIA0KCQ0KCS8qIFBMTENMSyA9IDhNSHogKiA5ID0gNzIgTUh6ICovDQoJUkNDX1BMTENvbmZpZyggUkNDX1BMTFNvdXJjZV9IU0VfRGl2MSwgUkNDX1BMTE11bF85ICk7DQoJDQogICAgLyogRW5hYmxlIFBMTC4gKi8NCglSQ0NfUExMQ21kKCBFTkFCTEUgKTsNCgkNCgkvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5LiAqLw0KCXdoaWxlIChSQ0NfR2V0RmxhZ1N0YXR1cyhSQ0NfRkxBR19QTExSRFkpID09IFJFU0VUKTsNCgkNCgkvKiBTZWxlY3QgUExMIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuICovDQoJUkNDX1NZU0NMS0NvbmZpZyAoUkNDX1NZU0NMS1NvdXJjZV9QTExDTEspOw0KCQ0KCS8qIFdhaXQgdGlsbCBQTEwgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiAqLw0KCXdoaWxlIChSQ0NfR2V0U1lTQ0xLU291cmNlKCkgIT0gMHgwOCk7DQoNCgkvKiBFbmFibGUgR1BJT0EsIEdQSU9CLCBHUElPQywgR1BJT0QsIEdQSU9FIGFuZCBBRklPIGNsb2NrcyAqLw0KCVJDQ19BUEIyUGVyaXBoQ2xvY2tDbWQoCVJDQ19BUEIyUGVyaXBoX0dQSU9BIHwgUkNDX0FQQjJQZXJpcGhfR1BJT0IgfFJDQ19BUEIyUGVyaXBoX0dQSU9DDQoJCQkJCQkJfCBSQ0NfQVBCMlBlcmlwaF9HUElPRCB8IFJDQ19BUEIyUGVyaXBoX0dQSU9FIHwgUkNDX0FQQjJQZXJpcGhfQUZJTywgRU5BQkxFICk7DQoNCgkvKiBTZXQgdGhlIFZlY3RvciBUYWJsZSBiYXNlIGFkZHJlc3MgYXQgMHgwODAwMDAwMC4gKi8NCglOVklDX1NldFZlY3RvclRhYmxlKCBOVklDX1ZlY3RUYWJfRkxBU0gsIDB4MCApOw0KDQoJTlZJQ19Qcmlvcml0eUdyb3VwQ29uZmlnKCBOVklDX1ByaW9yaXR5R3JvdXBfNCApOw0KDQoJLyogQ29uZmlndXJlIEhDTEsgY2xvY2sgYXMgU3lzVGljayBjbG9jayBzb3VyY2UuICovDQoJU3lzVGlja19DTEtTb3VyY2VDb25maWcoIFN5c1RpY2tfQ0xLU291cmNlX0hDTEsgKTsNCg0KCS8qIEluaXRpYWxpc2UgdGhlIElPIHVzZWQgZm9yIHRoZSBMRUQgb3V0cHV0cy4gKi8NCgl2UGFyVGVzdEluaXRpYWxpc2UoKTsNCg0KCS8qIFNQSTIgUGVyaXBoIGNsb2NrIGVuYWJsZSAqLw0KCVJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQoIFJDQ19BUEIxUGVyaXBoX1NQSTIsIEVOQUJMRSApOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZvaWQgdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soIHhUYXNrSGFuZGxlICpweFRhc2ssIHNpZ25lZCBjaGFyICpwY1Rhc2tOYW1lICkNCnsNCgkvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IGNhbGxlZCBpZiBhIHRhc2sgb3ZlcmZsb3dzIGl0cyBzdGFjay4gICBJZiB0aGUNCglwYXJhbWV0ZXJzIGFyZSBjb3JydXB0IHRoZW4gaW5zcGVjdCBweEN1cnJlbnRUQ0IgdG8gZmluZCB3aGljaCB3YXMgdGhlDQoJb2ZmZW5kaW5nIHRhc2suICovDQoNCgkoIHZvaWQgKSBweFRhc2s7DQoJKCB2b2lkICkgcGNUYXNrTmFtZTsNCg0KCWZvciggOzsgKTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2b2lkIGFzc2VydF9mYWlsZWQoIHVuc2lnbmVkIGNoYXIgKnB1Y0ZpbGUsIHVuc2lnbmVkIGxvbmcgdWxMaW5lICkNCnsNCgkoIHZvaWQgKSBwdWNGaWxlOw0KCSggdm9pZCApIHVsTGluZTsNCg0KCWZvciggOzsgKTsNCn0NCg0K