ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBmOGM5NmZmLi44YzMwODgzIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC03ODcsNiArNzg3LDEzIEBACiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTLykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIiouamFyIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCiAKKyMgUmVtb3ZlIG9ic29sZXRlIGRleHByZW9wdF9jb25maWcgYXJ0aWZhY3RzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1mICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcvZGV4cHJlb3B0LmNvbmZpZykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZy9kZXhwcmVvcHRfc29vbmcuY29uZmlnKQorCisjIENsZWFyIG91dCBTb29uZyAuaW50ZXJtZWRpYXRlcyBkaXJlY3RvcnkgcmVnYXJkaW5nIHJlbW92YWwgb2YgaGFzaGVkIHN1YmRpcgorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9zb29uZy8uaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY2kvQW5kcm9pZC5icCBiL2NpL0FuZHJvaWQuYnAKaW5kZXggMDY2YjgzZi4uNmQ0YWMzNSAxMDA2NDQKLS0tIGEvY2kvQW5kcm9pZC5icAorKysgYi9jaS9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgewogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hZHRlIiwKIH0KIAogcHl0aG9uX3Rlc3RfaG9zdCB7CkBAIC03MCwxMCArNzEsMzcgQEAKICAgICB9LAogfQogCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAib3B0aW1pemVkX3RhcmdldHNfdGVzdCIsCisgICAgbWFpbjogIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXMiLAorICAgICAgICAicHlmYWtlZnMiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgIjpweTMtY21kIiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCiBweXRob25fbGlicmFyeV9ob3N0IHsKICAgICBuYW1lOiAiYnVpbGRfdGVzdF9zdWl0ZXMiLAogICAgIHNyY3M6IFsKICAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzLnB5IiwKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzLnB5IiwKKyAgICAgICAgInRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5IiwKKyAgICAgICAgImJ1aWxkX2NvbnRleHQucHkiLAogICAgIF0sCiB9CiAKZGlmZiAtLWdpdCBhL2NpL2J1aWxkX2NvbnRleHQucHkgYi9jaS9idWlsZF9jb250ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDhkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9idWlsZF9jb250ZXh0LnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiQ29udGFpbmVyIGNsYXNzIGZvciBidWlsZCBjb250ZXh0IHdpdGggdXRpbGl0eSBmdW5jdGlvbnMuIiIiCisKK2ltcG9ydCByZQorCisKK2NsYXNzIEJ1aWxkQ29udGV4dDoKKworICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRfY29udGV4dF9kaWN0OiBkaWN0W3N0ciwgYW55XSk6CisgICAgc2VsZi5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzID0gc2V0KCkKKyAgICBmb3Igb3B0IGluIGJ1aWxkX2NvbnRleHRfZGljdC5nZXQoJ2VuYWJsZWRCdWlsZEZlYXR1cmVzJywgW10pOgorICAgICAgc2VsZi5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzLmFkZChvcHQuZ2V0KCduYW1lJykpCisgICAgc2VsZi50ZXN0X2luZm9zID0gc2V0KCkKKyAgICBmb3IgdGVzdF9pbmZvX2RpY3QgaW4gYnVpbGRfY29udGV4dF9kaWN0LmdldCgndGVzdENvbnRleHQnLCBkaWN0KCkpLmdldCgKKyAgICAgICAgJ3Rlc3RJbmZvcycsIFtdCisgICAgKToKKyAgICAgIHNlbGYudGVzdF9pbmZvcy5hZGQoc2VsZi5UZXN0SW5mbyh0ZXN0X2luZm9fZGljdCkpCisKKyAgZGVmIGJ1aWxkX3RhcmdldF91c2VkKHNlbGYsIHRhcmdldDogc3RyKSAtPiBib29sOgorICAgIHJldHVybiBhbnkodGVzdC5idWlsZF90YXJnZXRfdXNlZCh0YXJnZXQpIGZvciB0ZXN0IGluIHNlbGYudGVzdF9pbmZvcykKKworICBjbGFzcyBUZXN0SW5mbzoKKworICAgIF9ET1dOTE9BRF9PUFRTID0geworICAgICAgICAndGVzdC1jb25maWctb25seS16aXAnLAorICAgICAgICAndGVzdC16aXAtZmlsZS1maWx0ZXInLAorICAgICAgICAnZXh0cmEtaG9zdC1zaGFyZWQtbGliLXppcCcsCisgICAgICAgICdzYW5kYm94LXRlc3RzLXppcHMnLAorICAgICAgICAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAnY3RzLXBhY2thZ2UtbmFtZScsCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RfaW5mb19kaWN0OiBkaWN0W3N0ciwgYW55XSk6CisgICAgICBzZWxmLmlzX3Rlc3RfbWFwcGluZyA9IEZhbHNlCisgICAgICBzZWxmLnRlc3RfbWFwcGluZ190ZXN0X2dyb3VwcyA9IHNldCgpCisgICAgICBzZWxmLmZpbGVfZG93bmxvYWRfb3B0aW9ucyA9IHNldCgpCisgICAgICBmb3Igb3B0IGluIHRlc3RfaW5mb19kaWN0LmdldCgnZXh0cmFPcHRpb25zJywgW10pOgorICAgICAgICBrZXkgPSBvcHQuZ2V0KCdrZXknKQorICAgICAgICBpZiBrZXkgPT0gJ3Rlc3QtbWFwcGluZy10ZXN0LWdyb3VwJzoKKyAgICAgICAgICBzZWxmLmlzX3Rlc3RfbWFwcGluZyA9IFRydWUKKyAgICAgICAgICBzZWxmLnRlc3RfbWFwcGluZ190ZXN0X2dyb3Vwcy51cGRhdGUob3B0LmdldCgndmFsdWVzJywgc2V0KCkpKQorCisgICAgICAgIGlmIGtleSBpbiBzZWxmLl9ET1dOTE9BRF9PUFRTOgorICAgICAgICAgIHNlbGYuZmlsZV9kb3dubG9hZF9vcHRpb25zLnVwZGF0ZShvcHQuZ2V0KCd2YWx1ZXMnLCBzZXQoKSkpCisKKyAgICBkZWYgYnVpbGRfdGFyZ2V0X3VzZWQoc2VsZiwgdGFyZ2V0OiBzdHIpIC0+IGJvb2w6CisgICAgICAjIEZvciBhbGwgb2YgYSB0YXJnZXRzJyBvdXRwdXRzLCBjaGVjayBpZiBhbnkgb2YgdGhlIHJlZ2V4ZXMgdXNlZCBieSB0ZXN0cworICAgICAgIyB0byBkb3dubG9hZCBhcnRpZmFjdHMgd291bGQgbWF0Y2ggaXQuIElmIGFueSBvZiB0aGVtIGRvIHRoZW4gdGhpcyB0YXJnZXQKKyAgICAgICMgaXMgbmVjZXNzYXJ5LgorICAgICAgcmVnZXggPSByJ1xiKCVzKVxiJyAlIHJlLmVzY2FwZSh0YXJnZXQpCisgICAgICByZXR1cm4gYW55KHJlLnNlYXJjaChyZWdleCwgb3B0KSBmb3Igb3B0IGluIHNlbGYuZmlsZV9kb3dubG9hZF9vcHRpb25zKQpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXMucHkgYi9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQppbmRleCAyOWVkNTBlLi40MDI4ODBjIDEwMDY0NAotLS0gYS9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQorKysgYi9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQpAQCAtMTUsMTEgKzE1LDIyIEBACiAiIiJCdWlsZCBzY3JpcHQgZm9yIHRoZSBDSSBgdGVzdF9zdWl0ZXNgIHRhcmdldC4iIiIKIAogaW1wb3J0IGFyZ3BhcnNlCitmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKK2ltcG9ydCBqc29uCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHJlCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cworZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlCitmcm9tIGJ1aWxkX2NvbnRleHQgaW1wb3J0IEJ1aWxkQ29udGV4dAoraW1wb3J0IG9wdGltaXplZF90YXJnZXRzCisKKworUkVRVUlSRURfRU5WX1ZBUlMgPSBmcm96ZW5zZXQoWydUQVJHRVRfUFJPRFVDVCcsICdUQVJHRVRfUkVMRUFTRScsICdUT1AnXSkKK1NPT05HX1VJX0VYRV9SRUxfUEFUSCA9ICdidWlsZC9zb29uZy9zb29uZ191aS5iYXNoJworTE9HX1BBVEggPSAnbG9ncy9idWlsZF90ZXN0X3N1aXRlcy5sb2cnCiAKIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKQEAgLTM1LDE2ICs0Niw2NSBAQAogICAgIHNlbGYucmV0dXJuX2NvZGUgPSByZXR1cm5fY29kZQogCiAKLVJFUVVJUkVEX0VOVl9WQVJTID0gZnJvemVuc2V0KFsnVEFSR0VUX1BST0RVQ1QnLCAnVEFSR0VUX1JFTEVBU0UnLCAnVE9QJ10pCi1TT09OR19VSV9FWEVfUkVMX1BBVEggPSAnYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCcKK2NsYXNzIEJ1aWxkUGxhbm5lcjoKKyAgIiIiQ2xhc3MgaW4gY2hhcmdlIG9mIGRldGVybWluaW5nIGhvdyB0byBvcHRpbWl6ZSBidWlsZCB0YXJnZXRzLgorCisgIEdpdmVuIHRoZSBidWlsZCBjb250ZXh0IGFuZCB0YXJnZXRzIHRvIGJ1aWxkIGl0IHdpbGwgZGV0ZXJtaW5lIGEgZmluYWwgbGlzdCBvZgorICB0YXJnZXRzIHRvIGJ1aWxkIGFsb25nIHdpdGggZ2V0dGluZyBhIHNldCBvZiBwYWNrYWdpbmcgZnVuY3Rpb25zIHRvIHBhY2thZ2UgdXAKKyAgYW55IG91dHB1dCB6aXAgZmlsZXMgbmVlZGVkIGJ5IHRoZSBidWlsZC4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCwKKyAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSwKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zOiBkaWN0W3N0ciwgb3B0aW1pemVkX3RhcmdldHMuT3B0aW1pemVkQnVpbGRUYXJnZXRdLAorICApOgorICAgIHNlbGYuYnVpbGRfY29udGV4dCA9IGJ1aWxkX2NvbnRleHQKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgc2VsZi50YXJnZXRfb3B0aW1pemF0aW9ucyA9IHRhcmdldF9vcHRpbWl6YXRpb25zCisKKyAgZGVmIGNyZWF0ZV9idWlsZF9wbGFuKHNlbGYpOgorCisgICAgaWYgJ29wdGltaXplZF9idWlsZCcgbm90IGluIHNlbGYuYnVpbGRfY29udGV4dC5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzOgorICAgICAgcmV0dXJuIEJ1aWxkUGxhbihzZXQoc2VsZi5hcmdzLmV4dHJhX3RhcmdldHMpLCBzZXQoKSkKKworICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIHBhY2thZ2luZ19mdW5jdGlvbnMgPSBzZXQoKQorICAgIGZvciB0YXJnZXQgaW4gc2VsZi5hcmdzLmV4dHJhX3RhcmdldHM6CisgICAgICBpZiBzZWxmLl91bnVzZWRfdGFyZ2V0X2V4Y2x1c2lvbl9lbmFibGVkKAorICAgICAgICAgIHRhcmdldAorICAgICAgKSBhbmQgbm90IHNlbGYuYnVpbGRfY29udGV4dC5idWlsZF90YXJnZXRfdXNlZCh0YXJnZXQpOgorICAgICAgICBjb250aW51ZQorCisgICAgICB0YXJnZXRfb3B0aW1pemVyX2dldHRlciA9IHNlbGYudGFyZ2V0X29wdGltaXphdGlvbnMuZ2V0KHRhcmdldCwgTm9uZSkKKyAgICAgIGlmIG5vdCB0YXJnZXRfb3B0aW1pemVyX2dldHRlcjoKKyAgICAgICAgYnVpbGRfdGFyZ2V0cy5hZGQodGFyZ2V0KQorICAgICAgICBjb250aW51ZQorCisgICAgICB0YXJnZXRfb3B0aW1pemVyID0gdGFyZ2V0X29wdGltaXplcl9nZXR0ZXIoCisgICAgICAgICAgdGFyZ2V0LCBzZWxmLmJ1aWxkX2NvbnRleHQsIHNlbGYuYXJncworICAgICAgKQorICAgICAgYnVpbGRfdGFyZ2V0cy51cGRhdGUodGFyZ2V0X29wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpKQorICAgICAgcGFja2FnaW5nX2Z1bmN0aW9ucy5hZGQodGFyZ2V0X29wdGltaXplci5wYWNrYWdlX291dHB1dHMpCisKKyAgICByZXR1cm4gQnVpbGRQbGFuKGJ1aWxkX3RhcmdldHMsIHBhY2thZ2luZ19mdW5jdGlvbnMpCisKKyAgZGVmIF91bnVzZWRfdGFyZ2V0X2V4Y2x1c2lvbl9lbmFibGVkKHNlbGYsIHRhcmdldDogc3RyKSAtPiBib29sOgorICAgIHJldHVybiAoCisgICAgICAgIGYne3RhcmdldH1fdW51c2VkX2V4Y2x1c2lvbicKKyAgICAgICAgaW4gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICApCiAKIAotZGVmIGdldF90b3AoKSAtPiBwYXRobGliLlBhdGg6Ci0gIHJldHVybiBwYXRobGliLlBhdGgob3MuZW52aXJvblsnVE9QJ10pCitAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgQnVpbGRQbGFuOgorICBidWlsZF90YXJnZXRzOiBzZXRbc3RyXQorICBwYWNrYWdpbmdfZnVuY3Rpb25zOiBzZXRbQ2FsbGFibGVbLi4uLCBOb25lXV0KIAogCiBkZWYgYnVpbGRfdGVzdF9zdWl0ZXMoYXJndjogbGlzdFtzdHJdKSAtPiBpbnQ6Ci0gICIiIkJ1aWxkcyB0aGUgZ2VuZXJhbC10ZXN0cyBhbmQgYW55IG90aGVyIHRlc3Qgc3VpdGVzIHBhc3NlZCBpbi4KKyAgIiIiQnVpbGRzIGFsbCB0ZXN0IHN1aXRlcyBwYXNzZWQgaW4sIG9wdGltaXppbmcgYmFzZWQgb24gdGhlIGJ1aWxkX2NvbnRleHQgY29udGVudC4KIAogICBBcmdzOgogICAgIGFyZ3Y6IFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHBhc3NlZCBpbi4KQEAgLTU0LDkgKzExNCwxNCBAQAogICAiIiIKICAgYXJncyA9IHBhcnNlX2FyZ3MoYXJndikKICAgY2hlY2tfcmVxdWlyZWRfZW52KCkKKyAgYnVpbGRfY29udGV4dCA9IEJ1aWxkQ29udGV4dChsb2FkX2J1aWxkX2NvbnRleHQoKSkKKyAgYnVpbGRfcGxhbm5lciA9IEJ1aWxkUGxhbm5lcigKKyAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG9wdGltaXplZF90YXJnZXRzLk9QVElNSVpFRF9CVUlMRF9UQVJHRVRTCisgICkKKyAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQogCiAgIHRyeToKLSAgICBidWlsZF9ldmVyeXRoaW5nKGFyZ3MpCisgICAgZXhlY3V0ZV9idWlsZF9wbGFuKGJ1aWxkX3BsYW4pCiAgIGV4Y2VwdCBCdWlsZEZhaWx1cmVFcnJvciBhcyBlOgogICAgIGxvZ2dpbmcuZXJyb3IoJ0J1aWxkIGNvbW1hbmQgZmFpbGVkISBDaGVjayBidWlsZF9sb2cgZm9yIGRldGFpbHMuJykKICAgICByZXR1cm4gZS5yZXR1cm5fY29kZQpAQCAtNjQsNiArMTI5LDE2IEBACiAgIHJldHVybiAwCiAKIAorZGVmIHBhcnNlX2FyZ3MoYXJndjogbGlzdFtzdHJdKSAtPiBhcmdwYXJzZS5OYW1lc3BhY2U6CisgIGFyZ3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKworICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJ2V4dHJhX3RhcmdldHMnLCBuYXJncz0nKicsIGhlbHA9J0V4dHJhIHRlc3Qgc3VpdGVzIHRvIGJ1aWxkLicKKyAgKQorCisgIHJldHVybiBhcmdwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorCisKIGRlZiBjaGVja19yZXF1aXJlZF9lbnYoKToKICAgIiIiQ2hlY2sgZm9yIHJlcXVpcmVkIGVudiB2YXJzLgogCkBAIC03OSw0MyArMTU0LDQwIEBACiAgIHJhaXNlIEVycm9yKGYnTWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHt0fScpCiAKIAotZGVmIHBhcnNlX2FyZ3MoYXJndik6Ci0gIGFyZ3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKK2RlZiBsb2FkX2J1aWxkX2NvbnRleHQoKToKKyAgYnVpbGRfY29udGV4dF9wYXRoID0gcGF0aGxpYi5QYXRoKG9zLmVudmlyb24uZ2V0KCdCVUlMRF9DT05URVhUJywgJycpKQorICBpZiBidWlsZF9jb250ZXh0X3BhdGguaXNfZmlsZSgpOgorICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihidWlsZF9jb250ZXh0X3BhdGgsICdyJykgYXMgZjoKKyAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmKQorICAgIGV4Y2VwdCBqc29uLmRlY29kZXIuSlNPTkRlY29kZUVycm9yIGFzIGU6CisgICAgICByYWlzZSBFcnJvcihmJ0ZhaWxlZCB0byBsb2FkIEpTT04gZmlsZToge2J1aWxkX2NvbnRleHRfcGF0aH0nKQogCi0gIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAnZXh0cmFfdGFyZ2V0cycsIG5hcmdzPScqJywgaGVscD0nRXh0cmEgdGVzdCBzdWl0ZXMgdG8gYnVpbGQuJwotICApCi0KLSAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCisgIGxvZ2dpbmcuaW5mbygnTm8gQlVJTERfQ09OVEVYVCBmb3VuZCwgc2tpcHBpbmcgb3B0aW1pemF0aW9ucy4nKQorICByZXR1cm4gZW1wdHlfYnVpbGRfY29udGV4dCgpCiAKIAotZGVmIGJ1aWxkX2V2ZXJ5dGhpbmcoYXJnczogYXJncGFyc2UuTmFtZXNwYWNlKToKLSAgIiIiQnVpbGRzIGFsbCB0ZXN0cyAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIG5lZWRlZCkuCitkZWYgZW1wdHlfYnVpbGRfY29udGV4dCgpOgorICByZXR1cm4geydlbmFibGVkQnVpbGRGZWF0dXJlcyc6IFtdfQogCi0gIEFyZ3M6Ci0gICAgYXJnczogVGhlIHBhcnNlZCBhcmd1bWVudHMuCiAKLSAgUmFpc2VzOgotICAgIEJ1aWxkRmFpbHVyZTogSWYgdGhlIGJ1aWxkIGNvbW1hbmQgZmFpbHMuCi0gICIiIgotICBidWlsZF9jb21tYW5kID0gYmFzZV9idWlsZF9jb21tYW5kKGFyZ3MsIGFyZ3MuZXh0cmFfdGFyZ2V0cykKK2RlZiBleGVjdXRlX2J1aWxkX3BsYW4oYnVpbGRfcGxhbjogQnVpbGRQbGFuKToKKyAgYnVpbGRfY29tbWFuZCA9IFtdCisgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKGdldF90b3AoKS5qb2lucGF0aChTT09OR19VSV9FWEVfUkVMX1BBVEgpKQorICBidWlsZF9jb21tYW5kLmFwcGVuZCgnLS1tYWtlLW1vZGUnKQorICBidWlsZF9jb21tYW5kLmV4dGVuZChidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCiAKICAgdHJ5OgogICAgIHJ1bl9jb21tYW5kKGJ1aWxkX2NvbW1hbmQpCiAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgogICAgIHJhaXNlIEJ1aWxkRmFpbHVyZUVycm9yKGUucmV0dXJuY29kZSkgZnJvbSBlCiAKKyAgZm9yIHBhY2thZ2luZ19mdW5jdGlvbiBpbiBidWlsZF9wbGFuLnBhY2thZ2luZ19mdW5jdGlvbnM6CisgICAgcGFja2FnaW5nX2Z1bmN0aW9uKCkKIAotZGVmIGJhc2VfYnVpbGRfY29tbWFuZCgKLSAgICBhcmdzOiBhcmdwYXJzZS5OYW1lc3BhY2UsIGV4dHJhX3RhcmdldHM6IHNldFtzdHJdCi0pIC0+IGxpc3Rbc3RyXToKIAotICBidWlsZF9jb21tYW5kID0gW10KLSAgYnVpbGRfY29tbWFuZC5hcHBlbmQoZ2V0X3RvcCgpLmpvaW5wYXRoKFNPT05HX1VJX0VYRV9SRUxfUEFUSCkpCi0gIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKCctLW1ha2UtbW9kZScpCi0gIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKGV4dHJhX3RhcmdldHMpCi0KLSAgcmV0dXJuIGJ1aWxkX2NvbW1hbmQKK2RlZiBnZXRfdG9wKCkgLT4gcGF0aGxpYi5QYXRoOgorICByZXR1cm4gcGF0aGxpYi5QYXRoKG9zLmVudmlyb25bJ1RPUCddKQogCiAKIGRlZiBydW5fY29tbWFuZChhcmdzOiBsaXN0W3N0cl0sIHN0ZG91dD1Ob25lKToKQEAgLTEyMyw0ICsxOTUsMTIgQEAKIAogCiBkZWYgbWFpbihhcmd2KToKKyAgZGlzdF9kaXIgPSBvcy5lbnZpcm9uLmdldCgnRElTVF9ESVInKQorICBpZiBkaXN0X2RpcjoKKyAgICBsb2dfZmlsZSA9IHBhdGhsaWIuUGF0aChkaXN0X2RpcikgLyBMT0dfUEFUSAorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoCisgICAgICAgIGxldmVsPWxvZ2dpbmcuREVCVUcsCisgICAgICAgIGZvcm1hdD0nJShhc2N0aW1lKXMgJShsZXZlbG5hbWUpcyAlKG1lc3NhZ2UpcycsCisgICAgICAgIGZpbGVuYW1lPWxvZ19maWxlLAorICAgICkKICAgc3lzLmV4aXQoYnVpbGRfdGVzdF9zdWl0ZXMoYXJndikpCmRpZmYgLS1naXQgYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5IGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weQppbmRleCAwOGE3OWEzLi5mM2ZmNmY0IDEwMDY0NAotLS0gYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5CisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX3Rlc3QucHkKQEAgLTE0LDcgKzE0LDEwIEBACiAKICIiIlRlc3RzIGZvciBidWlsZF90ZXN0X3N1aXRlcy5weSIiIgogCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBmdW5jdG9vbHMKIGZyb20gaW1wb3J0bGliIGltcG9ydCByZXNvdXJjZXMKK2ltcG9ydCBqc29uCiBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBwYXRobGliCkBAIC0yNyw5ICszMCwxMiBAQAogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdGltZQogZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKK2Zyb20gYnVpbGRfY29udGV4dCBpbXBvcnQgQnVpbGRDb250ZXh0CiBpbXBvcnQgYnVpbGRfdGVzdF9zdWl0ZXMKIGltcG9ydCBjaV90ZXN0X2xpYgoraW1wb3J0IG9wdGltaXplZF90YXJnZXRzCiBmcm9tIHB5ZmFrZWZzIGltcG9ydCBmYWtlX2ZpbGVzeXN0ZW1fdW5pdHRlc3QKIAogCkBAIC04MCwxMiArODYsMjAgQEAKICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3lzdGVtRXhpdCwgJzQyJyk6CiAgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQogCisgIGRlZiB0ZXN0X2luY29ycmVjdGx5X2Zvcm1hdHRlZF9idWlsZF9jb250ZXh0X3JhaXNlcyhzZWxmKToKKyAgICBidWlsZF9jb250ZXh0ID0gc2VsZi5mYWtlX3RvcC5qb2lucGF0aCgnYnVpbGRfY29udGV4dCcpCisgICAgYnVpbGRfY29udGV4dC50b3VjaCgpCisgICAgb3MuZW52aXJvblsnQlVJTERfQ09OVEVYVCddID0gc3RyKGJ1aWxkX2NvbnRleHQpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnSlNPTicpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKwogICBkZWYgdGVzdF9idWlsZF9zdWNjZXNzX3JldHVybnMoc2VsZik6CiAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUV4aXQsICcwJyk6CiAgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQogCiAgIGRlZiBhc3NlcnRfcmFpc2VzX3dvcmQoc2VsZiwgY2xzLCB3b3JkKToKLSAgICByZXR1cm4gc2VsZi5hc3NlcnRSYWlzZXNSZWdleChidWlsZF90ZXN0X3N1aXRlcy5FcnJvciwgcmYnXGJ7d29yZH1cYicpCisgICAgcmV0dXJuIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoY2xzLCByZidcYnt3b3JkfVxiJykKIAogICBkZWYgX3NldHVwX3dvcmtpbmdfYnVpbGRfZW52KHNlbGYpOgogICAgIHNlbGYuZmFrZV90b3AgPSBwYXRobGliLlBhdGgoJy9mYWtlL3RvcCcpCkBAIC0yMjIsNiArMjM2LDI2MiBAQAogICAgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKIAogCitjbGFzcyBCdWlsZFBsYW5uZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBjbGFzcyBUZXN0T3B0aW1pemVkQnVpbGRUYXJnZXQob3B0aW1pemVkX3RhcmdldHMuT3B0aW1pemVkQnVpbGRUYXJnZXQpOgorCisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLCB0YXJnZXQsIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG91dHB1dF90YXJnZXRzLCBwYWNrYWdpbmdfb3V0cHV0cworICAgICk6CisgICAgICBzdXBlcigpLl9faW5pdF9fKHRhcmdldCwgYnVpbGRfY29udGV4dCwgYXJncykKKyAgICAgIHNlbGYub3V0cHV0X3RhcmdldHMgPSBvdXRwdXRfdGFyZ2V0cworICAgICAgc2VsZi5wYWNrYWdpbmdfb3V0cHV0cyA9IHBhY2thZ2luZ19vdXRwdXRzCisKKyAgICBkZWYgZ2V0X2J1aWxkX3RhcmdldHNfaW1wbChzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLm91dHB1dF90YXJnZXRzCisKKyAgICBkZWYgcGFja2FnZV9vdXRwdXRzX2ltcGwoc2VsZik6CisgICAgICBzZWxmLnBhY2thZ2luZ19vdXRwdXRzLmFkZChmJ3BhY2thZ2luZyB7IiAiLmpvaW4oc2VsZi5vdXRwdXRfdGFyZ2V0cyl9JykKKworICAgIGRlZiBnZXRfZW5hYmxlZF9mbGFnKHNlbGYpOgorICAgICAgcmV0dXJuIGYne3NlbGYudGFyZ2V0fV9lbmFibGVkJworCisgIGRlZiB0ZXN0X2J1aWxkX29wdGltaXphdGlvbl9vZmZfYnVpbGRzX2V2ZXJ5dGhpbmcoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQob3B0aW1pemVkX2J1aWxkX2VuYWJsZWQ9RmFsc2UpLAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCisKKyAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9kb2VzbnRfcGFja2FnZShzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dChvcHRpbWl6ZWRfYnVpbGRfZW5hYmxlZD1GYWxzZSksCisgICAgICAgIGJ1aWxkX3RhcmdldHM9YnVpbGRfdGFyZ2V0cywKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWlsZF9wbGFuLnBhY2thZ2luZ19mdW5jdGlvbnMpLCAwKQorCisgIGRlZiB0ZXN0X2J1aWxkX29wdGltaXphdGlvbl9vbl9vcHRpbWl6ZXNfdGFyZ2V0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiBzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX1dCisgICAgICAgICksCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgZXhwZWN0ZWRfdGFyZ2V0cyA9IHtzZWxmLmdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoJ3RhcmdldF8xJyksICd0YXJnZXRfMid9CisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChleHBlY3RlZF90YXJnZXRzLCBidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCisKKyAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29uX3BhY2thZ2VzX3RhcmdldChzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgcGFja2FnaW5nX291dHB1dHMgPSBzZXQoKQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6IHNlbGYuZ2V0X3RhcmdldF9mbGFnKCd0YXJnZXRfMScpfV0KKyAgICAgICAgKSwKKyAgICAgICAgcGFja2FnaW5nX291dHB1dHM9cGFja2FnaW5nX291dHB1dHMsCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorICAgIHNlbGYucnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoYnVpbGRfcGxhbikKKworICAgIG9wdGltaXplZF90YXJnZXRfbmFtZSA9IHNlbGYuZ2V0X29wdGltaXplZF90YXJnZXRfbmFtZSgndGFyZ2V0XzEnKQorICAgIHNlbGYuYXNzZXJ0SW4oZidwYWNrYWdpbmcge29wdGltaXplZF90YXJnZXRfbmFtZX0nLCBwYWNrYWdpbmdfb3V0cHV0cykKKworICBkZWYgdGVzdF9pbmRpdmlkdWFsX2J1aWxkX29wdGltaXphdGlvbl9vZmZfZG9lc250X29wdGltaXplKHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzKQorCisgIGRlZiB0ZXN0X2luZGl2aWR1YWxfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9kb2VzbnRfcGFja2FnZShzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgcGFja2FnaW5nX291dHB1dHMgPSBzZXQoKQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgICAgIHBhY2thZ2luZ19vdXRwdXRzPXBhY2thZ2luZ19vdXRwdXRzLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKyAgICBzZWxmLnJ1bl9wYWNrYWdpbmdfZnVuY3Rpb25zKGJ1aWxkX3BsYW4pCisKKyAgICBzZWxmLmFzc2VydEZhbHNlKHBhY2thZ2luZ19vdXRwdXRzKQorCisgIGRlZiB0ZXN0X3RhcmdldF9vdXRwdXRfdXNlZF90YXJnZXRfYnVpbHQoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0ID0gJ3Rlc3RfdGFyZ2V0JworICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPXtidWlsZF90YXJnZXR9LAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICAgICAgICB0ZXN0X2NvbnRleHQ9c2VsZi5nZXRfdGVzdF9jb250ZXh0KGJ1aWxkX3RhcmdldCksCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiAndGVzdF90YXJnZXRfdW51c2VkX2V4Y2x1c2lvbid9XSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cywge2J1aWxkX3RhcmdldH0pCisKKyAgZGVmIHRlc3RfdGFyZ2V0X3JlZ2V4X3VzZWRfdGFyZ2V0X2J1aWx0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldCA9ICd0ZXN0X3RhcmdldCcKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLmdldF90ZXN0X2NvbnRleHQoYnVpbGRfdGFyZ2V0KQorICAgIHRlc3RfY29udGV4dFsndGVzdEluZm9zJ11bMF1bJ2V4dHJhT3B0aW9ucyddID0gW3sKKyAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICd2YWx1ZXMnOiBbZicuKntidWlsZF90YXJnZXR9LipcLnppcCddLAorICAgIH1dCisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9e2J1aWxkX3RhcmdldH0sCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgICAgICAgIHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQsCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiAndGVzdF90YXJnZXRfdW51c2VkX2V4Y2x1c2lvbid9XSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cywge2J1aWxkX3RhcmdldH0pCisKKyAgZGVmIHRlc3RfdGFyZ2V0X291dHB1dF9ub3RfdXNlZF90YXJnZXRfbm90X2J1aWx0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldCA9ICd0ZXN0X3RhcmdldCcKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLmdldF90ZXN0X2NvbnRleHQoYnVpbGRfdGFyZ2V0KQorICAgIHRlc3RfY29udGV4dFsndGVzdEluZm9zJ11bMF1bJ2V4dHJhT3B0aW9ucyddID0gW10KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz17YnVpbGRfdGFyZ2V0fSwKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXRlc3RfY29udGV4dCwKKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6ICd0ZXN0X3RhcmdldF91bnVzZWRfZXhjbHVzaW9uJ31dLAorICAgICAgICApLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzLCBzZXQoKSkKKworICBkZWYgdGVzdF90YXJnZXRfcmVnZXhfbWF0Y2hpbmdfbm90X3Rvb19icm9hZChzZWxmKToKKyAgICBidWlsZF90YXJnZXQgPSAndGVzdF90YXJnZXQnCisgICAgdGVzdF9jb250ZXh0ID0gc2VsZi5nZXRfdGVzdF9jb250ZXh0KGJ1aWxkX3RhcmdldCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFt7CisgICAgICAgICdrZXknOiAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAndmFsdWVzJzogW2YnLiphe2J1aWxkX3RhcmdldH0uKlwuemlwJ10sCisgICAgfV0KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz17YnVpbGRfdGFyZ2V0fSwKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXRlc3RfY29udGV4dCwKKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6ICd0ZXN0X3RhcmdldF91bnVzZWRfZXhjbHVzaW9uJ31dLAorICAgICAgICApLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzLCBzZXQoKSkKKworICBkZWYgY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICBzZWxmLAorICAgICAgYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0sCisgICAgICBidWlsZF9jb250ZXh0OiBCdWlsZENvbnRleHQgPSBOb25lLAorICAgICAgYXJnczogYXJncGFyc2UuTmFtZXNwYWNlID0gTm9uZSwKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zOiBkaWN0WworICAgICAgICAgIHN0ciwgb3B0aW1pemVkX3RhcmdldHMuT3B0aW1pemVkQnVpbGRUYXJnZXQKKyAgICAgIF0gPSBOb25lLAorICAgICAgcGFja2FnaW5nX291dHB1dHM6IHNldFtzdHJdID0gc2V0KCksCisgICkgLT4gYnVpbGRfdGVzdF9zdWl0ZXMuQnVpbGRQbGFubmVyOgorICAgIGlmIG5vdCBidWlsZF9jb250ZXh0OgorICAgICAgYnVpbGRfY29udGV4dCA9IHNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoKQorICAgIGlmIG5vdCBhcmdzOgorICAgICAgYXJncyA9IHNlbGYuY3JlYXRlX2FyZ3MoZXh0cmFfYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzKQorICAgIGlmIG5vdCB0YXJnZXRfb3B0aW1pemF0aW9uczoKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zID0gc2VsZi5jcmVhdGVfdGFyZ2V0X29wdGltaXphdGlvbnMoCisgICAgICAgICAgYnVpbGRfY29udGV4dCwKKyAgICAgICAgICBidWlsZF90YXJnZXRzLAorICAgICAgICAgIHBhY2thZ2luZ19vdXRwdXRzLAorICAgICAgKQorICAgIHJldHVybiBidWlsZF90ZXN0X3N1aXRlcy5CdWlsZFBsYW5uZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIHRhcmdldF9vcHRpbWl6YXRpb25zCisgICAgKQorCisgIGRlZiBjcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgIHNlbGYsCisgICAgICBvcHRpbWl6ZWRfYnVpbGRfZW5hYmxlZDogYm9vbCA9IFRydWUsCisgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzOiBsaXN0W2RpY3Rbc3RyLCBzdHJdXSA9IFtdLAorICAgICAgdGVzdF9jb250ZXh0OiBkaWN0W3N0ciwgYW55XSA9IHt9LAorICApIC0+IEJ1aWxkQ29udGV4dDoKKyAgICBidWlsZF9jb250ZXh0X2RpY3QgPSB7fQorICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXSA9IGVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICBpZiBvcHRpbWl6ZWRfYnVpbGRfZW5hYmxlZDoKKyAgICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXS5hcHBlbmQoCisgICAgICAgICAgeyduYW1lJzogJ29wdGltaXplZF9idWlsZCd9CisgICAgICApCisgICAgYnVpbGRfY29udGV4dF9kaWN0Wyd0ZXN0Q29udGV4dCddID0gdGVzdF9jb250ZXh0CisgICAgcmV0dXJuIEJ1aWxkQ29udGV4dChidWlsZF9jb250ZXh0X2RpY3QpCisKKyAgZGVmIGNyZWF0ZV9hcmdzKAorICAgICAgc2VsZiwgZXh0cmFfYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0gPSBzZXQoKQorICApIC0+IGFyZ3BhcnNlLk5hbWVzcGFjZToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZXh0cmFfdGFyZ2V0cycsIG5hcmdzPScqJykKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoZXh0cmFfYnVpbGRfdGFyZ2V0cykKKworICBkZWYgY3JlYXRlX3RhcmdldF9vcHRpbWl6YXRpb25zKAorICAgICAgc2VsZiwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCwKKyAgICAgIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdLAorICAgICAgcGFja2FnaW5nX291dHB1dHM6IHNldFtzdHJdID0gc2V0KCksCisgICk6CisgICAgdGFyZ2V0X29wdGltaXphdGlvbnMgPSBkaWN0KCkKKyAgICBmb3IgdGFyZ2V0IGluIGJ1aWxkX3RhcmdldHM6CisgICAgICB0YXJnZXRfb3B0aW1pemF0aW9uc1t0YXJnZXRdID0gZnVuY3Rvb2xzLnBhcnRpYWwoCisgICAgICAgICAgc2VsZi5UZXN0T3B0aW1pemVkQnVpbGRUYXJnZXQsCisgICAgICAgICAgb3V0cHV0X3RhcmdldHM9e3NlbGYuZ2V0X29wdGltaXplZF90YXJnZXRfbmFtZSh0YXJnZXQpfSwKKyAgICAgICAgICBwYWNrYWdpbmdfb3V0cHV0cz1wYWNrYWdpbmdfb3V0cHV0cywKKyAgICAgICkKKworICAgIHJldHVybiB0YXJnZXRfb3B0aW1pemF0aW9ucworCisgIGRlZiBnZXRfdGFyZ2V0X2ZsYWcoc2VsZiwgdGFyZ2V0OiBzdHIpOgorICAgIHJldHVybiBmJ3t0YXJnZXR9X2VuYWJsZWQnCisKKyAgZGVmIGdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoc2VsZiwgdGFyZ2V0OiBzdHIpOgorICAgIHJldHVybiBmJ3t0YXJnZXR9X29wdGltaXplZCcKKworICBkZWYgcnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoc2VsZiwgYnVpbGRfcGxhbjogYnVpbGRfdGVzdF9zdWl0ZXMuQnVpbGRQbGFuKToKKyAgICBmb3IgcGFja2FnaW5nX2Z1bmN0aW9uIGluIGJ1aWxkX3BsYW4ucGFja2FnaW5nX2Z1bmN0aW9uczoKKyAgICAgIHBhY2thZ2luZ19mdW5jdGlvbigpCisKKyAgZGVmIGdldF90ZXN0X2NvbnRleHQoc2VsZiwgdGFyZ2V0OiBzdHIpOgorICAgIHJldHVybiB7CisgICAgICAgICd0ZXN0SW5mb3MnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAnYXRwX3Rlc3QnLAorICAgICAgICAgICAgICAgICd0YXJnZXQnOiAndGVzdF90YXJnZXQnLAorICAgICAgICAgICAgICAgICdicmFuY2gnOiAnYnJhbmNoJywKKyAgICAgICAgICAgICAgICAnZXh0cmFPcHRpb25zJzogW3sKKyAgICAgICAgICAgICAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICAgICAgICAgICAgICd2YWx1ZXMnOiBbZid7dGFyZ2V0fS56aXAnXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAnY29tbWFuZCc6ICcvdGYvY29tbWFuZCcsCisgICAgICAgICAgICAgICAgJ2V4dHJhQnVpbGRUYXJnZXRzJzogWworICAgICAgICAgICAgICAgICAgICAnZXh0cmFfYnVpbGRfdGFyZ2V0JywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXSwKKyAgICB9CisKKwogZGVmIHdhaXRfdW50aWwoCiAgICAgY29uZGl0aW9uX2Z1bmN0aW9uOiBDYWxsYWJsZVtbXSwgYm9vbF0sCiAgICAgdGltZW91dF9zZWNzOiBmbG9hdCA9IDMuMCwKZGlmZiAtLWdpdCBhL2NpL29wdGltaXplZF90YXJnZXRzLnB5IGIvY2kvb3B0aW1pemVkX3RhcmdldHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkZGUxNwotLS0gL2Rldi9udWxsCisrKyBiL2NpL29wdGltaXplZF90YXJnZXRzLnB5CkBAIC0wLDAgKzEsMTg1IEBACisjCisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gYWJjIGltcG9ydCBBQkMKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGZ1bmN0b29scworZnJvbSBidWlsZF9jb250ZXh0IGltcG9ydCBCdWlsZENvbnRleHQKK2ltcG9ydCBqc29uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitmcm9tIHR5cGluZyBpbXBvcnQgU2VsZgorCitpbXBvcnQgdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIKKworCitjbGFzcyBPcHRpbWl6ZWRCdWlsZFRhcmdldChBQkMpOgorICAiIiJBIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9wdGltaXplZCBidWlsZCB0YXJnZXQuCisKKyAgVGhpcyBjbGFzcyB3aWxsIGRldGVybWluZSB3aGF0IHRhcmdldHMgdG8gYnVpbGQgZ2l2ZW4gYSBnaXZlbiBidWlsZF9jb3RleHQgYW5kCisgIHdpbGwgaGF2ZSBhIHBhY2thZ2luZyBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbnkgbmVjZXNzYXJ5IG91dHB1dCB6aXBzIGZvciB0aGUKKyAgYnVpbGQuCisgICIiIgorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICB0YXJnZXQ6IHN0ciwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCwKKyAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSwKKyAgKToKKyAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorICAgIHNlbGYuYnVpbGRfY29udGV4dCA9IGJ1aWxkX2NvbnRleHQKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisKKyAgZGVmIGdldF9idWlsZF90YXJnZXRzKHNlbGYpIC0+IHNldFtzdHJdOgorICAgIGZlYXR1cmVzID0gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICBpZiBzZWxmLmdldF9lbmFibGVkX2ZsYWcoKSBpbiBmZWF0dXJlczoKKyAgICAgIHNlbGYubW9kdWxlc190b19idWlsZCA9IHNlbGYuZ2V0X2J1aWxkX3RhcmdldHNfaW1wbCgpCisgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzX3RvX2J1aWxkCisKKyAgICBzZWxmLm1vZHVsZXNfdG9fYnVpbGQgPSB7c2VsZi50YXJnZXR9CisgICAgcmV0dXJuIHtzZWxmLnRhcmdldH0KKworICBkZWYgcGFja2FnZV9vdXRwdXRzKHNlbGYpOgorICAgIGZlYXR1cmVzID0gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICBpZiBzZWxmLmdldF9lbmFibGVkX2ZsYWcoKSBpbiBmZWF0dXJlczoKKyAgICAgIHJldHVybiBzZWxmLnBhY2thZ2Vfb3V0cHV0c19pbXBsKCkKKworICBkZWYgcGFja2FnZV9vdXRwdXRzX2ltcGwoc2VsZik6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgZidwYWNrYWdlX291dHB1dHNfaW1wbCBub3QgaW1wbGVtZW50ZWQgaW4ge3R5cGUoc2VsZikuX19uYW1lX199JworICAgICkKKworICBkZWYgZ2V0X2VuYWJsZWRfZmxhZyhzZWxmKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICBmJ2dldF9lbmFibGVkX2ZsYWcgbm90IGltcGxlbWVudGVkIGluIHt0eXBlKHNlbGYpLl9fbmFtZV9ffScKKyAgICApCisKKyAgZGVmIGdldF9idWlsZF90YXJnZXRzX2ltcGwoc2VsZikgLT4gc2V0W3N0cl06CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgZidnZXRfYnVpbGRfdGFyZ2V0c19pbXBsIG5vdCBpbXBsZW1lbnRlZCBpbiB7dHlwZShzZWxmKS5fX25hbWVfX30nCisgICAgKQorCisKK2NsYXNzIE51bGxPcHRpbWl6ZXIoT3B0aW1pemVkQnVpbGRUYXJnZXQpOgorICAiIiJOby1vcCB0YXJnZXQgb3B0aW1pemVyLgorCisgIFRoaXMgd2lsbCBzaW1wbHkgYnVpbGQgdGhlIHNhbWUgdGFyZ2V0IGl0IHdhcyBnaXZlbiBhbmQgZG8gbm90aGluZyBmb3IgdGhlCisgIHBhY2thZ2luZyBzdGVwLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0KToKKyAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorCisgIGRlZiBnZXRfYnVpbGRfdGFyZ2V0cyhzZWxmKToKKyAgICByZXR1cm4ge3NlbGYudGFyZ2V0fQorCisgIGRlZiBwYWNrYWdlX291dHB1dHMoc2VsZik6CisgICAgcGFzcworCisKK2NsYXNzIENoYW5nZUluZm86CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNoYW5nZV9pbmZvX2ZpbGVfcGF0aCk6CisgICAgdHJ5OgorICAgICAgd2l0aCBvcGVuKGNoYW5nZV9pbmZvX2ZpbGVfcGF0aCkgYXMgY2hhbmdlX2luZm9fZmlsZToKKyAgICAgICAgY2hhbmdlX2luZm9fY29udGVudHMgPSBqc29uLmxvYWQoY2hhbmdlX2luZm9fZmlsZSkKKyAgICBleGNlcHQganNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvcjoKKyAgICAgIGxvZ2dpbmcuZXJyb3IoZidGYWlsZWQgdG8gbG9hZCBDSEFOR0VfSU5GTzoge2NoYW5nZV9pbmZvX2ZpbGVfcGF0aH0nKQorICAgICAgcmFpc2UKKworICAgIHNlbGYuX2NoYW5nZV9pbmZvX2NvbnRlbnRzID0gY2hhbmdlX2luZm9fY29udGVudHMKKworICBkZWYgZmluZF9jaGFuZ2VkX2ZpbGVzKHNlbGYpIC0+IHNldFtzdHJdOgorICAgIGNoYW5nZWRfZmlsZXMgPSBzZXQoKQorCisgICAgZm9yIGNoYW5nZSBpbiBzZWxmLl9jaGFuZ2VfaW5mb19jb250ZW50c1snY2hhbmdlcyddOgorICAgICAgcHJvamVjdF9wYXRoID0gY2hhbmdlLmdldCgncHJvamVjdFBhdGgnKSArICcvJworCisgICAgICBmb3IgcmV2aXNpb24gaW4gY2hhbmdlLmdldCgncmV2aXNpb25zJyk6CisgICAgICAgIGZvciBmaWxlX2luZm8gaW4gcmV2aXNpb24uZ2V0KCdmaWxlSW5mb3MnKToKKyAgICAgICAgICBjaGFuZ2VkX2ZpbGVzLmFkZChwcm9qZWN0X3BhdGggKyBmaWxlX2luZm8uZ2V0KCdwYXRoJykpCisKKyAgICByZXR1cm4gY2hhbmdlZF9maWxlcworCitjbGFzcyBHZW5lcmFsVGVzdHNPcHRpbWl6ZXIoT3B0aW1pemVkQnVpbGRUYXJnZXQpOgorICAiIiJnZW5lcmFsLXRlc3RzIG9wdGltaXplcgorCisgIFRPRE8oYi8zNTgyMTUyMzUpOiBJbXBsZW1lbnQKKworICBUaGlzIG9wdGltaXplciByZWFkcyBpbiB0aGUgbGlzdCBvZiBjaGFuZ2VkIGZpbGVzIGZyb20gdGhlIGZpbGUgbG9jYXRlZCBpbgorICBlbnZbQ0hBTkdFX0lORk9dIGFuZCB1c2VzIHRoaXMgbGlzdCBhbG9uZ3NpZGUgdGhlIG5vcm1hbCBURVNUIE1BUFBJTkcgbG9naWMgdG8KKyAgZGV0ZXJtaW5lIHdoYXQgdGVzdCBtYXBwaW5nIG1vZHVsZXMgd2lsbCBydW4gZm9yIHRoZSBnaXZlbiBjaGFuZ2VzLiBJdCB0aGVuCisgIGJ1aWxkcyB0aG9zZSBtb2R1bGVzIGFuZCBwYWNrYWdlcyB0aGVtIGluIHRoZSBzYW1lIHdheSBnZW5lcmFsLXRlc3RzLnppcCBpcworICBub3JtYWxseSBidWlsdC4KKyAgIiIiCisKKyAgIyBMaXN0IG9mIG1vZHVsZXMgdGhhdCBhcmUgYWx3YXlzIHJlcXVpcmVkIHRvIGJlIGluIGdlbmVyYWwtdGVzdHMuemlwLgorICBfUkVRVUlSRURfTU9EVUxFUyA9IGZyb3plbnNldCgKKyAgICAgIFsnY3RzLXRyYWRlZmVkJywgJ3Z0cy10cmFkZWZlZCcsICdjb21wYXRpYmlsaXR5LWhvc3QtdXRpbCddCisgICkKKworICBkZWYgZ2V0X2J1aWxkX3RhcmdldHNfaW1wbChzZWxmKSAtPiBzZXRbc3RyXToKKyAgICBjaGFuZ2VfaW5mb19maWxlX3BhdGggPSBvcy5lbnZpcm9uLmdldCgnQ0hBTkdFX0lORk8nKQorICAgIGlmIG5vdCBjaGFuZ2VfaW5mb19maWxlX3BhdGg6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgJ05vIENIQU5HRV9JTkZPIGVudiB2YXIgZm91bmQsIGdlbmVyYWwtdGVzdHMgb3B0aW1pemF0aW9uIGRpc2FibGVkLicKKyAgICAgICkKKyAgICAgIHJldHVybiB7J2dlbmVyYWwtdGVzdHMnfQorCisgICAgdGVzdF9pbmZvcyA9IHNlbGYuYnVpbGRfY29udGV4dC50ZXN0X2luZm9zCisgICAgdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzID0gc2V0KCkKKyAgICBmb3IgdGVzdF9pbmZvIGluIHRlc3RfaW5mb3M6CisgICAgICBpc190ZXN0X21hcHBpbmcgPSB0ZXN0X2luZm8uaXNfdGVzdF9tYXBwaW5nCisgICAgICBjdXJyZW50X3Rlc3RfbWFwcGluZ190ZXN0X2dyb3VwcyA9IHRlc3RfaW5mby50ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMKKyAgICAgIHVzZXNfZ2VuZXJhbF90ZXN0cyA9IHRlc3RfaW5mby5idWlsZF90YXJnZXRfdXNlZCgnZ2VuZXJhbC10ZXN0cycpCisKKyAgICAgIGlmIHVzZXNfZ2VuZXJhbF90ZXN0cyBhbmQgbm90IGlzX3Rlc3RfbWFwcGluZzoKKyAgICAgICAgbG9nZ2luZy5pbmZvKAorICAgICAgICAgICAgJ1Rlc3QgdXNlcyBnZW5lcmFsLXRlc3RzLnppcCBidXQgaXMgbm90IHRlc3QtbWFwcGluZywgZ2VuZXJhbC10ZXN0cycKKyAgICAgICAgICAgICcgb3B0aW1pemF0aW9uIGRpc2FibGVkLicKKyAgICAgICAgKQorICAgICAgICByZXR1cm4geydnZW5lcmFsLXRlc3RzJ30KKworICAgICAgaWYgaXNfdGVzdF9tYXBwaW5nOgorICAgICAgICB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMudXBkYXRlKGN1cnJlbnRfdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzKQorCisgICAgY2hhbmdlX2luZm8gPSBDaGFuZ2VJbmZvKGNoYW5nZV9pbmZvX2ZpbGVfcGF0aCkKKyAgICBjaGFuZ2VkX2ZpbGVzID0gY2hhbmdlX2luZm8uZmluZF9jaGFuZ2VkX2ZpbGVzKCkKKworICAgIHRlc3RfbWFwcGluZ3MgPSB0ZXN0X21hcHBpbmdfbW9kdWxlX3JldHJpZXZlci5HZXRUZXN0TWFwcGluZ3MoCisgICAgICAgIGNoYW5nZWRfZmlsZXMsIHNldCgpCisgICAgKQorCisgICAgbW9kdWxlc190b19idWlsZCA9IHNldChzZWxmLl9SRVFVSVJFRF9NT0RVTEVTKQorCisgICAgbW9kdWxlc190b19idWlsZC51cGRhdGUoCisgICAgICAgIHRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLkZpbmRBZmZlY3RlZE1vZHVsZXMoCisgICAgICAgICAgICB0ZXN0X21hcHBpbmdzLCBjaGFuZ2VkX2ZpbGVzLCB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMKKyAgICAgICAgKQorICAgICkKKworICAgIHJldHVybiBtb2R1bGVzX3RvX2J1aWxkCisKKyAgZGVmIGdldF9lbmFibGVkX2ZsYWcoc2VsZik6CisgICAgcmV0dXJuICdnZW5lcmFsX3Rlc3RzX29wdGltaXplZCcKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIGdldF9vcHRpbWl6ZWRfdGFyZ2V0cyhjbHMpIC0+IGRpY3Rbc3RyLCBPcHRpbWl6ZWRCdWlsZFRhcmdldF06CisgICAgcmV0dXJuIHsnZ2VuZXJhbC10ZXN0cyc6IGZ1bmN0b29scy5wYXJ0aWFsKGNscyl9CisKKworT1BUSU1JWkVEX0JVSUxEX1RBUkdFVFMgPSB7fQorT1BUSU1JWkVEX0JVSUxEX1RBUkdFVFMudXBkYXRlKEdlbmVyYWxUZXN0c09wdGltaXplci5nZXRfb3B0aW1pemVkX3RhcmdldHMoKSkKZGlmZiAtLWdpdCBhL2NpL29wdGltaXplZF90YXJnZXRzX3Rlc3QucHkgYi9jaS9vcHRpbWl6ZWRfdGFyZ2V0c190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOWMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9vcHRpbWl6ZWRfdGFyZ2V0c190ZXN0LnB5CkBAIC0wLDAgKzEsMjA2IEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlRlc3RzIGZvciBvcHRpbWl6ZWRfdGFyZ2V0cy5weSIiIgorCitpbXBvcnQganNvbgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCByZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitpbXBvcnQgb3B0aW1pemVkX3RhcmdldHMKK2Zyb20gYnVpbGRfY29udGV4dCBpbXBvcnQgQnVpbGRDb250ZXh0Citmcm9tIHB5ZmFrZWZzIGltcG9ydCBmYWtlX2ZpbGVzeXN0ZW1fdW5pdHRlc3QKKworCitjbGFzcyBHZW5lcmFsVGVzdHNPcHRpbWl6ZXJUZXN0KGZha2VfZmlsZXN5c3RlbV91bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYuc2V0VXBQeWZha2VmcygpCisKKyAgICBvc19lbnZpcm9uX3BhdGNoZXIgPSBtb2NrLnBhdGNoLmRpY3QoJ29zLmVudmlyb24nLCB7fSkKKyAgICBzZWxmLmFkZENsZWFudXAob3NfZW52aXJvbl9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX29zX2Vudmlyb24gPSBvc19lbnZpcm9uX3BhdGNoZXIuc3RhcnQoKQorCisgICAgc2VsZi5fc2V0dXBfd29ya2luZ19idWlsZF9lbnYoKQorICAgIHNlbGYuX3dyaXRlX2NoYW5nZV9pbmZvX2ZpbGUoKQorICAgIHRlc3RfbWFwcGluZ19kaXIgPSBwYXRobGliLlBhdGgoJy9wcm9qZWN0L3BhdGgvZmlsZS9wYXRoJykKKyAgICB0ZXN0X21hcHBpbmdfZGlyLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl93cml0ZV90ZXN0X21hcHBpbmdfZmlsZSgpCisKKyAgZGVmIF9zZXR1cF93b3JraW5nX2J1aWxkX2VudihzZWxmKToKKyAgICBzZWxmLmNoYW5nZV9pbmZvX2ZpbGUgPSBwYXRobGliLlBhdGgoJy90bXAvY2hhbmdlX2luZm8nKQorCisgICAgc2VsZi5tb2NrX29zX2Vudmlyb24udXBkYXRlKHsKKyAgICAgICAgJ0NIQU5HRV9JTkZPJzogc3RyKHNlbGYuY2hhbmdlX2luZm9fZmlsZSksCisgICAgfSkKKworICBkZWYgdGVzdF9nZW5lcmFsX3Rlc3RzX29wdGltaXplZChzZWxmKToKKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoKQorCisgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBleHBlY3RlZF9idWlsZF90YXJnZXRzID0gc2V0KAorICAgICAgICBvcHRpbWl6ZWRfdGFyZ2V0cy5HZW5lcmFsVGVzdHNPcHRpbWl6ZXIuX1JFUVVJUkVEX01PRFVMRVMKKyAgICApCisgICAgZXhwZWN0ZWRfYnVpbGRfdGFyZ2V0cy5hZGQoJ3Rlc3RfbWFwcGluZ19tb2R1bGUnKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBleHBlY3RlZF9idWlsZF90YXJnZXRzKQorCisgIGRlZiB0ZXN0X25vX2NoYW5nZV9pbmZvX25vX29wdGltaXphdGlvbihzZWxmKToKKyAgICBkZWwgb3MuZW52aXJvblsnQ0hBTkdFX0lORk8nXQorCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIGJ1aWxkX3RhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCB7J2dlbmVyYWwtdGVzdHMnfSkKKworICBkZWYgdGVzdF9tYXBwaW5nX2dyb3Vwc191bnVzZWRfbW9kdWxlX25vdF9idWlsdChzZWxmKToKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLl9jcmVhdGVfdGVzdF9jb250ZXh0KCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFsKKyAgICAgICAgeworICAgICAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICAgICAndmFsdWVzJzogWydnZW5lcmFsLXRlc3RzLnppcCddLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAna2V5JzogJ3Rlc3QtbWFwcGluZy10ZXN0LWdyb3VwJywKKyAgICAgICAgICAgICd2YWx1ZXMnOiBbJ3VudXNlZC10ZXN0LW1hcHBpbmctZ3JvdXAnXSwKKyAgICAgICAgfSwKKyAgICBdCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuX2NyZWF0ZV9idWlsZF9jb250ZXh0KHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQpCisgICAgKQorCisgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBleHBlY3RlZF9idWlsZF90YXJnZXRzID0gc2V0KAorICAgICAgICBvcHRpbWl6ZWRfdGFyZ2V0cy5HZW5lcmFsVGVzdHNPcHRpbWl6ZXIuX1JFUVVJUkVEX01PRFVMRVMKKyAgICApCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBleHBlY3RlZF9idWlsZF90YXJnZXRzKQorCisgIGRlZiB0ZXN0X2dlbmVyYWxfdGVzdHNfdXNlZF9ieV9ub25fdGVzdF9tYXBwaW5nX3Rlc3Rfbm9fb3B0aW1pemF0aW9uKHNlbGYpOgorICAgIHRlc3RfY29udGV4dCA9IHNlbGYuX2NyZWF0ZV90ZXN0X2NvbnRleHQoKQorICAgIHRlc3RfY29udGV4dFsndGVzdEluZm9zJ11bMF1bJ2V4dHJhT3B0aW9ucyddID0gW3sKKyAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICd2YWx1ZXMnOiBbJ2dlbmVyYWwtdGVzdHMuemlwJ10sCisgICAgfV0KKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5fY3JlYXRlX2J1aWxkX2NvbnRleHQodGVzdF9jb250ZXh0PXRlc3RfY29udGV4dCkKKyAgICApCisKKyAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgeydnZW5lcmFsLXRlc3RzJ30pCisKKyAgZGVmIHRlc3RfbWFsZm9ybWVkX2NoYW5nZV9pbmZvX3JhaXNlcyhzZWxmKToKKyAgICB3aXRoIG9wZW4oc2VsZi5jaGFuZ2VfaW5mb19maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCdub3QgY2hhbmdlIGluZm8nKQorCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoanNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvcik6CisgICAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICBkZWYgdGVzdF9tYWxmb3JtZWRfdGVzdF9tYXBwaW5nX3JhaXNlcyhzZWxmKToKKyAgICB3aXRoIG9wZW4oJy9wcm9qZWN0L3BhdGgvZmlsZS9wYXRoL1RFU1RfTUFQUElORycsICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoJ25vdCB0ZXN0IG1hcHBpbmcnKQorCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoanNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvcik6CisgICAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICBkZWYgX3dyaXRlX2NoYW5nZV9pbmZvX2ZpbGUoc2VsZik6CisgICAgY2hhbmdlX2luZm9fY29udGVudHMgPSB7CisgICAgICAgICdjaGFuZ2VzJzogW3sKKyAgICAgICAgICAgICdwcm9qZWN0UGF0aCc6ICcvcHJvamVjdC9wYXRoJywKKyAgICAgICAgICAgICdyZXZpc2lvbnMnOiBbeworICAgICAgICAgICAgICAgICdmaWxlSW5mb3MnOiBbeworICAgICAgICAgICAgICAgICAgICAncGF0aCc6ICdmaWxlL3BhdGgvZmlsZV9uYW1lJywKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICB9XQorICAgIH0KKworICAgIHdpdGggb3BlbihzZWxmLmNoYW5nZV9pbmZvX2ZpbGUsICd3JykgYXMgZjoKKyAgICAgIGpzb24uZHVtcChjaGFuZ2VfaW5mb19jb250ZW50cywgZikKKworICBkZWYgX3dyaXRlX3Rlc3RfbWFwcGluZ19maWxlKHNlbGYpOgorICAgIHRlc3RfbWFwcGluZ19jb250ZW50cyA9IHsKKyAgICAgICAgJ3Rlc3QtbWFwcGluZy1ncm91cCc6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6ICd0ZXN0X21hcHBpbmdfbW9kdWxlJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIF0sCisgICAgfQorCisgICAgd2l0aCBvcGVuKCcvcHJvamVjdC9wYXRoL2ZpbGUvcGF0aC9URVNUX01BUFBJTkcnLCAndycpIGFzIGY6CisgICAgICBqc29uLmR1bXAodGVzdF9tYXBwaW5nX2NvbnRlbnRzLCBmKQorCisgIGRlZiBfY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKAorICAgICAgc2VsZiwgYnVpbGRfY29udGV4dDogQnVpbGRDb250ZXh0ID0gTm9uZQorICApOgorICAgIGlmIG5vdCBidWlsZF9jb250ZXh0OgorICAgICAgYnVpbGRfY29udGV4dCA9IHNlbGYuX2NyZWF0ZV9idWlsZF9jb250ZXh0KCkKKyAgICByZXR1cm4gb3B0aW1pemVkX3RhcmdldHMuR2VuZXJhbFRlc3RzT3B0aW1pemVyKAorICAgICAgICAnZ2VuZXJhbC10ZXN0cycsIGJ1aWxkX2NvbnRleHQsIE5vbmUKKyAgICApCisKKyAgZGVmIF9jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgIHNlbGYsCisgICAgICBnZW5lcmFsX3Rlc3RzX29wdGltaXplZDogYm9vbCA9IFRydWUsCisgICAgICB0ZXN0X2NvbnRleHQ6IGRpY3Rbc3RyLCBhbnldID0gTm9uZSwKKyAgKSAtPiBCdWlsZENvbnRleHQ6CisgICAgaWYgbm90IHRlc3RfY29udGV4dDoKKyAgICAgIHRlc3RfY29udGV4dCA9IHNlbGYuX2NyZWF0ZV90ZXN0X2NvbnRleHQoKQorICAgIGJ1aWxkX2NvbnRleHRfZGljdCA9IHt9CisgICAgYnVpbGRfY29udGV4dF9kaWN0WydlbmFibGVkQnVpbGRGZWF0dXJlcyddID0gW3snbmFtZSc6ICdvcHRpbWl6ZWRfYnVpbGQnfV0KKyAgICBpZiBnZW5lcmFsX3Rlc3RzX29wdGltaXplZDoKKyAgICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXS5hcHBlbmQoeyduYW1lJzogJ2dlbmVyYWxfdGVzdHNfb3B0aW1pemVkJ30pCisgICAgYnVpbGRfY29udGV4dF9kaWN0Wyd0ZXN0Q29udGV4dCddID0gdGVzdF9jb250ZXh0CisgICAgcmV0dXJuIEJ1aWxkQ29udGV4dChidWlsZF9jb250ZXh0X2RpY3QpCisKKyAgZGVmIF9jcmVhdGVfdGVzdF9jb250ZXh0KHNlbGYpOgorICAgIHJldHVybiB7CisgICAgICAgICd0ZXN0SW5mb3MnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAnYXRwX3Rlc3QnLAorICAgICAgICAgICAgICAgICd0YXJnZXQnOiAndGVzdF90YXJnZXQnLAorICAgICAgICAgICAgICAgICdicmFuY2gnOiAnYnJhbmNoJywKKyAgICAgICAgICAgICAgICAnZXh0cmFPcHRpb25zJzogWworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAna2V5JzogJ2FkZGl0aW9uYWwtZmlsZXMtZmlsdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZXMnOiBbJ2dlbmVyYWwtdGVzdHMuemlwJ10sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdrZXknOiAndGVzdC1tYXBwaW5nLXRlc3QtZ3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyc6IFsndGVzdC1tYXBwaW5nLWdyb3VwJ10sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAnY29tbWFuZCc6ICcvdGYvY29tbWFuZCcsCisgICAgICAgICAgICAgICAgJ2V4dHJhQnVpbGRUYXJnZXRzJzogWworICAgICAgICAgICAgICAgICAgICAnZXh0cmFfYnVpbGRfdGFyZ2V0JywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXSwKKyAgICB9CisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgIyBTZXR1cCBsb2dnaW5nIHRvIGJlIHNpbGVudCBzbyB1bml0IHRlc3RzIGNhbiBwYXNzIHRocm91Z2ggVEYuCisgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLkVSUk9SKQorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2NpL3Rlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5IGIvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkKaW5kZXggZDJjMTNjMC4uYzkzY2RkNSAxMDA2NDQKLS0tIGEvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkKKysrIGIvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkKQEAgLTE3LDExICsxNywxMyBAQAogbW9kdWxlcyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBjaGFuZ2VkIGZpbGVzLgogVE9ETyhsdWNhZmFyc2kpOiBEZWR1cGxpY2F0ZSBmcm9tIGFydGlmYWN0X2hlbHBlci5weQogIiIiCisjIFRPRE8obHVjYWZhcnNpKTogU2hhcmUgdGhpcyBsb2dpYyB3aXRoIHRoZSBvcmlnaW5hbCBsb2dpYyBpbgorIyB0ZXN0X21hcHBpbmdfdGVzdF9yZXRyaWV2ZXIucHkKIAotZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRGljdCwgU2V0LCBUZXh0CiBpbXBvcnQganNvbgogaW1wb3J0IG9zCiBpbXBvcnQgcmUKK2Zyb20gdHlwaW5nIGltcG9ydCBBbnkKIAogIyBSZWdleCB0byBleHRyYSB0ZXN0IG5hbWUgZnJvbSB0aGUgcGF0aCBvZiB0ZXN0IGNvbmZpZyBmaWxlLgogVEVTVF9OQU1FX1JFR0VYID0gcicoPzpefC4qLykoW14vXSspXC5jb25maWcnCkBAIC0zOSw3ICs0MSw3IEBACiBfQ09NTUVOVFNfUkUgPSByZS5jb21waWxlKHInKFwiKD86W15cIlxcXXxcXC4pKlwifCg/PS8vKSkoPzovLy4qKT8nKQogCiAKLWRlZiBGaWx0ZXJDb21tZW50cyh0ZXN0X21hcHBpbmdfZmlsZTogVGV4dCkgLT4gVGV4dDoKK2RlZiBGaWx0ZXJDb21tZW50cyh0ZXN0X21hcHBpbmdfZmlsZTogc3RyKSAtPiBzdHI6CiAgICIiIlJlbW92ZSBjb21tZW50cyBpbiBURVNUX01BUFBJTkcgZmlsZSB0byB2YWxpZCBmb3JtYXQuCiAKICAgT25seSAnLy8nIGlzIHJlZ2FyZGVkIGFzIGNvbW1lbnRzLgpAQCAtNTIsOCArNTQsOCBAQAogICAiIiIKICAgcmV0dXJuIHJlLnN1YihfQ09NTUVOVFNfUkUsIHInXDEnLCB0ZXN0X21hcHBpbmdfZmlsZSkKIAotZGVmIEdldFRlc3RNYXBwaW5ncyhwYXRoczogU2V0W1RleHRdLAotICAgICAgICAgICAgICAgICAgICBjaGVja2VkX3BhdGhzOiBTZXRbVGV4dF0pIC0+IERpY3RbVGV4dCwgRGljdFtUZXh0LCBBbnldXToKK2RlZiBHZXRUZXN0TWFwcGluZ3MocGF0aHM6IHNldFtzdHJdLAorICAgICAgICAgICAgICAgICAgICBjaGVja2VkX3BhdGhzOiBzZXRbc3RyXSkgLT4gZGljdFtzdHIsIGRpY3Rbc3RyLCBBbnldXToKICAgIiIiR2V0IHRoZSBhZmZlY3RlZCBURVNUX01BUFBJTkcgZmlsZXMuCiAKICAgVEVTVF9NQVBQSU5HIGZpbGVzIGluIHNvdXJjZSBjb2RlIGFyZSBwYWNrYWdlZCBpbnRvIGEgYnVpbGQgYXJ0aWZhY3QKQEAgLTEyMywzICsxMjUsNjggQEAKICAgICAgIHBhc3MKIAogICByZXR1cm4gdGVzdF9tYXBwaW5ncworCisKK2RlZiBGaW5kQWZmZWN0ZWRNb2R1bGVzKAorICAgIHRlc3RfbWFwcGluZ3M6IGRpY3Rbc3RyLCBBbnldLAorICAgIGNoYW5nZWRfZmlsZXM6IHNldFtzdHJdLAorICAgIHRlc3RfbWFwcGluZ190ZXN0X2dyb3Vwczogc2V0W3N0cl0sCispIC0+IHNldFtzdHJdOgorICAiIiJGaW5kIGFmZmVjdGVkIHRlc3QgbW9kdWxlcy4KKworICBGaW5kIHRoZSBhZmZlY3RlZCBzZXQgb2YgdGVzdCBtb2R1bGVzIHRoYXQgd291bGQgcnVuIGluIGEgdGVzdCBtYXBwaW5nIHJ1biBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVzdCBtYXBwaW5ncywgY2hhbmdlZCBmaWxlcywgYW5kIHRlc3QgbWFwcGluZyB0ZXN0IGdyb3VwLgorCisgIEFyZ3M6CisgICAgdGVzdF9tYXBwaW5nczogQSBzZXQgb2YgdGVzdCBtYXBwaW5ncyByZXR1cm5lZCBieSBHZXRUZXN0TWFwcGluZ3MgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgICB7CisgICAgICAgICd0ZXN0X21hcHBpbmdfZmlsZV9wYXRoJzogeworICAgICAgICAgICdncm91cF9uYW1lJyA6IFsKKyAgICAgICAgICAgICduYW1lJzogJ21vZHVsZV9uYW1lJywKKyAgICAgICAgICBdLAorICAgICAgICB9CisgICAgICB9CisgICAgY2hhbmdlZF9maWxlczogQSBzZXQgb2YgZmlsZXMgY2hhbmdlZCBmb3IgdGhlIGdpdmVuIHJ1bi4KKyAgICB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHM6IEEgc2V0IG9mIHRlc3QgbWFwcGluZyB0ZXN0IGdyb3VwcyB0aGF0IGFyZSBiZWluZyBjb25zaWRlcmVkIGZvciB0aGUgZ2l2ZW4gcnVuLgorCisgIFJldHVybnM6CisgICAgQSBzZXQgb2YgdGVzdCBtb2R1bGUgbmFtZXMgd2hpY2ggd291bGQgcnVuIGZvciBhIHRlc3QgbWFwcGluZyB0ZXN0IHJ1biB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAiIiIKKworICBtb2R1bGVzID0gc2V0KCkKKworICBmb3IgdGVzdF9tYXBwaW5nIGluIHRlc3RfbWFwcGluZ3MudmFsdWVzKCk6CisgICAgZm9yIGdyb3VwX25hbWUsIGdyb3VwIGluIHRlc3RfbWFwcGluZy5pdGVtcygpOgorICAgICAgIyBJZiBhIG1vZHVsZSBpcyBub3QgaW4gYW55IG9mIHRoZSB0ZXN0IG1hcHBpbmcgZ3JvdXBzIGJlaW5nIHRlc3RlZCBza2lwCisgICAgICAjIGl0LgorICAgICAgaWYgZ3JvdXBfbmFtZSBub3QgaW4gdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzOgorICAgICAgICBjb250aW51ZQorCisgICAgICBmb3IgZW50cnkgaW4gZ3JvdXA6CisgICAgICAgIG1vZHVsZV9uYW1lID0gZW50cnkuZ2V0KCduYW1lJykKKworICAgICAgICBpZiBub3QgbW9kdWxlX25hbWU6CisgICAgICAgICAgY29udGludWUKKworICAgICAgICBmaWxlX3BhdHRlcm5zID0gZW50cnkuZ2V0KCdmaWxlX3BhdHRlcm5zJykKKyAgICAgICAgaWYgbm90IGZpbGVfcGF0dGVybnM6CisgICAgICAgICAgbW9kdWxlcy5hZGQobW9kdWxlX25hbWUpCisgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBtYXRjaGVzX2ZpbGVfcGF0dGVybnMoZmlsZV9wYXR0ZXJucywgY2hhbmdlZF9maWxlcyk6CisgICAgICAgICAgbW9kdWxlcy5hZGQobW9kdWxlX25hbWUpCisKKyAgcmV0dXJuIG1vZHVsZXMKKworZGVmIE1hdGNoZXNGaWxlUGF0dGVybnMoCisgICAgZmlsZV9wYXR0ZXJuczogbGlzdFtzZXRdLCBjaGFuZ2VkX2ZpbGVzOiBzZXRbc3RyXQorKSAtPiBib29sOgorICAiIiJDaGVja3MgaWYgYW55IG9mIHRoZSBjaGFuZ2VkIGZpbGVzIG1hdGNoIGFueSBvZiB0aGUgZmlsZSBwYXR0ZXJucy4KKworICBBcmdzOgorICAgIGZpbGVfcGF0dGVybnM6IEEgbGlzdCBvZiBmaWxlIHBhdHRlcm5zIHRvIG1hdGNoIGFnYWluc3QuCisgICAgY2hhbmdlZF9maWxlczogQSBzZXQgb2YgZmlsZXMgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZmlsZSBwYXR0ZXJucy4KKworICBSZXR1cm5zOgorICAgIFRydWUgaWYgYW55IG9mIHRoZSBjaGFuZ2VkIGZpbGVzIG1hdGNoIGFueSBvZiB0aGUgZmlsZSBwYXR0ZXJucy4KKyAgIiIiCisgIHJldHVybiBhbnkocmUuc2VhcmNoKHBhdHRlcm4sICJ8Ii5qb2luKGNoYW5nZWRfZmlsZXMpKSBmb3IgcGF0dGVybiBpbiBmaWxlX3BhdHRlcm5zKQpkaWZmIC0tZ2l0IGEvY29nc2V0dXAuc2ggYi9jb2dzZXR1cC5zaAppbmRleCBlZjE0ODVkLi41YzY0YTA2IDEwMDY0NAotLS0gYS9jb2dzZXR1cC5zaAorKysgYi9jb2dzZXR1cC5zaApAQCAtNTcsNyArNTcsNyBAQAogICBmaQogICBmdW5jdGlvbiByZXBvIHsKICAgICBpZiBbWyAiJHtQV0R9IiA9PSAvZ29vZ2xlL2NvZy8qIF1dOyB0aGVuCi0gICAgICBlY2hvICJcZVswMTszMW1FUlJPUjpcZVswbXJlcG8gY29tbWFuZCBpcyBkaXNhbGxvd2VkIHdpdGhpbiBDb2cgd29ya3NwYWNlcy4iCisgICAgICBlY2hvIC1lICJcZVswMTszMW1FUlJPUjpcZVswbXJlcG8gY29tbWFuZCBpcyBkaXNhbGxvd2VkIHdpdGhpbiBDb2cgd29ya3NwYWNlcy4iCiAgICAgICByZXR1cm4gMQogICAgIGZpCiAgICAgJHtPUklHX1JFUE9fUEFUSH0gIiRAIgpkaWZmIC0tZ2l0IGEvY29tbW9uL21hdGgubWsgYi9jb21tb24vbWF0aC5tawppbmRleCBlY2VlNDc0Li44MjljZWI1IDEwMDY0NAotLS0gYS9jb21tb24vbWF0aC5taworKysgYi9jb21tb24vbWF0aC5tawpAQCAtMzE1LDggKzMxNSw5IEBACiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbnVtYmVyc19ncmVhdGVyX29yX2VxdWFsX3RvLDAsMCAyIDEgMyksMCAyIDEgMykKICQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBudW1iZXJzX2dyZWF0ZXJfb3JfZXF1YWxfdG8sMSwwIDIgMSAzIDIpLDIgMSAzIDIpCiAKLV9JTlRfTElNSVRfV09SRFMgOj0gJChmb3JlYWNoIGEseCB4LCQoZm9yZWFjaCBiLHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHgsXAotICAkKGZvcmVhY2ggYyx4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4LHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHgpKSkKKyMgMTAsMDAxID0gMTAgKiogNCArIDEsIGNvbnRhaW5zIDEwLDAwMSB4J3MsIHNvIDEgbW9yZSB0aGFuIDEwLDAwMCAoZnV0dXJlKSBBUEkgbGV2ZWwKK19JTlRfTElNSVRfV09SRFMgOj0geCAkKGZvcmVhY2ggYSwwIDEgMiAzIDQgNSA2IDcgOCA5LCQoZm9yZWFjaCBiLDAgMSAyIDMgNCA1IDYgNyA4IDksXAorICAkKGZvcmVhY2ggYywwIDEgMiAzIDQgNSA2IDcgOCA5LHggeCB4IHggeCB4IHggeCB4IHgpKSkKIAogZGVmaW5lIF9pbnRfZW5jb2RlCiAkKGlmICQoZmlsdGVyICQod29yZHMgeCAkKF9JTlRfTElNSVRfV09SRFMpKSwkKHdvcmRzICQod29yZGxpc3QgMSwkKDEpLHggJChfSU5UX0xJTUlUX1dPUkRTKSkpKSxcCmRpZmYgLS1naXQgYS9jb3JlL01ha2VmaWxlIGIvY29yZS9NYWtlZmlsZQppbmRleCBhMjE1ZDMxLi5iZjJkNDhhIDEwMDY0NAotLS0gYS9jb3JlL01ha2VmaWxlCisrKyBiL2NvcmUvTWFrZWZpbGUKQEAgLTcxNyw3ICs3MTcsNyBAQAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXZlbmRvci1yYW1kaXNrLWNoYXJnZXItbG9hZCwkKGttZCkpKSBcCiAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtdmVuZG9yLWtlcm5lbC1yYW1kaXNrLWNoYXJnZXItbG9hZCwkKGttZCkpKSBcCiAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLE9ETSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX09ETV9ETEtNSU1BR0UpKSwkKFRBUkdFVF9PVVRfT0RNX0RMS00pLCQoVEFSR0VUX09VVF9PRE0pKSxvZG0sbW9kdWxlcy5sb2FkLCwkKGttZCkpKSBcCi0gICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLFNZU1RFTSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1NZU1RFTV9ETEtNSU1BR0UpKSwkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pLCQoVEFSR0VUX09VVF9TWVNURU0pKSxzeXN0ZW0sbW9kdWxlcy5sb2FkLCwkKGttZCkpKSBcCisgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLFNZU1RFTSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1NZU1RFTV9ETEtNSU1BR0UpKSwkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pLCQoVEFSR0VUX09VVCkpLHN5c3RlbSxtb2R1bGVzLmxvYWQsLCQoa21kKSkpIFwKICAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSksXAogICAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtcmVjb3ZlcnktYXMtYm9vdC1sb2FkLCQoa21kKSkpLFwKICAgICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixHRU5FUklDX1JBTURJU0ssJChUQVJHRVRfUkFNRElTS19PVVQpLCxtb2R1bGVzLmxvYWQsJChHRU5FUklDX1JBTURJU0tfU1RSSVBQRURfTU9EVUxFX1NUQUdJTkdfRElSKSwkKGttZCkpKSkpCkBAIC0xMDUyLDYgKzEwNTIsMzUgQEAKIGVuZGlmCiBlbmRpZgogCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZHRibyBpbWFnZQoraWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCitJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZworCitpZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCiskKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKKwljaG1vZCArdyAkQAorCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKKwkgICAgLS1pbWFnZSAkQCBcCisJICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9EVEJPSU1HX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgICAtLXBhcnRpdGlvbl9uYW1lIGR0Ym8gJChJTlRFUk5BTF9BVkJfRFRCT19TSUdOSU5HX0FSR1MpIFwKKwkgICAgJChCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUykKKworJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpLCQoUFJPRFVDVF9PVVQpLzovKQorCitVTk1PVU5URURfTk9USUNFX1ZFTkRPUl9ERVBTKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKK2Vsc2UKKyQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKK2VuZGlmCisKK2VuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0aGUgcmFtZGlzawogSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTIDo9ICQoZmlsdGVyLW91dCAkKFRBUkdFVF9SQU1ESVNLX09VVCkvJSwgJChJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMpKQpAQCAtMTA3NSw2ICsxMTA0LDE2IEBACiAKIEJVSUxUX1JBTURJU0tfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3JhbWRpc2suaW1nCiAKK2lmZXEgKCQoQk9BUkRfUkFNRElTS19VU0VfTFo0KSx0cnVlKQorIyAtbCBlbmFibGVzIHRoZSBsZWdhY3kgZm9ybWF0IHVzZWQgYnkgdGhlIExpbnV4IGtlcm5lbAorQ09NUFJFU1NJT05fQ09NTUFORF9ERVBTIDo9ICQoTFo0KQorQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKExaNCkgLWwgLTEyIC0tZmF2b3ItZGVjU3BlZWQKK1JBTURJU0tfRVhUIDo9IC5sejQKK2Vsc2UKK0NPTVBSRVNTSU9OX0NPTU1BTkRfREVQUyA6PSAkKEdaSVApCitDT01QUkVTU0lPTl9DT01NQU5EIDo9ICQoR1pJUCkKK1JBTURJU0tfRVhUIDo9IC5negorZW5kaWYKIAogaWZuZXEgKCQoQk9BUkRfS0VSTkVMX01PRFVMRVNfMTZLKSwpCiAKQEAgLTExNTMsNiArMTE5MiwzMyBAQAogCiBlbmRpZgogCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIDE2S0IgZHRibyBpbWFnZQoraWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFXzE2S0IKK0lOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvZHRib18xNmsuaW1nCisKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKKyQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCk6ICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFXzE2S0IpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCKSAkQAorCWNobW9kICt3ICRACisJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAorCSAgICAtLWltYWdlICRAIFwKKwkgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX0RUQk9JTUdfUEFSVElUSU9OX1NJWkUpKSBcCisJICAgIC0tcGFydGl0aW9uX25hbWUgZHRibyAkKElOVEVSTkFMX0FWQl9EVEJPX1NJR05JTkdfQVJHUykgXAorCSAgICAkKEJPQVJEX0FWQl9EVEJPX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQorCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQiksJChQUk9EVUNUX09VVCkvOi8pCisKK1VOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMgKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKQorZWxzZQorJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQikKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCKSAkQAorZW5kaWYKKworZW5kaWYgIyBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQgorCisKIGlmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQogQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkva2VybmVsXzE2awogCkBAIC0xMTc1LDM2ICsxMjQxLDM0IEBACiAuUEhPTlk6IGJvb3RpbWFnZV8xNmsKIAogQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNksgOj0gJChQUk9EVUNUX09VVCkvYm9vdF9vdGFfMTZrLnppcAotJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2Syk6ICQoT1RBX0ZST01fUkFXX0lNRykgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOAorJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2Syk6ICAkKE9UQV9GUk9NX1JBV19JTUcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS5wazggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKIAkkKE9UQV9GUk9NX1JBV19JTUcpIC0tcGFja2FnZV9rZXkgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpIFwKICAgICAgICAgICAgICAgICAgICAgICAtLW1heF90aW1lc3RhbXAgYGNhdCAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpYCBcCiAgICAgICAgICAgICAgICAgICAgICAgLS1wYXRoICQoSE9TVF9PVVQpIFwKLSAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRpdGlvbl9uYW1lIGJvb3QgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QkKGNvbW1hKWR0Ym8sXAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCkgXAogICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICRAIFwKICAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfMTZLX09UQV9VU0VfSU5DUkVNRU5UQUwpLFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpLFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpXAotICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApXAorICAgICAgICAgICAgICAgICAgICAgICQoaWYgJChhbmQgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSkKIAogYm9vdG90YXBhY2thZ2VfMTZrOiAkKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLKQogLlBIT05ZOiBib290b3RhcGFja2FnZV8xNmsKIAogZW5kaWYKIAotCi1pZmVxICgkKEJPQVJEX1JBTURJU0tfVVNFX0xaNCksdHJ1ZSkKLSMgLWwgZW5hYmxlcyB0aGUgbGVnYWN5IGZvcm1hdCB1c2VkIGJ5IHRoZSBMaW51eCBrZXJuZWwKLUNPTVBSRVNTSU9OX0NPTU1BTkRfREVQUyA6PSAkKExaNCkKLUNPTVBSRVNTSU9OX0NPTU1BTkQgOj0gJChMWjQpIC1sIC0xMiAtLWZhdm9yLWRlY1NwZWVkCi1SQU1ESVNLX0VYVCA6PSAubHo0Ci1lbHNlCi1DT01QUkVTU0lPTl9DT01NQU5EX0RFUFMgOj0gJChHWklQKQotQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKEdaSVApCi1SQU1ESVNLX0VYVCA6PSAuZ3oKLWVuZGlmCi0KKyMgVGhlIHZhbHVlIG9mIFJBTURJU0tfTk9ERV9MSVNUIGlzIGRlZmluZWQgaW4gc3lzdGVtL2NvcmUvcm9vdGRpci9BbmRyb2lkLmJwLgogIyBUaGlzIGZpbGUgY29udGFpbnMgL2RldiBub2RlcyBkZXNjcmlwdGlvbiBhZGRlZCB0byB0aGUgZ2VuZXJpYyByYW1kaXNrCi1SQU1ESVNLX05PREVfTElTVCA6PSAkKFBST0RVQ1RfT1VUKS9yYW1kaXNrX25vZGVfbGlzdAogCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9SQU1ESVNLX1RBUkdFVCA6PSAkKEJVSUxUX1JBTURJU0tfVEFSR0VUKQpAQCAtMTM3NSwzMCArMTQzOSw3IEBACiAJQGVjaG8gIm1ha2UgJEA6IGlnbm9yaW5nIGRlcGVuZGVuY2llcyIKIAkkKGZvcmVhY2ggYiwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKGNhbGwgYnVpbGRfYm9vdF9ib2FyZF9hdmJfZW5hYmxlZCwkKGIpKSkKIAotZWxzZSBpZmVxICh0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpICMgQk9BUkRfQVZCX0VOQUJMRSAhPSB0cnVlCi0KLSMgJDE6IGJvb3QgaW1hZ2UgdGFyZ2V0Ci1kZWZpbmUgYnVpbGRfYm9vdF9zdXBwb3J0c192Ym9vdAotICAkKE1LQk9PVElNRykgLS1rZXJuZWwgJChjYWxsIGJvb3RpbWFnZS10by1rZXJuZWwsJCgxKSkgJChJTlRFUk5BTF9CT09USU1BR0VfQVJHUykgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSAkKEJPQVJEX01LQk9PVElNR19BUkdTKSAtLW91dHB1dCAkKDEpLnVuc2lnbmVkCi0gICQoVkJPT1RfU0lHTkVSKSAkKEZVVElMSVRZKSAkKDEpLnVuc2lnbmVkICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwdWJrICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwcml2ayAkKFBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkpLnZicHJpdmsgJCgxKS5rZXlibG9jayAkKDEpCi0gICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWJvb3RpbWFnZS1wYXJ0aXRpb24tc2l6ZSwkKDEpLGJvb3QpKQotZW5kZWYKLQotJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6ICQoTUtCT09USU1HKSAkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUykgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpCi0JJChjYWxsIHByZXR0eSwiVGFyZ2V0IGJvb3QgaW1hZ2U6ICRAIikKLQkkKGNhbGwgYnVpbGRfYm9vdF9zdXBwb3J0c192Ym9vdCwkQCkKLQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtbWV0YWRhdGEsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMC1vbmx5IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAscmVzdHJpY3RlZCBub3RpY2UsJChCVUlMRF9TWVNURU0pL0xJTlVYX0tFUk5FTF9DT1BZSU5HIGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsIkJvb3QgSW1hZ2UiLGJvb3QpCi0kKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfQk9PVElNQUdFX0ZJTEVTKSwkKFBST0RVQ1RfT1VUKS86LykKLQotVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUyArPSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQotCi0uUEhPTlk6IGJvb3RpbWFnZS1ub2RlcHMKLWJvb3RpbWFnZS1ub2RlcHM6ICQoTUtCT09USU1HKSAkKFZCT09UX1NJR05FUikgJChGVVRJTElUWSkKLQlAZWNobyAibWFrZSAkQDogaWdub3JpbmcgZGVwZW5kZW5jaWVzIgotCSQoZm9yZWFjaCBiLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoY2FsbCBidWlsZF9ib290X3N1cHBvcnRzX3Zib290LCQoYikpKQotCi1lbHNlICMgUFJPRFVDVF9TVVBQT1JUU19WQk9PVCAhPSB0cnVlCitlbHNlICMgQk9BUkRfQVZCX0VOQUJMRSAhPSB0cnVlCiAKICMgJDE6IGJvb3QgaW1hZ2UgdGFyZ2V0CiBkZWZpbmUgYnVpbGRfYm9vdF9ub3Zib290CkBAIC0xNDYwLDE2ICsxNTAxLDI2IEBACiAKIGlmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQogQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SyA6PSAkKFBST0RVQ1RfT1VUKS9ib290X290YV80ay56aXAKLSQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80Syk6ICQoT1RBX0ZST01fUkFXX0lNRykgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOAorJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzRLKTogJChPVEFfRlJPTV9SQVdfSU1HKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkucGs4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkKIAkkKE9UQV9GUk9NX1JBV19JTUcpIC0tcGFja2FnZV9rZXkgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpIFwKICAgICAgICAgICAgICAgICAgICAgICAtLW1heF90aW1lc3RhbXAgYGNhdCAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpYCBcCiAgICAgICAgICAgICAgICAgICAgICAgLS1wYXRoICQoSE9TVF9PVVQpIFwKLSAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRpdGlvbl9uYW1lIGJvb3QgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QkKGNvbW1hKWR0Ym8sXAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCkgXAogICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICRAIFwKICAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfMTZLX09UQV9VU0VfSU5DUkVNRU5UQUwpLFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpOiQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpXAotICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApXAorICAgICAgICAgICAgICAgICAgICAgICQoaWYgJChhbmQgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkpCiAKIGJvb3RvdGFwYWNrYWdlXzRrOiAkKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfNEspCiAuUEhPTlk6IGJvb3RvdGFwYWNrYWdlXzRrCkBAIC0xNjk3LDYgKzE3NDgsMzAgQEAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCksKQogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19UQVJHRVQpICQoSU5TVEFMTEVEX0RUQl9JTUFHRV9UQVJHRVQpICQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfRlJBR01FTlRfVEFSR0VUUykgJChJTlRFUk5BTF9WRU5ET1JfQk9PVENPTkRJR19UQVJHRVQpLCQoUFJPRFVDVF9PVVQpLzovKQogVkVORE9SX05PVElDRV9ERVBTICs9ICQoSU5TVEFMTEVEX1ZFTkRPUl9CT09USU1BR0VfVEFSR0VUKQorCitlbHNlICMgQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0Ugbm90IGRlZmluZWQsIHVzZSBwcmVidWlsdCBpbWFnZQorCitpZmRlZiBCT0FSRF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFCitJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFIDo9ICQoQk9BUkRfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSkKK0lOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS92ZW5kb3JfYm9vdC5pbWcKKworaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfVkVORE9SX0JPT1RfS0VZX1BBVEgpCisJY3AgJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKSAkQAorCWNobW9kICt3ICRACisJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAorCSAgICAtLWltYWdlICRAIFwKKwkgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX1ZFTkRPUl9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSBcCisJICAgIC0tcGFydGl0aW9uX25hbWUgdmVuZG9yX2Jvb3QgJChJTlRFUk5BTF9BVkJfVkVORE9SX0JPT1RfU0lHTklOR19BUkdTKSBcCisJICAgICQoQk9BUkRfQVZCX1ZFTkRPUl9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQorZWxzZQorJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UpCisJY3AgJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKSAkQAorCitlbmRpZiAjIEJPQVJEX0FWQl9FTkFCTEUKKyQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCksKQorJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKSwkKFBST0RVQ1RfT1VUKS86LykKK2VuZGlmICMgQk9BUkRfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRQogZW5kaWYgIyBCVUlMRElOR19WRU5ET1JfQk9PVF9JTUFHRQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMjMzLDExICsyMzA4LDYgQEAKICQoaWYgJChQUk9EVUNUX1ZFTkRPUl9ETEtNX1ZFUklUWV9QQVJUSVRJT04pLCQoaGlkZSkgZWNobyAidmVuZG9yX2Rsa21fdmVyaXR5X2Jsb2NrX2RldmljZT0kKFBST0RVQ1RfVkVORE9SX0RMS01fVkVSSVRZX1BBUlRJVElPTikiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVF9PRE1fRExLTV9WRVJJVFlfUEFSVElUSU9OKSwkKGhpZGUpIGVjaG8gIm9kbV9kbGttX3Zlcml0eV9ibG9ja19kZXZpY2U9JChQUk9EVUNUX09ETV9ETEtNX1ZFUklUWV9QQVJUSVRJT04pIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RfU1lTVEVNX0RMS01fVkVSSVRZX1BBUlRJVElPTiksJChoaWRlKSBlY2hvICJzeXN0ZW1fZGxrbV92ZXJpdHlfYmxvY2tfZGV2aWNlPSQoUFJPRFVDVF9TWVNURU1fRExLTV9WRVJJVFlfUEFSVElUSU9OKSIgPj4gJCgxKSkKLSQoaWYgJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSwkKGhpZGUpIGVjaG8gInZib290PSQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkiID4+ICQoMSkpCi0kKGlmICQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJ2Ym9vdF9rZXk9JChQUk9EVUNUX1ZCT09UX1NJR05JTkdfS0VZKSIgPj4gJCgxKSkKLSQoaWYgJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSwkKGhpZGUpIGVjaG8gInZib290X3N1YmtleT0kKFBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkpIiA+PiAkKDEpKQotJChpZiAkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAiZnV0aWxpdHk9JChub3RkaXIgJChGVVRJTElUWSkpIiA+PiAkKDEpKQotJChpZiAkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAidmJvb3Rfc2lnbmVyX2NtZD0kKFZCT09UX1NJR05FUikiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksIFwKICAgJChoaWRlKSBlY2hvICJhdmJfYXZidG9vbD0kKG5vdGRpciAkKEFWQlRPT0wpKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAkKGlmICQoZmlsdGVyICQoMiksc3lzdGVtKSwgXApAQCAtMjc0NywxNSArMjgxNyw5IEBACiAjICQoMSk6IG91dHB1dCBmaWxlCiAjICQoMik6IG9wdGlvbmFsIGtlcm5lbCBmaWxlCiBkZWZpbmUgYnVpbGQtcmVjb3ZlcnlpbWFnZS10YXJnZXQKLSAgJChpZiAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpLCBcCi0gICAgJChNS0JPT1RJTUcpICQoaWYgJChzdHJpcCAkKDIpKSwtLWtlcm5lbCAkKHN0cmlwICQoMikpKSAkKElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfQVJHUykgXAotICAgICAgICAgICAgICAgICAkKElOVEVSTkFMX01LQk9PVElNR19WRVJTSU9OX0FSR1MpICQoQk9BUkRfUkVDT1ZFUllfTUtCT09USU1HX0FSR1MpIFwKLSAgICAgICAgICAgICAgICAgLS1vdXRwdXQgJCgxKS51bnNpZ25lZCwgXAotICAgICQoTUtCT09USU1HKSAkKGlmICQoc3RyaXAgJCgyKSksLS1rZXJuZWwgJChzdHJpcCAkKDIpKSkgJChJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0FSR1MpIFwKLSAgICAgICAgICAgICAgICAgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSBcCi0gICAgICAgICAgICAgICAgICQoQk9BUkRfUkVDT1ZFUllfTUtCT09USU1HX0FSR1MpIC0tb3V0cHV0ICQoMSkpCi0gICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKSwgXAotICAgICQoVkJPT1RfU0lHTkVSKSAkKEZVVElMSVRZKSAkKDEpLnVuc2lnbmVkICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwdWJrICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwcml2ayAkKFBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkpLnZicHJpdmsgJCgxKS5rZXlibG9jayAkKDEpKQorICAkKE1LQk9PVElNRykgJChpZiAkKHN0cmlwICQoMikpLC0ta2VybmVsICQoc3RyaXAgJCgyKSkpICQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9BUkdTKSBcCisgICAgICAgICAgICAgICAkKElOVEVSTkFMX01LQk9PVElNR19WRVJTSU9OX0FSR1MpIFwKKyAgICAgICAgICAgICAgICQoQk9BUkRfUkVDT1ZFUllfTUtCT09USU1HX0FSR1MpIC0tb3V0cHV0ICQoMSkKICAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSksIFwKICAgICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1oYXNoLWltYWdlLW1heC1zaXplLCQoY2FsbCBnZXQtYm9vdGltYWdlLXBhcnRpdGlvbi1zaXplLCQoMSksYm9vdCkpKSwgXAogICAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChCT0FSRF9SRUNPVkVSWUlNQUdFX1BBUlRJVElPTl9TSVpFKSkpKQpAQCAtMjc2Niw5ICsyODMwLDYgQEAKIGVuZGVmCiAKIHJlY292ZXJ5aW1hZ2UtZGVwcyA6PSAkKE1LQk9PVElNRykgJChyZWNvdmVyeV9yYW1kaXNrKSAkKHJlY292ZXJ5X2tlcm5lbCkKLWlmZXEgKHRydWUsJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSkKLSAgcmVjb3ZlcnlpbWFnZS1kZXBzICs9ICQoVkJPT1RfU0lHTkVSKQotZW5kaWYKIGlmZXEgKHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkKICAgcmVjb3ZlcnlpbWFnZS1kZXBzICs9ICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfQk9PVF9LRVlfUEFUSCkKIGVuZGlmCkBAIC0zMzU1LDggKzM0MTYsMTAgQEAKICMgc3lzdGVtIGltYWdlCiAKIElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfT1VUKS8lLCAkKElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUykpCitpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKIElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTIDo9ICQoc29ydCAkKGZpbHRlciAkKFRBUkdFVF9PVVQpLyUsIFwKICAgICAkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKSkpCitlbmRpZgogCiAjIENyZWF0ZSBzeW1saW5rIC9zeXN0ZW0vdmVuZG9yIHRvIC92ZW5kb3IgaWYgbmVjZXNzYXJ5LgogaWZkZWYgQk9BUkRfVVNFU19WRU5ET1JJTUFHRQpAQCAtMzQ5NSw2ICszNTU4LDI0IEBACiBlbmRlZgogCiAkKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVCksJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpKSkKKworaWZuZXEgKCQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksKQorZmlsZV9saXN0X2RpZmYgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZmlsZV9saXN0X2RpZmYkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCitzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCA6PSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfZGlmZi50aW1lc3RhbXAKKworJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCk6IFwKKwkgICAgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0IFwKKwkgICAgJChBTExfTU9EVUxFUy4kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLkZJTEVTWVNURU1fRklMRUxJU1QpIFwKKwkgICAgJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QuSU5TVEFMTEVEKSBcCisJICAgICQoZmlsZV9saXN0X2RpZmYpCisJJChmaWxlX2xpc3RfZGlmZikgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0IFwKKwkgICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSBcCisJICAkKEFMTF9NT0RVTEVTLnN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdC5JTlNUQUxMRUQpICQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkKKwl0b3VjaCAkQAorCiskKEJVSUxUX1NZU1RFTUlNQUdFKTogJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCkKK2VuZGlmCisKICMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAogJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUKS8lLCQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSkKIAl0b3VjaCAkQApAQCAtMzUwMiw4ICszNTgzLDE5IEBACiBpZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCiAkKEJVSUxUX1NZU1RFTUlNQUdFKTogJChCT0FSRF9BVkJfU1lTVEVNX0tFWV9QQVRIKQogZW5kaWYKKworaWZlcSAoJChVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLHRydWUpCitpZmVxICgkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLCkKKyQoZXJyb3IgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBtdXN0IGJlIHNldCBpZiBVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgaXMgdHJ1ZSkKK2VuZGlmCitzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQywkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpKS8kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpCiskKEJVSUxUX1NZU1RFTUlNQUdFKTogJChJTlNUQUxMRURfRklMRVNfRklMRSkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0ICQoc29vbmdfZGVmaW5lZF9zeXN0ZW1faW1hZ2UpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsICQoc29vbmdfZGVmaW5lZF9zeXN0ZW1faW1hZ2UpLCAkKEJVSUxUX1NZU1RFTUlNQUdFKSkpCitzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSA6PQorZWxzZQogJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGNhbGwgYnVpbGQtc3lzdGVtaW1hZ2UtdGFyZ2V0LCRAKQorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoQlVJTFRfU1lTVEVNSU1BR0UpLHN5c3RlbS9leHRyYXMpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoQlVJTFRfU1lTVEVNSU1BR0UpLCQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSwkKFBST0RVQ1RfT1VUKS86LykKQEAgLTM1ODQsMTAgKzM2NzYsMTAgQEAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgZGF0YSBwYXJ0aXRpb24gaW1hZ2UKIElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfT1VUX0RBVEEpLyUsICQoSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTKSkKK2lmZGVmIEJVSUxESU5HX1VTRVJEQVRBX0lNQUdFCiBJTlRFUk5BTF9VU0VSREFUQUlNQUdFX0ZJTEVTIDo9IFwKICAgICAkKGZpbHRlciAkKFRBUkdFVF9PVVRfREFUQSkvJSwkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKSkKIAotaWZkZWYgQlVJTERJTkdfVVNFUkRBVEFfSU1BR0UKIHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcyA6PSBcCiAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdXNlcmRhdGEpCiBCVUlMVF9VU0VSREFUQUlNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS91c2VyZGF0YS5pbWcKQEAgLTQzMzIsMzMgKzQ0MjQsNiBAQAogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQk9BUkRfUFJFQlVJTFRfU1lTVEVNX0RMS01JTUFHRSksJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpKSkKIGVuZGlmCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgZHRibyBpbWFnZQotaWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCi1JTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZwotCi1pZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCi0kKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKLQljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKLQljaG1vZCArdyAkQAotCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKLQkgICAgLS1pbWFnZSAkQCBcCi0JICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9EVEJPSU1HX1BBUlRJVElPTl9TSVpFKSkgXAotCSAgICAtLXBhcnRpdGlvbl9uYW1lIGR0Ym8gJChJTlRFUk5BTF9BVkJfRFRCT19TSUdOSU5HX0FSR1MpIFwKLQkgICAgJChCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUykKLQotJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCkKLSQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpLCQoUFJPRFVDVF9PVVQpLzovKQotCi1VTk1PVU5URURfTk9USUNFX1ZFTkRPUl9ERVBTKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKLWVsc2UKLSQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkKLQljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKLWVuZGlmCi0KLWVuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgUHJvdGVjdGVkIFZNIGZpcm13YXJlIGltYWdlCiBpZmVxICgkKEJPQVJEX1VTRVNfUFZNRldJTUFHRSksdHJ1ZSkKIApAQCAtNTA3Miw2ICs1MTM3LDcgQEAKICAgJChUQVJHRVRfT1VUKS9hcGV4LyUgXAogICAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvYXBleC8lIFwKICAgJChUQVJHRVRfT1VUX1ZFTkRPUikvYXBleC8lIFwKKyAgJChUQVJHRVRfT1VUX09ETSkvYXBleC8lIFwKICAgJChUQVJHRVRfT1VUX1BST0RVQ1QpL2FwZXgvJSBcCiAKIGFwZXhfZmlsZXMgOj0gJChzb3J0ICQoZmlsdGVyICQoYXBleF9kaXJzKSwgJChJTlRFUk5BTF9BTExJTUFHRVNfRklMRVMpKSkKQEAgLTUxMjQsNiArNTE5MCw3IEBACiAgICQoVEFSR0VUX09VVF9QUk9EVUNUKS9hcGV4LyUgXAogICAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvYXBleC8lIFwKICAgJChUQVJHRVRfT1VUX1ZFTkRPUikvYXBleC8lIFwKKyAgJChUQVJHRVRfT1VUX09ETSkvYXBleC8lIFwKIAogYXBleF9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJChhcGV4X2RpcnMpLCAkKElOVEVSTkFMX0FMTElNQUdFU19GSUxFUykpKQogCkBAIC01MTQyLDYgKzUyMDksNyBAQAogCSAgIC0tc3lzdGVtX2V4dF9wYXRoICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSBcCiAJICAgLS1wcm9kdWN0X3BhdGggJChUQVJHRVRfT1VUX1BST0RVQ1QpIFwKIAkgICAtLXZlbmRvcl9wYXRoICQoVEFSR0VUX09VVF9WRU5ET1IpIFwKKwkgICAtLW9kbV9wYXRoICQoVEFSR0VUX09VVF9PRE0pIFwKIAkgICAtLWFwZXhfcGF0aCAkKEFQRVhfT1VUKQogCiBhcGV4X2ZpbGVzIDo9CkBAIC01NjUxLDEyICs1NzE5LDYgQEAKICAgcmVzaXplMmZzIFwKICAgc29vbmdfemlwIFwKIAotaWZlcSAodHJ1ZSwkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKQotSU5URVJOQUxfT1RBVE9PTFNfTU9EVUxFUyArPSBcCi0gIGZ1dGlsaXR5LWhvc3QgXAotICB2Ym9vdF9zaWduZXIKLWVuZGlmCi0KIElOVEVSTkFMX09UQVRPT0xTX0ZJTEVTIDo9IFwKICAgJChmaWx0ZXIgJChIT1NUX09VVCkvJSwkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKElOVEVSTkFMX09UQVRPT0xTX01PRFVMRVMpKSkKIApAQCAtNTY5MiwxMCArNTc1NCw2IEBACiAgICQoc29ydCAkKHNoZWxsIGZpbmQgZXh0ZXJuYWwvYXZiL3Rlc3QvZGF0YSAtdHlwZSBmIC1uYW1lICJ0ZXN0a2V5XyoucGVtIiAtbyBcCiAgICAgICAtbmFtZSAiYXR4X21ldGFkYXRhLmJpbiIpKQogZW5kaWYKLWlmZXEgKHRydWUsJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSkKLUlOVEVSTkFMX09UQVRPT0xTX1BBQ0tBR0VfRklMRVMgKz0gXAotICAkKHNvcnQgJChzaGVsbCBmaW5kIGV4dGVybmFsL3Zib290X3JlZmVyZW5jZS90ZXN0cy9kZXZrZXlzIC10eXBlIGYpKQotZW5kaWYKIAogSU5URVJOQUxfT1RBVE9PTFNfUkVMRUFTRVRPT0xTIDo9IFwKICAgJChzaGVsbCBmaW5kIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzIC1uYW1lICIqLnB5YyIgLXBydW5lIC1vIFwKQEAgLTYxMzIsMTIgKzYxOTAsNiBAQAogICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoVEFSR0VUX09VVF9PRU0pLyQoT1NSRUxFQVNFRF9ESVJFQ1RPUlkpL3Byb2R1Y3RfdmVyc2lvbgogICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoVEFSR0VUX09VVF9FVEMpLyQoT1NSRUxFQVNFRF9ESVJFQ1RPUlkpL3N5c3RlbV92ZXJzaW9uCiAgIGVuZGlmCi0KLSAgIyBOb3QgY2hlY2tpbmcgaW4gYm9hcmRfY29uZmlnLm1rLCBzaW5jZSBBQl9PVEFfUEFSVElUSU9OUyBtYXkgYmUgdXBkYXRlZCBpbiBBbmRyb2lkLm1rIChlLmcuIHRvCi0gICMgYWRkaXRpb25hbGx5IGluY2x1ZGUgcmFkaW8gb3IgYm9vdGxvYWRlciBwYXJ0aXRpb25zKS4KLSAgaWZlcSAoJChBQl9PVEFfUEFSVElUSU9OUyksKQotICAgICQoZXJyb3IgQUJfT1RBX1BBUlRJVElPTlMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gdXNpbmcgQUJfT1RBX1VQREFURVIpCi0gIGVuZGlmCiBlbmRpZgogCiBpZm5lcSAoJChBQl9PVEFfUEFSVElUSU9OUyksKQpAQCAtNjcwOCw2ICs2NzYwLDEwIEBACiAJQCMgSWYgYnJlYWtwYWQgc3ltYm9scyBoYXZlIGJlZW4gZ2VuZXJhdGVkLCBhZGQgdGhlbSB0byB0aGUgemlwLgogCSQoaGlkZSkgY3AgLVIgJChUQVJHRVRfT1VUX0JSRUFLUEFEKSAkKHppcF9yb290KS9CUkVBS1BBRAogZW5kaWYKK2lmZGVmIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL0lNQUdFUworCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KK2VuZGlmCiBpZmRlZiBCT0FSRF9QUkVCVUlMVF9WRU5ET1JJTUFHRQogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvSU1BR0VTCiAJJChoaWRlKSBjcCAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KQEAgLTY3NTYsMTQgKzY4MTIsMjIgQEAKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTLwogZW5kaWYgIyBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UKLWlmZGVmIEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUCitpZmRlZiBCT0FSRF9LRVJORUxfUEFUSF8xNksKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgY3AgJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTLwotZW5kaWYgIyBCVUlMVF9LRVJORUxfMTZLX1RBUkdFVAotaWZkZWYgQlVJTFRfUkFNRElTS18xNktfVEFSR0VUCitlbmRpZiAjIEJPQVJEX0tFUk5FTF9QQVRIXzE2SworaWZkZWYgQk9BUkRfS0VSTkVMX01PRFVMRVNfMTZLCiAJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMKIAkkKGhpZGUpIGNwICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCi1lbmRpZiAjIEJVSUxUX1JBTURJU0tfMTZLX1RBUkdFVAorZW5kaWYgIyBCT0FSRF9LRVJORUxfTU9EVUxFU18xNksKK2lmZGVmIEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUCisJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9JTUFHRVMKKwkkKGhpZGUpIGNwICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KK2VuZGlmICMgQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQKK2lmZGVmIElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL0lNQUdFUworCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSAkKHppcF9yb290KS9JTUFHRVMvCitlbmRpZiAjIElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQKIGlmZXEgKCQoQk9BUkRfVVNFU19QVk1GV0lNQUdFKSx0cnVlKQogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTCiAJJChoaWRlKSBjcCAkKElOU1RBTExFRF9QVk1GV0lNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTLwpAQCAtNjgzMSw2ICs2ODk1LDMzIEBACiAJJChoaWRlKSBlY2hvICIkKEJPQVJEX0tFUk5FTF9QQUdFU0laRSkiID4gJCh6aXBfcm9vdCkvSU5JVF9CT09UL3BhZ2VzaXplCiBlbmRpZiAjIEJPQVJEX0tFUk5FTF9QQUdFU0laRQogZW5kaWYgIyBCVUlMRElOR19JTklUX0JPT1RfSU1BR0UKK2lmZGVmIEJPQVJEX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSAkKHppcF9yb290KS9NRVRBL2Vyb2ZzX2RlZmF1bHRfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfU1lTVEVNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfU1lTVEVNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1NZU1RFTV9FWFRJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9TWVNURU1fRVhUSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX2V4dF9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9QUk9EVUNUSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfUFJPRFVDVElNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSAkKHppcF9yb290KS9NRVRBL3Byb2R1Y3RfZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfVkVORE9SSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfVkVORE9SSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvdmVuZG9yX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX09ETUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX09ETUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSAkKHppcF9yb290KS9NRVRBL29kbV9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9WRU5ET1JfRExLTUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX1ZFTkRPUl9ETEtNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvdmVuZG9yX2Rsa21fZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfT0RNX0RMS01JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9PRE1fRExLTUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSAkKHppcF9yb290KS9NRVRBL29kbV9kbGttX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1NZU1RFTV9ETEtNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fZGxrbV9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCiBpZm5lcSAoJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKIAkkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL1ZFTkRPUl9CT09UL1JBTURJU0ssKSA+ICQoemlwX3Jvb3QpL01FVEEvdmVuZG9yX2Jvb3RfZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgpAQCAtNzA1NSwxOCArNzE0NiwxOSBAQAogCiBlbmRpZgogCi0kKERFWFBSRU9QVF9DT05GSUdfWklQKTogJChTT09OR19aSVApCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZwotCiskKERFWFBSRU9QVF9DT05GSUdfWklQKTogUFJJVkFURV9ERVhQUkVPUFRfQ09ORklHX1pJUF9QQVJBTVMgOj0KIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQpKQogaWZuZXEgKCwkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKSkKLQkkKGhpZGUpIGNwICQoREVYX1BSRU9QVF9DT05GSUdfRk9SX01BS0UpICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcKKyQoREVYUFJFT1BUX0NPTkZJR19aSVApOiBQUklWQVRFX0RFWFBSRU9QVF9DT05GSUdfWklQX1BBUkFNUyArPSAtZSAkKG5vdGRpciAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKSkgLWYgJChERVhfUFJFT1BUX0NPTkZJR19GT1JfTUFLRSkKIGVuZGlmCiBpZm5lcSAoLCQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpKQotCSQoaGlkZSkgY3AgJChERVhfUFJFT1BUX1NPT05HX0NPTkZJR19GT1JfTUFLRSkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworJChERVhQUkVPUFRfQ09ORklHX1pJUCk6IFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR19aSVBfUEFSQU1TICs9IC1lICQobm90ZGlyICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpKSAtZiAkKERFWF9QUkVPUFRfU09PTkdfQ09ORklHX0ZPUl9NQUtFKQogZW5kaWYKIGVuZGlmICMhVEFSR0VUX0JVSUxEX1VOQlVORExFRAotCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcgLUQgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworCiskKERFWFBSRU9QVF9DT05GSUdfWklQKTogJChTT09OR19aSVApCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcgLUQgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZyAkKFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR19aSVBfUEFSQU1TKQogCiAuUEhPTlk6IGRleHByZW9wdF9jb25maWdfemlwCiBkZXhwcmVvcHRfY29uZmlnX3ppcDogJChERVhQUkVPUFRfQ09ORklHX1pJUCkKQEAgLTc1NjEsNiArNzY1MywxMCBAQAogZHJvaWRjb3JlLXVuYnVuZGxlZDogJChRRU1VX1ZFUklGSUVEX0JPT1RfUEFSQU1TKQogCiBlbmRpZgorCisjIFByZXByb2Nlc3MgZmlsZXMgZm9yIGVtdWxhdG9yIGFuZCBzZGsuCistaW5jbHVkZSBkZXZlbG9wbWVudC9idWlsZC90b29scy9zZGstcHJlcHJvY2Vzcy1maWxlcy5taworCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBlbXVsYXRvciBwYWNrYWdlCiBpZmVxICgkKEJVSUxEX0VNVUxBVE9SKSx0cnVlKQpAQCAtNzgwMiw5ICs3ODk4LDc4IEBACiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsaGFpa3UtcHJlc3VibWl0LCQoU09PTkdfUFJFU1VCTUlUX0ZVWlpfUEFDS0FHSU5HX0FSQ0hfTU9EVUxFUykpCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXh0cmFjdCBwbGF0Zm9ybSBmb250cyB1c2VkIGluIExheW91dGxpYgorIyBFeHRyYWN0IGFkZGl0aW9uYWwgZGF0YSBmaWxlcyB1c2VkIGluIExheW91dGxpYgogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbGF5b3V0bGliX2RhdGEubWsKIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXNrdG9wIHBhY2sgY29tbW9uIHZhcmlhYmxlcy4KK1BBQ0tfSU1BR0VfU0NSSVBUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhY2tfaW1hZ2UKK0lNQUdFUyA6PSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfU1VQRVJJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9JTklUX0JPT1RfSU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9WQk1FVEFJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXNrdG9wIHBhY2sgaW1hZ2UgaG9vay4KK2lmbmVxICgsJChzdHJpcCAkKFBBQ0tfREVTS1RPUF9GSUxFU1lTVEVNX0lNQUdFUykpKQorUEFDS19JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYW5kcm9pZC1kZXNrdG9wX2ltYWdlLmJpbgorCiskKFBBQ0tfSU1BR0VfVEFSR0VUKTogJChJTUFHRVMpICQoUEFDS19JTUFHRV9TQ1JJUFQpCisJJChQQUNLX0lNQUdFX1NDUklQVCkgLS1vdXRfZGlyICQoUFJPRFVDVF9PVVQpIC0tbm9hcmNoaXZlCisKK1BBQ0tFRF9JTUFHRV9BUkNISVZFX1RBUkdFVCA6PSAkKFBBQ0tfSU1BR0VfVEFSR0VUKS5negorCiskKFBBQ0tFRF9JTUFHRV9BUkNISVZFX1RBUkdFVCk6ICQoUEFDS19JTUFHRV9UQVJHRVQpIHwgJChHWklQKQorCSQoR1pJUCkgLWZrICQoUEFDS19JTUFHRV9UQVJHRVQpCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoUEFDS0VEX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKSkKKworLlBIT05ZOiBwYWNrLWltYWdlCitwYWNrLWltYWdlOiAkKFBBQ0tfSU1BR0VfVEFSR0VUKQorCitlbmRpZiAjIFBBQ0tfREVTS1RPUF9GSUxFU1lTVEVNX0lNQUdFUworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayByZWNvdmVyeSBpbWFnZSBob29rLgoraWZuZXEgKCwkKHN0cmlwICQoUEFDS19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFKSkpCitQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfcmVjb3ZlcnlfaW1hZ2UuYmluCisKKyQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKKwkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUgLS1yZWNvdmVyeQorCitQQUNLRURfUkVDT1ZFUllfSU1BR0VfQVJDSElWRV9UQVJHRVQgOj0gJChQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCkuZ3oKKworJChQQUNLRURfUkVDT1ZFUllfSU1BR0VfQVJDSElWRV9UQVJHRVQpOiAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfVEFSR0VUKSB8ICQoR1pJUCkKKwkkKEdaSVApIC1mayAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfVEFSR0VUKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZGlzdF9maWxlcywkKFBBQ0tFRF9SRUNPVkVSWV9JTUFHRV9BUkNISVZFX1RBUkdFVCkpCisKKy5QSE9OWTogcGFjay1yZWNvdmVyeS1pbWFnZQorcGFjay1yZWNvdmVyeS1pbWFnZTogJChQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCkKKworZW5kaWYgIyBQQUNLX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXNrdG9wIHBhY2sgdXBkYXRlIGltYWdlIGhvb2suCitpZm5lcSAoLCQoc3RyaXAgJChQQUNLX0RFU0tUT1BfVVBEQVRFX0lNQUdFKSkpCitQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYW5kcm9pZC1kZXNrdG9wX3VwZGF0ZV9pbWFnZS5iaW4KKworJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKKwkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUgLS11cGRhdGUKKworUEFDS0VEX1VQREFURV9JTUFHRV9BUkNISVZFX1RBUkdFVCA6PSAkKFBBQ0tfVVBEQVRFX0lNQUdFX1RBUkdFVCkuZ3oKKworJChQQUNLRURfVVBEQVRFX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKTogJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpIHwgJChHWklQKQorCSQoR1pJUCkgLWZrICQoUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZGlzdF9maWxlcywkKFBBQ0tFRF9VUERBVEVfSU1BR0VfQVJDSElWRV9UQVJHRVQpKQorCisuUEhPTlk6IHBhY2stdXBkYXRlLWltYWdlCitwYWNrLXVwZGF0ZS1pbWFnZTogJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpCisKK2VuZGlmICMgUEFDS19ERVNLVE9QX1VQREFURV9JTUFHRQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE9TIExpY2Vuc2luZwpkaWZmIC0tZ2l0IGEvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rIGIvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rCmluZGV4IGVhNmViZDMuLjVmYzhmZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5taworKysgYi9jb3JlL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKQEAgLTI3LDIwICsyNywzNiBAQAogIyBBZGQgdmFyaWFibGVzIHRvIHRoZSBuYW1lc3BhY2UgYmVsb3c6CiAKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELEJPQVJEX1VTRVNfT0RNSU1BR0UpCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09ULCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxCT0FSRF9NT1ZFX0dTSV9BVkJfS0VZU19UT19WRU5ET1JfQk9PVCwkKEJPQVJEX01PVkVfR1NJX0FWQl9LRVlTX1RPX1ZFTkRPUl9CT09UKSkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELENIRUNLX0RFVl9UWVBFX1ZJT0xBVElPTlMpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUFJPRFVDVF9JTlNUQUxMX0RFQlVHX1BPTElDWV9UT19TWVNURU1fRVhUKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0RZTkFNSUNfNjRfMzJfRFJNU0VSVkVSKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0VOQUJMRV9NRURJQURSTV82NCkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFRBUkdFVF9EWU5BTUlDXzY0XzMyX01FRElBU0VSVkVSKQogCi0jIFBST0RVQ1RfUFJFQ09NUElMRURfU0VQT0xJQ1kgZGVmYXVsdHMgdG8gdHJ1ZS4gRXhwbGljaXRseSBjaGVjayBpZiBpdCdzICJmYWxzZSIgb3Igbm90LgotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSwkKGlmICQoZmlsdGVyIGZhbHNlLCQoUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSkpLGZhbHNlLHRydWUpKQorIyBGb3IgU2FuaXRpemVycworJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEFTQU5fRU5BQkxFRCwkKGlmICQoZmlsdGVyIGFkZHJlc3MsJChTQU5JVElaRV9UQVJHRVQpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxIV0FTQU5fRU5BQkxFRCwkKGlmICQoZmlsdGVyIGh3YWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELFNBTklUSVpFX1RBUkdFVF9TWVNURU1fRU5BQkxFRCwkKGlmICQoZmlsdGVyIHRydWUsJChTQU5JVElaRV9UQVJHRVRfU1lTVEVNKSksdHJ1ZSxmYWxzZSkpCiAKKyMgRm9yIGluaXQuZW52aXJvbi5yYworJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEdDT1ZfQ09WRVJBR0UsJChOQVRJVkVfQ09WRVJBR0UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELENMQU5HX0NPVkVSQUdFLCQoQ0xBTkdfQ09WRVJBR0UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxTQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUsJChQUk9EVUNUX1NDVURPX0FMTE9DQVRJT05fUklOR19CVUZGRVJfU0laRSkpCisKKyMgUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSBkZWZhdWx0cyB0byB0cnVlLiBFeHBsaWNpdGx5IGNoZWNrIGlmIGl0J3MgImZhbHNlIiBvciBub3QuCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSwkKGlmICQoZmlsdGVyIGZhbHNlLCQoUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSkpLGZhbHNlLHRydWUpKQorCisjIEZvciBhcnQgbW9kdWxlcworJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxhcnRfbW9kdWxlLGhvc3RfcHJlZmVyXzMyX2JpdCwkKGlmICQoZmlsdGVyIHRydWUsJChIT1NUX1BSRUZFUl8zMl9CSVQpKSx0cnVlLGZhbHNlKSkKIGlmZGVmIEFSVF9ERUJVR19PUFRfRkxBRwogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYXJ0X21vZHVsZSxhcnRfZGVidWdfb3B0X2ZsYWcsJChBUlRfREVCVUdfT1BUX0ZMQUcpKQogZW5kaWYKKyMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgQVJUX0JVSUxEX0hPU1RfREVCVUcgaXMgdHJ1ZQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxhcnRfbW9kdWxlLGFydF9idWlsZF9ob3N0X2RlYnVnLCQoaWYgJChmaWx0ZXIgZmFsc2UsJChBUlRfQlVJTERfSE9TVF9ERUJVRykpLGZhbHNlLHRydWUpKQogCiBpZmRlZiBUQVJHRVRfQk9BUkRfQVVUTwogICAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsIEFORFJPSUQsIHRhcmdldF9ib2FyZF9hdXRvLCAkKFRBUkdFVF9CT0FSRF9BVVRPKSkKQEAgLTU1LDI0ICs3MSwxMCBAQAogZW5kaWYKIGVuZGlmCiAKLSMgVE9ETyhiLzMwODE4NzgwMCk6IHNvbWUgaW50ZXJuYWwgbW9kdWxlcyBzZXQgYHByZWZlcmAgdG8gdHJ1ZSBvbiB0aGUgcHJlYnVpbHQgYXBleCBtb2R1bGUsCi0jIGFuZCBzZXQgdGhhdCB0byBmYWxzZSB3aGVuIGBBTkRST0lELm1vZHVsZV9idWlsZF9mcm9tX3NvdXJjZWAgaXMgdHJ1ZS4KLSMgU2V0IHRoaXMgc29vbmcgY29uZmlnIHZhcmlhYmxlIHRvIHRydWUgZm9yIG5vdywgYW5kIGNsZWFudXAgYHByZWZlcmAgYXMgcGFydCBvZiBiLzMwODE4NzgwMAotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsbW9kdWxlX2J1aWxkX2Zyb21fc291cmNlLHRydWUpCi0KLSMgTWVzc2FnaW5nIGFwcCB2YXJzCi1pZmVxIChlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpCi0kKGNhbGwgc29vbmdfY29uZmlnX3NldCxtZXNzYWdpbmcsYnVpbGRfdmFyaWFudF9lbmcsdHJ1ZSkKLWVuZGlmCi0KICMgRW5hYmxlIFN5c3RlbVVJIG9wdGltaXphdGlvbnMgYnkgZGVmYXVsdCB1bmxlc3MgZXhwbGljaXRseSBzZXQuCiBTWVNURU1VSV9PUFRJTUlaRV9KQVZBID89IHRydWUKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFNZU1RFTVVJX09QVElNSVpFX0pBVkEpCiAKLSMgRW5hYmxlIENvbXBvc2UgaW4gU3lzdGVtVUkgYnkgZGVmYXVsdC4KLVNZU1RFTVVJX1VTRV9DT01QT1NFID89IHRydWUKLSQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFNZU1RFTVVJX1VTRV9DT01QT1NFKQotCiBpZmRlZiBQUk9EVUNUX0FWRl9FTkFCTEVECiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxhdmZfZW5hYmxlZCwkKFBST0RVQ1RfQVZGX0VOQUJMRUQpKQogZW5kaWYKQEAgLTk4LDYgKzEwMCw3IEBACiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9hbGxvd19wcmVpbnN0YWxsZWRfYXBwcywkKFJFTEVBU0VfQVZGX0FMTE9XX1BSRUlOU1RBTExFRF9BUFBTKSkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX2VuYWJsZV9kZXZpY2VfYXNzaWdubWVudCwkKFJFTEVBU0VfQVZGX0VOQUJMRV9ERVZJQ0VfQVNTSUdOTUVOVCkpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZGljZV9jaGFuZ2VzLCQoUkVMRUFTRV9BVkZfRU5BQkxFX0RJQ0VfQ0hBTkdFUykpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZWFybHlfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfRUFSTFlfVk0pKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX2xscHZtX2NoYW5nZXMsJChSRUxFQVNFX0FWRl9FTkFCTEVfTExQVk1fQ0hBTkdFUykpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfbXVsdGlfdGVuYW50X21pY3JvZHJvaWRfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfTVVMVElfVEVOQU5UX01JQ1JPRFJPSURfVk0pKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX25ldHdvcmssJChSRUxFQVNFX0FWRl9FTkFCTEVfTkVUV09SSykpCkBAIC0xMTEsNiArMTE0LDggQEAKIAogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9iaW5kZXJfZGVhdGhfcmVjaXBpZW50X3dlYWtfZnJvbV9qbmksJChSRUxFQVNFX0JJTkRFUl9ERUFUSF9SRUNJUElFTlRfV0VBS19GUk9NX0pOSSkpCiAKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfbGlicG93ZXJfbm9fbG9ja19iaW5kZXJfdHhuLCQoUkVMRUFTRV9MSUJQT1dFUl9OT19MT0NLX0JJTkRFUl9UWE4pKQorCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX3BhY2thZ2VfbGliYW5kcm9pZF9ydW50aW1lX3B1bmNoX2hvbGVzLCQoUkVMRUFTRV9QQUNLQUdFX0xJQkFORFJPSURfUlVOVElNRV9QVU5DSF9IT0xFUykpCiAKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2Vfc2VsaW51eF9kYXRhX2RhdGFfaWdub3JlLCQoUkVMRUFTRV9TRUxJTlVYX0RBVEFfREFUQV9JR05PUkUpKQpAQCAtMTU0LDYgKzE1OSw3IEBACiAKICMgQWRkIGNyYXNocmVjb3ZlcnkgYnVpbGQgZmxhZyB0byBzb29uZwogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlLCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkpCisjIEFkZCBjcmFzaHJlY292ZXJ5IGZpbGUgbW92ZSBmbGFncyB0byBzb29uZywgZm9yIGJvdGggcGxhdGZvcm0gYW5kIG1vZHVsZQogaWZlcSAodHJ1ZSwkKFJFTEVBU0VfQ1JBU0hSRUNPVkVSWV9GSUxFX01PVkUpKQogICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELGNyYXNocmVjb3ZlcnlfZmlsZXNfaW5fbW9kdWxlLHRydWUpCiAgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsY3Jhc2hyZWNvdmVyeV9maWxlc19pbl9wbGF0Zm9ybSxmYWxzZSkKQEAgLTE2MSw1ICsxNjcsMTggQEAKICAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxjcmFzaHJlY292ZXJ5X2ZpbGVzX2luX21vZHVsZSxmYWxzZSkKICAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxjcmFzaHJlY292ZXJ5X2ZpbGVzX2luX3BsYXRmb3JtLHRydWUpCiBlbmRpZgotIyBXZWlyZGx5IHJlcXVpcmVkIGJlY2F1c2UgcGxhdGZvcm1fYm9vdGNsYXNzcGF0aCBpcyB1c2luZyBBVVRPIG5hbWVzcGFjZQotJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQVVUTyxyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlLCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkpCisjIFJlcXVpcmVkIGFzIHBsYXRmb3JtX2Jvb3RjbGFzc3BhdGggaXMgdXNpbmcgdGhpcyBuYW1lc3BhY2UKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LGJvb3RjbGFzc3BhdGgscmVsZWFzZV9jcmFzaHJlY292ZXJ5X21vZHVsZSwkKFJFTEVBU0VfQ1JBU0hSRUNPVkVSWV9NT0RVTEUpKQorCisjIEVuYWJsZSBQcm9maWxpbmcgbW9kdWxlLiBBbHNvIHVzZWQgYnkgcGxhdGZvcm1fYm9vdGNsYXNzcGF0aC4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9wYWNrYWdlX3Byb2ZpbGluZ19tb2R1bGUsJChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlLCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpKQorCisjIEFkZCBwZXJmLXNldHVwIGJ1aWxkIGZsYWcgdG8gc29vbmcKKyMgTm90ZTogQk9BUkRfUEVSRlNFVFVQX1NDUklQVCBsb2NhdGlvbiBtdXN0IGJlIHVuZGVyIHBsYXRmb3JtX3Rlc3Rpbmcvc2NyaXB0cy9wZXJmLXNldHVwLy4KK2lmZGVmIEJPQVJEX1BFUkZTRVRVUF9TQ1JJUFQKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQscGVyZixib2FyZF9wZXJmc2V0dXBfc2NyaXB0LCQobm90ZGlyICQoQk9BUkRfUEVSRlNFVFVQX1NDUklQVCkpKQorZW5kaWYKKworIyBBZGQgdGFyZ2V0X3VzZV9wYW5fZGlzcGxheSBmbGFnIGZvciBoYXJkd2FyZS9saWJoYXJkd2FyZTpncmFsbG9jLmRlZmF1bHQKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ3JhbGxvYyx0YXJnZXRfdXNlX3Bhbl9kaXNwbGF5LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VfUEFOX0RJU1BMQVkpKSx0cnVlLGZhbHNlKSkKZGlmZiAtLWdpdCBhL2NvcmUvYmFzZV9ydWxlcy5tayBiL2NvcmUvYmFzZV9ydWxlcy5tawppbmRleCA4NjAyOGE5Li41MzYzZTBmIDEwMDY0NAotLS0gYS9jb3JlL2Jhc2VfcnVsZXMubWsKKysrIGIvY29yZS9iYXNlX3J1bGVzLm1rCkBAIC0zNDAsNyArMzQwLDcgQEAKIAogaWZuZXEgKCwkKExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUpKQogICBpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCi0gICAgJChjYWxsIHByZXR0eS1lcnJvciwgTE9DQUxfU09PTkdfSU5TVEFMTEVEX01PRFVMRSBjYW4gb25seSBiZSB1c2VkIGZyb20gJChTT09OR19BTkRST0lEX01LKSkKKyAgICAkKGNhbGwgcHJldHR5LWVycm9yLCBMT0NBTF9NT0RVTEVfTUFLRUZJTEUgY2FuIG9ubHkgYmUgdXNlZCBmcm9tICQoU09PTkdfQU5EUk9JRF9NSykpCiAgIGVuZGlmCiAgICMgVXNlIHRoZSBpbnN0YWxsIHBhdGggcmVxdWVzdGVkIGJ5IFNvb25nLgogICBMT0NBTF9JTlNUQUxMRURfTU9EVUxFIDo9ICQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX01PRFVMRSkKQEAgLTcxNywxNSArNzE3LDI1IEBACiBlbmRpZgogCiBpZmVxICgkKEVYQ0xVREVfTUNUUyksdHJ1ZSkKK2lmZXEgKCwkKGZpbHRlciAkKExPQ0FMX01PRFVMRSksJChtY3RzX3doaXRlbGlzdCkpKQogICBpZm5lcSAoLCQodGVzdF9jb25maWcpKQogICAgIGlmbmVxICgsJChmaWx0ZXIgbWN0cy0lLCQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSkpKQogICAgICAgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSAkKGZpbHRlci1vdXQgY3RzLCQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSkpCiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCitlbmRpZgogCiBpZm5lcSAodHJ1ZSwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKIAoraWZlcSAoJChFWENMVURFX01DVFMpLHRydWUpCisgIGlmbmVxICgsJCh0ZXN0X2NvbmZpZykpCisgICAgaWZuZXEgKCwkKGZpbHRlciBtY3RzLSUsJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkpCisgICAgICBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9ICQoZmlsdGVyLW91dCBjdHMsJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKwogIyBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUgdGVzdCBvciBiZW5jaG1hcmsgYW5kIGl0cyBzdGVtIHZhcmlhbnRzIGFyZSBub3QgZGVmaW5lZCwKICMgc2VwYXJhdGUgdGhlIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgaW50byBzdWJkaXJlY3RvcmllcyBvZiB0aGUgdGVzdGNhc2UgZm9sZGVyLgogYXJjaF9kaXIgOj0KQEAgLTc2Niw2ICs3NzYsOCBAQAogICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkgOj0gJChwYXRzdWJzdCAlOiQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSksJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpLFwKICAgICAkKGZvcmVhY2ggZGlyLCAkKGNhbGwgY29tcGF0aWJpbGl0eV9zdWl0ZV9kaXJzLCQoc3VpdGUpLCQoYXJjaF9kaXIpKSwgXAogICAgICAgJChMT0NBTF9CVUlMVF9NT0RVTEUpOiQoZGlyKS8kKG15X2luc3RhbGxlZF9tb2R1bGVfc3RlbSkpKSkgXAorICAkKGV2YWwgbXlfY29tcGF0X21vZHVsZV9hcmNoX2Rpcl8kKHN1aXRlKS4kKG15X3JlZ2lzdGVyX25hbWUpIDo9KSBcCisgICQoZm9yZWFjaCBkaXIsJChjYWxsIGNvbXBhdGliaWxpdHlfc3VpdGVfZGlycywkKHN1aXRlKSwkKGFyY2hfZGlyKSksJChldmFsIG15X2NvbXBhdF9tb2R1bGVfYXJjaF9kaXJfJChzdWl0ZSkuJChteV9yZWdpc3Rlcl9uYW1lKSArPSAkKGRpcikpKSBcCiAgICQoZXZhbCBteV9jb21wYXRfZGlzdF9jb25maWdfJChzdWl0ZSkgOj0gKSkKIAogaWZuZXEgKCwkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSkKQEAgLTk2NSw2ICs5NzcsOCBAQAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVCkgJChMT0NBTF9CVUlMVF9NT0RVTEUpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNPT05HX01PRFVMRV9UWVBFIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpICQoTE9DQUxfU09PTkdfTU9EVUxFX1RZUEUpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX1NPT05HX01PRFVMRSA6PSBcCisgICAgJChpZiAkKGZpbHRlciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSksdHJ1ZSkKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfQlVJTFQgOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfQlVJTFQpICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpAQCAtMTA1NSw2ICsxMDY5LDExIEBACiAgICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUNPTkZJR19GSUxFUykgJChMT0NBTF9BQ09ORklHX0ZJTEVTKQogZW5kaWYKIAoraWZkZWYgTE9DQUxfRklMRVNZU1RFTV9GSUxFTElTVAorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZJTEVTWVNURU1fRklMRUxJU1QgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZJTEVTWVNURU1fRklMRUxJU1QpICQoTE9DQUxfRklMRVNZU1RFTV9GSUxFTElTVCkKK2VuZGlmCisKIGlmbmRlZiBMT0NBTF9TT09OR19NT0RVTEVfSU5GT19KU09OCiAgIEFMTF9NQUtFX01PRFVMRV9JTkZPX0pTT05fTU9EVUxFUyArPSAkKG15X3JlZ2lzdGVyX25hbWUpCiAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU0hBUkVEX0xJQlMgOj0gXApAQCAtMTI2Niw2ICsxMjg1LDggQEAKIGVuZGlmCiBlbmRpZgogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9YmFzZV9ydWxlcykpCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEVuc3VyZSBwcml2aWxlZ2VkIGFwcGxpY2F0aW9ucyBhbHdheXMgaGF2ZSBMT0NBTF9QUklWSUxFR0VEX01PRFVMRQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvcmUvYmluYXJ5Lm1rIGIvY29yZS9iaW5hcnkubWsKaW5kZXggZjg2YjVhNC4uMWU5OGJjMCAxMDA2NDQKLS0tIGEvY29yZS9iaW5hcnkubWsKKysrIGIvY29yZS9iaW5hcnkubWsKQEAgLTIwNSw4ICsyMDUsNiBAQAogICAgIG15X2FwaV9sZXZlbCA6PSAkKG15X25ka19hcGkpCiAgIGVuZGlmCiAKLSAgbXlfbmRrX3NvdXJjZV9yb290IDo9IFwKLSAgICAgICQoSElTVE9SSUNBTF9OREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9OREtfVkVSU0lPTikvc291cmNlcwogICBteV9idWlsdF9uZGsgOj0gJChTT09OR19PVVRfRElSKS9uZGsKICAgbXlfbmRrX3RyaXBsZSA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfTkRLX1RSSVBMRSkKICAgbXlfbmRrX3N5c3Jvb3RfaW5jbHVkZSA6PSBcCkBAIC0yMzksMTYgKzIzNywxOCBAQAogICBlbmRpZgogCiAgIGlmZXEgKHN5c3RlbSwkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCisgICAgbXlfbmRrX3NvdXJjZV9yb290IDo9IFwKKyAgICAgICAgJChISVNUT1JJQ0FMX05ES19WRVJTSU9OU19ST09UKS8kKExPQ0FMX05ES19WRVJTSU9OKS9zb3VyY2VzCiAgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvc3lzdGVtL2luY2x1ZGUKICAgICBteV9zeXN0ZW1fc2hhcmVkX2xpYnJhcmllcyArPSBsaWJzdGRjKysKICAgZWxzZSBpZm5lcSAoLCQoZmlsdGVyIGMrK18lLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKQotICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9IFwKLSAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2luY2x1ZGUKLSAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSBcCi0gICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrK2FiaS9pbmNsdWRlCisgICAgbXlfbGx2bV9kaXIgOj0gJChMTFZNX1BSRUJVSUxUU19CQVNFKS8kKEJVSUxEX09TKS14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKQorICAgIG15X2xpYmN4eF9hcmNoX2RpciA6PSAkKG15X2xsdm1fZGlyKS9hbmRyb2lkX2xpYmMrKy9uZGsvJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSKQogCi0gICAgbXlfbGliY3h4X2xpYmRpciA6PSBcCi0gICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrKy9saWJzLyQobXlfY3B1X3ZhcmlhbnQpCisgICAgIyBJbmNsdWRlIHRoZSB0YXJnZXQtc3BlY2lmaWMgX19jb25maWdfc2l0ZSBmaWxlIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmljIGxpYmMrKyBoZWFkZXJzLgorICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9ICQobXlfbGliY3h4X2FyY2hfZGlyKS9pbmNsdWRlL2MrKy92MQorICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9ICQobXlfbGx2bV9kaXIpL2luY2x1ZGUvYysrL3YxCisgICAgbXlfbGliY3h4X2xpYmRpciA6PSAkKG15X2xpYmN4eF9hcmNoX2RpcikvbGliCiAKICAgICBpZmVxIChjKytfc3RhdGljLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKICAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSBcCkBAIC0yNTgsMTQgKzI1OCw3IEBACiAgICAgICBteV9uZGtfc3RsX3NoYXJlZF9saWJfZnVsbHBhdGggOj0gJChteV9saWJjeHhfbGliZGlyKS9saWJjKytfc2hhcmVkLnNvCiAgICAgZW5kaWYKIAotICAgIGlmbmVxICgkKG15X25ka19hcGkpLGN1cnJlbnQpCi0gICAgICBpZmVxICgkKGNhbGwgbWF0aF9sdCwkKG15X25ka19hcGkpLDIxKSx0cnVlKQotICAgICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSAkKG15X25ka19zb3VyY2Vfcm9vdCkvYW5kcm9pZC9zdXBwb3J0L2luY2x1ZGUKLSAgICAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGliYW5kcm9pZF9zdXBwb3J0LmEKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLQotICAgIG15X25ka19zdGxfc3RhdGljX2xpYiArPSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYnVud2luZC5hCisgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9MSUJVTldJTkQpCiAgICAgbXlfbGRsaWJzICs9IC1sZGwKICAgZWxzZSAjIExPQ0FMX05ES19TVExfVkFSSUFOVCBtdXN0IGJlIG5vbmUKICAgICAjIERvIG5vdGhpbmcuCkBAIC0xMzUyLDYgKzEzNDUsOCBAQAogbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKSBuYXRpdmU6cGxhdGZvcm0gbmF0aXZlOnBsYXRmb3JtX3ZuZGsKIGVuZGlmCiAKK0FMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuV0hPTEVfU1RBVElDX0xJQlMgOj0gJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKQorCiBteV9saW5rX2RlcHMgOj0gJChhZGRwcmVmaXggU1RBVElDX0xJQlJBUklFUzosJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSAkKG15X3N0YXRpY19saWJyYXJpZXMpKQogaWZuZXEgKCQoZmlsdGVyLW91dCBTVEFUSUNfTElCUkFSSUVTIEhFQURFUl9MSUJSQVJJRVMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwpCiBteV9saW5rX2RlcHMgKz0gJChhZGRwcmVmaXggU0hBUkVEX0xJQlJBUklFUzosJChteV9zaGFyZWRfbGlicmFyaWVzKSkKZGlmZiAtLWdpdCBhL2NvcmUvYm9hcmRfY29uZmlnLm1rIGIvY29yZS9ib2FyZF9jb25maWcubWsKaW5kZXggZTE4NDYwMS4uNTYwNjk2NCAxMDA2NDQKLS0tIGEvY29yZS9ib2FyZF9jb25maWcubWsKKysrIGIvY29yZS9ib2FyZF9jb25maWcubWsKQEAgLTIzNyw2ICsyMzcsNyBAQAogICAuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfREVWSUNFX0RJUgogZW5kaWYKIAorJChjYWxsIGR1bXAtcGhhc2Utc3RhcnQsQk9BUkQsLCwsIGJ1aWxkL21ha2UvY29yZS9ib2FyZF9jb25maWcubWspCiBpZm5kZWYgUkJDX1BST0RVQ1RfQ09ORklHCiBpbmNsdWRlICQoYm9hcmRfY29uZmlnX21rKQogZWxzZQpAQCAtMjYxLDYgKzI2Miw3IEBACiAKICAgaW5jbHVkZSAkKE9VVF9ESVIpL3JiYy9yYmNfYm9hcmRfY29uZmlnX3Jlc3VsdHMubWsKIGVuZGlmCiskKGNhbGwgZHVtcC1waGFzZS1lbmQsIGJ1aWxkL21ha2UvY29yZS9ib2FyZF9jb25maWcubWspCiAKIGlmbmVxICgsJChhbmQgJChUQVJHRVRfQVJDSCksJChUQVJHRVRfQVJDSF9TVUlURSkpKQogICAkKGVycm9yICQoYm9hcmRfY29uZmlnX21rKSBlcnJvbmVvdXNseSBzZXRzIGJvdGggVEFSR0VUX0FSQ0ggYW5kIFRBUkdFVF9BUkNIX1NVSVRFKQpAQCAtOTIzLDcgKzkyNSw5IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEVuc3VyZSBjb25zaXN0ZW5jeSBhbW9uZyBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTLCBBQl9PVEFfVVBEQVRFUiwgYW5kIFBST0RVQ1RfT1RBX0ZPUkNFX05PTl9BQl9QQUNLQUdFLgogVEFSR0VUX1JFQ09WRVJZX1VQREFURVJfTElCUyA/PQotQUJfT1RBX1VQREFURVIgPz0KK2lmZXEgKCQoQUJfT1RBX1VQREFURVIpLCkKK0FCX09UQV9VUERBVEVSIDo9IHRydWUKK2VuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTIEFCX09UQV9VUERBVEVSCiAKICMgRW5zdXJlIHRoYXQgaWYgUFJPRFVDVF9PVEFfRk9SQ0VfTk9OX0FCX1BBQ0tBR0UgPT0gdHJ1ZSwgdGhlbiBBQl9PVEFfVVBEQVRFUiBtdXN0IGJlIHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvVEFSR0VUX2FybS5tayBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybS5tawppbmRleCBmMTg3NDdhLi4xMjY0ODJmIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL1RBUkdFVF9hcm0ubWsKKysrIGIvY29yZS9jbGFuZy9UQVJHRVRfYXJtLm1rCkBAIC00LDcgKzQsMTAgQEAKIAogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUtYXJtLWFuZHJvaWQuYQogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQkNSVF9CVUlMVElOUyA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQuYnVpbHRpbnMtYXJtLWFuZHJvaWQuYQorJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvYXJtL2xpYnVud2luZC5hCiAKICMgQWRkcmVzcyBzYW5pdGl6ZXIgY2xhbmcgY29uZmlnCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClBRERSRVNTX1NBTklUSVpFUl9MSU5LRVIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2FzYW4KICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUFERFJFU1NfU0FOSVRJWkVSX0xJTktFUl9GSUxFIDo9IC9zeXN0ZW0vYmluL2Jvb3RzdHJhcC9saW5rZXJfYXNhbgorCiskKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClQUkVCVUlMVF9MSUJDWFhfQVJDSF9ESVIgOj0gYXJtCmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF9hcm02NC5tayBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybTY0Lm1rCmluZGV4IDQyYmVkMGEuLmU3YWI2Y2IgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xhbmcvVEFSR0VUX2FybTY0Lm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybTY0Lm1rCkBAIC00LDcgKzQsMTAgQEAKIAogVEFSR0VUX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUtYWFyY2g2NC1hbmRyb2lkLmEKIFRBUkdFVF9MSUJDUlRfQlVJTFRJTlMgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LmJ1aWx0aW5zLWFhcmNoNjQtYW5kcm9pZC5hCitUQVJHRVRfTElCVU5XSU5EIDo9ICQoTExWTV9SVExJQl9QQVRIKS9hYXJjaDY0L2xpYnVud2luZC5hCiAKICMgQWRkcmVzcyBzYW5pdGl6ZXIgY2xhbmcgY29uZmlnCiBBRERSRVNTX1NBTklUSVpFUl9MSU5LRVIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2FzYW42NAogQUREUkVTU19TQU5JVElaRVJfTElOS0VSX0ZJTEUgOj0gL3N5c3RlbS9iaW4vYm9vdHN0cmFwL2xpbmtlcl9hc2FuNjQKKworUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IGFhcmNoNjQKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvVEFSR0VUX3Jpc2N2NjQubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF9yaXNjdjY0Lm1rCmluZGV4IGNmYjVjN2QuLjU4YzljN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xhbmcvVEFSR0VUX3Jpc2N2NjQubWsKKysrIGIvY29yZS9jbGFuZy9UQVJHRVRfcmlzY3Y2NC5tawpAQCAtNCw3ICs0LDEwIEBACiAKIFRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLXJpc2N2NjQtYW5kcm9pZC5hCiBUQVJHRVRfTElCQ1JUX0JVSUxUSU5TIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5idWlsdGlucy1yaXNjdjY0LWFuZHJvaWQuYQorVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvcmlzY3Y2NC9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuNjQKIEFERFJFU1NfU0FOSVRJWkVSX0xJTktFUl9GSUxFIDo9IC9zeXN0ZW0vYmluL2Jvb3RzdHJhcC9saW5rZXJfYXNhbjY0CisKK1BSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUiA6PSByaXNjdjY0CmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF94ODYubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF94ODYubWsKaW5kZXggNTQ5MWEwNS4uMWEwOGM3OSAxMDA2NDQKLS0tIGEvY29yZS9jbGFuZy9UQVJHRVRfeDg2Lm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX3g4Ni5tawpAQCAtNCw3ICs0LDEwIEBACiAKICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLWk2ODYtYW5kcm9pZC5hCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClUQVJHRVRfTElCQ1JUX0JVSUxUSU5TIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5idWlsdGlucy1pNjg2LWFuZHJvaWQuYQorJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvaTM4Ni9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClBRERSRVNTX1NBTklUSVpFUl9MSU5LRVJfRklMRSA6PSAvc3lzdGVtL2Jpbi9ib290c3RyYXAvbGlua2VyX2FzYW4KKworJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IGkzODYKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvVEFSR0VUX3g4Nl82NC5tayBiL2NvcmUvY2xhbmcvVEFSR0VUX3g4Nl82NC5tawppbmRleCAxNjdkYjcyLi5mMzliNDFlIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL1RBUkdFVF94ODZfNjQubWsKKysrIGIvY29yZS9jbGFuZy9UQVJHRVRfeDg2XzY0Lm1rCkBAIC00LDcgKzQsMTAgQEAKIAogVEFSR0VUX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUteDg2XzY0LWFuZHJvaWQuYQogVEFSR0VUX0xJQkNSVF9CVUlMVElOUyA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQuYnVpbHRpbnMteDg2XzY0LWFuZHJvaWQuYQorVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkveDg2XzY0L2xpYnVud2luZC5hCiAKICMgQWRkcmVzcyBzYW5pdGl6ZXIgY2xhbmcgY29uZmlnCiBBRERSRVNTX1NBTklUSVpFUl9MSU5LRVIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2FzYW42NAogQUREUkVTU19TQU5JVElaRVJfTElOS0VSX0ZJTEUgOj0gL3N5c3RlbS9iaW4vYm9vdHN0cmFwL2xpbmtlcl9hc2FuNjQKKworUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IHg4Nl82NApkaWZmIC0tZ2l0IGEvY29yZS9jbGVhcl92YXJzLm1rIGIvY29yZS9jbGVhcl92YXJzLm1rCmluZGV4IDYxOTI2OTAuLmZlZDE5ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYXJfdmFycy5taworKysgYi9jb3JlL2NsZWFyX3ZhcnMubWsKQEAgLTg3LDYgKzg3LDcgQEAKIExPQ0FMX0VYVFJBX0ZVTExfVEVTVF9DT05GSUdTOj0KIExPQ0FMX0VYVFJBQ1RfQVBLOj0KIExPQ0FMX0VYVFJBQ1RfRFBJX0FQSzo9CitMT0NBTF9GSUxFU1lTVEVNX0ZJTEVMSVNUOj0KIExPQ0FMX0ZJTkRCVUdTX0ZMQUdTOj0KIExPQ0FMX0ZPUkNFX1NUQVRJQ19FWEVDVVRBQkxFOj0KIExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSOj0KZGlmZiAtLWdpdCBhL2NvcmUvY29uZmlnLm1rIGIvY29yZS9jb25maWcubWsKaW5kZXggYzc1NjdlMy4uYTI5NDIyMyAxMDA2NDQKLS0tIGEvY29yZS9jb25maWcubWsKKysrIGIvY29yZS9jb25maWcubWsKQEAgLTMxNiw2ICszMTYsMTkgQEAKICQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJChzdHJpcCAkMik6PSQoc3RyaXAgJDMpKQogZW5kZWYKIAorIyBzb29uZ19jb25maWdfc2V0X2Jvb2wgaXMgdGhlIHNhbWUgYXMgc29vbmdfY29uZmlnX3NldCwgYnV0IGl0IHdpbGwKKyMgYWxzbyB0eXBlIHRoZSB2YXJpYWJsZSBhcyBhIGJvb2wsIHNvIHRoYXQgd2hlbiB1c2luZyBzZWxlY3QoKSBleHByZXNzaW9ucworIyBpbiBibHVlcHJpbnQgZmlsZXMgdGhleSBjYW4gdXNlIGJvb2xlYW4gdmFsdWVzIGluc3RlYWQgb2Ygc3RyaW5ncy4KKyMgSXQgd2lsbCBvbmx5IGFjY2VwdCAidHJ1ZSIgZm9yIGl0cyB2YWx1ZSwgYW55IG90aGVyIHZhbHVlIHdpbGwgYmUKKyMgdHJlYXRlZCBhcyBmYWxzZS4KKyMgJDEgaXMgdGhlIG5hbWVzcGFjZS4gJDIgaXMgdGhlIHZhcmlhYmxlIG5hbWUuICQzIGlzIHRoZSB2YXJpYWJsZSB2YWx1ZS4KKyMgRXg6ICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsYWNtZSxDT09MX0ZFQVRVUkUsdHJ1ZSkKK2RlZmluZSBzb29uZ19jb25maWdfc2V0X2Jvb2wKKyQoY2FsbCBzb29uZ19jb25maWdfZGVmaW5lX2ludGVybmFsLCQxLCQyKSBcCiskKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kKGZpbHRlciB0cnVlLCQzKSkKKyQoZXZhbCBTT09OR19DT05GSUdfVFlQRV8kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9Ym9vbCkKK2VuZGVmCisKICMgc29vbmdfY29uZmlnX2FwcGVuZCBhcHBlbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIGdpdmVuIFNvb25nCiAjIGNvbmZpZyBuYW1lc3BhY2UuIElmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBkZWZpbmVkLiBJZiB0aGUKICMgbmFtZXNwYWNlIGRvZXMgbm90ICBleGlzdCwgaXQgd2lsbCBiZSBkZWZpbmVkLgpAQCAtNzE4LDggKzczMSw2IEBACiBWRVJJVFlfU0lHTkVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIKIEJVSUxEX1ZFUklUWV9NRVRBREFUQSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfbWV0YWRhdGEKIEJVSUxEX1ZFUklUWV9UUkVFIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2J1aWxkX3Zlcml0eV90cmVlCi1GVVRJTElUWSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mdXRpbGl0eS1ob3N0Ci1WQk9PVF9TSUdORVIgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdmJvb3Rfc2lnbmVyCiAKIERFWERVTVAgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGV4ZHVtcCQoQlVJTERfRVhFQ1VUQUJMRV9TVUZGSVgpCiBQUk9GTUFOIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Byb2ZtYW4KQEAgLTgwMCw2ICs4MTEsMTIgQEAKICAgQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgPz0gdHJ1ZQogZW5kaWYKIAoraWZuZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDM2KSwpCisgIGlmbmVxICgkKE5FRURfQUlETF9OREtfUExBVEZPUk1fQkFDS0VORCksKQorICAgICQoZXJyb3IgTXVzdCBub3Qgc2V0IE5FRURfQUlETF9OREtfUExBVEZPUk1fQkFDS0VORCwgYnV0IGl0IGlzIHNldCB0bzogJChORUVEX0FJRExfTkRLX1BMQVRGT1JNX0JBQ0tFTkQpLiBTdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZC4pCisgIGVuZGlmCitlbmRpZgorCiAjIFNldCBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgdG8gdGhlIGxhdGVzdCBTeXN0ZW1TREsgdmVyc2lvbiBzdGFydGluZyBmcm9tIFAtbGF1bmNoaW5nCiAjIGRldmljZXMgaWYgdW5zZXQuCiBpZm5kZWYgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TCkBAIC04MjgsOSArODQ1LDYgQEAKICAgZWxzZQogICAgIG1pbl9zeXN0ZW1zZGtfdmVyc2lvbiA6PSAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKQogICBlbmRpZgotICBpZm5lcSAoJChjYWxsIG51bWJlcnNfbGVzc190aGFuLCQobWluX3N5c3RlbXNka192ZXJzaW9uKSwkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpLCkKLSAgICAkKGVycm9yIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyAoJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKSBtdXN0IGFsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQk9BUkRfQVBJX0xFVkVMLCBCT0FSRF9TSElQUElOR19BUElfTEVWRUwgb3IgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgKCQobWluX3N5c3RlbXNka192ZXJzaW9uKSkpCi0gIGVuZGlmCiAgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOSksKQogICAgIGlmbmVxICgkKEJPQVJEX09UQV9GUkFNRVdPUktfVkJNRVRBX1ZFUlNJT05fT1ZFUlJJREUpLCkKICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOSwgQk9BUkRfT1RBX0ZSQU1FV09SS19WQk1FVEFfVkVSU0lPTl9PVkVSUklERSBjYW5ub3QgYmUgc2V0KQpAQCAtMTIzOCwzMSArMTI1Miw2NCBAQAogIyBpbiB0aGUgc291cmNlIHRyZWUuCiBkb250X2JvdGhlcl9nb2FscyA6PSBvdXQgcHJvZHVjdC1ncmFwaAogCitpZmVxICgkKFRBUkdFVF9TWVNURU1fUFJPUCksKQorVEFSR0VUX1NZU1RFTV9QUk9QIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvc3lzdGVtLnByb3ApCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9TWVNURU1fRVhUX1BST1ApLCkKK1RBUkdFVF9TWVNURU1fRVhUX1BST1AgOj0gJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9zeXN0ZW1fZXh0LnByb3ApCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUX1BST1ApLCkKK1RBUkdFVF9QUk9EVUNUX1BST1AgOj0gJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9wcm9kdWN0LnByb3ApCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9PRE1fUFJPUCksKQorVEFSR0VUX09ETV9QUk9QIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvb2RtLnByb3ApCitlbmRpZgorCisuS0FUSV9SRUFET05MWSA6PSBcCisgICAgVEFSR0VUX1NZU1RFTV9QUk9QIFwKKyAgICBUQVJHRVRfU1lTVEVNX0VYVF9QUk9QIFwKKyAgICBUQVJHRVRfUFJPRFVDVF9QUk9QIFwKKyAgICBUQVJHRVRfT0RNX1BST1AgXAorCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zeXNwcm9wX2NvbmZpZy5tawogCiAjIE1ha2UgQU5EUk9JRCBTb29uZyBjb25maWcgdmFyaWFibGVzIHZpc2libGUgdG8gQW5kcm9pZC5tayBmaWxlcywgZm9yCiAjIGNvbnNpc3RlbmN5IHdpdGggdGhvc2UgZGVmaW5lZCBpbiBCb2FyZENvbmZpZy5tayBmaWxlcy4KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKIAorIyBFTU1BX0lOU1RSVU1FTlQgaXMgc2V0IHRvIHRydWUgd2hlbiBjb3ZlcmFnZSBpcyBlbmFibGVkLiBDcmVhdGVzIGEgc3VmZml4IHRvCisjIGRpZmZlcmVjaWF0ZSB0aGUgY292ZXJhZ2UgdmVyc2lvbiBvZiBuaW5qYSBmaWxlcy4gVGhpcyB3aWxsIHNhdmUgNSBtaW51dGVzIG9mCisjIGJ1aWxkIHRpbWUgdXNlZCB0byByZWdlbmVyYXRlIG5pbmphLgoraWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpCitDT1ZFUkFHRV9TVUZGSVggOj0gLmNvdmVyYWdlCitlbmRpZgorCitTT09OR19WQVJJQUJMRVMgOj0gJChTT09OR19PVVRfRElSKS9zb29uZy4kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS52YXJpYWJsZXMKK1NPT05HX0VYVFJBX1ZBUklBQkxFUyA6PSAkKFNPT05HX09VVF9ESVIpL3Nvb25nLiQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLmV4dHJhLnZhcmlhYmxlcworCiBpZmVxICgkKENBTExFRF9GUk9NX1NFVFVQKSx0cnVlKQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbmluamFfY29uZmlnLm1rCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zb29uZ19jb25maWcubWsKIGVuZGlmCiAKK1NPT05HX1ZBUklBQkxFUyA6PQorU09PTkdfRVhUUkFfVkFSSUFCTEVTIDo9CisKIC1pbmNsdWRlIGV4dGVybmFsL2x0cC9hbmRyb2lkL2x0cF9wYWNrYWdlX2xpc3QubWsKIERFRkFVTFRfREFUQV9PVVRfTU9EVUxFUyA6PSBsdHAgJChsdHBfcGFja2FnZXMpCiAuS0FUSV9SRUFET05MWSA6PSBERUZBVUxUX0RBVEFfT1VUX01PRFVMRVMKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZHVtcHZhci5tawogCi1pZm5lcSAoJChLRUVQX1ZOREspLHRydWUpCiBpZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KIEJPQVJEX1ZOREtfVkVSU0lPTj0KIGVuZGlmCiBpZmRlZiBQTEFURk9STV9WTkRLX1ZFUlNJT04KIFBMQVRGT1JNX1ZOREtfVkVSU0lPTj0KIGVuZGlmCi1lbmRpZgogCiBpZmVxICh0cnVlLCQoRlVMTF9TWVNURU1fT1BUSU1JWkVfSkFWQSkpCiBpZmVxIChmYWxzZSwkKFNZU1RFTV9PUFRJTUlaRV9KQVZBKSkKZGlmZiAtLWdpdCBhL2NvcmUvY29weV9oZWFkZXJzLm1rIGIvY29yZS9jb3B5X2hlYWRlcnMubWsKaW5kZXggMzk3ZWE2Mi4uMmU4MmRiNyAxMDA2NDQKLS0tIGEvY29yZS9jb3B5X2hlYWRlcnMubWsKKysrIGIvY29yZS9jb3B5X2hlYWRlcnMubWsKQEAgLTUwLDQgKzUwLDUgQEAKIF9jaEZyb20gOj0KIF9jaFRvIDo9CiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1DT1BZX0hFQURFUlMpKQogZW5kaWYgIyBMT0NBTF9DT1BZX0hFQURFUlMKZGlmZiAtLWdpdCBhL2NvcmUvZGVmaW5pdGlvbnMubWsgYi9jb3JlL2RlZmluaXRpb25zLm1rCmluZGV4IGRkZTBhYTkuLmNkMWIzNmUgMTAwNjQ0Ci0tLSBhL2NvcmUvZGVmaW5pdGlvbnMubWsKKysrIGIvY29yZS9kZWZpbml0aW9ucy5tawpAQCAtMjU4NCw3ICsyNTg0LDI4IEBACiAgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgOTgwMDEsOTg1MDAsJCgxKSksJCgyKSkKICAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCA5ODUwMSw5OTAwMCwkKDEpKSwkKDIpKQogICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDk5MDAxLDk5NTAwLCQoMSkpLCQoMikpCi0gICAgICAgIEAkKGlmICQod29yZGxpc3QgOTk1MDEsOTk1MDIsJCgxKSksJChlcnJvciBkdW1wLXdvcmRzLXRvLWZpbGU6IFRvbyBtYW55IHdvcmRzICgkKHdvcmRzICQoMSkpKSkpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgOTk1MDEsMTAwMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAwMDAxLDEwMDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMDUwMSwxMDEwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDEwMDEsMTAxNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAxNTAxLDEwMjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMjAwMSwxMDI1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDI1MDEsMTAzMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAzMDAxLDEwMzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMzUwMSwxMDQwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDQwMDEsMTA0NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA0NTAxLDEwNTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNTAwMSwxMDU1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDU1MDEsMTA2MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA2MDAxLDEwNjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNjUwMSwxMDcwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDcwMDEsMTA3NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA3NTAxLDEwODAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwODAwMSwxMDg1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDg1MDEsMTA5MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA5MDAxLDEwOTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwOTUwMSwxMTAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoaWYgJCh3b3JkbGlzdCAxMTAwMDEsMTEwMDAyLCQoMSkpLCQoZXJyb3IgZHVtcC13b3Jkcy10by1maWxlOiBUb28gbWFueSB3b3JkcyAoJCh3b3JkcyAkKDEpKSkpKQogZW5kZWYKICMgUmV0dXJuIGphciBhcmd1bWVudHMgdG8gY29tcHJlc3MgZmlsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkKICMgJCgxKTogZGlyZWN0b3J5CkBAIC0yOTI1LDE5ICsyOTQ2LDE1IEBACiAgIGVjaG8gIkluc3RhbGwgcGF0aDogJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCUsJChQUklWQVRFX0lOU1RBTExFRF9NT0RVTEUpKSIgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZyAmJiBcCiAgIGVjaG8gPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZwogZW5kZWYKLUFSVF9WRVJJREVYX0FQUENPTVBBVF9TQ1JJUFQ6PSQoSE9TVF9PVVQpL2Jpbi9hcHBjb21wYXQuc2gKK0FSVF9WRVJJREVYX0FQUENPTVBBVDo9JChIT1NUX09VVCkvYmluL2FwcGNvbXBhdAogZGVmaW5lIHJ1bi1hcHBjb21wYXQKICQoaGlkZSkgXAotICBlY2hvICJhcHBjb21wYXQuc2ggb3V0cHV0OiIgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZyAmJiBcCi0gIFBBQ0tBR0lORz0kKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORyBBTkRST0lEX0xPR19UQUdTPSIqOmUiICQoQVJUX1ZFUklERVhfQVBQQ09NUEFUX1NDUklQVCkgLS1kZXgtZmlsZT0kQCAtLWFwaS1mbGFncz0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9GTEFHUykgMj4mMSA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nCisgIGVjaG8gImFwcGNvbXBhdCBvdXRwdXQ6IiA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nICYmIFwKKyAgQU5EUk9JRF9MT0dfVEFHUz0iKjplIiAkKEFSVF9WRVJJREVYX0FQUENPTVBBVCkgLS1kZXgtZmlsZT0kQCAyPiYxID4+ICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdC8kKFBSSVZBVEVfTU9EVUxFKS5sb2cKIGVuZGVmCiBhcHBjb21wYXQtZmlsZXMgPSBcCiAgICQoQUFQVDIpIFwKLSAgJChBUlRfVkVSSURFWF9BUFBDT01QQVRfU0NSSVBUKSBcCi0gICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0ZMQUdTKSBcCi0gICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3ZlcmlkZXggXAotICAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9jb3JlX2RleF9pbnRlcm1lZGlhdGVzL2NsYXNzZXMuZGV4IFwKLSAgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvb2FobF9kZXhfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmRleAorICAkKEFSVF9WRVJJREVYX0FQUENPTVBBVCkgXAogZWxzZQogYXBwY29tcGF0LWhlYWRlciA9CiBydW4tYXBwY29tcGF0ID0KQEAgLTM1OTUsNiArMzYxMiw3IEBACiAgICAgJCQoZm9yZWFjaCBmLCQkKG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpKSwkJChjYWxsIHdvcmQtY29sb24sMiwkJChmKSkpIFwKICAgICAkJChmb3JlYWNoIGYsJCQobXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpKSwkJChjYWxsIHdvcmQtY29sb24sMiwkJChmKSkpIFwKICAgICAkJChteV9jb21wYXRfZGlzdF90ZXN0X2RhdGFfJChzdWl0ZSkpKSBcCisgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkFSQ0hfRElSUy4kKG15X3JlZ2lzdGVyX25hbWUpIDo9ICQobXlfY29tcGF0X21vZHVsZV9hcmNoX2Rpcl8kKHN1aXRlKS4kKG15X3JlZ2lzdGVyX25hbWUpKSkgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUElfTUFQX0ZJTEVTICs9ICQkKG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpKSkgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TT09OR19JTlNUQUxMRURfQ09NUEFUSUJJTElUWV9TVVBQT1JUX0ZJTEVTICs9ICQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIFwKICAgJChldmFsIEFMTF9DT01QQVRJQklMSVRZX0RJU1RfRklMRVMgKz0gJCQobXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkpKSBcCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHQubWsgYi9jb3JlL2RleF9wcmVvcHQubWsKaW5kZXggMjZiOGIxNy4uOTA2ZDdmMCAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0Lm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdC5tawpAQCAtMTMsMjUgKzEzLDYgQEAKIGluc3RhbGwtb24tc3lzdGVtLW90aGVyID0gJChmaWx0ZXItb3V0ICQoUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUykgJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUyksJChiYXNlbmFtZSAkKG5vdGRpciAkKGZpbHRlciAkKGZvcmVhY2ggZiwkKFNZU1RFTV9PVEhFUl9PREVYX0ZJTFRFUiksJChUQVJHRVRfT1VUKS8kKGYpKSwkKDEpKSkpKQogZW5kaWYKIAotIyBXZSB3YW50IHRvIGluc3RhbGwgdGhlIHByb2ZpbGUgZXZlbiBpZiB3ZSBhcmUgbm90IHVzaW5nIHByZW9wdCBzaW5jZSBpdCBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZQotIyB0aGUgaW1hZ2Ugb24gdGhlIGRldmljZS4KLUFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChERVhQUkVPUFRfSU1BR0VfUFJPRklMRV9CVUlMVF9JTlNUQUxMRUQpLCQoUFJPRFVDVF9PVVQpKQotCi0jIEluc3RhbGwgYm9vdCBpbWFnZXMuIE5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUuCi1teV9ib290X2ltYWdlX2FyY2ggOj0gVEFSR0VUX0FSQ0gKLW15X2Jvb3RfaW1hZ2Vfb3V0IDo9ICQoUFJPRFVDVF9PVVQpCi1teV9ib290X2ltYWdlX3N5bXMgOj0gJChUQVJHRVRfT1VUX1VOU1RSSVBQRUQpCi1ERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSA6PSBcCi0gICQoZm9yZWFjaCBteV9ib290X2ltYWdlX25hbWUsJChERVhQUkVPUFRfSU1BR0VfTkFNRVMpLCQoc3RyaXAgXAotICAgICQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2xpYmFydC5taykgXAotICAgICQobXlfYm9vdF9pbWFnZV9tb2R1bGUpKSkKLWlmZGVmIFRBUkdFVF8yTkRfQVJDSAotICBteV9ib290X2ltYWdlX2FyY2ggOj0gVEFSR0VUXzJORF9BUkNICi0gIDJORF9ERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSA6PSBcCi0gICAgJChmb3JlYWNoIG15X2Jvb3RfaW1hZ2VfbmFtZSwkKERFWFBSRU9QVF9JTUFHRV9OQU1FUyksJChzdHJpcCBcCi0gICAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnQubWspIFwKLSAgICAgICQobXlfYm9vdF9pbWFnZV9tb2R1bGUpKSkKLWVuZGlmCiAjIEluc3RhbGwgYm9vdCBpbWFnZXMgZm9yIHRlc3Rpbmcgb24gaG9zdC4gV2UgZXhjbHVkZSBmcmFtZXdvcmsgaW1hZ2UgYXMgaXQgaXMgbm90IHBhcnQgb2YgYXJ0IG1hbmlmZXN0LgogbXlfYm9vdF9pbWFnZV9hcmNoIDo9IEhPU1RfQVJDSAogbXlfYm9vdF9pbWFnZV9vdXQgOj0gJChIT1NUX09VVCkKZGlmZiAtLWdpdCBhL2NvcmUvZGV4X3ByZW9wdF9jb25maWcubWsgYi9jb3JlL2RleF9wcmVvcHRfY29uZmlnLm1rCmluZGV4IGQ1MWRlMzMuLmYxZTlmYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdF9jb25maWcubWsKKysrIGIvY29yZS9kZXhfcHJlb3B0X2NvbmZpZy5tawpAQCAtMSw0ICsxLDQgQEAKLURFWF9QUkVPUFRfQ09ORklHIDo9ICQoU09PTkdfT1VUX0RJUikvZGV4cHJlb3B0LmNvbmZpZworREVYX1BSRU9QVF9DT05GSUcgOj0gJChTT09OR19PVVRfRElSKS9kZXhwcmVvcHQke0NPVkVSQUdFX1NVRkZJWH0uY29uZmlnCiAKIEVOQUJMRV9QUkVPUFQgOj0gdHJ1ZQogRU5BQkxFX1BSRU9QVF9CT09UX0lNQUdFUyA6PSB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rIGIvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5tawppbmRleCAwOGUyZGEzLi5lNzA4NmI3IDEwMDY0NAotLS0gYS9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKQEAgLTUwNCw4ICs1MDQsOCBAQAogICBfc3lzdGVtX290aGVyIDo9ICQoc3RyaXAgJChpZiAkKHN0cmlwICQoQk9BUkRfVVNFU19TWVNURU1fT1RIRVJfT0RFWCkpLCBcCiAgICAgJChpZiAkKHN0cmlwICQoU0FOSVRJWkVfTElURSkpLCwgXAogICAgICAgJChpZiAkKGZpbHRlciAkKF9kZXhuYW1lKSwkKFBST0RVQ1RfREVYUFJFT1BUX1NQRUVEX0FQUFMpKSQoZmlsdGVyICQoX2RleG5hbWUpLCQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMpKSwsIFwKLSAgICAgICAgJChpZiAkKHN0cmlwICQoZm9yZWFjaCBteWZpbHRlciwkKFNZU1RFTV9PVEhFUl9PREVYX0ZJTFRFUiksJChmaWx0ZXIgc3lzdGVtLyQobXlmaWx0ZXIpLCQoX2RleGxvY2F0aW9uKSkpKSwgXAotICAgICAgICAgIHN5c3RlbV9vdGhlci8pKSkpKQorICAgICAgICAkKGlmICQoc3RyaXAgJChmb3JlYWNoIG15ZmlsdGVyLCQoU1lTVEVNX09USEVSX09ERVhfRklMVEVSKSwkKGZpbHRlciBzeXN0ZW0vJChteWZpbHRlciksJChfZGV4bG9jYXRpb24pKSQoZmlsdGVyICQobXlmaWx0ZXIpLCQoX2RleGxvY2F0aW9uKSkpKSwgXAorICAgICAgICAgICAgc3lzdGVtX290aGVyLykpKSkpCiAgICMgX2RleGRpciBoYXMgYSB0cmFpbGluZyAvCiAgIF9kZXhkaXIgOj0gJChfc3lzdGVtX290aGVyKSQoZGlyICQoX2RleGxvY2F0aW9uKSkKICAgbXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cyA6PSAkKHNvcnQgXApkaWZmIC0tZ2l0IGEvY29yZS9kdW1wY29uZmlnLm1rIGIvY29yZS9kdW1wY29uZmlnLm1rCmluZGV4IDY0MGZlMTAuLmViNGM4MjIgMTAwNjQ0Ci0tLSBhL2NvcmUvZHVtcGNvbmZpZy5taworKysgYi9jb3JlL2R1bXBjb25maWcubWsKQEAgLTU2LDcgKzU2LDcgQEAKIAogIyBFc2NhcGUgcXVvdGF0aW9uIG1hcmtzIGZvciBDU1YsIGFuZCB3cmFwcyBpbiBxdW90YXRpb24gbWFya3MuCiBkZWZpbmUgZXNjYXBlLWZvci1jc3YKLSIkKHN1YnN0ICIsIiIsJDEpIgorIiQoc3Vic3QgIiwiIiwkKHN1YnN0ICQobmV3bGluZSksICwkMSkpIgogZW5kZWYKIAogIyBBcmdzOgpAQCAtNjgsNyArNjgsNyBAQAogIyBBcmdzOgogIyAgICQoMSk6IGluY2x1ZGUgc3RhY2sKIGRlZmluZSBkdW1wLWltcG9ydC1kb25lCi0kKGV2YWwgJChmaWxlID4+ICQoRFVNUENPTkZJR19GSUxFKSxpbXBvcnRlZCwkKHN0cmlwICQoMSkpKSkKKyQoZXZhbCAkKGZpbGUgPj4gJChEVU1QQ09ORklHX0ZJTEUpLGltcG9ydGVkLCQoc3RyaXAgJCgxKSksJChmaWx0ZXItb3V0ICQoMSksJChNQUtFRklMRV9MSVNUKSkpKQogZW5kZWYKIAogIyBBcmdzOgpkaWZmIC0tZ2l0IGEvY29yZS9lbnZzZXR1cC5tayBiL2NvcmUvZW52c2V0dXAubWsKaW5kZXggOTNjZWM2NC4uYzA2M2Y2MCAxMDA2NDQKLS0tIGEvY29yZS9lbnZzZXR1cC5taworKysgYi9jb3JlL2VudnNldHVwLm1rCkBAIC01MCwxMyArNTAsNiBAQAogIyBSZWxlYXNlIGNvbmZpZwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcmVsZWFzZV9jb25maWcubWsKIAotIyBTZXQgZGVmYXVsdCB2YWx1ZSBvZiBLRUVQX1ZOREsuCi1pZmVxICgkKFJFTEVBU0VfREVQUkVDQVRFX1ZOREspLHRydWUpCi0gIEtFRVBfVk5ESyA/PSBmYWxzZQotZWxzZQotICBLRUVQX1ZOREsgPz0gdHJ1ZQotZW5kaWYKLQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgU2V0IHVwIHZlcnNpb24gaW5mb3JtYXRpb24KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3ZlcnNpb25fdXRpbC5tawpkaWZmIC0tZ2l0IGEvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rIGIvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rCmluZGV4IGZlY2Y0ZjYuLjJhNzZjOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5taworKysgYi9jb3JlL2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKQEAgLTExMCw0ICsxMTAsNiBAQAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKG15X2NvdmVyYWdlX3BhdGgpLyQoR0NOT19BUkNISVZFKQogZW5kaWYKIAorJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUVYRUNVVEFCTEUpKQorCiBlbmRpZiAgIyBza2lwX2J1aWxkX2Zyb21fc291cmNlCmRpZmYgLS1naXQgYS9jb3JlL2Z1enpfdGVzdC5tayBiL2NvcmUvZnV6el90ZXN0Lm1rCmluZGV4IDhhNGI4YzMuLjExODFjNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnV6el90ZXN0Lm1rCisrKyBiL2NvcmUvZnV6el90ZXN0Lm1rCkBAIC00MywzICs0Myw1IEBACiBlbmRpZgogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUZVWlpfVEVTVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9oZWFkZXJfbGlicmFyeV9pbnRlcm5hbC5tayBiL2NvcmUvaGVhZGVyX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggMzVlZTFiYy4uYTIxYzg1MyAxMDA2NDQKLS0tIGEvY29yZS9oZWFkZXJfbGlicmFyeV9pbnRlcm5hbC5taworKysgYi9jb3JlL2hlYWRlcl9saWJyYXJ5X2ludGVybmFsLm1rCkBAIC0xOSwzICsxOSw1IEBACiAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKToKIAkkKGhpZGUpIHRvdWNoICRACisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1IRUFERVJfTElCUkFSWSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5tawppbmRleCAyZmY5ZmYyLi43Yzc5YTFlIDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5taworKysgYi9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5tawpAQCAtNTcsNCArNTcsNiBAQAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGFsbF9vYmplY3RzKSAkKGFsbF9saWJyYXJpZXMpICQoQ0xBTkdfQ1hYKQogCSQodHJhbnNmb3JtLWhvc3Qtby10by1leGVjdXRhYmxlKQogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9FWEVDVVRBQkxFKSkKKwogZW5kaWYgICMgc2tpcF9idWlsZF9mcm9tX3NvdXJjZQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X2phdmFfbGlicmFyeS5tayBiL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsKaW5kZXggZDQ1ZGE0OC4uNjUyZWIwZSAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL2hvc3RfamF2YV9saWJyYXJ5Lm1rCkBAIC0xMjQsMyArMTI0LDUgQEAKIGlmZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCiBlbmRpZgorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9KQVZBX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9wcmVidWlsdC5tayBiL2NvcmUvaG9zdF9wcmVidWlsdC5tawppbmRleCA3OWYzZmZhLi43ZGM2NzA0IDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfcHJlYnVpbHQubWsKKysrIGIvY29yZS9ob3N0X3ByZWJ1aWx0Lm1rCkBAIC0xNywzICsxNyw1IEBACiAkKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLEhPU1RfUFJFQlVJTFQpCiBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCiBpbmNsdWRlICQoQlVJTERfTVVMVElfUFJFQlVJTFQpCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1IT1NUX1BSRUJVSUxUKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggYWU4Yjc5OC4uMjJhMDJkNCAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCisrKyBiL2NvcmUvaG9zdF9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtNTMsNCArNTMsNiBAQAogICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQogCSQodHJhbnNmb3JtLWhvc3Qtby10by1zaGFyZWQtbGliKQogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9TSEFSRURfTElCUkFSWSkpCisKIGVuZGlmICAjIHNraXBfYnVpbGRfZnJvbV9zb3VyY2UKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tayBiL2NvcmUvaG9zdF9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tawppbmRleCAzOTQ2YWE3Li4wNzljNDVlIDEwMDY0NAotLS0gYS9jb3JlL2hvc3Rfc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9ob3N0X3N0YXRpY19saWJyYXJ5X2ludGVybmFsLm1rCkBAIC0yMywzICsyMyw1IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYnVpbHRfd2hvbGVfbGlicmFyaWVzKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGFsbF9vYmplY3RzKQogCSQodHJhbnNmb3JtLWhvc3Qtby10by1zdGF0aWMtbGliKQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9TVEFUSUNfTElCUkFSWSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rIGIvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rCmluZGV4IDU0OTEyNDcuLjQ5NTllZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5zdGFsbF9qbmlfbGlic19pbnRlcm5hbC5taworKysgYi9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsKQEAgLTM4LDggKzM4LDkgQEAKICAgICAgICQoZXJyb3IgTE9DQUxfU0RLX1ZFUlNJT04gbXVzdCBiZSBkZWZpbmVkIHdpdGggTE9DQUxfTkRLX1NUTF9WQVJJQU5ULCBcCiAgICAgICAgICAgTE9DQUxfUEFDS0FHRV9OQU1FPSQoTE9DQUxfUEFDS0FHRV9OQU1FKSkKICAgICBlbmRpZgorICAgIG15X2xpYmN4eF9hcmNoIDo9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVBSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUikKICAgICBteV9qbmlfc2hhcmVkX2xpYnJhcmllcyArPSBcCi0gICAgICAgICQoSElTVE9SSUNBTF9OREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9OREtfVkVSU0lPTikvc291cmNlcy9jeHgtc3RsL2xsdm0tbGliYysrL2xpYnMvJChUQVJHRVRfJChteV8ybmRfYXJjaF9wcmVmaXgpQ1BVX0FCSSkvbGliYysrX3NoYXJlZC5zbworICAgICAgICAkKExMVk1fUFJFQlVJTFRTX0JBU0UpLyQoQlVJTERfT1MpLXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pL2FuZHJvaWRfbGliYysrL25kay8kKG15X2xpYmN4eF9hcmNoKS9saWIvbGliYysrX3NoYXJlZC5zbwogICBlbmRpZgogCiAgICMgU2V0IHRoZSBhYmkgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGxvY2FsIEpOSSBzaGFyZWQgbGlicmFyaWVzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2NvbW1vbi5tayBiL2NvcmUvamF2YV9jb21tb24ubWsKaW5kZXggNjVmZWIxNS4uYTIxZjA2MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhX2NvbW1vbi5taworKysgYi9jb3JlL2phdmFfY29tbW9uLm1rCkBAIC0zMiw2ICszMiw4IEBACiAgICAgZWxzZSBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfVVNFX1BSRUJVSUxUX1NES1MpKQogICAgICAgIyBUT0RPKGNjcm9zcyk6IGFsbG93IDEuOSBmb3IgY3VycmVudCBhbmQgdW5idW5kbGVkIG9uY2Ugd2UgaGF2ZSBTREsgc3lzdGVtIG1vZHVsZXMKICAgICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxLjgKKyAgICBlbHNlIGlmZXEgKCQoRVhQRVJJTUVOVEFMX1RBUkdFVF9KQVZBX1ZFUlNJT05fMjEpLHRydWUpCisgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMjEKICAgICBlbHNlCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMTcKICAgICBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2xpYnJhcnkubWsgYi9jb3JlL2phdmFfbGlicmFyeS5tawppbmRleCAzYWMwM2RjLi45N2NlOTJjIDEwMDY0NAotLS0gYS9jb3JlL2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL2phdmFfbGlicmFyeS5tawpAQCAtODgsMyArODgsNSBAQAogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoY29tbW9uX2phdmFsaWIuamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQogCiBlbmRpZiAjICFMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1KQVZBX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCA0NjM5M2FjLi40YjZlZWE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmFfcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9qYXZhX3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC0xNzIsNiArMTcyLDEyIEBACiBlbmRpZgogZW5kaWYKIAorIyB0cmFuc2l0aXZlLXJlcy1wYWNrYWdlcyBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgU29vbmcgbW9kdWxlcyBmb3Igbm93LCBidXQgbmVlZHMKKyMgdG8gZXhpc3Qgc28gdGhhdCBvdGhlciBNYWtlIG1vZHVsZXMgY2FuIGRlcGVuZCBvbiBpdC4gIENyZWF0ZSBhbiBlbXB0eSBmaWxlLgorbXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvdHJhbnNpdGl2ZS1yZXMtcGFja2FnZXMKKyQobXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMpOgorCXRvdWNoICRACisKIG15X3Jlc19wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3BhY2thZ2UtcmVzLmFwawogCiAjIFdlIG5lZWRlZCBvbmx5IHZlcnkgZmV3IFBSSVZBVEUgdmFyaWFibGVzIGFuZCBhYXB0Mi5tayBpbnB1dCB2YXJpYWJsZXMuIFJlc2V0IHRoZSB1bm5lY2Vzc2FyeSBvbmVzLgpkaWZmIC0tZ2l0IGEvY29yZS9sYXlvdXRsaWJfZGF0YS5tayBiL2NvcmUvbGF5b3V0bGliX2RhdGEubWsKaW5kZXggZTQ1ZjdlZi4uZTQyMGEwMCAxMDA2NDQKLS0tIGEvY29yZS9sYXlvdXRsaWJfZGF0YS5taworKysgYi9jb3JlL2xheW91dGxpYl9kYXRhLm1rCkBAIC02NiwxMSArNjYsMTkgQEAKICMgUmVzb3VyY2UgZmlsZXMgZnJvbSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzCiBMQVlPVVRMSUJfUkVTIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGxheW91dGxpYi1yZXMsSE9TVCxDT01NT04pCiBMQVlPVVRMSUJfUkVTX0ZJTEVTIDo9ICQoc2hlbGwgZmluZCBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzIC10eXBlIGYgLW5vdCAtcGF0aCAnZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbVtuY11jKicgfCBzb3J0KQotJChMQVlPVVRMSUJfUkVTKS9sYXlvdXRsaWItcmVzLnppcDogJChTT09OR19aSVApICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyICQoTEFZT1VUTElCX1JFU19GSUxFUykKK0VNVUxBVEVEX09WRVJMQVlTX0ZJTEVTIDo9ICQoc2hlbGwgZmluZCBmcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvb3ZlcmxheXMvKi9yZXMvIHwgc29ydCkKK0RFVklDRV9PVkVSTEFZU19GSUxFUyA6PSAkKHNoZWxsIGZpbmQgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvcGhvbmUvb3ZlcmxheS9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvb3ZlcmxheXMvKi9BbmRyb2lkT3ZlcmxheS9yZXMvIHwgc29ydCkKKyQoTEFZT1VUTElCX1JFUykvbGF5b3V0bGliLXJlcy56aXA6ICQoU09PTkdfWklQKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0MiAkKExBWU9VVExJQl9SRVNfRklMRVMpICQoRU1VTEFURURfT1ZFUkxBWVNfRklMRVMpICQoREVWSUNFX09WRVJMQVlTX0ZJTEVTKQogCXJtIC1yZiAkQAotCWVjaG8gJChMQVlPVVRMSUJfUkVTX0ZJTEVTKSA+ICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3QudHh0Ci0JJChTT09OR19aSVApIC1DIGZyYW1ld29ya3MvYmFzZS9jb3JlL3JlcyAtbCAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0LnR4dCAtbyAkKExBWU9VVExJQl9SRVMpL3RlbXAuemlwCi0Jcm0gLXJmICQoTEFZT1VUTElCX1JFUykvZGF0YSAmJiB1bnppcCAtcSAtZCAkKExBWU9VVExJQl9SRVMpL2RhdGEgJChMQVlPVVRMSUJfUkVTKS90ZW1wLnppcAorCWVjaG8gJChMQVlPVVRMSUJfUkVTX0ZJTEVTKSA+ICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3RfcmVzLnR4dAorCSQoU09PTkdfWklQKSAtQyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMgLWwgJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdF9yZXMudHh0IC1vICQoTEFZT1VUTElCX1JFUykvdGVtcF9yZXMuemlwCisJZWNobyAkKEVNVUxBVEVEX09WRVJMQVlTX0ZJTEVTKSA+ICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3RfZW11bGF0ZWRfb3ZlcmxheXMudHh0CisJJChTT09OR19aSVApIC1DIGZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcyAtbCAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0X2VtdWxhdGVkX292ZXJsYXlzLnR4dCAtbyAkKExBWU9VVExJQl9SRVMpL3RlbXBfZW11bGF0ZWRfb3ZlcmxheXMuemlwCisJZWNobyAkKERFVklDRV9PVkVSTEFZU19GSUxFUykgPiAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0X2RldmljZV9vdmVybGF5cy50eHQKKwkkKFNPT05HX1pJUCkgLUMgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvcGhvbmUvb3ZlcmxheS9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMgLWwgJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdF9kZXZpY2Vfb3ZlcmxheXMudHh0IC1vICQoTEFZT1VUTElCX1JFUykvdGVtcF9kZXZpY2Vfb3ZlcmxheXMuemlwCisJcm0gLXJmICQoTEFZT1VUTElCX1JFUykvZGF0YSAmJiB1bnppcCAtcSAtZCAkKExBWU9VVExJQl9SRVMpL2RhdGEgJChMQVlPVVRMSUJfUkVTKS90ZW1wX3Jlcy56aXAKKwl1bnppcCAtcSAtZCAkKExBWU9VVExJQl9SRVMpL2RhdGEgJChMQVlPVVRMSUJfUkVTKS90ZW1wX2VtdWxhdGVkX292ZXJsYXlzLnppcAorCXVuemlwIC1xIC1kICQoTEFZT1VUTElCX1JFUykvZGF0YSAkKExBWU9VVExJQl9SRVMpL3RlbXBfZGV2aWNlX292ZXJsYXlzLnppcAogCXJtIC1yZiAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkICYmIG1rZGlyICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQgJiYgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWFwdDIgY29tcGlsZSAkKExBWU9VVExJQl9SRVMpL2RhdGEvcmVzLyoqLyouOS5wbmcgLW8gJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZAogCXByaW50ZiAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz5cbjxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5nb29nbGUuYW5kcm9pZC5sYXlvdXRsaWIiIC8+JyA+ICQoTEFZT1VUTElCX1JFUykvQW5kcm9pZE1hbmlmZXN0LnhtbAogCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyIGxpbmsgLVIgJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZC8qIC1vICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQuYXBrIC0tbWFuaWZlc3QgJChMQVlPVVRMSUJfUkVTKS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC03OCw3ICs4Niw3IEBACiAJZm9yIGYgaW4gJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZF9hcGsvcmVzLyo7IGRvIG12ICIkJGYiICIkJHtmLy12NC99Ijtkb25lCiAJZm9yIGYgaW4gJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZF9hcGsvcmVzLyoqLyouOS5wbmc7IGRvIG12ICIkJGYiICIkJHtmLy45LnBuZy8uY29tcGlsZWQuOS5wbmd9Ijtkb25lCiAJY3AgLXIgJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZF9hcGsvcmVzICQoTEFZT1VUTElCX1JFUykvZGF0YQotCSQoU09PTkdfWklQKSAtQyAkKExBWU9VVExJQl9SRVMpL2RhdGEgLUQgJChMQVlPVVRMSUJfUkVTKS9kYXRhL3JlcyAtbyAkQAorCSQoU09PTkdfWklQKSAtQyAkKExBWU9VVExJQl9SRVMpL2RhdGEgLUQgJChMQVlPVVRMSUJfUkVTKS9kYXRhLyAtbyAkQAogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsbGF5b3V0bGliLCQoTEFZT1VUTElCX1JFUykvbGF5b3V0bGliLXJlcy56aXA6bGF5b3V0bGliX25hdGl2ZS9yZXMuemlwKQogCkBAIC0xMzIsMTYgKzE0MCwyNiBAQAogCSAgZWNobyAkKF9wYXRoKSwsLCwsLFksJGYsLCwgPj4gJEA7IFwKIAkpCiAKKwkkKGZvcmVhY2ggZiwkKEVNVUxBVEVEX09WRVJMQVlTX0ZJTEVTKSwgXAorCSAgJChldmFsIF9wYXRoIDo9ICQoc3Vic3QgZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzLGRhdGEsJGYpKSBcCisJICBlY2hvICQoX3BhdGgpLCwsLCwsWSwkZiwsLCA+PiAkQDsgXAorCSkKKworCSQoZm9yZWFjaCBmLCQoREVWSUNFX09WRVJMQVlTX0ZJTEVTKSwgXAorCSAgJChldmFsIF9wYXRoIDo9ICQoc3Vic3QgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvcGhvbmUvb3ZlcmxheS9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMsZGF0YSwkZikpIFwKKwkgIGVjaG8gJChfcGF0aCksLCwsLCxZLCRmLCwsID4+ICRAOyBcCisJKQorCiAuUEhPTlk6IGxheW91dGxpYi1zYm9tCiBsYXlvdXRsaWItc2JvbTogJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbgotJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbjogJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0ICQoR0VOX1NCT00pICQoTEFZT1VUTElCX1NCT00pL3Nib20tbWV0YWRhdGEuY3N2ICQoX2xheW91dGxpYl9mb250X2NvbmZpZ19maWxlcykgJChfbGF5b3V0bGliX2ZvbnRzX2ZpbGVzKSAkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcCAkKF9sYXlvdXRsaWJfa2V5Ym9hcmRfZmlsZXMpICQoTEFZT1VUTElCX1JFU19GSUxFUykKKyQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb246ICQoUFJPRFVDVF9PVVQpL2Fsd2F5c19kaXJ0eV9maWxlLnR4dCAkKEdFTl9TQk9NKSAkKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdiAkKF9sYXlvdXRsaWJfZm9udF9jb25maWdfZmlsZXMpICQoX2xheW91dGxpYl9mb250c19maWxlcykgJChMQVlPVVRMSUJfQlVJTERfUFJPUCkvbGF5b3V0bGliLWJ1aWxkLnByb3AgJChfbGF5b3V0bGliX2tleWJvYXJkX2ZpbGVzKSAkKExBWU9VVExJQl9SRVNfRklMRVMpICQoRU1VTEFURURfT1ZFUkxBWVNfRklMRVMpICQoREVWSUNFX09WRVJMQVlTX0ZJTEVTKQogCXJtIC1yZiAkQAogCSQoR0VOX1NCT00pIC0tb3V0cHV0X2ZpbGUgJEAgLS1tZXRhZGF0YSAkKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdiAtLWJ1aWxkX3ZlcnNpb24gJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIC0tcHJvZHVjdF9tZnIgIiQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpIiAtLW1vZHVsZV9uYW1lICJsYXlvdXRsaWIiIC0tanNvbgogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsbGF5b3V0bGliLCQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb246bGF5b3V0bGliX25hdGl2ZS9zYm9tL2xheW91dGxpYi5zcGR4Lmpzb24pCiAKICMgR2VuZXJhdGUgU0JPTSBvZiBmcmFtZXdvcmtfcmVzLmphciB0aGF0IGlzIGNyZWF0ZWQgaW4gcmVsZWFzZV9sYXlvdXRsaWIuc2guCi0jIFRoZSBnZW5lcmF0ZWQgU0JPTSBjb250YWlucyBwbGFjZWhvbGRlcnMgZm9yIHJlbGVhc2VfbGF5b3RsaWIuc2ggdG8gc3Vic3RpdHV0ZSwgYW5kIHRoZSBwbGFjZWhvbGRlcnMgaW5jbHVkZToKKyMgVGhlIGdlbmVyYXRlZCBTQk9NIGNvbnRhaW5zIHBsYWNlaG9sZGVycyBmb3IgcmVsZWFzZV9sYXlvdXRsaWIuc2ggdG8gc3Vic3RpdHV0ZSwgYW5kIHRoZSBwbGFjZWhvbGRlcnMgaW5jbHVkZToKICMgZG9jdW1lbnQgbmFtZSwgZG9jdW1lbnQgbmFtZXNwYWNlLCBkb2N1bWVudCBjcmVhdGlvbiBpbmZvLCBvcmdhbml6YXRpb24gYW5kIFNIQTEgdmFsdWUgb2YgZnJhbWV3b3JrX3Jlcy5qYXIuCiBHRU5fU0JPTV9GUkFNRVdPUktfUkVTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2dlbmVyYXRlLXNib20tZnJhbWV3b3JrX3JlcwogLlBIT05ZOiBsYXlvdXRsaWItZnJhbWV3b3JrX3Jlcy1zYm9tCmRpZmYgLS1naXQgYS9jb3JlL21haW4ubWsgYi9jb3JlL21haW4ubWsKaW5kZXggNjJmYTUzZC4uNWMyODBkYSAxMDA2NDQKLS0tIGEvY29yZS9tYWluLm1rCisrKyBiL2NvcmUvbWFpbi5tawpAQCAtMzEsOCArMzEsNyBAQAogLktBVElfUkVBRE9OTFkgOj0gJChmb3JlYWNoIG4sJChTT09OR19DT05GSUdfTkFNRVNQQUNFUyksU09PTkdfQ09ORklHXyQobikpCiAuS0FUSV9SRUFET05MWSA6PSAkKGZvcmVhY2ggbiwkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSwkKGZvcmVhY2ggaywkKFNPT05HX0NPTkZJR18kKG4pKSxTT09OR19DT05GSUdfJChuKV8kKGspKSkKIAotaW5jbHVkZSAkKFNPT05HX01BS0VWQVJTX01LKQotCitpbmNsdWRlICQoU09PTkdfT1VUX0RJUikvbWFrZV92YXJzLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rCiBZQUNDIDo9JD0gJChCSVNPTikgLWQKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY2xhbmcvY29uZmlnLm1rCkBAIC0yNzYsMTIgKzI3NSwxNSBAQAogIyBJbmNsdWRlIGFsbCBvZiB0aGUgbWFrZWZpbGVzIGluIHRoZSBzeXN0ZW0KICMKIAotc3ViZGlyX21ha2VmaWxlcyA6PSAkKFNPT05HX09VVF9ESVIpL2luc3RhbGxzLSQoVEFSR0VUX1BST0RVQ1QpLm1rICQoU09PTkdfQU5EUk9JRF9NSykKK3N1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19PVVRfRElSKS9pbnN0YWxscy0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS5tayAkKFNPT05HX0FORFJPSURfTUspCisKICMgQW5kcm9pZC5tayBmaWxlcyBhcmUgb25seSB1c2VkIG9uIExpbnV4IGJ1aWxkcywgTWFjIG9ubHkgc3VwcG9ydHMgQW5kcm9pZC5icAogaWZlcSAoJChIT1NUX09TKSxsaW51eCkKICAgc3ViZGlyX21ha2VmaWxlcyArPSAkKGZpbGUgPCQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9BbmRyb2lkLm1rLmxpc3QpCiBlbmRpZgotc3ViZGlyX21ha2VmaWxlcyArPSAkKFNPT05HX09VVF9ESVIpL2xhdGUtJChUQVJHRVRfUFJPRFVDVCkubWsKKworc3ViZGlyX21ha2VmaWxlcyArPSAkKFNPT05HX09VVF9ESVIpL2xhdGUtJChUQVJHRVRfUFJPRFVDVCkkKENPVkVSQUdFX1NVRkZJWCkubWsKKwogc3ViZGlyX21ha2VmaWxlc190b3RhbCA6PSAkKHdvcmRzIGludCAkKHN1YmRpcl9tYWtlZmlsZXMpIHBvc3QgZmluaXNoKQogLktBVElfUkVBRE9OTFkgOj0gc3ViZGlyX21ha2VmaWxlc190b3RhbAogCkBAIC02ODgsMTEgKzY5MCwxOSBAQAogICAgICAgICAgICQoZXZhbCBteV90ZXN0Y2FzZXMgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpKSxcCiAgICAgICAgICAgJChldmFsIG15X3Rlc3RjYXNlcyA6PSAkJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfJChzdWl0ZSkpKSlcCiAgICAgICAgICQoZXZhbCB0YXJnZXQgOj0gJChteV90ZXN0Y2FzZXMpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBwcmVmaXggOj0gLi4vLi4vLi4pCisgICAgICAgICQoaWYgJChzdHJpcCAkKHBhdHN1YnN0ICV4ODYsLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkpKSwgXAorICAgICAgICAgICQoaWYgJChzdHJpcCAkKHBhdHN1YnN0ICV4ODZfNjQsLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkpKSwkKGV2YWwgcHJlZml4IDo9IC4uLy4uKSwpLCkgXAorICAgICAgICAkKGV2YWwgbGlua190YXJnZXQgOj0gJChwcmVmaXgpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBzeW1saW5rIDo9ICQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkvc2hhcmVkX2xpYnMvJChub3RkaXIgJChmKSkpXAorICAgICAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUyA6PSBcCisgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUykgJChmKTokKGxpbmtfdGFyZ2V0KTokKHN5bWxpbmspKVwKICAgICAgICAgJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDKSksLCQoY2FsbCBkZWNsYXJlLWNvcHktdGFyZ2V0LWxpY2Vuc2UtbWV0YWRhdGEsJCh0YXJnZXQpLCQoZikpKVwKICAgICAgICAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyA6PSBcCiAgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSAkKGYpOiQodGFyZ2V0KSlcCiAgICAgICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMgOj0gXAotICAgICAgICAgICQoc29ydCAkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpKSkpKSkKKyAgICAgICAgICAkKHNvcnQgJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSkpKSlcCisgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLlNZTUxJTktTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuU1lNTElOS1MpKSkpCiBlbmRlZgogCiAkKGNhbGwgcmVzb2x2ZS1zaGFyZWQtbGlicy1kZXBlcyxUQVJHRVRfKQpAQCAtMTg1MCw0OCArMTg2MCwzNCBAQAogZmlsdGVyX291dF9maWxlcyArPSAkKFBST0RVQ1RfT1VUKS9yZWNvdmVyeS8lCiBlbmRpZgogCisjIHVzZXJkYXRhLmltZworaWZuZGVmIEJVSUxESU5HX1VTRVJEQVRBX0lNQUdFCitmaWx0ZXJfb3V0X2ZpbGVzICs9ICQoUFJPRFVDVF9PVVQpL2RhdGEvJQorZW5kaWYKKwogaW5zdGFsbGVkX2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlci1vdXQgJChmaWx0ZXJfb3V0X2ZpbGVzKSwkKGZpbHRlciAkKFBST0RVQ1RfT1VUKS8lLCQobW9kdWxlc190b19pbnN0YWxsKSkpKQogZWxzZQogaW5zdGFsbGVkX2ZpbGVzIDo9ICQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcykKIGVuZGlmICAjIFRBUkdFVF9CVUlMRF9BUFBTCiAKLSMgc2JvbS1tZXRhZGF0YS5jc3YgY29udGFpbnMgYWxsIHJhdyBkYXRhIGNvbGxlY3RlZCBpbiBNYWtlIGZvciBnZW5lcmF0aW5nIFNCT00gaW4gZ2VuZXJhdGUtc2JvbS5weS4KLSMgVGhlcmUgYXJlIG11bHRpcGxlIGNvbHVtbnMgYW5kIGVhY2ggaWRlbnRpZmllcyB0aGUgc291cmNlIG9mIGFuIGluc3RhbGxlZCBmaWxlIGZvciBhIHNwZWNpZmljIGNhc2UuCi0jIFRoZSBjb2x1bW5zIGFuZCB0aGVpciB1c2VzIGFyZSBkZXNjcmliZWQgYXMgYmVsb3c6Ci0jICAgaW5zdGFsbGVkX2ZpbGU6IHRoZSBmaWxlIHBhdGggb24gZGV2aWNlLCBlLmcuIC9wcm9kdWN0L2FwcC9Ccm93c2VyMi9Ccm93c2VyMi5hcGsKLSMgICBtb2R1bGVfcGF0aDogdGhlIHBhdGggb2YgdGhlIG1vZHVsZSB0aGF0IGdlbmVyYXRlcyB0aGUgaW5zdGFsbGVkIGZpbGUsIGUuZy4gcGFja2FnZXMvYXBwcy9Ccm93c2VyMgotIyAgIHNvb25nX21vZHVsZV90eXBlOiBTb29uZyBtb2R1bGUgdHlwZSwgZS5nLiBhbmRyb2lkX2FwcCwgY2NfYmluYXJ5Ci0jICAgaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGU6IFksIGlmIHRoZSBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIGEgcHJlYnVpbHQgTWFrZSBtb2R1bGUsIHNlZSBwcmVidWlsdF9pbnRlcm5hbC5tawotIyAgIHByb2R1Y3RfY29weV9maWxlczogdGhlIGluc3RhbGxlZCBmaWxlIGlzIGZyb20gdmFyaWFibGUgUFJPRFVDVF9DT1BZX0ZJTEVTLCBlLmcuIGRldmljZS9nb29nbGUvY3V0dGxlZmlzaC9zaGFyZWQvY29uZmlnL2luaXQucHJvZHVjdC5yYzpwcm9kdWN0L2V0Yy9pbml0L2luaXQucmMKLSMgICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXM6IHRoZSBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIHZhcmlhYmxlIEtFUk5FTF9NT0RVTEVfQ09QWV9GSUxFUywgc2ltaWxhciB0byBwcm9kdWN0X2NvcHlfZmlsZXMKLSMgICBpc19wbGF0Zm9ybV9nZW5lcmF0ZWQ6IHRoaXMgaXMgYW4gYWdncmVnYXRlZCB2YWx1ZSBpbmNsdWRpbmcgc29tZSBzbWFsbCBjYXNlcyBpbnN0ZWFkIG9mIGFkZGluZyBtb3JlIGNvbHVtbnMuIEl0IGlzIHNldCB0byBZIGlmIGFueSBjYXNlIGlzIFkKLSMgICAgICAgaXNfYnVpbGRfcHJvcDogYnVpbGQucHJvcCBpbiBlYWNoIHBhcnRpdGlvbiwgc2VlIHN5c3Byb3AubWsuCi0jICAgICAgIGlzX25vdGljZV9maWxlOiBOT1RJQ0UueG1sLmd6IGluIGVhY2ggcGFydGl0aW9uLCBzZWUgTWFrZWZpbGUuCi0jICAgICAgIGlzX2RleHByZW9wdF9pbWFnZV9wcm9maWxlOiBzZWUgdGhlIHVzYWdlIG9mIERFWFBSRU9QVF9JTUFHRV9QUk9GSUxFX0JVSUxUX0lOU1RBTExFRCBpbiBTb29uZyBhbmQgTWFrZQotIyAgICAgICBpc19wcm9kdWN0X3N5c3RlbV9vdGhlcl9hdmJrZXk6IHNlZSBJTlNUQUxMRURfUFJPRFVDVF9TWVNURU1fT1RIRVJfQVZCS0VZX1RBUkdFVAotIyAgICAgICBpc19zeXN0ZW1fb3RoZXJfb2RleF9tYXJrZXI6IHNlZSBJTlNUQUxMRURfU1lTVEVNX09USEVSX09ERVhfTUFSS0VSCi0jICAgICAgIGlzX2V2ZW50X2xvZ190YWdzX2ZpbGU6IHNlZSB2YXJpYWJsZSBldmVudF9sb2dfdGFnc19maWxlIGluIE1ha2VmaWxlCi0jICAgICAgIGlzX2tlcm5lbF9tb2R1bGVzX2Jsb2NrbGlzdDogbW9kdWxlcy5ibG9ja2xpc3QgY3JlYXRlZCBmb3IgX2Rsa20gcGFydGl0aW9ucywgc2VlIG1hY3JvIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpciBpbiBNYWtlZmlsZS4KLSMgICAgICAgaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrOiBCdWlsZE1hbmlmZXN0PHBhcnQ+LmFwayBmaWxlcyBmb3Igc3lzdGVtIGFuZCBzeXN0ZW1fZXh0IHBhcnRpdGlvbiwgc2VlIEFMTF9GU1ZFUklUWV9CVUlMRF9NQU5JRkVTVF9BUEsgaW4gTWFrZWZpbGUuCi0jICAgICAgIGlzX2xpbmtlcl9jb25maWc6IHNlZSBTWVNURU1fTElOS0VSX0NPTkZJRyBhbmQgdmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSBpbiBNYWtlZmlsZS4KLSMgICBidWlsZF9vdXRwdXRfcGF0aDogdGhlIHBhdGggb2YgdGhlIGJ1aWx0IGZpbGUsIHVzZWQgdG8gY2FsY3VsYXRlIGNoZWNrc3VtCi0jICAgc3RhdGljX2xpYnJhcmllcy93aG9sZV9zdGF0aWNfbGlicmFyaWVzOiBsaXN0IG9mIG1vZHVsZSBuYW1lIG9mIHRoZSBzdGF0aWMgbGlicmFyaWVzIHRoZSBmaWxlIGxpbmtzIGFnYWluc3QsIGUuZy4gbGliY2xhbmdfcnQuYnVpbHRpbnMgb3IgbGliY2xhbmdfcnQuYnVpbHRpbnNfMzIKLSMgICAgICAgSW5mbyBvZiBhbGwgc3RhdGljIGxpYnJhcmllcyBvZiBhbGwgaW5zdGFsbGVkIGZpbGVzIGFyZSBjb2xsZWN0ZWQgaW4gdmFyaWFibGUgX2FsbF9zdGF0aWNfbGlicyB0aGF0IGlzIHVzZWQgdG8gbGlzdCBhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5IGZpbGVzIGluIHNib20tbWV0YWRhdGEuY3N2LgotIyAgICAgICBTZWUgdGhlIHNlY29uZCBmb3JlYWNoIGxvb3AgaW4gdGhlIHJ1bGUgb2Ygc2JvbS1tZXRhZGF0YS5jc3YgZm9yIHRoZSBkZXRhaWxlZCBpbmZvIG9mIHN0YXRpYyBsaWJyYXJpZXMgY29sbGVjdGVkIGluIF9hbGxfc3RhdGljX2xpYnMuCi0jICAgaXNfc3RhdGljX2xpYjogd2hldGhlciB0aGUgZmlsZSBpcyBhIHN0YXRpYyBsaWJyYXJ5Ci0KIG1ldGFkYXRhX2xpc3QgOj0gJChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL01FVEFEQVRBLmxpc3QKIG1ldGFkYXRhX2ZpbGVzIDo9ICQoc3Vic3QgJChuZXdsaW5lKSwkKHNwYWNlKSwkKGZpbGUgPCQobWV0YWRhdGFfbGlzdCkpKQotJChQUk9EVUNUX09VVCkvc2JvbS1tZXRhZGF0YS5jc3Y6CisKKyMgQ3JlYXRlIG1ldGFkYXRhIGZvciBjb21wbGlhbmNlIHN1cHBvcnQgaW4gU29vbmcKKy5QSE9OWTogbWFrZS1jb21wbGlhbmNlLW1ldGFkYXRhCittYWtlLWNvbXBsaWFuY2UtbWV0YWRhdGE6IFwKKyAgICAkKFNPT05HX09VVF9ESVIpL2NvbXBsaWFuY2UtbWV0YWRhdGEvJChUQVJHRVRfUFJPRFVDVCkvbWFrZS1tZXRhZGF0YS5jc3YgXAorICAgICQoU09PTkdfT1VUX0RJUikvY29tcGxpYW5jZS1tZXRhZGF0YS8kKFRBUkdFVF9QUk9EVUNUKS9tYWtlLW1vZHVsZXMuY3N2CisKKyQoU09PTkdfT1VUX0RJUikvY29tcGxpYW5jZS1tZXRhZGF0YS8kKFRBUkdFVF9QUk9EVUNUKS9tYWtlLW1ldGFkYXRhLmNzdjoKIAlybSAtZiAkQAotCWVjaG8gJ2luc3RhbGxlZF9maWxlLG1vZHVsZV9wYXRoLHNvb25nX21vZHVsZV90eXBlLGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLHByb2R1Y3RfY29weV9maWxlcyxrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLGJ1aWxkX291dHB1dF9wYXRoLHN0YXRpY19saWJyYXJpZXMsd2hvbGVfc3RhdGljX2xpYnJhcmllcyxpc19zdGF0aWNfbGliJyA+PiAkQAotCSQoZXZhbCBfYWxsX3N0YXRpY19saWJzIDo9KQorCWVjaG8gJ2luc3RhbGxlZF9maWxlLG1vZHVsZV9wYXRoLGlzX3Nvb25nX21vZHVsZSxpc19wcmVidWlsdF9tYWtlX21vZHVsZSxwcm9kdWN0X2NvcHlfZmlsZXMsa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzLGlzX3BsYXRmb3JtX2dlbmVyYXRlZCxzdGF0aWNfbGlicyx3aG9sZV9zdGF0aWNfbGlicyxsaWNlbnNlX3RleHQnID4+ICRACiAJJChmb3JlYWNoIGYsJChpbnN0YWxsZWRfZmlsZXMpLFwKIAkgICQoZXZhbCBfbW9kdWxlX25hbWUgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmKSkgXAogCSAgJChldmFsIF9wYXRoX29uX2RldmljZSA6PSAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkZikpIFwKIAkgICQoZXZhbCBfYnVpbGRfb3V0cHV0X3BhdGggOj0gJChQUk9EVUNUX09VVCkvJChfcGF0aF9vbl9kZXZpY2UpKSBcCiAJICAkKGV2YWwgX21vZHVsZV9wYXRoIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlBBVEgpKSkpIFwKLQkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpKSkpIFwKKwkgICQoZXZhbCBfaXNfc29vbmdfbW9kdWxlIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLklTX1NPT05HX01PRFVMRSkpIFwKIAkgICQoZXZhbCBfaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUgOj0gJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuSVNfUFJFQlVJTFRfTUFLRV9NT0RVTEUpKSBcCiAJICAkKGV2YWwgX3Byb2R1Y3RfY29weV9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJTokKF9wYXRoX29uX2RldmljZSksJChwcm9kdWN0X2NvcHlfZmlsZXNfd2l0aG91dF9vd25lcikpKSkgXAogCSAgJChldmFsIF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgOj0gJChzb3J0ICQoZmlsdGVyICUkKF9wYXRoX29uX2RldmljZSksJChLRVJORUxfTU9EVUxFX0NPUFlfRklMRVMpKSkpIFwKQEAgLTE5MDgsMzkgKzE5MDQsNDAgQEAKIAkgICQoZXZhbCBfaXNfZmxhZ3NfZmlsZSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwgJChBTExfRkxBR1NfRklMRVMpKSxZKSkgXAogCSAgJChldmFsIF9pc19yb290ZGlyX3N5bWxpbmsgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsICQoQUxMX1JPT1RESVJfU1lNTElOS1MpKSxZKSkgXAogCSAgJChldmFsIF9pc19wbGF0Zm9ybV9nZW5lcmF0ZWQgOj0gJChfaXNfYnVpbGRfcHJvcCkkKF9pc19ub3RpY2VfZmlsZSkkKF9pc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZSkkKF9pc19wcm9kdWN0X3N5c3RlbV9vdGhlcl9hdmJrZXkpJChfaXNfZXZlbnRfbG9nX3RhZ3NfZmlsZSkkKF9pc19zeXN0ZW1fb3RoZXJfb2RleF9tYXJrZXIpJChfaXNfa2VybmVsX21vZHVsZXNfYmxvY2tsaXN0KSQoX2lzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwaykkKF9pc19saW5rZXJfY29uZmlnKSQoX2lzX3BhcnRpdGlvbl9jb21wYXRfc3ltbGluaykkKF9pc19mbGFnc19maWxlKSQoX2lzX3Jvb3RkaXJfc3ltbGluaykpIFwKLQkgICQoZXZhbCBfc3RhdGljX2xpYnMgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmLlNUQVRJQ19MSUJSQVJJRVMpKSBcCi0JICAkKGV2YWwgX3dob2xlX3N0YXRpY19saWJzIDo9ICQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSkgXAotCSAgJChmb3JlYWNoIGwsJChfc3RhdGljX2xpYnMpLCQoZXZhbCBfYWxsX3N0YXRpY19saWJzICs9ICRsOiQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJGwuUEFUSCkpKTokKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiRsLlNPT05HX01PRFVMRV9UWVBFKSkpOiQoQUxMX1NUQVRJQ19MSUJSQVJJRVMuJGwuQlVJTFRfRklMRSkpKSBcCi0JICAkKGZvcmVhY2ggbCwkKF93aG9sZV9zdGF0aWNfbGlicyksJChldmFsIF9hbGxfc3RhdGljX2xpYnMgKz0gJGw6JChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kbC5QQVRIKSkpOiQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJGwuU09PTkdfTU9EVUxFX1RZUEUpKSk6JChBTExfU1RBVElDX0xJQlJBUklFUy4kbC5CVUlMVF9GSUxFKSkpIFwKLQkgIGVjaG8gJy8kKF9wYXRoX29uX2RldmljZSksJChfbW9kdWxlX3BhdGgpLCQoX3Nvb25nX21vZHVsZV90eXBlKSwkKF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSksJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSwkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpLCQoX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCksJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoX3N0YXRpY19saWJzKSwkKF93aG9sZV9zdGF0aWNfbGlicyksJyA+PiAkQDsgXAotCSkKLQkkKGZvcmVhY2ggbCwkKHNvcnQgJChfYWxsX3N0YXRpY19saWJzKSksIFwKLQkgICQoZXZhbCBfbGliX3N0ZW0gOj0gJChjYWxsIHdvcmQtY29sb24sMSwkbCkpIFwKLQkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChjYWxsIHdvcmQtY29sb24sMiwkbCkpIFwKLQkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChjYWxsIHdvcmQtY29sb24sMywkbCkpIFwKLQkgICQoZXZhbCBfYnVpbHRfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiw0LCRsKSkgXAotCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKEFMTF9TVEFUSUNfTElCUkFSSUVTLiRsLlNUQVRJQ19MSUJSQVJJRVMpKSBcCi0JICAkKGV2YWwgX3dob2xlX3N0YXRpY19saWJzIDo9ICQoQUxMX1NUQVRJQ19MSUJSQVJJRVMuJGwuV0hPTEVfU1RBVElDX0xJQlJBUklFUykpIFwKLQkgICQoZXZhbCBfaXNfc3RhdGljX2xpYiA6PSBZKSBcCi0JICBlY2hvICckKF9saWJfc3RlbSkuYSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkKF9idWlsdF9maWxlKSwkKF9zdGF0aWNfbGlicyksJChfd2hvbGVfc3RhdGljX2xpYnMpLCQoX2lzX3N0YXRpY19saWIpJyA+PiAkQDsgXAorCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKGlmICQoX2lzX3Nvb25nX21vZHVsZSksLCQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5TVEFUSUNfTElCUkFSSUVTKSkpIFwKKwkgICQoZXZhbCBfd2hvbGVfc3RhdGljX2xpYnMgOj0gJChpZiAkKF9pc19zb29uZ19tb2R1bGUpLCwkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYuV0hPTEVfU1RBVElDX0xJQlJBUklFUykpKSBcCisJICAkKGV2YWwgX2xpY2Vuc2VfdGV4dCA6PSAkKGlmICQoZmlsdGVyICQoX2J1aWxkX291dHB1dF9wYXRoKSwkKEFMTF9OT05fTU9EVUxFUykpLCQoQUxMX05PTl9NT0RVTEVTLiQoX2J1aWxkX291dHB1dF9wYXRoKS5OT1RJQ0VTKSkpIFwKKwkgIGVjaG8gJyQoX2J1aWxkX291dHB1dF9wYXRoKSwkKF9tb2R1bGVfcGF0aCksJChfaXNfc29vbmdfbW9kdWxlKSwkKF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSksJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSwkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpLCQoX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCksJChfc3RhdGljX2xpYnMpLCQoX3dob2xlX3N0YXRpY19saWJzKSwkKF9saWNlbnNlX3RleHQpJyA+PiAkQDsgXAogCSkKIAotIyAoVE9ETzogYi8yNzIzNTg1ODMgZmluZCBhbm90aGVyIHdheSBvZiBhbHdheXMgcmVidWlsZGluZyBzYm9tLnNwZHgpCiskKFNPT05HX09VVF9ESVIpL2NvbXBsaWFuY2UtbWV0YWRhdGEvJChUQVJHRVRfUFJPRFVDVCkvbWFrZS1tb2R1bGVzLmNzdjoKKwlybSAtZiAkQAorCWVjaG8gJ25hbWUsbW9kdWxlX3BhdGgsbW9kdWxlX2NsYXNzLG1vZHVsZV90eXBlLHN0YXRpY19saWJzLHdob2xlX3N0YXRpY19saWJzLGJ1aWx0X2ZpbGVzLGluc3RhbGxlZF9maWxlcycgPj4gJEAKKwkkKGZvcmVhY2ggbSwkKEFMTF9NT0RVTEVTKSwgXAorCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkbSkgXAorCSAgJChldmFsIF9tb2R1bGVfcGF0aCA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5QQVRIKSkpKSBcCisJICAkKGV2YWwgX21ha2VfbW9kdWxlX2NsYXNzIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLkNMQVNTKSkgXAorCSAgJChldmFsIF9tYWtlX21vZHVsZV90eXBlIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLk1BS0VfTU9EVUxFX1RZUEUpKSBcCisJICAkKGV2YWwgX3N0YXRpY19saWJzIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlNUQVRJQ19MSUJTKSkpKSBcCisJICAkKGV2YWwgX3dob2xlX3N0YXRpY19saWJzIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLldIT0xFX1NUQVRJQ19MSUJTKSkpKSBcCisJICAkKGV2YWwgX2J1aWx0X2ZpbGVzIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLkJVSUxUKSkpKSBcCisJICAkKGV2YWwgX2luc3RhbGxlZF9maWxlcyA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5JTlNUQUxMRUQpKSkpIFwKKwkgICQoZXZhbCBfaXNfc29vbmdfbW9kdWxlIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLklTX1NPT05HX01PRFVMRSkpIFwKKwkgICQoaWYgJChfaXNfc29vbmdfbW9kdWxlKSwsIFwKKwkJZWNobyAnJChfbW9kdWxlX25hbWUpLCQoX21vZHVsZV9wYXRoKSwkKF9tYWtlX21vZHVsZV9jbGFzcyksJChfbWFrZV9tb2R1bGVfdHlwZSksJChfc3RhdGljX2xpYnMpLCQoX3dob2xlX3N0YXRpY19saWJzKSwkKF9idWlsdF9maWxlcyksJChfaW5zdGFsbGVkX2ZpbGVzKScgPj4gJEA7IFwKKwkgICkgXAorCSkKKworJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL2luc3RhbGxlZF9maWxlcy5zdGFtcDogJChpbnN0YWxsZWRfZmlsZXMpCisJdG91Y2ggJEAKKwogIyBSZW1vdmUgdGhlIGFsd2F5c19kaXJ0eV9maWxlLnR4dCB3aGVuZXZlciB0aGUgbWFrZWZpbGUgaXMgZXZhbHVhdGVkCiAkKHNoZWxsIHJtIC1mICQoUFJPRFVDVF9PVVQpL2Fsd2F5c19kaXJ0eV9maWxlLnR4dCkKICQoUFJPRFVDVF9PVVQpL2Fsd2F5c19kaXJ0eV9maWxlLnR4dDoKIAl0b3VjaCAkQAogCiAuUEhPTlk6IHNib20KLWlmZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpLCkKLXNib206ICQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeC5qc29uCi0kKFBST0RVQ1RfT1VUKS9zYm9tLnNwZHguanNvbjogJChQUk9EVUNUX09VVCkvc2JvbS5zcGR4Ci0kKFBST0RVQ1RfT1VUKS9zYm9tLnNwZHg6ICQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2ICQoR0VOX1NCT00pICQoaW5zdGFsbGVkX2ZpbGVzKSAkKG1ldGFkYXRhX2xpc3QpICQobWV0YWRhdGFfZmlsZXMpICQoUFJPRFVDVF9PVVQpL2Fsd2F5c19kaXJ0eV9maWxlLnR4dAotCXJtIC1yZiAkQAotCSQoR0VOX1NCT00pIC0tb3V0cHV0X2ZpbGUgJEAgLS1tZXRhZGF0YSAkKFBST0RVQ1RfT1VUKS9zYm9tLW1ldGFkYXRhLmNzdiAtLWJ1aWxkX3ZlcnNpb24gJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIC0tcHJvZHVjdF9tZnIgIiQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpIiAtLWpzb24KLQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkLCQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeC5qc29uOnNib20vc2JvbS5zcGR4Lmpzb24pCi1lbHNlCitpZm5lcSAoJChUQVJHRVRfQlVJTERfQVBQUyksKQogIyBDcmVhdGUgYnVpbGQgcnVsZXMgZm9yIGdlbmVyYXRpbmcgU0JPTXMgb2YgdW5idW5kbGVkIEFQS3MgYW5kIEFQRVhzCiAjICQxOiBzYm9tIGZpbGUKICMgJDI6IHNib20gZnJhZ21lbnQgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9tdWx0aV9wcmVidWlsdC5tayBiL2NvcmUvbXVsdGlfcHJlYnVpbHQubWsKaW5kZXggYzk3ZDQ4MS4uNDE1NDAxYiAxMDA2NDQKLS0tIGEvY29yZS9tdWx0aV9wcmVidWlsdC5taworKysgYi9jb3JlL211bHRpX3ByZWJ1aWx0Lm1rCkBAIC0xMzIsMyArMTMyLDUgQEAKIHByZWJ1aWx0X3N0YXRpY19qYXZhX2xpYnJhcmllcyA6PQogcHJlYnVpbHRfaXNfaG9zdCA6PQogcHJlYnVpbHRfbW9kdWxlX3RhZ3MgOj0KKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PU1VTFRJX1BSRUJVSUxUKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL25hdGl2ZV90ZXN0Lm1rIGIvY29yZS9uYXRpdmVfdGVzdC5tawppbmRleCA4YjQ5ZmJkLi5jMTJiMjExIDEwMDY0NAotLS0gYS9jb3JlL25hdGl2ZV90ZXN0Lm1rCisrKyBiL2NvcmUvbmF0aXZlX3Rlc3QubWsKQEAgLTIxLDMgKzIxLDUgQEAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9TkFUSVZFX1RFU1QpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbm9kZV9mbnMubWsgYi9jb3JlL25vZGVfZm5zLm1rCmluZGV4IDE0NGViOGIuLmQyY2VlOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvbm9kZV9mbnMubWsKKysrIGIvY29yZS9ub2RlX2Zucy5tawpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICQoY2FsbCBfZXhwYW5kLWluaGVyaXRlZC12YWx1ZXMsJCgxKSwkKDIpLCQoMyksJCg0KSkKIAogICAkKGV2YWwgJCgxKS4kKDIpLmluaGVyaXRlZCA6PSkKLSAgJChldmFsIF9pbmNsdWRlX3N0YWNrIDo9ICQod29yZGxpc3QgMiw5OTk5LCQkKF9pbmNsdWRlX3N0YWNrKSkpCisgICQoZXZhbCBfaW5jbHVkZV9zdGFjayA6PSAkKHdvcmRsaXN0IDIsOTk5OSwkKF9pbmNsdWRlX3N0YWNrKSkpCiBlbmRlZgogCiAjCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsgYi9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsKaW5kZXggYTAzYTYyYi4uYTdlYjU3MiAxMDA2NDQKLS0tIGEvY29yZS9wYWNrYWdlX2ludGVybmFsLm1rCisrKyBiL2NvcmUvcGFja2FnZV9pbnRlcm5hbC5tawpAQCAtNzMxLDMgKzczMSw1IEBACiAgICAgKQogICBlbmRpZgogZW5kaWYKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PVBBQ0tBR0UpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcGFja2FnaW5nL2ZsYWdzLm1rIGIvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsKaW5kZXggZTcxNWZkMS4uYTc3OTU2YiAxMDA2NDQKLS0tIGEvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsKKysrIGIvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsKQEAgLTIyLDU4ICsyMiwzMiBAQAogCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUmVsZWFzZSBDb25maWcgRmxhZ3MKLQotIyBDcmVhdGUgYSBzdW1tYXJ5IGZpbGUgb2YgYnVpbGQgZmxhZ3MgZm9yIGVhY2ggcGFydGl0aW9uCi0jICQoMSk6IGJ1aWx0IGJ1aWxkIGZsYWdzIGpzb24gZmlsZQotIyAkKDIpOiBpbnN0YWxsZWQgYnVpbGQgZmxhZ3MganNvbiBmaWxlCi0jICQoMyk6IGZsYWcgbmFtZXMKLWRlZmluZSBnZW5lcmF0ZS1wYXJ0aXRpb24tYnVpbGQtZmxhZy1maWxlCi0kKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9PVVQgOj0gJChzdHJpcCAkKDEpKSkKLSQoZXZhbCAkKHN0cmlwICQoMSkpOiBQUklWQVRFX0ZMQUdfTkFNRVMgOj0gJChzdHJpcCAkKDMpKSkKLSQoc3RyaXAgJCgxKSk6Ci0JbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKLQllY2hvICd7JyA+ICQkKFBSSVZBVEVfT1VUKQotCWVjaG8gJyJmbGFncyI6IFsnID4+ICQkKFBSSVZBVEVfT1VUKQotCSQkKGZvcmVhY2ggZmxhZywgJCQoUFJJVkFURV9GTEFHX05BTUVTKSwgXAotCQkoIFwKLQkJCXByaW50ZiAnICB7ICJuYW1lIjogIiVzIiwgInZhbHVlIjogIiVzIiwgJyBcCi0JCQkJCSckJChmbGFnKScgXAotCQkJCQknJCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQkKGZsYWcpLlZBTFVFKScgXAotCQkJCQk7IFwKLQkJCXByaW50ZiAnInNldCI6ICIlcyIsICJkZWZhdWx0IjogIiVzIiwgImRlY2xhcmVkIjogIiVzIiB9JyBcCi0JCQkJCSckJChfQUxMX1JFTEVBU0VfRkxBR1MuJCQoZmxhZykuU0VUX0lOKScgXAotCQkJCQknJCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQkKGZsYWcpLkRFRkFVTFQpJyBcCi0JCQkJCSckJChfQUxMX1JFTEVBU0VfRkxBR1MuJCQoZmxhZykuREVDTEFSRURfSU4pJyBcCi0JCQkJCTsgXAotCQkJcHJpbnRmICckJChpZiAkJChmaWx0ZXIgJCQobGFzdHdvcmQgJCQoUFJJVkFURV9GTEFHX05BTUVTKSksJCQoZmxhZykpLCwkJChjb21tYSkpXG4nIDsgXAotCQkpID4+ICQkKFBSSVZBVEVfT1VUKSA7IFwKLQkpCi0JZWNobyAiXSIgPj4gJCQoUFJJVkFURV9PVVQpCi0JZWNobyAifSIgPj4gJCQoUFJJVkFURV9PVVQpCi0kKGNhbGwgY29weS1vbmUtZmlsZSwgJCgxKSwgJCgyKSkKLWVuZGVmCi0KLSQoZm9yZWFjaCBwYXJ0aXRpb24sICQoX0ZMQUdfUEFSVElUSU9OUyksIFwKLQkkKGV2YWwgYnVpbGRfZmxhZ19zdW1tYXJpZXMuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYnVpbGRfZmxhZ3MuanNvbikgXAotCSQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtcGFydGl0aW9uLWJ1aWxkLWZsYWctZmlsZSwgXAotCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2J1aWxkX2ZsYWdzLmpzb24sIFwKLQkJCQkkKGJ1aWxkX2ZsYWdfc3VtbWFyaWVzLiQocGFydGl0aW9uKSksIFwKLQkJCQkkKF9BTExfUkVMRUFTRV9GTEFHUy5QQVJUSVRJT05TLiQocGFydGl0aW9uKSkgXAotCQkJKSBcCi0JKSBcCi0pCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBBY29uZmlnIEZsYWdzCiAKICMgQ3JlYXRlIGEgc3VtbWFyeSBmaWxlIG9mIGJ1aWxkIGZsYWdzIGZvciBlYWNoIHBhcnRpdGlvbgogIyAkKDEpOiBidWlsdCBhY29uZmlnIGZsYWdzIGZpbGUgKG91dCkKICMgJCgyKTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQotIyAkKDMpOiBpbnB1dCBhY29uZmlnIGZpbGVzIGZvciB0aGUgcGFydGl0aW9uIChpbikKKyMgJCgzKTogdGhlIHBhcnRpdGlvbiAoaW4pCisjICQoNCk6IGlucHV0IGFjb25maWcgZmlsZXMgZm9yIHRoZSBwYXJ0aXRpb24gKGluKQogZGVmaW5lIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLWZsYWctZmlsZQogJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgxKSkpCiskKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoNCkpKQorJChzdHJpcCAkKDEpKTogJChBQ09ORklHKSAkKHN0cmlwICQoNCkpCisJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKKwkkJChpZiAkJChQUklWQVRFX0lOKSwgXAorCQkkJChBQ09ORklHKSBkdW1wIC0tZGVkdXAgLS1mb3JtYXQgcHJvdG9idWYgLS1vdXQgJCQoUFJJVkFURV9PVVQpIFwKKwkJCS0tZmlsdGVyIGNvbnRhaW5lcjokJChzdHJpcCAkKDMpKSAkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCisJCWVjaG8gLW4gPiAkJChQUklWQVRFX09VVCkgXAorCSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKDEpLCAkKDIpKQorZW5kZWYKKworIyBDcmVhdGUgYSBzdW1tYXJ5IGZpbGUgb2YgYnVpbGQgZmxhZ3MgZm9yIGVhY2ggcGFydGl0aW9uCisjICQoMSk6IGJ1aWx0IGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQorIyAkKDIpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBmaWxlIChvdXQpCisjICQoMyk6IGlucHV0IGFjb25maWcgZmlsZXMgZm9yIHRoZSBwYXJ0aXRpb24gKGluKQorZGVmaW5lIGdlbmVyYXRlLWdsb2JhbC1hY29uZmlnLWZsYWctZmlsZQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgxKSkpCiAkKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoMykpKQogJChzdHJpcCAkKDEpKTogJChBQ09ORklHKSAkKHN0cmlwICQoMykpCiAJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKQEAgLTkxLDYgKzY1LDcgQEAKIAkkKGV2YWwgJChjYWxsIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLWZsYWctZmlsZSwgXAogCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2Fjb25maWdfZmxhZ3MucGIsIFwKIAkJCQkkKGFjb25maWdfZmxhZ19zdW1tYXJpZXNfcHJvdG9idWYuJChwYXJ0aXRpb24pKSwgXAorCQkJCSQocGFydGl0aW9uKSwgXAogCQkJCSQoc29ydCAkKGZvcmVhY2ggbSwkKGNhbGwgcmVnaXN0ZXItbmFtZXMtZm9yLXBhcnRpdGlvbiwgJChwYXJ0aXRpb24pKSwgXAogCQkJCQkkKEFMTF9NT0RVTEVTLiQobSkuQUNPTkZJR19GSUxFUykgXAogCQkJCSkpLCBcCkBAIC0xMDUsNyArODAsNyBAQAogCiAuUEhPTlk6IGRldmljZV9hY29uZmlnX2RlY2xhcmF0aW9ucwogZGV2aWNlX2Fjb25maWdfZGVjbGFyYXRpb25zOiAkKFBST0RVQ1RfT1VUKS9kZXZpY2VfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIKLSQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtcGFydGl0aW9uLWFjb25maWctZmxhZy1maWxlLCBcCiskKGV2YWwgJChjYWxsIGdlbmVyYXRlLWdsb2JhbC1hY29uZmlnLWZsYWctZmlsZSwgXAogCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS9kZXZpY2VfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIsIFwKIAkJCSQoUFJPRFVDVF9PVVQpL2RldmljZV9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiwgXAogCQkJJChzb3J0ICQocmVxdWlyZWRfYWNvbmZpZ19mbGFnc19maWxlcykpIFwKQEAgLTE2NSw5ICsxNDAsNyBAQAogCQkJCSQoYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKSksIFwKIAkJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbikpLCBcCiAJCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pKSwgXAotCQkJCSQoc29ydCAkKGZvcmVhY2ggbSwkKGNhbGwgcmVnaXN0ZXItbmFtZXMtZm9yLXBhcnRpdGlvbiwgJChwYXJ0aXRpb24pKSwgXAotCQkJCQkkKEFMTF9NT0RVTEVTLiQobSkuQUNPTkZJR19GSUxFUykgXAotCQkJCSkpLCBcCisJCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSksIFwKIAkJCQkkKHBhcnRpdGlvbiksIFwKIAkpKSBcCiApCmRpZmYgLS1naXQgYS9jb3JlL3Bob255X3BhY2thZ2UubWsgYi9jb3JlL3Bob255X3BhY2thZ2UubWsKaW5kZXggNTc4ZDYyOS4uYzk3ODc5MyAxMDA2NDQKLS0tIGEvY29yZS9waG9ueV9wYWNrYWdlLm1rCisrKyBiL2NvcmUvcGhvbnlfcGFja2FnZS5tawpAQCAtMTIsMyArMTIsNSBAQAogCSQoaGlkZSkgZWNobyAiRmFrZTogJEAiCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKIAkkKGhpZGUpIHRvdWNoICRACisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1QSE9OWV9QQUNLQUdFKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rIGIvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCA5NDYyNjQwLi5kNTI2MWY0IDEwMDY0NAotLS0gYS9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rCisrKyBiL2NvcmUvcHJlYnVpbHRfaW50ZXJuYWwubWsKQEAgLTYzLDMgKzYzLDUgQEAKICQoYnVpbHRfbW9kdWxlKSA6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCiAKIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9CisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1QUkVCVUlMVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0Lm1rIGIvY29yZS9wcm9kdWN0Lm1rCmluZGV4IDY4ZDc3MjEuLjhkODZkOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdC5taworKysgYi9jb3JlL3Byb2R1Y3QubWsKQEAgLTI2LDYgKzI2LDcgQEAKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfTU9ERUwKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfTkFNRV9GT1JfQVRURVNUQVRJT04KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JBU0VfT1MKIAogIyBEZWZpbmVzIHRoZSBFTEYgc2VnbWVudCBhbGlnbm1lbnQgZm9yIGJpbmFyaWVzIChleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGxpYnJhcmllcykuCiAjIFRoZSBFTEYgc2VnbWVudCBhbGlnbm1lbnQgaGFzIHRvIGJlIGEgUEFHRV9TSVpFIG11bHRpcGxlLiBGb3IgZXhhbXBsZSwgaWYKQEAgLTE2MCw3ICsxNjEsNiBAQAogIyBMaXN0IG9mIGphcnMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIEFSVCBib290IGltYWdlIGZvciB0ZXN0aW5nLgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfVEVTVF9PTkxZX0FSVF9CT09UX0lNQUdFX0pBUlMKIAotX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TVVBQT1JUU19WQk9PVAogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9BUFBTCiAjIExpc3Qgb2Ygc3lzdGVtX3NlcnZlciBjbGFzc3BhdGggamFycyBvbiB0aGUgcGxhdGZvcm0uCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMKQEAgLTMwNCw5ICszMDQsNiBAQAogIyBUaGlzIGZsYWcgaW1wbGllcyBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMuCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUwogCi0jIExpc3Qgb2YgdGFncyB0aGF0IHdpbGwgYmUgdXNlZCB0byBnYXRlIGJsdWVwcmludCBtb2R1bGVzIGZyb20gdGhlIGJ1aWxkIGdyYXBoCi1fcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9JTkNMVURFX1RBR1MKLQogIyBMaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdhdGUgYmx1ZXByaW50IG1vZHVsZXMgZnJvbSB0aGUgYnVpbGQgZ3JhcGgKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1NPVVJDRV9ST09UX0RJUlMKIApAQCAtNDkxLDYgKzQ4OCwxNCBAQAogIyBFbmFibGVzIDE2S0IgZGV2ZWxvcGVyIG9wdGlvbiBmb3IgZGV2aWNlIGlmIHNldC4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfMTZLX0RFVkVMT1BFUl9PUFRJT04KIAorIyBJZiBzZXQsIGFkYiByb290IHdpbGwgYmUgZGlzYWJsZWQgKHJlYWxseSByby5kZWJ1Z2dhYmxlPTApIGluIHVzZXJkZWJ1ZworIyBidWlsZHMuIEl0J3MgYWxyZWFkeSBvZmYgZGlzYWJsZWQgaW4gdXNlciBidWlsZHMuIEVuZyBidWlsZHMgYXJlIHVuYWZmZWN0ZWQKKyMgYnkgdGhpcyBmbGFnLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcKKworIyBJZiBzZXQsIGJ1aWxkIHdvdWxkIGdlbmVyYXRlIHN5c3RlbSBpbWFnZSBmcm9tIFNvb25nLWRlZmluZWQgbW9kdWxlLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRQorCiAuS0FUSV9SRUFET05MWSA6PSBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyBfcHJvZHVjdF9saXN0X3ZhcnMKIF9wcm9kdWN0X3Zhcl9saXN0IDo9JD0gJChfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycykgJChfcHJvZHVjdF9saXN0X3ZhcnMpCiAKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdF9jb25maWcubWsgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCmluZGV4IGYyMWMxYzQuLjczOGQ0Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdF9jb25maWcubWsKKysrIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5tawpAQCAtMjgwLDI3ICsyODAsNiBAQAogCiBjdXJyZW50X3Byb2R1Y3RfbWFrZWZpbGUgOj0KIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hlY2sgcHJvZHVjdCBpbmNsdWRlIHRhZyBhbGxvd2xpc3QKLUJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUIDo9IFwKLSAgY29tLmFuZHJvaWQubWFpbmxpbmVfZ28gXAotICBjb20uYW5kcm9pZC5tYWlubGluZSBcCi0gIG1haW5saW5lX21vZHVsZV9wcmVidWlsdF9uaWdodGx5IFwKLSAgbWFpbmxpbmVfbW9kdWxlX3ByZWJ1aWx0X21vbnRobHlfcmVsZWFzZQotLktBVElfUkVBRE9OTFkgOj0gQkxVRVBSSU5UX0lOQ0xVREVfVEFHU19BTExPV0xJU1QKLSQoZm9yZWFjaCBpbmNsdWRlX3RhZywkKFBST0RVQ1RfSU5DTFVERV9UQUdTKSwgXAotCSQoaWYgJChmaWx0ZXIgJChpbmNsdWRlX3RhZyksJChCTFVFUFJJTlRfSU5DTFVERV9UQUdTX0FMTE9XTElTVCkpLCxcCi0JJChjYWxsIHByZXR0eS1lcnJvciwgJChpbmNsdWRlX3RhZykgaXMgbm90IGluIEJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUOiAkKEJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUKSkpKQotIyBDcmVhdGUgZGVmYXVsdCBQUk9EVUNUX0lOQ0xVREVfVEFHUwotaWZlcSAoLCAkKFBST0RVQ1RfSU5DTFVERV9UQUdTKSkKLSMgU29vbmcgYW5hbHlzaXMgaXMgZ2xvYmFsOiBldmVuIHRob3VnaCBhIG1vZHVsZSBtaWdodCBub3QgYmUgcmVsZXZhbnQgdG8gYSBzcGVjaWZpYyBwcm9kdWN0IChlLmcuIGJ1aWxkX3Rvb2xzIGZvciBhb3NwX2FybSksCi0jIHdlIHN0aWxsIGFuYWx5c2UgaXQuCi0jIFRoaXMgbWVhbnMgdGhhdCBpbiBzZXR1cHMgd2hlcmUgd2UgdHdvIGhhdmUgdHdvIHByZWJ1aWx0cyBvZiBtb2R1bGVfc2RrLCB3ZSBuZWVkIGEgImRlZmF1bHQiIHRvIHVzZSBpbiBhbmFseXNpcwotIyBUaGlzIHNob3VsZCBiZSBhIG5vLW9wIGluIGFvc3AgYW5kIGludGVybmFsIHNpbmNlIG5vIEFuZHJvaWQuYnAgZmlsZSBjb250YWlucyBibHVlcHJpbnRfcGFja2FnZV9pbmNsdWRlcwotIyBVc2UgdGhlIGJpZyBhbmRyb2lkIG9uZSBhbmQgbWFpbi1iYXNlZCBwcmVidWlsdHMgYnkgZGVmYXVsdAotUFJPRFVDVF9JTkNMVURFX1RBR1MgKz0gY29tLmFuZHJvaWQubWFpbmxpbmUgbWFpbmxpbmVfbW9kdWxlX3ByZWJ1aWx0X25pZ2h0bHkKLWVuZGlmCi0KICMgQU9TUCBhbmQgR29vZ2xlIHByb2R1Y3RzIGN1cnJlbnRseSBzaGFyZSB0aGUgc2FtZSBgYXBleF9jb250cmlidXRpb25zYCBpbiBuZXh0LgogIyBUaGlzIGNhdXNlcyBpc3N1ZXMgd2hlbiBidWlsZGluZyA8YW9zcF9wcm9kdWN0Pi1uZXh0LXVzZXJkZWJ1ZyBpbiBtYWluLgogIyBDcmVhdGUgYSB0ZW1wb3JhcnkgYWxsb3dsaXN0IHRvIGlnbm9yZSB0aGUgZ29vZ2xlIGFwZXhlcyBsaXN0ZWQgaW4gYGNvbnRlbnRzYCBvZiBhcGV4X2NvbnRyaWJ1dGlvbnMgb2YgYG5leHRgCkBAIC0zMzIsNiArMzExLDE0IEBACiAKIFRBUkdFVF9ERVZJQ0UgOj0gJChQUk9EVUNUX0RFVklDRSkKIAorIyBBbGxvdyBvdmVycmlkaW5nIFBMQVRGT1JNX0JBU0VfT1Mgd2hlbiBQUk9EVUNUX0JBU0VfT1MgaXMgZGVmaW5lZAoraWZkZWYgUFJPRFVDVF9CQVNFX09TCisgIFBMQVRGT1JNX0JBU0VfT1MgOj0gJChQUk9EVUNUX0JBU0VfT1MpCitlbHNlCisgIFBMQVRGT1JNX0JBU0VfT1MgOj0gJChQTEFURk9STV9CQVNFX09TX0VOVl9JTlBVVCkKK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9CQVNFX09TCisKICMgVE9ETzogYWxzbyBrZWVwIHRyYWNrIG9mIHRoaW5ncyBsaWtlICJwb3J0IiwgImxhbmQiIGluIHByb2R1Y3QgZmlsZXMuCiAKICMgRmlndXJlIG91dCB3aGljaCByZXNvdXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMKQEAgLTQyNiw2ICs0MTMsMTAgQEAKICAgVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTIDo9ICQoUFJPRFVDVF9DSEFSQUNURVJJU1RJQ1MpCiBlbmRpZgogCitpZm5kZWYgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKKyAgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgOj0gMTAwMDAKK2VuZGlmCisKIGlmZGVmIFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUKICAgaWZuZXEgKDEsJCh3b3JkcyAkKFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUpKSkKICAgICAkKGVycm9yIFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEU9JyQoUFJPRFVDVF9ERUZBVUxUX0RFVl9DRVJUSUZJQ0FURSknLCBcCkBAIC01NzgsMTEgKzU2OSwyNiBAQAogZW5kaWYKIAogIyBUaGlzIHRhYmxlIG1hcHMgc2RrIHZlcnNpb24gMzUgdG8gdmVuZG9yIGFwaSBsZXZlbCAyMDI0MDQgYW5kIGFzc3VtZXMgeWVhcmx5Ci0jIHJlbGVhc2UgZm9yIHRoZSBzYW1lIG1vbnRoLgorIyByZWxlYXNlIGZvciB0aGUgc2FtZSBtb250aC4gSWYgMTAwMDAgQVBJIGxldmVsIG9yIG1vcmUgaXMgdXNlZCwgd2hpY2ggdXN1YWxseQorIyByZXByZXNlbnRzICdjdXJyZW50JyBvciAnZnV0dXJlJyBBUEkgbGV2ZWxzLCBzZXZlcmFsIHplcm9zIGFyZSBhZGRlZCB0bworIyBwcmVzZXJ2ZSBvcmRlcmluZy4gU3BlY2lmaWNhbGx5IEFQSSBsZXZlbCAxMCwwMDAgaXMgY29udmVydGVkIHRvIDEwLDAwMCwwMDAKKyMgd2hpY2ggaW1wb3J0YW50bHkgaXMgZ3JlYXRlciB0aGFuIDIwMjQwNCA9IDIwMiw0MDQuIFRoaXMgY29udmVudGlvbiB3aWxsIGJyZWFrCisjIGluIDEwMCwwMDAgQ0UsIHdoaWNoIGlzIHRoZSBjbG9zZXN0IG11bHRpcGxlIG9mIDEwIHRoYXQgZG9lc24ndCBicmVhayBlYXJsaWVyCisjIHRoYW4gMTAsMDAwIGFzIGFuIEFQSSBsZXZlbCBicmVha3MuCiBkZWZpbmUgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwKLSAgJChpZiAkKGNhbGwgbWF0aF9sdF9vcl9lcSwkKDEpLDM0KSwkKDEpLDIwJChjYWxsIGludF9zdWJ0cmFjdCwkKDEpLDExKTA0KQorJChpZiAkKGNhbGwgbWF0aF9sdF9vcl9lcSwkKDEpLDM0KSwkKDEpLCQoaWYgJChjYWxsIG1hdGhfbHQsJCgxKSwxMDAwMCksMjAkKGNhbGwgaW50X3N1YnRyYWN0LCQoMSksMTEpMDQsJCgxKTAwMCkpCiBlbmRlZgogCitpZm5lcSAoJChjYWxsIHNkay10by12ZW5kb3ItYXBpLWxldmVsLDM0KSwzNCkKKyQoZXJyb3Igc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwgaXMgYnJva2VuIGZvciBwcmUtVHJ1bmstU3RhYmxlIFNES3MpCitlbmRpZgoraWZuZXEgKCQoY2FsbCBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCwzNSksMjAyNDA0KQorJChlcnJvciBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCBpcyBicm9rZW4gZm9yIHBvc3QtVHJ1bmstU3RhYmxlIFNES3MpCitlbmRpZgoraWZuZXEgKCQoY2FsbCBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCwxMDAwMCksMTAwMDAwMDApCiskKGVycm9yIHNkay10by12ZW5kb3ItYXBpLWxldmVsIGlzIGJyb2tlbiBmb3IgY3VycmVudCAkKGNhbGwgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwsMTAwMDApKQorZW5kaWYKKwogaWZkZWYgUFJPRFVDVF9TSElQUElOR19WRU5ET1JfQVBJX0xFVkVMCiAjIEZvbGxvdyB0aGUgdmVyc2lvbiB0aGF0IGlzIHNldCBtYW51YWxseS4KICAgVlNSX1ZFTkRPUl9BUElfTEVWRUwgOj0gJChQUk9EVUNUX1NISVBQSU5HX1ZFTkRPUl9BUElfTEVWRUwpCmRpZmYgLS1naXQgYS9jb3JlL3Byb2R1Y3RfY29uZmlnLnJiYyBiL2NvcmUvcHJvZHVjdF9jb25maWcucmJjCmluZGV4IDU5ZTJjOTUuLjIwMzQ0ZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdF9jb25maWcucmJjCisrKyBiL2NvcmUvcHJvZHVjdF9jb25maWcucmJjCkBAIC0zODIsNiArMzgyLDExIEBACiAgICAgX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UoZywgbnNuYW1lKQogICAgIGdbX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2VzX2tleV1bbnNuYW1lXVt2YXJdPV9ta3N0cmlwKHZhbHVlKQogCitkZWYgX3Nvb25nX2NvbmZpZ19zZXRfYm9vbChnLCBuc25hbWUsIHZhciwgdmFsdWUpOgorICAgICIiIkFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSB2YXJpYWJsZSBpbiB0aGUgbmFtZXNwYWNlLCBhbmQgbWFya3MgaXQgYXMgYSBib29sZWFuLiIiIgorICAgIF9zb29uZ19jb25maWdfc2V0KGcsIG5zbmFtZSwgdmFyLCBfZmlsdGVyKCJ0cnVlIiwgdmFsdWUpKQorICAgIGdbIlNPT05HX0NPTkZJR19UWVBFXyVzXyVzIiAlIChuc25hbWUsIHZhcildID0gImJvb2wiCisKIGRlZiBfc29vbmdfY29uZmlnX2FwcGVuZChnLCBuc25hbWUsIHZhciwgdmFsdWUpOgogICAgICIiIkFwcGVuZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgbmFtZXNwYWNlLiIiIgogICAgIF9zb29uZ19jb25maWdfbmFtZXNwYWNlKGcsIG5zbmFtZSkKQEAgLTg2MSw2ICs4NjYsNyBAQAogICAgIHNvb25nX2NvbmZpZ19uYW1lc3BhY2UgPSBfc29vbmdfY29uZmlnX25hbWVzcGFjZSwKICAgICBzb29uZ19jb25maWdfYXBwZW5kID0gX3Nvb25nX2NvbmZpZ19hcHBlbmQsCiAgICAgc29vbmdfY29uZmlnX3NldCA9IF9zb29uZ19jb25maWdfc2V0LAorICAgIHNvb25nX2NvbmZpZ19zZXRfYm9vbCA9IF9zb29uZ19jb25maWdfc2V0X2Jvb2wsCiAgICAgc29vbmdfY29uZmlnX2dldCA9IF9zb29uZ19jb25maWdfZ2V0LAogICAgIGFic3BhdGggPSBfYWJzcGF0aCwKICAgICBhZGRfcHJvZHVjdF9kZXhfcHJlb3B0X21vZHVsZV9jb25maWcgPSBfYWRkX3Byb2R1Y3RfZGV4X3ByZW9wdF9tb2R1bGVfY29uZmlnLApkaWZmIC0tZ2l0IGEvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCmluZGV4IDE2YTIyYzAuLjJmMjFiYWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmF2ZW53b29kX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3JhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTE4LDEwICsxOCw5IEBACiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9InJhdmVud29vZCIgLz4KICAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0icmF2ZW53b29kLXRlc3RzIiAvPgogCi0gICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZvbGRlciIgdmFsdWU9InByZWJ1aWx0cy9qZGsvamRrMTcvbGludXgteDg2LyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImphdmEtZm9sZGVyIiB2YWx1ZT0icHJlYnVpbHRzL2pkay9qZGsyMS9saW51eC14ODYvIiAvPgogICAgIDxvcHRpb24gbmFtZT0idXNlLXJhdmVud29vZC1yZXNvdXJjZXMiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDxvcHRpb24gbmFtZT0iZXhjbHVkZS1wYXRocyIgdmFsdWU9ImphdmEiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJzb2NrZXQtdGltZW91dCIgdmFsdWU9IjEwMDAwIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibnVsbC1kZXZpY2UiIHZhbHVlPSJ0cnVlIiAvPgogCiAgICAge0VYVFJBX0NPTkZJR1N9CmRpZmYgLS1naXQgYS9jb3JlL3JlbGVhc2VfY29uZmlnLm1rIGIvY29yZS9yZWxlYXNlX2NvbmZpZy5tawppbmRleCA0ZmRkMjc5Li5mZTIxNzBlIDEwMDY0NAotLS0gYS9jb3JlL3JlbGVhc2VfY29uZmlnLm1rCisrKyBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKQEAgLTEzMCw2ICsxMzAsMTAgQEAKICAgICAgICAgIyBEaXNhYmxlIHRoZSBidWlsZCBmbGFnIGluIHJlbGVhc2UtY29uZmlnLgogICAgICAgICBfYXJncyArPSAtLWd1YXJkPWZhbHNlCiAgICAgZW5kaWYKKyAgICBfYXJncyArPSAtLWFsbG93LW1pc3Npbmc9dHJ1ZQorICAgIGlmbmVxICgsJChUQVJHRVRfUFJPRFVDVCkpCisgICAgICAgIF9hcmdzICs9IC0tcHJvZHVjdCAkKFRBUkdFVF9QUk9EVUNUKQorICAgIGVuZGlmCiAgICAgX2ZsYWdzX2Rpcjo9JChPVVRfRElSKS9zb29uZy9yZWxlYXNlLWNvbmZpZwogICAgIF9mbGFnc19maWxlOj0kKF9mbGFnc19kaXIpL3JlbGVhc2VfY29uZmlnLSQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX1JFTEVBU0UpLnZhcnMKICAgICAjIHJlbGVhc2UtY29uZmlnIGdlbmVyYXRlcyAkKF9mbGFnc192YXJtaykKZGlmZiAtLWdpdCBhL2NvcmUvcm9ib2xlY3RyaWNfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKaW5kZXggNTZkMjMxMi4uYjFkMGMyZiAxMDA2NDQKLS0tIGEvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTE4LDcgKzE4LDcgQEAKICAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0icm9ib2xlY3RyaWMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9InJvYm9sZWN0cmljLXRlc3RzIiAvPgogCi0gICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZvbGRlciIgdmFsdWU9InByZWJ1aWx0cy9qZGsvamRrMTcvbGludXgteDg2LyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImphdmEtZm9sZGVyIiB2YWx1ZT0icHJlYnVpbHRzL2pkay9qZGsyMS9saW51eC14ODYvIiAvPgogICAgIDxvcHRpb24gbmFtZT0iZXhjbHVkZS1wYXRocyIgdmFsdWU9ImphdmEiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJ1c2Utcm9ib2xlY3RyaWMtcmVzb3VyY2VzIiB2YWx1ZT0idHJ1ZSIgLz4KIApkaWZmIC0tZ2l0IGEvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3J1c3RfZGV2aWNlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCBiZmQyZjQ3Li5hYWNhYmNiIDEwMDY0NAotLS0gYS9jb3JlL3J1c3RfZGV2aWNlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3J1c3RfZGV2aWNlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMjAsMTEgKzIwLDExIEBACiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJ7TU9EVUxFfS0+L2RhdGEvbG9jYWwvdG1wL3tNT0RVTEV9IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJ7TU9EVUxFfS0+e1RFU1RfSU5TVEFMTF9CQVNFfS97TU9EVUxFfSIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5ydXN0LlJ1c3RCaW5hcnlUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0ie1RFU1RfSU5TVEFMTF9CQVNFfSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IntNT0RVTEV9IiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IDJmNTEwZDkuLmFlMzRjYjggMTAwNjQ0Ci0tLSBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtMTAxLDQgKzEwMSw2IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQobXlfY292ZXJhZ2VfcGF0aCkvJChHQ05PX0FSQ0hJVkUpCiBlbmRpZgogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9U0hBUkVEX0xJQlJBUlkpKQorCiBlbmRpZiAgIyBza2lwX2J1aWxkX2Zyb21fc291cmNlCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2FuZHJvaWRfYXBwX3NldC5tayBiL2NvcmUvc29vbmdfYW5kcm9pZF9hcHBfc2V0Lm1rCmluZGV4IGVjM2Q4YzguLmQ5Nzk4MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfYW5kcm9pZF9hcHBfc2V0Lm1rCisrKyBiL2NvcmUvc29vbmdfYW5kcm9pZF9hcHBfc2V0Lm1rCkBAIC05LDEwICs5LDYgQEAKIExPQ0FMX0JVSUxUX01PRFVMRV9TVEVNIDo9IHBhY2thZ2UuYXBrCiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gJChub3RkaXIgJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkpCiAKLSMgVXNlIHRoZSBTb29uZyBvdXRwdXQgYXMgdGhlIGNoZWNrYnVpbGQgdGFyZ2V0IGluc3RlYWQgb2YgTE9DQUxfQlVJTFRfTU9EVUxFCi0jIHRvIGF2b2lkIGNoZWNrYnVpbGRzIG1ha2luZyBhbiBleHRyYSBjb3B5IG9mIGV2ZXJ5IG1vZHVsZS4KLUxPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUpCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2FwcF9wcmVidWlsdC5tayBiL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rCmluZGV4IDNhYTI0NGMuLmRmMWNmMmQgMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rCkBAIC0yOSwxNiArMjksNiBAQAogZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1oZWFkZXIuamFyCiAKIAotIyBVc2UgdGhlIFNvb25nIG91dHB1dCBhcyB0aGUgY2hlY2tidWlsZCB0YXJnZXQgaW5zdGVhZCBvZiBMT0NBTF9CVUlMVF9NT0RVTEUKLSMgdG8gYXZvaWQgY2hlY2tidWlsZHMgbWFraW5nIGFuIGV4dHJhIGNvcHkgb2YgZXZlcnkgbW9kdWxlLgotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUikKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19IRUFERVJfSkFSKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRSkKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19ERVhQUkVPUFRfQ09ORklHKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0RFWF9KQVIpCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2NjX3J1c3RfcHJlYnVpbHQubWsgYi9jb3JlL3Nvb25nX2NjX3J1c3RfcHJlYnVpbHQubWsKaW5kZXggYTFjNjQ3OC4uZGE2MDgzMiAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19jY19ydXN0X3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvc29vbmdfY2NfcnVzdF9wcmVidWlsdC5tawpAQCAtMzgsMTAgKzM4LDYgQEAKICAgZW5kaWYKIGVuZGlmCiAKLSMgVXNlIHRoZSBTb29uZyBvdXRwdXQgYXMgdGhlIGNoZWNrYnVpbGQgdGFyZ2V0IGluc3RlYWQgb2YgTE9DQUxfQlVJTFRfTU9EVUxFCi0jIHRvIGF2b2lkIGNoZWNrYnVpbGRzIG1ha2luZyBhbiBleHRyYSBjb3B5IG9mIGV2ZXJ5IG1vZHVsZS4KLUxPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUpCi0KIG15X2NoZWNrX3NhbWVfdm5ka192YXJpYW50cyA6PQogc2FtZV92bmRrX3ZhcmlhbnRzX3N0YW1wIDo9CiBpZmVxICgkKExPQ0FMX0NIRUNLX1NBTUVfVk5ES19WQVJJQU5UUyksdHJ1ZSkKQEAgLTYxLDcgKzU3LDcgQEAKICAgIyBOb3RlIHRoYXQgYmVjYXVzZSBgY2hlY2tidWlsZGAgZG9lc24ndCBjaGVjayBMT0NBTF9CVUlMVF9NT0RVTEUgZm9yIHNvb25nLWJ1aWx0IG1vZHVsZXMgYWRkaW5nCiAgICMgdGhlIHRpbWVzdGFtcCB0byBMT0NBTF9CVUlMVF9NT0RVTEUgaXNuJ3QgZW5vdWdoLiBJdCBpcyBza2lwcGVkIHdoZW4gdGhlIHZlbmRvciB2YXJpYW50CiAgICMgaXNuJ3QgdXNlZCBhdCBhbGwgYW5kIGl0IG1heSBicmVhayBpbiB0aGUgZG93bnN0cmVhbSB0cmVlcy4KLSAgTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSA6PSAkKHNhbWVfdm5ka192YXJpYW50c19zdGFtcCkKKyAgTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKHNhbWVfdm5ka192YXJpYW50c19zdGFtcCkKIGVuZGlmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19jb25maWcubWsgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawppbmRleCBiZTVhNmU2Li4yZTdjZDlmIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawpAQCAtMSw2ICsxLDUgQEAKLVNPT05HX01BS0VWQVJTX01LIDo9ICQoU09PTkdfT1VUX0RJUikvbWFrZV92YXJzLSQoVEFSR0VUX1BST0RVQ1QpLm1rCi1TT09OR19WQVJJQUJMRVMgOj0gJChTT09OR19PVVRfRElSKS9zb29uZy4kKFRBUkdFVF9QUk9EVUNUKS52YXJpYWJsZXMKLVNPT05HX0FORFJPSURfTUsgOj0gJChTT09OR19PVVRfRElSKS9BbmRyb2lkLSQoVEFSR0VUX1BST0RVQ1QpLm1rCitTT09OR19NQUtFVkFSU19NSyA6PSAkKFNPT05HX09VVF9ESVIpL21ha2VfdmFycy0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS5taworU09PTkdfQU5EUk9JRF9NSyA6PSAkKFNPT05HX09VVF9ESVIpL0FuZHJvaWQtJChUQVJHRVRfUFJPRFVDVCkkKENPVkVSQUdFX1NVRkZJWCkubWsKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYXJ0X2NvbmZpZy5tawogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9jb25maWcubWsKQEAgLTI3LDkgKzI2LDEwIEBACiAkKHNoZWxsIG1rZGlyIC1wICQoZGlyICQoU09PTkdfVkFSSUFCTEVTKSkpCiAkKGNhbGwganNvbl9zdGFydCkKIAotJChjYWxsIGFkZF9qc29uX3N0ciwgIE1ha2Vfc3VmZml4LCAtJChUQVJHRVRfUFJPRFVDVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFrZV9zdWZmaXgsIC0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMRF9JRCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRGaW5nZXJwcmludEZpbGUsICAgICAgICAgICAgICBidWlsZF9maW5nZXJwcmludC50eHQpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGROdW1iZXJGaWxlLCAgICAgICAgICAgICAgICAgICBidWlsZF9udW1iZXIudHh0KQogJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkSG9zdG5hbWVGaWxlLCAgICAgICAgICAgICAgICAgYnVpbGRfaG9zdG5hbWUudHh0KQogJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkVGh1bWJwcmludEZpbGUsICAgICAgICAgICAgICAgYnVpbGRfdGh1bWJwcmludC50eHQpCkBAIC0xMDksNiArMTA5LDggQEAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBBQVBUUHJlYnVpbHREUEksICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BQVBUX1BSRUJVSUxUX0RQSSkpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZWZhdWx0QXBwQ2VydGlmaWNhdGUsICAgICAgICAgICAgICQoUFJPRFVDVF9ERUZBVUxUX0RFVl9DRVJUSUZJQ0FURSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRXh0cmFPdGFLZXlzLCAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfRVhUUkFfT1RBX0tFWVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEV4dHJhT3RhUmVjb3ZlcnlLZXlzLCAgICAgICAgICAgICAgJChQUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIE1haW5saW5lU2Vwb2xpY3lEZXZDZXJ0aWZpY2F0ZXMsICAgJChNQUlOTElORV9TRVBPTElDWV9ERVZfQ0VSVElGSUNBVEVTKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIEFwcHNEZWZhdWx0VmVyc2lvbk5hbWUsICAgICAgICAgICAgJChBUFBTX0RFRkFVTFRfVkVSU0lPTl9OQU1FKSkKQEAgLTE1MCw3ICsxNTIsNiBAQAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvckFwaUxldmVsLCAgICAgICAgICAgICAgICAgICAgJChCT0FSRF9BUElfTEVWRUwpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEV4dHJhVm5ka1ZlcnNpb25zLCAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZVN5c3RlbVNka1ZlcnNpb25zLCAgICAgICAgICAgJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKQotJChjYWxsIGFkZF9qc29uX3N0ciwgIFJlY292ZXJ5U25hcHNob3RWZXJzaW9uLCAgICAgICAgICAgJChSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybV9zeXN0ZW1zZGtfdmVyc2lvbnMsICAgICAgICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBNYWxsb2NfbG93X21lbW9yeSwgICAgICAgICAgICAgICAgICQoZmluZHN0cmluZyB0cnVlLCQoTUFMTE9DX1NWRUxURSkgJChNQUxMT0NfTE9XX01FTU9SWSkpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE1hbGxvY196ZXJvX2NvbnRlbnRzLCAgICAgICAgICAgICAgJChjYWxsIGludmVydF9ib29sLCQoZmlsdGVyIGZhbHNlLCQoTUFMTE9DX1pFUk9fQ09OVEVOVFMpKSkpCkBAIC0xNjUsOCArMTY2LDYgQEAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb290SmFycywgICAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9CT09UX0pBUlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEFwZXhCb290SmFycywgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0ICQoQVBFWF9CT09UX0pBUlNfRVhDTFVERUQpLCAkKFBST0RVQ1RfQVBFWF9CT09UX0pBUlMpKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIFZuZGtTbmFwc2hvdEJ1aWxkQXJ0aWZhY3RzLCAgICAgICAgJChWTkRLX1NOQVBTSE9UX0JVSUxEX0FSVElGQUNUUykpCi0KICQoY2FsbCBhZGRfanNvbl9tYXAsICBCdWlsZEZsYWdzKQogJChmb3JlYWNoIGZsYWcsJChfQUxMX1JFTEVBU0VfRkxBR1MpLFwKICAgJChjYWxsIGFkZF9qc29uX3N0ciwkKGZsYWcpLCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQoZmxhZykuVkFMVUUpKSkKQEAgLTE3NiwyNCArMTc1LDYgQEAKICAgJChjYWxsIGFkZF9qc29uX3N0ciwkKGZsYWcpLCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQoZmxhZykuVFlQRSkpKQogJChjYWxsIGVuZF9qc29uX21hcCkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIERpcmVjdGVkVmVuZG9yU25hcHNob3QsICAgICAgICAgICAgJChESVJFQ1RFRF9WRU5ET1JfU05BUFNIT1QpKQotJChjYWxsIGFkZF9qc29uX21hcCwgIFZlbmRvclNuYXBzaG90TW9kdWxlcykKLSQoZm9yZWFjaCBtb2R1bGUsJChWRU5ET1JfU05BUFNIT1RfTU9EVUxFUyksXAotICAkKGNhbGwgYWRkX2pzb25fYm9vbCwkKG1vZHVsZSksdHJ1ZSkpCi0kKGNhbGwgZW5kX2pzb25fbWFwKQotCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlyZWN0ZWRSZWNvdmVyeVNuYXBzaG90LCAgICAgICAgICAkKERJUkVDVEVEX1JFQ09WRVJZX1NOQVBTSE9UKSkKLSQoY2FsbCBhZGRfanNvbl9tYXAsICBSZWNvdmVyeVNuYXBzaG90TW9kdWxlcykKLSQoZm9yZWFjaCBtb2R1bGUsJChSRUNPVkVSWV9TTkFQU0hPVF9NT0RVTEVTKSxcCi0gICQoY2FsbCBhZGRfanNvbl9ib29sLCQobW9kdWxlKSx0cnVlKSkKLSQoY2FsbCBlbmRfanNvbl9tYXApCi0KLSQoY2FsbCBhZGRfanNvbl9saXN0LCBWZW5kb3JTbmFwc2hvdERpcnNJbmNsdWRlZCwgICAgICAgICQoVkVORE9SX1NOQVBTSE9UX0RJUlNfSU5DTFVERUQpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclNuYXBzaG90RGlyc0V4Y2x1ZGVkLCAgICAgICAgJChWRU5ET1JfU05BUFNIT1RfRElSU19FWENMVURFRCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgUmVjb3ZlcnlTbmFwc2hvdERpcnNJbmNsdWRlZCwgICAgICAkKFJFQ09WRVJZX1NOQVBTSE9UX0RJUlNfSU5DTFVERUQpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIFJlY292ZXJ5U25hcHNob3REaXJzRXhjbHVkZWQsICAgICAgJChSRUNPVkVSWV9TTkFQU0hPVF9ESVJTX0VYQ0xVREVEKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBIb3N0RmFrZVNuYXBzaG90RW5hYmxlZCwgICAgICAgICAgICQoSE9TVF9GQUtFX1NOQVBTSE9UX0VOQUJMRSkpCi0KICQoY2FsbCBhZGRfanNvbl9ib29sLCBNdWx0aXRyZWVVcGRhdGVNZXRhLCAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfTVVMVElUUkVFX1VQREFURV9NRVRBKSkpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBUcmVibGVfbGlua2VyX25hbWVzcGFjZXMsICAgICAgICAgICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1RSRUJMRV9MSU5LRVJfTkFNRVNQQUNFUykpKQpAQCAtMjI1LDYgKzIwNiw3IEBACiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQm9hcmRTZXBvbGljeVZlcnMsICAgICAgICAgICAgICAgICAkKEJPQVJEX1NFUE9MSUNZX1ZFUlMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFN5c3RlbUV4dFNlcG9saWN5UHJlYnVpbHRBcGlEaXIsICAgJChCT0FSRF9TWVNURU1fRVhUX1BSRUJVSUxUX0RJUikpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdFNlcG9saWN5UHJlYnVpbHRBcGlEaXIsICAgICAkKEJPQVJEX1BST0RVQ1RfUFJFQlVJTFRfRElSKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBCb2FyZFBsYXRmb3JtLCAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtU2Vwb2xpY3lWZXJzaW9uLCAgICAgICAgICAgJChQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybVNlcG9saWN5Q29tcGF0VmVyc2lvbnMsICAgICQoUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TKSkKQEAgLTI2Miw2ICsyNDQsMTggQEAKICAgJChjYWxsIGVuZF9qc29uX21hcCkpCiAkKGNhbGwgZW5kX2pzb25fbWFwKQogCisjIEFkZCB0aGUgdHlwZXMgb2YgdGhlIHZhcmlhYmxlcyBpbiBWZW5kb3JWYXJzLiBTaW5jZSB0aGlzIGlzIG11Y2ggbmV3ZXIKKyMgdGhhbiBWZW5kb3JWYXJzLCB3aGljaCBoYXMgYSBoaXN0b3J5IG9mIGp1c3QgdXNpbmcgc3RyaW5nIHZhbHVlcyBmb3IgZXZlcnl0aGluZywKKyMgdmFyaWFibGVzIGFyZSBhc3N1bWVkIHRvIGJlIHN0cmluZ3MgYnkgZGVmYXVsdC4gRm9yIHN0cmluZ3MsIFNPT05HX0NPTkZJR19UWVBFXyoKKyMgd2lsbCBub3QgYmUgc2V0LCBhbmQgdGhleSB3aWxsIG5vdCBoYXZlIGFuIGVudHJ5IGluIHRoZSBWZW5kb3JWYXJUeXBlcyBtYXAuCiskKGNhbGwgYWRkX2pzb25fbWFwLCBWZW5kb3JWYXJUeXBlcykKKyQoZm9yZWFjaCBuYW1lc3BhY2UsJChzb3J0ICQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpKSxcCisgICQoY2FsbCBhZGRfanNvbl9tYXAsICQobmFtZXNwYWNlKSlcCisgICQoZm9yZWFjaCBrZXksJChzb3J0ICQoU09PTkdfQ09ORklHXyQobmFtZXNwYWNlKSkpLFwKKyAgICAkKGlmICQoU09PTkdfQ09ORklHX1RZUEVfJChuYW1lc3BhY2UpXyQoa2V5KSksJChjYWxsIGFkZF9qc29uX3N0ciwkKGtleSksJChzdWJzdCAiLFwiLCQoU09PTkdfQ09ORklHX1RZUEVfJChuYW1lc3BhY2UpXyQoa2V5KSkpKSkpXAorICAkKGNhbGwgZW5kX2pzb25fbWFwKSkKKyQoY2FsbCBlbmRfanNvbl9tYXApCisKICQoY2FsbCBhZGRfanNvbl9ib29sLCBFbmZvcmNlUHJvZHVjdFBhcnRpdGlvbkludGVyZmFjZSwgICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFKSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlQ3VycmVudEFwaUxldmVsRm9yVmVuZG9yTW9kdWxlcywgICQoQk9BUkRfQ1VSUkVOVF9BUElfTEVWRUxfRk9SX1ZFTkRPUl9NT0RVTEVTKSkKIApAQCAtMjgyLDcgKzI3Niw3IEBACiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRNb3ZlUmVjb3ZlcnlSZXNvdXJjZXNUb1ZlbmRvckJvb3QsICQoZmlsdGVyIHRydWUsJChCT0FSRF9NT1ZFX1JFQ09WRVJZX1JFU09VUkNFU19UT19WRU5ET1JfQk9PVCkpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByZWJ1aWx0SGlkZGVuQXBpRGlyLCAkKEJPQVJEX1BSRUJVSUxUX0hJRERFTkFQSV9ESVIpKQogCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgU2hpcHBpbmdBcGlMZXZlbCwgJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgU2hpcHBpbmdfYXBpX2xldmVsLCAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSkKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJ1aWxkQnJva2VuUGx1Z2luVmFsaWRhdGlvbiwgICAgICAgICAkKEJVSUxEX0JST0tFTl9QTFVHSU5fVkFMSURBVElPTikpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ1Byb3BlcnR5LCAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fQ0xBTkdfUFJPUEVSVFkpKSkKQEAgLTI5Nyw2ICsyOTEsNyBAQAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuSW5jb3JyZWN0UGFydGl0aW9uSW1hZ2VzLCAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSkpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQnVpbGRCcm9rZW5JbnB1dERpck1vZHVsZXMsICAgICAgICAgICQoQlVJTERfQlJPS0VOX0lOUFVUX0RJUl9NT0RVTEVTKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkRvbnRDaGVja1N5c3RlbVNkaywgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9ET05UX0NIRUNLX1NZU1RFTVNESykpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuRHVwU3lzcHJvcCwgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0RVUF9TWVNQUk9QKSkpCiAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBCdWlsZFdhcm5pbmdCYWRPcHRpb25hbFVzZXNMaWJzQWxsb3dsaXN0LCAgICAkKEJVSUxEX1dBUk5JTkdfQkFEX09QVElPTkFMX1VTRVNfTElCU19BTExPV0xJU1QpKQogCkBAIC0zMTMsNyArMzA4LDYgQEAKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIElnbm9yZVByZWZlcjMyT25EZXZpY2UsICQoZmlsdGVyIHRydWUsJChJR05PUkVfUFJFRkVSMzJfT05fREVWSUNFKSkpCiAKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBJbmNsdWRlVGFncywgICAgICAgICAgICAgICAgJChQUk9EVUNUX0lOQ0xVREVfVEFHUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU291cmNlUm9vdERpcnMsICAgICAgICAgICAgICQoUFJPRFVDVF9TT1VSQ0VfUk9PVF9ESVJTKSkKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEFmZG9Qcm9maWxlcywgICAgICAgICAgICAgICAgJChBTExfQUZET19QUk9GSUxFUykpCkBAIC0zMjcsOCArMzIxLDYgQEAKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFJlbGVhc2VEZWZhdWx0TW9kdWxlQnVpbGRGcm9tU291cmNlLCAgICQoUkVMRUFTRV9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpCiAKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBLZWVwVm5kaywgJChmaWx0ZXIgdHJ1ZSwkKEtFRVBfVk5ESykpKQotCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQ2hlY2tWZW5kb3JTZWFwcFZpb2xhdGlvbnMsICQoZmlsdGVyIHRydWUsJChDSEVDS19WRU5ET1JfU0VBUFBfVklPTEFUSU9OUykpKQogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRJZ25vcmVBcGV4Q29udHJpYnV0aW9uQ29udGVudHMsICQoUFJPRFVDVF9CVUlMRF9JR05PUkVfQVBFWF9DT05UUklCVVRJT05fQ09OVEVOVFMpKQpAQCAtMzQ5LDYgKzM0MSwyMiBAQAogCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgT2VtUHJvcGVydGllcywgJChQUk9EVUNUX09FTV9QUk9QRVJUSUVTKSkKIAorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbVByb3BGaWxlcywgJChUQVJHRVRfU1lTVEVNX1BST1ApKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbUV4dFByb3BGaWxlcywgJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UHJvcEZpbGVzLCAkKFRBUkdFVF9QUk9EVUNUX1BST1ApKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIE9kbVByb3BGaWxlcywgJChUQVJHRVRfT0RNX1BST1ApKQorCisjIERvIG5vdCBzZXQgQXJ0VGFyZ2V0SW5jbHVkZURlYnVnQnVpbGQgaW50byBhbnkgdmFsdWUgaWYgUFJPRFVDVF9BUlRfVEFSR0VUX0lOQ0xVREVfREVCVUdfQlVJTEQgaXMgbm90IHNldCwKKyMgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBmcm9tIHJ1bnRpbWVfbGliYXJ0Lm1rLgoraWZuZXEgKCQoUFJPRFVDVF9BUlRfVEFSR0VUX0lOQ0xVREVfREVCVUdfQlVJTEQpLCkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBBcnRUYXJnZXRJbmNsdWRlRGVidWdCdWlsZCwgJChQUk9EVUNUX0FSVF9UQVJHRVRfSU5DTFVERV9ERUJVR19CVUlMRCkpCitlbmRpZgorCitfY29uZmlnX2VuYWJsZV91ZmZkX2djIDo9IFwKKyAgJChmaXJzdHdvcmQgJChPVkVSUklERV9FTkFCTEVfVUZGRF9HQykgJChQUk9EVUNUX0VOQUJMRV9VRkZEX0dDKSBkZWZhdWx0KQorJChjYWxsIGFkZF9qc29uX3N0ciwgRW5hYmxlVWZmZEdjLCAkKF9jb25maWdfZW5hYmxlX3VmZmRfZ2MpKQorX2NvbmZpZ19lbmFibGVfdWZmZF9nYyA6PQorCiAkKGNhbGwganNvbl9lbmQpCiAKICQoZmlsZSA+JChTT09OR19WQVJJQUJMRVMpLnRtcCwkKGpzb25fY29udGVudHMpKQpAQCAtMzU5LDQgKzM2Nyw2IEBACiAJICBybSAkKFNPT05HX1ZBUklBQkxFUykudG1wOyBcCiAJZmkpCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Nvb25nX2V4dHJhX2NvbmZpZy5taworCiBlbmRpZiAjIENPTkZJR1VSRV9TT09ORwpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19leHRyYV9jb25maWcubWsgYi9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI1YzBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zb29uZ19leHRyYV9jb25maWcubWsKQEAgLTAsMCArMSwxMDYgQEAKKyQoY2FsbCBqc29uX3N0YXJ0KQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBEZXZpY2VDcHVWYXJpYW50UnVudGltZSwgICAgICAgICAgICQoVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgRGV2aWNlQWJpTGlzdCwgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DUFVfQUJJX0xJU1QpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgRGV2aWNlQWJpTGlzdDMyLCAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DUFVfQUJJX0xJU1RfMzJfQklUKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERldmljZUFiaUxpc3Q2NCwgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzY0X0JJVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBEZXZpY2VTZWNvbmRhcnlDcHVWYXJpYW50UnVudGltZSwgICQoVEFSR0VUXzJORF9DUFVfVkFSSUFOVF9SVU5USU1FKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgRGV4Mm9hdFRhcmdldENwdVZhcmlhbnRSdW50aW1lLCAgICAgICAgICQoREVYMk9BVF9UQVJHRVRfQ1BVX1ZBUklBTlRfUlVOVElNRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBEZXgyb2F0VGFyZ2V0SW5zdHJ1Y3Rpb25TZXRGZWF0dXJlcywgICAgJChERVgyT0FUX1RBUkdFVF9JTlNUUlVDVElPTl9TRVRfRkVBVFVSRVMpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU2Vjb25kYXJ5RGV4Mm9hdENwdVZhcmlhbnRSdW50aW1lLCAgICAgICQoJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClERVgyT0FUX1RBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFNlY29uZGFyeURleDJvYXRJbnN0cnVjdGlvblNldEZlYXR1cmVzLCAkKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRQbGF0Zm9ybSwgICAgICAgICAgJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRTaGlwcGluZ0FwaUxldmVsLCAgJChCT0FSRF9TSElQUElOR19BUElfTEVWRUwpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU2hpcHBpbmdBcGlMZXZlbCwgICAgICAgJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTaGlwcGluZ1ZlbmRvckFwaUxldmVsLCAkKFBST0RVQ1RfU0hJUFBJTkdfVkVORE9SX0FQSV9MRVZFTCkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RNb2RlbCwgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX01PREVMKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RNb2RlbEZvckF0dGVzdGF0aW9uLCAgICAgICAgJChQUk9EVUNUX01PREVMX0ZPUl9BVFRFU1RBVElPTikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0QnJhbmRGb3JBdHRlc3RhdGlvbiwgICAgICAgICQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdE5hbWVGb3JBdHRlc3RhdGlvbiwgICAgICAgICAkKFBST0RVQ1RfTkFNRV9GT1JfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdERldmljZUZvckF0dGVzdGF0aW9uLCAgICAgICAkKFBST0RVQ1RfREVWSUNFX0ZPUl9BVFRFU1RBVElPTikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0TWFudWZhY3R1cmVyRm9yQXR0ZXN0YXRpb24sICQoUFJPRFVDVF9NQU5VRkFDVFVSRVJfRk9SX0FUVEVTVEFUSU9OKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgU3lzdGVtQnJhbmQsICQoUFJPRFVDVF9TWVNURU1fQlJBTkQpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU3lzdGVtRGV2aWNlLCAkKFBST0RVQ1RfU1lTVEVNX0RFVklDRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1NYW51ZmFjdHVyZXIsICQoUFJPRFVDVF9TWVNURU1fTUFOVUZBQ1RVUkVSKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbU1vZGVsLCAkKFBST0RVQ1RfU1lTVEVNX01PREVMKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbU5hbWUsICQoUFJPRFVDVF9TWVNURU1fTkFNRSkpCisKKyMgQ29sbGFwc2VzID89IGFuZCA9IG9wZXJhdG9ycyBmb3Igc3lzdGVtIHByb3BlcnR5IHZhcmlhYmxlcy4gQWxzbyByZW1vdmVzIGRvdWJsZSBxdW90ZXMgdG8gcHJldmVudAorIyBtYWxmb3JtZWQgSlNPTi4gVGhpcyBjaGFuZ2UgYWxpZ25zIHdpdGggdGhlIGV4aXN0aW5nIGJlaGF2aW9yIG9mIHN5c3Byb3AubWssIHdoaWNoIHBhc3NlcyBwcm9wZXJ0eQorIyB2YXJpYWJsZXMgdG8gdGhlIGVjaG8gY29tbWFuZCwgZWZmZWN0aXZlbHkgZGlzY2FyZGluZyBzdXJyb3VuZGluZyBkb3VibGUgcXVvdGVzLgorZGVmaW5lIGNvbGxhcHNlLXByb3AtcGFpcnMKKyQoc3Vic3QgIiwsJChjYWxsIGNvbGxhcHNlLXBhaXJzLCQoY2FsbCBjb2xsYXBzZS1wYWlycywkJCgkKDEpKSw/PSksPSkpCitlbmRlZgorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUywgICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMsICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9TWVNURU1fRVhUX1BST1BFUlRJRVMsICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1NZU1RFTV9FWFRfUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUywgICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUywgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX09ETV9QUk9QRVJUSUVTLCAgICAgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfT0RNX1BST1BFUlRJRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTLCAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBCb290bG9hZGVyQm9hcmROYW1lLCAkKFRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgU2RrQnVpbGQsICQoZmlsdGVyIHNkayBzZGtfYWRkb24sJChNQUtFQ01ER09BTFMpKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgU3lzdGVtU2VydmVyQ29tcGlsZXJGaWx0ZXIsICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0NPTVBJTEVSX0ZJTFRFUikpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0MTZLRGV2ZWxvcGVyT3B0aW9uLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF8xNktfREVWRUxPUEVSX09QVElPTikpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBSZWNvdmVyeURlZmF1bHRSb3RhdGlvbiwgJChUQVJHRVRfUkVDT1ZFUllfREVGQVVMVF9ST1RBVElPTikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBSZWNvdmVyeU92ZXJzY2FuUGVyY2VudCwgJChUQVJHRVRfUkVDT1ZFUllfT1ZFUlNDQU5fUEVSQ0VOVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBSZWNvdmVyeVBpeGVsRm9ybWF0LCAkKFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQpKQorCitpZmRlZiBBQl9PVEFfVVBEQVRFUgorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEFiT3RhVXBkYXRlciwgJChmaWx0ZXIgdHJ1ZSwkKEFCX09UQV9VUERBVEVSKSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBBYk90YVBhcnRpdGlvbnMsICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQUJfT1RBX1BBUlRJVElPTlMpKSkpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBVc2VEeW5hbWljUGFydGl0aW9ucywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUykpKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBSZXRyb2ZpdER5bmFtaWNQYXJ0aXRpb25zLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMpKSkKK2VuZGlmCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBEb250VXNlVmFiY090YSwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX0RPTlRfVVNFX1ZBQkNfT1RBKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBGdWxsVHJlYmxlLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9GVUxMX1RSRUJMRSkpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgTm9CaW9uaWNQYWdlU2l6ZU1hY3JvLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9wZXJ0eVNwbGl0RW5hYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEKSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFNjcmVlbkRlbnNpdHksICQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZXNWdWxrYW4sICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFU19WVUxLQU4pKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFp5Z290ZUZvcmNlNjQsICQoZmlsdGVyIHRydWUsJChaWUdPVEVfRk9SQ0VfNjQpKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yU2VjdXJpdHlQYXRjaCwgICAgICAgJChWRU5ET1JfU0VDVVJJVFlfUEFUQ0gpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9ySW1hZ2VGaWxlU3lzdGVtVHlwZSwgJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIEJ1aWxkVmVyc2lvblRhZ3MsICQoQlVJTERfVkVSU0lPTl9UQUdTKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3ROb3REZWJ1Z2dhYmxlSW5Vc2VyZGVidWcsICQoUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlc1Byb2R1Y3RJbWFnZSwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRCb290czE2SywgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9CT09UU18xNkspKSkKKworJChjYWxsIGpzb25fZW5kKQorCiskKHNoZWxsIG1rZGlyIC1wICQoZGlyICQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKSkpCiskKGZpbGUgPiQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKS50bXAsJChqc29uX2NvbnRlbnRzKSkKKworJChzaGVsbCBpZiAhIGNtcCAtcyAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUykudG1wICQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKTsgdGhlbiBcCisJICBtdiAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUykudG1wICQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKTsgXAorCWVsc2UgXAorCSAgcm0gJChTT09OR19FWFRSQV9WQVJJQUJMRVMpLnRtcDsgXAorCWZpKQpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19qYXZhX3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19qYXZhX3ByZWJ1aWx0Lm1rCmluZGV4IDdmODUyMzEuLjhjMzg4MmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5taworKysgYi9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsKQEAgLTIxLDE5ICsyMSw2IEBACiBmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIGNvbW1vbl9qYXZhbGliLmphciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYXZhbGliLmphcgogCi1pZmRlZiBMT0NBTF9TT09OR19BQVIKLSAgTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0FBUikKLWVuZGlmCi0KLSMgVXNlIHRoZSBTb29uZyBvdXRwdXQgYXMgdGhlIGNoZWNrYnVpbGQgdGFyZ2V0IGluc3RlYWQgb2YgTE9DQUxfQlVJTFRfTU9EVUxFCi0jIHRvIGF2b2lkIGNoZWNrYnVpbGRzIG1ha2luZyBhbiBleHRyYSBjb3B5IG9mIGV2ZXJ5IG1vZHVsZS4KLUxPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfSEVBREVSX0pBUikKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9GVUxMX01BTklGRVNUX0ZJTEUpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfREVYUFJFT1BUX0NPTkZJRykKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRSkKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19ERVhfSkFSKQotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTE1LDE2ICsxMDIsMTQgQEAKICAgICBib290X2phcnMgOj0gJChmb3JlYWNoIHBhaXIsJChQUk9EVUNUX0JPT1RfSkFSUyksICQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpCiAgICAgaWZuZXEgKCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFKSwkKGJvb3RfamFycykpLCkgIyBpc19ib290X2phcgogICAgICAgaWZlcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUKSkKLSAgICAgICAgIyAkKERFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0VfTU9EVUxFKSBjb250YWlucyBtb2R1bGVzIHRoYXQgaW5zdGFsbHMKLSAgICAgICAgIyBhbGwgb2YgYm9vdGphcnMnIGRleHByZW9wdCBmaWxlcyAoLmFydCwgLm9hdCwgLnZkZXgsIC4uLikKKyAgICAgICAgIyBkZXhfYm9vdGphcnMgc2luZ2xldG9uIGluc3RhbGxzIGFsbCBvZiBib290amFycycgZGV4cHJlb3B0IGZpbGVzICguYXJ0LCAub2F0LCAudmRleCwgLi4uKQorICAgICAgICAjIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGFyY2hlcy4KICAgICAgICAgIyBBZGQgdGhlbSB0byB0aGUgcmVxdWlyZWQgbGlzdCBzbyB0aGV5IGFyZSBpbnN0YWxsZWQgYWxvbmdzaWRlIHRoaXMgbW9kdWxlLgotICAgICAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlJFUVVJUkVEX0ZST01fVEFSR0VUICs9IFwKLSAgICAgICAgICAkKERFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0VfTU9EVUxFKSBcCi0gICAgICAgICAgJCgyTkRfREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUpCisgICAgICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUkVRVUlSRURfRlJPTV9UQVJHRVQgKz0gZGV4X2Jvb3RqYXJzCiAgICAgICAgICMgQ29weSAkKExPQ0FMX0JVSUxUX01PRFVMRSkgYW5kIGl0cyBkZXBlbmRlbmNpZXMgd2hlbiBpbnN0YWxsaW5nIGJvb3QuYXJ0CiAgICAgICAgICMgc28gdGhhdCBkZXBlbmRlbmNpZXMgb2YgJChMT0NBTF9CVUlMVF9NT0RVTEUpICh3aGljaCBtYXkgaW5jbHVkZQogICAgICAgICAjIGphY29jby1yZXBvcnQtY2xhc3Nlcy5qYXIpIGFyZSBjb3BpZWQgZm9yIGV2ZXJ5IGJ1aWxkLgotICAgICAgICAkKGZvcmVhY2ggbSwkKERFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0VfTU9EVUxFKSAkKDJORF9ERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSksIFwKKyAgICAgICAgJChmb3JlYWNoIG0sZGV4X2Jvb3RqYXJzLCBcCiAgICAgICAgICAgJChldmFsICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKGZpcnN0d29yZCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKG0pKSksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkgXAogICAgICAgICApCiAgICAgICBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zdGF0aWNfamF2YV9saWJyYXJ5Lm1rIGIvY29yZS9zdGF0aWNfamF2YV9saWJyYXJ5Lm1rCmluZGV4IDRhNzJhMWYuLmRkMWQ4YjUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsKQEAgLTIyOSwzICsyMjksNSBAQAogYWFyX2NsYXNzZXNfamFyIDo9CiBhbGxfcmVzX2Fzc2V0cyA6PQogTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSA6PQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9U1RBVElDX0pBVkFfTElCUkFSWSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tayBiL2NvcmUvc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggMDM5MjQ2MC4uODQ0MzYwZSAxMDA2NDQKLS0tIGEvY29yZS9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5taworKysgYi9jb3JlL3N0YXRpY19saWJyYXJ5X2ludGVybmFsLm1rCkBAIC00MSwzICs0MSw1IEBACiAkKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKSA6ICQoTE9DQUxfR0NOT19GSUxFUykgJChidWlsdF93aG9sZV9nY25vX2xpYnJhcmllcykKIAkkKHBhY2thZ2UtY292ZXJhZ2UtZmlsZXMpCiBlbmRpZgorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9U1RBVElDX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvc3lzcHJvcC5tayBiL2NvcmUvc3lzcHJvcC5tawppbmRleCA0N2Q4YTQxLi5kYzZmMmM0IDEwMDY0NAotLS0gYS9jb3JlL3N5c3Byb3AubWsKKysrIGIvY29yZS9zeXNwcm9wLm1rCkBAIC0zMywzNCArMzMsMjYgQEAKICAgICBlY2hvICIjIGZyb20gZ2VuZXJhdGUtY29tbW9uLWJ1aWxkLXByb3BzIiA+PiAkKDIpO1wKICAgICBlY2hvICIjIFRoZXNlIHByb3BlcnRpZXMgaWRlbnRpZnkgdGhpcyBwYXJ0aXRpb24gaW1hZ2UuIiA+PiAkKDIpO1wKICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICQoMik7XAotICAgICQoaWYgJChmaWx0ZXIgc3lzdGVtLCQoMSkpLFwKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLmJyYW5kPSQoUFJPRFVDVF9TWVNURU1fQlJBTkQpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLmRldmljZT0kKFBST0RVQ1RfU1lTVEVNX0RFVklDRSkiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubWFudWZhY3R1cmVyPSQoUFJPRFVDVF9TWVNURU1fTUFOVUZBQ1RVUkVSKSIgPj4gJCgyKTtcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tb2RlbD0kKFBST0RVQ1RfU1lTVEVNX01PREVMKSIgPj4gJCgyKTtcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5uYW1lPSQoUFJPRFVDVF9TWVNURU1fTkFNRSkiID4+ICQoMik7XAotICAgICAgLFwKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLmJyYW5kPSQoUFJPRFVDVF9CUkFORCkiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkuZGV2aWNlPSQoVEFSR0VUX0RFVklDRSkiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubWFudWZhY3R1cmVyPSQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1vZGVsPSQoUFJPRFVDVF9NT0RFTCkiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubmFtZT0kKFRBUkdFVF9QUk9EVUNUKSIgPj4gJCgyKTtcCi0gICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX01PREVMX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKLSAgICAgICAgICAgIGVjaG8gInJvLnByb2R1Y3QubW9kZWxfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZmk7IFwKLSAgICAgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfQlJBTkRfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAotICAgICAgICAgICAgZWNobyAicm8ucHJvZHVjdC5icmFuZF9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAotICAgICAgICBmaTsgXAotICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKLSAgICAgICAgICAgIGVjaG8gInJvLnByb2R1Y3QubmFtZV9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX0RFVklDRV9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0LmRldmljZV9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX0RFVklDRV9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZmk7IFwKLSAgICAgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKLSAgICAgICAgICAgIGVjaG8gInJvLnByb2R1Y3QubWFudWZhY3R1cmVyX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAotICAgICAgICBmaTsgXAotICAgIClcCisgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLmJyYW5kPSQoUFJPRFVDVF9CUkFORCkiID4+ICQoMik7XAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5kZXZpY2U9JChUQVJHRVRfREVWSUNFKSIgPj4gJCgyKTtcCisgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1hbnVmYWN0dXJlcj0kKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgPj4gJCgyKTtcCisgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1vZGVsPSQoUFJPRFVDVF9NT0RFTCkiID4+ICQoMik7XAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5uYW1lPSQoVEFSR0VUX1BST0RVQ1QpIiA+PiAkKDIpO1wKKyAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgIGVjaG8gInJvLnByb2R1Y3QubW9kZWxfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICBmaTsgXAorICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKKyAgICAgICAgZWNobyAicm8ucHJvZHVjdC5icmFuZF9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAorICAgIGZpOyBcCisgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTkFNRV9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgIGVjaG8gInJvLnByb2R1Y3QubmFtZV9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgZmk7IFwKKyAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0LmRldmljZV9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX0RFVklDRV9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICBmaTsgXAorICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgIGVjaG8gInJvLnByb2R1Y3QubWFudWZhY3R1cmVyX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAorICAgIGZpOyBcCiAgICAgJChpZiAkKGZpbHRlciB0cnVlLCQoWllHT1RFX0ZPUkNFXzY0KSksXAogICAgICAgICAkKGlmICQoZmlsdGVyIHZlbmRvciwkKDEpKSxcCiAgICAgICAgICAgICBlY2hvICJyby4kKDEpLnByb2R1Y3QuY3B1LmFiaWxpc3Q9JChUQVJHRVRfQ1BVX0FCSV9MSVNUXzY0X0JJVCkiID4+ICQoMik7XApAQCAtMjI2LDUwICsyMTgsMTEgQEAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgc3lzdGVtL2J1aWxkLnByb3AKICMKLSMgTm90ZTogcGFydHMgb2YgdGhpcyBmaWxlIHRoYXQgY2FuJ3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZC1wcm9wZXJ0aWVzCi0jIG1hY3JvIGFyZSBtYW51YWxseSBjcmVhdGVkIGFzIHNlcGFyYXRlIGZpbGVzIGFuZCB0aGVuIGZlZCBpbnRvIHRoZSBtYWNybwotCi1idWlsZGluZm9fcHJvcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxidWlsZGluZm8ucHJvcCkvYnVpbGRpbmZvLnByb3AKLQotaWZkZWYgVEFSR0VUX1NZU1RFTV9QUk9QCi1zeXN0ZW1fcHJvcF9maWxlIDo9ICQoVEFSR0VUX1NZU1RFTV9QUk9QKQotZWxzZQotc3lzdGVtX3Byb3BfZmlsZSA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3N5c3RlbS5wcm9wKQotZW5kaWYKLQotX3Byb3BfZmlsZXNfIDo9IFwKLSAgJChidWlsZGluZm9fcHJvcCkgXAotICAkKHN5c3RlbV9wcm9wX2ZpbGUpCi0KLSMgT3JkZXIgbWF0dGVycyBoZXJlLiBXaGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCB0aGUgbGFzdCBvbmUgd2lucy4KLSMgVE9ETyhiLzExNzg5MjMxOCk6IGRvbid0IGFsbG93IGR1cGxpY2F0ZXMgc28gdGhhdCB0aGUgb3JkZXJpbmcgZG9lc24ndCBtYXR0ZXIKLV9wcm9wX3ZhcnNfIDo9IFwKLSAgICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIFwKLSAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTCi0KLSMgVE9ETyhiLzExNzg5MjMxOCk6IGRlcHJlY2F0ZSB0aGlzCi1fcHJvcF92YXJzXyArPSBcCi0gICAgUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTCi0KLWlmbmRlZiBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAotX3Byb3BfdmFyc18gKz0gXAotICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgXAotICAgIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMKLWVuZGlmCisjIHN5c3RlbS9idWlsZC5wcm9wIGlzIGJ1aWx0IGJ5IFNvb25nLiBTZWUgc3lzdGVtLWJ1aWxkLnByb3AgbW9kdWxlIGluCisjIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAuCiAKIElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9PVVQpL2J1aWxkLnByb3AKIAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBzeXN0ZW0sXAotICAgICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChfcHJvcF9maWxlc18pLFwKLSAgICAkKF9wcm9wX3ZhcnNfKSxcCi0gICAgJChQUk9EVUNUX1NZU1RFTV9QUk9QRVJUWV9CTEFDS0xJU1QpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKSkpCi0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdmVuZG9yL2J1aWxkLnByb3AKICMKQEAgLTMxMyw4MyArMjY2LDE4IEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHByb2R1Y3QvZXRjL2J1aWxkLnByb3AKICMKLQotX3Byb3BfZmlsZXNfIDo9ICQoaWYgJChUQVJHRVRfUFJPRFVDVF9QUk9QKSxcCi0gICAgJChUQVJHRVRfUFJPRFVDVF9QUk9QKSxcCi0gICAgJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9wcm9kdWN0LnByb3ApKQotCi0jIE9yZGVyIG1hdHRlcnMgaGVyZS4gV2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlcywgdGhlIGxhc3Qgb25lIHdpbnMuCi0jIFRPRE8oYi8xMTc4OTIzMTgpOiBkb24ndCBhbGxvdyBkdXBsaWNhdGVzIHNvIHRoYXQgdGhlIG9yZGVyaW5nIGRvZXNuJ3QgbWF0dGVyCi1fcHJvcF92YXJzXyA6PSBcCi0gICAgQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgXAotICAgIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTCisjIHByb2R1Y3QvZXRjL2J1aWxkLnByb3AgaXMgYnVpbHQgYnkgU29vbmcuIFNlZSBwcm9kdWN0LWJ1aWxkLnByb3AgbW9kdWxlIGluCisjIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAuCiAKIElOU1RBTExFRF9QUk9EVUNUX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9QUk9EVUNUKS9ldGMvYnVpbGQucHJvcAogCi1pZmRlZiBQUk9EVUNUX09FTV9QUk9QRVJUSUVTCi1pbXBvcnRfb2VtX3Byb3AgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsaW1wb3J0X29lbV9wcm9wKS9vZW0ucHJvcAotCi0kKGltcG9ydF9vZW1fcHJvcCk6Ci0JJChoaWRlKSBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICRAOyBcCi0JICAgICAgICBlY2hvICIjIFBST0RVQ1RfT0VNX1BST1BFUlRJRVMiID4+ICRAOyBcCi0JICAgICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICRAOwotCSQoaGlkZSkgJChmb3JlYWNoIHByb3AsJChQUk9EVUNUX09FTV9QUk9QRVJUSUVTKSwgXAotCSAgICBlY2hvICJpbXBvcnQgL29lbS9vZW0ucHJvcCAkKHByb3ApIiA+PiAkQDspCi0KLV9mb290ZXJzXyA6PSAkKGltcG9ydF9vZW1fcHJvcCkKLWVsc2UKLV9mb290ZXJzXyA6PQotZW5kaWYKLQotIyBTa2lwIGNvbW1vbiAvcHJvZHVjdCBwcm9wZXJ0aWVzIGdlbmVyYXRpb24gaWYgZGV2aWNlIHJlbGVhc2VkIGJlZm9yZSBSIGFuZAotIyBoYXMgbm8gcHJvZHVjdCBwYXJ0aXRpb24uIFRoaXMgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNoZWNrLgotaWZlcSAoJChjYWxsIG1hdGhfbHQsJChpZiAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwzMCksMzApLCB0cnVlKQotICBfc2tpcF9jb21tb25fcHJvcGVydGllcyA6PSB0cnVlCi1lbmRpZgotCi0jIFRoZSBzZWNvbmQgcGFydCBvZiB0aGUgY2hlY2sgLSBhbHdheXMgZ2VuZXJhdGUgY29tbW9uIHByb3BlcnRpZXMgZm9yIHRoZQotIyBkZXZpY2VzIHdpdGggcHJvZHVjdCBwYXJ0aXRpb24gcmVnYXJkbGVzcyBvZiBzaGlwcGluZyBsZXZlbC4KLWlmbmVxICgkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSwpCi0gIF9za2lwX2NvbW1vbl9wcm9wZXJ0aWVzIDo9Ci1lbmRpZgotCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIHByb2R1Y3QsXAotICAgICQoSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKF9wcm9wX2ZpbGVzXyksXAotICAgICQoX3Byb3BfdmFyc18pLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChfZm9vdGVyc18pLFwKLSAgICAkKF9za2lwX2NvbW1vbl9wcm9wZXJ0aWVzKSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi1fc2tpcF9jb21tb25fcHJvcGVydGllcyA6PQotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgb2RtL2V0Yy9idWlsZC5wcm9wCiAjCi1fcHJvcF9maWxlc18gOj0gJChpZiAkKFRBUkdFVF9PRE1fUFJPUCksXAotICAgICQoVEFSR0VUX09ETV9QUk9QKSxcCi0gICAgJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9vZG0ucHJvcCkpCi0KLSMgT3JkZXIgbWF0dGVycyBoZXJlLiBXaGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCB0aGUgbGFzdCBvbmUgd2lucy4KLSMgVE9ETyhiLzExNzg5MjMxOCk6IGRvbid0IGFsbG93IGR1cGxpY2F0ZXMgc28gdGhhdCB0aGUgb3JkZXJpbmcgZG9lc24ndCBtYXR0ZXIKLV9wcm9wX3ZhcnNfIDo9IFwKLSAgICBBRERJVElPTkFMX09ETV9QUk9QRVJUSUVTIFwKLSAgICBQUk9EVUNUX09ETV9QUk9QRVJUSUVTCisjIG9kbS9ldGMvYnVpbGQucHJvcCBpcyBidWlsdCBieSBTb29uZy4gU2VlIG9kbS1idWlsZC5wcm9wIG1vZHVsZSBpbgorIyBidWlsZC9zb29uZy9BbmRyb2lkLmJwLgogCiBJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9PRE0pL2V0Yy9idWlsZC5wcm9wCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIG9kbSxcCi0gICAgJChJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChfcHJvcF9maWxlc18pLFwKLSAgICAkKF9wcm9wX3ZhcnNfKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUKSkpCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB2ZW5kb3JfZGxrbS9ldGMvYnVpbGQucHJvcApAQCAtNDQyLDI1ICszMzAsMTAgQEAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgc3lzdGVtX2V4dC9ldGMvYnVpbGQucHJvcAogIwotX3Byb3BfZmlsZXNfIDo9ICQoaWYgJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSxcCi0gICAgJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSxcCi0gICAgJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9zeXN0ZW1fZXh0LnByb3ApKQotCi0jIE9yZGVyIG1hdHRlcnMgaGVyZS4gV2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlcywgdGhlIGxhc3Qgb25lIHdpbnMuCi0jIFRPRE8oYi8xMTc4OTIzMTgpOiBkb24ndCBhbGxvdyBkdXBsaWNhdGVzIHNvIHRoYXQgdGhlIG9yZGVyaW5nIGRvZXNuJ3QgbWF0dGVyCi1fcHJvcF92YXJzXyA6PSBQUk9EVUNUX1NZU1RFTV9FWFRfUFJPUEVSVElFUworIyBzeXN0ZW1fZXh0L2V0Yy9idWlsZC5wcm9wIGlzIGJ1aWx0IGJ5IFNvb25nLiBTZWUgc3lzdGVtLWJ1aWxkLnByb3AgbW9kdWxlIGluCisjIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAuCiAKIElOU1RBTExFRF9TWVNURU1fRVhUX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9ldGMvYnVpbGQucHJvcAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBzeXN0ZW1fZXh0LFwKLSAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChfcHJvcF9maWxlc18pLFwKLSAgICAkKF9wcm9wX3ZhcnNfKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfU1lTVEVNX0VYVF9CVUlMRF9QUk9QX1RBUkdFVCkpKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgcmFtZGlzay9ib290L2V0Yy9idWlsZC5wcm9wCmRpZmYgLS1naXQgYS9jb3JlL3N5c3Byb3BfY29uZmlnLm1rIGIvY29yZS9zeXNwcm9wX2NvbmZpZy5tawppbmRleCBlODQyOGM4Li42OTA2NjExIDEwMDY0NAotLS0gYS9jb3JlL3N5c3Byb3BfY29uZmlnLm1rCisrKyBiL2NvcmUvc3lzcHJvcF9jb25maWcubWsKQEAgLTE1LDU3ICsxNSw5IEBACiApCiBfYWRkaXRpb25hbF9wcm9wX3Zhcl9uYW1lcyA6PQogCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFkZCB0aGUgcHJvZHVjdC1kZWZpbmVkIHByb3BlcnRpZXMgdG8gdGhlIGJ1aWxkIHByb3BlcnRpZXMuCi1pZm5lcSAoJChCT0FSRF9QUk9QRVJUWV9PVkVSUklERVNfU1BMSVRfRU5BQkxFRCksIHRydWUpCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gJChQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUykKLWVsc2UKLSAgaWZuZGVmIEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUKLSAgICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9ICQoUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMpCi0gIGVuZGlmCi1lbmRpZgotCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLnRyZWJsZS5lbmFibGVkPSR7UFJPRFVDVF9GVUxMX1RSRUJMRX0KLQotIyBTZXQgcm8ubGxuZGsuYXBpX2xldmVsIHRvIHNob3cgdGhlIG1heGltdW0gdmVuZG9yIEFQSSBsZXZlbCB0aGF0IHRoZSBMTE5ESyBpbgotIyB0aGUgc3lzdGVtIHBhcnRpdGlvbiBzdXBwb3J0cy4KLWlmZGVmIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmxsbmRrLmFwaV9sZXZlbD0kKFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMKQotZW5kaWYKLQotIyBTZXRzIHJvLmFjdGlvbmFibGVfY29tcGF0aWJsZV9wcm9wZXJ0eS5lbmFibGVkIHRvIGtub3cgb24gcnVudGltZSB3aGV0aGVyIHRoZQotIyBhbGxvd2VkIGxpc3Qgb2YgYWN0aW9uYWJsZSBjb21wYXRpYmxlIHByb3BlcnRpZXMgaXMgZW5hYmxlZCBvciBub3QuCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmFjdGlvbmFibGVfY29tcGF0aWJsZV9wcm9wZXJ0eS5lbmFibGVkPXRydWUKLQotIyBBZGQgdGhlIHN5c3RlbSBzZXJ2ZXIgY29tcGlsZXIgZmlsdGVyIGlmIHRoZXkgYXJlIHNwZWNpZmllZCBmb3IgdGhlIHByb2R1Y3QuCi1pZm5lcSAoLCQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0NPTVBJTEVSX0ZJTFRFUikpCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uc3lzdGVtc2VydmVyY29tcGlsZXJmaWx0ZXI9JChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKQotZW5kaWYKLQotIyBBZGQgdGhlIDE2SyBkZXZlbG9wZXIgb3B0aW9uIGlmIGl0IGlzIGRlZmluZWQgZm9yIHRoZSBwcm9kdWN0LgotaWZlcSAoJChQUk9EVUNUXzE2S19ERVZFTE9QRVJfT1BUSU9OKSx0cnVlKQotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucHJvZHVjdC5idWlsZC4xNmtfcGFnZS5lbmFibGVkPXRydWUKLWVsc2UKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYnVpbGQuMTZrX3BhZ2UuZW5hYmxlZD1mYWxzZQotZW5kaWYKLQotIyBFbmFibGUgY29yZSBwbGF0Zm9ybSBBUEkgdmlvbGF0aW9uIHdhcm5pbmdzIG9uIHVzZXJkZWJ1ZyBhbmQgZW5nIGJ1aWxkcy4KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBwZXJzaXN0LmRlYnVnLmRhbHZpay52bS5jb3JlX3BsYXRmb3JtX2FwaV9wb2xpY3k9anVzdC13YXJuCi1lbmRpZgotCi0jIERlZmluZSByby5zYW5pdGl6ZS48bmFtZT4gcHJvcGVydGllcyBmb3IgYWxsIGdsb2JhbCBzYW5pdGl6ZXJzLgotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKGZvcmVhY2ggcywkKFNBTklUSVpFX1RBUkdFVCkscm8uc2FuaXRpemUuJChzKT10cnVlKQotCi0jIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygcm8ucG9zdGluc3RhbGwuZnN0YWIucHJlZml4IHRvIC9zeXN0ZW0uCi0jIERldmljZSBib2FyZCBjb25maWcgc2hvdWxkIG92ZXJyaWRlIHRoZSB2YWx1ZSB0byAvcHJvZHVjdCB3aGVuIG5lZWRlZCBieToKLSMKLSMgICAgIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeD0vcHJvZHVjdAotIwotIyBJdCB0aGVuIHVzZXMgJHtyby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXh9L2V0Yy9mc3RhYi5wb3N0aW5zdGFsbCB0bwotIyBtb3VudCBzeXN0ZW1fb3RoZXIgcGFydGl0aW9uLgotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXg9L3N5c3RlbQorJChLQVRJX29ic29sZXRlX3ZhciBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTLFVzZSBidWlsZC9zb29uZy9zY3JpcHRzL2dlbl9idWlsZF9wcm9wLnB5IGluc3RlYWQpCiskKEtBVElfb2Jzb2xldGVfdmFyIEFERElUSU9OQUxfT0RNX1BST1BFUlRJRVMsVXNlIGJ1aWxkL3Nvb25nL3NjcmlwdHMvZ2VuX2J1aWxkX3Byb3AucHkgaW5zdGVhZCkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMsVXNlIGJ1aWxkL3Nvb25nL3NjcmlwdHMvZ2VuX2J1aWxkX3Byb3AucHkgaW5zdGVhZCkKIAogIyBBZGQgY3B1IHByb3BlcnRpZXMgZm9yIGJpb25pYyBhbmQgQVJULgogQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSByby5iaW9uaWMuYXJjaD0kKFRBUkdFVF9BUkNIKQpAQCAtMTc4LDEwNCArMTMwLDE2IEBACiAgICAgcm8uYnVpbGQuYWJfdXBkYXRlPSQoQUJfT1RBX1VQREFURVIpCiBlbmRpZgogCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5idWlsZC5jaGFyYWN0ZXJpc3RpY3M9JChUQVJHRVRfQUFQVF9DSEFSQUNURVJJU1RJQ1MpCi0KIGlmZXEgKCQoQUJfT1RBX1VQREFURVIpLHRydWUpCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LmFiX290YV9wYXJ0aXRpb25zPSQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQUJfT1RBX1BBUlRJVElPTlMpKSkKIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmVuZG9yLmJ1aWxkLmFiX290YV9wYXJ0aXRpb25zPSQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQUJfT1RBX1BBUlRJVElPTlMpKSkKIGVuZGlmCiAKLSMgU2V0IHRoaXMgcHJvcGVydHkgZm9yIFZUUyB0byBza2lwIGxhcmdlIHBhZ2Ugc2l6ZSB0ZXN0cyBvbiB1bnN1cHBvcnRlZCBkZXZpY2VzLgotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLnByb2R1Y3QuY3B1LnBhZ2VzaXplLm1heD0kKFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCkKLQotaWZlcSAoJChQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8pLHRydWUpCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LmJ1aWxkLm5vX2Jpb25pY19wYWdlX3NpemVfbWFjcm89dHJ1ZQotZW5kaWYKLQogdXNlcl92YXJpYW50IDo9ICQoZmlsdGVyIHVzZXIgdXNlcmRlYnVnLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKQotZW5hYmxlX3RhcmdldF9kZWJ1Z2dpbmcgOj0gdHJ1ZQotaWZuZXEgKCwkKHVzZXJfdmFyaWFudCkpCi0gICMgVGFyZ2V0IGlzIHNlY3VyZSBpbiB1c2VyIGJ1aWxkcy4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5zZWN1cmU9MQotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHNlY3VyaXR5LnBlcmZfaGFyZGVuPTEKLQotICBpZmVxICgkKHVzZXJfdmFyaWFudCksdXNlcikKLSAgICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmFkYi5zZWN1cmU9MQotICBlbmRpZgotCi0gIGlmbmVxICgkKHVzZXJfdmFyaWFudCksdXNlcmRlYnVnKQotICAgICMgRGlzYWJsZSBkZWJ1Z2dpbmcgaW4gcGxhaW4gdXNlciBidWlsZHMuCi0gICAgZW5hYmxlX3RhcmdldF9kZWJ1Z2dpbmcgOj0KLSAgZW5kaWYKLQotICAjIERpc2FsbG93IG1vY2sgbG9jYXRpb25zIGJ5IGRlZmF1bHQgZm9yIHVzZXIgYnVpbGRzCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWxsb3cubW9jay5sb2NhdGlvbj0wCi0KLWVsc2UgIyAhdXNlcl92YXJpYW50Ci0gICMgVHVybiBvbiBjaGVja2puaSBmb3Igbm9uLXVzZXIgYnVpbGRzLgotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmtlcm5lbC5hbmRyb2lkLmNoZWNram5pPTEKLSAgIyBTZXQgZGV2aWNlIGluc2VjdXJlIGZvciBub24tdXNlciBidWlsZHMuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTAKLSAgIyBBbGxvdyBtb2NrIGxvY2F0aW9ucyBieSBkZWZhdWx0IGZvciBub24gdXNlciBidWlsZHMKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hbGxvdy5tb2NrLmxvY2F0aW9uPTEKLWVuZGlmICMgIXVzZXJfdmFyaWFudAotCi1pZmVxICh0cnVlLCQoc3RyaXAgJChlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZykpKQotICAjIFRhcmdldCBpcyBtb3JlIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb24gYnkgZGVmYXVsdAotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmRlYnVnZ2FibGU9MQotICAjIEVuYWJsZSBEYWx2aWsgbG9jayBjb250ZW50aW9uIGxvZ2dpbmcuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmxvY2twcm9mLnRocmVzaG9sZD01MDAKLWVsc2UgIyAhZW5hYmxlX3RhcmdldF9kZWJ1Z2dpbmcKLSAgIyBUYXJnZXQgaXMgbGVzcyBkZWJ1Z2dhYmxlIGFuZCBhZGJkIGlzIG9mZiBieSBkZWZhdWx0Ci0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZGVidWdnYWJsZT0wCi1lbmRpZiAjICFlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZwotCi1pZm5lcSAoJChmaWx0ZXIgc2RrIHNka19hZGRvbiwkKE1BS0VDTURHT0FMUykpLCkKLV9pc19zZGtfYnVpbGQgOj0gdHJ1ZQotZW5kaWYKLQotaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksZW5nKQotaWZuZXEgKCQoZmlsdGVyIHJvLnNldHVwd2l6YXJkLm1vZGU9RU5BQkxFRCwgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpKSksKQotICAjIERvbid0IHJlcXVpcmUgdGhlIHNldHVwIHdpemFyZCBvbiBlbmcgYnVpbGRzCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgOj0gJChmaWx0ZXItb3V0IHJvLnNldHVwd2l6YXJkLm1vZGU9JSxcCi0gICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpKSkgXAotICAgICAgICAgIHJvLnNldHVwd2l6YXJkLm1vZGU9T1BUSU9OQUwKLWVuZGlmCi1pZm5kZWYgX2lzX3Nka19idWlsZAotICAjIFRvIHNwZWVkdXAgc3RhcnR1cCBvZiBub24tcHJlb3B0ZWQgYnVpbGRzLCBkb24ndCB2ZXJpZnkgb3IgY29tcGlsZSB0aGUgYm9vdCBpbWFnZS4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaW1hZ2UtZGV4Mm9hdC1maWx0ZXI9ZXh0cmFjdAotZW5kaWYKLSMgYi8zMjM1NjY1MzUKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gaW5pdC5zdmNfZGVidWcubm9fZmF0YWwuenlnb3RlPXRydWUKLWVuZGlmCi0KLWlmZGVmIF9pc19zZGtfYnVpbGQKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0geG1wcC5hdXRvLXByZXNlbmNlPXRydWUKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uY29uZmlnLm5vY2hlY2tpbj15ZXMKLWVuZGlmCi0KLV9pc19zZGtfYnVpbGQgOj0KLQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBuZXQuYnQubmFtZT1BbmRyb2lkCi0KLSMgVGhpcyBwcm9wZXJ0eSBpcyBzZXQgYnkgZmxhc2hpbmcgZGVidWcgYm9vdCBpbWFnZSwgc28gZGVmYXVsdCB0byBmYWxzZS4KLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZm9yY2UuZGVidWdnYWJsZT0wCiAKIGNvbmZpZ19lbmFibGVfdWZmZF9nYyA6PSBcCiAgICQoZmlyc3R3b3JkICQoT1ZFUlJJREVfRU5BQkxFX1VGRkRfR0MpICQoUFJPRFVDVF9FTkFCTEVfVUZGRF9HQykgZGVmYXVsdCkKIAotIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN5c3RlbSBwcm9wZXJ0eSB0aGF0IGNvbnRyb2xzIHRoZSBBUlQgbW9kdWxlLiBUaGUgcGxhbiBpcwotIyB0byByZW1vdmUgaXQgYnkgQXVnIDIwMjUsIGF0IHdoaWNoIHRpbWUgTWFpbmxpbmUgdXBkYXRlcyBvZiB0aGUgQVJUIG1vZHVsZQotIyB3aWxsIGlnbm9yZSBpdCBhcyB3ZWxsLgotIyBJZiB0aGUgdmFsdWUgaXMgImRlZmF1bHQiLCBpdCB3aWxsIGJlIG1hbmdsZWQgYnkgcG9zdF9wcm9jZXNzX3Byb3BzLnB5LgotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8uZGFsdmlrLnZtLmVuYWJsZV91ZmZkX2djPSQoY29uZmlnX2VuYWJsZV91ZmZkX2djKQotCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTKSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUykpCiBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTKSkKIAogLktBVElfUkVBRE9OTFkgKz0gXAotICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgXAotICAgIEFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIFwKICAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rIGIvY29yZS90YXNrcy9hcnQtaG9zdC10ZXN0cy5tawppbmRleCBjOTVmNmU3Li5lYjU0ZmFlIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvYXJ0LWhvc3QtdGVzdHMubWsKQEAgLTQ3LDIxICs0NywxNiBAQAogCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCiAJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3Q7IFwKIAlkb25lCi0JZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0IFwKLQkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IFwKIAkgIC1QIGhvc3QvdGVzdGNhc2VzIC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdCBcCiAJICAtc2hhMjU2CiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0ID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKLQlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfYXJ0X2hvc3RfdGVzdHNfY29uZmlnc196aXApIFwKLQkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKLQkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC10ZXN0LWNvbmZpZ3MubGlzdAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QtdGVzdC1jb25maWdzLmxpc3QKIAlncmVwICQoSE9TVF9PVVQpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfYXJ0X2hvc3RfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApIFwKIAkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXNoYXJlZC1saWJzLmxpc3QKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgfCBzZWQgcyUkKEhPU1RfT1VUKSVob3N0JWcgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2FydC1ob3N0LXRlc3RzX2xpc3QKLQlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQubGlzdCB8IHNlZCBzJSQoUFJPRFVDVF9PVVQpJXRhcmdldCVnID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvYXJ0LWhvc3QtdGVzdHNfbGlzdAogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9hcnRfaG9zdF90ZXN0c19saXN0X3ppcCkgLUMgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKSAtZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2FydC1ob3N0LXRlc3RzX2xpc3QKIAogYXJ0LWhvc3QtdGVzdHM6ICQoYXJ0X2hvc3RfdGVzdHNfemlwKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9hcnQubWsgYi9jb3JlL3Rhc2tzL2FydC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQ2MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9hcnQubWsKQEAgLTAsMCArMSwyNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNsZWFuLW9hdCBydWxlcworIworCisuUEhPTlk6IGNsZWFuLW9hdAorY2xlYW4tb2F0OiBjbGVhbi1vYXQtaG9zdCBjbGVhbi1vYXQtdGFyZ2V0CisKKy5QSE9OWTogY2xlYW4tb2F0LWhvc3QKK2NsZWFuLW9hdC1ob3N0OgorCWZpbmQgJChPVVRfRElSKSAnKCcgLW5hbWUgJyoub2F0JyAtbyAtbmFtZSAnKi5vZGV4JyAtbyAtbmFtZSAnKi5hcnQnIC1vIC1uYW1lICcqLnZkZXgnICcpJyAtYSAtdHlwZSBmIHwgeGFyZ3Mgcm0gLWYKKwlybSAtcmYgJChUTVBESVIpLyovdGVzdC0qL2RhbHZpay1jYWNoZS8qCisJcm0gLXJmICQoVE1QRElSKS9hbmRyb2lkLWRhdGEvZGFsdmlrLWNhY2hlLyoKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY3RzLm1rIGIvY29yZS90YXNrcy9jdHMubWsKaW5kZXggYjlmMDk4OC4uMjk0Y2I1NyAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9jdHMubWsKKysrIGIvY29yZS90YXNrcy9jdHMubWsKQEAgLTE2LDYgKzE2LDggQEAKIHRlc3Rfc3VpdGVfdHJhZGVmZWQgOj0gY3RzLXRyYWRlZmVkCiB0ZXN0X3N1aXRlX2R5bmFtaWNfY29uZmlnIDo9IGN0cy90b29scy9jdHMtdHJhZGVmZWQvRHluYW1pY0NvbmZpZy54bWwKIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IGN0cy90b29scy9jdHMtdHJhZGVmZWQvUkVBRE1FCit0ZXN0X3N1aXRlX3Rvb2xzIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2F0c19jb25zb2xlX2RlcGxveS5qYXIgXAorICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9hdHNfb2xjX3NlcnZlcl9sb2NhbF9tb2RlX2RlcGxveS5qYXIKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGVzdF9zdWl0ZV9keW5hbWljX2NvbmZpZyksY3RzKQogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGVzdF9zdWl0ZV9yZWFkbWUpLGN0cykKQEAgLTkwLDggKzkyLDE2IEBACiAKIGN0c19hcGlfY292ZXJhZ2VfZXhlIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2N0cy1hcGktY292ZXJhZ2UKIGRleGRlcHNfZXhlIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RleGRlcHMKK2N0c19hcGlfbWFwX2V4ZSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jdHMtYXBpLW1hcAogCiBjb3ZlcmFnZV9vdXQgOj0gJChIT1NUX09VVCkvY3RzLWFwaS1jb3ZlcmFnZQorYXBpX21hcF9vdXQgOj0gJChIT1NUX09VVCkvY3RzLWFwaS1tYXAKKworY3RzX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9hcGlfbWFwX2ZpbGVzLnR4dAorJChjdHNfamFyX2ZpbGVzKTogUFJJVkFURV9BUElfTUFQX0ZJTEVTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuY3RzLkFQSV9NQVBfRklMRVMpKQorJChjdHNfamFyX2ZpbGVzKToKKwlta2RpciAtcCAkKGRpciAkQCkKKwllY2hvICQoUFJJVkFURV9BUElfTUFQX0ZJTEVTKSA+ICRACiAKIGFwaV94bWxfZGVzY3JpcHRpb24gOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9hcGkueG1sCiAKQEAgLTExNCw2ICsxMjQsMTQgQEAKIGN0c19hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpICQoZGV4ZGVwc19leGUpICQoYXBpX3htbF9kZXNjcmlwdGlvbikgJChuYXBpX3htbF9kZXNjcmlwdGlvbikKIGN0c19zeXN0ZW1fYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfY292ZXJhZ2VfZXhlKSAkKGRleGRlcHNfZXhlKSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKQogCitjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9hcGktbWFwLnhtbAorY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2FwaS1tYXAuaHRtbAorY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL3N5c3RlbS1hcGktbWFwLnhtbAorY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9zeXN0ZW0tYXBpLW1hcC5odG1sCisKK2N0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX21hcF9leGUpICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pICQoY3RzX2phcl9maWxlcykKK2N0c19hcGlfbWFwX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfbWFwX2V4ZSkgJChhcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c19qYXJfZmlsZXMpCisKIGFuZHJvaWRfY3RzX3ppcCA6PSAkKEhPU1RfT1VUKS9jdHMvYW5kcm9pZC1jdHMuemlwCiBjdHNfdmVyaWZpZXJfYXBrIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsQVBQUyxDdHNWZXJpZmllcikvcGFja2FnZS5hcGsKIApAQCAtMTkyLDYgKzIxMCw0OCBAQAogLlBIT05ZOiBjdHMtY292ZXJhZ2UtcmVwb3J0LWFsbCBjdHMtYXBpLWNvdmVyYWdlCiBjdHMtY292ZXJhZ2UtcmVwb3J0LWFsbDogY3RzLXRlc3QtY292ZXJhZ2UgY3RzLXZlcmlmaWVyLWNvdmVyYWdlIGN0cy1jb21iaW5lZC1jb3ZlcmFnZSBjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlCiAKKyQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2phcl9maWxlcykKKyQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIFN5c3RlbSBBUEkgTUFQIFJlcG9ydCAtIFhNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUykseG1sKQorCiskKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKKyQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgU3lzdGVtIEFQSSBNQVAgUmVwb3J0IC0gSFRNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUyksaHRtbCkKKworJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoYXBpX3htbF9kZXNjcmlwdGlvbikKKyQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQVBJIE1BUCBSZXBvcnQgLSBYTUwiLFwKKwkJCSQoUFJJVkFURV9KQVJfRklMRVMpLHhtbCkKKworJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKKyQoY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChhcGlfeG1sX2Rlc2NyaXB0aW9uKQorJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIEFQSSBNQVAgUmVwb3J0IC0gSFRNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUyksaHRtbCkKKworLlBIT05ZOiBjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcAorY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAgOiAkKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAKK2N0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcCA6ICQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLXhtbC1hcGktbWFwCitjdHMtYXBpLXhtbC1hcGktbWFwIDogJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLWh0bWwtYXBpLW1hcAorY3RzLWFwaS1odG1sLWFwaS1tYXAgOiAkKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLW1hcC1hbGwKKwogIyBQdXQgdGhlIHRlc3QgY292ZXJhZ2UgcmVwb3J0IGluIHRoZSBkaXN0IGRpciBpZiAiY3RzLWFwaS1jb3ZlcmFnZSIgaXMgYW1vbmcgdGhlIGJ1aWxkIGdvYWxzLgogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLWNvdmVyYWdlLCAkKGN0cy10ZXN0LWNvdmVyYWdlLXJlcG9ydCk6Y3RzLXRlc3QtY292ZXJhZ2UtcmVwb3J0Lmh0bWwpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktY292ZXJhZ2UsICQoY3RzLXN5c3RlbS1hcGktY292ZXJhZ2UtcmVwb3J0KTpjdHMtc3lzdGVtLWFwaS1jb3ZlcmFnZS1yZXBvcnQuaHRtbCkKQEAgLTIwNyw2ICsyNjcsMTcgQEAKIEFMTF9UQVJHRVRTLiQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCiBBTExfVEFSR0VUUy4kKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KS5NRVRBX0xJQzo9JChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkKIAorIyBQdXQgdGhlIHRlc3QgYXBpIG1hcCByZXBvcnQgaW4gdGhlIGRpc3QgZGlyIGlmICJjdHMtYXBpLW1hcC1hbGwiIGlzIGFtb25nIHRoZSBidWlsZCBnb2Fscy4KKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6Y3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0LnhtbCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOmN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQuaHRtbCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTpjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydC54bWwpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktbWFwLWFsbCwgJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOmN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydC5odG1sKQorCitBTExfVEFSR0VUUy4kKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCisKICMgQXJndW1lbnRzOwogIyAgMSAtIE5hbWUgb2YgdGhlIHJlcG9ydCBwcmludGVkIG91dCBvbiB0aGUgc2NyZWVuCiAjICAyIC0gTGlzdCBvZiBhcGsgZmlsZXMgdGhhdCB3aWxsIGJlIHNjYW5uZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydApAQCAtMjE3LDIzICsyODgsNDIgQEAKIAlAIGVjaG8gJCgxKTogZmlsZTovLyQkKGNkICQoZGlyICRAKTsgcHdkKS8kKG5vdGRpciAkQCkKIGVuZGVmCiAKKyMgQXJndW1lbnRzOworIyAgMSAtIE5hbWUgb2YgdGhlIHJlcG9ydCBwcmludGVkIG91dCBvbiB0aGUgc2NyZWVuCisjICAyIC0gQSBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlcyB0aGF0IHRvIGJlIGFuYWx5emVkCisjICAzIC0gRm9ybWF0IG9mIHRoZSByZXBvcnQKK2RlZmluZSBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMKKwkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgJChQUklWQVRFX0NUU19BUElfTUFQX0VYRSkgLWogOCAtYSAkKFBSSVZBVEVfQVBJX1hNTF9ERVNDKSAtaSAkKDIpIC1mICQoMykgLW8gJEAKKwlAIGVjaG8gJCgxKTogZmlsZTovLyQkKGNkICQoZGlyICRAKTsgcHdkKS8kKG5vdGRpciAkQCkKK2VuZGVmCisKICMgUmVzZXQgdGVtcCB2YXJzCiBjdHNfYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcyA6PQogY3RzX3N5c3RlbV9hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9CitjdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KK2N0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KIGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtdGVzdC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1zeXN0ZW0tYXBpLWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLXN5c3RlbS1hcGkteG1sLWNvdmVyYWdlLXJlcG9ydCA6PQorY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQgOj0KK2N0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCA6PQorY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9CitjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0IDo9CiBhcGlfeG1sX2Rlc2NyaXB0aW9uIDo9CiBhcGlfdGV4dF9kZXNjcmlwdGlvbiA6PQogc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24gOj0KIG5hcGlfeG1sX2Rlc2NyaXB0aW9uIDo9CiBuYXBpX3RleHRfZGVzY3JpcHRpb24gOj0KIGNvdmVyYWdlX291dCA6PQorYXBpX21hcF9vdXQgOj0KK2N0c19qYXJfZmlsZXMgOj0KIGRleGRlcHNfZXhlIDo9CiBjdHNfYXBpX2NvdmVyYWdlX2V4ZSA6PQorY3RzX2FwaV9tYXBfZXhlIDo9CiBjdHNfdmVyaWZpZXJfYXBrIDo9CiBhbmRyb2lkX2N0c196aXAgOj0KIGN0cy1kaXIgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvaG9zdC11bml0LXRlc3RzLm1rIGIvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsKaW5kZXggNzMzYTJlMi4uNGNiMjNjMCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsKQEAgLTI5LDE1ICsyOSwyOCBAQAogICAgICQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAogICAgICQoX2NtZl9zcmMpKSkKIAorbXlfc3ltbGlua3NfZm9yX2hvc3RfdW5pdF90ZXN0cyA6PSAkKGZvcmVhY2ggZiwkKENPTVBBVElCSUxJVFkuaG9zdC11bml0LXRlc3RzLlNZTUxJTktTKSxcCisJJChzdHJpcCAkKGV2YWwgX2NtZl90dXBsZSA6PSAkKHN1YnN0IDosICwkKGYpKSkgXAorCSQoZXZhbCBfY21mX2RlcCA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAorCSQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMiwkKF9jbWZfdHVwbGUpKSkgXAorCSQoZXZhbCBfY21mX2Rlc3QgOj0gJCh3b3JkIDMsJChfY21mX3R1cGxlKSkpIFwKKwkkKGNhbGwgc3ltbGluay1maWxlLCQoX2NtZl9kZXApLCQoX2NtZl9zcmMpLCQoX2NtZl9kZXN0KSkgXAorCSQoX2NtZl9kZXN0KSkpCisKICQoaG9zdF91bml0X3Rlc3RzX3ppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2hvc3RfdW5pdF90ZXN0cykKIAotJChob3N0X3VuaXRfdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5ob3N0LXVuaXQtdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9ob3N0X3VuaXRfdGVzdHMpICQoU09PTkdfWklQKQorJChob3N0X3VuaXRfdGVzdHNfemlwKSA6IFBSSVZBVEVfU1lNTElOS1MgOj0gJChteV9zeW1saW5rc19mb3JfaG9zdF91bml0X3Rlc3RzKQorCiskKGhvc3RfdW5pdF90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmhvc3QtdW5pdC10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2hvc3RfdW5pdF90ZXN0cykgJChteV9zeW1saW5rc19mb3JfaG9zdF91bml0X3Rlc3RzKSAkKFNPT05HX1pJUCkKIAllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuaG9zdC11bml0LXRlc3RzLkZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICRALmxpc3QKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtaG9zdC5saXN0IHx8IHRydWUKIAllY2hvICIiID4+ICRALWhvc3QtbGlicy5saXN0CiAJJChoaWRlKSBmb3Igc2hhcmVkX2xpYiBpbiAkKFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyk7IGRvIFwKIAkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICRALWhvc3QtbGlicy5saXN0OyBcCiAJZG9uZQorCSQoaGlkZSkgZm9yIHN5bWxpbmsgaW4gJChQUklWQVRFX1NZTUxJTktTKTsgZG8gXAorCSAgZWNobyAkJHN5bWxpbmsgPj4gJEAtaG9zdC5saXN0OyBcCisJZG9uZQogCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3QubGlzdCBcCiAJICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJEAtdGFyZ2V0Lmxpc3QgXApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tY3RzLm1rIGIvY29yZS90YXNrcy9tY3RzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTQxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL21jdHMubWsKQEAgLTAsMCArMSwzMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZuZXEgKCQod2lsZGNhcmQgdGVzdC9tdHMvUkVBRE1FLm1kKSwpCisKK21jdHNfdGVzdF9zdWl0ZXMgOj0KK21jdHNfdGVzdF9zdWl0ZXMgKz0gbWN0cworCiskKGZvcmVhY2ggbW9kdWxlLCAkKG10c19tb2R1bGVzKSwgJChldmFsIG1jdHNfdGVzdF9zdWl0ZXMgKz0gbWN0cy0kKG1vZHVsZSkpKQorCiskKGZvcmVhY2ggc3VpdGUsICQobWN0c190ZXN0X3N1aXRlcyksIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV9uYW1lIDo9ICQoc3VpdGUpKSBcCisJJChldmFsIHRlc3Rfc3VpdGVfdHJhZGVmZWQgOj0gbXRzLXRyYWRlZmVkKSBcCisJJChldmFsIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvbXRzL1JFQURNRS5tZCkgXAorCSQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rKSBcCisJJChldmFsIC5QSE9OWTogJChzdWl0ZSkpIFwKKwkkKGV2YWwgJChzdWl0ZSk6ICQoY29tcGF0aWJpbGl0eV96aXApKSBcCisJJChldmFsICQoY2FsbCBkaXN0LWZvci1nb2FscywgJChzdWl0ZSksICQoY29tcGF0aWJpbGl0eV96aXApKSkgXAorKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tZXRhLWxpYy5tayBiL2NvcmUvdGFza3MvbWV0YS1saWMubWsKaW5kZXggYzQxZGU2My4uMjRhZGZjOCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9tZXRhLWxpYy5taworKysgYi9jb3JlL3Rhc2tzL21ldGEtbGljLm1rCkBAIC0zMCw2ICszMCwyMyBAQAogJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9hdHYsYXR2LWNvbXBvbmVudC1vdmVycmlkZXMueG1sKSkKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvYXR2LHR2X2NvcmVfaGFyZHdhcmUueG1sKSkKIAorIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9icmFtYmxlL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGRlZmF1bHQtcGVybWlzc2lvbnMueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSx1ZXZlbnRkLnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHRhc2tfcHJvZmlsZXMuanNvbixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxwMnBfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsd3BhX3N1cHBsaWNhbnRfb3ZlcmxheS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCisKICMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvYmFyYmV0L0FuZHJvaWQubWsKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQogJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCxsaWJuZmMtbmNpLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQpAQCAtNjYsNiArODMsNDAgQEAKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY29yYWwsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY29yYWwsZGlzcGxheV8xOTI2MDUwNDU3NTA5MDgxNy54bWwpKQogCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsLmlkYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxkZWZhdWx0LXBlcm1pc3Npb25zLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxsaWJuZmMtbmNpLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZnN0YWIucG9zdGluc3RhbGwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsdWV2ZW50ZC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGhhbHMuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxkZXZpY2Vfc3RhdGVfY29uZmlndXJhdGlvbi54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gscDJwX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHdwYV9zdXBwbGljYW50X292ZXJsYXkuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCx3cGFfc3VwcGxpY2FudC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxpbml0LmN1dGZfY3ZtLnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGZzdGFiLmNmLmYyZnMuaGN0cjIsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZnN0YWIuY2YuZjJmcy5jdHMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZnN0YWIuY2YuZXh0NC5oY3RyMixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxmc3RhYi5jZi5leHQ0LmN0cyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxpbml0LnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGF1ZGlvX3BvbGljeS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gvc2hhcmVkL2NvbmZpZyxwY2kuaWRzLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRC0zLUNsYXVzZSxub3RpY2UsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoL3NoYXJlZC9jb25maWcvTElDRU5TRV9CU0QsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHByaXZhcHAtcGVybWlzc2lvbnMtY3V0dGxlZmlzaC54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxjdXR0bGVmaXNoX2V4Y2x1ZGVkX2hhcmR3YXJlLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsbWVkaWFfY29kZWNzLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGNhcl9hdWRpb19jb25maWd1cmF0aW9uLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxwcmVpbnN0YWxsZWQtcGFja2FnZXMtcHJvZHVjdC1jYXItY3V0dGxlZmlzaC54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsaGFyZHdhcmUvZ29vZ2xlL2NhbWVyYS9kZXZpY2VzLC5qc29uKSkKKwogIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9nczEwMS9BbmRyb2lkLm1rCiAkKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQogJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCkBAIC0xNDcsMyArMTk4LDMwIEBACiAjIE1vdmVkIGhlcmUgZnJvbSBoYXJkd2FyZS9pbnRlcmZhY2VzL3R2L0FuZHJvaWQubWsKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2ludGVyZmFjZXMvdHYsdHVuZXJfdnRzX2NvbmZpZ18xXzAueG1sKSkKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2ludGVyZmFjZXMvdHYsdHVuZXJfdnRzX2NvbmZpZ18xXzEueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5wdXQsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3dpZmksKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsaGFscy5jb25mKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGluaXQucWVtdS1hZGIta2V5cy5zaCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxpbml0LnN5c3RlbV9leHQucmMpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsLmpzb24pKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsdWV2ZW50ZC5yYykpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCx3cGFfc3VwcGxpY2FudC5jb25mKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGluaXQucmFuY2h1LnJjKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGZzdGFiLnJhbmNodSkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxkaXNwbGF5X3NldHRpbmdzLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxkaXNwbGF5X3NldHRpbmdzX2ZyZWVmb3JtLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxkZXZpY2Vfc3RhdGVfY29uZmlndXJhdGlvbi54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsaW5pdC5yYW5jaHUtY29yZS5zaCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxpbml0LnJhbmNodS1uZXQuc2gpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gcGFja2FnZXMvc2VydmljZXMvQ2FyL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLHBhY2thZ2VzL3NlcnZpY2VzL0NhciwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBoYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5LCkpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rIGIvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tawppbmRleCA3NTkzNjY4Li4wY2EyN2Q4IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCisrKyBiL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKQEAgLTEzLDcgKzEzLDcgQEAKICQoaWYgJChzdHJpcCAkKDIpKSwnJChDT01NQSkkKHN0cmlwICQoMSkpOiAiJChzdHJpcCAkKDIpKSInKQogZW5kZWYKIAotU09PTkdfTU9EVUxFX0lORk8gOj0gJChTT09OR19PVVRfRElSKS9tb2R1bGUtaW5mby0kKFRBUkdFVF9QUk9EVUNUKS5qc29uCitTT09OR19NT0RVTEVfSU5GTyA6PSAkKFNPT05HX09VVF9ESVIpL21vZHVsZS1pbmZvLSQoVEFSR0VUX1BST0RVQ1QpJHtDT1ZFUkFHRV9TVUZGSVh9Lmpzb24KIAogJChNT0RVTEVfSU5GT19KU09OKTogUFJJVkFURV9TT09OR19NT0RVTEVfSU5GTyA6PSAkKFNPT05HX01PRFVMRV9JTkZPKQogJChNT0RVTEVfSU5GT19KU09OKTogUFJJVkFURV9NRVJHRV9KU09OX09CSkVDVFMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWVyZ2VfbW9kdWxlX2luZm9fanNvbgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9yZWNvdmVyeV9zbmFwc2hvdC5tayBiL2NvcmUvdGFza3MvcmVjb3Zlcnlfc25hcHNob3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTI3M2IuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy9yZWNvdmVyeV9zbmFwc2hvdC5taworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWN1cnJlbnRfbWFrZWZpbGUgOj0gJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQotCi0jIFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnIGluIG9yZGVyIHRvIGdlbmVyYXRlIGEgcmVjb3Zlcnkgc25hcHNob3QuCi1pZmVxICgkKFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04pLGN1cnJlbnQpCi0KLS5QSE9OWTogcmVjb3Zlcnktc25hcHNob3QKLXJlY292ZXJ5LXNuYXBzaG90OiAkKFNPT05HX1JFQ09WRVJZX1NOQVBTSE9UX1pJUCkKLQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCByZWNvdmVyeS1zbmFwc2hvdCwgJChTT09OR19SRUNPVkVSWV9TTkFQU0hPVF9aSVApKQotCi1lbHNlICMgUkVDT1ZFUllfU05BUFNIT1RfVkVSU0lPTiBpcyBOT1Qgc2V0IHRvICdjdXJyZW50JwotCi0uUEhPTlk6IHJlY292ZXJ5LXNuYXBzaG90Ci1yZWNvdmVyeS1zbmFwc2hvdDogUFJJVkFURV9NQUtFRklMRSA6PSAkKGN1cnJlbnRfbWFrZWZpbGUpCi1yZWNvdmVyeS1zbmFwc2hvdDoKLQkkKGNhbGwgZWNoby1lcnJvciwkKFBSSVZBVEVfTUFLRUZJTEUpLFwKLQkJIkNBTk5PVCBnZW5lcmF0ZSBSZWNvdmVyeSBzbmFwc2hvdC4gUkVDT1ZFUllfU05BUFNIT1RfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcuIikKLQlleGl0IDEKLQotZW5kaWYgIyBSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3N0cy1saXRlLm1rIGIvY29yZS90YXNrcy9zdHMtc2RrLm1rCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGNvcmUvdGFza3Mvc3RzLWxpdGUubWsKcmVuYW1lIHRvIGNvcmUvdGFza3Mvc3RzLXNkay5tawppbmRleCA2NWM2NWMzLi5iOGNlNWJmIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3N0cy1saXRlLm1rCisrKyBiL2NvcmUvdGFza3Mvc3RzLXNkay5tawpAQCAtMTMsMjYgKzEzLDI1IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBpZm5lcSAoJCh3aWxkY2FyZCB0ZXN0L3N0cy9SRUFETUUtc3RzLXNkay5tZCksKQotdGVzdF9zdWl0ZV9uYW1lIDo9IHN0cy1saXRlCit0ZXN0X3N1aXRlX25hbWUgOj0gc3RzLXNkawogdGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBzdHMtdHJhZGVmZWQKIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3Qvc3RzL1JFQURNRS1zdHMtc2RrLm1kCiBzdHNfc2RrX3ppcCA6PSAkKEhPU1RfT1VUKS8kKHRlc3Rfc3VpdGVfbmFtZSkvc3RzLXNkay56aXAKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawogCi1zdHNfc2RrX3NhbXBsZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsc3RzLXNkay1zYW1wbGVzLnppcCkvc3RzLXNkay1zYW1wbGVzLnppcAorc3RzX3Nka19wbHVnaW5fc2tlbCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxzdHMtc2RrLXBsdWdpbi1za2VsLnppcCkvc3RzLXNkay1wbHVnaW4tc2tlbC56aXAKIAotJChzdHNfc2RrX3ppcCk6IFNUU19MSVRFX1pJUCA6PSAkKGNvbXBhdGliaWxpdHlfemlwKQotJChzdHNfc2RrX3ppcCk6IFNUU19TREtfU0FNUExFUyA6PSAkKHN0c19zZGtfc2FtcGxlcykKLSQoc3RzX3Nka196aXApOiAkKE1FUkdFX1pJUFMpICQoWklQMlpJUCkgJChjb21wYXRpYmlsaXR5X3ppcCkgJChzdHNfc2RrX3NhbXBsZXMpCi0Jcm0gLWYgJEAgJChTVFNfTElURV9aSVApX2ZpbHRlcmVkCi0JJChaSVAyWklQKSAtaSAkKFNUU19MSVRFX1pJUCkgLW8gJChTVFNfTElURV9aSVApX2ZpbHRlcmVkIFwKLQkJLXggYW5kcm9pZC1zdHMtbGl0ZS90b29scy9zdHMtdHJhZGVmZWQtdGVzdHMuamFyIFwKLQkJJ2FuZHJvaWQtc3RzLWxpdGUvdG9vbHMvKjpzdHMtdGVzdC9saWJzLycgXAotCQknYW5kcm9pZC1zdHMtbGl0ZS90ZXN0Y2FzZXMvKjpzdHMtdGVzdC91dGlscy8nIFwKLQkJJ2FuZHJvaWQtc3RzLWxpdGUvamRrLyoqLyo6c3RzLXRlc3QvamRrLycKLQkkKE1FUkdFX1pJUFMpICRAICQoU1RTX0xJVEVfWklQKV9maWx0ZXJlZCAkKFNUU19TREtfU0FNUExFUykKLQlybSAtZiAkKFNUU19MSVRFX1pJUClfZmlsdGVyZWQKKyQoc3RzX3Nka196aXApOiBTVFNfU0RLX1pJUCA6PSAkKGNvbXBhdGliaWxpdHlfemlwKQorJChzdHNfc2RrX3ppcCk6IFNUU19TREtfUExVR0lOX1NLRUwgOj0gJChzdHNfc2RrX3BsdWdpbl9za2VsKQorJChzdHNfc2RrX3ppcCk6ICQoTUVSR0VfWklQUykgJChaSVAyWklQKSAkKGNvbXBhdGliaWxpdHlfemlwKSAkKHN0c19zZGtfcGx1Z2luX3NrZWwpCisJcm0gLWYgJEAgJChTVFNfU0RLX1pJUClfZmlsdGVyZWQKKwkkKFpJUDJaSVApIC1pICQoU1RTX1NES19aSVApIC1vICQoU1RTX1NES19aSVApX2ZpbHRlcmVkIFwKKwkJLXggYW5kcm9pZC1zdHMtc2RrL3Rvb2xzL3N0cy10cmFkZWZlZC10ZXN0cy5qYXIgXAorCQknYW5kcm9pZC1zdHMtc2RrL3Rvb2xzLyo6cGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9zdHMtdHJhZGVmZWQtdG9vbHMvJyBcCisJCSdhbmRyb2lkLXN0cy1zZGsvamRrLyoqLyo6cGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9qZGsvJworCSQoTUVSR0VfWklQUykgJEAgJChTVFNfU0RLX1pJUClfZmlsdGVyZWQgJChTVFNfU0RLX1BMVUdJTl9TS0VMKQorCXJtIC1mICQoU1RTX1NES19aSVApX2ZpbHRlcmVkCiAKIC5QSE9OWTogc3RzLXNkawogc3RzLXNkazogJChzdHNfc2RrX3ppcCkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tayBiL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawppbmRleCA0ZTc4ZDg5Li44NmMyM2Y4IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKKysrIGIvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCkBAIC0yNiw3ICsyNiwxNSBAQAogIyBPdXRwdXQgdmFyaWFibGVzOgogIyAgIGNvbXBhdGliaWxpdHlfemlwOiB0aGUgcGF0aCB0byB0aGUgb3V0cHV0IHppcCBmaWxlLgogCi10ZXN0X3N1aXRlX3N1YmRpciA6PSBhbmRyb2lkLSQodGVzdF9zdWl0ZV9uYW1lKQorc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMgOj0KK3NwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzICs9IG1jdHMKK3NwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzICs9ICQobXRzX21vZHVsZXMpCitpZm5lcSAoJChmaWx0ZXIgJChzcGVjaWFsX210c190ZXN0X3N1aXRlcyksJChzdWJzdCAtLCAsJCh0ZXN0X3N1aXRlX25hbWUpKSksKQorCXRlc3Rfc3VpdGVfc3ViZGlyIDo9IGFuZHJvaWQtbXRzCitlbHNlCisJdGVzdF9zdWl0ZV9zdWJkaXIgOj0gYW5kcm9pZC0kKHRlc3Rfc3VpdGVfbmFtZSkKK2VuZGlmCisKIG91dF9kaXIgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpLyQodGVzdF9zdWl0ZV9zdWJkaXIpCiB0ZXN0X2FydGlmYWN0cyA6PSAkKENPTVBBVElCSUxJVFkuJCh0ZXN0X3N1aXRlX25hbWUpLkZJTEVTKQogdGVzdF90b29scyA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS90cmFkZWZlZC5qYXIgXApAQCAtMTA3LDkgKzExNSw5IEBACiBjb21wYXRpYmlsaXR5X3ppcF9kZXBzICs9ICQodGVzdF9zdWl0ZV9ub3RpY2VfdHh0KQogY29tcGF0aWJpbGl0eV96aXBfcmVzb3VyY2VzICs9ICQodGVzdF9zdWl0ZV9ub3RpY2VfdHh0KQogCi1jb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwIDo9ICQob3V0X2RpciktdGVzdHNfbGlzdC56aXAKK2NvbXBhdGliaWxpdHlfdGVzdHNfbGlzdF96aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2FuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpLXRlc3RzX2xpc3QuemlwCiAKLWNvbXBhdGliaWxpdHlfemlwIDo9ICQob3V0X2RpcikuemlwCitjb21wYXRpYmlsaXR5X3ppcCA6PSAkKEhPU1RfT1VUKS8kKHRlc3Rfc3VpdGVfbmFtZSkvYW5kcm9pZC0kKHRlc3Rfc3VpdGVfbmFtZSkuemlwCiAkKGNvbXBhdGliaWxpdHlfemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChjb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwKQogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfT1VUX0RJUiA6PSAkKG91dF9kaXIpCiAkKGNvbXBhdGliaWxpdHlfemlwKTogUFJJVkFURV9UT09MUyA6PSAkKHRlc3RfdG9vbHMpICQodGVzdF9zdWl0ZV9wcmVidWlsdF90b29scykKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdHJhZGVmZWQtdGVzdHMtbGlzdC5tayBiL2NvcmUvdGFza3MvdHJhZGVmZWQtdGVzdHMtbGlzdC5tawppbmRleCA2MWJmMTM2Li40N2MzNjBkIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsKKysrIGIvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rCkBAIC0xNSw2ICsxNSwxMSBAQAogIyBMaXN0IGFsbCBUcmFkZUZlZCB0ZXN0cyBmcm9tIENPTVBBVElCSUxJVFkudHJhZGVmZWRfdGVzdHNfZGlyCiAuUEhPTlk6IHRyYWRlZmVkLXRlc3RzLWxpc3QKIAorQ09NUEFUSUJJTElUWS50cmFkZWZlZF90ZXN0c19kaXIgOj0gXAorICAkKENPTVBBVElCSUxJVFkudHJhZGVmZWRfdGVzdHNfZGlyKSBcCisgIHRvb2xzL3RyYWRlZmVkZXJhdGlvbi9jb3JlL3Jlcy9jb25maWcgXAorICB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZS9qYXZhdGVzdHMvcmVzL2NvbmZpZworCiB0cmFkZWZlZF90ZXN0cyA6PQogJChmb3JlYWNoIGRpciwgJChDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpciksIFwKICAgJChldmFsIHRyYWRlZmVkX3Rlc3RzICs9ICQoc2hlbGwgZmluZCAkKGRpcikgLXR5cGUgZiAtbmFtZSAiKi54bWwiKSkpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3ZlbmRvcl9zbmFwc2hvdC5tayBiL2NvcmUvdGFza3MvdmVuZG9yX3NuYXBzaG90Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2MxMzc5Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3MvdmVuZG9yX3NuYXBzaG90Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY3VycmVudF9tYWtlZmlsZSA6PSAkKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpCi0KLSMgQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50JyBpbiBvcmRlciB0byBnZW5lcmF0ZSBhIHZlbmRvciBzbmFwc2hvdC4KLWlmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSxjdXJyZW50KQotCi0uUEhPTlk6IHZlbmRvci1zbmFwc2hvdAotdmVuZG9yLXNuYXBzaG90OiAkKFNPT05HX1ZFTkRPUl9TTkFQU0hPVF9aSVApCi0KLSQoY2FsbCBkaXN0LWZvci1nb2FscywgdmVuZG9yLXNuYXBzaG90LCAkKFNPT05HX1ZFTkRPUl9TTkFQU0hPVF9aSVApKQotCi0uUEhPTlk6IHZlbmRvci1mYWtlLXNuYXBzaG90Ci12ZW5kb3ItZmFrZS1zbmFwc2hvdDogJChTT09OR19WRU5ET1JfRkFLRV9TTkFQU0hPVF9aSVApCi0KLSQoY2FsbCBkaXN0LWZvci1nb2FscywgdmVuZG9yLWZha2Utc25hcHNob3QsICQoU09PTkdfVkVORE9SX0ZBS0VfU05BUFNIT1RfWklQKTpmYWtlLyQobm90ZGlyICQoU09PTkdfVkVORE9SX0ZBS0VfU05BUFNIT1RfWklQKSkpCi0KLWVsc2UgIyBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgTk9UIHNldCB0byAnY3VycmVudCcKLQotLlBIT05ZOiB2ZW5kb3Itc25hcHNob3QKLXZlbmRvci1zbmFwc2hvdDogUFJJVkFURV9NQUtFRklMRSA6PSAkKGN1cnJlbnRfbWFrZWZpbGUpCi12ZW5kb3Itc25hcHNob3Q6Ci0JJChjYWxsIGVjaG8tZXJyb3IsJChQUklWQVRFX01BS0VGSUxFKSxcCi0JCSJDQU5OT1QgZ2VuZXJhdGUgVmVuZG9yIHNuYXBzaG90LiBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnLiIpCi0JZXhpdCAxCi0KLS5QSE9OWTogdmVuZG9yLWZha2Utc25hcHNob3QKLXZlbmRvci1mYWtlLXNuYXBzaG90OiBQUklWQVRFX01BS0VGSUxFIDo9ICQoY3VycmVudF9tYWtlZmlsZSkKLXZlbmRvci1mYWtlLXNuYXBzaG90OgotCSQoY2FsbCBlY2hvLWVycm9yLCQoUFJJVkFURV9NQUtFRklMRSksXAotCQkiQ0FOTk9UIGdlbmVyYXRlIFZlbmRvciBzbmFwc2hvdC4gQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50Jy4iKQotCWV4aXQgMQotCi1lbmRpZiAjIEJPQVJEX1ZOREtfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvY29yZS92ZXJzaW9uX3V0aWwubWsgYi9jb3JlL3ZlcnNpb25fdXRpbC5tawppbmRleCBlYjU2OGJlLi4wZTM0NjM0IDEwMDY0NAotLS0gYS9jb3JlL3ZlcnNpb25fdXRpbC5taworKysgYi9jb3JlL3ZlcnNpb25fdXRpbC5tawpAQCAtMTgzLDE0ICsxODMsMTcgQEAKIGVuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9TRUNVUklUWV9QQVRDSF9USU1FU1RBTVAKIAotaWZuZGVmIFBMQVRGT1JNX0JBU0VfT1MKLSAgIyBVc2VkIHRvIGluZGljYXRlIHRoZSBiYXNlIG9zIGFwcGxpZWQgdG8gdGhlIGRldmljZS4KLSAgIyBDYW4gYmUgYW4gYXJiaXRyYXJ5IHN0cmluZywgYnV0IG11c3QgYmUgYSBzaW5nbGUgd29yZC4KLSAgIwotICAjIElmIHRoZXJlIGlzIG5vICRQTEFURk9STV9CQVNFX09TIHNldCwga2VlcCBpdCBlbXB0eS4KLSAgUExBVEZPUk1fQkFTRV9PUyA6PQotZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX0JBU0VfT1MKKyMgUExBVEZPUk1fQkFTRV9PUyBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBiYXNlIG9zIGFwcGxpZWQKKyMgdG8gdGhlIGRldmljZS4gQ2FuIGJlIGFuIGFyYml0cmFyeSBzdHJpbmcsIGJ1dCBtdXN0IGJlIGEKKyMgc2luZ2xlIHdvcmQuCisjCisjIElmIHRoZXJlIGlzIG5vICRQTEFURk9STV9CQVNFX09TIHNldCwga2VlcCBpdCBlbXB0eS4KKyMKKyMgUExBVEZPUk1fQkFTRV9PUyBjYW4gZWl0aGVyIGJlIHNldCB2aWEgYW4gZW52aW9ybm1lbnQKKyMgdmFyaWFibGUsIG9yIHNldCB2aWEgdGhlIFBST0RVQ1RfQkFTRV9PUyBwcm9kdWN0IHZhcmlhYmxlLgorUExBVEZPUk1fQkFTRV9PU19FTlZfSU5QVVQgOj0gJChQTEFURk9STV9CQVNFX09TKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fQkFTRV9PU19FTlZfSU5QVVQKK1BMQVRGT1JNX0JBU0VfT1MgOj0KIAogaWZuZGVmIEJVSUxEX0lECiAgICMgVXNlZCB0byBzaWduaWZ5IHNwZWNpYWwgYnVpbGRzLiAgRS5nLiwgYnJhbmNoZXMgYW5kL29yIHJlbGVhc2VzLApkaWZmIC0tZ2l0IGEvZW52c2V0dXAuc2ggYi9lbnZzZXR1cC5zaAppbmRleCA2NDdjMTA2Li4wNmRhZGQzIDEwMDY0NAotLS0gYS9lbnZzZXR1cC5zaAorKysgYi9lbnZzZXR1cC5zaApAQCAtMzg1LDYgKzM4NSw3IEBACiAgICAgICAgIGNvbXBsZXRlIC1GIF9iYXplbF9fY29tcGxldGUgLW8gbm9zcGFjZSBiCiAgICAgZmkKICAgICBjb21wbGV0ZSAtRiBfbHVuY2ggbHVuY2gKKyAgICBjb21wbGV0ZSAtRiBfbHVuY2hfY29tcGxldGlvbiBsdW5jaDIKIAogICAgIGNvbXBsZXRlIC1GIF9jb21wbGV0ZV9hbmRyb2lkX21vZHVsZV9uYW1lcyBwYXRobW9kCiAgICAgY29tcGxldGUgLUYgX2NvbXBsZXRlX2FuZHJvaWRfbW9kdWxlX25hbWVzIGdvbW9kCkBAIC00OTYsOSArNDk3LDE4IEBACiAgICAgICAgIHJldHVybiAxCiAgICAgZmkKIAorICAgIF9sdW5jaF9tZWF0ICRwcm9kdWN0ICRyZWxlYXNlICR2YXJpYW50Cit9CisKK2Z1bmN0aW9uIF9sdW5jaF9tZWF0KCkKK3sKKyAgICBsb2NhbCBwcm9kdWN0PSQxCisgICAgbG9jYWwgcmVsZWFzZT0kMgorICAgIGxvY2FsIHZhcmlhbnQ9JDMKKwogICAgIFRBUkdFVF9QUk9EVUNUPSRwcm9kdWN0IFwKLSAgICBUQVJHRVRfQlVJTERfVkFSSUFOVD0kdmFyaWFudCBcCiAgICAgVEFSR0VUX1JFTEVBU0U9JHJlbGVhc2UgXAorICAgIFRBUkdFVF9CVUlMRF9WQVJJQU5UPSR2YXJpYW50IFwKICAgICBidWlsZF9idWlsZF92YXJfY2FjaGUKICAgICBpZiBbICQ/IC1uZSAwIF0KICAgICB0aGVuCkBAIC01MTksMTQgKzUyOSwxMSBAQAogICAgIHNldF9zdHVmZl9mb3JfZW52aXJvbm1lbnQKICAgICBbWyAtbiAiJHtBTkRST0lEX1FVSUVUX0JVSUxEOi19IiBdXSB8fCBwcmludGNvbmZpZwogCi0gICAgaWYgWyAiJHtUQVJHRVRfQlVJTERfVkFSSUFOVH0iID0gInVzZXJkZWJ1ZyIgXSAmJiBbWyAgLXogIiR7QU5EUk9JRF9RVUlFVF9CVUlMRH0iIF1dOyB0aGVuCi0gICAgICBlY2hvCi0gICAgICBlY2hvICJXYW50IEZBU1RFUiBMT0NBTCBCVUlMRFM/IFVzZSAtZW5nIGluc3RlYWQgb2YgLXVzZXJkZWJ1ZyAoaG93ZXZlciBmb3IiIFwKLSAgICAgICAgInBlcmZvcm1hbmNlIGJlbmNobWFya2luZyBjb250aW51ZSB0byB1c2UgdXNlcmRlYnVnKSIKLSAgICBmaQotICAgIGlmIFsgJHVzZWRfbHVuY2hfbWVudSAtZXEgMSBdOyB0aGVuCi0gICAgICBlY2hvCi0gICAgICBlY2hvICJIaW50OiBuZXh0IHRpbWUgeW91IGNhbiBzaW1wbHkgcnVuICdsdW5jaCAkc2VsZWN0aW9uJyIKKyAgICBpZiBbWyAteiAiJHtBTkRST0lEX1FVSUVUX0JVSUxEfSIgXV07IHRoZW4KKyAgICAgICAgbG9jYWwgc3BhbV9mb3JfbHVuY2g9JChnZXR0b3ApL2J1aWxkL21ha2UvdG9vbHMvZW52c2V0dXAvc3BhbV9mb3JfbHVuY2gKKyAgICAgICAgaWYgW1sgLXggJHNwYW1fZm9yX2x1bmNoIF1dOyB0aGVuCisgICAgICAgICAgICAkc3BhbV9mb3JfbHVuY2gKKyAgICAgICAgZmkKICAgICBmaQogCiAgICAgZGVzdHJveV9idWlsZF92YXJfY2FjaGUKQEAgLTU1Myw2ICs1NjAsMTEyIEBACiAgICAgcmV0dXJuIDAKIH0KIAorZnVuY3Rpb24gX2x1bmNoX3VzYWdlKCkKK3sKKyAgICAoCisgICAgICAgIGVjaG8gIlRoZSBsdW5jaCBjb21tYW5kIHNlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBzdWJzZXF1ZW50IgorICAgICAgICBlY2hvICJBbmRyb2lkIGJ1aWxkcy4iCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobyAiVXNhZ2U6IGx1bmNoIFRBUkdFVF9QUk9EVUNUIFtUQVJHRVRfUkVMRUFTRSBbVEFSR0VUX0JVSUxEX1ZBUklBTlRdXSIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvICIgIENob29zZSB0aGUgcHJvZHVjdCwgcmVsZWFzZSBhbmQgdmFyaWFudCB0byB1c2UuIElmIG5vdCIKKyAgICAgICAgZWNobyAiICBzdXBwbGllZCwgVEFSR0VUX1JFTEVBU0Ugd2lsbCBiZSAndHJ1bmtfc3RhZ2luZycgYW5kIgorICAgICAgICBlY2hvICIgIFRBUkdFVF9CVUlMRF9WQVJJQU5UIHdpbGwgYmUgJ2VuZyciCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobworICAgICAgICBlY2hvICJVc2FnZTogbHVuY2ggVEFSR0VUX1BST0RVQ1QtVEFSR0VUX1JFTEVBU0UtVEFSR0VUX0JVSUxEX1ZBUklBTlQiCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobyAiICBDaG9zZSB0aGUgcHJvZHVjdCwgcmVsZWFzZSBhbmQgdmFyaWFudCB0byB1c2UuIFRoaXMiCisgICAgICAgIGVjaG8gIiAgbGVnYWN5IGZvcm1hdCBpcyBtYWludGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LiIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvCisgICAgICAgIGVjaG8gIk5vdGUgdGhhdCB0aGUgcHJldmlvdXMgaW50ZXJhY3RpdmUgbWVudSBhbmQgbGlzdCBvZiBoYXJkLWNvZGVkIgorICAgICAgICBlY2hvICJsaXN0IG9mIGN1cmF0ZWQgdGFyZ2V0cyBoYXMgYmVlbiByZW1vdmVkLiBJZiB5b3Ugd291bGQgbGlrZSB0aGUiCisgICAgICAgIGVjaG8gImxpc3Qgb2YgcHJvZHVjdHMsIHJlbGVhc2UgY29uZmlncyBmb3IgYSBwYXJ0aWN1bGFyIHByb2R1Y3QsIG9yIgorICAgICAgICBlY2hvICJ2YXJpYW50cywgcnVuIGxpc3RfcHJvZHVjdHMsIGxpc3RfcmVsZWFzZV9jb25maWdzLCBsaXN0X3ZhcmlhbnRzIgorICAgICAgICBlY2hvICJyZXNwZWN0aXZlbHkuIgorICAgICAgICBlY2hvCisgICAgKSAxPiYyCit9CisKK2Z1bmN0aW9uIGx1bmNoMigpCit7CisgICAgaWYgW1sgJCMgLWVxIDEgJiYgJDEgPSAiLS1oZWxwIiBdXTsgdGhlbgorICAgICAgICBfbHVuY2hfdXNhZ2UKKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIGlmIFtbICQjIC1lcSAwIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIk5vIHRhcmdldCBzcGVjaWZpZWQuIFNlZSBsdW5jaCAtLWhlbHAiIDE+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIGlmIFtbICQjIC1ndCAzIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIlRvbyBtYW55IHBhcmFtZXRlcnMgZ2l2ZW4uIFNlZSBsdW5jaCAtLWhlbHAiIDE+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorCisgICAgbG9jYWwgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQKKworICAgICMgSGFuZGxlIHRoZSBsZWdhY3kgZm9ybWF0CisgICAgbG9jYWwgbGVnYWN5PSQoZWNobyAkMSB8IGdyZXAgIi0iKQorICAgIGlmIFtbICQjIC1lcSAxICYmIC1uICRsZWdhY3kgXV07IHRoZW4KKyAgICAgICAgSUZTPSItIiByZWFkIC1yIHByb2R1Y3QgcmVsZWFzZSB2YXJpYW50IDw8PCAiJDEiCisgICAgICAgIGlmIFtbIC16ICIkcHJvZHVjdCIgXV0gfHwgW1sgLXogIiRyZWxlYXNlIiBdXSB8fCBbWyAteiAiJHZhcmlhbnQiIF1dOyB0aGVuCisgICAgICAgICAgICBlY2hvICJJbnZhbGlkIGx1bmNoIGNvbWJvOiAkMSIgMT4mMgorICAgICAgICAgICAgZWNobyAiVmFsaWQgY29tYm9zIG11c3QgYmUgb2YgdGhlIGZvcm0gPHByb2R1Y3Q+LTxyZWxlYXNlPi08dmFyaWFudD4gd2hlbiB1c2luZyIgMT4mMgorICAgICAgICAgICAgZWNobyAidGhlIGxlZ2FjeSBmb3JtYXQuICBSdW4gJ2x1bmNoIC0taGVscCcgZm9yIHVzYWdlLiIgMT4mMgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgIyBIYW5kbGUgdGhlIG5ldyBmb3JtYXQuCisgICAgaWYgW1sgLXogJGxlZ2FjeSBdXTsgdGhlbgorICAgICAgICBwcm9kdWN0PSQxCisgICAgICAgIHJlbGVhc2U9JDIKKyAgICAgICAgaWYgW1sgLXogJHJlbGVhc2UgXV07IHRoZW4KKyAgICAgICAgICAgIHJlbGVhc2U9dHJ1bmtfc3RhZ2luZworICAgICAgICBmaQorICAgICAgICB2YXJpYW50PSQzCisgICAgICAgIGlmIFtbIC16ICR2YXJpYW50IF1dOyB0aGVuCisgICAgICAgICAgICB2YXJpYW50PWVuZworICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIFZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gYW5kIHNldCBhbGwgdGhlIGVudmlyb25tZW50IHN0dWZmCisgICAgX2x1bmNoX21lYXQgJHByb2R1Y3QgJHJlbGVhc2UgJHZhcmlhbnQKK30KKwordW5zZXQgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1BST0RVQ1RfQ0FDSEUKK3Vuc2V0IEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9DSE9TRU5fUFJPRFVDVAordW5zZXQgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1JFTEVBU0VfQ0FDSEUKKyMgVGFiIGNvbXBsZXRpb24gZm9yIGx1bmNoLgorZnVuY3Rpb24gX2x1bmNoX2NvbXBsZXRpb24oKQoreworICAgICMgQXZhaWxhYmxlIHByb2R1Y3RzCisgICAgaWYgW1sgJENPTVBfQ1dPUkQgLWVxIDEgXV0gOyB0aGVuCisgICAgICAgIGlmIFtbIC16ICRBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUFJPRFVDVF9DQUNIRSBdXTsgdGhlbgorICAgICAgICAgICAgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1BST0RVQ1RfQ0FDSEU9JChsaXN0X3Byb2R1Y3RzKQorICAgICAgICBmaQorICAgICAgICBDT01QUkVQTFk9KCAkKGNvbXBnZW4gLVcgIiR7QU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1BST0RVQ1RfQ0FDSEV9IiAtLSAiJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIpICkKKyAgICBmaQorCisgICAgIyBBdmFpbGFibGUgcmVsZWFzZSBjb25maWdzCisgICAgaWYgW1sgJENPTVBfQ1dPUkQgLWVxIDIgXV0gOyB0aGVuCisgICAgICAgIGlmIFtbIC16ICRBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRSB8fCAkQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX0NIT1NFTl9QUk9EVUNUICE9ICR7Q09NUF9XT1JEU1sxXX0gXV0gOyB0aGVuCisgICAgICAgICAgICBBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRT0kKGxpc3RfcmVsZWFzZXMgJHtDT01QX1dPUkRTWzFdfSkKKyAgICAgICAgICAgIEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9DSE9TRU5fUFJPRFVDVD0ke0NPTVBfV09SRFNbMV19CisgICAgICAgIGZpCisgICAgICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyAiJHtBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRX0iIC0tICIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IikgKQorICAgIGZpCisKKyAgICAjIEF2YWlsYWJsZSB2YXJpYW50cworICAgIGlmIFtbICRDT01QX0NXT1JEIC1lcSAzIF1dIDsgdGhlbgorICAgICAgICBDT01QUkVQTFk9KHVzZXIgdXNlcmRlYnVnIGVuZykKKyAgICBmaQorCisgICAgcmV0dXJuIDAKK30KKworCiAjIENvbmZpZ3VyZXMgdGhlIGJ1aWxkIHRvIGJ1aWxkIHVuYnVuZGxlZCBhcHBzLgogIyBSdW4gdGFwYXMgd2l0aCBvbmUgb3IgbW9yZSBhcHAgbmFtZXMgKGZyb20gTE9DQUxfUEFDS0FHRV9OQU1FKQogZnVuY3Rpb24gdGFwYXMoKQpAQCAtNzUyLDQ3ICs4NjUsMTQgQEAKICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkFEQiIgJEFEQiAiJHtAfSIKIH0KIAotZnVuY3Rpb24gcnVuX3Rvb2xfd2l0aF9sb2dnaW5nKCkgewotICAjIFJ1biBjb21tYW5kcyBpbiBhIHN1YnNoZWxsIGZvciB1cyB0byBoYW5kbGUgZm9yY2VkIHRlcm1pbmF0aW9ucyB3aXRoIGEgdHJhcAotICAjIGhhbmRsZXIuCi0gICgKLSAgbG9jYWwgdG9vbF90YWc9IiQxIgotICBzaGlmdAotICBsb2NhbCB0b29sX2JpbmFyeT0iJDEiCi0gIHNoaWZ0Ci0KLSAgIyBJZiB0aGUgbG9nZ2VyIGlzIG5vdCBjb25maWd1cmVkLCBydW4gdGhlIG9yaWdpbmFsIGNvbW1hbmQgYW5kIHJldHVybi4KLSAgaWYgW1sgLXogIiR7QU5EUk9JRF9UT09MX0xPR0dFUn0iIF1dOyB0aGVuCi0gICAgICIke3Rvb2xfYmluYXJ5fSIgIiR7QH0iCi0gICAgIHJldHVybiAkPwotICBmaQotCi0gICMgT3RoZXJ3aXNlLCBydW4gdGhlIG9yaWdpbmFsIGNvbW1hbmQgYW5kIGNhbGwgdGhlIGxvZ2dlciB3aGVuIGRvbmUuCi0gIGxvY2FsIHN0YXJ0X3RpbWUKLSAgc3RhcnRfdGltZT0kKGRhdGUgKyVzLiVOKQotICBsb2NhbCBsb2dnZXI9JHtBTkRST0lEX1RPT0xfTE9HR0VSfQotCi0gICMgSW5zdGFsbCBhIHRyYXAgdG8gY2FsbCB0aGUgbG9nZ2VyIGV2ZW4gd2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzIGFibm9ybWFsbHkuCi0gICMgVGhlIGxvZ2dlciBpcyBydW4gaW4gdGhlIGJhY2tncm91bmQgYW5kIGl0cyBvdXRwdXQgc3VwcHJlc3NlZCB0byBhdm9pZAotICAjIGludGVyZmVyZW5jZSB3aXRoIHRoZSB1c2VyIGZsb3cuCi0gIHRyYXAgJwotICBleGl0X2NvZGU9JD87Ci0gICMgUmVtb3ZlIHRoZSB0cmFwIHRvIHByZXZlbnQgZHVwbGljYXRlIGxvZy4KLSAgdHJhcCAtIEVYSVQ7Ci0gICIke2xvZ2dlcn0iIFwKLSAgICAtLXRvb2xfdGFnPSIke3Rvb2xfdGFnfSIgXAotICAgIC0tc3RhcnRfdGltZXN0YW1wPSIke3N0YXJ0X3RpbWV9IiBcCi0gICAgLS1lbmRfdGltZXN0YW1wPSIkKGRhdGUgKyVzLiVOKSIgXAotICAgIC0tdG9vbF9hcmdzPSIkKiIgXAotICAgIC0tZXhpdF9jb2RlPSIke2V4aXRfY29kZX0iIFwKLSAgICAke0FORFJPSURfVE9PTF9MT0dHRVJfRVhUUkFfQVJHU30gXAotICAgID4gL2Rldi9udWxsIDI+JjEgJgotICBleGl0ICR7ZXhpdF9jb2RlfQotICAnIFNJR0lOVCBTSUdURVJNIFNJR1FVSVQgRVhJVAotCi0gICMgUnVuIHRoZSBvcmlnaW5hbCBjb21tYW5kLgotICAiJHt0b29sX2JpbmFyeX0iICIke0B9IgotICApCitmdW5jdGlvbiBmYXN0Ym9vdCgpIHsKKyAgICBsb2NhbCBGQVNUQk9PVD0kKGNvbW1hbmQgd2hpY2ggZmFzdGJvb3QpCisgICAgaWYgWyAteiAiJEZBU1RCT09UIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIkNvbW1hbmQgZmFzdGJvb3Qgbm90IGZvdW5kOyB0cnkgbHVuY2ggKGFuZCBidWlsZGluZykgZmlyc3Q/IgorICAgICAgICByZXR1cm4gMQorICAgIGZpCisgICAgIyBTdXBwb3J0IHRvb2wgZXZlbnQgbG9nZ2luZyBmb3IgZmFzdGJvb3QgY29tbWFuZC4KKyAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBU1RCT09UIiAkRkFTVEJPT1QgIiR7QH0iCiB9CiAKICMgY29tbXVuaWNhdGUgd2l0aCBhIHJ1bm5pbmcgZGV2aWNlIG9yIGVtdWxhdG9yLCBzZXQgdXAgbmVjZXNzYXJ5IHN0YXRlLApAQCAtMTA4Miw2ICsxMTYyLDcgQEAKIHVuc2V0IHJlZnJlc2htb2QKIHVuc2V0IHJlc2dyZXAKIHVuc2V0IHJzZ3JlcAordW5zZXQgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nCiB1bnNldCBzZXBncmVwCiB1bnNldCBzZ3JlcAogdW5zZXQgc3RhcnR2aWV3c2VydmVyCmRpZmYgLS1naXQgYS9zaGVsbF91dGlscy5zaCBiL3NoZWxsX3V0aWxzLnNoCmluZGV4IDQ1MGJiODMuLjg2ZjNmNDkgMTAwNjQ0Ci0tLSBhL3NoZWxsX3V0aWxzLnNoCisrKyBiL3NoZWxsX3V0aWxzLnNoCkBAIC0xMjYsNCArMTI2LDI3IEBACiB9CiAKIAorZnVuY3Rpb24gbG9nX3Rvb2xfaW52b2NhdGlvbigpCit7CisgICAgaWYgW1sgLXogJEFORFJPSURfVE9PTF9MT0dHRVIgXV07IHRoZW4KKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgIExPR19UT09MX1RBRz0kMQorICAgIExPR19TVEFSVF9USU1FPSQoZGF0ZSArJXMuJU4pCisgICAgdHJhcCAnCisgICAgICAgIGV4aXRfY29kZT0kPzsKKyAgICAgICAgIyBSZW1vdmUgdGhlIHRyYXAgdG8gcHJldmVudCBkdXBsaWNhdGUgbG9nLgorICAgICAgICB0cmFwIC0gRVhJVDsKKyAgICAgICAgJEFORFJPSURfVE9PTF9MT0dHRVIgXAorICAgICAgICAgICAgICAgIC0tdG9vbF90YWc9IiR7TE9HX1RPT0xfVEFHfSIgXAorICAgICAgICAgICAgICAgIC0tc3RhcnRfdGltZXN0YW1wPSIke0xPR19TVEFSVF9USU1FfSIgXAorICAgICAgICAgICAgICAgIC0tZW5kX3RpbWVzdGFtcD0iJChkYXRlICslcy4lTikiIFwKKyAgICAgICAgICAgICAgICAtLXRvb2xfYXJncz0iJCoiIFwKKyAgICAgICAgICAgICAgICAtLWV4aXRfY29kZT0iJHtleGl0X2NvZGV9IiBcCisgICAgICAgICAgICAgICAgJHtBTkRST0lEX1RPT0xfTE9HR0VSX0VYVFJBX0FSR1N9IFwKKyAgICAgICAgICAgPiAvZGV2L251bGwgMj4mMSAmCisgICAgICAgIGV4aXQgJHtleGl0X2NvZGV9CisgICAgJyBTSUdJTlQgU0lHVEVSTSBTSUdRVUlUIEVYSVQKK30KIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0FuZHJvaWQubWsgYi90YXJnZXQvYm9hcmQvQW5kcm9pZC5tawppbmRleCBkZWNjMzQ1Li44MTMzYWY5IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvQW5kcm9pZC5taworKysgYi90YXJnZXQvYm9hcmQvQW5kcm9pZC5tawpAQCAtNjcsNyArNjcsNiBAQAogJChHRU4pOiAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgogCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JChCT0FSRF9TRVBPTElDWV9WRVJTKSBcCiAJUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUPSQoUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUKSBcCi0JUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUw9JChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkgXAogCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1vICRAIFwKIAkJLWkgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0RFVklDRV9NQU5JRkVTVF9GSUxFKSkKIApAQCAtOTksNyArOTgsNiBAQAogJCQoR0VOKTogJCQobXlfZnJhZ21lbnRfZmlsZXMpICQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgogCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JCQoQk9BUkRfU0VQT0xJQ1lfVkVSUykgXAogCVBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVD0kJChQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QpIFwKLQlQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTD0kJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkgXAogCSQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtbyAkJEAgXAogCQktaSAkJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJCQoUFJJVkFURV9TUkNfRklMRVMpKQogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3Byb2R1Y3QubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3Byb2R1Y3QubWsKaW5kZXggNTQ0NjA2NC4uYWNmYzY1MyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9wcm9kdWN0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2VfcHJvZHVjdC5tawpAQCAtMTYsNiArMTYsNyBAQAogCiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBwcm9kdWN0IHBhcnRpdGlvbi4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGJ1aWxkX2ZsYWdfcHJvZHVjdCBcCiAgICAgZnNfY29uZmlnX2RpcnNfcHJvZHVjdCBcCiAgICAgZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QgXAogICAgIGdyb3VwX3Byb2R1Y3QgXApAQCAtMjQsMyArMjUsOCBAQAogICAgIHByb2R1Y3RfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIFwKICAgICBwcm9kdWN0X21hbmlmZXN0LnhtbCBcCiAgICAgc2VsaW51eF9wb2xpY3lfcHJvZHVjdCBcCisgICAgcHJvZHVjdC1idWlsZC5wcm9wIFwKKworIyBQYWNrYWdlcyBpbmNsdWRlZCBvbmx5IGZvciBlbmcgb3IgdXNlcmRlYnVnIGJ1aWxkcywgcHJldmlvdXNseSBkZWJ1ZyB0YWdnZWQKK1BST0RVQ1RfUEFDS0FHRVNfREVCVUcgKz0gXAorICAgIGFkYl9rZXlzIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWsKaW5kZXggNjM0YmY2Ni4uOWUzNDUzOCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWsKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICBidSBcCiAgICAgYnVncmVwb3J0IFwKICAgICBidWdyZXBvcnR6IFwKKyAgICBidWlsZF9mbGFnX3N5c3RlbSBcCiAgICAgY2dyb3Vwcy5qc29uIFwKICAgICBjaGFyZ2VyIFwKICAgICBjbWQgXApAQCAtODIsNiArODMsNyBAQAogICAgIEN0c1NoaW1Qcml2UHJlYnVpbHQgXAogICAgIGRlYnVnZ2VyZFwKICAgICBkZXZpY2VfY29uZmlnIFwKKyAgICBEZXZpY2VEaWFnbm9zdGljcyBcCiAgICAgZG1jdGwgXAogICAgIGRuc21hc3EgXAogICAgIGRtZXNnZCBcCkBAIC05MCw3ICs5Miw5IEBACiAgICAgZHVtcC5lcm9mcyBcCiAgICAgZHVtcHN0YXRlIFwKICAgICBkdW1wc3lzIFwKKyAgICBFMmVlQ29udGFjdEtleXNQcm92aWRlciBcCiAgICAgZTJmc2NrIFwKKyAgICBlbmhhbmNlZC1jb25maXJtYXRpb24ueG1sIFwKICAgICBFeHRTaGFyZWQgXAogICAgIGZsYWdzX2hlYWx0aF9jaGVjayBcCiAgICAgZnJhbWV3b3JrLWdyYXBoaWNzIFwKQEAgLTIzNCw2ICsyMzgsNyBAQAogICAgIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgXAogICAgIG90YWNlcnRzIFwKICAgICBQYWNrYWdlSW5zdGFsbGVyIFwKKyAgICBwYWNrYWdlLXNoYXJlZHVpZC1hbGxvd2xpc3QueG1sIFwKICAgICBwYXNzd2Rfc3lzdGVtIFwKICAgICBwZXJmZXR0byBcCiAgICAgcGVyZmV0dG8tZXh0cmFzIFwKQEAgLTI3NSw2ICsyODAsNyBAQAogICAgIHN0b3JhZ2VkIFwKICAgICBzdXJmYWNlZmxpbmdlciBcCiAgICAgc3ZjIFwKKyAgICBzeXN0ZW0tYnVpbGQucHJvcCBcCiAgICAgdGFza19wcm9maWxlcy5qc29uIFwKICAgICB0YyBcCiAgICAgdGVsZWNvbSBcCkBAIC0yODYsNiArMjkyLDcgQEAKICAgICB1aWF1dG9tYXRvciBcCiAgICAgdWlucHV0IFwKICAgICB1bmNyeXB0IFwKKyAgICB1cHJvYmVzdGF0cyBcCiAgICAgdXNiZCBcCiAgICAgdmRjIFwKICAgICB2aW50ZiBcCkBAIC0zMjcsNiArMzM0LDEzIEBACiAgICAgICAgIGNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzCiBlbmRpZgogCisjIENoZWNrIGlmIHRoZSBidWlsZCBzdXBwb3J0cyBQcm9maWxpbmcgbW9kdWxlCitpZmVxICgkKFJFTEVBU0VfUEFDS0FHRV9QUk9GSUxJTkdfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZyBcCisgICAgICAgdHJhY2VfcmVkYWN0b3IKK2VuZGlmCisKIGlmZXEgKCQoUkVMRUFTRV9VU0VfV0VCVklFV19CT09UU1RSQVBfTU9EVUxFKSx0cnVlKQogICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgICAgICBjb20uYW5kcm9pZC53ZWJ2aWV3LmJvb3RzdHJhcApAQCAtMzkwLDcgKzQwNCw2IEBACiAgICAgQnVnUmVwb3J0IFwKICAgICBhZGIgXAogICAgIGFkZXZpY2UgXAotICAgIGFydC10b29scyBcCiAgICAgYXRlc3QgXAogICAgIGJjYyBcCiAgICAgYml0IFwKQEAgLTQwMCw3ICs0MTMsNyBAQAogICAgIGZsYWdzX2hlYWx0aF9jaGVjayBcCiAgICAgZnNjay5lcm9mcyBcCiAgICAgaWN1LWRhdGFfaG9zdF9pMThuX2FwZXggXAotICAgIGljdV90emRhdGEuZGF0X2hvc3RfdHpkYXRhX2FwZXggXAorICAgIHR6ZGF0YV9pY3VfcmVzX2ZpbGVzX2hvc3RfcHJlYnVpbHRzIFwKICAgICBpZG1hcDIgXAogICAgIGluY2lkZW50X3JlcG9ydCBcCiAgICAgbGQubWMgXApAQCAtNDIxLDYgKzQzNCwyMSBAQAogICAgIHR6X3ZlcnNpb25faG9zdCBcCiAgICAgdHpfdmVyc2lvbl9ob3N0X3R6ZGF0YV9hcGV4IFwKIAorIyBGb3IgYXJ0LXRvb2xzLCBpZiB0aGUgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCwgcGxlYXNlIHN5bmMgdGhlbSB0byBhcnQvQW5kcm9pZC5icCBhcyB3ZWxsLgorUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKKyAgICBhaGF0IFwKKyAgICBkZXhkdW1wIFwKKyAgICBocHJvZi1jb252CisjIEEgc3Vic2V0IG9mIHRoZSB0b29scyBhcmUgZGlzYWJsZWQgd2hlbiBIT1NUX1BSRUZFUl8zMl9CSVQgaXMgZGVmaW5lZCBhcyBtYWtlIHJlcG9ydHMgdGhhdAorIyB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkIG9uIGhvc3QgKGIvMTI5MzIzNzkxKS4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGFydF9hcGV4IGRpc2FibGluZyBob3N0CisjIEFQRVggYnVpbGRzIHdoZW4gSE9TVF9QUkVGRVJfMzJfQklUIGlzIHNldCAoYi8xMjA2MTc4NzYpLgoraWZuZXEgKCQoSE9TVF9QUkVGRVJfMzJfQklUKSx0cnVlKQorUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKKyAgICBkZXhsaXN0IFwKKyAgICBvYXRkdW1wCitlbmRpZgorCisKIFBST0RVQ1RfUEFDS0FHRVMgKz0gaW5pdC51c2IucmMgaW5pdC51c2IuY29uZmlnZnMucmMKIAogUFJPRFVDVF9QQUNLQUdFUyArPSBldGNfaG9zdHMKQEAgLTQzMSw5ICs0NTksMTMgQEAKIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gZGVidWcuYXRyYWNlLnRhZ3MuZW5hYmxlZmxhZ3M9MAogUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBwZXJzaXN0LnRyYWNlZC5lbmFibGU9MQogCisjIEluY2x1ZGUga2VybmVsIGNvbmZpZ3MuCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBhcHByb3ZlZC1vZ2tpLWJ1aWxkcy54bWwgXAorICAgIGtlcm5lbC1saWZldGltZXMueG1sCisKICMgUGFja2FnZXMgaW5jbHVkZWQgb25seSBmb3IgZW5nIG9yIHVzZXJkZWJ1ZyBidWlsZHMsIHByZXZpb3VzbHkgZGVidWcgdGFnZ2VkCiBQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHIDo9IFwKLSAgICBhZGJfa2V5cyBcCiAgICAgYWRldmljZV9maW5nZXJwcmludCBcCiAgICAgYXJwaW5nIFwKICAgICBkbXVzZXJkIFwKQEAgLTQ5OCwzICs1MzAsNiBAQAogCiAjIFVzZSAiaW1hZ2UiIEFQRVhlcyBhbHdheXMuCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvdXBkYXRhYmxlX2FwZXgubWspCisKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBiaW9uaWMsIGxhcmdlX3N5c3RlbV9wcm9wZXJ0eV9ub2RlLCAkKFJFTEVBU0VfTEFSR0VfU1lTVEVNX1BST1BFUlRZX05PREUpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIEFjb25maWcsIHJlYWRfZnJvbV9uZXdfc3RvcmFnZSwgJChSRUxFQVNFX1JFQURfRlJPTV9ORVdfU1RPUkFHRSkpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWsKaW5kZXggNzZmMDA4Zi4uZmViZTUzNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW1fZXh0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtX2V4dC5tawpAQCAtMTYsNiArMTYsNyBAQAogCiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBzeXN0ZW1fZXh0IHBhcnRpdGlvbi4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGJ1aWxkX2ZsYWdfc3lzdGVtX2V4dCBcCiAgICAgZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dCBcCiAgICAgZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQgXAogICAgIGdyb3VwX3N5c3RlbV9leHQgXApAQCAtMjMsNiArMjQsNyBAQAogICAgIFNhdGVsbGl0ZUNsaWVudCBcCiAgICAgc2VsaW51eF9wb2xpY3lfc3lzdGVtX2V4dCBcCiAgICAgc3lzdGVtX2V4dF9tYW5pZmVzdC54bWwgXAorICAgIHN5c3RlbV9leHQtYnVpbGQucHJvcCBcCiAKICMgQmFzZSBtb2R1bGVzIHdoZW4gc2hpcHBpbmcgYXBpIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzNAogUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzQgKz0gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV92ZW5kb3IubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tawppbmRleCBlYzNkZTc1Li5hODBlMGIzIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tawpAQCAtMTgsNiArMTgsNyBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWRiZC5yZWNvdmVyeSBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLWltcGwtZGVmYXVsdC5yZWNvdmVyeSBcCisgICAgYnVpbGRfZmxhZ192ZW5kb3IgXAogICAgIGNncm91cHMucmVjb3ZlcnkuanNvbiBcCiAgICAgY2hhcmdlci5yZWNvdmVyeSBcCiAgICAgaW5pdF9zZWNvbmRfc3RhZ2UucmVjb3ZlcnkgXApAQCAtNzIsNiArNzMsMTIgQEAKICAgICBwYXNzd2RfdmVuZG9yIFwKICAgICBzZWxpbnV4X3BvbGljeV9ub25zeXN0ZW0gXAogICAgIHNoZWxsX2FuZF91dGlsaXRpZXNfdmVuZG9yIFwKKyAgICBvZG0tYnVpbGQucHJvcCBcCisKKyMgbGliaGVhbHRobG9vcCBCUEYgZmlsdGVyLiBUaGlzIGlzIGluIGJhc2VfdmVuZG9yLm1rIGJlY2F1c2UgbGliaGVhbHRobG9vcCBtdXN0CisjIGJlIGEgc3RhdGljIGxpYnJhcnkgYW5kIGJlY2F1c2UgdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtIGlnbm9yZXMgJ3JlcXVpcmVkJworIyBzZWN0aW9ucyBmb3Igc3RhdGljIGxpYnJhcmllcy4KK1BST0RVQ1RfUEFDS0FHRVMgKz0gZmlsdGVyUG93ZXJTdXBwbHlFdmVudHMubwogCiAjIEJhc2UgbW9kdWxlcyB3aGVuIHNoaXBwaW5nIGFwaSBsZXZlbCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzQKIFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0ICs9IFwKQEAgLTEwNCwzICsxMTEsOSBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWRiX2RlYnVnLnByb3AgXAogICAgIHVzZXJkZWJ1Z19wbGF0X3NlcG9saWN5LmNpbAorCisjIE9uIGVuZyBvciB1c2VyZGVidWcgYnVpbGRzLCBidWlsZCBpbiBwZXJmLXNldHVwLXNoIGJ5IGRlZmF1bHQuCitpZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgcGVyZi1zZXR1cC1zaAorZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5tayBiL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5tawppbmRleCA1ZmU1MzMzLi45ZmM5ZmY5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rCkBAIC0xNyw1ICsxNyw4IEBACiAjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdHJ1bmstc3RhYmxlIGZsYWdzIHRoYXQgc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGFsbAogIyBBbmRyb2lkIHRhcmdldHMuCiAKKyMgQ29udHJvbCBsaWJiaW5kZXIgY2xpZW50IGNhY2hpbmcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBsaWJiaW5kZXIsIHJlbGVhc2VfbGliYmluZGVyX2NsaWVudF9jYWNoZSwgJChSRUxFQVNFX0xJQkJJTkRFUl9DTElFTlRfQ0FDSEUpKQorCiAjIFVzZSB0aGUgY29uZmlndXJlZCByZWxlYXNlIG9mIHNxbGl0ZQogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIGxpYnNxbGl0ZTMsIHJlbGVhc2VfcGFja2FnZV9saWJzcWxpdGUzLCAkKFJFTEVBU0VfUEFDS0FHRV9MSUJTUUxJVEUzKSkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5tayBiL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5tawppbmRleCA0YTk2OGQ3Li4xYTNmMmNmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9kZWZhdWx0X2FydF9jb25maWcubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rCkBAIC0xMDEsOCArMTAxLDE2IEBACiAgICAgUFJPRFVDVF9CT09UX0pBUlMgKz0gXAogICAgICAgICBmcmFtZXdvcmstbmZjCiBlbHNlCi0gICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyA6PSBcCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCiAgICAgICAgIGNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzOmZyYW1ld29yay1uZmMKKyAgICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLG5mY19hcGV4X2Jvb3RjbGFzc3BhdGhfZnJhZ21lbnQsdHJ1ZSkKK2VuZGlmCisKKyMgQ2hlY2sgaWYgYnVpbGQgc3VwcG9ydHMgUHJvZmlsaW5nIG1vZHVsZS4KK2lmZXEgKCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpLHRydWUpCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZzpmcmFtZXdvcmstcHJvZmlsaW5nIFwKKwogZW5kaWYKIAogIyBMaXN0IG9mIHN5c3RlbV9zZXJ2ZXIgY2xhc3NwYXRoIGphcnMgZGVsaXZlcmVkIHZpYSBhcGV4LgpAQCAtMTUzLDYgKzE2MSwxMyBAQAogICAgIGNvbS5hbmRyb2lkLnV3YjpzZXJ2aWNlLXV3YiBcCiAgICAgY29tLmFuZHJvaWQud2lmaTpzZXJ2aWNlLXdpZmkgXAogCisjIENoZWNrIGlmIGJ1aWxkIHN1cHBvcnRzIFByb2ZpbGluZyBtb2R1bGUuCitpZmVxICgkKFJFTEVBU0VfUEFDS0FHRV9QUk9GSUxJTkdfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZzpzZXJ2aWNlLXByb2ZpbGluZyBcCisKK2VuZGlmCisKICMgT3ZlcnJpZGVzIHRoZSAoYXBleCwgamFyKSBwYWlycyBhYm92ZSB3aGVuIGRldGVybWluaW5nIHRoZSBvbi1kZXZpY2UgbG9jYXRpb24uIFRoZSBmb3JtYXQgaXM6CiAjIDxvbGRfYXBleD46PG9sZF9qYXI+OjxuZXdfYXBleD46PG5ld19qYXI+CiBQUk9EVUNUX0NPTkZJR1VSRURfSkFSX0xPQ0FUSU9OX09WRVJSSURFUyA6PSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCmluZGV4IDQ3OTM2NTcuLjBhMDllYjEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCkBAIC0xMjAsNiArMTIwLDEwIEBACiAgICAgaW5pdC56eWdvdGU2NC5yYyBcCiAgICAgaW5pdC56eWdvdGU2NF8zMi5yYwogCisjIFN1cHBvcnQgQ3JlZGVudGlhbCBNYW5hZ2VyCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBhbmRyb2lkLnNvZnR3YXJlLmNyZWRlbnRpYWxzLnByZWJ1aWx0LnhtbAorCiAjIEVuYWJsZSBkeW5hbWljIHBhcnRpdGlvbiBzaXplCiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFIDo9IHRydWUKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsgYi90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0cy5tawppbmRleCA3ZmJjMDlkLi40NjI3ZmRlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0cy5taworKysgYi90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0cy5tawpAQCAtMTcsMTAgKzE3LDcgQEAKICMgSW5oZXJpdCBjb21tb24gQW5kcm9pZCBHbyBkZWZhdWx0cy4KICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rKQogCi1QUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlX3NoYXJlZC9idWlsZC9yZWxlYXNlL2dvX2RldmljZXMvcmVsZWFzZV9jb25maWdfbWFwLm1rKQotCi0jIFRPRE8gKGIvMzQyMjY1NjI3KTogUmVtb3ZlIHYvZy9yIG9uY2UgYWxsIHRoZSBmbGFncyBoYXZlIGJlZW4gbW92ZWQgdG8gdi9nX3MvYi9yCi1QUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlL3JlbGVhc2UvZ29fZGV2aWNlcy9yZWxlYXNlX2NvbmZpZ19tYXAubWspCitQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlX3NoYXJlZC9idWlsZC9yZWxlYXNlL2dvX2RldmljZXMvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKIAogIyBBZGQgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgogVEFSR0VUX1NZU1RFTV9QUk9QICs9IFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tayBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawppbmRleCA1MjE4ZjI5Li5mZDQwNDdhIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCkBAIC0zNyw5ICszNyw5IEBACiAjIGxlYXZlIGxlc3MgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHZpYSBKRFdQLgogUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8gOj0gdHJ1ZQogCi0jIERpc2FibGUgU2N1ZG8gb3V0c2lkZSBvZiBlbmcgYnVpbGRzIHRvIHNhdmUgUkFNLgorIyBVc2UgdGhlIGxvdyBtZW1vcnkgYWxsb2NhdG9yIG91dHNpZGUgb2YgZW5nIGJ1aWxkcyB0byBzYXZlIFJTUy4KIGlmbmVxICgsJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCi0gIFBST0RVQ1RfRElTQUJMRV9TQ1VETyA6PSB0cnVlCisgIE1BTExPQ19MT1dfTUVNT1JZIDo9IHRydWUKIGVuZGlmCiAKICMgQWRkIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaV9yZWxlYXNlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsKaW5kZXggNTA0NGEzOS4uMzk0MjhkMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsKQEAgLTUxLDE2ICs1MSwxNSBAQAogICAgIGluaXQudm5kay1ub2RlZi5yYyBcCiAKIAotIyBPdmVybGF5IHRoZSBHU0kgc3BlY2lmaWMgU3lzdGVtVUkgc2V0dGluZworIyBPdmVybGF5IHRoZSBHU0kgc3BlY2lmaWMgc2V0dGluZyBmb3IgZnJhbWV3b3JrIGFuZCBTeXN0ZW1VSQogaWZuZXEgKCQoUFJPRFVDVF9JU19BVVRPTU9USVZFKSx0cnVlKQotICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gZ3NpX292ZXJsYXlfc3lzdGVtdWkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgZ3NpX292ZXJsYXlfZnJhbWV3b3JrIFwKKyAgICAgICAgZ3NpX292ZXJsYXlfc3lzdGVtdWkgXAogICAgIFBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCiAgICAgICAgIGRldmljZS9nZW5lcmljL2NvbW1vbi9vdmVybGF5cy9vdmVybGF5LWNvbmZpZy54bWw6JChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0VYVCkvb3ZlcmxheS9jb25maWcvY29uZmlnLnhtbAogZW5kaWYKIAotIyBiLzMwODg3ODE0NCBubyBtb3JlIFZOREsgb24gMjRRMSBhbmQgYmV5b25kCi1LRUVQX1ZOREsgPz0gZmFsc2UKLQogIyBTdXBwb3J0IGFkZGl0aW9uYWwgVk5ESyBzbmFwc2hvdHMKIFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyA6PSBcCiAgICAgMzAgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rCmluZGV4IDNjNDAxZjMuLjNmM2JkMDEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbS5taworKysgYi90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsKQEAgLTMzLDYgKzMzLDcgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBmcmFtZXdvcmtzL3dlYnZpZXcvY2hyb21pdW0vY2hyb21pdW0ubWspCiAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFuZHJvaWQuc29mdHdhcmUud2luZG93X21hZ25pZmljYXRpb24ucHJlYnVpbHQueG1sIFwKICAgICBCYXNpY0RyZWFtcyBcCiAgICAgQmxvY2tlZE51bWJlclByb3ZpZGVyIFwKICAgICBCbHVldG9vdGhNaWRpU2VydmljZSBcCkBAIC03NSw2ICs3NiwxMCBAQAogICAgIHZyIFwKIAogUFJPRFVDVF9QQUNLQUdFUyArPSAkKFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSkKKyMgU2V0IHZpcnR1YWxfY2FtZXJhX3NlcnZpY2VfZW5hYmxlZCBzb29uZyBjb25maWcgdmFyaWFibGUgYmFzZWQgb24gdGhlCisjIFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSBidWlsZC4gdmlydHVhbF9jYW1lcmFfc2VydmljZV9lbmFibGVkIHNvb25nIGNvbmZpZworIyB2YXJpYWJsZSBpcyB1c2VkIHRvIHByZXZlbnQgYWNjZXNzaW5nIHRoZSBzZXJ2aWNlIHdoZW4gaXQncyBub3QgcHJlc2VudCBpbiB0aGUgYnVpbGQuCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCx2ZG0sdmlydHVhbF9jYW1lcmFfc2VydmljZV9lbmFibGVkLCQoaWYgJChSRUxFQVNFX1BBQ0tBR0VfVklSVFVBTF9DQU1FUkEpLHRydWUsZmFsc2UpKQogCiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUyArPSBcCiAgICAgRnVzZWRMb2NhdGlvbiBcCkBAIC04NCw5ICs4OSw2IEBACiAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gZnJhbWV3b3JrLWF1ZGlvX2VmZmVjdHMueG1sCiAKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS53aW5kb3dfbWFnbmlmaWNhdGlvbi54bWw6JChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNKS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS53aW5kb3dfbWFnbmlmaWNhdGlvbi54bWwgXAotCiBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKICAgICByby5jYXJyaWVyPz11bmtub3duIFwKICAgICByby5jb25maWcubm90aWZpY2F0aW9uX3NvdW5kPz1PblRoZUh1bnQub2dnIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2xhcmdlX3NjcmVlbl9jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9sYXJnZV9zY3JlZW5fY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjlmZjAKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9sYXJnZV9zY3JlZW5fY29tbW9uLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgV2luZG93IEV4dGVuc2lvbnMKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWspCisKKyMgRW5hYmxlIFNldHRpbmdzIDItcGFuZSBvcHRpbWl6YXRpb24gZm9yIGxhcmdlLXNjcmVlbgorUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBcCisgICAgcGVyc2lzdC5zZXR0aW5ncy5sYXJnZV9zY3JlZW5fb3B0LmVuYWJsZWQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtLm1rCmluZGV4IDUwM2M5YjMuLmFmMzg1N2UgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbS5taworKysgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW0ubWsKQEAgLTIxLDYgKzIxLDcgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWspCiAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFuZHJvaWQuc29mdHdhcmUud2Vidmlldy5wcmVidWlsdC54bWwgXAogICAgIGNvbS5hbmRyb2lkLmZ1dHVyZS51c2IuYWNjZXNzb3J5IFwKICAgICBjb20uYW5kcm9pZC5tZWRpYWRybS5zaWduZXIgXAogICAgIGNvbS5hbmRyb2lkLm1lZGlhLnJlbW90ZWRpc3BsYXkgXApAQCAtMzksMTIgKzQwLDkgQEAKIFBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCiAgICAgZnNjay5mMmZzIFwKIAotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLnNvZnR3YXJlLndlYnZpZXcueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS53ZWJ2aWV3LnhtbAotCiBpZm5lcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuc29mdHdhcmUucHJldmlld19zZGsueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay54bWwKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFuZHJvaWQuc29mdHdhcmUucHJldmlld19zZGsucHJlYnVpbHQueG1sCiBlbmRpZgogCiAjIFRoZSBvcmRlciBoZXJlIGlzIHRoZSBzYW1lIG9yZGVyIHRoZXkgZW5kIHVwIG9uIHRoZSBjbGFzc3BhdGgsIHNvIGl0IG1hdHRlcnMuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tayBiL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCmluZGV4IGQ5YzNjOWEuLjllOGFmYTggMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCkBAIC0xNzYsNCArMTc2LDEwIEBACiAgICAgZGFsdmlrLnZtLnVzYXBfcG9vbF9yZWZpbGxfZGVsYXlfbXM/PTMwMDAKIAogUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBcCi0gICAgZGFsdmlrLnZtLnVzZWFydHNlcnZpY2U9dHJ1ZQorICAgIGRhbHZpay52bS51c2VhcnRzZXJ2aWNlPXRydWUgXAorICAgIGRhbHZpay52bS5lbmFibGVfcHJfZGV4b3B0PXRydWUKKworIyBDb3B5IHByZW9wdGVkIGZpbGVzIGZyb20gc3lzdGVtX2Igb24gZmlyc3QgYm9vdC4KK1BST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uY3Bfc3lzdGVtX290aGVyX29kZXg9MQorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgIGNwcHJlb3B0cy5zaApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrLm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrLm1rCmluZGV4IDFhMDczNjMuLjNkNTZhODAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nkay5taworKysgYi90YXJnZXQvcHJvZHVjdC9zZGsubWsKQEAgLTQwLDMgKzQwLDYgQEAKIGlmZXEgKCQoV0lUSE9VVF9DSEVDS19BUEkpLHRydWUpCiAgICQoZXJyb3IgV0lUSE9VVF9DSEVDS19BUEkgY2Fubm90IGJlIHNldCB0byB0cnVlIGZvciBTREsgcHJvZHVjdCBidWlsZHMpCiBlbmRpZgorCisjIEluY2x1ZGUgV2VhciBmbGFnIHZhbHVlcyBzbyB0aGF0IFdlYXItcmVsYXRlZCBBUElzIGFyZSBidWlsZCBpbiBzZGtzLgorUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvd2Vhci9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8pCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icAppbmRleCAxZTI2ZDU5Li4wZDdiMzVlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAKQEAgLTI1LDMgKzI1LDE1IEBACiAgICAgc3ViX2RpcjogInNlY3VyaXR5L2ZzdmVyaXR5IiwKICAgICBmaWxlbmFtZV9mcm9tX3NyYzogdHJ1ZSwKIH0KKworLy8gb3RhY2VydHM6IEEga2V5c3RvcmUgd2l0aCB0aGUgYXV0aG9yaXplZCBrZXlzIGluIGl0LCB3aGljaCBpcyB1c2VkIHRvIHZlcmlmeQorLy8gdGhlIGF1dGhlbnRpY2l0eSBvZiBkb3dubG9hZGVkIE9UQSBwYWNrYWdlcy4KKy8vIFRoaXMgbW9kdWxlIHppcHMgZmlsZXMgZGVmaW5lZCBpbiBQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFIGFuZAorLy8gUFJPRFVDVF9FWFRSQV9PVEFfS0VZUyBmb3Igc3lzdGVtIG9yIFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUyBmb3IgcmVjb3ZlcnkKKy8vIGltYWdlCitvdGFjZXJ0c196aXAgeworICAgIG5hbWU6ICJvdGFjZXJ0cyIsCisgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNlY3VyaXR5IiwKKyAgICBmaWxlbmFtZTogIm90YWNlcnRzLnppcCIsCit9CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5tawppbmRleCA0YmQ4ZWZjLi4xMzhlNWJiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKQEAgLTEwLDU5ICsxMCw4IEBACiAgICAgTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQogICAgIExPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKICAgICBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi0gICAgTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfUk9PVF9PVVQpCisgICAgTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1BST0RVQ1RfRVRDKS9zZWN1cml0eQogICAgIExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoUFJPRFVDVF9BREJfS0VZUykKICAgICBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAgIGVuZGlmCiBlbmRpZgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBvdGFjZXJ0czogQSBrZXlzdG9yZSB3aXRoIHRoZSBhdXRob3JpemVkIGtleXMgaW4gaXQsIHdoaWNoIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YKLSMgZG93bmxvYWRlZCBPVEEgcGFja2FnZXMuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IG90YWNlcnRzCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IG90YWNlcnRzLnppcAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvc2VjdXJpdHkKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLQotZXh0cmFfb3RhX2tleXMgOj0gJChhZGRzdWZmaXggLng1MDkucGVtLCQoUFJPRFVDVF9FWFRSQV9PVEFfS0VZUykpCi0KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9DRVJUIDo9ICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS54NTA5LnBlbQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0VYVFJBX09UQV9LRVlTIDo9ICQoZXh0cmFfb3RhX2tleXMpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFwKLQkgICAgJChTT09OR19aSVApIFwKLQkgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLng1MDkucGVtIFwKLQkgICAgJChleHRyYV9vdGFfa2V5cykKLQkkKFNPT05HX1pJUCkgLW8gJEAgLWogLXN5bWxpbmtzPWZhbHNlIFwKLQkgICAgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9DRVJUKSAkKFBSSVZBVEVfRVhUUkFfT1RBX0tFWVMpKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBvdGFjZXJ0cyBmb3IgcmVjb3ZlcnkgaW1hZ2UuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IG90YWNlcnRzLnJlY292ZXJ5Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IG90YWNlcnRzLnppcAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3N5c3RlbS9ldGMvc2VjdXJpdHkKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLQotZXh0cmFfcmVjb3Zlcnlfa2V5cyA6PSAkKGFkZHN1ZmZpeCAueDUwOS5wZW0sJChQUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQotCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQ0VSVCA6PSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkueDUwOS5wZW0KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9FWFRSQV9SRUNPVkVSWV9LRVlTIDo9ICQoZXh0cmFfcmVjb3Zlcnlfa2V5cykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogXAotCSAgICAkKFNPT05HX1pJUCkgXAotCSAgICAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkueDUwOS5wZW0gXAotCSAgICAkKGV4dHJhX3JlY292ZXJ5X2tleXMpCi0JJChTT09OR19aSVApIC1vICRAIC1qIC1zeW1saW5rcz1mYWxzZSBcCi0JICAgICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfQ0VSVCkgJChQUklWQVRFX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdXNlcnNwYWNlX3JlYm9vdC5tayBiL3RhcmdldC9wcm9kdWN0L3VzZXJzcGFjZV9yZWJvb3QubWsKaW5kZXggZjIzNWQxNC4uNTFmZWIwNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdXNlcnNwYWNlX3JlYm9vdC5taworKysgYi90YXJnZXQvcHJvZHVjdC91c2Vyc3BhY2VfcmVib290Lm1rCkBAIC0xNCw2ICsxNCw0IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIEluaGVyaXQgdGhpcyB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgdXNlcnNwYWNlIHJlYm9vdAotCi1QUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTIDo9IGluaXQudXNlcnNwYWNlX3JlYm9vdC5pc19zdXBwb3J0ZWQ9dHJ1ZQorIyBERVBSRUNBVEVEISBEbyBub3QgaW5oZXJpdCB0aGlzLgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmJvb3QubWsgYi90YXJnZXQvcHJvZHVjdC92Ym9vdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhNDg4My4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC92Ym9vdC5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgUHJvdmlkZXMgZGVwZW5kZW5jaWVzIG5lY2Vzc2FyeSBmb3IgdmVyaWZpZWQgYm9vdAotCi1QUk9EVUNUX1NVUFBPUlRTX1ZCT09UIDo9IHRydWUKLQotIyBUaGUgZGV2IGtleSBpcyB1c2VkIHRvIHNpZ24gYm9vdCBhbmQgcmVjb3ZlcnkgaW1hZ2VzLgotIyBXZSBleHBlY3QgdGhpcyBmaWxlIHRvIGV4aXN0IHdpdGggdGhlIHN1ZmZpeGVzICIudmJwcml2ayIgYW5kICIudmJwdXBrIi4KLSMgVE9ETzogZmluZCBhIHByb3BlciBsb2NhdGlvbiBmb3IgdGhpcwotUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSA6PSBleHRlcm5hbC92Ym9vdF9yZWZlcmVuY2UvdGVzdHMvZGV2a2V5cy9rZXJuZWxfZGF0YV9rZXkKLVBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkgOj0gZXh0ZXJuYWwvdmJvb3RfcmVmZXJlbmNlL3Rlc3RzL2RldmtleXMva2VybmVsX3N1YmtleQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjA2ODYKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9PV05FUlMKQEAgLTAsMCArMSw0IEBACit6aGFuZ2tlbHZpbkBnb29nbGUuY29tCitkdmFuZGVyQGdvb2dsZS5jb20KK2FrYWlsYXNoQGdvb2dsZS5jb20KKwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5tawppbmRleCBjOTY0ODYwLi5kYzFlZTNlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5taworKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5tawpAQCAtMjgsNCArMjgsNSBAQAogUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OIDo9IHRydWUKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHNuYXB1c2VyZC52ZW5kb3JfcmFtZGlzayBcCi0gICAgc25hcHVzZXJkCisgICAgc25hcHVzZXJkIFwKKyAgICBzbmFwdXNlcmQucmVjb3ZlcnkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uX3JldHJvZml0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb25fcmV0cm9maXQubWsKaW5kZXggMTE4ZDNmMi4uNmMyOWNiYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb25fcmV0cm9maXQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb25fcmV0cm9maXQubWsKQEAgLTI0LDQgKzI0LDUgQEAKICMgYXMgd2VsbC4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHNuYXB1c2VyZC5yYW1kaXNrIFwKLSAgICBzbmFwdXNlcmQKKyAgICBzbmFwdXNlcmQgXAorICAgIHNuYXB1c2VyZC5yZWNvdmVyeQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5tayBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL3ZhYmNfZmVhdHVyZXMubWsKaW5kZXggMTIxOTc2My4uZTI3NDVhMSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5taworKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS92YWJjX2ZlYXR1cmVzLm1rCkBAIC00MCw2ICs0MCw3IEBACiAjIHJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24ueG9yLmVuYWJsZWQgYW5kIHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZAogIyBpcyBhbHNvIHJlY29tbWVuZGVkCiAjCisjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5yZWFkX2FoZWFkX3NpemU9MTYKICMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLm9fZGlyZWN0LmVuYWJsZWQ9dHJ1ZQogIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIubWVyZ2VfdGhyZWFkX3ByaW9yaXR5PTE5CiAjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi53b3JrZXJfdGhyZWFkX3ByaW9yaXR5PTAKZGlmZiAtLWdpdCBhL3RlYW1zL0FuZHJvaWQuYnAgYi90ZWFtcy9BbmRyb2lkLmJwCmluZGV4IGIzYTU3NTIuLjk0NTg1ZmMgMTAwNjQ0Ci0tLSBhL3RlYW1zL0FuZHJvaWQuYnAKKysrIGIvdGVhbXMvQW5kcm9pZC5icApAQCAtNDM5MSwzICs0MzkxLDUyIEBACiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk1NTQwNTU1OTIwMTc5MgogICAgIHRyZW5keV90ZWFtX2lkOiAiNTk1NTQwNTU1OTIwMTc5MiIsCiB9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2JldHRlcl90b2dldGhlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjE3MzAwNDUxNzIxMjE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjE3MzAwNDUxNzIxMjE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2F0dGFja190b29scyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzA1NjI5MTg1MDgxMzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzA1NjI5MTg1MDgxMzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfbWVkaWFfc29sdXRpb25zX2VkaXRpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM1MDc1MDE5Mjc2Mjg4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM1MDc1MDE5Mjc2Mjg4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX3NvbHV0aW9uc19wbGF5YmFjayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NzQyNTE1MjUyNTU5ODcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NzQyNTE1MjUyNTU5ODcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfdGVsZW1ldHJ5X2NsaWVudF9pbmZyYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDAzMjQ1MDc3NDMwMjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDAzMjQ1MDc3NDMwMjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3B0ZV9zeXN1aSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTg1ODk3NDYzMzgyMDE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTg1ODk3NDYzMzgyMDE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3Ryb3VibGVzaG9vdGluZ19hcHAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA5NzAwMzc0NjQyNjg4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA5NzAwMzc0NjQyNjg4MCIsCit9CmRpZmYgLS1naXQgYS90ZXN0cy9BbmRyb2lkLmJwIGIvdGVzdHMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkZWJmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSB7Ci0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAotICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2J1aWxkIiwKLX0KLQotcHl0aG9uX3Rlc3RfaG9zdCB7Ci0gICAgbmFtZTogInJ1bl90b29sX3dpdGhfbG9nZ2luZ190ZXN0IiwKLSAgICBtYWluOiAicnVuX3Rvb2xfd2l0aF9sb2dnaW5nX3Rlc3QucHkiLAotICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAotICAgIHNyY3M6IFsKLSAgICAgICAgInJ1bl90b29sX3dpdGhfbG9nZ2luZ190ZXN0LnB5IiwKLSAgICBdLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLSAgICBkYXRhOiBbCi0gICAgICAgICI6ZW52c2V0dXBfbWluaW11bS56aXAiLAotICAgICAgICAiOnRvb2xfZXZlbnRfbG9nZ2VyIiwKLSAgICBdLAotICAgIHRlc3Rfc3VpdGVzOiBbCi0gICAgICAgICJnZW5lcmFsLXRlc3RzIiwKLSAgICBdLAotICAgIHZlcnNpb246IHsKLSAgICAgICAgcHkzOiB7Ci0gICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuX3Rvb2xfd2l0aF9sb2dnaW5nX3Rlc3QucHkgYi90ZXN0cy9ydW5fdG9vbF93aXRoX2xvZ2dpbmdfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5YjU5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9ydW5fdG9vbF93aXRoX2xvZ2dpbmdfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0jIENvcHlyaWdodCAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgZGF0YWNsYXNzZXMKLWltcG9ydCBnbG9iCi1mcm9tIGltcG9ydGxpYiBpbXBvcnQgcmVzb3VyY2VzCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1mcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKLWltcG9ydCByZQotaW1wb3J0IHNodXRpbAotaW1wb3J0IHNpZ25hbAotaW1wb3J0IHN0YXQKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGVtcGZpbGUKLWltcG9ydCB0ZXh0d3JhcAotaW1wb3J0IHRpbWUKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IHppcGZpbGUKLQotRVhJSV9SRVRVUk5fQ09ERSA9IDAKLUlOVEVSUlVQVEVEX1JFVFVSTl9DT0RFID0gMTMwCi0KLQotY2xhc3MgUnVuVG9vbFdpdGhMb2dnaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgQGNsYXNzbWV0aG9kCi0gIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKLSAgICAjIENvbmZpZ3VyZSB0byBwcmludCBsb2dnaW5nIHRvIHN0ZG91dC4KLSAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZpbGVuYW1lPU5vbmUsIGxldmVsPWxvZ2dpbmcuREVCVUcpCi0gICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQotICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCIiKS5hZGRIYW5kbGVyKGNvbnNvbGUpCi0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIHN1cGVyKCkuc2V0VXAoKQotICAgIHNlbGYud29ya2luZ19kaXIgPSB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkoKQotICAgICMgUnVuIGFsbCB0aGUgdGVzdHMgZnJvbSB3b3JraW5nX2RpciB3aGljaCBpcyBvdXIgdGVtcCBBbmRyb2lkIGJ1aWxkIHRvcC4KLSAgICBvcy5jaGRpcihzZWxmLndvcmtpbmdfZGlyLm5hbWUpCi0gICAgIyBFeHRyYWN0IGVudnNldHVwLnppcCB3aGljaCBjb250YWlucyB0aGUgZW52c2V0dXAuc2ggYW5kIG90aGVyIGRlcGVuZGVudAotICAgICMgc2NyaXB0cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50cy4KLSAgICB3aXRoIHJlc291cmNlcy5maWxlcygidGVzdGRhdGEiKS5qb2lucGF0aCgiZW52c2V0dXAuemlwIikub3BlbigicmIiKSBhcyBwOgotICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUocCwgInIiKSBhcyB6aXBfZjoKLSAgICAgICAgemlwX2YuZXh0cmFjdGFsbCgpCi0KLSAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgIHNlbGYud29ya2luZ19kaXIuY2xlYW51cCgpCi0gICAgc3VwZXIoKS50ZWFyRG93bigpCi0KLSAgZGVmIHRlc3RfZG9lc19ub3RfbG9nX3doZW5fbG9nZ2VyX3Zhcl9lbXB0eShzZWxmKToKLSAgICB0ZXN0X3Rvb2wgPSBUZXN0U2NyaXB0LmNyZWF0ZShzZWxmLndvcmtpbmdfZGlyKQotCi0gICAgc2VsZi5fcnVuX3NjcmlwdF9hbmRfd2FpdChmIiIiCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSIiCi0gICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBS0VfVE9PTCIge3Rlc3RfdG9vbC5leGVjdXRhYmxlfSBhcmcxIGFyZzIKLSAgICAiIiIpCi0KLSAgICB0ZXN0X3Rvb2wuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGhfYXJncygiYXJnMSBhcmcyIikKLQotICBkZWYgdGVzdF9kb2VzX25vdF9sb2dfd2l0aF9sb2dnZXJfdW5zZXQoc2VsZik6Ci0gICAgdGVzdF90b29sID0gVGVzdFNjcmlwdC5jcmVhdGUoc2VsZi53b3JraW5nX2RpcikKLQotICAgIHNlbGYuX3J1bl9zY3JpcHRfYW5kX3dhaXQoZiIiIgotICAgICAgdW5zZXQgQU5EUk9JRF9UT09MX0xPR0dFUgotICAgICAgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nICJGQUtFX1RPT0wiIHt0ZXN0X3Rvb2wuZXhlY3V0YWJsZX0gYXJnMSBhcmcyCi0gICAgIiIiKQotCi0gICAgdGVzdF90b29sLmFzc2VydF9jYWxsZWRfb25jZV93aXRoX2FyZ3MoImFyZzEgYXJnMiIpCi0KLSAgZGVmIHRlc3RfbG9nX3N1Y2Nlc3Nfd2l0aF9sb2dnZXJfZW5hYmxlZChzZWxmKToKLSAgICB0ZXN0X3Rvb2wgPSBUZXN0U2NyaXB0LmNyZWF0ZShzZWxmLndvcmtpbmdfZGlyKQotICAgIHRlc3RfbG9nZ2VyID0gVGVzdFNjcmlwdC5jcmVhdGUoc2VsZi53b3JraW5nX2RpcikKLQotICAgIHNlbGYuX3J1bl9zY3JpcHRfYW5kX3dhaXQoZiIiIgotICAgICAgQU5EUk9JRF9UT09MX0xPR0dFUj0ie3Rlc3RfbG9nZ2VyLmV4ZWN1dGFibGV9IgotICAgICAgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nICJGQUtFX1RPT0wiIHt0ZXN0X3Rvb2wuZXhlY3V0YWJsZX0gYXJnMSBhcmcyCi0gICAgIiIiKQotCi0gICAgdGVzdF90b29sLmFzc2VydF9jYWxsZWRfb25jZV93aXRoX2FyZ3MoImFyZzEgYXJnMiIpCi0gICAgZXhwZWN0ZWRfbG9nZ2VyX2FyZ3MgPSAoCi0gICAgICAgICItLXRvb2xfdGFnPUZBS0VfVE9PTCAtLXN0YXJ0X3RpbWVzdGFtcD1cZCtcLlxkKyAtLWVuZF90aW1lc3RhbXA9IgotICAgICAgICAiXGQrXC5cZCsgLS10b29sX2FyZ3M9YXJnMSBhcmcyIC0tZXhpdF9jb2RlPTAiCi0gICAgKQotICAgIHRlc3RfbG9nZ2VyLmFzc2VydF9jYWxsZWRfb25jZV93aXRoX2FyZ3MoZXhwZWN0ZWRfbG9nZ2VyX2FyZ3MpCi0KLSAgZGVmIHRlc3RfcnVuX3Rvb2xfb3V0cHV0X2lzX3NhbWVfd2l0aF9hbmRfd2l0aG91dF9sb2dnaW5nKHNlbGYpOgotICAgIHRlc3RfdG9vbCA9IFRlc3RTY3JpcHQuY3JlYXRlKHNlbGYud29ya2luZ19kaXIsICJlY2hvICd0b29sIGNhbGxlZCciKQotICAgIHRlc3RfbG9nZ2VyID0gVGVzdFNjcmlwdC5jcmVhdGUoc2VsZi53b3JraW5nX2RpcikKLQotICAgIHJ1bl90b29sX3dpdGhfbG9nZ2luZ19zdGRvdXQsIHJ1bl90b29sX3dpdGhfbG9nZ2luZ19zdGRlcnIgPSAoCi0gICAgICAgIHNlbGYuX3J1bl9zY3JpcHRfYW5kX3dhaXQoZiIiIgotICAgICAgQU5EUk9JRF9UT09MX0xPR0dFUj0ie3Rlc3RfbG9nZ2VyLmV4ZWN1dGFibGV9IgotICAgICAgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nICJGQUtFX1RPT0wiIHt0ZXN0X3Rvb2wuZXhlY3V0YWJsZX0gYXJnMSBhcmcyCi0gICAgIiIiKQotICAgICkKLQotICAgIHJ1bl90b29sX3dpdGhvdXRfbG9nZ2luZ19zdGRvdXQsIHJ1bl90b29sX3dpdGhvdXRfbG9nZ2luZ19zdGRlcnIgPSAoCi0gICAgICAgIHNlbGYuX3J1bl9zY3JpcHRfYW5kX3dhaXQoZiIiIgotICAgICAgQU5EUk9JRF9UT09MX0xPR0dFUj0ie3Rlc3RfbG9nZ2VyLmV4ZWN1dGFibGV9IgotICAgICAge3Rlc3RfdG9vbC5leGVjdXRhYmxlfSBhcmcxIGFyZzIKLSAgICAiIiIpCi0gICAgKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nX3N0ZG91dCwgcnVuX3Rvb2xfd2l0aG91dF9sb2dnaW5nX3N0ZG91dAotICAgICkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmdfc3RkZXJyLCBydW5fdG9vbF93aXRob3V0X2xvZ2dpbmdfc3RkZXJyCi0gICAgKQotCi0gIGRlZiB0ZXN0X2xvZ2dlcl9vdXRwdXRfaXNfc3VwcHJlc3NlZChzZWxmKToKLSAgICB0ZXN0X3Rvb2wgPSBUZXN0U2NyaXB0LmNyZWF0ZShzZWxmLndvcmtpbmdfZGlyKQotICAgIHRlc3RfbG9nZ2VyID0gVGVzdFNjcmlwdC5jcmVhdGUoc2VsZi53b3JraW5nX2RpciwgImVjaG8gJ2xvZ2dlciBjYWxsZWQnIikKLQotICAgIHJ1bl90b29sX3dpdGhfbG9nZ2luZ19vdXRwdXQsIF8gPSBzZWxmLl9ydW5fc2NyaXB0X2FuZF93YWl0KGYiIiIKLSAgICAgIEFORFJPSURfVE9PTF9MT0dHRVI9Int0ZXN0X2xvZ2dlci5leGVjdXRhYmxlfSIKLSAgICAgIHJ1bl90b29sX3dpdGhfbG9nZ2luZyAiRkFLRV9UT09MIiB7dGVzdF90b29sLmV4ZWN1dGFibGV9IGFyZzEgYXJnMgotICAgICIiIikKLQotICAgIHNlbGYuYXNzZXJ0Tm90SW4oImxvZ2dlciBjYWxsZWQiLCBydW5fdG9vbF93aXRoX2xvZ2dpbmdfb3V0cHV0KQotCi0gIGRlZiB0ZXN0X2xvZ2dlcl9lcnJvcl9pc19zdXBwcmVzc2VkKHNlbGYpOgotICAgIHRlc3RfdG9vbCA9IFRlc3RTY3JpcHQuY3JlYXRlKHNlbGYud29ya2luZ19kaXIpCi0gICAgdGVzdF9sb2dnZXIgPSBUZXN0U2NyaXB0LmNyZWF0ZSgKLSAgICAgICAgc2VsZi53b3JraW5nX2RpciwgImVjaG8gJ2xvZ2dlciBmYWlsZWQnID4gL2Rldi9zdGRlcnI7IGV4aXQgMSIKLSAgICApCi0KLSAgICBfLCBlcnIgPSBzZWxmLl9ydW5fc2NyaXB0X2FuZF93YWl0KGYiIiIKLSAgICAgIEFORFJPSURfVE9PTF9MT0dHRVI9Int0ZXN0X2xvZ2dlci5leGVjdXRhYmxlfSIKLSAgICAgIHJ1bl90b29sX3dpdGhfbG9nZ2luZyAiRkFLRV9UT09MIiB7dGVzdF90b29sLmV4ZWN1dGFibGV9IGFyZzEgYXJnMgotICAgICIiIikKLQotICAgIHNlbGYuYXNzZXJ0Tm90SW4oImxvZ2dlciBmYWlsZWQiLCBlcnIpCi0KLSAgZGVmIHRlc3RfbG9nX3N1Y2Nlc3Nfd2hlbl90b29sX2ludGVycnVwdGVkKHNlbGYpOgotICAgIHRlc3RfdG9vbCA9IFRlc3RTY3JpcHQuY3JlYXRlKHNlbGYud29ya2luZ19kaXIsIHNjcmlwdF9ib2R5PSJzbGVlcCAxMDAiKQotICAgIHRlc3RfbG9nZ2VyID0gVGVzdFNjcmlwdC5jcmVhdGUoc2VsZi53b3JraW5nX2RpcikKLQotICAgIHByb2Nlc3MgPSBzZWxmLl9ydW5fc2NyaXB0X2luX2J1aWxkX2VudihmIiIiCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSJ7dGVzdF9sb2dnZXIuZXhlY3V0YWJsZX0iCi0gICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBS0VfVE9PTCIge3Rlc3RfdG9vbC5leGVjdXRhYmxlfSBhcmcxIGFyZzIKLSAgICAiIiIpCi0KLSAgICBwZ2lkID0gb3MuZ2V0cGdpZChwcm9jZXNzLnBpZCkKLSAgICAjIEdpdmUgc29tZXRpbWUgZm9yIHRoZSBzdWJwcm9jZXNzIHRvIHN0YXJ0LgotICAgIHRpbWUuc2xlZXAoMSkKLSAgICAjIEtpbGwgdGhlIHN1YnByb2Nlc3MgYW5kIGFueSBwcm9jZXNzZXMgY3JlYXRlZCBpbiB0aGUgc2FtZSBncm91cC4KLSAgICBvcy5raWxscGcocGdpZCwgc2lnbmFsLlNJR0lOVCkKLQotICAgIHJldHVybmNvZGUsIF8sIF8gPSBzZWxmLl93YWl0X2Zvcl9wcm9jZXNzKHByb2Nlc3MpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChyZXR1cm5jb2RlLCBJTlRFUlJVUFRFRF9SRVRVUk5fQ09ERSkKLQotICAgIGV4cGVjdGVkX2xvZ2dlcl9hcmdzID0gKAotICAgICAgICAiLS10b29sX3RhZz1GQUtFX1RPT0wgLS1zdGFydF90aW1lc3RhbXA9XGQrXC5cZCsgLS1lbmRfdGltZXN0YW1wPSIKLSAgICAgICAgIlxkK1wuXGQrIC0tdG9vbF9hcmdzPWFyZzEgYXJnMiAtLWV4aXRfY29kZT0xMzAiCi0gICAgKQotICAgIHRlc3RfbG9nZ2VyLmFzc2VydF9jYWxsZWRfb25jZV93aXRoX2FyZ3MoZXhwZWN0ZWRfbG9nZ2VyX2FyZ3MpCi0KLSAgZGVmIHRlc3RfbG9nZ2VyX2Nhbl9iZV90b2dnbGVkX29uKHNlbGYpOgotICAgIHRlc3RfdG9vbCA9IFRlc3RTY3JpcHQuY3JlYXRlKHNlbGYud29ya2luZ19kaXIpCi0gICAgdGVzdF9sb2dnZXIgPSBUZXN0U2NyaXB0LmNyZWF0ZShzZWxmLndvcmtpbmdfZGlyKQotCi0gICAgc2VsZi5fcnVuX3NjcmlwdF9hbmRfd2FpdChmIiIiCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSIiCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSJ7dGVzdF9sb2dnZXIuZXhlY3V0YWJsZX0iCi0gICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBS0VfVE9PTCIge3Rlc3RfdG9vbC5leGVjdXRhYmxlfSBhcmcxIGFyZzIKLSAgICAiIiIpCi0KLSAgICB0ZXN0X2xvZ2dlci5hc3NlcnRfY2FsbGVkX3dpdGhfdGltZXMoMSkKLQotICBkZWYgdGVzdF9sb2dnZXJfY2FuX2JlX3RvZ2dsZWRfb2ZmKHNlbGYpOgotICAgIHRlc3RfdG9vbCA9IFRlc3RTY3JpcHQuY3JlYXRlKHNlbGYud29ya2luZ19kaXIpCi0gICAgdGVzdF9sb2dnZXIgPSBUZXN0U2NyaXB0LmNyZWF0ZShzZWxmLndvcmtpbmdfZGlyKQotCi0gICAgc2VsZi5fcnVuX3NjcmlwdF9hbmRfd2FpdChmIiIiCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSJ7dGVzdF9sb2dnZXIuZXhlY3V0YWJsZX0iCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSIiCi0gICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBS0VfVE9PTCIge3Rlc3RfdG9vbC5leGVjdXRhYmxlfSBhcmcxIGFyZzIKLSAgICAiIiIpCi0KLSAgICB0ZXN0X2xvZ2dlci5hc3NlcnRfbm90X2NhbGxlZCgpCi0KLSAgZGVmIHRlc3RfaW50ZWdyYXRpb25fdG9vbF9ldmVudF9sb2dnZXJfZHJ5X3J1bihzZWxmKToKLSAgICB0ZXN0X3Rvb2wgPSBUZXN0U2NyaXB0LmNyZWF0ZShzZWxmLndvcmtpbmdfZGlyKQotICAgIGxvZ2dlcl9wYXRoID0gc2VsZi5faW1wb3J0X2xvZ2dlcigpCi0KLSAgICBzZWxmLl9ydW5fc2NyaXB0X2FuZF93YWl0KGYiIiIKLSAgICAgIFRNUERJUj0ie3NlbGYud29ya2luZ19kaXIubmFtZX0iCi0gICAgICBBTkRST0lEX1RPT0xfTE9HR0VSPSJ7bG9nZ2VyX3BhdGh9IgotICAgICAgQU5EUk9JRF9UT09MX0xPR0dFUl9FWFRSQV9BUkdTPSItLWRyeV9ydW4iCi0gICAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBS0VfVE9PTCIge3Rlc3RfdG9vbC5leGVjdXRhYmxlfSBhcmcxIGFyZzIKLSAgICAiIiIpCi0KLSAgICBzZWxmLl9hc3NlcnRfbG9nZ2VyX2RyeV9ydW4oKQotCi0gIGRlZiB0ZXN0X3Rvb2xfYXJnc19kb19ub3RfZmFpbF9sb2dnZXIoc2VsZik6Ci0gICAgdGVzdF90b29sID0gVGVzdFNjcmlwdC5jcmVhdGUoc2VsZi53b3JraW5nX2RpcikKLSAgICBsb2dnZXJfcGF0aCA9IHNlbGYuX2ltcG9ydF9sb2dnZXIoKQotCi0gICAgc2VsZi5fcnVuX3NjcmlwdF9hbmRfd2FpdChmIiIiCi0gICAgICBUTVBESVI9IntzZWxmLndvcmtpbmdfZGlyLm5hbWV9IgotICAgICAgQU5EUk9JRF9UT09MX0xPR0dFUj0ie2xvZ2dlcl9wYXRofSIKLSAgICAgIEFORFJPSURfVE9PTF9MT0dHRVJfRVhUUkFfQVJHUz0iLS1kcnlfcnVuIgotICAgICAgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nICJGQUtFX1RPT0wiIHt0ZXN0X3Rvb2wuZXhlY3V0YWJsZX0gLS10b29sLWFyZzEKLSAgICAiIiIpCi0KLSAgICBzZWxmLl9hc3NlcnRfbG9nZ2VyX2RyeV9ydW4oKQotCi0gIGRlZiBfaW1wb3J0X2xvZ2dlcihzZWxmKSAtPiBQYXRoOgotICAgIGxvZ2dlciA9ICJ0b29sX2V2ZW50X2xvZ2dlciIKLSAgICBsb2dnZXJfcGF0aCA9IFBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aChsb2dnZXIpCi0gICAgd2l0aCByZXNvdXJjZXMuYXNfZmlsZShyZXNvdXJjZXMuZmlsZXMoInRlc3RkYXRhIikuam9pbnBhdGgobG9nZ2VyKSkgYXMgcDoKLSAgICAgIHNodXRpbC5jb3B5KHAsIGxvZ2dlcl9wYXRoKQotICAgIFBhdGguY2htb2QobG9nZ2VyX3BhdGgsIDBvNzU1KQotICAgIHJldHVybiBsb2dnZXJfcGF0aAotCi0gIGRlZiBfYXNzZXJ0X2xvZ2dlcl9kcnlfcnVuKHNlbGYpOgotICAgIGxvZ19maWxlcyA9IGdsb2IuZ2xvYihzZWxmLndvcmtpbmdfZGlyLm5hbWUgKyAiL3Rvb2xfZXZlbnRfbG9nZ2VyXyovKi5sb2ciKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ19maWxlcyksIDEpCi0KLSAgICB3aXRoIG9wZW4obG9nX2ZpbGVzWzBdLCAiciIpIGFzIGY6Ci0gICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgMSkKLSAgICAgIHNlbGYuYXNzZXJ0SW4oImRyeSBydW4iLCBsaW5lc1swXSkKLQotICBkZWYgX2NyZWF0ZV9idWlsZF9lbnZfc2NyaXB0KHNlbGYpIC0+IHN0cjoKLSAgICByZXR1cm4gZiIiIgotICAgICAgc291cmNlIHtQYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoImJ1aWxkL21ha2UvZW52c2V0dXAuc2giKX0KLSAgICAiIiIKLQotICBkZWYgX3J1bl9zY3JpcHRfYW5kX3dhaXQoc2VsZiwgdGVzdF9zY3JpcHQ6IHN0cikgLT4gdHVwbGVbc3RyLCBzdHJdOgotICAgIHByb2Nlc3MgPSBzZWxmLl9ydW5fc2NyaXB0X2luX2J1aWxkX2Vudih0ZXN0X3NjcmlwdCkKLSAgICByZXR1cm5jb2RlLCBvdXQsIGVyciA9IHNlbGYuX3dhaXRfZm9yX3Byb2Nlc3MocHJvY2VzcykKLSAgICBsb2dnaW5nLmRlYnVnKCJzY3JpcHQgc3Rkb3V0OiAlcyIsIG91dCkKLSAgICBsb2dnaW5nLmRlYnVnKCJzY3JpcHQgc3RkZXJyOiAlcyIsIGVycikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHJldHVybmNvZGUsIEVYSUlfUkVUVVJOX0NPREUpCi0gICAgcmV0dXJuIG91dCwgZXJyCi0KLSAgZGVmIF9ydW5fc2NyaXB0X2luX2J1aWxkX2VudihzZWxmLCB0ZXN0X3NjcmlwdDogc3RyKSAtPiBzdWJwcm9jZXNzLlBvcGVuOgotICAgIHNldHVwX2J1aWxkX2Vudl9zY3JpcHQgPSBzZWxmLl9jcmVhdGVfYnVpbGRfZW52X3NjcmlwdCgpCi0gICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgIHNldHVwX2J1aWxkX2Vudl9zY3JpcHQgKyB0ZXN0X3NjcmlwdCwKLSAgICAgICAgc2hlbGw9VHJ1ZSwKLSAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgdGV4dD1UcnVlLAotICAgICAgICBzdGFydF9uZXdfc2Vzc2lvbj1UcnVlLAotICAgICAgICBleGVjdXRhYmxlPSIvYmluL2Jhc2giLAotICAgICAgICApCi0KLSAgZGVmIF93YWl0X2Zvcl9wcm9jZXNzKAotICAgICAgc2VsZiwgcHJvY2Vzczogc3VicHJvY2Vzcy5Qb3BlbgotICApIC0+IHR1cGxlW2ludCwgc3RyLCBzdHJdOgotICAgIHBnaWQgPSBvcy5nZXRwZ2lkKHByb2Nlc3MucGlkKQotICAgIG91dCwgZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCi0gICAgIyBXYWl0IGZvciBhbGwgcHJvY2VzcyBpbiB0aGUgc2FtZSBncm91cCB0byBjb21wbGV0ZSBzaW5jZSB0aGUgbG9nZ2VyIHJ1bnMKLSAgICAjIGFzIGEgc2VwYXJhdGUgZGV0YWNoZWQgcHJvY2Vzcy4KLSAgICBzZWxmLl93YWl0X2Zvcl9wcm9jZXNzX2dyb3VwKHBnaWQpCi0gICAgcmV0dXJuIChwcm9jZXNzLnJldHVybmNvZGUsIG91dCwgZXJyKQotCi0gIGRlZiBfd2FpdF9mb3JfcHJvY2Vzc19ncm91cChzZWxmLCBwZ2lkOiBpbnQsIHRpbWVvdXQ6IGludCA9IDUpOgotICAgICIiIldhaXRzIGZvciBhbGwgc3VicHJvY2Vzc2VzIHdpdGhpbiB0aGUgcHJvY2VzcyBncm91cCB0byBjb21wbGV0ZS4iIiIKLSAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgaWYgdGltZS50aW1lKCkgLSBzdGFydF90aW1lID4gdGltZW91dDoKLSAgICAgICAgcmFpc2UgVGltZW91dEVycm9yKAotICAgICAgICAgICAgZiJQcm9jZXNzIGdyb3VwIGRpZCBub3QgY29tcGxldGUgYWZ0ZXIge3RpbWVvdXR9IHNlY29uZHMiCi0gICAgICAgICkKLSAgICAgIGZvciBwaWQgaW4gb3MubGlzdGRpcigiL3Byb2MiKToKLSAgICAgICAgaWYgcGlkLmlzZGlnaXQoKToKLSAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBvcy5nZXRwZ2lkKGludChwaWQpKSA9PSBwZ2lkOgotICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKLSAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICBleGNlcHQgKEZpbGVOb3RGb3VuZEVycm9yLCBQZXJtaXNzaW9uRXJyb3IsIFByb2Nlc3NMb29rdXBFcnJvcik6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICBlbHNlOgotICAgICAgICAjIEFsbCBwcm9jZXNzZXMgaGF2ZSBjb21wbGV0ZWQuCi0gICAgICAgIGJyZWFrCi0KLQotQGRhdGFjbGFzc2VzLmRhdGFjbGFzcwotY2xhc3MgVGVzdFNjcmlwdDoKLSAgZXhlY3V0YWJsZTogUGF0aAotICBvdXRwdXRfZmlsZTogUGF0aAotCi0gIGRlZiBjcmVhdGUodGVtcF9kaXI6IFBhdGgsIHNjcmlwdF9ib2R5OiBzdHIgPSAiIik6Ci0gICAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGlyPXRlbXBfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZSkgYXMgZjoKLSAgICAgIG91dHB1dF9maWxlID0gZi5uYW1lCi0KLSAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkaXI9dGVtcF9kaXIubmFtZSwgZGVsZXRlPUZhbHNlKSBhcyBmOgotICAgICAgZXhlY3V0YWJsZSA9IGYubmFtZQotICAgICAgZXhlY3V0YWJsZV9jb250ZW50cyA9IHRleHR3cmFwLmRlZGVudChmIiIiCi0gICAgICAjIS9iaW4vYmFzaAotCi0gICAgICBlY2hvICIke3tAfX0iID4+IHtvdXRwdXRfZmlsZX0KLSAgICAgIHtzY3JpcHRfYm9keX0KLSAgICAgICIiIikKLSAgICAgIGYud3JpdGUoZXhlY3V0YWJsZV9jb250ZW50cy5lbmNvZGUoInV0Zi04IikpCi0KLSAgICBQYXRoLmNobW9kKGYubmFtZSwgb3Muc3RhdChmLm5hbWUpLnN0X21vZGUgfCBzdGF0LlNfSUVYRUMpCi0KLSAgICByZXR1cm4gVGVzdFNjcmlwdChleGVjdXRhYmxlLCBvdXRwdXRfZmlsZSkKLQotICBkZWYgYXNzZXJ0X2NhbGxlZF93aXRoX3RpbWVzKHNlbGYsIGV4cGVjdGVkX2NhbGxfdGltZXM6IGludCk6Ci0gICAgbGluZXMgPSBzZWxmLl9yZWFkX2NvbnRlbnRzX2Zyb21fb3V0cHV0X2ZpbGUoKQotICAgIGFzc2VydCBsZW4obGluZXMpID09IGV4cGVjdGVkX2NhbGxfdGltZXMsICgKLSAgICAgICAgZiJFeHBlY3QgdG8gY2FsbCB7ZXhwZWN0ZWRfY2FsbF90aW1lc30gdGltZXMsIGJ1dCBhY3R1YWxseSBjYWxsZWQiCi0gICAgICAgIGYiIHtsZW4obGluZXMpfSB0aW1lcy4iCi0gICAgKQotCi0gIGRlZiBhc3NlcnRfY2FsbGVkX3dpdGhfYXJncyhzZWxmLCBleHBlY3RlZF9hcmdzOiBzdHIpOgotICAgIGxpbmVzID0gc2VsZi5fcmVhZF9jb250ZW50c19mcm9tX291dHB1dF9maWxlKCkKLSAgICBhc3NlcnQgbGVuKGxpbmVzKSA+IDAKLSAgICBhc3NlcnQgcmUuc2VhcmNoKGV4cGVjdGVkX2FyZ3MsIGxpbmVzWzBdKSwgKAotICAgICAgICBmIkV4cGVjdCB0byBjYWxsIHdpdGggYXJncyB7ZXhwZWN0ZWRfYXJnc30sIGJ1dCBhY3R1YWxseSBjYWxsZWQgd2l0aCIKLSAgICAgICAgZiIgYXJncyB7bGluZXNbMF19LiIKLSAgICApCi0KLSAgZGVmIGFzc2VydF9ub3RfY2FsbGVkKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0X2NhbGxlZF93aXRoX3RpbWVzKDApCi0KLSAgZGVmIGFzc2VydF9jYWxsZWRfb25jZV93aXRoX2FyZ3Moc2VsZiwgZXhwZWN0ZWRfYXJnczogc3RyKToKLSAgICBzZWxmLmFzc2VydF9jYWxsZWRfd2l0aF90aW1lcygxKQotICAgIHNlbGYuYXNzZXJ0X2NhbGxlZF93aXRoX2FyZ3MoZXhwZWN0ZWRfYXJncykKLQotICBkZWYgX3JlYWRfY29udGVudHNfZnJvbV9vdXRwdXRfZmlsZShzZWxmKSAtPiBsaXN0W3N0cl06Ci0gICAgd2l0aCBvcGVuKHNlbGYub3V0cHV0X2ZpbGUsICJyIikgYXMgZjoKLSAgICAgIHJldHVybiBmLnJlYWRsaW5lcygpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL1RFU1RfTUFQUElORyBiL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCmluZGV4IDQ0OGQ4Y2YuLjE1ZTQxODcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCisrKyBiL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCkBAIC05OCw2ICs5OCwxMCBAQAogICAgIHsKICAgICAgIC8vIGFjb25maWdfc3RvcmFnZSBmaWxlIGNwcCBpbnRlZ3JhdGlvbiB0ZXN0cwogICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5jcHAiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnX3N0b3JhZ2UgZmlsZSBqYXZhIGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0LmphdmEiCiAgICAgfQogICBdLAogICAicG9zdHN1Ym1pdCI6IFsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vY3BwLnJzCmluZGV4IGU3NDNiMmYuLjJjNTY5ZGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2NwcC5ycwpAQCAtNDUsNiArNDUsOCBAQAogICAgIGxldCBoZWFkZXIgPSBwYWNrYWdlLnJlcGxhY2UoJy4nLCAiXyIpOwogICAgIGxldCBwYWNrYWdlX21hY3JvID0gaGVhZGVyLnRvX3VwcGVyY2FzZSgpOwogICAgIGxldCBjcHBfbmFtZXNwYWNlID0gcGFja2FnZS5yZXBsYWNlKCcuJywgIjo6Iik7CisgICAgZW5zdXJlIShjbGFzc19lbGVtZW50cy5sZW4oKSA+IDApOworICAgIGxldCBjb250YWluZXIgPSBjbGFzc19lbGVtZW50c1swXS5jb250YWluZXIuY2xvbmUoKTsKICAgICBlbnN1cmUhKGNvZGVnZW46OmlzX3ZhbGlkX25hbWVfaWRlbnQoJmhlYWRlcikpOwogICAgIGxldCBjb250ZXh0ID0gQ29udGV4dCB7CiAgICAgICAgIGhlYWRlcjogJmhlYWRlciwKQEAgLTU2LDYgKzU4LDcgQEAKICAgICAgICAgcmVhZHdyaXRlX2NvdW50LAogICAgICAgICBpc190ZXN0X21vZGU6IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6VGVzdCwKICAgICAgICAgY2xhc3NfZWxlbWVudHMsCisgICAgICAgIGNvbnRhaW5lciwKICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAogICAgIH07CiAKQEAgLTEwMCw2ICsxMDMsNyBAQAogICAgIHB1YiByZWFkd3JpdGVfY291bnQ6IGkzMiwKICAgICBwdWIgaXNfdGVzdF9tb2RlOiBib29sLAogICAgIHB1YiBjbGFzc19lbGVtZW50czogVmVjPENsYXNzRWxlbWVudD4sCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAogICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMKaW5kZXggMzM2MGRkZC4uZGJjNGFiNSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMKQEAgLTEsMTggKzEsMTggQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCiAKIHVzZSBhbnlob3c6OlJlc3VsdDsKIHVzZSBzZXJkZTo6U2VyaWFsaXplOwpAQCAtMjAsMjIgKzIwLDI0IEBACiB1c2Ugc3RkOjpwYXRoOjpQYXRoQnVmOwogdXNlIHRpbnl0ZW1wbGF0ZTo6VGlueVRlbXBsYXRlOwogCi11c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnfTsKLQogdXNlIGNyYXRlOjpjb2RlZ2VuOwogdXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKIHVzZSBjcmF0ZTo6Y29tbWFuZHM6Ok91dHB1dEZpbGU7Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnfTsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwogCiBwdWIgZm4gZ2VuZXJhdGVfamF2YV9jb2RlPEk+KAogICAgIHBhY2thZ2U6ICZzdHIsCiAgICAgcGFyc2VkX2ZsYWdzX2l0ZXI6IEksCiAgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAogKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+Pgogd2hlcmUKICAgICBJOiBJdGVyYXRvcjxJdGVtID0gUHJvdG9QYXJzZWRGbGFnPiwKIHsKICAgICBsZXQgZmxhZ19lbGVtZW50czogVmVjPEZsYWdFbGVtZW50PiA9Ci0gICAgICAgIHBhcnNlZF9mbGFnc19pdGVyLm1hcCh8cGZ8IGNyZWF0ZV9mbGFnX2VsZW1lbnQocGFja2FnZSwgJnBmKSkuY29sbGVjdCgpOworICAgICAgICBwYXJzZWRfZmxhZ3NfaXRlci5tYXAofHBmfCBjcmVhdGVfZmxhZ19lbGVtZW50KHBhY2thZ2UsICZwZiwgZmxhZ19pZHMuY2xvbmUoKSkpLmNvbGxlY3QoKTsKICAgICBsZXQgbmFtZXNwYWNlX2ZsYWdzID0gZ2VuX2ZsYWdzX2J5X25hbWVzcGFjZSgmZmxhZ19lbGVtZW50cyk7CiAgICAgbGV0IHByb3BlcnRpZXNfc2V0OiBCVHJlZVNldDxTdHJpbmc+ID0KICAgICAgICAgZmxhZ19lbGVtZW50cy5pdGVyKCkubWFwKHxmZXwgZm9ybWF0X3Byb3BlcnR5X25hbWUoJmZlLmRldmljZV9jb25maWdfbmFtZXNwYWNlKSkuY29sbGVjdCgpOwpAQCAtNDMsNyArNDUsNyBAQAogICAgIGxldCBsaWJyYXJ5X2V4cG9ydGVkID0gY29kZWdlbl9tb2RlID09IENvZGVnZW5Nb2RlOjpFeHBvcnRlZDsKICAgICBsZXQgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgPQogICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5hbnkofGVsZW18IGVsZW0uaXNfcmVhZF93cml0ZSkgfHwgbGlicmFyeV9leHBvcnRlZDsKLQorICAgIGxldCBjb250YWluZXIgPSAoZmxhZ19lbGVtZW50cy5maXJzdCgpLmV4cGVjdCgiemVybyB0ZW1wbGF0ZSBmbGFncyIpLmNvbnRhaW5lcikudG9fc3RyaW5nKCk7CiAgICAgbGV0IGNvbnRleHQgPSBDb250ZXh0IHsKICAgICAgICAgZmxhZ19lbGVtZW50cywKICAgICAgICAgbmFtZXNwYWNlX2ZsYWdzLApAQCAtNTIsNiArNTQsOCBAQAogICAgICAgICBwcm9wZXJ0aWVzX3NldCwKICAgICAgICAgcGFja2FnZV9uYW1lOiBwYWNrYWdlLnRvX3N0cmluZygpLAogICAgICAgICBsaWJyYXJ5X2V4cG9ydGVkLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgICAgIGNvbnRhaW5lciwKICAgICB9OwogICAgIGxldCBtdXQgdGVtcGxhdGUgPSBUaW55VGVtcGxhdGU6Om5ldygpOwogICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgiRmxhZ3MuamF2YSIsIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUiKSk/OwpAQCAtMTE3LDYgKzEyMSw4IEBACiAgICAgcHViIHByb3BlcnRpZXNfc2V0OiBCVHJlZVNldDxTdHJpbmc+LAogICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKICAgICBwdWIgbGlicmFyeV9leHBvcnRlZDogYm9vbCwKKyAgICBwdWIgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKIH0KIAogI1tkZXJpdmUoU2VyaWFsaXplLCBEZWJ1ZyldCkBAIC0xMjcsMjMgKzEzMywzMSBAQAogCiAjW2Rlcml2ZShTZXJpYWxpemUsIENsb25lLCBEZWJ1ZyldCiBzdHJ1Y3QgRmxhZ0VsZW1lbnQgeworICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKICAgICBwdWIgZGVmYXVsdF92YWx1ZTogYm9vbCwKICAgICBwdWIgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IFN0cmluZywKICAgICBwdWIgZGV2aWNlX2NvbmZpZ19mbGFnOiBTdHJpbmcsCiAgICAgcHViIGZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXg6IFN0cmluZywKKyAgICBwdWIgZmxhZ19vZmZzZXQ6IHUxNiwKICAgICBwdWIgaXNfcmVhZF93cml0ZTogYm9vbCwKICAgICBwdWIgbWV0aG9kX25hbWU6IFN0cmluZywKICAgICBwdWIgcHJvcGVydGllczogU3RyaW5nLAogfQogCi1mbiBjcmVhdGVfZmxhZ19lbGVtZW50KHBhY2thZ2U6ICZzdHIsIHBmOiAmUHJvdG9QYXJzZWRGbGFnKSAtPiBGbGFnRWxlbWVudCB7CitmbiBjcmVhdGVfZmxhZ19lbGVtZW50KAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgcGY6ICZQcm90b1BhcnNlZEZsYWcsCisgICAgZmxhZ19vZmZzZXRzOiBIYXNoTWFwPFN0cmluZywgdTE2PiwKKykgLT4gRmxhZ0VsZW1lbnQgewogICAgIGxldCBkZXZpY2VfY29uZmlnX2ZsYWcgPSBjb2RlZ2VuOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudChwYWNrYWdlLCBwZi5uYW1lKCkpCiAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpOwogICAgIEZsYWdFbGVtZW50IHsKKyAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKICAgICAgICAgZGVmYXVsdF92YWx1ZTogcGYuc3RhdGUoKSA9PSBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwKICAgICAgICAgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IHBmLm5hbWVzcGFjZSgpLnRvX3N0cmluZygpLAogICAgICAgICBkZXZpY2VfY29uZmlnX2ZsYWcsCiAgICAgICAgIGZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXg6IHBmLm5hbWUoKS50b19hc2NpaV91cHBlcmNhc2UoKSwKKyAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldHMuZ2V0KHBmLm5hbWUoKSkuZXhwZWN0KCJkaWRudCBmaW5kIHBhY2thZ2Ugb2Zmc2V0IDooIiksCiAgICAgICAgIGlzX3JlYWRfd3JpdGU6IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAogICAgICAgICBtZXRob2RfbmFtZTogZm9ybWF0X2phdmFfbWV0aG9kX25hbWUocGYubmFtZSgpKSwKICAgICAgICAgcHJvcGVydGllczogZm9ybWF0X3Byb3BlcnR5X25hbWUocGYubmFtZXNwYWNlKCkpLApAQCAtMTc5LDYgKzE5Myw3IEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKICAgICB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKIAogICAgIGNvbnN0IEVYUEVDVEVEX0ZFQVRVUkVGTEFHU19DT01NT05fQ09OVEVOVDogJnN0ciA9IHIjIgpAQCAtNDc3LDcwICs0OTIsNDAgQEAKICAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbjsKICAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CiAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwotICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0KLSAgICAgICAgICAgIGdlbmVyYXRlX2phdmFfY29kZShjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksIG1vZGUpCi0gICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgbGV0IGV4cGVjdF9mbGFnc19jb250ZW50ID0gRVhQRUNURURfRkxBR19DT01NT05fQ09OVEVOVC50b19zdHJpbmcoKQogICAgICAgICAgICAgKyByIyIKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKICAgICAgICAgfSIjOwogCi0gICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIGxldCBleHBlY3RlZF9mZWF0dXJlZmxhZ3NtcGxfY29udGVudF8wID0gciMiCiAgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OwogICAgICAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKICAgICAgICAgaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOwogICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKKyAgICAgICAgIiM7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzEgPSByIyIKICAgICAgICAgLyoqIEBoaWRlICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvdGhlcl9uYW1lc3BhY2VfaXNfY2FjaGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gb3RoZXJfbmFtZXNwYWNlX2lzX2NhY2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3ID0gZmFsc2U7CiAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUncgPSB0cnVlOwotCi0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoImFjb25maWdfdGVzdCIpOwotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbigiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBhY29uZmlnX3Rlc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc19vdGhlcl9uYW1lc3BhY2UoKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIm90aGVyX25hbWVzcGFjZSIpOwotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBvdGhlcl9uYW1lc3BhY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3RoZXJfbmFtZXNwYWNlX2lzX2NhY2hlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBleHBlY3RlZF9mZWF0dXJlZmxhZ3NtcGxfY29udGVudF8yID0gciMiCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKICAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCkBAIC02MDksOSArNTk0LDIzOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIjOworCisgICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzaW1wbF9jb250ZW50X29sZCA9IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzAudG9fb3duZWQoKQorICAgICAgICAgICAgKyBleHBlY3RlZF9mZWF0dXJlZmxhZ3NtcGxfY29udGVudF8xCisgICAgICAgICAgICArIHIjIgorICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygiYWNvbmZpZ190ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUlcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIGFjb25maWdfdGVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZpeGVkIHJlYWQtb25seSBmbGFnIGJ5IGFkZGluZyBpc19maXhlZF9yZWFkX29ubHk6IHRydWUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygib3RoZXJfbmFtZXNwYWNlIik7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2Ugb3RoZXJfbmFtZXNwYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZyb20gRGV2aWNlQ29uZmlnLiBJdCBjb3VsZCBiZSB0aGF0IHRoZSBjb2RlIHVzaW5nIGZsYWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJmbGFnIGRlY2xhcmF0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG90aGVyX25hbWVzcGFjZV9pc19jYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfSIjCisgICAgICAgICAgICArIGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzI7CisKICAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWwogICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50LmFzX3N0cigpKSwKLSAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsIGV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnQpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICAmZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudF9vbGQsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzLmphdmEiLCBFWFBFQ1RFRF9GRUFUVVJFRkxBR1NfQ09NTU9OX0NPTlRFTlQpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0NVU1RPTUZFQVRVUkVGTEFHU19DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0ZBS0VGRUFUVVJFRkxBR1NJTVBMX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICBdKTsKKworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWRfZmlsZXMgeworICAgICAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuY29udGFpbnNfa2V5KGZpbGVfcGF0aCksICJDYW5ub3QgZmluZCB7fSIsIGZpbGVfcGF0aCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQuZ2V0KGZpbGVfcGF0aCkudW53cmFwKCksCisgICAgICAgICAgICAgICAgICAgICZTdHJpbmc6OmZyb21fdXRmOChmaWxlLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIkZpbGUge30gY29udGVudCBpcyBub3QgY29ycmVjdCIsCisgICAgICAgICAgICAgICAgZmlsZV9wYXRoCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmlsZV9zZXQucmVtb3ZlKGZpbGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmlzX2VtcHR5KCkpOworCisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uOworICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnRfbmV3ID0gZXhwZWN0ZWRfZmVhdHVyZWZsYWdzbXBsX2NvbnRlbnRfMC50b19vd25lZCgpCisgICAgICAgICAgICArIHIjIgorICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VJbnRlcm5hbFJlYWRlcjsKKyAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworICAgICAgICAgICAgIiMKKyAgICAgICAgICAgICsgZXhwZWN0ZWRfZmVhdHVyZWZsYWdzbXBsX2NvbnRlbnRfMQorICAgICAgICAgICAgKyByIyIKKyAgICAgICAgU3RvcmFnZUludGVybmFsUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgYm9vbGVhbiByZWFkRnJvbU5ld1N0b3JhZ2U7CisKKyAgICAgICAgYm9vbGVhbiB1c2VOZXdTdG9yYWdlVmFsdWVBbmREaXNjYXJkT2xkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJBY29uZmlnSmF2YUNvZGVnZW4iOworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VDQ0VTU19MT0cgPSAic3VjY2VzczogJXMgdmFsdWUgbWF0Y2hlcyI7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNSVNNQVRDSF9MT0cgPSAiZXJyb3I6ICVzIHZhbHVlIG1pc21hdGNoLCBuZXcgc3RvcmFnZSB2YWx1ZSBpcyAlcywgb2xkIHN0b3JhZ2UgdmFsdWUgaXMgJXMiOworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVJST1JfTE9HID0gImVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlIjsKKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgaWYgKERldmljZUNvbmZpZy5nZXRCb29sZWFuKCJjb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLCAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnN0b3JhZ2VfdGVzdF9taXNzaW9uXzEiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICByZWFkRnJvbU5ld1N0b3JhZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoInN5c3RlbSIsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNlTmV3U3RvcmFnZVZhbHVlQW5kRGlzY2FyZE9sZCA9CisgICAgICAgICAgICAgICAgRGV2aWNlQ29uZmlnLmdldEJvb2xlYW4oImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoImFjb25maWdfdGVzdCIpOworICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPQorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SVywgZmFsc2UpOworICAgICAgICAgICAgICAgIGRpc2FibGVkUndFeHBvcnRlZCA9CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZW5hYmxlZFJ3ID0KKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgdHJ1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBhY29uZmlnX3Rlc3QgIgorICAgICAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgaWYgKHJlYWRGcm9tTmV3U3RvcmFnZSAmJiByZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IGRpc2FibGVkUncpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChTVUNDRVNTX0xPRywgImRpc2FibGVkUnciKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoTUlTTUFUQ0hfTE9HLCAiZGlzYWJsZWRSdyIsIHZhbCwgZGlzYWJsZWRSdykpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBkaXNhYmxlZFJ3RXhwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChTVUNDRVNTX0xPRywgImRpc2FibGVkUndFeHBvcnRlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChNSVNNQVRDSF9MT0csICJkaXNhYmxlZFJ3RXhwb3J0ZWQiLCB2YWwsIGRpc2FibGVkUndFeHBvcnRlZCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndFeHBvcnRlZCA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IGVuYWJsZWRSdykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KFNVQ0NFU1NfTE9HLCAiZW5hYmxlZFJ3IikpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KE1JU01BVENIX0xPRywgImVuYWJsZWRSdyIsIHZhbCwgZW5hYmxlZFJ3KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodXNlTmV3U3RvcmFnZVZhbHVlQW5kRGlzY2FyZE9sZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFJ3ID0gdmFsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEVSUk9SX0xPRywgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIm90aGVyX25hbWVzcGFjZSIpOworICAgICAgICAgICAgICAgIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBvdGhlcl9uYW1lc3BhY2UgIgorICAgICAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVyX25hbWVzcGFjZV9pc19jYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgaWYgKHJlYWRGcm9tTmV3U3RvcmFnZSAmJiByZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDMpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoU1VDQ0VTU19MT0csICJkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChNSVNNQVRDSF9MT0csICJkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSIsIHZhbCwgZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VOZXdTdG9yYWdlVmFsdWVBbmREaXNjYXJkT2xkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBFUlJPUl9MT0csIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSIjICsgZXhwZWN0ZWRfZmVhdHVyZWZsYWdzbXBsX2NvbnRlbnRfMjsKKworICAgICAgICBsZXQgbXV0IGZpbGVfc2V0ID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GbGFncy5qYXZhIiwgZXhwZWN0X2ZsYWdzX2NvbnRlbnQuYXNfc3RyKCkpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICAmZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudF9uZXcsCisgICAgICAgICAgICApLAogICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzLmphdmEiLCBFWFBFQ1RFRF9GRUFUVVJFRkxBR1NfQ09NTU9OX0NPTlRFTlQpLAogICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLApAQCAtNjQ3LDkgKzg2MSwxNiBAQAogICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpFeHBvcnRlZDsKICAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CiAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwotICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0KLSAgICAgICAgICAgIGdlbmVyYXRlX2phdmFfY29kZShjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksIG1vZGUpCi0gICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOwogCiAgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgogICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKQEAgLTY5MCw3ICs5MTEsNyBAQAogICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKICAgICAgICAgLyoqIEBoaWRlICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gZmFsc2U7CiAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0gZmFsc2U7CiAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkID0gZmFsc2U7CkBAIC03MDAsMTEgKzkyMSwxMSBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJhY29uZmlnX3Rlc3QiKTsKICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbigiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUldfRVhQT1JURUQsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBlbmFibGVkUm9FeHBvcnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2UgYWNvbmZpZ190ZXN0ICIKQEAgLTgzMyw5ICsxMDU0LDE2IEBACiAgICAgICAgIGxldCBtb2RlID0gQ29kZWdlbk1vZGU6OlRlc3Q7CiAgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQogICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9Ci0gICAgICAgICAgICBnZW5lcmF0ZV9qYXZhX2NvZGUoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLCBtb2RlKQotICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKIAogICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSBFWFBFQ1RFRF9GTEFHX0NPTU1PTl9DT05URU5ULnRvX3N0cmluZygpCiAgICAgICAgICAgICArIHIjIgpAQCAtODUwLDY5ICsxMDc4LDU4IEBACiAgICAgICAgICIjOwogICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCA9IHIjIgogICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKLSAgICAgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCi0gICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CiAgICAgICAgIC8qKiBAaGlkZSAqLwogICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3KCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgotICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvKCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CkBAIC05NTgsOSArMTE3NSwxNiBAQAogICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5OwogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPQotICAgICAgICAgICAgZ2VuZXJhdGVfamF2YV9jb2RlKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwgbW9kZSkKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CiAgICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzX2NvbnRlbnQgPSByIyIKICAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CiAgICAgICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL3J1c3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycwppbmRleCAzM2MzZDM3Li42ZjNmN2JmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycwpAQCAtMjAsMjYgKzIwLDM0IEBACiAKIHVzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlLCBQcm90b1BhcnNlZEZsYWd9OwogCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKKwogdXNlIGNyYXRlOjpjb2RlZ2VuOwogdXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKIHVzZSBjcmF0ZTo6Y29tbWFuZHM6Ok91dHB1dEZpbGU7CiAKIHB1YiBmbiBnZW5lcmF0ZV9ydXN0X2NvZGU8ST4oCiAgICAgcGFja2FnZTogJnN0ciwKKyAgICBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCiAgICAgcGFyc2VkX2ZsYWdzX2l0ZXI6IEksCiAgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiApIC0+IFJlc3VsdDxPdXRwdXRGaWxlPgogd2hlcmUKICAgICBJOiBJdGVyYXRvcjxJdGVtID0gUHJvdG9QYXJzZWRGbGFnPiwKIHsKLSAgICBsZXQgdGVtcGxhdGVfZmxhZ3M6IFZlYzxUZW1wbGF0ZVBhcnNlZEZsYWc+ID0KLSAgICAgICAgcGFyc2VkX2ZsYWdzX2l0ZXIubWFwKHxwZnwgVGVtcGxhdGVQYXJzZWRGbGFnOjpuZXcocGFja2FnZSwgJnBmKSkuY29sbGVjdCgpOworICAgIGxldCB0ZW1wbGF0ZV9mbGFnczogVmVjPFRlbXBsYXRlUGFyc2VkRmxhZz4gPSBwYXJzZWRfZmxhZ3NfaXRlcgorICAgICAgICAubWFwKHxwZnwgVGVtcGxhdGVQYXJzZWRGbGFnOjpuZXcocGFja2FnZSwgZmxhZ19pZHMuY2xvbmUoKSwgJnBmKSkKKyAgICAgICAgLmNvbGxlY3QoKTsKICAgICBsZXQgaGFzX3JlYWR3cml0ZSA9IHRlbXBsYXRlX2ZsYWdzLml0ZXIoKS5hbnkofGl0ZW18IGl0ZW0ucmVhZHdyaXRlKTsKKyAgICBsZXQgY29udGFpbmVyID0gKHRlbXBsYXRlX2ZsYWdzLmZpcnN0KCkuZXhwZWN0KCJ6ZXJvIHRlbXBsYXRlIGZsYWdzIikuY29udGFpbmVyKS50b19zdHJpbmcoKTsKICAgICBsZXQgY29udGV4dCA9IFRlbXBsYXRlQ29udGV4dCB7CiAgICAgICAgIHBhY2thZ2U6IHBhY2thZ2UudG9fc3RyaW5nKCksCiAgICAgICAgIHRlbXBsYXRlX2ZsYWdzLAogICAgICAgICBtb2R1bGVzOiBwYWNrYWdlLnNwbGl0KCcuJykubWFwKHxzfCBzLnRvX3N0cmluZygpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLAogICAgICAgICBoYXNfcmVhZHdyaXRlLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgICAgIGNvbnRhaW5lciwKICAgICB9OwogICAgIGxldCBtdXQgdGVtcGxhdGUgPSBUaW55VGVtcGxhdGU6Om5ldygpOwogICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgKQEAgLTYyLDYgKzcwLDggQEAKICAgICBwdWIgdGVtcGxhdGVfZmxhZ3M6IFZlYzxUZW1wbGF0ZVBhcnNlZEZsYWc+LAogICAgIHB1YiBtb2R1bGVzOiBWZWM8U3RyaW5nPiwKICAgICBwdWIgaGFzX3JlYWR3cml0ZTogYm9vbCwKKyAgICBwdWIgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKIH0KIAogI1tkZXJpdmUoU2VyaWFsaXplKV0KQEAgLTY5LDI1ICs3OSwyOCBAQAogICAgIHB1YiByZWFkd3JpdGU6IGJvb2wsCiAgICAgcHViIGRlZmF1bHRfdmFsdWU6IFN0cmluZywKICAgICBwdWIgbmFtZTogU3RyaW5nLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKKyAgICBwdWIgZmxhZ19vZmZzZXQ6IHUxNiwKICAgICBwdWIgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IFN0cmluZywKICAgICBwdWIgZGV2aWNlX2NvbmZpZ19mbGFnOiBTdHJpbmcsCiB9CiAKIGltcGwgVGVtcGxhdGVQYXJzZWRGbGFnIHsKICAgICAjW2FsbG93KGNsaXBweTo6bm9ubWluaW1hbF9ib29sKV0KLSAgICBmbiBuZXcocGFja2FnZTogJnN0ciwgcGY6ICZQcm90b1BhcnNlZEZsYWcpIC0+IFNlbGYgewotICAgICAgICBsZXQgdGVtcGxhdGUgPSBUZW1wbGF0ZVBhcnNlZEZsYWcgeworICAgIGZuIG5ldyhwYWNrYWdlOiAmc3RyLCBmbGFnX29mZnNldHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LCBwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gU2VsZiB7CisgICAgICAgIFNlbGYgewogICAgICAgICAgICAgcmVhZHdyaXRlOiBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IG1hdGNoIHBmLnN0YXRlKCkgewogICAgICAgICAgICAgICAgIFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEID0+ICJ0cnVlIi50b19zdHJpbmcoKSwKICAgICAgICAgICAgICAgICBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQgPT4gImZhbHNlIi50b19zdHJpbmcoKSwKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBuYW1lOiBwZi5uYW1lKCkudG9fc3RyaW5nKCksCisgICAgICAgICAgICBjb250YWluZXI6IHBmLmNvbnRhaW5lcigpLnRvX3N0cmluZygpLAorICAgICAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldHMuZ2V0KHBmLm5hbWUoKSkuZXhwZWN0KCJkaWRudCBmaW5kIHBhY2thZ2Ugb2Zmc2V0IDooIiksCiAgICAgICAgICAgICBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogcGYubmFtZXNwYWNlKCkudG9fc3RyaW5nKCksCiAgICAgICAgICAgICBkZXZpY2VfY29uZmlnX2ZsYWc6IGNvZGVnZW46OmNyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KHBhY2thZ2UsIHBmLm5hbWUoKSkKICAgICAgICAgICAgICAgICAuZXhwZWN0KCJ2YWx1ZXMgY2hlY2tlZCBhdCBmbGFnIHBhcnNlIHRpbWUiKSwKLSAgICAgICAgfTsKLSAgICAgICAgdGVtcGxhdGUKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtOTcsMzYgKzExMCw0MiBAQAogCiAgICAgY29uc3QgUFJPRF9FWFBFQ1RFRDogJnN0ciA9IHIjIgogLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6e01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKK3VzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2Ugc3RkOjpzeW5jOjpMYXp5TG9jazsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKIAogLy8vIGZsYWcgcHJvdmlkZXIKIHB1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOwogCi1sYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWMhIHsKICAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcncKLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9ydzogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9ydzogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCiAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAotICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CiAKICAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfZXhwb3J0ZWQKLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCiAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAotICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CiAKICAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCi0gICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlOiBib29sID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICBzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICJhY29uZmlnX2ZsYWdzLm90aGVyX25hbWVzcGFjZSIsCiAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIpOwogCiAgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGVuYWJsZWRfcncKLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9lbmFibGVkX3J3OiBib29sID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICBzdGF0aWMgQ0FDSEVEX2VuYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAogICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAotICAgICAgICAidHJ1ZSIpID09ICJ0cnVlIjsKLQotfQorICAgICAgICAidHJ1ZSIpID09ICJ0cnVlIik7CiAKIGltcGwgRmxhZ1Byb3ZpZGVyIHsKICAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybwpAQCAtMjMzLDYgKzI1Miw2OTIgQEAKIH0KICIjOwogCisgICAgY29uc3QgUFJPRF9JTlNUUlVNRU5URURfRVhQRUNURUQ6ICZzdHIgPSByIyIKKy8vISBjb2RlZ2VuZXJhdGVkIHJ1c3QgZmxhZyBsaWIKK3VzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07Cit1c2Ugc3RkOjpwYXRoOjpQYXRoOwordXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7Cit1c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OworCitzdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQorICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7CitzdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKKworc3RhdGljIFBBQ0tBR0VfT0ZGU0VUOiBMYXp5TG9jazxSZXN1bHQ8T3B0aW9uPHUzMj4sIEFjb25maWdTdG9yYWdlRXJyb3I+PiA9IExhenlMb2NrOjpuZXcofHwgdW5zYWZlIHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKQorICAgIC5hbmRfdGhlbih8cGFja2FnZV9tYXB8IGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKKyAgICAubWFwKHxjb250ZXh0fCBjb250ZXh0Lm1hcCh8Y3wgYy5ib29sZWFuX3N0YXJ0X2luZGV4KSkKK30pOworCitzdGF0aWMgRkxBR19WQUxfTUFQOiBMYXp5TG9jazxSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgeworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpCit9KTsKKworLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3CitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgeworICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworCisgICAgbGV0IHVzZV9uZXdfc3RvcmFnZV92YWx1ZSA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICJhY29uZmlnX2ZsYWdzLmNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsCisgICAgICAgICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworCisgICAgaWYgUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7CisgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICAgICAgbG9nZ2VyOjppbml0KAorICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CisKKyAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCisgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycigibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSAnY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0JyIudG9fc3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgbWF0Y2ggYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgaWYgc3RvcmFnZV9yZXN1bHQgPT0gcmVzdWx0ID0+IHsKKyAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAnZGlzYWJsZWRfcncnLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7c3RvcmFnZV9yZXN1bHR9Iik7CisgICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfcmVzdWx0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmljISgiZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZToge2Vycn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQKK30pOworCisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfZXhwb3J0ZWQKK3N0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCB7CisgICAgbGV0IHJlc3VsdCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKKyAgICBsZXQgdXNlX25ld19zdG9yYWdlX3ZhbHVlID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy51c2VfbmV3X3N0b3JhZ2VfdmFsdWUiLAorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKKyAgICBpZiBQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICBsZXQgYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICdjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QnIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSBpZiBzdG9yYWdlX3Jlc3VsdCA9PSByZXN1bHQgPT4geworICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3Jlc3VsdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IG1pc21hdGNoIGZvciBmbGFnICdkaXNhYmxlZF9yd19leHBvcnRlZCcuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdAorfSk7CisKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKK3N0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgeworICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKworICAgIGxldCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAorICAgICAgICAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnVzZV9uZXdfc3RvcmFnZV92YWx1ZSIsCisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKworICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgeworICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQorICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgIGxldCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0ID0gRkxBR19WQUxfTUFQCisgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKKyAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ2NvbS5hbmRyb2lkLmFjb25maWcudGVzdCciLnRvX3N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgeworICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiB7CisgICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfcmVzdWx0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZScuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdAorfSk7CisKKworLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGVuYWJsZWRfcncKK3N0YXRpYyBDQUNIRURfZW5hYmxlZF9ydzogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKKyAgICBsZXQgcmVzdWx0ID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgInRydWUiKSA9PSAidHJ1ZSI7CisKKyAgICBsZXQgdXNlX25ld19zdG9yYWdlX3ZhbHVlID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy51c2VfbmV3X3N0b3JhZ2VfdmFsdWUiLAorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKKyAgICBpZiBQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICBsZXQgYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICdjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QnIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSBpZiBzdG9yYWdlX3Jlc3VsdCA9PSByZXN1bHQgPT4geworICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3Jlc3VsdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IG1pc21hdGNoIGZvciBmbGFnICdlbmFibGVkX3J3Jy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOworICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3Jlc3VsdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgeworICAgICAgICAgICAgICAgICAgICBwYW5pYyEoImZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0Cit9KTsKKworaW1wbCBGbGFnUHJvdmlkZXIgeworCisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworICAgIHB1YiBmbiBkaXNhYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIGZhbHNlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKKyAgICBwdWIgZm4gZGlzYWJsZWRfcncoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICAqQ0FDSEVEX2Rpc2FibGVkX3J3CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICAqQ0FDSEVEX2Rpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisgICAgcHViIGZuIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBlbmFibGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyAgICBwdWIgZm4gZW5hYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZW5hYmxlZF9ydworICAgIH0KKworCit9CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RhdGljIFBST1ZJREVSOiBGbGFnUHJvdmlkZXIgPSBGbGFnUHJvdmlkZXI7CisKKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcm8oKSAtPiBib29sIHsKKworCisgICAgbGV0IHJlc3VsdCA9IGZhbHNlOworICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAorICAgIC8vIGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAorICAgICk7CisKKyAgICB1bnNhZmUgeworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7CisgICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7CisgICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAorICAgICAgICAgICAgT2soTm9uZSkgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgeworICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdkaXNhYmxlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCAwICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgeworICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZGlzYWJsZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdkaXNhYmxlZF9ybycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQKKworfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9ydygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmRpc2FibGVkX3J3KCkKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5kaXNhYmxlZF9yd19leHBvcnRlZCgpCit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oKSAtPiBib29sIHsKKworCisgICAgbGV0IHJlc3VsdCA9IHRydWU7CisgICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0CisgICAgLy8gYXJlIG5vb3BzLgorICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbyksCisgICAgKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIHsKKyAgICAgICAgICAgIE9rKGZpbGUpID0+IGZpbGUsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcGFja2FnZV9yZWFkX2NvbnRleHQgPSBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikgeworICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKKyAgICAgICAgICAgIE9rKE5vbmUpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCBmbGFnX3ZhbF9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSB7CisgICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgNCArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIHsKKyAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdlbmFibGVkX2ZpeGVkX3JvJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0CisKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7CisKKworICAgIGxldCByZXN1bHQgPSB0cnVlOworICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAorICAgIC8vIGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAorICAgICk7CisKKyAgICB1bnNhZmUgeworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7CisgICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKKyAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCisgICAgICAgICAgICBPayhOb25lKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgeworICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDUgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7CisgICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7CisgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCcuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdAorCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ybygpIC0+IGJvb2wgeworCisKKyAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKKyAgICBpZiAhUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKKyAgICAvLyBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQorICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKKyAgICApOworCisgICAgdW5zYWZlIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkgeworICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7CisgICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAorICAgICAgICAgICAgT2soTm9uZSkgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIHsKKyAgICAgICAgICAgIE9rKHZhbF9tYXApID0+IHZhbF9tYXAsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCA2ICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgeworICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpZiByZXN1bHQgIT0gdmFsdWUgeworICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ2VuYWJsZWRfcm8nLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQKKworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKKworCisgICAgbGV0IHJlc3VsdCA9IHRydWU7CisgICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0CisgICAgLy8gYXJlIG5vb3BzLgorICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbyksCisgICAgKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIHsKKyAgICAgICAgICAgIE9rKGZpbGUpID0+IGZpbGUsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcGFja2FnZV9yZWFkX2NvbnRleHQgPSBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikgeworICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKKyAgICAgICAgICAgIE9rKE5vbmUpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCBmbGFnX3ZhbF9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSB7CisgICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgNyArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIHsKKyAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdlbmFibGVkX3JvX2V4cG9ydGVkJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0CisKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX3J3KCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZW5hYmxlZF9ydygpCit9CisiIzsKKwogICAgIGNvbnN0IFRFU1RfRVhQRUNURUQ6ICZzdHIgPSByIyIKIC8vISBjb2RlZ2VuZXJhdGVkIHJ1c3QgZmxhZyBsaWIKIApAQCAtNDkyLDMwICsxMTk3LDM2IEBACiAKICAgICBjb25zdCBFWFBPUlRFRF9FWFBFQ1RFRDogJnN0ciA9IHIjIgogLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6e01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKK3VzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2Ugc3RkOjpzeW5jOjpMYXp5TG9jazsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKIAogLy8vIGZsYWcgcHJvdmlkZXIKIHB1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOwogCi1sYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWMhIHsKICAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfZXhwb3J0ZWQKLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCiAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAotICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CiAKICAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAotICAgIHN0YXRpYyByZWYgQ0FDSEVEX2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgIHN0YXRpYyBDQUNIRURfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCiAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKIAogICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3JvX2V4cG9ydGVkCi0gICAgc3RhdGljIHJlZiBDQUNIRURfZW5hYmxlZF9yb19leHBvcnRlZDogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgc3RhdGljIENBQ0hFRF9lbmFibGVkX3JvX2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOwotCi19CisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CiAKIGltcGwgRmxhZ1Byb3ZpZGVyIHsKICAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZApAQCAtNTU4LDYgKzEyNjksMTUgQEAKIAogICAgIGNvbnN0IEZPUkNFX1JFQURfT05MWV9FWFBFQ1RFRDogJnN0ciA9IHIjIgogLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6e01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKK3VzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2Ugc3RkOjpzeW5jOjpMYXp5TG9jazsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKIAogLy8vIGZsYWcgcHJvdmlkZXIKIHB1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOwpAQCAtNjMzLDI0ICsxMzUzLDI3IEBACiAgICAgdHJ1ZQogfQogIiM7CisgICAgdXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOwogCi0gICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUobW9kZTogQ29kZWdlbk1vZGUpIHsKKyAgICBmbiB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShtb2RlOiBDb2RlZ2VuTW9kZSwgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLCBleHBlY3RlZDogJnN0cikgewogICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKICAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CiAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwotICAgICAgICBsZXQgZ2VuZXJhdGVkID0KLSAgICAgICAgICAgIGdlbmVyYXRlX3J1c3RfY29kZShjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksIG1vZGUpCi0gICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkID0gZ2VuZXJhdGVfcnVzdF9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CiAgICAgICAgIGFzc2VydF9lcSEoInNyYy9saWIucnMiLCBmb3JtYXQhKCJ7fSIsIGdlbmVyYXRlZC5wYXRoLmRpc3BsYXkoKSkpOwogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCi0gICAgICAgICAgICAgICAgbWF0Y2ggbW9kZSB7Ci0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uID0+IFBST0RfRVhQRUNURUQsCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpUZXN0ID0+IFRFU1RfRVhQRUNURUQsCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpFeHBvcnRlZCA9PiBFWFBPUlRFRF9FWFBFQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHkgPT4gRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVELAotICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgJlN0cmluZzo6ZnJvbV91dGY4KGdlbmVyYXRlZC5jb250ZW50cykudW53cmFwKCkKICAgICAgICAgICAgICkKICAgICAgICAgKTsKQEAgLTY1OCwyMSArMTM4MSwyNiBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9wcm9kKCkgewotICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbik7CisgICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uLCBmYWxzZSwgUFJPRF9FWFBFQ1RFRCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9wcm9kX2luc3RydW1lbnRlZCgpIHsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24sIHRydWUsIFBST0RfSU5TVFJVTUVOVEVEX0VYUEVDVEVEKTsKICAgICB9CiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX3Rlc3QoKSB7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpUZXN0KTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OlRlc3QsIGZhbHNlLCBURVNUX0VYUEVDVEVEKTsKICAgICB9CiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX2V4cG9ydGVkKCkgewotICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQsIGZhbHNlLCBFWFBPUlRFRF9FWFBFQ1RFRCk7CiAgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9mb3JjZV9yZWFkX29ubHkoKSB7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5KTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHksIGZhbHNlLCBGT1JDRV9SRUFEX09OTFlfRVhQRUNURUQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvbW1hbmRzLnJzCmluZGV4IDY5NDVmZDQuLjFhMTRmNjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpAQCAtMTcsNyArMTcsOCBAQAogdXNlIGFueWhvdzo6e2JhaWwsIGVuc3VyZSwgQ29udGV4dCwgUmVzdWx0fTsKIHVzZSBpdGVydG9vbHM6Okl0ZXJ0b29sczsKIHVzZSBwcm90b2J1Zjo6TWVzc2FnZTsKLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgSGFzaE1hcH07Cit1c2Ugc3RkOjpoYXNoOjpIYXNoZXI7CiB1c2Ugc3RkOjppbzo6UmVhZDsKIHVzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7CiAKQEAgLTMxLDYgKzMyLDcgQEAKICAgICBQYXJzZWRGbGFnRXh0LCBQcm90b0ZsYWdNZXRhZGF0YSwgUHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvUGFyc2VkRmxhZywKICAgICBQcm90b1BhcnNlZEZsYWdzLCBQcm90b1RyYWNlcG9pbnQsCiB9OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpzaXBfaGFzaGVyMTM6OlNpcEhhc2hlcjEzOwogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpTdG9yYWdlRmlsZVR5cGU7CiAKIHB1YiBzdHJ1Y3QgSW5wdXQgewpAQCAtMTkxLDE1ICsxOTMsMjUgQEAKICAgICBPayhvdXRwdXQpCiB9CiAKLXB1YiBmbiBjcmVhdGVfamF2YV9saWIobXV0IGlucHV0OiBJbnB1dCwgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSkgLT4gUmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4geworcHViIGZuIGNyZWF0ZV9qYXZhX2xpYigKKyAgICBtdXQgaW5wdXQ6IElucHV0LAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+PiB7CiAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0gbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgY29kZWdlbl9tb2RlKT87CiAgICAgbGV0IFNvbWUocGFja2FnZSkgPSBmaW5kX3VuaXF1ZV9wYWNrYWdlKCZtb2RpZmllZF9wYXJzZWRfZmxhZ3MpIGVsc2UgewogICAgICAgICBiYWlsISgibm8gcGFyc2VkIGZsYWdzLCBvciB0aGUgcGFyc2VkIGZsYWdzIHVzZSBkaWZmZXJlbnQgcGFja2FnZXMiKTsKICAgICB9OwogICAgIGxldCBwYWNrYWdlID0gcGFja2FnZS50b19zdHJpbmcoKTsKLSAgICBsZXQgX2ZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKT87Ci0gICAgZ2VuZXJhdGVfamF2YV9jb2RlKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksIGNvZGVnZW5fbW9kZSkKKyAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKKyAgICBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICZwYWNrYWdlLAorICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgIGNvZGVnZW5fbW9kZSwKKyAgICAgICAgZmxhZ19pZHMsCisgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICApCiB9CiAKIHB1YiBmbiBjcmVhdGVfY3BwX2xpYigKQEAgLTIyOCw3ICsyNDAsMTEgQEAKICAgICApCiB9CiAKLXB1YiBmbiBjcmVhdGVfcnVzdF9saWIobXV0IGlucHV0OiBJbnB1dCwgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSkgLT4gUmVzdWx0PE91dHB1dEZpbGU+IHsKK3B1YiBmbiBjcmVhdGVfcnVzdF9saWIoCisgICAgbXV0IGlucHV0OiBJbnB1dCwKKyAgICBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlLAorICAgIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKKykgLT4gUmVzdWx0PE91dHB1dEZpbGU+IHsKICAgICAvLyAvLyBUT0RPKDMyNzQyMDY3OSk6IEVuYWJsZSBleHBvcnQgbW9kZSBmb3IgbmF0aXZlIGZsYWcgbGlicmFyeQogICAgIGVuc3VyZSEoCiAgICAgICAgIGNvZGVnZW5fbW9kZSAhPSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQsCkBAIC0yNDAsOCArMjU2LDE0IEBACiAgICAgICAgIGJhaWwhKCJubyBwYXJzZWQgZmxhZ3MsIG9yIHRoZSBwYXJzZWQgZmxhZ3MgdXNlIGRpZmZlcmVudCBwYWNrYWdlcyIpOwogICAgIH07CiAgICAgbGV0IHBhY2thZ2UgPSBwYWNrYWdlLnRvX3N0cmluZygpOwotICAgIGxldCBfZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKLSAgICBnZW5lcmF0ZV9ydXN0X2NvZGUoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwgY29kZWdlbl9tb2RlKQorICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcygmcGFja2FnZSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSk/OworICAgIGdlbmVyYXRlX3J1c3RfY29kZSgKKyAgICAgICAgJnBhY2thZ2UsCisgICAgICAgIGZsYWdfaWRzLAorICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgIGNvZGVnZW5fbW9kZSwKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICkKIH0KIAogcHViIGZuIGNyZWF0ZV9zdG9yYWdlKApAQCAtMzkwLDEyICs0MTIsNDMgQEAKICAgICBPayhmbGFnX2lkcykKIH0KIAorI1thbGxvdyhkZWFkX2NvZGUpXSAvLyBUT0RPOiBiLzMxNjM1NzY4NiAtIFVzZSBmaW5nZXJwcmludCBpbiBjb2RlZ2VuIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3QgaGFyZGNvZGVkIG9mZnNldCByZWFkcy4KK3B1YiBmbiBjb21wdXRlX2ZsYWdfb2Zmc2V0c19maW5nZXJwcmludChmbGFnc19tYXA6ICZIYXNoTWFwPFN0cmluZywgdTE2PikgLT4gUmVzdWx0PHU2ND4geworICAgIGxldCBtdXQgaGFzaGVyID0gU2lwSGFzaGVyMTM6Om5ldygpOworCisgICAgLy8gTmVlZCB0byBzb3J0IHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBhZGRlZCB0byB0aGUgaGFzaGVyIGluIHRoZSBzYW1lIG9yZGVyCisgICAgLy8gZWFjaCBydW4uCisgICAgbGV0IHNvcnRlZF9tYXA6IEJUcmVlTWFwPCZTdHJpbmcsICZ1MTY+ID0gZmxhZ3NfbWFwLml0ZXIoKS5jb2xsZWN0KCk7CisKKyAgICBmb3IgKGZsYWcsIG9mZnNldCkgaW4gc29ydGVkX21hcCB7CisgICAgICAgIC8vIFNlZSBodHRwczovL2RvY3MucnMvc2lwaGFzaGVyL2xhdGVzdC9zaXBoYXNoZXIvI25vdGUgZm9yIHVzZSBvZiB3cml0ZQorICAgICAgICAvLyBvdmVyIHdyaXRlX2kxNi4gU2ltaWxhcmx5LCB1c2UgdG9fYmVfYnl0ZXMgcmF0aGVyIHRoYW4gdG9fbmVfYnl0ZXMgdG8KKyAgICAgICAgLy8gZW5zdXJlIGNvbnNpc3RlbmN5LgorICAgICAgICBoYXNoZXIud3JpdGUoZmxhZy5hc19ieXRlcygpKTsKKyAgICAgICAgaGFzaGVyLndyaXRlKCZvZmZzZXQudG9fYmVfYnl0ZXMoKSk7CisgICAgfQorICAgIE9rKGhhc2hlci5maW5pc2goKSkKK30KKwogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1B1cnBvc2U7CiAKICAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9vZmZzZXRfZmluZ2VycHJpbnQoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZSA9IGZpbmRfdW5pcXVlX3BhY2thZ2UoJnBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZykudW53cmFwKCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcygmcGFja2FnZSwgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9maW5nZXJwcmludCA9IDEwNzA5ODkyNDgxMDAyMjUyMTMydTY0OworCisgICAgICAgIGxldCBoYXNoX3Jlc3VsdCA9IGNvbXB1dGVfZmxhZ19vZmZzZXRzX2ZpbmdlcnByaW50KCZmbGFnX2lkcyk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShoYXNoX3Jlc3VsdC51bndyYXAoKSwgZXhwZWN0ZWRfZmluZ2VycHJpbnQpOworICAgIH0KKworICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X3BhcnNlX2ZsYWdzKCkgewogICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsgLy8gY2FsbHMgcGFyc2VfZmxhZ3MKICAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dmVyaWZ5X2ZpZWxkcygmcGFyc2VkX2ZsYWdzKS51bndyYXAoKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycwppbmRleCA3MmJlMWM5Li4xZmI2NGY5IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL21haW4ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzCkBAIC03Miw2ICs3MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoIm1vZGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihFbnVtVmFsdWVQYXJzZXI6OjxDb2RlZ2VuTW9kZT46Om5ldygpKQogICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoInByb2R1Y3Rpb24iKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAogICAgICAgICAgICAgICAgICksCiAgICAgICAgICkKICAgICAgICAgLnN1YmNvbW1hbmQoCkBAIC05Niw2ICsxMDIsMTIgQEAKICAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikucmVxdWlyZWQodHJ1ZSkpCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikucmVxdWlyZWQodHJ1ZSkpCiAgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAogICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibW9kZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibW9kZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKEVudW1WYWx1ZVBhcnNlcjo6PENvZGVnZW5Nb2RlPjo6bmV3KCkpCkBAIC0yMzcsOCArMjQ5LDEwIEBACiAgICAgICAgIFNvbWUoKCJjcmVhdGUtamF2YS1saWIiLCBzdWJfbWF0Y2hlcykpID0+IHsKICAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKICAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87Ci0gICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0KLSAgICAgICAgICAgICAgICBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKGNhY2hlLCAqbW9kZSkuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBqYXZhIGxpYiIpPzsKKyAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQorICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBqYXZhIGxpYiIpPzsKICAgICAgICAgICAgIGxldCBkaXIgPSBQYXRoQnVmOjpmcm9tKGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/KTsKICAgICAgICAgICAgIGdlbmVyYXRlZF9maWxlcwogICAgICAgICAgICAgICAgIC5pdGVyKCkKQEAgLTI1OSw4ICsyNzMsMTAgQEAKICAgICAgICAgU29tZSgoImNyZWF0ZS1ydXN0LWxpYiIsIHN1Yl9tYXRjaGVzKSkgPT4gewogICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OwogICAgICAgICAgICAgbGV0IG1vZGUgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Q29kZWdlbk1vZGU+KHN1Yl9tYXRjaGVzLCAibW9kZSIpPzsKLSAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZSA9Ci0gICAgICAgICAgICAgICAgY29tbWFuZHM6OmNyZWF0ZV9ydXN0X2xpYihjYWNoZSwgKm1vZGUpLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgcnVzdCBsaWIiKT87CisgICAgICAgICAgICBsZXQgYWxsb3dfaW5zdHJ1bWVudGF0aW9uID0KKyAgICAgICAgICAgICAgICBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1pbnN0cnVtZW50YXRpb24iKT87CisgICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGUgPSBjb21tYW5kczo6Y3JlYXRlX3J1c3RfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBydXN0IGxpYiIpPzsKICAgICAgICAgICAgIGxldCBkaXIgPSBQYXRoQnVmOjpmcm9tKGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/KTsKICAgICAgICAgICAgIHdyaXRlX291dHB1dF9maWxlX3JlYWx0aXZlX3RvX2RpcigmZGlyLCAmZ2VuZXJhdGVkX2ZpbGUpPzsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQppbmRleCA2MjM1ZTY5Li45OTcwYjFmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpAQCAtMSwxOCArMSwyOCBAQAogcGFja2FnZSB7cGFja2FnZV9uYW1lfTsKK3t7IC1pZiBub3QgaXNfdGVzdF9tb2RlIH19CiB7eyBpZiBub3QgbGlicmFyeV9leHBvcnRlZC0gfX0KIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgogaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKIHt7IC1lbmRpZiB9fQote3sgLWlmIG5vdCBpc190ZXN0X21vZGUgfX0KKwoge3sgLWlmIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkIH19CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKLXt7IGVuZGlmIH19CisKKwore3sgLWlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkIH19Cit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRpZiB9fQorCit7eyAtZW5kaWYgfX0KIC8qKiBAaGlkZSAqLwogcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKIHt7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQoge3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4ge25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX1faXNfY2FjaGVkID0gZmFsc2U7CiB7eyAtZW5kZm9yLSB9fQogCiB7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CkBAIC0yMCw2ICszMCwzNSBAQAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07CiB7eyAtZW5kaWYgfX0KIHt7IC1lbmRmb3IgfX0KK3t7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQore3sgLWlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgIFN0b3JhZ2VJbnRlcm5hbFJlYWRlciByZWFkZXI7CisgICAgYm9vbGVhbiByZWFkRnJvbU5ld1N0b3JhZ2U7CisKKyAgICBib29sZWFuIHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQWNvbmZpZ0phdmFDb2RlZ2VuIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VDQ0VTU19MT0cgPSAic3VjY2VzczogJXMgdmFsdWUgbWF0Y2hlcyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JU01BVENIX0xPRyA9ICJlcnJvcjogJXMgdmFsdWUgbWlzbWF0Y2gsIG5ldyBzdG9yYWdlIHZhbHVlIGlzICVzLCBvbGQgc3RvcmFnZSB2YWx1ZSBpcyAlcyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX0xPRyA9ICJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZSI7CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7CisgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgcmV0dXJuOworICAgICAgICBpZiAoRGV2aWNlQ29uZmlnLmdldEJvb2xlYW4oImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3Muc3RvcmFnZV90ZXN0X21pc3Npb25fMSIsIGZhbHNlKSkgXHsKKyAgICAgICAgICAgIHJlYWRGcm9tTmV3U3RvcmFnZSA9IHRydWU7CisgICAgICAgICAgICB0cnkgXHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKCJ7Y29udGFpbmVyfSIsICJ7cGFja2FnZV9uYW1lfSIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIFx7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQgPQorICAgICAgICAgICAgRGV2aWNlQ29uZmlnLmdldEJvb2xlYW4oImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwgZmFsc2UpOworICAgIH0KKwore3sgLWVuZGlmIH19Cit7eyAtZW5kaWYgfX0KIHt7IGZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KICAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfe25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0oKSBcewogICAgICAgICB0cnkgXHsKQEAgLTI3LDcgKzY2LDcgQEAKIHt7IC1mb3IgZmxhZyBpbiBuYW1lc3BhY2Vfd2l0aF9mbGFncy5mbGFncyB9fQoge3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQogICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oIntmbGFnLmRldmljZV9jb25maWdfZmxhZ30iLCB7ZmxhZy5kZWZhdWx0X3ZhbHVlfSk7CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfe2ZsYWcuZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0sIHtmbGFnLmRlZmF1bHRfdmFsdWV9KTsKIHt7IC1lbmRpZiB9fQoge3sgLWVuZGZvciB9fQogICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSBcewpAQCAtNDEsNiArODAsMzQgQEAKICAgICAgICAgICAgICk7CiAgICAgICAgIH0KICAgICAgICAge25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX1faXNfY2FjaGVkID0gdHJ1ZTsKK3t7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQore3sgLWlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgICAgICBpbml0KCk7CisgICAgICAgIGlmIChyZWFkRnJvbU5ld1N0b3JhZ2UgJiYgcmVhZGVyICE9IG51bGwpIFx7CisgICAgICAgICAgICBib29sZWFuIHZhbDsKKyAgICAgICAgICAgIHRyeSBcewore3sgLWZvciBmbGFnIGluIG5hbWVzcGFjZV93aXRoX2ZsYWdzLmZsYWdzIH19Cit7eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisKKyAgICAgICAgICAgICAgICB2YWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSh7ZmxhZy5mbGFnX29mZnNldH0pOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0ge2ZsYWcubWV0aG9kX25hbWV9KSBceworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoU1VDQ0VTU19MT0csICJ7ZmxhZy5tZXRob2RfbmFtZX0iKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIFx7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChNSVNNQVRDSF9MT0csICJ7ZmxhZy5tZXRob2RfbmFtZX0iLCB2YWwsIHtmbGFnLm1ldGhvZF9uYW1lfSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1c2VOZXdTdG9yYWdlVmFsdWVBbmREaXNjYXJkT2xkKSBceworICAgICAgICAgICAgICAgICAgICB7ZmxhZy5tZXRob2RfbmFtZX0gPSB2YWw7CisgICAgICAgICAgICAgICAgfQorCit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEVSUk9SX0xPRywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK3t7IC1lbmRpZiB9fQore3sgLWVuZGlmIH19CiAgICAgfQoge3sgZW5kZm9yLSB9fQoge3sgLWVuZGlmIH19eyMtIGVuZCBvZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCAjfQpAQCAtNzAsNyArMTM3LDYgQEAKICAgICBAT3ZlcnJpZGUKIHt7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQogICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQoge3sgLWVuZGlmIH19CiAgICAgcHVibGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9KCkgXHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZQppbmRleCAzOGRkYTdkLi5iNjAxMmU3IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZQpAQCAtMSwxMyArMSwxMyBAQAogI2luY2x1ZGUgIntoZWFkZXJ9LmgiCiAKIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQore3sgaWYgcmVhZHdyaXRlLSB9fQogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAiCiAjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KLQotI2RlZmluZSBBTE9HSShtc2csIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSIsIChtc2cpLCBfX1ZBX0FSR1NfXykKLQorI2RlZmluZSBMT0dfVEFHICJhY29uZmlnX2NwcF9jb2RlZ2VuIgorI2RlZmluZSBBTE9HSSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pCit7eyAtZW5kaWYgfX0KIHt7IGVuZGlmIH19CiAKIHt7IGlmIHJlYWR3cml0ZS0gfX0KQEAgLTY2LDggKzY2LDY4IEBACiAgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSBcewogICAgIHB1YmxpYzoKIAotICAgICAgICB7eyAtZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KKyAgICAgICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQorICAgICAgICB7eyBpZiByZWFkd3JpdGUtIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAge3sgaWYgcmVhZHdyaXRlLSB9fQorICAgICAgICAgICAgOiBjYWNoZV8oe3JlYWR3cml0ZV9jb3VudH0sIC0xKQorICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCisgICAgICAgICAgICB7eyAtZWxzZS0gfX0KKyAgICAgICAgICAgIDogYm9vbGVhbl9zdGFydF9pbmRleF8oKQorICAgICAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICAgICAsIGZsYWdfdmFsdWVfZmlsZV8obnVsbHB0cikKKyAgICAgICAgICAgICwgcmVhZF9mcm9tX25ld19zdG9yYWdlXyhmYWxzZSkKKyAgICAgICAgICAgICwgdXNlX25ld19zdG9yYWdlX3ZhbHVlKGZhbHNlKSBcewogCisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBidWZmZXI7CisgICAgICAgICAgICBpZiAoc3RhdCgiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiLCAmYnVmZmVyKSA9PSAwKSBceworICAgICAgICAgICAgICAgcmVhZF9mcm9tX25ld19zdG9yYWdlXyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgXHsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgICAgICAgICAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIGNvbnRleHQgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKKyAgICAgICAgICAgICAgICAqKnBhY2thZ2VfbWFwX2ZpbGUsICJ7cGFja2FnZX0iKTsKKyAgICAgICAgICAgIGlmICghY29udGV4dC5vaygpKSBceworICAgICAgICAgICAgICAgIEFMT0dJKCJlcnJvcjogZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dDogJXMiLCBjb250ZXh0LmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSBwYWNrYWdlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gPSBjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4OworCisgICAgICAgICAgICAvLyB1bm1hcCBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmcmVlIG1lbW9yeQorICAgICAgICAgICAgZGVsZXRlICpwYWNrYWdlX21hcF9maWxlOworCisgICAgICAgICAgICBhdXRvIGZsYWdfdmFsdWVfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICAgICAgICAgIGlmICghZmxhZ192YWx1ZV9maWxlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsdWUgZmlsZTogJXMiLCBmbGFnX3ZhbHVlX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNhY2hlIGZsYWcgdmFsdWUgZmlsZQorICAgICAgICAgICAgZmxhZ192YWx1ZV9maWxlXyA9IHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPigKKyAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlKTsKKworICAgICAgICAgICAgdXNlX25ld19zdG9yYWdlX3ZhbHVlID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgIH0KKyAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgIHt7IC1lbmRpZiB9fQorCisgICAgICAgIHt7IC1mb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50cyB9fQogICAgICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIG92ZXJyaWRlIFx7CiAgICAgICAgICAgICB7eyAtaWYgaXRlbS5yZWFkd3JpdGUgfX0KICAgICAgICAgICAgIGlmIChjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID09IC0xKSBcewpAQCAtNzYsNiArMTM2LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICJ7aXRlbS5kZXZpY2VfY29uZmlnX2ZsYWd9IiwKICAgICAgICAgICAgICAgICAgICAgIntpdGVtLmRlZmF1bHRfdmFsdWV9IikgPT0gInRydWUiOwogICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbi0gfX0KKyAgICAgICAgICAgIGlmIChyZWFkX2Zyb21fbmV3X3N0b3JhZ2VfKSBceworICAgICAgICAgICAgICAgIGlmICghZmxhZ192YWx1ZV9maWxlXykgXHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcge2l0ZW0uZmxhZ19uYW1lfTogZmxhZyB2YWx1ZSBmaWxlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byB2YWx1ZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgKmZsYWdfdmFsdWVfZmlsZV8sCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXhfICsge2l0ZW0uZmxhZ19vZmZzZXR9KTsKKworICAgICAgICAgICAgICAgIGlmICghdmFsdWUub2soKSkgXHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiAlcyIsIHZhbHVlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgZXhwZWN0ZWRfdmFsdWUgPSBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dOworICAgICAgICAgICAgICAgIGlmICgqdmFsdWUgIT0gZXhwZWN0ZWRfdmFsdWUpIFx7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJlcnJvcjoge2l0ZW0uZmxhZ19uYW1lfSB2YWx1ZSBtaXNtYXRjaCwgbmV3IHN0b3JhZ2UgdmFsdWUgaXMgJXMsIG9sZCBzdG9yYWdlIHZhbHVlIGlzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgKnZhbHVlID8gInRydWUiIDogImZhbHNlIiwgZXhwZWN0ZWRfdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodXNlX25ld19zdG9yYWdlX3ZhbHVlKSBceworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBceworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRfdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAge3sgLWVuZGlmIH19CisKKwogICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV07CiAgICAgICAgICAgICB7eyAtZWxzZSB9fQogICAgICAgICAgICAge3sgLWlmIGl0ZW0uaXNfZml4ZWRfcmVhZF9vbmx5IH19CkBAIC04NiwxMiArMTc5LDIxIEBACiAgICAgICAgICAgICB7eyAtZW5kaWYgfX0KICAgICAgICAgfQogICAgICAgICB7eyAtZW5kZm9yIH19CisKICAgICB7eyBpZiByZWFkd3JpdGUtIH19CiAgICAgcHJpdmF0ZToKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50OF90PiBjYWNoZV8gPSBzdGQ6OnZlY3RvcjxpbnQ4X3Q+KHtyZWFkd3JpdGVfY291bnR9LCAtMSk7Ci0gICAge3sgLWVuZGlmIH19Ci0gICAgfTsKKyAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAgICAgIHVpbnQzMl90IGJvb2xlYW5fc3RhcnRfaW5kZXhfOwogCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPiBmbGFnX3ZhbHVlX2ZpbGVfOworCisgICAgICAgIGJvb2wgcmVhZF9mcm9tX25ld19zdG9yYWdlXzsKKyAgICAgICAgYm9vbCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWU7CisgICAge3sgLWVuZGlmIH19CisgICAge3sgLWVuZGlmIH19CisKKyAgICB9OwogCiB7eyAtZW5kaWYgfX0KIApAQCAtMTA3LDYyICsyMDksNiBAQAogICAgIHt7IC1pZiBpdGVtLnJlYWR3cml0ZSB9fQogICAgIHJldHVybiB7Y3BwX25hbWVzcGFjZX06OntpdGVtLmZsYWdfbmFtZX0oKTsKICAgICB7eyAtZWxzZSB9fQotICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQotICAgIGF1dG8gcmVzdWx0ID0KLSAgICAgICAge3sgaWYgaXRlbS5pc19maXhlZF9yZWFkX29ubHkgfX0KLQkgICAge3BhY2thZ2VfbWFjcm99X3tpdGVtLmZsYWdfbWFjcm99Ci0Je3sgZWxzZSB9fQotCSAgICB7aXRlbS5kZWZhdWx0X3ZhbHVlfQotCXt7IGVuZGlmIH19OwotCi0gICAgc3RydWN0IHN0YXQgYnVmZmVyOwotICAgIGlmIChzdGF0KCIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSIsICZidWZmZXIpICE9IDApIFx7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCi0gICAgICAgICJ7aXRlbS5jb250YWluZXJ9IiwKLSAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OnBhY2thZ2VfbWFwKTsKLSAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKLSAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgbWFwIGZpbGU6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGF1dG8gcGFja2FnZV9yZWFkX2NvbnRleHQgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKLSAgICAgICAgKipwYWNrYWdlX21hcF9maWxlLCAie3BhY2thZ2V9Iik7Ci0gICAgaWYgKCFwYWNrYWdlX3JlYWRfY29udGV4dC5vaygpKSBcewotICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIGNvbnRleHQ6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGRlbGV0ZSAqcGFja2FnZV9tYXBfZmlsZTsKLQotICAgIGF1dG8gZmxhZ192YWxfbWFwID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCi0gICAgICAgICJ7aXRlbS5jb250YWluZXJ9IiwKLSAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKLSAgICBpZiAoIWZsYWdfdmFsX21hcC5vaygpKSBcewotICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiAlcyIsIHBhY2thZ2VfbWFwX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBhdXRvIHZhbHVlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAotICAgICAgICAqKmZsYWdfdmFsX21hcCwKLSAgICAgICAgcGFja2FnZV9yZWFkX2NvbnRleHQtPmJvb2xlYW5fc3RhcnRfaW5kZXggKyB7aXRlbS5mbGFnX29mZnNldH0pOwotICAgIGlmICghdmFsdWUub2soKSkgXHsKLSAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsOiAlcyIsIHBhY2thZ2VfbWFwX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBkZWxldGUgKmZsYWdfdmFsX21hcDsKLQotICAgIGlmICgqdmFsdWUgIT0gcmVzdWx0KSBcewotICAgICAgICBBTE9HSSgiZXJyb3I6IG5ldyBzdG9yYWdlIHZhbHVlICclZCcgZG9lcyBub3QgbWF0Y2ggY3VycmVudCB2YWx1ZSAnJWQnIiwgKnZhbHVlLCByZXN1bHQpOwotICAgIH0gZWxzZSBcewotICAgICAgICBBTE9HSSgic3VjY2VzczogbmV3IHN0b3JhZ2UgdmFsdWUgd2FzICclZCwgbGVnYWN5IHN0b3JhZ2Ugd2FzICclZCciLCAqdmFsdWUsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgICB7eyBlbHNlIH19CiAgICAge3sgLWlmIGl0ZW0uaXNfZml4ZWRfcmVhZF9vbmx5IH19CiAgICAgcmV0dXJuIHtwYWNrYWdlX21hY3JvfV97aXRlbS5mbGFnX21hY3JvfTsKICAgICB7eyAtZWxzZSB9fQpAQCAtMTcwLDcgKzIxNiw2IEBACiAgICAge3sgLWVuZGlmIH19CiAgICAge3sgLWVuZGlmIH19CiAgICAge3sgLWVuZGlmIH19Ci0gICAge3sgLWVuZGlmIH19CiB9CiAKIHt7IC1pZiBpc190ZXN0X21vZGUgfX0KQEAgLTE4NSw1ICsyMzAsMyBAQAogICAgICB7Y3BwX25hbWVzcGFjZX06OnJlc2V0X2ZsYWdzKCk7CiB9CiB7eyAtZW5kaWYgfX0KLQotCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUKaW5kZXggZjlhMjgyOS4uZWExYzYwMCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0LnRlbXBsYXRlCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZQpAQCAtMSwyMCArMSwxMDUgQEAKIC8vISBjb2RlZ2VuZXJhdGVkIHJ1c3QgZmxhZyBsaWIKK3VzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6Olx7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwordXNlIGxvZzo6XHtsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKIAogLy8vIGZsYWcgcHJvdmlkZXIKIHB1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOwogCiB7eyBpZiBoYXNfcmVhZHdyaXRlLSB9fQotbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljISBcewore3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CisKK3N0YXRpYyBGTEFHX1ZBTF9NQVA6IExhenlMb2NrPFJlc3VsdDxNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yPj4gPSBMYXp5TG9jazo6bmV3KHx8IHVuc2FmZSBceworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7Y29udGFpbmVyfSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKK30pOwore3sgLWVuZGlmIH19CiB7eyAtZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KLSAgICB7eyAtaWYgZmxhZy5yZWFkd3JpdGUgfX0KLSAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3Ige2ZsYWcubmFtZX0KLSAgICBzdGF0aWMgcmVmIENBQ0hFRF97ZmxhZy5uYW1lfTogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisKK3t7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQorLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIHtmbGFnLm5hbWV9Cit7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KK3N0YXRpYyBDQUNIRURfe2ZsYWcubmFtZX06IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBceworICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy57ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAogICAgICAgICAie2ZsYWcuZGV2aWNlX2NvbmZpZ19mbGFnfSIsCiAgICAgICAgICJ7ZmxhZy5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIjsKLSAgICB7eyAtZW5kaWYgfX0KKworICAgIGxldCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAorICAgICAgICAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnVzZV9uZXdfc3RvcmFnZV92YWx1ZSIsCisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKworICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgXHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICBsZXQgYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDogXHtlcnJ9IikpCisgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgXHsKKyAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiBce2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgXHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IFx7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IFx7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsge2ZsYWcuZmxhZ19vZmZzZXR9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiBce2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICd7cGFja2FnZX0nIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IFx7CisgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgaWYgc3RvcmFnZV9yZXN1bHQgPT0gcmVzdWx0ID0+IFx7CisgICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIFx7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3Jlc3VsdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgXHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IFx7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ3tmbGFnLm5hbWV9Jy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIFx7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIFx7c3RvcmFnZV9yZXN1bHR9Iik7CisgICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIFx7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3Jlc3VsdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgXHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBce2Vycn0iKTsKKyAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgXHsKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiBce2Vycn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQKKyAgICB9KTsKK3t7IGVsc2UgfX0KK3N0YXRpYyBDQUNIRURfe2ZsYWcubmFtZX06IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICJhY29uZmlnX2ZsYWdzLntmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSIsCisgICAgIntmbGFnLmRldmljZV9jb25maWdfZmxhZ30iLAorICAgICJ7ZmxhZy5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIik7Cit7eyBlbmRpZiB9fQore3sgLWVuZGlmIH19CiB7eyAtZW5kZm9yIH19Ci19CiB7eyAtZW5kaWYgfX0KIAogaW1wbCBGbGFnUHJvdmlkZXIgXHsKQEAgLTIyLDExICsxMDcsMTEgQEAKIHt7IGZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19CiAgICAgLy8vIHF1ZXJ5IGZsYWcge2ZsYWcubmFtZX0KICAgICBwdWIgZm4ge2ZsYWcubmFtZX0oJnNlbGYpIC0+IGJvb2wgXHsKLSAgICB7eyAtaWYgZmxhZy5yZWFkd3JpdGUgfX0KKyAgICAgICAge3sgLWlmIGZsYWcucmVhZHdyaXRlIH19CiAgICAgICAgICpDQUNIRURfe2ZsYWcubmFtZX0KLSAgICB7eyAtZWxzZSB9fQorICAgICAgICB7eyAtZWxzZSB9fQogICAgICAgICB7ZmxhZy5kZWZhdWx0X3ZhbHVlfQotICAgIHt7IC1lbmRpZiB9fQorICAgICAgICB7eyAtZW5kaWYgfX0KICAgICB9CiB7eyBlbmRmb3IgfX0KIApAQCAtNDMsNyArMTI4LDY3IEBACiAgICAgUFJPVklERVIue2ZsYWcubmFtZX0oKQoge3sgLWVsc2UgfX0KIHB1YiBmbiB7ZmxhZy5uYW1lfSgpIC0+IGJvb2wgXHsKKyAgICB7eyBpZiBub3QgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CiAgICAge2ZsYWcuZGVmYXVsdF92YWx1ZX0KKyAgICB7eyBlbHNlIH19CisKKyAgICBsZXQgcmVzdWx0ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07CisgICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgXHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAorICAgIC8vIGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAorICAgICk7CisKKyAgICB1bnNhZmUgXHsKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoIntmbGFnLmNvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIFx7CisgICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAorICAgICAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICd7ZmxhZy5uYW1lfSc6IFx7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpIFx7CisgICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAorICAgICAgICAgICAgT2soTm9uZSkgPT4gXHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICd7ZmxhZy5uYW1lfSc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IFx7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoIntmbGFnLmNvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIFx7CisgICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAorICAgICAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICd7ZmxhZy5uYW1lfSc6IFx7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwge2ZsYWcuZmxhZ19vZmZzZXR9ICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgXHsKKyAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAorICAgICAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICd7ZmxhZy5uYW1lfSc6IFx7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIFx7CisgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAne2ZsYWcubmFtZX0nLiBMZWdhY3kgc3RvcmFnZSB3YXMgXHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMgXHt2YWx1ZX0iKTsKKyAgICAgICAgfSBlbHNlIFx7CisgICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IHtmbGFnLmRlZmF1bHRfdmFsdWV9OworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0CisgICAge3sgZW5kaWYgfX0KIHt7IC1lbmRpZiB9fQogfQoge3sgZW5kZm9yIH19CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAKaW5kZXggMmM3NzFlMC4uOTVjZWNmNCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvQW5kcm9pZC5icApAQCAtMzksMTMgKzM5LDE2IEBACiAKIGdlbnJ1bGUgewogICAgIG5hbWU6ICJsaWJhY29uZmlnX2phdmFfZGV2aWNlX3BhdGhzX3NyYyIsCi0gICAgc3JjczogWyJzcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhIl0sCi0gICAgb3V0OiBbIkRldmljZVBhdGhzLmphdmEiXSwKKyAgICBzcmNzOiBbInNyYy9EZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhIl0sCisgICAgb3V0OiBbIkRldmljZVByb3Rvcy5qYXZhIl0sCiAgICAgdG9vbF9maWxlczogWyJwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQiXSwKLSAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KSIKKyAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KSIsCiB9CiAKIGphdmFfbGlicmFyeSB7CiAgICAgbmFtZTogImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmEiLAogICAgIHNyY3M6IFsiOmxpYmFjb25maWdfamF2YV9kZXZpY2VfcGF0aHNfc3JjIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfamF2YV9wcm90b19uYW5vIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQYXRoc1RlbXBsYXRlLmphdmEKcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKaW5kZXggZjI3YjliZC4uNThjNThkZSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKQEAgLTE1LDcgKzE1LDEyIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnOwogCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZzsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnLnBhcnNlZF9mbGFnczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTIzLDcgKzI4LDcgQEAKIC8qKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIERldmljZVBhdGhzIHsKK3B1YmxpYyBjbGFzcyBEZXZpY2VQcm90b3MgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKICAgICAgICAgVEVNUExBVEUKICAgICB9OwpAQCAtMzEsMTIgKzM2LDM1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQRVhfRElSID0gIi9hcGV4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYID0gIi9ldGMvYWNvbmZpZ19mbGFncy5wYiI7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgb24tZGV2aWNlIGFjb25maWcgcHJvdG9zLgorICAgICAqCisgICAgICogTWF5IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJvdG9zIGNhbid0IGJlIHJlYWQgYXQgdGhlIGNhbGwgc2l0ZS4gRm9yCisgICAgICogZXhhbXBsZSwgc29tZSBvZiB0aGUgcHJvdG9zIGFyZSBpbiB0aGUgYXBleC8gcGFydGl0aW9uLCB3aGljaCBpcyBtb3VudGVkCisgICAgICogc29tZXdoYXQgbGF0ZSBpbiB0aGUgYm9vdCBwcm9jZXNzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB3ZSBjYW4ndCByZWFkIG9uZSBvZiB0aGUgcHJvdG9zIHlldAorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8cGFyc2VkX2ZsYWc+IGxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8cGFyc2VkX2ZsYWc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogcGFyc2VkRmxhZ3NQcm90b1BhdGhzKCkpIHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZ3MgcGFyc2VkRmxhZ3MgPSBwYXJzZWRfZmxhZ3MucGFyc2VGcm9tKGlucHV0U3RyZWFtLnJlYWRBbGxCeXRlcygpKTsKKyAgICAgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IHBhcnNlZEZsYWdzLnBhcnNlZEZsYWcpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZsYWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MgcGF0aHMuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHBhcnNlZEZsYWdzUHJvdG9QYXRocygpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VkRmxhZ3NQcm90b1BhdGhzKCkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChQQVRIUykpOwogCiAgICAgICAgIEZpbGUgYXBleERpcmVjdG9yeSA9IG5ldyBGaWxlKEFQRVhfRElSKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycwppbmRleCA3NDgwYjMwLi45YWI5Y2VhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9saWIucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvbGliLnJzCkBAIC0zMCw5ICszMCwxMSBAQAogICAgICAgICAuY29sbGVjdCgpCiB9CiAKLS8vLyBEZXRlcm1pbmUgYWxsIHBhdGhzIHRoYXQgY29udGFpbiBhbiBhY29uZmlnIHByb3RvYnVmIGZpbGUuCisvLy8gRGV0ZXJtaW5lcyBhbGwgcGF0aHMgdGhhdCBjb250YWluIGFuIGFjb25maWcgcHJvdG9idWYgZmlsZSwKKy8vLyBmaWx0ZXJpbmcgb3V0IG5vbmV4aXN0ZW50IHBhcnRpdGlvbiBwcm90b2J1ZiBmaWxlcy4KIHB1YiBmbiBwYXJzZWRfZmxhZ3NfcHJvdG9fcGF0aHMoKSAtPiBSZXN1bHQ8VmVjPFBhdGhCdWY+PiB7Ci0gICAgbGV0IG11dCByZXN1bHQ6IFZlYzxQYXRoQnVmPiA9IHJlYWRfcGFydGl0aW9uX3BhdGhzKCk7CisgICAgbGV0IG11dCByZXN1bHQ6IFZlYzxQYXRoQnVmPiA9CisgICAgICAgIHJlYWRfcGFydGl0aW9uX3BhdGhzKCkuaW50b19pdGVyKCkuZmlsdGVyKHxzfCBzLmV4aXN0cygpKS5jb2xsZWN0KCk7CiAKICAgICBmb3IgZGlyIGluIGZzOjpyZWFkX2RpcigiL2FwZXgiKT8gewogICAgICAgICBsZXQgZGlyID0gZGlyPzsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQW5kcm9pZC5icAppbmRleCBlMDY2ZTMxLi40MGI0NDY0IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwCkBAIC0xMzcsMyArMTM3LDI5IEBACiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIH0KKworLy8gc3RvcmFnZSBmaWxlIHBhcnNlIGFwaSBqYXZhIGxpYnJhcnkKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyY3MvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAiY29yZV9jdXJyZW50IiwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorfQorCisvLyBzdG9yYWdlIGZpbGUgcGFyc2UgYXBpIGphdmEgbGlicmFyeSBmb3IgY29yZSBsaWJyYXJ5CitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhX25vbmUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyY3MvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAibm9uZSIsCisgICAgc3lzdGVtX21vZHVsZXM6ICJjb3JlLWFsbC1zeXN0ZW0tbW9kdWxlcyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ190YWJsZS5ycwppbmRleCA2NGI5MGVhLi42NjBlZGFjIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdGFibGUucnMKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgIC8vLyBDYWxjdWxhdGUgbm9kZSBidWNrZXQgaW5kZXgKICAgICBwdWIgZm4gZmluZF9idWNrZXRfaW5kZXgocGFja2FnZV9pZDogdTMyLCBmbGFnX25hbWU6ICZzdHIsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7CiAgICAgICAgIGxldCBmdWxsX2ZsYWdfbmFtZSA9IHBhY2thZ2VfaWQudG9fc3RyaW5nKCkgKyAiLyIgKyBmbGFnX25hbWU7Ci0gICAgICAgIGdldF9idWNrZXRfaW5kZXgoJmZ1bGxfZmxhZ19uYW1lLCBudW1fYnVja2V0cykKKyAgICAgICAgZ2V0X2J1Y2tldF9pbmRleChmdWxsX2ZsYWdfbmFtZS5hc19ieXRlcygpLCBudW1fYnVja2V0cykKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycwppbmRleCAyNmU5YzFhLi5iNjM2N2ZmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCkBAIC0zNywxOSArMzcsMjAgQEAKIHB1YiBtb2QgZmxhZ192YWx1ZTsKIHB1YiBtb2QgcGFja2FnZV90YWJsZTsKIHB1YiBtb2QgcHJvdG9zOworcHViIG1vZCBzaXBfaGFzaGVyMTM7CiBwdWIgbW9kIHRlc3RfdXRpbHM7CiAKIHVzZSBhbnlob3c6OmFueWhvdzsKIHVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Ci11c2Ugc3RkOjpjb2xsZWN0aW9uczo6aGFzaF9tYXA6OkRlZmF1bHRIYXNoZXI7CiB1c2Ugc3RkOjpmczo6RmlsZTsKLXVzZSBzdGQ6Omhhc2g6OntIYXNoLCBIYXNoZXJ9OwordXNlIHN0ZDo6aGFzaDo6SGFzaGVyOwogdXNlIHN0ZDo6aW86OlJlYWQ7CiAKIHB1YiB1c2UgY3JhdGU6OmZsYWdfaW5mbzo6e0ZsYWdJbmZvQml0LCBGbGFnSW5mb0hlYWRlciwgRmxhZ0luZm9MaXN0LCBGbGFnSW5mb05vZGV9OwogcHViIHVzZSBjcmF0ZTo6ZmxhZ190YWJsZTo6e0ZsYWdUYWJsZSwgRmxhZ1RhYmxlSGVhZGVyLCBGbGFnVGFibGVOb2RlfTsKIHB1YiB1c2UgY3JhdGU6OmZsYWdfdmFsdWU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3R9OwogcHViIHVzZSBjcmF0ZTo6cGFja2FnZV90YWJsZTo6e1BhY2thZ2VUYWJsZSwgUGFja2FnZVRhYmxlSGVhZGVyLCBQYWNrYWdlVGFibGVOb2RlfTsKK3B1YiB1c2UgY3JhdGU6OnNpcF9oYXNoZXIxMzo6U2lwSGFzaGVyMTM7CiAKIHVzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjo6ewogICAgIEJ5dGVzUGFyc2VGYWlsLCBIYXNoVGFibGVTaXplTGltaXQsIEludmFsaWRGbGFnVmFsdWVUeXBlLCBJbnZhbGlkU3RvcmVkRmxhZ1R5cGUsCkBAIC0yMTEsMTAgKzIxMiwxMiBAQAogfQogCiAvLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGJ1Y2tldCBpbmRleCBnaXZlbiB0aGUga2V5IGFuZCBudW1iZXIgb2YgYnVja2V0cwotcHViKGNyYXRlKSBmbiBnZXRfYnVja2V0X2luZGV4PFQ6IEhhc2g+KHZhbDogJlQsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7Ci0gICAgbGV0IG11dCBzID0gRGVmYXVsdEhhc2hlcjo6bmV3KCk7Ci0gICAgdmFsLmhhc2goJm11dCBzKTsKLSAgICAocy5maW5pc2goKSAlIG51bV9idWNrZXRzIGFzIHU2NCkgYXMgdTMyCitwdWIoY3JhdGUpIGZuIGdldF9idWNrZXRfaW5kZXgodmFsOiAmW3U4XSwgbnVtX2J1Y2tldHM6IHUzMikgLT4gdTMyIHsKKyAgICBsZXQgbXV0IHMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgcy53cml0ZSh2YWwpOworICAgIHMud3JpdGVfdTgoMHhmZik7CisgICAgbGV0IHJldCA9IChzLmZpbmlzaCgpICUgbnVtX2J1Y2tldHMgYXMgdTY0KSBhcyB1MzI7CisgICAgcmV0CiB9CiAKIC8vLyBSZWFkIGFuZCBwYXJzZSBieXRlcyBhcyB1OApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcGFja2FnZV90YWJsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3BhY2thZ2VfdGFibGUucnMKaW5kZXggYjczNDk3Mi4uMDA3Zjg2ZSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcGFja2FnZV90YWJsZS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICAvLy8gY29uc3RydWN0aW9uIHNpZGUgKGFjb25maWcgYmluYXJ5KSBhbmQgY29uc3VtcHRpb24gc2lkZSAoZmxhZyByZWFkIGxpYikKICAgICAvLy8gdXNlIHRoZSBzYW1lIG1ldGhvZCBvZiBoYXNoaW5nCiAgICAgcHViIGZuIGZpbmRfYnVja2V0X2luZGV4KHBhY2thZ2U6ICZzdHIsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7Ci0gICAgICAgIGdldF9idWNrZXRfaW5kZXgoJnBhY2thZ2UsIG51bV9idWNrZXRzKQorICAgICAgICBnZXRfYnVja2V0X2luZGV4KHBhY2thZ2UuYXNfYnl0ZXMoKSwgbnVtX2J1Y2tldHMpCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9zaXBfaGFzaGVyMTMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9zaXBfaGFzaGVyMTMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlMzE3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3NpcF9oYXNoZXIxMy5ycwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTaXBIYXNoMTMKKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6bWVtOwordXNlIHN0ZDo6cHRyOwordXNlIHN0ZDo6c2xpY2U7CisKK3VzZSBzdGQ6Omhhc2g6Okhhc2hlcjsKKworLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFNpcEhhc2ggMi00LgorLy8vCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIERlZmF1bHQpXQorcHViIHN0cnVjdCBTaXBIYXNoZXIxMyB7CisgICAgazA6IHU2NCwKKyAgICBrMTogdTY0LAorICAgIGxlbmd0aDogdXNpemUsIC8vIGhvdyBtYW55IGJ5dGVzIHdlJ3ZlIHByb2Nlc3NlZAorICAgIHN0YXRlOiBTdGF0ZSwgIC8vIGhhc2ggU3RhdGUKKyAgICB0YWlsOiB1NjQsICAgICAvLyB1bnByb2Nlc3NlZCBieXRlcyBsZQorICAgIG50YWlsOiB1c2l6ZSwgIC8vIGhvdyBtYW55IGJ5dGVzIGluIHRhaWwgYXJlIHZhbGlkCit9CisKKyNbZGVyaXZlKERlYnVnLCBDbG9uZSwgQ29weSwgRGVmYXVsdCldCisjW3JlcHIoQyldCitzdHJ1Y3QgU3RhdGUgeworICAgIC8vIHYwLCB2MiBhbmQgdjEsIHYzIHNob3cgdXAgaW4gcGFpcnMgaW4gdGhlIGFsZ29yaXRobSwKKyAgICAvLyBhbmQgc2ltZCBpbXBsZW1lbnRhdGlvbnMgb2YgU2lwSGFzaCB3aWxsIHVzZSB2ZWN0b3JzCisgICAgLy8gb2YgdjAyIGFuZCB2MTMuIEJ5IHBsYWNpbmcgdGhlbSBpbiB0aGlzIG9yZGVyIGluIHRoZSBzdHJ1Y3QsCisgICAgLy8gdGhlIGNvbXBpbGVyIGNhbiBwaWNrIHVwIG9uIGp1c3QgYSBmZXcgc2ltZCBvcHRpbWl6YXRpb25zIGJ5IGl0c2VsZi4KKyAgICB2MDogdTY0LAorICAgIHYyOiB1NjQsCisgICAgdjE6IHU2NCwKKyAgICB2MzogdTY0LAorfQorCittYWNyb19ydWxlcyEgY29tcHJlc3MgeworICAgICgkc3RhdGU6ZXhwcikgPT4ge3sKKyAgICAgICAgY29tcHJlc3MhKCRzdGF0ZS52MCwgJHN0YXRlLnYxLCAkc3RhdGUudjIsICRzdGF0ZS52MykKKyAgICB9fTsKKyAgICAoJHYwOmV4cHIsICR2MTpleHByLCAkdjI6ZXhwciwgJHYzOmV4cHIpID0+IHt7CisgICAgICAgICR2MCA9ICR2MC53cmFwcGluZ19hZGQoJHYxKTsKKyAgICAgICAgJHYxID0gJHYxLnJvdGF0ZV9sZWZ0KDEzKTsKKyAgICAgICAgJHYxIF49ICR2MDsKKyAgICAgICAgJHYwID0gJHYwLnJvdGF0ZV9sZWZ0KDMyKTsKKyAgICAgICAgJHYyID0gJHYyLndyYXBwaW5nX2FkZCgkdjMpOworICAgICAgICAkdjMgPSAkdjMucm90YXRlX2xlZnQoMTYpOworICAgICAgICAkdjMgXj0gJHYyOworICAgICAgICAkdjAgPSAkdjAud3JhcHBpbmdfYWRkKCR2Myk7CisgICAgICAgICR2MyA9ICR2My5yb3RhdGVfbGVmdCgyMSk7CisgICAgICAgICR2MyBePSAkdjA7CisgICAgICAgICR2MiA9ICR2Mi53cmFwcGluZ19hZGQoJHYxKTsKKyAgICAgICAgJHYxID0gJHYxLnJvdGF0ZV9sZWZ0KDE3KTsKKyAgICAgICAgJHYxIF49ICR2MjsKKyAgICAgICAgJHYyID0gJHYyLnJvdGF0ZV9sZWZ0KDMyKTsKKyAgICB9fTsKK30KKworLy8vIExvYWQgYW4gaW50ZWdlciBvZiB0aGUgZGVzaXJlZCB0eXBlIGZyb20gYSBieXRlIHN0cmVhbSwgaW4gTEUgb3JkZXIuIFVzZXMKKy8vLyBgY29weV9ub25vdmVybGFwcGluZ2AgdG8gbGV0IHRoZSBjb21waWxlciBnZW5lcmF0ZSB0aGUgbW9zdCBlZmZpY2llbnQgd2F5CisvLy8gdG8gbG9hZCBpdCBmcm9tIGEgcG9zc2libHkgdW5hbGlnbmVkIGFkZHJlc3MuCisvLy8KKy8vLyBVbnNhZmUgYmVjYXVzZTogdW5jaGVja2VkIGluZGV4aW5nIGF0IGkuLmkrc2l6ZV9vZihpbnRfdHkpCittYWNyb19ydWxlcyEgbG9hZF9pbnRfbGUgeworICAgICgkYnVmOmV4cHIsICRpOmV4cHIsICRpbnRfdHk6aWRlbnQpID0+IHt7CisgICAgICAgIGRlYnVnX2Fzc2VydCEoJGkgKyBtZW06OnNpemVfb2Y6OjwkaW50X3R5PigpIDw9ICRidWYubGVuKCkpOworICAgICAgICBsZXQgbXV0IGRhdGEgPSAwIGFzICRpbnRfdHk7CisgICAgICAgIHB0cjo6Y29weV9ub25vdmVybGFwcGluZygKKyAgICAgICAgICAgICRidWYuZ2V0X3VuY2hlY2tlZCgkaSksCisgICAgICAgICAgICAmbXV0IGRhdGEgYXMgKm11dCBfIGFzICptdXQgdTgsCisgICAgICAgICAgICBtZW06OnNpemVfb2Y6OjwkaW50X3R5PigpLAorICAgICAgICApOworICAgICAgICBkYXRhLnRvX2xlKCkKKyAgICB9fTsKK30KKworLy8vIExvYWQgYW4gdTY0IHVzaW5nIHVwIHRvIDcgYnl0ZXMgb2YgYSBieXRlIHNsaWNlLgorLy8vCisvLy8gVW5zYWZlIGJlY2F1c2U6IHVuY2hlY2tlZCBpbmRleGluZyBhdCBzdGFydC4uc3RhcnQrbGVuCisjW2lubGluZV0KK3Vuc2FmZSBmbiB1OHRvNjRfbGUoYnVmOiAmW3U4XSwgc3RhcnQ6IHVzaXplLCBsZW46IHVzaXplKSAtPiB1NjQgeworICAgIGRlYnVnX2Fzc2VydCEobGVuIDwgOCk7CisgICAgbGV0IG11dCBpID0gMDsgLy8gY3VycmVudCBieXRlIGluZGV4IChmcm9tIExTQikgaW4gdGhlIG91dHB1dCB1NjQKKyAgICBsZXQgbXV0IG91dCA9IDA7CisgICAgaWYgaSArIDMgPCBsZW4geworICAgICAgICBvdXQgPSBsb2FkX2ludF9sZSEoYnVmLCBzdGFydCArIGksIHUzMikgYXMgdTY0OworICAgICAgICBpICs9IDQ7CisgICAgfQorICAgIGlmIGkgKyAxIDwgbGVuIHsKKyAgICAgICAgb3V0IHw9IChsb2FkX2ludF9sZSEoYnVmLCBzdGFydCArIGksIHUxNikgYXMgdTY0KSA8PCAoaSAqIDgpOworICAgICAgICBpICs9IDIKKyAgICB9CisgICAgaWYgaSA8IGxlbiB7CisgICAgICAgIG91dCB8PSAoKmJ1Zi5nZXRfdW5jaGVja2VkKHN0YXJ0ICsgaSkgYXMgdTY0KSA8PCAoaSAqIDgpOworICAgICAgICBpICs9IDE7CisgICAgfQorICAgIGRlYnVnX2Fzc2VydF9lcSEoaSwgbGVuKTsKKyAgICBvdXQKK30KKworaW1wbCBTaXBIYXNoZXIxMyB7CisgICAgLy8vIENyZWF0ZXMgYSBuZXcgYFNpcEhhc2hlcjEzYCB3aXRoIHRoZSB0d28gaW5pdGlhbCBrZXlzIHNldCB0byAwLgorICAgICNbaW5saW5lXQorICAgIHB1YiBmbiBuZXcoKSAtPiBTaXBIYXNoZXIxMyB7CisgICAgICAgIFNpcEhhc2hlcjEzOjpuZXdfd2l0aF9rZXlzKDAsIDApCisgICAgfQorCisgICAgLy8vIENyZWF0ZXMgYSBgU2lwSGFzaGVyMTNgIHRoYXQgaXMga2V5ZWQgb2ZmIHRoZSBwcm92aWRlZCBrZXlzLgorICAgICNbaW5saW5lXQorICAgIHB1YiBmbiBuZXdfd2l0aF9rZXlzKGtleTA6IHU2NCwga2V5MTogdTY0KSAtPiBTaXBIYXNoZXIxMyB7CisgICAgICAgIGxldCBtdXQgc2lwX2hhc2hlciA9IFNpcEhhc2hlcjEzIHsKKyAgICAgICAgICAgIGswOiBrZXkwLAorICAgICAgICAgICAgazE6IGtleTEsCisgICAgICAgICAgICBsZW5ndGg6IDAsCisgICAgICAgICAgICBzdGF0ZTogU3RhdGUgeyB2MDogMCwgdjE6IDAsIHYyOiAwLCB2MzogMCB9LAorICAgICAgICAgICAgdGFpbDogMCwKKyAgICAgICAgICAgIG50YWlsOiAwLAorICAgICAgICB9OworICAgICAgICBzaXBfaGFzaGVyLnJlc2V0KCk7CisgICAgICAgIHNpcF9oYXNoZXIKKyAgICB9CisKKyAgICAjW2lubGluZV0KKyAgICBmbiBjX3JvdW5kcyhzdGF0ZTogJm11dCBTdGF0ZSkgeworICAgICAgICBjb21wcmVzcyEoc3RhdGUpOworICAgIH0KKworICAgICNbaW5saW5lXQorICAgIGZuIGRfcm91bmRzKHN0YXRlOiAmbXV0IFN0YXRlKSB7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgfQorCisgICAgI1tpbmxpbmVdCisgICAgZm4gcmVzZXQoJm11dCBzZWxmKSB7CisgICAgICAgIHNlbGYubGVuZ3RoID0gMDsKKyAgICAgICAgc2VsZi5zdGF0ZS52MCA9IHNlbGYuazAgXiAweDczNmY2ZDY1NzA3MzY1NzU7CisgICAgICAgIHNlbGYuc3RhdGUudjEgPSBzZWxmLmsxIF4gMHg2NDZmNzI2MTZlNjQ2ZjZkOworICAgICAgICBzZWxmLnN0YXRlLnYyID0gc2VsZi5rMCBeIDB4NmM3OTY3NjU2ZTY1NzI2MTsKKyAgICAgICAgc2VsZi5zdGF0ZS52MyA9IHNlbGYuazEgXiAweDc0NjU2NDYyNzk3NDY1NzM7CisgICAgICAgIHNlbGYubnRhaWwgPSAwOworICAgIH0KKworICAgIC8vIFNwZWNpYWxpemVkIHdyaXRlIGZ1bmN0aW9uIHRoYXQgaXMgb25seSB2YWxpZCBmb3IgYnVmZmVycyB3aXRoIGxlbiA8PSA4LgorICAgIC8vIEl0J3MgdXNlZCB0byBmb3JjZSBpbmxpbmluZyBvZiB3cml0ZV91OCBhbmQgd3JpdGVfdXNpemUsIHRob3NlIHdvdWxkIG5vcm1hbGx5IGJlIGlubGluZWQKKyAgICAvLyBleGNlcHQgZm9yIGNvbXBvc2l0ZSB0eXBlcyAodGhhdCBpbmNsdWRlcyBzbGljZXMgYW5kIHN0ciBoYXNoaW5nIGJlY2F1c2Ugb2YgZGVsaW1pdGVyKS4KKyAgICAvLyBXaXRob3V0IHRoaXMgZXh0cmEgcHVzaCB0aGUgY29tcGlsZXIgaXMgdmVyeSByZWx1Y3RhbnQgdG8gaW5saW5lIGRlbGltaXRlciB3cml0ZXMsCisgICAgLy8gZGVncmFkaW5nIHBlcmZvcm1hbmNlIHN1YnN0YW50aWFsbHkgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZXMuCisgICAgI1tpbmxpbmVdCisgICAgZm4gc2hvcnRfd3JpdGUoJm11dCBzZWxmLCBtc2c6ICZbdThdKSB7CisgICAgICAgIGRlYnVnX2Fzc2VydCEobXNnLmxlbigpIDw9IDgpOworICAgICAgICBsZXQgbGVuZ3RoID0gbXNnLmxlbigpOworICAgICAgICBzZWxmLmxlbmd0aCArPSBsZW5ndGg7CisKKyAgICAgICAgbGV0IG5lZWRlZCA9IDggLSBzZWxmLm50YWlsOworICAgICAgICBsZXQgZmlsbCA9IGNtcDo6bWluKGxlbmd0aCwgbmVlZGVkKTsKKyAgICAgICAgaWYgZmlsbCA9PSA4IHsKKyAgICAgICAgICAgIC8vIHNhZmUgdG8gY2FsbCBzaW5jZSBtc2cgaGFzbid0IGJlZW4gbG9hZGVkCisgICAgICAgICAgICBzZWxmLnRhaWwgPSB1bnNhZmUgeyBsb2FkX2ludF9sZSEobXNnLCAwLCB1NjQpIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgbXNnIGhhc24ndCBiZWVuIGxvYWRlZCwgYW5kIGZpbGwgPD0gbXNnLmxlbigpCisgICAgICAgICAgICBzZWxmLnRhaWwgfD0gdW5zYWZlIHsgdTh0bzY0X2xlKG1zZywgMCwgZmlsbCkgfSA8PCAoOCAqIHNlbGYubnRhaWwpOworICAgICAgICAgICAgaWYgbGVuZ3RoIDwgbmVlZGVkIHsKKyAgICAgICAgICAgICAgICBzZWxmLm50YWlsICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5zdGF0ZS52MyBePSBzZWxmLnRhaWw7CisgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc2VsZi5zdGF0ZSk7CisgICAgICAgIHNlbGYuc3RhdGUudjAgXj0gc2VsZi50YWlsOworCisgICAgICAgIC8vIEJ1ZmZlcmVkIHRhaWwgaXMgbm93IGZsdXNoZWQsIHByb2Nlc3MgbmV3IGlucHV0LgorICAgICAgICBzZWxmLm50YWlsID0gbGVuZ3RoIC0gbmVlZGVkOworICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgbnVtYmVyIG9mIGBuZWVkZWRgIGJ5dGVzIGhhcyBiZWVuIGxvYWRlZAorICAgICAgICAvLyBhbmQgc2VsZi5udGFpbCArIG5lZWRlZCA9PSBtc2cubGVuKCkKKyAgICAgICAgc2VsZi50YWlsID0gdW5zYWZlIHsgdTh0bzY0X2xlKG1zZywgbmVlZGVkLCBzZWxmLm50YWlsKSB9OworICAgIH0KK30KKworaW1wbCBIYXNoZXIgZm9yIFNpcEhhc2hlcjEzIHsKKyAgICAvLyBzZWUgc2hvcnRfd3JpdGUgY29tbWVudCBmb3IgZXhwbGFuYXRpb24KKyAgICAjW2lubGluZV0KKyAgICBmbiB3cml0ZV91c2l6ZSgmbXV0IHNlbGYsIGk6IHVzaXplKSB7CisgICAgICAgIC8vIHNhZmUgdG8gY2FsbCwgc2luY2UgY29udmVydCB0aGUgcG9pbnRlciB0byB1OAorICAgICAgICBsZXQgYnl0ZXMgPSB1bnNhZmUgeworICAgICAgICAgICAgc2xpY2U6OmZyb21fcmF3X3BhcnRzKCZpIGFzICpjb25zdCB1c2l6ZSBhcyAqY29uc3QgdTgsIG1lbTo6c2l6ZV9vZjo6PHVzaXplPigpKQorICAgICAgICB9OworICAgICAgICBzZWxmLnNob3J0X3dyaXRlKGJ5dGVzKTsKKyAgICB9CisKKyAgICAvLyBzZWUgc2hvcnRfd3JpdGUgY29tbWVudCBmb3IgZXhwbGFuYXRpb24KKyAgICAjW2lubGluZV0KKyAgICBmbiB3cml0ZV91OCgmbXV0IHNlbGYsIGk6IHU4KSB7CisgICAgICAgIHNlbGYuc2hvcnRfd3JpdGUoJltpXSk7CisgICAgfQorCisgICAgI1tpbmxpbmVdCisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBtc2c6ICZbdThdKSB7CisgICAgICAgIGxldCBsZW5ndGggPSBtc2cubGVuKCk7CisgICAgICAgIHNlbGYubGVuZ3RoICs9IGxlbmd0aDsKKworICAgICAgICBsZXQgbXV0IG5lZWRlZCA9IDA7CisKKyAgICAgICAgLy8gbG9hZGluZyB1bnByb2Nlc3NlZCBieXRlIGZyb20gbGFzdCB3cml0ZQorICAgICAgICBpZiBzZWxmLm50YWlsICE9IDAgeworICAgICAgICAgICAgbmVlZGVkID0gOCAtIHNlbGYubnRhaWw7CisgICAgICAgICAgICAvLyBzYWZlIHRvIGNhbGwsIHNpbmNlIG1zZyBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQKKyAgICAgICAgICAgIC8vIGFuZCBjbXA6Om1pbihsZW5ndGgsIG5lZWRlZCkgPCA4CisgICAgICAgICAgICBzZWxmLnRhaWwgfD0gdW5zYWZlIHsgdTh0bzY0X2xlKG1zZywgMCwgY21wOjptaW4obGVuZ3RoLCBuZWVkZWQpKSB9IDw8IDggKiBzZWxmLm50YWlsOworICAgICAgICAgICAgaWYgbGVuZ3RoIDwgbmVlZGVkIHsKKyAgICAgICAgICAgICAgICBzZWxmLm50YWlsICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUudjMgXj0gc2VsZi50YWlsOworICAgICAgICAgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc2VsZi5zdGF0ZSk7CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS52MCBePSBzZWxmLnRhaWw7CisgICAgICAgICAgICAgICAgc2VsZi5udGFpbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBCdWZmZXJlZCB0YWlsIGlzIG5vdyBmbHVzaGVkLCBwcm9jZXNzIG5ldyBpbnB1dC4KKyAgICAgICAgbGV0IGxlbiA9IGxlbmd0aCAtIG5lZWRlZDsKKyAgICAgICAgbGV0IGxlZnQgPSBsZW4gJiAweDc7CisKKyAgICAgICAgbGV0IG11dCBpID0gbmVlZGVkOworICAgICAgICB3aGlsZSBpIDwgbGVuIC0gbGVmdCB7CisgICAgICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgaWYgaSA8IGxlbiAtIGxlZnQsIGl0IG1lYW5zIG1zZyBoYXMgYXQgbGVhc3QgMSBieXRlIHRvIGxvYWQKKyAgICAgICAgICAgIGxldCBtaSA9IHVuc2FmZSB7IGxvYWRfaW50X2xlIShtc2csIGksIHU2NCkgfTsKKworICAgICAgICAgICAgc2VsZi5zdGF0ZS52MyBePSBtaTsKKyAgICAgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc2VsZi5zdGF0ZSk7CisgICAgICAgICAgICBzZWxmLnN0YXRlLnYwIF49IG1pOworCisgICAgICAgICAgICBpICs9IDg7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgaWYgbGVmdCA9PSAwLCBzaW5jZSB0aGlzIGNhbGwgd2lsbCBsb2FkIG5vdGhpbmcKKyAgICAgICAgLy8gaWYgbGVmdCA+IDAsIGl0IG1lYW5zIHRoZXJlIGFyZSBudW1iZXIgb2YgYGxlZnRgIGJ5dGVzIGluIG1zZworICAgICAgICBzZWxmLnRhaWwgPSB1bnNhZmUgeyB1OHRvNjRfbGUobXNnLCBpLCBsZWZ0KSB9OworICAgICAgICBzZWxmLm50YWlsID0gbGVmdDsKKyAgICB9CisKKyAgICAjW2lubGluZV0KKyAgICBmbiBmaW5pc2goJnNlbGYpIC0+IHU2NCB7CisgICAgICAgIGxldCBtdXQgc3RhdGUgPSBzZWxmLnN0YXRlOworCisgICAgICAgIGxldCBiOiB1NjQgPSAoKHNlbGYubGVuZ3RoIGFzIHU2NCAmIDB4ZmYpIDw8IDU2KSB8IHNlbGYudGFpbDsKKworICAgICAgICBzdGF0ZS52MyBePSBiOworICAgICAgICBTZWxmOjpjX3JvdW5kcygmbXV0IHN0YXRlKTsKKyAgICAgICAgc3RhdGUudjAgXj0gYjsKKworICAgICAgICBzdGF0ZS52MiBePSAweGZmOworICAgICAgICBTZWxmOjpkX3JvdW5kcygmbXV0IHN0YXRlKTsKKworICAgICAgICBzdGF0ZS52MCBeIHN0YXRlLnYxIF4gc3RhdGUudjIgXiBzdGF0ZS52MworICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgIHVzZSBzdGQ6Omhhc2g6OntIYXNoLCBIYXNoZXJ9OworICAgIHVzZSBzdGQ6OnN0cmluZzo6U3RyaW5nOworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB2YWx1ZSBsaXN0IHNlcmlhbGl6YXRpb24KKyAgICBmbiB0ZXN0X3NpcF9oYXNoMTNfc3RyaW5nX2hhc2goKSB7CisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICAgICAgbGV0IHRlc3Rfc3RyMSA9IFN0cmluZzo6ZnJvbSgiY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QiKTsKKyAgICAgICAgdGVzdF9zdHIxLmhhc2goJm11dCBzaXBfaGFzaDEzKTsKKyAgICAgICAgYXNzZXJ0X2VxISgxNzg5ODgzODY2OTA2NzA2NzU4NSwgc2lwX2hhc2gxMy5maW5pc2goKSk7CisKKyAgICAgICAgbGV0IHRlc3Rfc3RyMiA9IFN0cmluZzo6ZnJvbSgiYWRmYWRmYWRmIGFkZmFmYWRhZGYgMTIzMTI0MTI0MSIpOworICAgICAgICB0ZXN0X3N0cjIuaGFzaCgmbXV0IHNpcF9oYXNoMTMpOworICAgICAgICBhc3NlcnRfZXEhKDEzNTQzNTE4OTg3NjcyODg5MzEwLCBzaXBfaGFzaDEzLmZpbmlzaCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zaXBfaGFzaDEzX3dyaXRlKCkgeworICAgICAgICBsZXQgbXV0IHNpcF9oYXNoMTMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjEgPSBTdHJpbmc6OmZyb20oImNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Iik7CisgICAgICAgIHNpcF9oYXNoMTMud3JpdGUodGVzdF9zdHIxLmFzX2J5dGVzKCkpOworICAgICAgICBzaXBfaGFzaDEzLndyaXRlX3U4KDB4ZmYpOworICAgICAgICBhc3NlcnRfZXEhKDE3ODk4ODM4NjY5MDY3MDY3NTg1LCBzaXBfaGFzaDEzLmZpbmlzaCgpKTsKKworICAgICAgICBsZXQgbXV0IHNpcF9oYXNoMTMyID0gU2lwSGFzaGVyMTM6Om5ldygpOworICAgICAgICBsZXQgdGVzdF9zdHIxID0gU3RyaW5nOjpmcm9tKCJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdCIpOworICAgICAgICBzaXBfaGFzaDEzMi53cml0ZSh0ZXN0X3N0cjEuYXNfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoOTY4NTQ0MDk2OTY4NTIwOTAyNSwgc2lwX2hhc2gxMzIuZmluaXNoKCkpOworICAgICAgICBzaXBfaGFzaDEzMi53cml0ZSh0ZXN0X3N0cjEuYXNfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoNjcxOTY5NDE3NjY2MjczNjU2OCwgc2lwX2hhc2gxMzIuZmluaXNoKCkpOworCisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMzMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjIgPSBTdHJpbmc6OmZyb20oImFiY2RlZmciKTsKKyAgICAgICAgdGVzdF9zdHIyLmhhc2goJm11dCBzaXBfaGFzaDEzMyk7CisgICAgICAgIGFzc2VydF9lcSEoMjQ5MjE2MTA0NzMyNzY0MDI5Nywgc2lwX2hhc2gxMzMuZmluaXNoKCkpOworCisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMzQgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjMgPSBTdHJpbmc6OmZyb20oImFiY2RlZmdoIik7CisgICAgICAgIHRlc3Rfc3RyMy5oYXNoKCZtdXQgc2lwX2hhc2gxMzQpOworICAgICAgICBhc3NlcnRfZXEhKDY2ODk5MjczNzA0MzU1NTQzMjYsIHNpcF9oYXNoMTM0LmZpbmlzaCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zaXBfaGFzaDEzX3dyaXRlX3Nob3J0KCkgeworICAgICAgICBsZXQgbXV0IHNpcF9oYXNoMTMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIHNpcF9oYXNoMTMud3JpdGVfdTgoMHg2MSk7CisgICAgICAgIGFzc2VydF9lcSEoNDY0NDQxNzE4NTYwMzMyODAxOSwgc2lwX2hhc2gxMy5maW5pc2goKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9Cb29sZWFuRmxhZ1ZhbHVlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Jvb2xlYW5GbGFnVmFsdWUuamF2YQpyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKaW5kZXggMTFmZTQ0Ny4uODZhNzVmMiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9Cb29sZWFuRmxhZ1ZhbHVlLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKQEAgLTEsNCArMSwzIEBACi1wYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOwogLyoKICAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgpAQCAtMTUsMTYgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wdWJsaWMgY2xhc3MgQm9vbGVhbkZsYWdWYWx1ZSB7Ci0gICAgcHVibGljIGJvb2xlYW4gbVF1ZXJ5U3VjY2VzczsKLSAgICBwdWJsaWMgU3RyaW5nIG1FcnJvck1lc3NhZ2U7Ci0gICAgcHVibGljIGJvb2xlYW4gbUZsYWdWYWx1ZTsKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CiAKLSAgICBwdWJsaWMgQm9vbGVhbkZsYWdWYWx1ZShib29sZWFuIHF1ZXJ5U3VjY2VzcywKLSAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIG1RdWVyeVN1Y2Nlc3MgPSBxdWVyeVN1Y2Nlc3M7Ci0gICAgICAgIG1FcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0gICAgICAgIG1GbGFnVmFsdWUgPSB2YWx1ZTsKK3B1YmxpYyBjbGFzcyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQnl0ZUJ1ZmZlclJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVhMDgzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJSZWFkZXIgeworCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1CeXRlQnVmZmVyOworCisgICAgcHVibGljIEJ5dGVCdWZmZXJSZWFkZXIoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgICAgIHRoaXMubUJ5dGVCdWZmZXIgPSBieXRlQnVmZmVyOworICAgICAgICB0aGlzLm1CeXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRCeXRlKCkgeworICAgICAgICByZXR1cm4gQnl0ZS50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRTaG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIFNob3J0LnRvVW5zaWduZWRJbnQobUJ5dGVCdWZmZXIuZ2V0U2hvcnQoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkSW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQnl0ZUJ1ZmZlci5nZXRJbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgICAgIGludCBsZW5ndGggPSByZWFkSW50KCk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIG1CeXRlQnVmZmVyLmdldChieXRlcywgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZEJ5dGUoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIEJ5dGUudG9VbnNpZ25lZEludChtQnl0ZUJ1ZmZlci5nZXQoaSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc2l0aW9uKGludCBuZXdQb3NpdGlvbikgeworICAgICAgICBtQnl0ZUJ1ZmZlci5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmlsZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGIxYjliCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBlbnVtIEZpbGVUeXBlIHsKKyAgICBQQUNLQUdFX01BUCgwKSwKKyAgICBGTEFHX01BUCgxKSwKKyAgICBGTEFHX1ZBTCgyKSwKKyAgICBGTEFHX0lORk8oMyk7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7CisKKyAgICBGaWxlVHlwZShpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVR5cGUgZnJvbUludChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBQQUNLQUdFX01BUDsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gRkxBR19NQVA7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMQUdfVkFMOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHJldHVybiBGTEFHX0lORk87CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzhhN2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1RhYmxlLmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK3B1YmxpYyBjbGFzcyBGbGFnVGFibGUgeworCisgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXJSZWFkZXIgbVJlYWRlcjsKKworICAgIHB1YmxpYyBzdGF0aWMgRmxhZ1RhYmxlIGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBuZXcgRmxhZ1RhYmxlKCk7CisgICAgICAgIGZsYWdUYWJsZS5tUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpOworICAgICAgICBmbGFnVGFibGUubUhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMoZmxhZ1RhYmxlLm1SZWFkZXIpOworCisgICAgICAgIHJldHVybiBmbGFnVGFibGU7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0KGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgeworICAgICAgICBpbnQgbnVtQnVja2V0cyA9IChtSGVhZGVyLm1Ob2RlT2Zmc2V0IC0gbUhlYWRlci5tQnVja2V0T2Zmc2V0KSAvIDQ7CisgICAgICAgIGludCBidWNrZXRJbmRleCA9IFRhYmxlVXRpbHMuZ2V0QnVja2V0SW5kZXgobWFrZUtleShwYWNrYWdlSWQsIGZsYWdOYW1lKSwgbnVtQnVja2V0cyk7CisKKyAgICAgICAgbVJlYWRlci5wb3NpdGlvbihtSGVhZGVyLm1CdWNrZXRPZmZzZXQgKyBidWNrZXRJbmRleCAqIDQpOworICAgICAgICBpbnQgbm9kZUluZGV4ID0gbVJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgd2hpbGUgKG5vZGVJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgbVJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMobVJlYWRlcik7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZmxhZ05hbWUsIG5vZGUubUZsYWdOYW1lKSAmJiBwYWNrYWdlSWQgPT0gbm9kZS5tUGFja2FnZUlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlLm1OZXh0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJnZXQgY2Fubm90IGZpbmQgZmxhZzogIiArIGZsYWdOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1ha2VLZXkoaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldC5hcHBlbmQocGFja2FnZUlkKS5hcHBlbmQoJy8nKS5hcHBlbmQoZmxhZ05hbWUpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyIHsKKworICAgICAgICBwcml2YXRlIGludCBtVmVyc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbnRhaW5lcjsKKyAgICAgICAgcHJpdmF0ZSBGaWxlVHlwZSBtRmlsZVR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1GaWxlU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bUZsYWdzOworICAgICAgICBwcml2YXRlIGludCBtQnVja2V0T2Zmc2V0OworICAgICAgICBwcml2YXRlIGludCBtTm9kZU9mZnNldDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgICAgICBoZWFkZXIubVZlcnNpb24gPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Db250YWluZXIgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlVHlwZSA9IEZpbGVUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRCeXRlKCkpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlU2l6ZSA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU51bUZsYWdzID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQnVja2V0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tTm9kZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLkZMQUdfTUFQKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIG1hcCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRhaW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlVHlwZSBnZXRGaWxlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZpbGVTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtRmxhZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCdWNrZXRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1Y2tldE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZU9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm9kZU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUZsYWdOYW1lOworICAgICAgICBwcml2YXRlIEZsYWdUeXBlIG1GbGFnVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VJZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZsYWdJbmRleDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBOb2RlIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbmV3IE5vZGUoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VJZCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1GbGFnTmFtZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBub2RlLm1GbGFnVHlwZSA9IEZsYWdUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRTaG9ydCgpKTsKKyAgICAgICAgICAgIG5vZGUubUZsYWdJbmRleCA9IHJlYWRlci5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IG5vZGUubU5leHRPZmZzZXQgPT0gMCA/IC0xIDogbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1GbGFnTmFtZSwgbUZsYWdUeXBlLCBtUGFja2FnZUlkLCBtRmxhZ0luZGV4LCBtTmV4dE9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBOb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTm9kZSBvdGhlciA9IChOb2RlKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMobUZsYWdOYW1lLCBvdGhlci5tRmxhZ05hbWUpCisgICAgICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKG1GbGFnVHlwZSwgb3RoZXIubUZsYWdUeXBlKQorICAgICAgICAgICAgICAgICAgICAmJiBtUGFja2FnZUlkID09IG90aGVyLm1QYWNrYWdlSWQKKyAgICAgICAgICAgICAgICAgICAgJiYgbUZsYWdJbmRleCA9PSBvdGhlci5tRmxhZ0luZGV4CisgICAgICAgICAgICAgICAgICAgICYmIG1OZXh0T2Zmc2V0ID09IG90aGVyLm1OZXh0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGbGFnTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmxhZ05hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmxhZ1R5cGUgZ2V0RmxhZ1R5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZsYWdUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRQYWNrYWdlSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ0luZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GbGFnSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE5leHRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5leHRPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1R5cGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWUyZDkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1R5cGUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworcHVibGljIGVudW0gRmxhZ1R5cGUgeworICAgIFJlYWRXcml0ZUJvb2xlYW4gKDApLAorICAgIFJlYWRPbmx5Qm9vbGVhbigxKSwKKyAgICBGaXhlZFJlYWRPbmx5Qm9vbGVhbigyKTsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKKworICAgIEZsYWdUeXBlKGludCB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGbGFnVHlwZSBmcm9tSW50KGludCBpbmRleCkgeworICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRXcml0ZUJvb2xlYW47CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRPbmx5Qm9vbGVhbjsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRml4ZWRSZWFkT25seUJvb2xlYW47CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdWYWx1ZUxpc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVmFsdWVMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzNDM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVmFsdWVMaXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitwdWJsaWMgY2xhc3MgRmxhZ1ZhbHVlTGlzdCB7CisKKyAgICBwcml2YXRlIEhlYWRlciBtSGVhZGVyOworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlclJlYWRlciBtUmVhZGVyOworCisgICAgcHVibGljIHN0YXRpYyBGbGFnVmFsdWVMaXN0IGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9IG5ldyBGbGFnVmFsdWVMaXN0KCk7CisgICAgICAgIGZsYWdWYWx1ZUxpc3QubVJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tSGVhZGVyID0gSGVhZGVyLmZyb21CeXRlcyhmbGFnVmFsdWVMaXN0Lm1SZWFkZXIpOworICAgICAgICByZXR1cm4gZmxhZ1ZhbHVlTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkQnl0ZShtSGVhZGVyLm1Cb29sZWFuVmFsdWVPZmZzZXQgKyBpbmRleCkgPT0gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlci5tTnVtRmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG1WZXJzaW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGFpbmVyOworICAgICAgICBwcml2YXRlIEZpbGVUeXBlIG1GaWxlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtTnVtRmxhZ3M7CisgICAgICAgIHByaXZhdGUgaW50IG1Cb29sZWFuVmFsdWVPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICAgICAgaGVhZGVyLm1WZXJzaW9uID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQ29udGFpbmVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVR5cGUgPSBGaWxlVHlwZS5mcm9tSW50KHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVNpemUgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1OdW1GbGFncyA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUJvb2xlYW5WYWx1ZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLkZMQUdfVkFMKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIHZhbHVlIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250YWluZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVR5cGUgZ2V0RmlsZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGaWxlU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bUZsYWdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1GbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qm9vbGVhblZhbHVlT2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Cb29sZWFuVmFsdWVPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczYjg4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworcHVibGljIGNsYXNzIFBhY2thZ2VUYWJsZSB7CisKKyAgICBwcml2YXRlIEhlYWRlciBtSGVhZGVyOworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlclJlYWRlciBtUmVhZGVyOworCisgICAgcHVibGljIHN0YXRpYyBQYWNrYWdlVGFibGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXIgYnl0ZXMpIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9IG5ldyBQYWNrYWdlVGFibGUoKTsKKyAgICAgICAgcGFja2FnZVRhYmxlLm1SZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7CisgICAgICAgIHBhY2thZ2VUYWJsZS5tSGVhZGVyID0gSGVhZGVyLmZyb21CeXRlcyhwYWNrYWdlVGFibGUubVJlYWRlcik7CisKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VUYWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZSBnZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisKKyAgICAgICAgaW50IG51bUJ1Y2tldHMgPSAobUhlYWRlci5tTm9kZU9mZnNldCAtIG1IZWFkZXIubUJ1Y2tldE9mZnNldCkgLyA0OworICAgICAgICBpbnQgYnVja2V0SW5kZXggPSBUYWJsZVV0aWxzLmdldEJ1Y2tldEluZGV4KHBhY2thZ2VOYW1lLmdldEJ5dGVzKFVURl84KSwgbnVtQnVja2V0cyk7CisKKyAgICAgICAgbVJlYWRlci5wb3NpdGlvbihtSGVhZGVyLm1CdWNrZXRPZmZzZXQgKyBidWNrZXRJbmRleCAqIDQpOworICAgICAgICBpbnQgbm9kZUluZGV4ID0gbVJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgd2hpbGUgKG5vZGVJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgbVJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMobVJlYWRlcik7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMocGFja2FnZU5hbWUsIG5vZGUubVBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZUluZGV4ID0gbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigiZ2V0IGNhbm5vdCBmaW5kIHBhY2thZ2U6ICIgKyBwYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIEhlYWRlciBnZXRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBtSGVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyIHsKKworICAgICAgICBwcml2YXRlIGludCBtVmVyc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbnRhaW5lcjsKKyAgICAgICAgcHJpdmF0ZSBGaWxlVHlwZSBtRmlsZVR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1GaWxlU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bVBhY2thZ2VzOworICAgICAgICBwcml2YXRlIGludCBtQnVja2V0T2Zmc2V0OworICAgICAgICBwcml2YXRlIGludCBtTm9kZU9mZnNldDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgICAgICBoZWFkZXIubVZlcnNpb24gPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Db250YWluZXIgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlVHlwZSA9IEZpbGVUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRCeXRlKCkpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlU2l6ZSA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU51bVBhY2thZ2VzID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQnVja2V0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tTm9kZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLlBBQ0tBR0VfTUFQKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBwYWNrYWdlIG1hcCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRhaW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlVHlwZSBnZXRGaWxlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZpbGVTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtUGFja2FnZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bVBhY2thZ2VzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCdWNrZXRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1Y2tldE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZU9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm9kZU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2VOYW1lOworICAgICAgICBwcml2YXRlIGludCBtUGFja2FnZUlkOworICAgICAgICBwcml2YXRlIGludCBtQm9vbGVhblN0YXJ0SW5kZXg7CisgICAgICAgIHByaXZhdGUgaW50IG1OZXh0T2Zmc2V0OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9kZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5ldyBOb2RlKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlTmFtZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlSWQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tQm9vbGVhblN0YXJ0SW5kZXggPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gbm9kZS5tTmV4dE9mZnNldCA9PSAwID8gLTEgOiBub2RlLm1OZXh0T2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVBhY2thZ2VOYW1lLCBtUGFja2FnZUlkLCBtQm9vbGVhblN0YXJ0SW5kZXgsIG1OZXh0T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIE5vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOb2RlIG90aGVyID0gKE5vZGUpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhtUGFja2FnZU5hbWUsIG90aGVyLm1QYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhY2thZ2VJZCA9PSBvdGhlci5tUGFja2FnZUlkCisgICAgICAgICAgICAgICAgICAgICYmIG1Cb29sZWFuU3RhcnRJbmRleCA9PSBvdGhlci5tQm9vbGVhblN0YXJ0SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgJiYgbU5leHRPZmZzZXQgPT0gb3RoZXIubU5leHRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFja2FnZUlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlSWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEJvb2xlYW5TdGFydEluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Cb29sZWFuU3RhcnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmV4dE9mZnNldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TaXBIYXNoZXIxMy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1NpcEhhc2hlcjEzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MTRlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TaXBIYXNoZXIxMy5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworcHVibGljIGNsYXNzIFNpcEhhc2hlcjEzIHsKKyAgICBzdGF0aWMgY2xhc3MgU3RhdGUgeworICAgICAgICBwcml2YXRlIGxvbmcgdjA7CisgICAgICAgIHByaXZhdGUgbG9uZyB2MjsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHYxOworICAgICAgICBwcml2YXRlIGxvbmcgdjM7CisKKyAgICAgICAgcHVibGljIFN0YXRlKGxvbmcgazAsIGxvbmcgazEpIHsKKyAgICAgICAgICAgIHYwID0gazAgXiAweDczNmY2ZDY1NzA3MzY1NzVMOworICAgICAgICAgICAgdjEgPSBrMSBeIDB4NjQ2ZjcyNjE2ZTY0NmY2ZEw7CisgICAgICAgICAgICB2MiA9IGswIF4gMHg2Yzc5Njc2NTZlNjU3MjYxTDsKKyAgICAgICAgICAgIHYzID0gazEgXiAweDc0NjU2NDYyNzk3NDY1NzNMOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29tcHJlc3MobG9uZyBtKSB7CisgICAgICAgICAgICB2MyBePSBtOworICAgICAgICAgICAgY1JvdW5kcygpOworICAgICAgICAgICAgdjAgXj0gbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGZpbmlzaCgpIHsKKyAgICAgICAgICAgIHYyIF49IDB4ZmY7CisgICAgICAgICAgICBkUm91bmRzKCk7CisgICAgICAgICAgICByZXR1cm4gdjAgXiB2MSBeIHYyIF4gdjM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY1JvdW5kcygpIHsKKyAgICAgICAgICAgIHYwICs9IHYxOworICAgICAgICAgICAgdjEgPSBMb25nLnJvdGF0ZUxlZnQodjEsIDEzKTsKKyAgICAgICAgICAgIHYxIF49IHYwOworICAgICAgICAgICAgdjAgPSBMb25nLnJvdGF0ZUxlZnQodjAsIDMyKTsKKyAgICAgICAgICAgIHYyICs9IHYzOworICAgICAgICAgICAgdjMgPSBMb25nLnJvdGF0ZUxlZnQodjMsIDE2KTsKKyAgICAgICAgICAgIHYzIF49IHYyOworICAgICAgICAgICAgdjAgKz0gdjM7CisgICAgICAgICAgICB2MyA9IExvbmcucm90YXRlTGVmdCh2MywgMjEpOworICAgICAgICAgICAgdjMgXj0gdjA7CisgICAgICAgICAgICB2MiArPSB2MTsKKyAgICAgICAgICAgIHYxID0gTG9uZy5yb3RhdGVMZWZ0KHYxLCAxNyk7CisgICAgICAgICAgICB2MSBePSB2MjsKKyAgICAgICAgICAgIHYyID0gTG9uZy5yb3RhdGVMZWZ0KHYyLCAzMik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZFJvdW5kcygpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgdjAgKz0gdjE7CisgICAgICAgICAgICAgICAgdjEgPSBMb25nLnJvdGF0ZUxlZnQodjEsIDEzKTsKKyAgICAgICAgICAgICAgICB2MSBePSB2MDsKKyAgICAgICAgICAgICAgICB2MCA9IExvbmcucm90YXRlTGVmdCh2MCwgMzIpOworICAgICAgICAgICAgICAgIHYyICs9IHYzOworICAgICAgICAgICAgICAgIHYzID0gTG9uZy5yb3RhdGVMZWZ0KHYzLCAxNik7CisgICAgICAgICAgICAgICAgdjMgXj0gdjI7CisgICAgICAgICAgICAgICAgdjAgKz0gdjM7CisgICAgICAgICAgICAgICAgdjMgPSBMb25nLnJvdGF0ZUxlZnQodjMsIDIxKTsKKyAgICAgICAgICAgICAgICB2MyBePSB2MDsKKyAgICAgICAgICAgICAgICB2MiArPSB2MTsKKyAgICAgICAgICAgICAgICB2MSA9IExvbmcucm90YXRlTGVmdCh2MSwgMTcpOworICAgICAgICAgICAgICAgIHYxIF49IHYyOworICAgICAgICAgICAgICAgIHYyID0gTG9uZy5yb3RhdGVMZWZ0KHYyLCAzMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgaGFzaChieXRlW10gZGF0YSkgeworICAgICAgICBTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgwLCAwKTsKKyAgICAgICAgaW50IGxlbiA9IGRhdGEubGVuZ3RoOworICAgICAgICBpbnQgbGVmdCA9IGxlbiAmIDB4NzsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW4gLSBsZWZ0KSB7CisgICAgICAgICAgICBsb25nIG1pID0gbG9hZExlKGRhdGEsIGluZGV4LCA4KTsKKyAgICAgICAgICAgIGluZGV4ICs9IDg7CisgICAgICAgICAgICBzdGF0ZS5jb21wcmVzcyhtaSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYWRkaW5nIHRoZSBlbmQgd2l0aCAweGZmIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBydXN0CisgICAgICAgIGxvbmcgbSA9ICgweGZmTCA8PCAobGVmdCAqIDgpKSB8IGxvYWRMZShkYXRhLCBpbmRleCwgbGVmdCk7CisgICAgICAgIGlmIChsZWZ0ID09IDB4NykgeworICAgICAgICAgICAgLy8gY29tcHJlc3MgdGhlIG0gdy0yCisgICAgICAgICAgICBzdGF0ZS5jb21wcmVzcyhtKTsKKyAgICAgICAgICAgIG0gPSAwTDsKKyAgICAgICAgfQorICAgICAgICAvLyBsZW4gYWRkcyAxIHNpbmNlIHBhZGRlZCAweGZmCisgICAgICAgIG0gfD0gKCgobGVuICsgMSkgJiAweGZmTCkgPDwgNTYpOworICAgICAgICBzdGF0ZS5jb21wcmVzcyhtKTsKKworICAgICAgICByZXR1cm4gc3RhdGUuZmluaXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb2FkTGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBzaXplKSB7CisgICAgICAgIGxvbmcgbSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBtIHw9IChkYXRhW2kgKyBvZmZzZXRdICYgMHhmZkwpIDw8IChpICogOCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExNjhmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBjbGFzcyBUYWJsZVV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEhBU0hfUFJJTUVTID0KKyAgICAgICAgICAgIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgNywKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICAyOSwKKyAgICAgICAgICAgICAgICA1MywKKyAgICAgICAgICAgICAgICA5NywKKyAgICAgICAgICAgICAgICAxOTMsCisgICAgICAgICAgICAgICAgMzg5LAorICAgICAgICAgICAgICAgIDc2OSwKKyAgICAgICAgICAgICAgICAxNTQzLAorICAgICAgICAgICAgICAgIDMwNzksCisgICAgICAgICAgICAgICAgNjE1MSwKKyAgICAgICAgICAgICAgICAxMjI4OSwKKyAgICAgICAgICAgICAgICAyNDU5MywKKyAgICAgICAgICAgICAgICA0OTE1NywKKyAgICAgICAgICAgICAgICA5ODMxNywKKyAgICAgICAgICAgICAgICAxOTY2MTMsCisgICAgICAgICAgICAgICAgMzkzMjQxLAorICAgICAgICAgICAgICAgIDc4NjQzMywKKyAgICAgICAgICAgICAgICAxNTcyODY5LAorICAgICAgICAgICAgICAgIDMxNDU3MzksCisgICAgICAgICAgICAgICAgNjI5MTQ2OSwKKyAgICAgICAgICAgICAgICAxMjU4MjkxNywKKyAgICAgICAgICAgICAgICAyNTE2NTg0MywKKyAgICAgICAgICAgICAgICA1MDMzMTY1MywKKyAgICAgICAgICAgICAgICAxMDA2NjMzMTksCisgICAgICAgICAgICAgICAgMjAxMzI2NjExLAorICAgICAgICAgICAgICAgIDQwMjY1MzE4OSwKKyAgICAgICAgICAgICAgICA4MDUzMDY0NTcsCisgICAgICAgICAgICAgICAgMTYxMDYxMjc0MQorICAgICAgICAgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRhYmxlU2l6ZShpbnQgbnVtRW50cmllcykgeworICAgICAgICBmb3IgKGludCBpIDogSEFTSF9QUklNRVMpIHsKKyAgICAgICAgICAgIGlmIChpIDwgMiAqIG51bUVudHJpZXMpIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJOdW1iZXIgb2YgaXRlbXMgaW4gYSBoYXNoIHRhYmxlIGV4Y2VlZHMgbGltaXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRCdWNrZXRJbmRleChieXRlW10gdmFsLCBpbnQgbnVtQnVja2V0cykgeworICAgICAgICBsb25nIGhhc2hWYWwgPSBTaXBIYXNoZXIxMy5oYXNoKHZhbCk7CisgICAgICAgIHJldHVybiAoaW50KSBMb25nLnJlbWFpbmRlclVuc2lnbmVkKGhhc2hWYWwsIG51bUJ1Y2tldHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icAppbmRleCAyNmI3ODAwLi4xMmU0YWNhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMyBAQAotCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5jcHAiLAogICAgIHRlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NvcmVfZXhwZXJpbWVudHMiLApAQCAtMjEsMyArMjAsMjggQEAKICAgICAgICAgImdlbmVyYWwtdGVzdHMiLAogICAgIF0sCiB9CisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuamF2YSIsCisgICAgdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICAgICAgImp1bml0IiwKKyAgICAgICAgImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAorICAgIF0sCisgICAgdGVzdF9jb25maWc6ICJBbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbCIsCisgICAgc2RrX3ZlcnNpb246ICJ0ZXN0X2N1cnJlbnQiLAorICAgIGRhdGE6IFsKKyAgICAgICAgInBhY2thZ2UubWFwIiwKKyAgICAgICAgImZsYWcubWFwIiwKKyAgICAgICAgImZsYWcudmFsIiwKKyAgICAgICAgImZsYWcuaW5mbyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKKyAgICBqYXJqYXJfcnVsZXM6ICJqYXJqYXIudHh0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAxODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiPgorICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDUyZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IGFjb25maWcgc3RvcmFnZSBqYXZhIHRlc3RzIj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5qYXZhLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwYWNrYWdlLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9wYWNrYWdlLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZy5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvZmxhZy5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWcudmFsLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcudmFsIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnLmluZm8tPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvZmxhZy5pbmZvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvamFyamFyLnR4dCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvamFyamFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmMxN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9qYXJqYXIudHh0CkBAIC0wLDAgKzEsMTUgQEAKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbgorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GbGFnVGFibGUKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGFja2FnZVRhYmxlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkJ5dGVCdWZmZXJSZWFkZXIgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5CeXRlQnVmZmVyUmVhZGVyCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUeXBlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1R5cGUKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTMgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5TaXBIYXNoZXIxMworcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZpbGVUeXBlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3QgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GbGFnVmFsdWVMaXN0CitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlRhYmxlVXRpbHMgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5UYWJsZVV0aWxzCisKKworcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGUkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdUYWJsZSRAMQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGUkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlBhY2thZ2VUYWJsZSRAMQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0JCogYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GbGFnVmFsdWVMaXN0QDEKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTMkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlNpcEhhc2hlcjEzQDEKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9CeXRlQnVmZmVyUmVhZGVyVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0J5dGVCdWZmZXJSZWFkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhODE2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9CeXRlQnVmZmVyUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5CeXRlQnVmZmVyUmVhZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJSZWFkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlKCkgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSk7CisgICAgICAgIGJ5dGUgZXhwZWN0ID0gMTA7CisgICAgICAgIGJ1ZmZlci5wdXQoZXhwZWN0KS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU2hvcnQoKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgc2hvcnQgZXhwZWN0ID0gU2hvcnQuTUFYX1ZBTFVFOworICAgICAgICBidWZmZXIucHV0U2hvcnQoZXhwZWN0KS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkU2hvcnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEludCgpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOworICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICBpbnQgZXhwZWN0ID0gMTAwMDA7CisgICAgICAgIGJ1ZmZlci5wdXRJbnQoZXhwZWN0KS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkSW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBleHBlY3QgPSAidGVzdCByZWFkIHN0cmluZyI7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IGV4cGVjdC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZXhwZWN0Lmxlbmd0aCgpICogMiArIDQpOworICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICBidWZmZXIucHV0SW50KGV4cGVjdC5sZW5ndGgoKSkucHV0KGJ5dGVzKS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdCwgcmVhZGVyLnJlYWRTdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdUYWJsZVRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0MGQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1R5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRmxhZ1RhYmxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIEZsYWdUYWJsZS5IZWFkZXIgaGVhZGVyID0gZmxhZ1RhYmxlLmdldEhlYWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVUeXBlLkZMQUdfTUFQLCBoZWFkZXIuZ2V0RmlsZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMjEsIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGhlYWRlci5nZXROdW1GbGFncygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMxLCBoZWFkZXIuZ2V0QnVja2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTksIGhlYWRlci5nZXROb2RlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdUYWJsZV9yaWdodE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSk7CisKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTEgPSBmbGFnVGFibGUuZ2V0KDAsICJlbmFibGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGUyID0gZmxhZ1RhYmxlLmdldCgwLCAiZW5hYmxlZF9ydyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlMyA9IGZsYWdUYWJsZS5nZXQoMiwgImVuYWJsZWRfcnciKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTQgPSBmbGFnVGFibGUuZ2V0KDEsICJkaXNhYmxlZF9ydyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlNSA9IGZsYWdUYWJsZS5nZXQoMSwgImVuYWJsZWRfZml4ZWRfcm8iKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTYgPSBmbGFnVGFibGUuZ2V0KDEsICJlbmFibGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGU3ID0gZmxhZ1RhYmxlLmdldCgyLCAiZW5hYmxlZF9maXhlZF9ybyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlOCA9IGZsYWdUYWJsZS5nZXQoMCwgImRpc2FibGVkX3J3Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3JvIiwgbm9kZTEuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9ydyIsIG5vZGUyLmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfcnciLCBub2RlMy5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXNhYmxlZF9ydyIsIG5vZGU0LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfZml4ZWRfcm8iLCBub2RlNS5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3JvIiwgbm9kZTYuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9maXhlZF9ybyIsIG5vZGU3LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpc2FibGVkX3J3Iiwgbm9kZTguZ2V0RmxhZ05hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUxLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUyLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUzLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU0LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU1LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU2LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU3LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGU4LmdldFBhY2thZ2VJZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZE9ubHlCb29sZWFuLCBub2RlMS5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRXcml0ZUJvb2xlYW4sIG5vZGUyLmdldEZsYWdUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgbm9kZTMuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlNC5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLkZpeGVkUmVhZE9ubHlCb29sZWFuLCBub2RlNS5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRPbmx5Qm9vbGVhbiwgbm9kZTYuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5GaXhlZFJlYWRPbmx5Qm9vbGVhbiwgbm9kZTcuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlOC5nZXRGbGFnVHlwZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTEuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTIuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTMuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTQuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTUuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTYuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTcuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTguZ2V0RmxhZ0luZGV4KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1MSwgbm9kZTIuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMy5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMzYsIG5vZGU1LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTYuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNy5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU4LmdldE5leHRPZmZzZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1ZhbHVlTGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjBkZTYzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZsYWdWYWx1ZUxpc3RUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdWYWx1ZUxpc3RfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0KKyAgICAgICAgICAgICAgICBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdC5IZWFkZXIgaGVhZGVyID0gZmxhZ1ZhbHVlTGlzdC5nZXRIZWFkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlci5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vY2t1cCIsIGhlYWRlci5nZXRDb250YWluZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlVHlwZS5GTEFHX1ZBTCwgaGVhZGVyLmdldEZpbGVUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzUsIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGhlYWRlci5nZXROdW1GbGFncygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBoZWFkZXIuZ2V0Qm9vbGVhblZhbHVlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdWYWx1ZUxpc3RfcmlnaHROb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisKKyAgICAgICAgYm9vbGVhbltdIGV4cGVjdGVkID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgZmxhZ1ZhbHVlTGlzdC5zaXplKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ1ZhbHVlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCBmbGFnVmFsdWVMaXN0LmdldEJvb2xlYW4oaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1ZhbHVlTGlzdF9nZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkpOworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpKTsKKworICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QgPQorICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKCkpOworCisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBmTm9kZSA9IGZsYWdUYWJsZS5nZXQocE5vZGUuZ2V0UGFja2FnZUlkKCksICJlbmFibGVkX3J3Iik7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCkgKyBmTm9kZS5nZXRGbGFnSW5kZXgoKSkpOworCisgICAgICAgIHBOb2RlID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworICAgICAgICBmTm9kZSA9IGZsYWdUYWJsZS5nZXQocE5vZGUuZ2V0UGFja2FnZUlkKCksICJlbmFibGVkX2ZpeGVkX3JvIik7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCkgKyBmTm9kZS5nZXRGbGFnSW5kZXgoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTE5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGFja2FnZVRhYmxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBwYWNrYWdlVGFibGUuZ2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVR5cGUuUEFDS0FHRV9NQVAsIGhlYWRlci5nZXRGaWxlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwOSwgaGVhZGVyLmdldEZpbGVTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaGVhZGVyLmdldE51bVBhY2thZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzEsIGhlYWRlci5nZXRCdWNrZXRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1OSwgaGVhZGVyLmdldE5vZGVPZmZzZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkpOworCisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUxID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMiA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTQgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgbm9kZTEuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsIG5vZGUyLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCBub2RlNC5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTIuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTQuZ2V0UGFja2FnZUlkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlMS5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5vZGUyLmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgbm9kZTQuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1OSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMi5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1NpcEhhc2hlcjEzVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1NpcEhhc2hlcjEzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjIwZDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvU2lwSGFzaGVyMTNUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2lwSGFzaGVyMTNUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaXBIYXNoX2hhc2hTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRlc3RTdHIgPSAiY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QiOworICAgICAgICBsb25nIHJlc3VsdCA9IFNpcEhhc2hlcjEzLmhhc2godGVzdFN0ci5nZXRCeXRlcyhVVEZfOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhGODY1NzJFRkY5QzRBMEMxTCwgcmVzdWx0KTsKKworICAgICAgICB0ZXN0U3RyID0gImFiY2RlZmciOworICAgICAgICByZXN1bHQgPSBTaXBIYXNoZXIxMy5oYXNoKHRlc3RTdHIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MjI5NUVGNDRCRDA3OEFFOUwsIHJlc3VsdCk7CisKKyAgICAgICAgdGVzdFN0ciA9ICJhYmNkZWZnaCI7CisgICAgICAgIHJlc3VsdCA9IFNpcEhhc2hlcjEzLmhhc2godGVzdFN0ci5nZXRCeXRlcyhVVEZfOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHg1Q0Q3NjU3RkE3Rjk2QzE2TCwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvVGVzdERhdGFVdGlscy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1Rlc3REYXRhVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU5NTJkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1Rlc3REYXRhVXRpbHMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgVGVzdERhdGFVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFDS0FHRV9NQVBfUEFUSCA9ICJwYWNrYWdlLm1hcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkxBR19NQVBfUEFUSCA9ICJmbGFnLm1hcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkxBR19WQUxfUEFUSCA9ICJmbGFnLnZhbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkxBR19JTkZPX1BBVEggPSAiZmxhZy5pbmZvIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUREFUQV9QQVRIID0KKyAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhLyI7CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9QQUNLQUdFX01BUF9QQVRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9GTEFHX01BUF9QQVRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9GTEFHX1ZBTF9QQVRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdJbmZvQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfRkxBR19JTkZPX1BBVEgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgcmVhZEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChpbnB1dC5yZWFkQWxsQnl0ZXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAKaW5kZXggM2IxMjRiMS4uZjk2YjIyMyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwCkBAIC04Nyw2ICs4Nyw5IEBACiAgICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfY29kZSJdLAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jeHhfYnJpZGdlIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgIF0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBwcm9kdWN0X2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTEwNCw2ICsxMDcsMzMgQEAKICAgICBhZmRvOiB0cnVlLAogfQogCitzb29uZ19jb25maWdfbW9kdWxlX3R5cGUgeworICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGlua19kZWZhdWx0cyIsCisgICAgbW9kdWxlX3R5cGU6ICJjY19kZWZhdWx0cyIsCisgICAgY29uZmlnX25hbWVzcGFjZTogIkFjb25maWciLAorICAgIGJvb2xfdmFyaWFibGVzOiBbCisgICAgICAgICJyZWFkX2Zyb21fbmV3X3N0b3JhZ2UiLAorICAgIF0sCisgICAgcHJvcGVydGllczogWworICAgICAgICAic2hhcmVkX2xpYnMiLAorICAgIF0sCit9CisKK3Nvb25nX2NvbmZpZ19ib29sX3ZhcmlhYmxlIHsKKyAgICBuYW1lOiAicmVhZF9mcm9tX25ld19zdG9yYWdlIiwKK30KKworYWNvbmZpZ19saWJfY2Nfc2hhcmVkX2xpbmtfZGVmYXVsdHMgeworICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGluay5kZWZhdWx0cyIsCisgICAgc29vbmdfY29uZmlnX3ZhcmlhYmxlczogeworICAgICAgICByZWFkX2Zyb21fbmV3X3N0b3JhZ2U6IHsKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYyIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiYWNvbmZpZ19saWJfY2Nfc3RhdGljX2xpbmsuZGVmYXVsdHMiLAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0xMTcsNiArMTQ3LDcgQEAKICAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIiwKICAgICBzcmNzOiBbInNyY3MvbGliLnJzIl0sCiAgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9maWxlIiwKICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCiAgICAgICAgICJsaWJhbnlob3ciLAogICAgICAgICAibGliam5pIiwKQEAgLTEyNyw3ICsxNTgsOSBAQAogamF2YV9saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2phdmEiLAogICAgIHNyY3M6IFsKLSAgICAgICAgInNyY3MvKiovKi5qYXZhIiwKKyAgICAgICAgInNyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEiLAorICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnUmVhZENvbnRleHQuamF2YSIsCisgICAgICAgICJzcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VSZWFkQ29udGV4dC5qYXZhIiwKICAgICBdLAogICAgIHJlcXVpcmVkOiBbImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9ydXN0X2puaSJdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIlVwc2lkZURvd25DYWtlIiwKQEAgLTEzNiwzICsxNjksNDEgQEAKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAogICAgIF0sCiB9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkZXJfamF2YSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJ1bnN1cHBvcnRlZGFwcHVzYWdlIiwKKyAgICAgICAgInN0cmljdF9tb2RlX3N0dWIiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgIF0sCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkZXJfamF2YV9ub25lIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhIiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgInVuc3VwcG9ydGVkYXBwdXNhZ2Utc2RrLW5vbmUiLAorICAgICAgICAiZmFrZV9kZXZpY2VfY29uZmlnIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhX25vbmUiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJub25lIiwKKyAgICBzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuY3BwCmluZGV4IDk3YWRhM2EuLjhlMGM0ZTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmNwcApAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC01OSwyMiArNjAsMjIgQEAKIAogLy8vIE1hcCBhIHN0b3JhZ2UgZmlsZQogUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gbWFwX3N0b3JhZ2VfZmlsZShzdGQ6OnN0cmluZyBjb25zdCYgZmlsZSkgewotICBpbnQgZmQgPSBvcGVuKGZpbGUuY19zdHIoKSwgT19DTE9FWEVDIHwgT19OT0ZPTExPVyB8IE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKSB7CisgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCB1ZmQob3BlbihmaWxlLmNfc3RyKCksIE9fQ0xPRVhFQyB8IE9fTk9GT0xMT1cgfCBPX1JET05MWSkpOworICBpZiAodWZkLmdldCgpID09IC0xKSB7CiAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPigpOwogICAgIHJlc3VsdC5lcnJtc2cgPSBzdGQ6OnN0cmluZygiZmFpbGVkIHRvIG9wZW4gIikgKyBmaWxlICsgIjogIiArIHN0cmVycm9yKGVycm5vKTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9OwogCiAgIHN0cnVjdCBzdGF0IGZkX3N0YXQ7Ci0gIGlmIChmc3RhdChmZCwgJmZkX3N0YXQpIDwgMCkgeworICBpZiAoZnN0YXQodWZkLmdldCgpLCAmZmRfc3RhdCkgPCAwKSB7CiAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPigpOwogICAgIHJlc3VsdC5lcnJtc2cgPSBzdGQ6OnN0cmluZygiZnN0YXQgZmFpbGVkOiAiKSArIHN0cmVycm9yKGVycm5vKTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAgIHNpemVfdCBmaWxlX3NpemUgPSBmZF9zdGF0LnN0X3NpemU7CiAKLSAgdm9pZCogY29uc3QgbWFwX3Jlc3VsdCA9IG1tYXAobnVsbHB0ciwgZmlsZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgdm9pZCogY29uc3QgbWFwX3Jlc3VsdCA9IG1tYXAobnVsbHB0ciwgZmlsZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIHVmZC5nZXQoKSwgMCk7CiAgIGlmIChtYXBfcmVzdWx0ID09IE1BUF9GQUlMRUQpIHsKICAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+KCk7CiAgICAgcmVzdWx0LmVycm1zZyA9IHN0ZDo6c3RyaW5nKCJtbWFwIGZhaWxlZDogIikgKyBzdHJlcnJvcihlcnJubyk7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2xpYi5ycwppbmRleCA2MWY5ZTk2Li5kNzZjZjNmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9saWIucnMKQEAgLTUzLDcgKzUzLDcgQEAKIHVzZSBwYWNrYWdlX3RhYmxlX3F1ZXJ5OjpmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0OwogCiB1c2UgYW55aG93Ojphbnlob3c7Ci11c2UgbWVtbWFwMjo6TW1hcDsKK3B1YiB1c2UgbWVtbWFwMjo6TW1hcDsKIHVzZSBzdGQ6OmZzOjpGaWxlOwogdXNlIHN0ZDo6aW86OlJlYWQ7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlUmVhZEFQSS5qYXZhCmluZGV4IDc3NDZiNTguLjg1MGMyYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZVJlYWRBUEkuamF2YQpAQCAtMTYsMTggKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5vcHRpbWl6YXRpb24uRmFzdE5hdGl2ZTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiBpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlOwotCi1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVJlYWRDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5Cb29sZWFuRmxhZ1ZhbHVlOwotCi1pbXBvcnQgZGFsdmlrLmFubm90YXRpb24ub3B0aW1pemF0aW9uLkZhc3ROYXRpdmU7CiAKIHB1YmxpYyBjbGFzcyBBY29uZmlnU3RvcmFnZVJlYWRBUEkgewogCkBAIC01MCw5ICs0Niw4IEBACiAgICAgfQogCiAgICAgLy8gTWFwIGEgc3RvcmFnZSBmaWxlIGdpdmVuIGNvbnRhaW5lciBhbmQgZmlsZSB0eXBlCi0gICAgcHVibGljIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIGdldE1hcHBlZEZpbGUoCi0gICAgICAgIFN0cmluZyBjb250YWluZXIsCi0gICAgICAgIFN0b3JhZ2VGaWxlVHlwZSB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgcHVibGljIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIGdldE1hcHBlZEZpbGUoU3RyaW5nIGNvbnRhaW5lciwgU3RvcmFnZUZpbGVUeXBlIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgUEFDS0FHRV9NQVA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcFN0b3JhZ2VGaWxlKFNUT1JBR0VESVIgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiKTsKQEAgLTY4LDE5ICs2Myw1OCBAQAogICAgIH0KIAogICAgIC8vIEpOSSBpbnRlcmZhY2UgdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0CisgICAgLy8gQHBhcmFtIG1hcHBlZEZpbGU6IG1lbW9yeSBtYXBwZWQgcGFja2FnZSBtYXAgZmlsZQorICAgIC8vIEBwYXJhbSBwYWNrYWdlTmFtZTogcGFja2FnZSBuYW1lCisgICAgLy8gQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgcGFzc2VkIGluIGZpbGUgaXMgbm90IGEgdmFsaWQgcGFja2FnZSBtYXAgZmlsZQogICAgIEBGYXN0TmF0aXZlCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgUGFja2FnZVJlYWRDb250ZXh0IGdldFBhY2thZ2VSZWFkQ29udGV4dCgKLSAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCeXRlQnVmZmVyIGdldFBhY2thZ2VSZWFkQ29udGV4dEltcGwoCisgICAgICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLy8gQVBJIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZU5hbWU6IHBhY2thZ2UgbmFtZQorICAgIC8vIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmaWxlIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICBwdWJsaWMgc3RhdGljIFBhY2thZ2VSZWFkQ29udGV4dCBnZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBnZXRQYWNrYWdlUmVhZENvbnRleHRJbXBsKG1hcHBlZEZpbGUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWNrYWdlUmVhZENvbnRleHQoYnVmZmVyLmdldEludCgpLCBidWZmZXIuZ2V0SW50KDQpKTsKKyAgICB9CiAKICAgICAvLyBKTkkgaW50ZXJmYWNlIHRvIGdldCBmbGFnIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIGZsYWcgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZUlkOiBwYWNrYWdlIGlkIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIHBhY2thZ2UsIG9idGFpbmVkIGZyb20KKyAgICAvLyBwYWNrYWdlIG1hcCBmaWxlCisgICAgLy8gQHBhcmFtIGZsYWdOYW1lOiBmbGFnIG5hbWUKKyAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBmbGFnIG1hcCBmaWxlCiAgICAgQEZhc3ROYXRpdmUKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBGbGFnUmVhZENvbnRleHQgZ2V0RmxhZ1JlYWRDb250ZXh0KAotICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEJ5dGVCdWZmZXIgZ2V0RmxhZ1JlYWRDb250ZXh0SW1wbCgKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgbWFwcGVkRmlsZSwgaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvLyBBUEkgdG8gZ2V0IGZsYWcgcmVhZCBjb250ZXh0CisgICAgLy8gQHBhcmFtIG1hcHBlZEZpbGU6IG1lbW9yeSBtYXBwZWQgZmxhZyBtYXAgZmlsZQorICAgIC8vIEBwYXJhbSBwYWNrYWdlSWQ6IHBhY2thZ2UgaWQgdG8gcmVwcmVzZW50IGEgc3BlY2lmaWMgcGFja2FnZSwgb2J0YWluZWQgZnJvbQorICAgIC8vIHBhY2thZ2UgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gZmxhZ05hbWU6IGZsYWcgbmFtZQorICAgIC8vIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmaWxlIGlzIG5vdCBhIHZhbGlkIGZsYWcgbWFwIGZpbGUKKyAgICBwdWJsaWMgc3RhdGljIEZsYWdSZWFkQ29udGV4dCBnZXRGbGFnUmVhZENvbnRleHQoCisgICAgICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBnZXRGbGFnUmVhZENvbnRleHRJbXBsKG1hcHBlZEZpbGUsIHBhY2thZ2VJZCwgZmxhZ05hbWUpOworICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICByZXR1cm4gbmV3IEZsYWdSZWFkQ29udGV4dChidWZmZXIuZ2V0SW50KCksIGJ1ZmZlci5nZXRJbnQoNCkpOworICAgIH0KIAogICAgIC8vIEpOSSBpbnRlcmZhY2UgdG8gZ2V0IGJvb2xlYW4gZmxhZyB2YWx1ZQorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIGZsYWcgdmFsdWUgZmlsZQorICAgIC8vIEBwYXJhbSBmbGFnSW5kZXg6IGZsYWcgZ2xvYmFsIGluZGV4IGluIHRoZSBmbGFnIHZhbHVlIGFycmF5CisgICAgLy8gQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgcGFzc2VkIGluIGZpbGUgaXMgbm90IGEgdmFsaWQgZmxhZyB2YWx1ZSBmaWxlIG9yIHRoZQorICAgIC8vIGZsYWcgaW5kZXggd2VudCBvdmVyIHRoZSBmaWxlIGJvdW5kYXJ5LgogICAgIEBGYXN0TmF0aXZlCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgQm9vbGVhbkZsYWdWYWx1ZSBnZXRCb29sZWFuRmxhZ1ZhbHVlKAotICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBmbGFnSW5kZXgpOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBmbGFnSW5kZXgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBARmFzdE5hdGl2ZQorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgaGFzaChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIik7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdSZWFkQ29udGV4dC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnUmVhZENvbnRleHQuamF2YQppbmRleCA1N2EzNmNhLi42MDU1OWE5IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdSZWFkQ29udGV4dC5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1JlYWRDb250ZXh0LmphdmEKQEAgLTE2LDIwICsxNiwxMSBAQAogICovCiAKIHB1YmxpYyBjbGFzcyBGbGFnUmVhZENvbnRleHQgewotICAgIHB1YmxpYyBib29sZWFuIG1RdWVyeVN1Y2Nlc3M7Ci0gICAgcHVibGljIFN0cmluZyBtRXJyb3JNZXNzYWdlOwotICAgIHB1YmxpYyBib29sZWFuIG1GbGFnRXhpc3RzOwogICAgIHB1YmxpYyBTdG9yZWRGbGFnVHlwZSBtRmxhZ1R5cGU7CiAgICAgcHVibGljIGludCBtRmxhZ0luZGV4OwogCi0gICAgcHVibGljIEZsYWdSZWFkQ29udGV4dChib29sZWFuIHF1ZXJ5U3VjY2VzcywKLSAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICBib29sZWFuIGZsYWdFeGlzdHMsCi0gICAgICAgICAgICBpbnQgZmxhZ1R5cGUsCisgICAgcHVibGljIEZsYWdSZWFkQ29udGV4dChpbnQgZmxhZ1R5cGUsCiAgICAgICAgICAgICBpbnQgZmxhZ0luZGV4KSB7Ci0gICAgICAgIG1RdWVyeVN1Y2Nlc3MgPSBxdWVyeVN1Y2Nlc3M7Ci0gICAgICAgIG1FcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0gICAgICAgIG1GbGFnRXhpc3RzID0gZmxhZ0V4aXN0czsKICAgICAgICAgbUZsYWdUeXBlID0gU3RvcmVkRmxhZ1R5cGUuZnJvbUludGVnZXIoZmxhZ1R5cGUpOwogICAgICAgICBtRmxhZ0luZGV4ID0gZmxhZ0luZGV4OwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVJlYWRDb250ZXh0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VSZWFkQ29udGV4dC5qYXZhCmluZGV4IDYwZDZiNjYuLmI3ODFkOWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVJlYWRDb250ZXh0LmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlUmVhZENvbnRleHQuamF2YQpAQCAtMTYsMjAgKzE2LDExIEBACiAgKi8KIAogcHVibGljIGNsYXNzIFBhY2thZ2VSZWFkQ29udGV4dCB7Ci0gICAgcHVibGljIGJvb2xlYW4gbVF1ZXJ5U3VjY2VzczsKLSAgICBwdWJsaWMgU3RyaW5nIG1FcnJvck1lc3NhZ2U7Ci0gICAgcHVibGljIGJvb2xlYW4gbVBhY2thZ2VFeGlzdHM7CiAgICAgcHVibGljIGludCBtUGFja2FnZUlkOwogICAgIHB1YmxpYyBpbnQgbUJvb2xlYW5TdGFydEluZGV4OwogCi0gICAgcHVibGljIFBhY2thZ2VSZWFkQ29udGV4dChib29sZWFuIHF1ZXJ5U3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhY2thZ2VFeGlzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFja2FnZUlkLAorICAgIHB1YmxpYyBQYWNrYWdlUmVhZENvbnRleHQoaW50IHBhY2thZ2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib29sZWFuU3RhcnRJbmRleCkgewotICAgICAgICBtUXVlcnlTdWNjZXNzID0gcXVlcnlTdWNjZXNzOwotICAgICAgICBtRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotICAgICAgICBtUGFja2FnZUV4aXN0cyA9IHBhY2thZ2VFeGlzdHM7CiAgICAgICAgIG1QYWNrYWdlSWQgPSBwYWNrYWdlSWQ7CiAgICAgICAgIG1Cb29sZWFuU3RhcnRJbmRleCA9IGJvb2xlYW5TdGFydEluZGV4OwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU3RvcmFnZUludGVybmFsUmVhZGVyLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWJlZTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKKworLyoqIEBoaWRlICovCitwdWJsaWMgY2xhc3MgU3RvcmFnZUludGVybmFsUmVhZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9tYXBzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1RfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9ib290LyI7CisKKyAgICBwcml2YXRlIFBhY2thZ2VUYWJsZSBtUGFja2FnZVRhYmxlOworICAgIHByaXZhdGUgRmxhZ1ZhbHVlTGlzdCBtRmxhZ1ZhbHVlTGlzdDsKKworICAgIHByaXZhdGUgaW50IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0OworCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgU3RvcmFnZUludGVybmFsUmVhZGVyKFN0cmluZyBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0aGlzKHBhY2thZ2VOYW1lLCBNQVBfUEFUSCArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiLCBCT09UX1BBVEggKyBjb250YWluZXIgKyAiLnZhbCIpOworICAgIH0KKworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIFN0b3JhZ2VJbnRlcm5hbFJlYWRlcihTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBwYWNrYWdlTWFwRmlsZSwgU3RyaW5nIGZsYWdWYWx1ZUZpbGUpIHsKKyAgICAgICAgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kgb2xkUG9saWN5ID0gU3RyaWN0TW9kZS5hbGxvd1RocmVhZERpc2tSZWFkcygpOworICAgICAgICBtUGFja2FnZVRhYmxlID0gUGFja2FnZVRhYmxlLmZyb21CeXRlcyhtYXBTdG9yYWdlRmlsZShwYWNrYWdlTWFwRmlsZSkpOworICAgICAgICBtRmxhZ1ZhbHVlTGlzdCA9IEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKGZsYWdWYWx1ZUZpbGUpKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3kob2xkUG9saWN5KTsKKyAgICAgICAgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQgPSBnZXRQYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIGluZGV4ICs9IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0OworICAgICAgICBpZiAoaW5kZXggPj0gbUZsYWdWYWx1ZUxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oIkZhaWwgdG8gZ2V0IGJvb2xlYW4gZmxhZyB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKGluZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRQYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IG1QYWNrYWdlVGFibGUuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgaWYgKHBOb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5IZWFkZXIgaGVhZGVyID0gbVBhY2thZ2VUYWJsZS5nZXRIZWFkZXIoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBnZXQgcGFja2FnZSAlcyBmcm9tIGNvbnRhaW5lciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIGhlYWRlci5nZXRDb250YWluZXIoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpOworICAgIH0KKworICAgIC8vIE1hcCBhIHN0b3JhZ2UgZmlsZSBnaXZlbiBmaWxlIHBhdGgKKyAgICBwcml2YXRlIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcFN0b3JhZ2VGaWxlKFN0cmluZyBmaWxlKSB7CisgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbCA9IEZpbGVDaGFubmVsLm9wZW4oUGF0aHMuZ2V0KGZpbGUpLCBTdGFuZGFyZE9wZW5PcHRpb24uUkVBRCk7CisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbC5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGNoYW5uZWwuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbCB0byBtbWFwIHN0b3JhZ2UgZmlsZSAlcyIsIGZpbGUpLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHF1aWV0bHlEaXNwb3NlKGNoYW5uZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlldGx5RGlzcG9zZShDbG9zZWFibGUgY2xvc2FibGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbG9zYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvc2FibGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2FyZSwgYXQgbGVhc3QgYXMgb2Ygbm93CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzCmluZGV4IGUxOTVlYjguLmY1ZjEyYmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzCkBAIC0xLDE0ICsxLDE2IEBACiAvLyEgYWNvbmZpZyBzdG9yYWdlIHJlYWQgYXBpIGphdmEgcnVzdCBpbnRlcmxvcAogCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OlNpcEhhc2hlcjEzOwogdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ190YWJsZV9xdWVyeTo6ZmluZF9mbGFnX3JlYWRfY29udGV4dDsKIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfdmFsdWVfcXVlcnk6OmZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlOwogdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6cGFja2FnZV90YWJsZV9xdWVyeTo6ZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dDsKIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntGbGFnUmVhZENvbnRleHQsIFBhY2thZ2VSZWFkQ29udGV4dH07CiAKIHVzZSBhbnlob3c6OlJlc3VsdDsKLXVzZSBqbmk6Om9iamVjdHM6OntKQnl0ZUJ1ZmZlciwgSkNsYXNzLCBKU3RyaW5nLCBKVmFsdWV9OwotdXNlIGpuaTo6c3lzOjp7amludCwgam9iamVjdH07Cit1c2Ugam5pOjpvYmplY3RzOjp7SkJ5dGVCdWZmZXIsIEpDbGFzcywgSlN0cmluZ307Cit1c2Ugam5pOjpzeXM6OntqYm9vbGVhbiwgamludCwgamxvbmd9OwogdXNlIGpuaTo6Sk5JRW52OwordXNlIHN0ZDo6aGFzaDo6SGFzaGVyOwogCiAvLy8gQ2FsbCBydXN0IGZpbmQgcGFja2FnZSByZWFkIGNvbnRleHQKIGZuIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dF9qYXZhKApAQCAtMjgsNTUgKzMwLDQyIEBACiAgICAgT2soZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dChidWZmZXIsICZwYWNrYWdlX25hbWUpPykKIH0KIAotLy8vIENyZWF0ZSBqYXZhIHBhY2thZ2UgcmVhZCBjb250ZXh0IHJldHVybgotZm4gY3JlYXRlX2phdmFfcGFja2FnZV9yZWFkX2NvbnRleHQoCi0gICAgZW52OiAmbXV0IEpOSUVudiwKLSAgICBzdWNjZXNzX3F1ZXJ5OiBib29sLAotICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZywKLSAgICBwa2dfZm91bmQ6IGJvb2wsCi0gICAgcGtnX2lkOiB1MzIsCi0gICAgc3RhcnRfaW5kZXg6IHUzMiwKLSkgLT4gam9iamVjdCB7Ci0gICAgbGV0IHF1ZXJ5X3N1Y2Nlc3MgPSBKVmFsdWU6OkJvb2woc3VjY2Vzc19xdWVyeSBhcyB1OCk7Ci0gICAgbGV0IGVycm1zZyA9IGVudi5uZXdfc3RyaW5nKGVycm9yX21lc3NhZ2UpLmV4cGVjdCgiZmFpbGVkIHRvIGNyZWF0ZSBKU3RyaW5nIik7Ci0gICAgbGV0IHBhY2thZ2VfZXhpc3RzID0gSlZhbHVlOjpCb29sKHBrZ19mb3VuZCBhcyB1OCk7Ci0gICAgbGV0IHBhY2thZ2VfaWQgPSBKVmFsdWU6OkludChwa2dfaWQgYXMgaTMyKTsKLSAgICBsZXQgYm9vbGVhbl9zdGFydF9pbmRleCA9IEpWYWx1ZTo6SW50KHN0YXJ0X2luZGV4IGFzIGkzMik7Ci0gICAgbGV0IGNvbnRleHQgPSBlbnYubmV3X29iamVjdCgKLSAgICAgICAgImFuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VSZWFkQ29udGV4dCIsCi0gICAgICAgICIoWkxqYXZhL2xhbmcvU3RyaW5nO1pJSSlWIiwKLSAgICAgICAgJltxdWVyeV9zdWNjZXNzLCAoJmVycm1zZykuaW50bygpLCBwYWNrYWdlX2V4aXN0cywgcGFja2FnZV9pZCwgYm9vbGVhbl9zdGFydF9pbmRleF0sCi0gICAgKTsKLSAgICBjb250ZXh0LmV4cGVjdCgiZmFpbGVkIHRvIGNhbGwgUGFja2FnZVJlYWRDb250ZXh0IGNvbnN0cnVjdG9yIikuaW50b19yYXcoKQotfQotCiAvLy8gR2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0IEpOSQogI1tub19tYW5nbGVdCiAjW2FsbG93KHVudXNlZCldCi1wdWIgZXh0ZXJuICJzeXN0ZW0iIGZuIEphdmFfYW5kcm9pZF9hY29uZmlnX3N0b3JhZ2VfQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJX2dldFBhY2thZ2VSZWFkQ29udGV4dDwKK3B1YiBleHRlcm4gInN5c3RlbSIgZm4gSmF2YV9hbmRyb2lkX2Fjb25maWdfc3RvcmFnZV9BY29uZmlnU3RvcmFnZVJlYWRBUElfZ2V0UGFja2FnZVJlYWRDb250ZXh0SW1wbDwKICAgICAnbG9jYWwsCiA+KAogICAgIG11dCBlbnY6IEpOSUVudjwnbG9jYWw+LAogICAgIGNsYXNzOiBKQ2xhc3M8J2xvY2FsPiwKICAgICBmaWxlOiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+LAogICAgIHBhY2thZ2U6IEpTdHJpbmc8J2xvY2FsPiwKLSkgLT4gam9iamVjdCB7CispIC0+IEpCeXRlQnVmZmVyPCdsb2NhbD4geworICAgIGxldCBtdXQgcGFja2FnZV9pZCA9IC0xOworICAgIGxldCBtdXQgYm9vbGVhbl9zdGFydF9pbmRleCA9IC0xOworCiAgICAgbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0X2phdmEoJm11dCBlbnYsIGZpbGUsIHBhY2thZ2UpIHsKLSAgICAgICAgT2soY29udGV4dF9vcHQpID0+IG1hdGNoIGNvbnRleHRfb3B0IHsKLSAgICAgICAgICAgIFNvbWUoY29udGV4dCkgPT4gY3JlYXRlX2phdmFfcGFja2FnZV9yZWFkX2NvbnRleHQoCi0gICAgICAgICAgICAgICAgJm11dCBlbnYsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBTdHJpbmc6OmZyb20oIiIpLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgY29udGV4dC5wYWNrYWdlX2lkLAotICAgICAgICAgICAgICAgIGNvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCwKLSAgICAgICAgICAgICksCi0gICAgICAgICAgICBOb25lID0+IGNyZWF0ZV9qYXZhX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZtdXQgZW52LCB0cnVlLCBTdHJpbmc6OmZyb20oIiIpLCBmYWxzZSwgMCwgMCksCi0gICAgICAgIH0sCisgICAgICAgIE9rKGNvbnRleHRfb3B0KSA9PiB7CisgICAgICAgICAgICBpZiBsZXQgU29tZShjb250ZXh0KSA9IGNvbnRleHRfb3B0IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2lkID0gY29udGV4dC5wYWNrYWdlX2lkIGFzIGkzMjsKKyAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4ID0gY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4IGFzIGkzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBFcnIoZXJybXNnKSA9PiB7Ci0gICAgICAgICAgICBjcmVhdGVfamF2YV9wYWNrYWdlX3JlYWRfY29udGV4dCgmbXV0IGVudiwgZmFsc2UsIGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLCBmYWxzZSwgMCwgMCkKKyAgICAgICAgICAgIGVudi50aHJvdygoImphdmEvaW8vSU9FeGNlcHRpb24iLCBlcnJtc2cudG9fc3RyaW5nKCkpKS5leHBlY3QoImZhaWxlZCB0byB0aHJvdyIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgbGV0IG11dCBieXRlcyA9IFZlYzo6bmV3KCk7CisgICAgYnl0ZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJnBhY2thZ2VfaWQudG9fbGVfYnl0ZXMoKSk7CisgICAgYnl0ZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJmJvb2xlYW5fc3RhcnRfaW5kZXgudG9fbGVfYnl0ZXMoKSk7CisgICAgbGV0IChhZGRyLCBsZW4pID0geworICAgICAgICBsZXQgYnVmID0gYnl0ZXMubGVhaygpOworICAgICAgICAoYnVmLmFzX211dF9wdHIoKSwgYnVmLmxlbigpKQorICAgIH07CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSBjb250ZW50IGlzIGVuc3VyZWQgdG8gYmUgdmFsaWQKKyAgICB1bnNhZmUgeyBlbnYubmV3X2RpcmVjdF9ieXRlX2J1ZmZlcihhZGRyLCBsZW4pLmV4cGVjdCgiZmFpbGVkIHRvIGNyZWF0ZSBieXRlIGJ1ZmZlciIpIH0KIH0KIAogLy8vIENhbGwgcnVzdCBmaW5kIGZsYWcgcmVhZCBjb250ZXh0CkBAIC05OCwzMiArODcsMTAgQEAKICAgICBPayhmaW5kX2ZsYWdfcmVhZF9jb250ZXh0KGJ1ZmZlciwgcGFja2FnZV9pZCBhcyB1MzIsICZmbGFnX25hbWUpPykKIH0KIAotLy8vIENyZWF0ZSBqYXZhIGZsYWcgcmVhZCBjb250ZXh0IHJldHVybgotZm4gY3JlYXRlX2phdmFfZmxhZ19yZWFkX2NvbnRleHQoCi0gICAgZW52OiAmbXV0IEpOSUVudiwKLSAgICBzdWNjZXNzX3F1ZXJ5OiBib29sLAotICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZywKLSAgICBmbGdfZm91bmQ6IGJvb2wsCi0gICAgZmxnX3R5cGU6IHUzMiwKLSAgICBmbGdfaW5kZXg6IHUzMiwKLSkgLT4gam9iamVjdCB7Ci0gICAgbGV0IHF1ZXJ5X3N1Y2Nlc3MgPSBKVmFsdWU6OkJvb2woc3VjY2Vzc19xdWVyeSBhcyB1OCk7Ci0gICAgbGV0IGVycm1zZyA9IGVudi5uZXdfc3RyaW5nKGVycm9yX21lc3NhZ2UpLmV4cGVjdCgiZmFpbGVkIHRvIGNyZWF0ZSBKU3RyaW5nIik7Ci0gICAgbGV0IGZsYWdfZXhpc3RzID0gSlZhbHVlOjpCb29sKGZsZ19mb3VuZCBhcyB1OCk7Ci0gICAgbGV0IGZsYWdfdHlwZSA9IEpWYWx1ZTo6SW50KGZsZ190eXBlIGFzIGkzMik7Ci0gICAgbGV0IGZsYWdfaW5kZXggPSBKVmFsdWU6OkludChmbGdfaW5kZXggYXMgaTMyKTsKLSAgICBsZXQgY29udGV4dCA9IGVudi5uZXdfb2JqZWN0KAotICAgICAgICAiYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1JlYWRDb250ZXh0IiwKLSAgICAgICAgIihaTGphdmEvbGFuZy9TdHJpbmc7WklJKVYiLAotICAgICAgICAmW3F1ZXJ5X3N1Y2Nlc3MsICgmZXJybXNnKS5pbnRvKCksIGZsYWdfZXhpc3RzLCBmbGFnX3R5cGUsIGZsYWdfaW5kZXhdLAotICAgICk7Ci0gICAgY29udGV4dC5leHBlY3QoImZhaWxlZCB0byBjYWxsIEZsYWdSZWFkQ29udGV4dCBjb25zdHJ1Y3RvciIpLmludG9fcmF3KCkKLX0KLQogLy8vIEdldCBmbGFnIHJlYWQgY29udGV4dCBKTkkKICNbbm9fbWFuZ2xlXQogI1thbGxvdyh1bnVzZWQpXQotcHViIGV4dGVybiAic3lzdGVtIiBmbiBKYXZhX2FuZHJvaWRfYWNvbmZpZ19zdG9yYWdlX0Fjb25maWdTdG9yYWdlUmVhZEFQSV9nZXRGbGFnUmVhZENvbnRleHQ8CitwdWIgZXh0ZXJuICJzeXN0ZW0iIGZuIEphdmFfYW5kcm9pZF9hY29uZmlnX3N0b3JhZ2VfQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJX2dldEZsYWdSZWFkQ29udGV4dEltcGw8CiAgICAgJ2xvY2FsLAogPigKICAgICBtdXQgZW52OiBKTklFbnY8J2xvY2FsPiwKQEAgLTEzMSw0MSArOTgsMzIgQEAKICAgICBmaWxlOiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+LAogICAgIHBhY2thZ2VfaWQ6IGppbnQsCiAgICAgZmxhZzogSlN0cmluZzwnbG9jYWw+LAotKSAtPiBqb2JqZWN0IHsKKykgLT4gSkJ5dGVCdWZmZXI8J2xvY2FsPiB7CisgICAgbGV0IG11dCBmbGFnX3R5cGUgPSAtMTsKKyAgICBsZXQgbXV0IGZsYWdfaW5kZXggPSAtMTsKKwogICAgIG1hdGNoIGdldF9mbGFnX3JlYWRfY29udGV4dF9qYXZhKCZtdXQgZW52LCBmaWxlLCBwYWNrYWdlX2lkLCBmbGFnKSB7Ci0gICAgICAgIE9rKGNvbnRleHRfb3B0KSA9PiBtYXRjaCBjb250ZXh0X29wdCB7Ci0gICAgICAgICAgICBTb21lKGNvbnRleHQpID0+IGNyZWF0ZV9qYXZhX2ZsYWdfcmVhZF9jb250ZXh0KAotICAgICAgICAgICAgICAgICZtdXQgZW52LAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCIiKSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZmxhZ190eXBlIGFzIHUzMiwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmZsYWdfaW5kZXggYXMgdTMyLAotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIE5vbmUgPT4gY3JlYXRlX2phdmFfZmxhZ19yZWFkX2NvbnRleHQoJm11dCBlbnYsIHRydWUsIFN0cmluZzo6ZnJvbSgiIiksIGZhbHNlLCA5OTk5LCAwKSwKLSAgICAgICAgfSwKKyAgICAgICAgT2soY29udGV4dF9vcHQpID0+IHsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKGNvbnRleHQpID0gY29udGV4dF9vcHQgeworICAgICAgICAgICAgICAgIGZsYWdfdHlwZSA9IGNvbnRleHQuZmxhZ190eXBlIGFzIGkzMjsKKyAgICAgICAgICAgICAgICBmbGFnX2luZGV4ID0gY29udGV4dC5mbGFnX2luZGV4IGFzIGkzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBFcnIoZXJybXNnKSA9PiB7Ci0gICAgICAgICAgICBjcmVhdGVfamF2YV9mbGFnX3JlYWRfY29udGV4dCgmbXV0IGVudiwgZmFsc2UsIGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLCBmYWxzZSwgOTk5OSwgMCkKKyAgICAgICAgICAgIGVudi50aHJvdygoImphdmEvaW8vSU9FeGNlcHRpb24iLCBlcnJtc2cudG9fc3RyaW5nKCkpKS5leHBlY3QoImZhaWxlZCB0byB0aHJvdyIpOwogICAgICAgICB9CiAgICAgfQotfQogCi0vLy8gQ3JlYXRlIGphdmEgYm9vbGVhbiBmbGFnIHZhbHVlIHJldHVybgotZm4gY3JlYXRlX2phdmFfYm9vbGVhbl9mbGFnX3ZhbHVlKAotICAgIGVudjogJm11dCBKTklFbnYsCi0gICAgc3VjY2Vzc19xdWVyeTogYm9vbCwKLSAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCi0gICAgdmFsdWU6IGJvb2wsCi0pIC0+IGpvYmplY3QgewotICAgIGxldCBxdWVyeV9zdWNjZXNzID0gSlZhbHVlOjpCb29sKHN1Y2Nlc3NfcXVlcnkgYXMgdTgpOwotICAgIGxldCBlcnJtc2cgPSBlbnYubmV3X3N0cmluZyhlcnJvcl9tZXNzYWdlKS5leHBlY3QoImZhaWxlZCB0byBjcmVhdGUgSlN0cmluZyIpOwotICAgIGxldCBmbGFnX3ZhbHVlID0gSlZhbHVlOjpCb29sKHZhbHVlIGFzIHU4KTsKLSAgICBsZXQgY29udGV4dCA9IGVudi5uZXdfb2JqZWN0KAotICAgICAgICAiYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQm9vbGVhbkZsYWdWYWx1ZSIsCi0gICAgICAgICIoWkxqYXZhL2xhbmcvU3RyaW5nO1opViIsCi0gICAgICAgICZbcXVlcnlfc3VjY2VzcywgKCZlcnJtc2cpLmludG8oKSwgZmxhZ192YWx1ZV0sCi0gICAgKTsKLSAgICBjb250ZXh0LmV4cGVjdCgiZmFpbGVkIHRvIGNhbGwgQm9vbGVhbkZsYWdWYWx1ZSBjb25zdHJ1Y3RvciIpLmludG9fcmF3KCkKKyAgICBsZXQgbXV0IGJ5dGVzID0gVmVjOjpuZXcoKTsKKyAgICBieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmZmxhZ190eXBlLnRvX2xlX2J5dGVzKCkpOworICAgIGJ5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZmbGFnX2luZGV4LnRvX2xlX2J5dGVzKCkpOworICAgIGxldCAoYWRkciwgbGVuKSA9IHsKKyAgICAgICAgbGV0IGJ1ZiA9IGJ5dGVzLmxlYWsoKTsKKyAgICAgICAgKGJ1Zi5hc19tdXRfcHRyKCksIGJ1Zi5sZW4oKSkKKyAgICB9OworICAgIC8vIFNBRkVUWToKKyAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgY29udGVudCBpcyBlbnN1cmVkIHRvIGJlIHZhbGlkCisgICAgdW5zYWZlIHsgZW52Lm5ld19kaXJlY3RfYnl0ZV9idWZmZXIoYWRkciwgbGVuKS5leHBlY3QoImZhaWxlZCB0byBjcmVhdGUgYnl0ZSBidWZmZXIiKSB9CiB9CiAKIC8vLyBDYWxsIHJ1c3QgZmluZCBib29sZWFuIGZsYWcgdmFsdWUKQEAgLTE5MywxMSArMTUxLDM5IEBACiAgICAgY2xhc3M6IEpDbGFzczwnbG9jYWw+LAogICAgIGZpbGU6IEpCeXRlQnVmZmVyPCdsb2NhbD4sCiAgICAgZmxhZ19pbmRleDogamludCwKLSkgLT4gam9iamVjdCB7CispIC0+IGpib29sZWFuIHsKICAgICBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2phdmEoJm11dCBlbnYsIGZpbGUsIGZsYWdfaW5kZXgpIHsKLSAgICAgICAgT2sodmFsdWUpID0+IGNyZWF0ZV9qYXZhX2Jvb2xlYW5fZmxhZ192YWx1ZSgmbXV0IGVudiwgdHJ1ZSwgU3RyaW5nOjpmcm9tKCIiKSwgdmFsdWUpLAorICAgICAgICBPayh2YWx1ZSkgPT4gdmFsdWUgYXMgdTgsCiAgICAgICAgIEVycihlcnJtc2cpID0+IHsKLSAgICAgICAgICAgIGNyZWF0ZV9qYXZhX2Jvb2xlYW5fZmxhZ192YWx1ZSgmbXV0IGVudiwgZmFsc2UsIGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLCBmYWxzZSkKKyAgICAgICAgICAgIGVudi50aHJvdygoImphdmEvaW8vSU9FeGNlcHRpb24iLCBlcnJtc2cudG9fc3RyaW5nKCkpKS5leHBlY3QoImZhaWxlZCB0byB0aHJvdyIpOworICAgICAgICAgICAgMHU4CiAgICAgICAgIH0KICAgICB9CiB9CisKKy8vLyBHZXQgZmxhZyB2YWx1ZSBKTkkKKyNbbm9fbWFuZ2xlXQorI1thbGxvdyh1bnVzZWQpXQorcHViIGV4dGVybiAic3lzdGVtIiBmbiBKYXZhX2FuZHJvaWRfYWNvbmZpZ19zdG9yYWdlX0Fjb25maWdTdG9yYWdlUmVhZEFQSV9oYXNoPCdsb2NhbD4oCisgICAgbXV0IGVudjogSk5JRW52PCdsb2NhbD4sCisgICAgY2xhc3M6IEpDbGFzczwnbG9jYWw+LAorICAgIHBhY2thZ2VfbmFtZTogSlN0cmluZzwnbG9jYWw+LAorKSAtPiBqbG9uZyB7CisgICAgbWF0Y2ggc2lwaGFzaGVyMTNfaGFzaCgmbXV0IGVudiwgcGFja2FnZV9uYW1lKSB7CisgICAgICAgIE9rKHZhbHVlKSA9PiB2YWx1ZSBhcyBqbG9uZywKKyAgICAgICAgRXJyKGVycm1zZykgPT4geworICAgICAgICAgICAgZW52LnRocm93KCgiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGVycm1zZy50b19zdHJpbmcoKSkpLmV4cGVjdCgiZmFpbGVkIHRvIHRocm93Iik7CisgICAgICAgICAgICAwaTY0CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHNpcGhhc2hlcjEzX2hhc2goZW52OiAmbXV0IEpOSUVudiwgcGFja2FnZV9uYW1lOiBKU3RyaW5nKSAtPiBSZXN1bHQ8dTY0PiB7CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSBmbGFnIG5hbWUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGphdmEgc3RyaW5nCisgICAgbGV0IGZsYWdfbmFtZTogU3RyaW5nID0gdW5zYWZlIHsgZW52LmdldF9zdHJpbmdfdW5jaGVja2VkKCZwYWNrYWdlX25hbWUpPy5pbnRvKCkgfTsKKyAgICBsZXQgbXV0IHMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgcy53cml0ZShmbGFnX25hbWUuYXNfYnl0ZXMoKSk7CisgICAgcy53cml0ZV91OCgweGZmKTsKKyAgICBPayhzLmZpbmlzaCgpKQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0Fjb25maWdTdG9yYWdlUmVhZEFQSVRlc3QuamF2YQppbmRleCBjZjRjZmU2Li4xOTE3NDFlIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0Fjb25maWdTdG9yYWdlUmVhZEFQSVRlc3QuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0Fjb25maWdTdG9yYWdlUmVhZEFQSVRlc3QuamF2YQpAQCAtMTYsMjcgKzE2LDI5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5EZXZpY2VQcm90b3M7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZzsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5BY29uZmlnU3RvcmFnZVJlYWRBUEk7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1JlYWRDb250ZXh0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dC5TdG9yZWRGbGFnVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlUmVhZENvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTM7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKIAotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlUmVhZEFQSTsKLWltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlUmVhZENvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1JlYWRDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dC5TdG9yZWRGbGFnVHlwZTsKLWltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5Cb29sZWFuRmxhZ1ZhbHVlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBAUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdHsKK3B1YmxpYyBjbGFzcyBBY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0IHsKIAogICAgIHByaXZhdGUgU3RyaW5nIG1TdG9yYWdlRGlyID0gIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QiOwogCkBAIC00NCw2OCArNDYsNjYgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUNvbnRleHRRdWVyeSgpIHsKICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBwYWNrYWdlTWFwID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhY2thZ2VNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUoCi0gICAgICAgICAgICAgICAgbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIik7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgcGFja2FnZU1hcCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZShtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUocGFja2FnZU1hcCAhPSBudWxsKTsKIAotICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCi0gICAgICAgICAgICBwYWNrYWdlTWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQubVF1ZXJ5U3VjY2Vzcyk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tRXJyb3JNZXNzYWdlLCBjb250ZXh0Lm1FcnJvck1lc3NhZ2UuZXF1YWxzKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tUGFja2FnZUV4aXN0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXgsIDApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgMCk7CiAKLSAgICAgICAgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCi0gICAgICAgICAgICBwYWNrYWdlTWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQubVF1ZXJ5U3VjY2Vzcyk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tRXJyb3JNZXNzYWdlLCBjb250ZXh0Lm1FcnJvck1lc3NhZ2UuZXF1YWxzKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tUGFja2FnZUV4aXN0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXgsIDMpOworICAgICAgICAgICAgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU1hcCwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUJvb2xlYW5TdGFydEluZGV4LCAzKTsKIAotICAgICAgICBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dCgKLSAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tUXVlcnlTdWNjZXNzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZXh0Lm1FcnJvck1lc3NhZ2UsIGNvbnRleHQubUVycm9yTWVzc2FnZS5lcXVhbHMoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZXh0Lm1QYWNrYWdlRXhpc3RzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubVBhY2thZ2VJZCwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgNik7CisgICAgICAgICAgICBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubVBhY2thZ2VJZCwgMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXgsIDYpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdFBhY2thZ2VDb250ZXh0UXVlcnkoKSB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcGFja2FnZU1hcCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYWNrYWdlTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAotICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIHBhY2thZ2VNYXAgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRUcnVlKHBhY2thZ2VNYXAgIT0gbnVsbCk7CiAKLSAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAotICAgICAgICAgICAgcGFja2FnZU1hcCwgInVua25vd24iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZXh0Lm1RdWVyeVN1Y2Nlc3MpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQubUVycm9yTWVzc2FnZSwgY29udGV4dC5tRXJyb3JNZXNzYWdlLmVxdWFscygiIikpOwotICAgICAgICBhc3NlcnRGYWxzZShjb250ZXh0Lm1QYWNrYWdlRXhpc3RzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubVBhY2thZ2VJZCwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQocGFja2FnZU1hcCwgInVua25vd24iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIC0xKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgLTEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnQ29udGV4dFF1ZXJ5KCkgewogICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdNYXAgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmxhZ01hcCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZSgKLSAgICAgICAgICAgICAgICBtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAuZmxhZy5tYXAiKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBmbGFnTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnTWFwIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ01hcCAhPSBudWxsKTsKIAogICAgICAgICBjbGFzcyBCYXNlbGluZSB7CiAgICAgICAgICAgICBwdWJsaWMgaW50IG1QYWNrYWdlSWQ7CkBAIC0xMTMsMTAgKzExMyw4IEBACiAgICAgICAgICAgICBwdWJsaWMgU3RvcmVkRmxhZ1R5cGUgbUZsYWdUeXBlOwogICAgICAgICAgICAgcHVibGljIGludCBtRmxhZ0luZGV4OwogCi0gICAgICAgICAgICBwdWJsaWMgQmFzZWxpbmUoaW50IHBhY2thZ2VJZCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lLAotICAgICAgICAgICAgICAgICAgICBTdG9yZWRGbGFnVHlwZSBmbGFnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdJbmRleCkgeworICAgICAgICAgICAgcHVibGljIEJhc2VsaW5lKAorICAgICAgICAgICAgICAgICAgICBpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUsIFN0b3JlZEZsYWdUeXBlIGZsYWdUeXBlLCBpbnQgZmxhZ0luZGV4KSB7CiAgICAgICAgICAgICAgICAgbVBhY2thZ2VJZCA9IHBhY2thZ2VJZDsKICAgICAgICAgICAgICAgICBtRmxhZ05hbWUgPSBmbGFnTmFtZTsKICAgICAgICAgICAgICAgICBtRmxhZ1R5cGUgPSBmbGFnVHlwZTsKQEAgLTEzNCwxNCArMTMyLDE2IEBACiAgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDIsICJlbmFibGVkX2ZpeGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGUuRml4ZWRSZWFkT25seUJvb2xlYW4sIDApKTsKICAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMCwgImRpc2FibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgMCkpOwogCi0gICAgICAgIGZvciAoQmFzZWxpbmUgYmFzZWxpbmUgOiBiYXNlbGluZXMpIHsKLSAgICAgICAgICAgIEZsYWdSZWFkQ29udGV4dCBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dCgKLSAgICAgICAgICAgICAgICBmbGFnTWFwLCBiYXNlbGluZS5tUGFja2FnZUlkLCAgYmFzZWxpbmUubUZsYWdOYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tUXVlcnlTdWNjZXNzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGV4dC5tRXJyb3JNZXNzYWdlLCBjb250ZXh0Lm1FcnJvck1lc3NhZ2UuZXF1YWxzKCIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQubUZsYWdFeGlzdHMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdUeXBlLCBiYXNlbGluZS5tRmxhZ1R5cGUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgYmFzZWxpbmUubUZsYWdJbmRleCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEJhc2VsaW5lIGJhc2VsaW5lIDogYmFzZWxpbmVzKSB7CisgICAgICAgICAgICAgICAgRmxhZ1JlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01hcCwgYmFzZWxpbmUubVBhY2thZ2VJZCwgYmFzZWxpbmUubUZsYWdOYW1lKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ1R5cGUsIGJhc2VsaW5lLm1GbGFnVHlwZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgYmFzZWxpbmUubUZsYWdJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ5LDQ3ICsxNDksNDQgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RGbGFnQ29udGV4dFF1ZXJ5KCkgewogICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdNYXAgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmxhZ01hcCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZSgKLSAgICAgICAgICAgICAgICBtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAuZmxhZy5tYXAiKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBmbGFnTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnTWFwIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ01hcCAhPSBudWxsKTsKIAotICAgICAgICBGbGFnUmVhZENvbnRleHQgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCi0gICAgICAgICAgICBmbGFnTWFwLCAwLCAgInVua25vd24iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZXh0Lm1RdWVyeVN1Y2Nlc3MpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQubUVycm9yTWVzc2FnZSwgY29udGV4dC5tRXJyb3JNZXNzYWdlLmVxdWFscygiIikpOwotICAgICAgICBhc3NlcnRGYWxzZShjb250ZXh0Lm1GbGFnRXhpc3RzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdUeXBlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGbGFnUmVhZENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoZmxhZ01hcCwgMCwgInVua25vd24iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnVHlwZSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ0luZGV4LCAtMSk7CiAKLSAgICAgICAgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCi0gICAgICAgICAgICBmbGFnTWFwLCAzLCAgImVuYWJsZWRfcm8iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZXh0Lm1RdWVyeVN1Y2Nlc3MpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRleHQubUVycm9yTWVzc2FnZSwgY29udGV4dC5tRXJyb3JNZXNzYWdlLmVxdWFscygiIikpOwotICAgICAgICBhc3NlcnRGYWxzZShjb250ZXh0Lm1GbGFnRXhpc3RzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdUeXBlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgMCk7CisgICAgICAgICAgICBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dChmbGFnTWFwLCAzLCAiZW5hYmxlZF9ybyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdUeXBlLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnSW5kZXgsIC0xKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkZsYWdWYWx1ZVF1ZXJ5KCkgewogICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdWYWwgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmxhZ1ZhbCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZSgKLSAgICAgICAgICAgICAgICBtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIik7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgZmxhZ1ZhbCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZShtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZsYWdWYWwhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsICE9IG51bGwpOwogCiAgICAgICAgIGJvb2xlYW5bXSBiYXNlbGluZXMgPSB7ZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICAgICAgICAgIEJvb2xlYW5GbGFnVmFsdWUgdmFsdWUgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmbGFnVmFsLCBpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodmFsdWUubVF1ZXJ5U3VjY2Vzcyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHZhbHVlLm1FcnJvck1lc3NhZ2UsIHZhbHVlLm1FcnJvck1lc3NhZ2UuZXF1YWxzKCIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUubUZsYWdWYWx1ZSwgYmFzZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZsYWdWYWwsIGkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgYmFzZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5NywxNiArMTk0LDc3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRCb29sZWFuRmxhZ1ZhbHVlUXVlcnkoKSB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgZmxhZ1ZhbCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmbGFnVmFsID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAotICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBmbGFnVmFsID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbCE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKGZsYWdWYWwgIT0gbnVsbCk7CiAKLSAgICAgICAgQm9vbGVhbkZsYWdWYWx1ZSB2YWx1ZSA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZsYWdWYWwsIDkpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRFcnJtc2cgPSAiRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSI7Ci0gICAgICAgIGFzc2VydEZhbHNlKHZhbHVlLm1RdWVyeVN1Y2Nlc3MpOwotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlLm1FcnJvck1lc3NhZ2UsIHZhbHVlLm1FcnJvck1lc3NhZ2UuY29udGFpbnMoZXhwZWN0ZWRFcnJtc2cpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gdmFsdWUgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmbGFnVmFsLCA5KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNob3VsZCB0aHJvdyIsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZEVycm1zZyA9ICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSBieXRlIG9mZnNldCI7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGV4LnRvU3RyaW5nKCkuY29udGFpbnMoZXhwZWN0ZWRFcnJtc2cpKTsKKyAgICAgICAgfQogICAgIH0KLSB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdXN0SmF2YUVxdWFsSGFzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGZsYWcucGFja2FnZV87CisgICAgICAgICAgICBTdHJpbmcgZmxhZ05hbWUgPSBmbGFnLm5hbWU7CisgICAgICAgICAgICBsb25nIHJIYXNoID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmhhc2gocGFja2FnZU5hbWUpOworICAgICAgICAgICAgbG9uZyBqSGFzaCA9IFNpcEhhc2hlcjEzLmhhc2gocGFja2FnZU5hbWUuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMockhhc2gsIGpIYXNoKTsKKworICAgICAgICAgICAgU3RyaW5nIGZ1bGxGbGFnTmFtZSA9IHBhY2thZ2VOYW1lICsgIi8iICsgZmxhZ05hbWU7CisgICAgICAgICAgICBySGFzaCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5oYXNoKGZ1bGxGbGFnTmFtZSk7CisgICAgICAgICAgICBqSGFzaCA9IFNpcEhhc2hlcjEzLmhhc2goZnVsbEZsYWdOYW1lLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJIYXNoLCBqSGFzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdXN0SmF2YUVxdWFsRmxhZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKKworICAgICAgICBTdHJpbmcgbWFwUGF0aCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9tYXBzLyI7CisgICAgICAgIFN0cmluZyBmbGFnc1BhdGggPSAiL21ldGFkYXRhL2Fjb25maWcvYm9vdC8iOworCisgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IGZsYWdzKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIgPSBmbGFnLmNvbnRhaW5lcjsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGZsYWcucGFja2FnZV87CisgICAgICAgICAgICBTdHJpbmcgZmxhZ05hbWUgPSBmbGFnLm5hbWU7CisgICAgICAgICAgICBTdHJpbmcgZnVsbEZsYWdOYW1lID0gcGFja2FnZU5hbWUgKyAiLyIgKyBmbGFnTmFtZTsKKworICAgICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBwYWNrYWdlTWFwID0KKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1hcFBhdGggKyBjb250YWluZXIgKyAiLnBhY2thZ2UubWFwIik7CisgICAgICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdNYXAgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobWFwUGF0aCArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiKTsKKyAgICAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgZmxhZ1ZhbExpc3QgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUoZmxhZ3NQYXRoICsgY29udGFpbmVyICsgIi52YWwiKTsKKworICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHBhY2thZ2VDb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dChwYWNrYWdlTWFwLCBwYWNrYWdlTmFtZSk7CisKKyAgICAgICAgICAgIEZsYWdSZWFkQ29udGV4dCBmbGFnQ29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01hcCwgcGFja2FnZUNvbnRleHQubVBhY2thZ2VJZCwgZmxhZ05hbWUpOworCisgICAgICAgICAgICBib29sZWFuIHJWYWwgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnVmFsTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlQ29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXggKyBmbGFnQ29udGV4dC5tRmxhZ0luZGV4KTsKKworICAgICAgICAgICAgU3RvcmFnZUludGVybmFsUmVhZGVyIHJlYWRlciA9IG5ldyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoY29udGFpbmVyLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBib29sZWFuIGpWYWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmbGFnQ29udGV4dC5tRmxhZ0luZGV4KTsKKworICAgICAgICAgICAgbG9uZyBySGFzaCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5oYXNoKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGxvbmcgakhhc2ggPSBTaXBIYXNoZXIxMy5oYXNoKHBhY2thZ2VOYW1lLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJWYWwsIGpWYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwCmluZGV4IGQ5NGIyYjQuLjNkNGU5YWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWQuYnAKQEAgLTEsNyArMSwxMCBAQAogYW5kcm9pZF90ZXN0IHsKICAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QuamF2YSIsCi0gICAgc3JjczogWyJBY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEiXSwKKyAgICBzcmNzOiBbIi4vKiovKi5qYXZhIl0sCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmEiLAorICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfcmVhZGVyX2phdmEiLAogICAgICAgICAiYW5kcm9pZHgudGVzdC5ydWxlcyIsCiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfamF2YSIsCiAgICAgICAgICJqdW5pdCIsCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL1N0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvU3RvcmFnZUludGVybmFsUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWJiYTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL1N0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VJbnRlcm5hbFJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIG1TdG9yYWdlRGlyID0gIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QiOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmFnZUludGVybmFsUmVhZGVyX2dldEZsYWcoKSB7CisKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VNYXBGaWxlID0gbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIjsKKyAgICAgICAgU3RyaW5nIGZsYWdWYWx1ZUZpbGUgPSBtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIjsKKworICAgICAgICBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCBwYWNrYWdlTWFwRmlsZSwgZmxhZ1ZhbHVlRmlsZSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgxKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwCmluZGV4IGNhYmM2NWUuLjdiNDM1NzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5jcHAKQEAgLTEsNiArMSw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMTMsOCArMTQsOCBAQAogbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZSB7CiAKIC8vLyBNYXAgYSBzdG9yYWdlIGZpbGUKLWFuZHJvaWQ6OmJhc2U6OlJlc3VsdDxNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUqPiBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoCi0gICAgc3RkOjpzdHJpbmcgY29uc3QmIGZpbGUpIHsKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDxNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUgKj4gbWFwX211dGFibGVfc3RvcmFnZV9maWxlKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICZmaWxlKSB7CiAgIHN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKICAgaWYgKHN0YXQoZmlsZS5jX3N0cigpLCAmZmlsZV9zdGF0KSA8IDApIHsKICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcigpIDw8ICJzdGF0IGZhaWxlZCI7CkBAIC0yNiwxMyArMjcsMTMgQEAKIAogICBzaXplX3QgZmlsZV9zaXplID0gZmlsZV9zdGF0LnN0X3NpemU7CiAKLSAgY29uc3QgaW50IGZkID0gb3BlbihmaWxlLmNfc3RyKCksIE9fUkRXUiB8IE9fTk9GT0xMT1cgfCBPX0NMT0VYRUMpOwotICBpZiAoZmQgPT0gLTEpIHsKKyAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHVmZChvcGVuKGZpbGUuY19zdHIoKSwgT19SRFdSIHwgT19OT0ZPTExPVyB8IE9fQ0xPRVhFQykpOworICBpZiAodWZkLmdldCgpID09IC0xKSB7CiAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIG9wZW4gIiA8PCBmaWxlOwogICB9OwogCi0gIHZvaWQqIGNvbnN0IG1hcF9yZXN1bHQgPQotICAgICAgbW1hcChudWxscHRyLCBmaWxlX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgdm9pZCAqY29uc3QgbWFwX3Jlc3VsdCA9CisgICAgICBtbWFwKG51bGxwdHIsIGZpbGVfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgdWZkLmdldCgpLCAwKTsKICAgaWYgKG1hcF9yZXN1bHQgPT0gTUFQX0ZBSUxFRCkgewogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yKCkgPDwgIm1tYXAgZmFpbGVkIjsKICAgfQpAQCAtNDYsNDcgKzQ3LDU2IEBACiAKIC8vLyBTZXQgYm9vbGVhbiBmbGFnIHZhbHVlCiBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dm9pZD4gc2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKLSAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUmIGZpbGUsCisgICAgY29uc3QgTXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlICZmaWxlLAogICAgIHVpbnQzMl90IG9mZnNldCwKICAgICBib29sIHZhbHVlKSB7CiAgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPHVpbnQ4X3Q+KAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CiAgIGF1dG8gdXBkYXRlX2N4eCA9IHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWVfY3h4KGNvbnRlbnQsIG9mZnNldCwgdmFsdWUpOwogICBpZiAoIXVwZGF0ZV9jeHgudXBkYXRlX3N1Y2Nlc3MpIHsKICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJyb3IoKSA8PCB1cGRhdGVfY3h4LmVycm9yX21lc3NhZ2UuY19zdHIoKTsKICAgfQorICBpZiAoIW1zeW5jKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0cikgKyB1cGRhdGVfY3h4Lm9mZnNldCwgMSwgTVNfU1lOQykpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcigpIDw8ICJtc3luYyBmYWlsZWQiOworICB9CiAgIHJldHVybiB7fTsKIH0KIAogLy8vIFNldCBpZiBmbGFnIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUKIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKAotICAgIGNvbnN0IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSYgZmlsZSwKKyAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUgJmZpbGUsCiAgICAgRmxhZ1ZhbHVlVHlwZSB2YWx1ZV90eXBlLAogICAgIHVpbnQzMl90IG9mZnNldCwKICAgICBib29sIHZhbHVlKSB7CiAgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPHVpbnQ4X3Q+KAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CiAgIGF1dG8gdXBkYXRlX2N4eCA9IHVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGVfY3h4KAogICAgICAgY29udGVudCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHZhbHVlX3R5cGUpLCBvZmZzZXQsIHZhbHVlKTsKICAgaWYgKCF1cGRhdGVfY3h4LnVwZGF0ZV9zdWNjZXNzKSB7CiAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm9yKCkgPDwgdXBkYXRlX2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CiAgIH0KKyAgaWYgKCFtc3luYyhzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpICsgdXBkYXRlX2N4eC5vZmZzZXQsIDEsIE1TX1NZTkMpKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAibXN5bmMgZmFpbGVkIjsKKyAgfQogICByZXR1cm4ge307CiB9CiAKIC8vLyBTZXQgaWYgZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUKIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCi0gICAgY29uc3QgTXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlJiBmaWxlLAorICAgIGNvbnN0IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSAmZmlsZSwKICAgICBGbGFnVmFsdWVUeXBlIHZhbHVlX3R5cGUsCiAgICAgdWludDMyX3Qgb2Zmc2V0LAogICAgIGJvb2wgdmFsdWUpIHsKICAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8dWludDhfdD4oCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKICAgYXV0byB1cGRhdGVfY3h4ID0gdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlX2N4eCgKICAgICAgIGNvbnRlbnQsIHN0YXRpY19jYXN0PHVpbnQxNl90Pih2YWx1ZV90eXBlKSwgb2Zmc2V0LCB2YWx1ZSk7CiAgIGlmICghdXBkYXRlX2N4eC51cGRhdGVfc3VjY2VzcykgewogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJvcigpIDw8IHVwZGF0ZV9jeHguZXJyb3JfbWVzc2FnZS5jX3N0cigpOwogICB9CisgIGlmICghbXN5bmMoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihmaWxlLmZpbGVfcHRyKSArIHVwZGF0ZV9jeHgub2Zmc2V0LCAxLCBNU19TWU5DKSkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yKCkgPDwgIm1zeW5jIGZhaWxlZCI7CisgIH0KICAgcmV0dXJuIHt9OwogfQogCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMKaW5kZXggNmYwM2YxMi4uN2U2MDcxMyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX2luZm9fdXBkYXRlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ19pbmZvX3VwZGF0ZS5ycwpAQCAtNjcsMTMgKzY3LDEzIEBACiAgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAogICAgIGZsYWdfaW5kZXg6IHUzMiwKICAgICB2YWx1ZTogYm9vbCwKLSkgLT4gUmVzdWx0PCgpLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CispIC0+IFJlc3VsdDx1c2l6ZSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCAoYXR0cmlidXRlLCBoZWFkKSA9IGdldF9mbGFnX2F0dHJpYnV0ZV9hbmRfb2Zmc2V0KGJ1ZiwgZmxhZ190eXBlLCBmbGFnX2luZGV4KT87CiAgICAgbGV0IGhhc19vdmVycmlkZSA9IChhdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KSkgIT0gMDsKICAgICBpZiBoYXNfb3ZlcnJpZGUgIT0gdmFsdWUgewogICAgICAgICBidWZbaGVhZF0gPSAoYXR0cmlidXRlIF4gRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KS50b19sZV9ieXRlcygpWzBdOwogICAgIH0KLSAgICBPaygoKSkKKyAgICBPayhoZWFkKQogfQogCiAvLy8gU2V0IGlmIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlCkBAIC04MiwxMyArODIsMTMgQEAKICAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCiAgICAgZmxhZ19pbmRleDogdTMyLAogICAgIHZhbHVlOiBib29sLAotKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKykgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IChhdHRyaWJ1dGUsIGhlYWQpID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2FuZF9vZmZzZXQoYnVmLCBmbGFnX3R5cGUsIGZsYWdfaW5kZXgpPzsKICAgICBsZXQgaGFzX292ZXJyaWRlID0gKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpICE9IDA7CiAgICAgaWYgaGFzX292ZXJyaWRlICE9IHZhbHVlIHsKICAgICAgICAgYnVmW2hlYWRdID0gKGF0dHJpYnV0ZSBeIEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KS50b19sZV9ieXRlcygpWzBdOwogICAgIH0KLSAgICBPaygoKSkKKyAgICBPayhoZWFkKQogfQogCiAjW2NmZyh0ZXN0KV0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfdmFsdWVfdXBkYXRlLnJzCmluZGV4IDA5Mzg3MTUuLmRkMTVjOTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX3ZhbHVlX3VwZGF0ZS5ycwpAQCAtMjQsNyArMjQsNyBAQAogICAgIGJ1ZjogJm11dCBbdThdLAogICAgIGZsYWdfaW5kZXg6IHUzMiwKICAgICBmbGFnX3ZhbHVlOiBib29sLAotKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKykgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKICAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IEZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCkBAIC00Myw3ICs0Myw3IEBACiAgICAgfQogCiAgICAgYnVmW2hlYWRdID0gdTg6OmZyb20oZmxhZ192YWx1ZSkudG9fbGVfYnl0ZXMoKVswXTsKLSAgICBPaygoKSkKKyAgICBPayhoZWFkKQogfQogCiAjW2NmZyh0ZXN0KV0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9saWIucnMKaW5kZXggYWVjMjhkZS4uMDM5NmE2MyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9saWIucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9saWIucnMKQEAgLTE5NCwxOCArMTk0LDIxIEBACiAgICAgLy8gRmxhZyB2YWx1ZSB1cGRhdGUgcmV0dXJuIGZvciBjYyBpbnRlcmxvcAogICAgIHB1YiBzdHJ1Y3QgQm9vbGVhbkZsYWdWYWx1ZVVwZGF0ZUNYWCB7CiAgICAgICAgIHB1YiB1cGRhdGVfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIG9mZnNldDogdXNpemUsCiAgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCiAgICAgfQogCiAgICAgLy8gRmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlIHVwZGF0ZSByZXR1cm4gZm9yIGNjIGludGVybG9wCiAgICAgcHViIHN0cnVjdCBGbGFnSGFzU2VydmVyT3ZlcnJpZGVVcGRhdGVDWFggewogICAgICAgICBwdWIgdXBkYXRlX3N1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBvZmZzZXQ6IHVzaXplLAogICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAogICAgIH0KIAogICAgIC8vIEZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHVwZGF0ZSByZXR1cm4gZm9yIGNjIGludGVybG9wCiAgICAgcHViIHN0cnVjdCBGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CiAgICAgICAgIHB1YiB1cGRhdGVfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIG9mZnNldDogdXNpemUsCiAgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCiAgICAgfQogCkBAIC0yNTEsMTEgKzI1NCwxNCBAQAogICAgIHZhbHVlOiBib29sLAogKSAtPiBmZmk6OkJvb2xlYW5GbGFnVmFsdWVVcGRhdGVDWFggewogICAgIG1hdGNoIGNyYXRlOjpmbGFnX3ZhbHVlX3VwZGF0ZTo6dXBkYXRlX2Jvb2xlYW5fZmxhZ192YWx1ZShmaWxlLCBvZmZzZXQsIHZhbHVlKSB7Ci0gICAgICAgIE9rKCgpKSA9PiB7Ci0gICAgICAgICAgICBmZmk6OkJvb2xlYW5GbGFnVmFsdWVVcGRhdGVDWFggeyB1cGRhdGVfc3VjY2VzczogdHJ1ZSwgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSB9Ci0gICAgICAgIH0KKyAgICAgICAgT2soaGVhZCkgPT4gZmZpOjpCb29sZWFuRmxhZ1ZhbHVlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgb2Zmc2V0OiBoZWFkLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgfSwKICAgICAgICAgRXJyKGVycm1zZykgPT4gZmZpOjpCb29sZWFuRmxhZ1ZhbHVlVXBkYXRlQ1hYIHsKICAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgIG9mZnNldDogdXNpemU6Ok1BWCwKICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAogICAgICAgICB9LAogICAgIH0KQEAgLTI3MiwxOCArMjc4LDIxIEBACiAgICAgICAgICAgICBtYXRjaCBjcmF0ZTo6ZmxhZ19pbmZvX3VwZGF0ZTo6dXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgKICAgICAgICAgICAgICAgICBmaWxlLCB2YWx1ZV90eXBlLCBvZmZzZXQsIHZhbHVlLAogICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgT2soKCkpID0+IGZmaTo6RmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgICAgICBPayhoZWFkKSA9PiBmZmk6OkZsYWdIYXNTZXJ2ZXJPdmVycmlkZVVwZGF0ZUNYWCB7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGhlYWQsCiAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIiksCiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkZsYWdIYXNTZXJ2ZXJPdmVycmlkZVVwZGF0ZUNYWCB7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB1c2l6ZTo6TUFYLAogICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEVycihlcnJtc2cpID0+IGZmaTo6RmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYIHsKICAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgIG9mZnNldDogdXNpemU6Ok1BWCwKICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAogICAgICAgICB9LAogICAgIH0KQEAgLTMwMCwxOCArMzA5LDIxIEBACiAgICAgICAgICAgICBtYXRjaCBjcmF0ZTo6ZmxhZ19pbmZvX3VwZGF0ZTo6dXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKAogICAgICAgICAgICAgICAgIGZpbGUsIHZhbHVlX3R5cGUsIG9mZnNldCwgdmFsdWUsCiAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBPaygoKSkgPT4gZmZpOjpGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CisgICAgICAgICAgICAgICAgT2soaGVhZCkgPT4gZmZpOjpGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGhlYWQsCiAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIiksCiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYIHsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHVzaXplOjpNQVgsCiAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgRXJyKGVycm1zZykgPT4gZmZpOjpGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CiAgICAgICAgICAgICB1cGRhdGVfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICBvZmZzZXQ6IHVzaXplOjpNQVgsCiAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKICAgICAgICAgfSwKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGY2NDA5YjcuLjU1MDhkYWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zOCw1ICszOCwxMCBAQAogICAgICAgICAiZGV2aWNlLXRlc3RzIiwKICAgICAgICAgImdlbmVyYWwtdGVzdHMiLAogICAgIF0sCi0gICAgbGRmbGFnczogWyItV2wsLS1hbGxvdy1tdWx0aXBsZS1kZWZpbml0aW9uIl0sCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImN4eC1icmlkZ2UtaGVhZGVyIiwKKyAgICAgICAgImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfYnJpZGdlX2hlYWRlciIsCisgICAgXSwKKyAgICBnZW5lcmF0ZWRfc291cmNlczogWyJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2JyaWRnZV9jb2RlIl0sCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2N4eF9icmlkZ2UiXSwKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9zdG9yYWdlX3dyaXRlX2FwaV90ZXN0LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9zdG9yYWdlX3dyaXRlX2FwaV90ZXN0LmNwcAppbmRleCAzMTE4M2ZhLi4xMzNmNWEwIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5jcHAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL3N0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QuY3BwCkBAIC0yNSw2ICsyNSw5IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAKKyNpbmNsdWRlICJydXN0L2N4eC5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9saWIucnMuaCIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CiAKIG5hbWVzcGFjZSBhcGkgPSBhY29uZmlnX3N0b3JhZ2U7CkBAIC04NSw2ICs4OCwyMyBAQAogICAgIEFTU0VSVF9UUlVFKHZhbHVlLm9rKCkpOwogICAgIEFTU0VSVF9UUlVFKCp2YWx1ZSk7CiAgIH0KKworICAvLyBsb2FkIHRoZSBmaWxlIG9uIGRpc2sgYW5kIGNoZWNrIGhhcyBiZWVuIHVwZGF0ZWQKKyAgc3RkOjppZnN0cmVhbSBmaWxlKGZsYWdfdmFsLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmF0ZSk7CisgIHN0ZDo6c3RyZWFtc2l6ZSBzaXplID0gZmlsZS50ZWxsZygpOworICBmaWxlLnNlZWtnKDAsIHN0ZDo6aW9zOjpiZWcpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplKTsKKyAgZmlsZS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBidWZmZXIuZGF0YSgpLCBtYXBwZWRfZmlsZS0+ZmlsZV9zaXplKTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gdmFsdWVfY3h4ID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9jeHgoY29udGVudCwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZV9jeHgucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX1RSVUUodmFsdWVfY3h4LmZsYWdfdmFsdWUpOworICB9CiB9CiAKIC8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBxdWVyeWluZyBmbGFnIHZhbHVlIG91dCBvZiByYW5nZQpAQCAtMTEyLDE1ICsxMzIsNDMgQEAKICAgICAgICAgKm1hcHBlZF9maWxlLCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCk7CiAgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLm9rKCkpOwogICAgIEFTU0VSVF9UUlVFKCphdHRyaWJ1dGUgJiBhcGk6OkZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSk7CisgIH0KIAotICAgIHVwZGF0ZV9yZXN1bHQgPSBhcGk6OnNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgIC8vIGxvYWQgdGhlIGZpbGUgb24gZGlzayBhbmQgY2hlY2sgaGFzIGJlZW4gdXBkYXRlZAorICBzdGQ6Omlmc3RyZWFtIGZpbGUoZmxhZ19pbmZvLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmF0ZSk7CisgIHN0ZDo6c3RyZWFtc2l6ZSBzaXplID0gZmlsZS50ZWxsZygpOworICBmaWxlLnNlZWtnKDAsIHN0ZDo6aW9zOjpiZWcpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplKTsKKyAgZmlsZS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBidWZmZXIuZGF0YSgpLCBtYXBwZWRfZmlsZS0+ZmlsZV9zaXplKTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gYXR0cmlidXRlID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eChjb250ZW50LCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLnF1ZXJ5X3N1Y2Nlc3MpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5mbGFnX2F0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlKTsKKyAgfQorCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byB1cGRhdGVfcmVzdWx0ID0gYXBpOjpzZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKAogICAgICAgICAqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0LCBmYWxzZSk7CiAgICAgQVNTRVJUX1RSVUUodXBkYXRlX3Jlc3VsdC5vaygpKTsKLSAgICBhdHRyaWJ1dGUgPSBhcGk6OmdldF9mbGFnX2F0dHJpYnV0ZSgKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IGFwaTo6Z2V0X2ZsYWdfYXR0cmlidXRlKAogICAgICAgICAqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KTsKICAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUub2soKSk7CiAgICAgQVNTRVJUX0ZBTFNFKCphdHRyaWJ1dGUgJiBhcGk6OkZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSk7CiAgIH0KKworICBzdGQ6Omlmc3RyZWFtIGZpbGUyKGZsYWdfaW5mbywgc3RkOjppb3M6OmJpbmFyeSk7CisgIGJ1ZmZlci5jbGVhcigpOworICBmaWxlMi5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBnZXRfZmxhZ19hdHRyaWJ1dGVfY3h4KGNvbnRlbnQsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX0ZBTFNFKGF0dHJpYnV0ZS5mbGFnX2F0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlKTsKKyAgfQogfQogCiAvLy8gVGVzdCB0byBsb2NrIGRvd24gc3RvcmFnZSBmbGFnIGhhcyBsb2NhbCBvdmVycmlkZSB1cGRhdGUgYXBpCkBAIC0xMzcsMTMgKzE4NSw0MSBAQAogICAgICAgICAqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KTsKICAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUub2soKSk7CiAgICAgQVNTRVJUX1RSVUUoKmF0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUpOworICB9CiAKLSAgICB1cGRhdGVfcmVzdWx0ID0gYXBpOjpzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCisgIC8vIGxvYWQgdGhlIGZpbGUgb24gZGlzayBhbmQgY2hlY2sgaGFzIGJlZW4gdXBkYXRlZAorICBzdGQ6Omlmc3RyZWFtIGZpbGUoZmxhZ19pbmZvLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmF0ZSk7CisgIHN0ZDo6c3RyZWFtc2l6ZSBzaXplID0gZmlsZS50ZWxsZygpOworICBmaWxlLnNlZWtnKDAsIHN0ZDo6aW9zOjpiZWcpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplKTsKKyAgZmlsZS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBidWZmZXIuZGF0YSgpLCBtYXBwZWRfZmlsZS0+ZmlsZV9zaXplKTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gYXR0cmlidXRlID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eChjb250ZW50LCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLnF1ZXJ5X3N1Y2Nlc3MpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5mbGFnX2F0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUpOworICB9CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIHVwZGF0ZV9yZXN1bHQgPSBhcGk6OnNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgKICAgICAgICAgKm1hcHBlZF9maWxlLCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCwgZmFsc2UpOwogICAgIEFTU0VSVF9UUlVFKHVwZGF0ZV9yZXN1bHQub2soKSk7Ci0gICAgYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgYXV0byBhdHRyaWJ1dGUgPSBhcGk6OmdldF9mbGFnX2F0dHJpYnV0ZSgKICAgICAgICAgKm1hcHBlZF9maWxlLCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCk7CiAgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLm9rKCkpOwogICAgIEFTU0VSVF9GQUxTRSgqYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSk7CiAgIH0KKworICBzdGQ6Omlmc3RyZWFtIGZpbGUyKGZsYWdfaW5mbywgc3RkOjppb3M6OmJpbmFyeSk7CisgIGJ1ZmZlci5jbGVhcigpOworICBmaWxlMi5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBnZXRfZmxhZ19hdHRyaWJ1dGVfY3h4KGNvbnRlbnQsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX0ZBTFNFKGF0dHJpYnV0ZS5mbGFnX2F0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUpOworICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2FmbGFncy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQW5kcm9pZC5icAppbmRleCAyYTAyMzc5Li5jNDg1ODVhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2FmbGFncy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDcgQEAKICAgICBydXN0bGliczogWwogICAgICAgICAibGliYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAogICAgICAgICAibGliYWNvbmZpZ19wcm90b3MiLAorICAgICAgICAibGliYWNvbmZpZ2RfcHJvdG9zIiwKICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCiAgICAgICAgICJsaWJhbnlob3ciLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0NhcmdvLnRvbWwKaW5kZXggZWVhZTI5NS4uN2RjMzQzNiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9DYXJnby50b21sCkBAIC05LDYgKzksNyBAQAogcHJvdG9idWYgPSAiMy4yLjAiCiByZWdleCA9ICIxLjEwLjMiCiBhY29uZmlnX3Byb3RvcyA9IHsgcGF0aCA9ICIuLi9hY29uZmlnX3Byb3RvcyIgfQorYWNvbmZpZ2RfcHJvdG9zID0geyB2ZXJzaW9uID0gIjAuMS4wIiwgcGF0aCA9ICIuLi8uLi8uLi8uLi8uLi9zeXN0ZW0vc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncy9hY29uZmlnZCJ9CiBuaXggPSB7IHZlcnNpb24gPSAiMC4yOC4wIiwgZmVhdHVyZXMgPSBbInVzZXIiXSB9CiBhY29uZmlnX3N0b3JhZ2VfZmlsZSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX2ZpbGUiIH0KIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvYWNvbmZpZ19zdG9yYWdlX3NvdXJjZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9hY29uZmlnX3N0b3JhZ2Vfc291cmNlLnJzCmluZGV4IDA0MTQwYzcuLmIyZmQzYzkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9hY29uZmlnX3N0b3JhZ2Vfc291cmNlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9hY29uZmlnX3N0b3JhZ2Vfc291cmNlLnJzCkBAIC0xLDUyICsxLDEyNSBAQAotdXNlIGNyYXRlOjp7RmxhZywgRmxhZ1Blcm1pc3Npb24sIEZsYWdTb3VyY2UsIEZsYWdWYWx1ZSwgVmFsdWVQaWNrZWRGcm9tfTsKLXVzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07Ci0KLXVzZSBzdGQ6OmZzOjpGaWxlOwotdXNlIHN0ZDo6aW86OlJlYWQ7Cit1c2UgY3JhdGU6OntGbGFnLCBGbGFnU291cmNlfTsKK3VzZSBjcmF0ZTo6e0ZsYWdQZXJtaXNzaW9uLCBGbGFnVmFsdWUsIFZhbHVlUGlja2VkRnJvbX07Cit1c2UgYWNvbmZpZ2RfcHJvdG9zOjp7CisgICAgUHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlLCBQcm90b0xpc3RTdG9yYWdlTWVzc2FnZSwgUHJvdG9MaXN0U3RvcmFnZU1lc3NhZ2VNc2csCisgICAgUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2UsIFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlTXNnLCBQcm90b1N0b3JhZ2VSZXF1ZXN0TWVzc2FnZXMsCisgICAgUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZSwgUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZU1zZywgUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZXMsCit9OwordXNlIGFueWhvdzo6YW55aG93OwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHByb3RvYnVmOjpNZXNzYWdlOwordXNlIHByb3RvYnVmOjpTcGVjaWFsRmllbGRzOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpuZXQ6OlNodXRkb3duOwordXNlIHN0ZDo6b3M6OnVuaXg6Om5ldDo6VW5peFN0cmVhbTsKIAogcHViIHN0cnVjdCBBY29uZmlnU3RvcmFnZVNvdXJjZSB7fQogCi11c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnByb3Rvczo6UHJvdG9TdG9yYWdlRmlsZXM7CitmbiBjb252ZXJ0KG1zZzogUHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlKSAtPiBSZXN1bHQ8RmxhZz4geworICAgIGxldCAodmFsdWUsIHZhbHVlX3BpY2tlZF9mcm9tKSA9IG1hdGNoICgKKyAgICAgICAgJm1zZy5ib290X2ZsYWdfdmFsdWUsCisgICAgICAgIG1zZy5kZWZhdWx0X2ZsYWdfdmFsdWUsCisgICAgICAgIG1zZy5sb2NhbF9mbGFnX3ZhbHVlLAorICAgICAgICBtc2cuaGFzX2xvY2FsX292ZXJyaWRlLAorICAgICkgeworICAgICAgICAoXywgXywgU29tZShsb2NhbCksIFNvbWUoaGFzX2xvY2FsKSkgaWYgaGFzX2xvY2FsID0+IHsKKyAgICAgICAgICAgIChGbGFnVmFsdWU6OnRyeV9mcm9tKGxvY2FsLmFzX3N0cigpKT8sIFZhbHVlUGlja2VkRnJvbTo6TG9jYWwpCisgICAgICAgIH0KKyAgICAgICAgKFNvbWUoYm9vdCksIFNvbWUoZGVmYXVsdCksIF8sIF8pID0+IHsKKyAgICAgICAgICAgIGxldCB2YWx1ZSA9IEZsYWdWYWx1ZTo6dHJ5X2Zyb20oYm9vdC5hc19zdHIoKSk/OworICAgICAgICAgICAgaWYgKmJvb3QgPT0gZGVmYXVsdCB7CisgICAgICAgICAgICAgICAgKHZhbHVlLCBWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICh2YWx1ZSwgVmFsdWVQaWNrZWRGcm9tOjpTZXJ2ZXIpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgXyA9PiByZXR1cm4gRXJyKGFueWhvdyEoIm1pc3Npbmcgb3ZlcnJpZGUiKSksCisgICAgfTsKIAotc3RhdGljIFNUT1JBR0VfSU5GT19GSUxFX1BBVEg6ICZzdHIgPSAiL21ldGFkYXRhL2Fjb25maWcvcGVyc2lzdGVudF9zdG9yYWdlX2ZpbGVfcmVjb3Jkcy5wYiI7CisgICAgbGV0IHN0YWdlZF92YWx1ZSA9IG1hdGNoIChtc2cuYm9vdF9mbGFnX3ZhbHVlLCBtc2cuc2VydmVyX2ZsYWdfdmFsdWUsIG1zZy5oYXNfc2VydmVyX292ZXJyaWRlKSB7CisgICAgICAgIChTb21lKGJvb3QpLCBTb21lKHNlcnZlciksIF8pIGlmIGJvb3QgPT0gc2VydmVyID0+IE5vbmUsCisgICAgICAgIChTb21lKGJvb3QpLCBTb21lKHNlcnZlciksIFNvbWUoaGFzX3NlcnZlcikpIGlmIGJvb3QgIT0gc2VydmVyICYmIGhhc19zZXJ2ZXIgPT4geworICAgICAgICAgICAgU29tZShGbGFnVmFsdWU6OnRyeV9mcm9tKHNlcnZlci5hc19zdHIoKSk/KQorICAgICAgICB9CisgICAgICAgIF8gPT4gTm9uZSwKKyAgICB9OworCisgICAgbGV0IHBlcm1pc3Npb24gPSBtYXRjaCBtc2cuaXNfcmVhZHdyaXRlIHsKKyAgICAgICAgU29tZShpc19yZWFkd3JpdGUpID0+IHsKKyAgICAgICAgICAgIGlmIGlzX3JlYWR3cml0ZSB7CisgICAgICAgICAgICAgICAgRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGbGFnUGVybWlzc2lvbjo6UmVhZE9ubHkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBOb25lID0+IHJldHVybiBFcnIoYW55aG93ISgibWlzc2luZyBwZXJtaXNzaW9uIikpLAorICAgIH07CisKKyAgICBPayhGbGFnIHsKKyAgICAgICAgbmFtZTogbXNnLmZsYWdfbmFtZS5va19vcihhbnlob3chKCJtaXNzaW5nIGZsYWcgbmFtZSIpKT8sCisgICAgICAgIHBhY2thZ2U6IG1zZy5wYWNrYWdlX25hbWUub2tfb3IoYW55aG93ISgibWlzc2luZyBwYWNrYWdlIG5hbWUiKSk/LAorICAgICAgICB2YWx1ZSwKKyAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgdmFsdWVfcGlja2VkX2Zyb20sCisgICAgICAgIHN0YWdlZF92YWx1ZSwKKyAgICAgICAgY29udGFpbmVyOiAiLSIudG9fc3RyaW5nKCksCisKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgRGV2aWNlQ29uZmlnIGlzIG5vdCBpbiB0aGUgQ0xJLgorICAgICAgICBuYW1lc3BhY2U6ICItIi50b19zdHJpbmcoKSwKKyAgICB9KQorfQorCitmbiByZWFkX2Zyb21fc29ja2V0KCkgLT4gUmVzdWx0PFZlYzxQcm90b0ZsYWdRdWVyeVJldHVybk1lc3NhZ2U+PiB7CisgICAgbGV0IG1lc3NhZ2VzID0gUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2VzIHsKKyAgICAgICAgbXNnczogdmVjIVtQcm90b1N0b3JhZ2VSZXF1ZXN0TWVzc2FnZSB7CisgICAgICAgICAgICBtc2c6IFNvbWUoUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2VNc2c6Okxpc3RTdG9yYWdlTWVzc2FnZShQcm90b0xpc3RTdG9yYWdlTWVzc2FnZSB7CisgICAgICAgICAgICAgICAgbXNnOiBTb21lKFByb3RvTGlzdFN0b3JhZ2VNZXNzYWdlTXNnOjpBbGwodHJ1ZSkpLAorICAgICAgICAgICAgICAgIHNwZWNpYWxfZmllbGRzOiBTcGVjaWFsRmllbGRzOjpuZXcoKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIHNwZWNpYWxfZmllbGRzOiBTcGVjaWFsRmllbGRzOjpuZXcoKSwKKyAgICAgICAgfV0sCisgICAgICAgIHNwZWNpYWxfZmllbGRzOiBTcGVjaWFsRmllbGRzOjpuZXcoKSwKKyAgICB9OworCisgICAgbGV0IG11dCBzb2NrZXQgPSBVbml4U3RyZWFtOjpjb25uZWN0KCIvZGV2L3NvY2tldC9hY29uZmlnZCIpPzsKKworICAgIGxldCBtZXNzYWdlX2J1ZmZlciA9IG1lc3NhZ2VzLndyaXRlX3RvX2J5dGVzKCk/OworICAgIGxldCBtdXQgbWVzc2FnZV9sZW5ndGhfYnVmZmVyOiBbdTg7IDRdID0gWzA7IDRdOworICAgIGxldCBtZXNzYWdlX3NpemUgPSAmbWVzc2FnZV9idWZmZXIubGVuKCk7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzBdID0gKG1lc3NhZ2Vfc2l6ZSA+PiAyNCkgYXMgdTg7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzFdID0gKG1lc3NhZ2Vfc2l6ZSA+PiAxNikgYXMgdTg7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzJdID0gKG1lc3NhZ2Vfc2l6ZSA+PiA4KSBhcyB1ODsKKyAgICBtZXNzYWdlX2xlbmd0aF9idWZmZXJbM10gPSAqbWVzc2FnZV9zaXplIGFzIHU4OworICAgIHNvY2tldC53cml0ZV9hbGwoJm1lc3NhZ2VfbGVuZ3RoX2J1ZmZlcik/OworICAgIHNvY2tldC53cml0ZV9hbGwoJm1lc3NhZ2VfYnVmZmVyKT87CisgICAgc29ja2V0LnNodXRkb3duKFNodXRkb3duOjpXcml0ZSk/OworCisgICAgbGV0IG11dCByZXNwb25zZV9sZW5ndGhfYnVmZmVyOiBbdTg7IDRdID0gWzA7IDRdOworICAgIHNvY2tldC5yZWFkX2V4YWN0KCZtdXQgcmVzcG9uc2VfbGVuZ3RoX2J1ZmZlcik/OworICAgIGxldCByZXNwb25zZV9sZW5ndGggPSB1MzI6OmZyb21fYmVfYnl0ZXMocmVzcG9uc2VfbGVuZ3RoX2J1ZmZlcikgYXMgdXNpemU7CisgICAgbGV0IG11dCByZXNwb25zZV9idWZmZXIgPSB2ZWMhWzA7IHJlc3BvbnNlX2xlbmd0aF07CisgICAgc29ja2V0LnJlYWRfZXhhY3QoJm11dCByZXNwb25zZV9idWZmZXIpPzsKKworICAgIGxldCByZXNwb25zZTogUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZXMgPQorICAgICAgICBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcygmcmVzcG9uc2VfYnVmZmVyKT87CisKKyAgICBtYXRjaCByZXNwb25zZS5tc2dzLmFzX3NsaWNlKCkgeworICAgICAgICBbUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZSB7CisgICAgICAgICAgICBtc2c6IFNvbWUoUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZU1zZzo6TGlzdFN0b3JhZ2VNZXNzYWdlKGxpc3Rfc3RvcmFnZV9tZXNzYWdlKSksCisgICAgICAgICAgICAuLgorICAgICAgICB9XSA9PiBPayhsaXN0X3N0b3JhZ2VfbWVzc2FnZS5mbGFncy5jbG9uZSgpKSwKKyAgICAgICAgXyA9PiBFcnIoYW55aG93ISgidW5leHBlY3RlZCByZXNwb25zZSBmcm9tIGFjb25maWdkIikpLAorICAgIH0KK30KIAogaW1wbCBGbGFnU291cmNlIGZvciBBY29uZmlnU3RvcmFnZVNvdXJjZSB7CiAgICAgZm4gbGlzdF9mbGFncygpIC0+IFJlc3VsdDxWZWM8RmxhZz4+IHsKLSAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOwotCi0gICAgICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6Om9wZW4oU1RPUkFHRV9JTkZPX0ZJTEVfUEFUSCk/OwotICAgICAgICBsZXQgbXV0IGJ5dGVzID0gVmVjOjpuZXcoKTsKLSAgICAgICAgZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGJ5dGVzKT87Ci0gICAgICAgIGxldCBzdG9yYWdlX2ZpbGVfaW5mbzogUHJvdG9TdG9yYWdlRmlsZXMgPSBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcygmYnl0ZXMpPzsKLQotICAgICAgICBmb3IgZmlsZV9pbmZvIGluIHN0b3JhZ2VfZmlsZV9pbmZvLmZpbGVzIHsKLSAgICAgICAgICAgIGxldCBwYWNrYWdlX21hcCA9Ci0gICAgICAgICAgICAgICAgZmlsZV9pbmZvLnBhY2thZ2VfbWFwLm9rX29yKGFueWhvdyEoInN0b3JhZ2UgZmlsZSBpcyBtaXNzaW5nIHBhY2thZ2UgbWFwIikpPzsKLSAgICAgICAgICAgIGxldCBmbGFnX21hcCA9IGZpbGVfaW5mby5mbGFnX21hcC5va19vcihhbnlob3chKCJzdG9yYWdlIGZpbGUgaXMgbWlzc2luZyBmbGFnIG1hcCIpKT87Ci0gICAgICAgICAgICBsZXQgZmxhZ192YWwgPSBmaWxlX2luZm8uZmxhZ192YWwub2tfb3IoYW55aG93ISgic3RvcmFnZSBmaWxlIGlzIG1pc3NpbmcgZmxhZyB2YWwiKSk/OwotICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9Ci0gICAgICAgICAgICAgICAgZmlsZV9pbmZvLmNvbnRhaW5lci5va19vcihhbnlob3chKCJzdG9yYWdlIGZpbGUgaXMgbWlzc2luZyBjb250YWluZXIiKSk/OwotCi0gICAgICAgICAgICBmb3IgbGlzdGVkX2ZsYWcgaW4gYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Omxpc3RfZmxhZ3MoJnBhY2thZ2VfbWFwLCAmZmxhZ19tYXAsICZmbGFnX3ZhbCk/Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goRmxhZyB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWU6IGxpc3RlZF9mbGFnLmZsYWdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogbGlzdGVkX2ZsYWcucGFja2FnZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjp0cnlfZnJvbShsaXN0ZWRfZmxhZy5mbGFnX3ZhbHVlLmFzX3N0cigpKT8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLnRvX3N0cmluZygpLAotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8zMjQ0MzYxNDUpOiBkZWxldGUgbmFtZXNwYWNlIGZpZWxkIG9uY2UgRGV2aWNlQ29uZmlnIGlzbid0IGluIENMSS4KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAiLSIudG9fc3RyaW5nKCksCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzMyNDQzNjE0NSk6IFBvcHVsYXRlIHdpdGggcmVhbCB2YWx1ZXMgb25jZSBBUEkgaXMgYXZhaWxhYmxlLgotICAgICAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCi0gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uOjpSZWFkT25seSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE9rKHJlc3VsdCkKKyAgICAgICAgcmVhZF9mcm9tX3NvY2tldCgpCisgICAgICAgICAgICAubWFwKHxxdWVyeV9tZXNzYWdlc3wgeworICAgICAgICAgICAgICAgIHF1ZXJ5X21lc3NhZ2VzLml0ZXIoKS5tYXAofG1lc3NhZ2V8IGNvbnZlcnQobWVzc2FnZS5jbG9uZSgpKSkuY29sbGVjdDo6PFZlYzxfPj4oKQorICAgICAgICAgICAgfSk/CisgICAgICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgICAgIC5jb2xsZWN0KCkKICAgICB9CiAKICAgICBmbiBvdmVycmlkZV9mbGFnKF9uYW1lc3BhY2U6ICZzdHIsIF9xdWFsaWZpZWRfbmFtZTogJnN0ciwgX3ZhbHVlOiAmc3RyKSAtPiBSZXN1bHQ8KCk+IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9tYWluLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKaW5kZXggMDVjMTViYi4uZDg5MTJhOSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKQEAgLTUwLDYgKzUwLDcgQEAKIGVudW0gVmFsdWVQaWNrZWRGcm9tIHsKICAgICBEZWZhdWx0LAogICAgIFNlcnZlciwKKyAgICBMb2NhbCwKIH0KIAogaW1wbCBzdGQ6OmZtdDo6RGlzcGxheSBmb3IgVmFsdWVQaWNrZWRGcm9tIHsKQEAgLTYwLDYgKzYxLDcgQEAKICAgICAgICAgICAgIG1hdGNoICZzZWxmIHsKICAgICAgICAgICAgICAgICBTZWxmOjpEZWZhdWx0ID0+ICJkZWZhdWx0IiwKICAgICAgICAgICAgICAgICBTZWxmOjpTZXJ2ZXIgPT4gInNlcnZlciIsCisgICAgICAgICAgICAgICAgU2VsZjo6TG9jYWwgPT4gImxvY2FsIiwKICAgICAgICAgICAgIH0KICAgICAgICAgKQogICAgIH0KQEAgLTIzMyw4ICsyMzUsNiBAQAogfQogCiBmbiBzZXRfZmxhZyhxdWFsaWZpZWRfbmFtZTogJnN0ciwgdmFsdWU6ICZzdHIpIC0+IFJlc3VsdDwoKT4gewotICAgIGVuc3VyZSEobml4Ojp1bmlzdGQ6OlVpZDo6Y3VycmVudCgpLmlzX3Jvb3QoKSwgIm11c3QgYmUgcm9vdCB0byBtdXRhdGUgZmxhZ3MiKTsKLQogICAgIGxldCBmbGFnc19iaW5kaW5nID0gRGV2aWNlQ29uZmlnU291cmNlOjpsaXN0X2ZsYWdzKCk/OwogICAgIGxldCBmbGFnID0gZmxhZ3NfYmluZGluZy5pdGVyKCkuZmluZCh8ZnwgZi5xdWFsaWZpZWRfbmFtZSgpID09IHF1YWxpZmllZF9uYW1lKS5va19vcigKICAgICAgICAgYW55aG93ISgibm8gYWNvbmZpZyBmbGFnICd7cXVhbGlmaWVkX25hbWV9Jy4gRG9lcyB0aGUgZmxhZyBoYXZlIGFuIC5hY29uZmlnIGRlZmluaXRpb24/IiksCkBAIC0yODIsMTEgKzI4MiwxNSBAQAogICAgIE9rKHJlc3VsdCkKIH0KIAotZm4gbWFpbigpIHsKK2ZuIG1haW4oKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBlbnN1cmUhKG5peDo6dW5pc3RkOjpVaWQ6OmN1cnJlbnQoKS5pc19yb290KCksICJtdXN0IGJlIHJvb3QiKTsKKwogICAgIGxldCBjbGkgPSBDbGk6OnBhcnNlKCk7CiAgICAgbGV0IG91dHB1dCA9IG1hdGNoIGNsaS5jb21tYW5kIHsKICAgICAgICAgQ29tbWFuZDo6TGlzdCB7IHVzZV9uZXdfc3RvcmFnZTogdHJ1ZSwgY29udGFpbmVyIH0gPT4gewotICAgICAgICAgICAgbGlzdChGbGFnU291cmNlVHlwZTo6QWNvbmZpZ1N0b3JhZ2UsIGNvbnRhaW5lcikubWFwKFNvbWUpCisgICAgICAgICAgICBsaXN0KEZsYWdTb3VyY2VUeXBlOjpBY29uZmlnU3RvcmFnZSwgY29udGFpbmVyKQorICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGFueWhvdyEoInN0b3JhZ2UgbWF5IG5vdCBiZSBlbmFibGVkOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgIC5tYXAoU29tZSkKICAgICAgICAgfQogICAgICAgICBDb21tYW5kOjpMaXN0IHsgdXNlX25ld19zdG9yYWdlOiBmYWxzZSwgY29udGFpbmVyIH0gPT4gewogICAgICAgICAgICAgbGlzdChGbGFnU291cmNlVHlwZTo6RGV2aWNlQ29uZmlnLCBjb250YWluZXIpLm1hcChTb21lKQpAQCAtMjk5LDYgKzMwMyw4IEBACiAgICAgICAgIE9rKE5vbmUpID0+ICgpLAogICAgICAgICBFcnIobWVzc2FnZSkgPT4gcHJpbnRsbiEoIkVycm9yOiB7bWVzc2FnZX0iKSwKICAgICB9CisKKyAgICBPaygoKSkKIH0KIAogI1tjZmcodGVzdCldCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icAppbmRleCA0NTY2YmY5Li43NzA0NzQyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL0FuZHJvaWQuYnAKQEAgLTEzLDEwICsxMywyNCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGphdmFfbGlicmFyeSB7Ci0JbmFtZTogImZha2VfZGV2aWNlX2NvbmZpZyIsCi0Jc3JjczogWyJzcmMvKiovKi5qYXZhIl0sCi0Jc2RrX3ZlcnNpb246ICJub25lIiwKLQlzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKLQlob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBuYW1lOiAiZmFrZV9kZXZpY2VfY29uZmlnIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYW5kcm9pZC91dGlsL0xvZy5qYXZhIiwKKyAgICAgICAgInNyYy9hbmRyb2lkL3Byb3ZpZGVyL0RldmljZUNvbmZpZy5qYXZhIiwKKyAgICAgICAgInNyYy9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YSIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogIm5vbmUiLAorICAgIHN5c3RlbV9tb2R1bGVzOiAiY29yZS1hbGwtc3lzdGVtLW1vZHVsZXMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGlzX3N0dWJzX21vZHVsZTogdHJ1ZSwKIH0KIAoramF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAic3RyaWN0X21vZGVfc3R1YiIsCisgICAgc3JjczogWworICAgICAgICAic3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAiY29yZV9jdXJyZW50IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBpc19zdHVic19tb2R1bGU6IHRydWUsCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIHRvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icApjb3B5IHRvIHRvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQppbmRleCA3MGYxNWNkLi42NDE2MjUyIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCkBAIC0xNCwyMCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgewotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KK3BhY2thZ2UgYW5kcm9pZC5vczsKIAotY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7Ci0gICAgbmFtZTogImlkZV9xdWVyeV9wcm90byIsCi0gICAgc3JjczogWwotICAgICAgICAiaWRlX3F1ZXJ5LnByb3RvIiwKLSAgICBdLAotICAgIHByb3RvOiB7Ci0gICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAotICAgICAgICB0eXBlOiAiZnVsbCIsCi0gICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCi0gICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnByb3RvYnVmLWNwcC1mdWxsIl0sCitwdWJsaWMgY2xhc3MgU3RyaWN0TW9kZSB7CisgICAgcHVibGljIHN0YXRpYyBUaHJlYWRQb2xpY3kgYWxsb3dUaHJlYWREaXNrUmVhZHMoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkUG9saWN5KGZpbmFsIFRocmVhZFBvbGljeSBwb2xpY3kpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGhyZWFkUG9saWN5IHt9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC91dGlsL0xvZy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvdXRpbC9Mb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdmZDBmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvdXRpbC9Mb2cuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworcHVibGljIGZpbmFsIGNsYXNzIExvZyB7CisgICAgcHVibGljIHN0YXRpYyBpbnQgaShTdHJpbmcgdGFnLCBTdHJpbmcgbXNnKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGUoU3RyaW5nIHRhZywgU3RyaW5nIG1zZykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBlKFN0cmluZyB0YWcsIFN0cmluZyBtc2csIFRocm93YWJsZSB0cikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvY2hlY2stZmxhZ2dlZC1hcGlzLnNoIGIvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL2NoZWNrLWZsYWdnZWQtYXBpcy5zaAppbmRleCBkOTkzNGExLi44MDc4Y2Q4IDEwMDc1NQotLS0gYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvY2hlY2stZmxhZ2dlZC1hcGlzLnNoCisrKyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9jaGVjay1mbGFnZ2VkLWFwaXMuc2gKQEAgLTE0LDggKzE0LDEzIEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSMgUnVuIGNoZWNrLWZsYWdnZWQtYXBpcyBmb3IgcHVibGljIEFQSXMgYW5kIHRoZSB0aHJlZSBAU3lzdGVtQXBpIGZsYXZvdXJzCi0jIFVzYWdlOiBsdW5jaCA8eW91ci10YXJnZXQ+ICYmIHNvdXJjZSA8dGhpcyBzY3JpcHQ+CisjIFJ1biBjaGVjay1mbGFnZ2VkLWFwaXMgZm9yIHB1YmxpYyBBUElzIGFuZCB0aGUgdGhyZWUgQFN5c3RlbUFwaSBmbGF2b3Vycy4KKyMKKyMgVGhpcyBzY3JpcHQgZXhwZWN0cyBhbiBhcmd1bWVudCB0byB0ZWxsIGl0IHdoaWNoIHN1YmNvbW1hbmQgb2YKKyMgY2hlY2stZmxhZ2dlZC1hcGlzIHRvIGV4ZWN1dGUuIFJ1biB0aGUgc2NyaXB0IHdpdGhvdXQgYW55IGFyZ3VtZW50cyB0byBzZWUKKyMgdGhlIHZhbGlkIG9wdGlvbnMuCisjCisjIFJlbWVtYmVyIHRvIGx1bmNoIHRvIHNlbGVjdCB0aGUgcmVsZXZhbnQgcmVsZWFzZSBjb25maWcgYmVmb3JlIHJ1bm5pbmcgdGhpcyBzY3JpcHQuCiAKIHNvdXJjZSAkKGNkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpICY+IC9kZXYvbnVsbCAmJiBwd2QpLy4uLy4uL3NoZWxsX3V0aWxzLnNoCiByZXF1aXJlX3RvcApAQCAtNDMsNiArNDgsMTAgQEAKICAgICAgICAgJE1PRFVMRV9MSUJfWE1MX1ZFUlNJT05TCiB9CiAKK2Z1bmN0aW9uIG5vb3AoKSB7CisgICAgdHJ1ZQorfQorCiBmdW5jdGlvbiBhbmluamEoKSB7CiAgICAgbG9jYWwgVD0iJChnZXR0b3ApIgogICAgIChcY2QgIiR7VH0iICYmIHByZWJ1aWx0cy9idWlsZC10b29scy9saW51eC14ODYvYmluL25pbmphIC1mIG91dC9jb21iaW5lZC0ke1RBUkdFVF9QUk9EVUNUfS5uaW5qYSAiJEAiKQpAQCAtNTIsMTEgKzYxLDExIEBACiAgICAgYW5pbmphIC10IHF1ZXJ5IGRldmljZV8iJDEiX2FsbF90YXJnZXRzIHwgZ3JlcCAtQTEgLWUgaW5wdXQ6IHwgdGFpbCAtbjEKIH0KIAotZnVuY3Rpb24gcnVuKCkgeworZnVuY3Rpb24gcnVuX2NoZWNrKCkgewogICAgIGxvY2FsIGVycm9ycz0wCiAKICAgICBlY2hvICIjIGN1cnJlbnQiCi0gICAgY2hlY2stZmxhZ2dlZC1hcGlzIFwKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgY2hlY2sgXAogICAgICAgICAtLWFwaS1zaWduYXR1cmUgJChwYXRoX3RvX2FwaV9zaWduYXR1cmVfZmlsZSAiZnJhbWV3b3Jrcy1iYXNlLWFwaS1jdXJyZW50LnR4dCIpIFwKICAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiBcCiAgICAgICAgIC0tYXBpLXZlcnNpb25zICRQVUJMSUNfWE1MX1ZFUlNJT05TCkBAIC02NCw3ICs3Myw3IEBACiAKICAgICBlY2hvCiAgICAgZWNobyAiIyBzeXN0ZW0tY3VycmVudCIKLSAgICBjaGVjay1mbGFnZ2VkLWFwaXMgXAorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBjaGVjayBcCiAgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLXN5c3RlbS1jdXJyZW50LnR4dCIpIFwKICAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiBcCiAgICAgICAgIC0tYXBpLXZlcnNpb25zICRTWVNURU1fWE1MX1ZFUlNJT05TCkBAIC03Miw3ICs4MSw3IEBACiAKICAgICBlY2hvCiAgICAgZWNobyAiIyBzeXN0ZW0tc2VydmVyLWN1cnJlbnQiCi0gICAgY2hlY2stZmxhZ2dlZC1hcGlzIFwKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgY2hlY2sgXAogICAgICAgICAtLWFwaS1zaWduYXR1cmUgJChwYXRoX3RvX2FwaV9zaWduYXR1cmVfZmlsZSAiZnJhbWV3b3Jrcy1iYXNlLWFwaS1zeXN0ZW0tc2VydmVyLWN1cnJlbnQudHh0IikgXAogICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiIFwKICAgICAgICAgLS1hcGktdmVyc2lvbnMgJFNZU1RFTV9TRVJWRVJfWE1MX1ZFUlNPTlMKQEAgLTgwLDcgKzg5LDcgQEAKIAogICAgIGVjaG8KICAgICBlY2hvICIjIG1vZHVsZS1saWIiCi0gICAgY2hlY2stZmxhZ2dlZC1hcGlzIFwKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgY2hlY2sgXAogICAgICAgICAtLWFwaS1zaWduYXR1cmUgJChwYXRoX3RvX2FwaV9zaWduYXR1cmVfZmlsZSAiZnJhbWV3b3Jrcy1iYXNlLWFwaS1tb2R1bGUtbGliLWN1cnJlbnQudHh0IikgXAogICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiIFwKICAgICAgICAgLS1hcGktdmVyc2lvbnMgJE1PRFVMRV9MSUJfWE1MX1ZFUlNJT05TCkBAIC04OSw4ICs5OCwzOSBAQAogICAgIHJldHVybiAkZXJyb3JzCiB9CiAKLWlmIFtbICIkMSIgIT0gIi0tc2tpcC1idWlsZCIgXV07IHRoZW4KLSAgICBidWlsZCAmJiBydW4KLWVsc2UKLSAgICBydW4KK2Z1bmN0aW9uIHJ1bl9saXN0KCkgeworICAgIGVjaG8gIiMgY3VycmVudCIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgbGlzdCBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiCisKKyAgICBlY2hvCisgICAgZWNobyAiIyBzeXN0ZW0tY3VycmVudCIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgbGlzdCBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLXN5c3RlbS1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYgorCisgICAgZWNobworICAgIGVjaG8gIiMgc3lzdGVtLXNlcnZlci1jdXJyZW50IgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBsaXN0IFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLXNlcnZlci1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYgorCisgICAgZWNobworICAgIGVjaG8gIiMgbW9kdWxlLWxpYiIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgbGlzdCBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLW1vZHVsZS1saWItY3VycmVudC50eHQiKSBcCisgICAgICAgIC0tZmxhZy12YWx1ZXMgJChnZXR0b3ApL291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9hbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIKK30KKworYnVpbGRfY21kPWJ1aWxkCitpZiBbWyAiJDEiID09ICItLXNraXAtYnVpbGQiIF1dOyB0aGVuCisgICAgYnVpbGRfY21kPW5vb3AKKyAgICBzaGlmdCAxCiBmaQorCitjYXNlICIkMSIgaW4KKyAgICBjaGVjaykgJGJ1aWxkX2NtZCAmJiBydW5fY2hlY2sgOzsKKyAgICBsaXN0KSAkYnVpbGRfY21kICYmIHJ1bl9saXN0IDs7CisgICAgKikgZWNobyAidXNhZ2U6ICQoYmFzZW5hbWUgJDApOiBbLS1za2lwLWJ1aWxkXSBjaGVja3xsaXN0IjsgZXhpdCAxCitlc2FjCmRpZmYgLS1naXQgYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvQ2hlY2tGbGFnZ2VkQXBpc1Rlc3Qua3QgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvQ2hlY2tGbGFnZ2VkQXBpc1Rlc3Qua3QKaW5kZXggOGUyODVmNi4uZTA3YWMxZCAxMDA2NDQKLS0tIGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL0NoZWNrRmxhZ2dlZEFwaXNUZXN0Lmt0CisrKyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9DaGVja0ZsYWdnZWRBcGlzVGVzdC5rdApAQCAtMzU4LDQgKzM1OCwyMyBAQAogICAgICAgICAgICAgcGFyc2VBcGlWZXJzaW9ucyhBUElfVkVSU0lPTlMuYnl0ZUlucHV0U3RyZWFtKCkpKQogICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQogICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RMaXN0RmxhZ2dlZEFwaXMoKSB7CisgICAgdmFsIGV4cGVjdGVkID0KKyAgICAgICAgbGlzdE9mKAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5iYXIgRElTQUJMRUQgYW5kcm9pZC9DbGF6ei9CdWlsZGVyIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6eiIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovQ2xhenooKSIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovRk9PIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6ei9nZXRFcnJvckNvZGUoKSIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovaW5uZXJDbGFzc0FyZyhMYW5kcm9pZC9DbGF6ei9CdWlsZGVyOykiLAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5mb28gRU5BQkxFRCBhbmRyb2lkL0NsYXp6L3NldERhdGEoSVtbSUxhbmRyb2lkL3V0aWwvVXRpbGl0eTspIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6ei9zZXRWYXJpYWJsZURhdGEoSVtMYW5kcm9pZC91dGlsL0F0b207KSIpCisgICAgdmFsIGFjdHVhbCA9CisgICAgICAgIGxpc3RGbGFnZ2VkQXBpcygKKyAgICAgICAgICAgIHBhcnNlQXBpU2lnbmF0dXJlKCJpbi1tZW1vcnkiLCBBUElfU0lHTkFUVVJFLmJ5dGVJbnB1dFN0cmVhbSgpKSwKKyAgICAgICAgICAgIHBhcnNlRmxhZ1ZhbHVlcyhnZW5lcmF0ZUZsYWdzUHJvdG8oRU5BQkxFRCwgRElTQUJMRUQpKSkKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL01haW4ua3QgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdAppbmRleCAxZDI0NDBkLi5kMzIzYzIwIDEwMDY0NAotLS0gYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdAorKysgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdApAQCAtMTksMTMgKzE5LDE0IEBACiAKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuQWNvbmZpZwogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkJhc2VJdGVtVmlzaXRvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkNhbGxhYmxlSXRlbQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkNsYXNzSXRlbQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkZpZWxkSXRlbQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLkl0ZW0KLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5NZXRob2RJdGVtCiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwudGV4dC5BcGlGaWxlCiBpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5jb3JlLkNsaWt0Q29tbWFuZAogaW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QuY29yZS5Qcm9ncmFtUmVzdWx0CitpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5jb3JlLnN1YmNvbW1hbmRzCiBpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5wYXJhbWV0ZXJzLm9wdGlvbnMuaGVscAogaW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QucGFyYW1ldGVycy5vcHRpb25zLm9wdGlvbgogaW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QucGFyYW1ldGVycy5vcHRpb25zLnJlcXVpcmVkCkBAIC0xNDEsNiArMTQyLDMzIEBACiAgIH0KIH0KIAordmFsIEFSR19BUElfU0lHTkFUVVJFID0gIi0tYXBpLXNpZ25hdHVyZSIKK3ZhbCBBUkdfQVBJX1NJR05BVFVSRV9IRUxQID0KKyAgICAiIiIKK1BhdGggdG8gQVBJIHNpZ25hdHVyZSBmaWxlLgorVXN1YWxseSBuYW1lZCAqY3VycmVudC50eHQuCitUaXA6IGBtIGZyYW1ld29ya3MtYmFzZS1hcGktY3VycmVudC50eHRgIHdpbGwgZ2VuZXJhdGUgYSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIHBsYXRmb3JtIGFuZCBtYWlubGluZSBBUElzLgorIiIiCisKK3ZhbCBBUkdfRkxBR19WQUxVRVMgPSAiLS1mbGFnLXZhbHVlcyIKK3ZhbCBBUkdfRkxBR19WQUxVRVNfSEVMUCA9CisgICAgIiIiCitQYXRoIHRvIGFjb25maWcgcGFyc2VkX2ZsYWdzIGJpbmFyeSBwcm90byBmaWxlLgorVGlwOiBgbSBhbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnNgIHdpbGwgZ2VuZXJhdGUgYSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBmbGFncy4KKyIiIgorCit2YWwgQVJHX0FQSV9WRVJTSU9OUyA9ICItLWFwaS12ZXJzaW9ucyIKK3ZhbCBBUkdfQVBJX1ZFUlNJT05TX0hFTFAgPQorICAgICIiIgorUGF0aCB0byBBUEkgdmVyc2lvbnMgWE1MIGZpbGUuCitVc3VhbGx5IG5hbWVkIHhtbC12ZXJzaW9ucy54bWwuCitUaXA6IGBtIHNkayBkaXN0YCB3aWxsIGdlbmVyYXRlIGEgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBwbGF0Zm9ybSBhbmQgbWFpbmxpbmUgQVBJcy4KKyIiIgorCitjbGFzcyBNYWluQ29tbWFuZCA6IENsaWt0Q29tbWFuZCgpIHsKKyAgb3ZlcnJpZGUgZnVuIHJ1bigpIHt9Cit9CisKIGNsYXNzIENoZWNrQ29tbWFuZCA6CiAgICAgQ2xpa3RDb21tYW5kKAogICAgICAgICBoZWxwID0KQEAgLTE1MiwzMiArMTgwLDE4IEBACiBUaGUgdG9vbCB3aWxsIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBpZiBhbnkgZmxhZ2dlZCBBUElzIGFyZSBmb3VuZCB0byBiZSB1c2VkIGluIHRoZSBpbmNvcnJlY3Qgd2F5LgogIiIiKSB7CiAgIHByaXZhdGUgdmFsIGFwaVNpZ25hdHVyZVBhdGggYnkKLSAgICAgIG9wdGlvbigiLS1hcGktc2lnbmF0dXJlIikKLSAgICAgICAgICAuaGVscCgKLSAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgIFBhdGggdG8gQVBJIHNpZ25hdHVyZSBmaWxlLgotICAgICAgICAgICAgICBVc3VhbGx5IG5hbWVkICpjdXJyZW50LnR4dC4KLSAgICAgICAgICAgICAgVGlwOiBgbSBmcmFtZXdvcmtzLWJhc2UtYXBpLWN1cnJlbnQudHh0YCB3aWxsIGdlbmVyYXRlIGEgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBwbGF0Zm9ybSBhbmQgbWFpbmxpbmUgQVBJcy4KLSAgICAgICAgICAgICAgIiIiKQorICAgICAgb3B0aW9uKEFSR19BUElfU0lHTkFUVVJFKQorICAgICAgICAgIC5oZWxwKEFSR19BUElfU0lHTkFUVVJFX0hFTFApCiAgICAgICAgICAgLnBhdGgobXVzdEV4aXN0ID0gdHJ1ZSwgY2FuQmVEaXIgPSBmYWxzZSwgbXVzdEJlUmVhZGFibGUgPSB0cnVlKQogICAgICAgICAgIC5yZXF1aXJlZCgpCiAgIHByaXZhdGUgdmFsIGZsYWdWYWx1ZXNQYXRoIGJ5Ci0gICAgICBvcHRpb24oIi0tZmxhZy12YWx1ZXMiKQotICAgICAgICAgIC5oZWxwKAotICAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIFBhdGggdG8gYWNvbmZpZyBwYXJzZWRfZmxhZ3MgYmluYXJ5IHByb3RvIGZpbGUuCi0gICAgICAgICAgICBUaXA6IGBtIGFsbF9hY29uZmlnX2RlY2xhcmF0aW9uc2Agd2lsbCBnZW5lcmF0ZSBhIGZpbGUgdGhhdCBpbmNsdWRlcyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGZsYWdzLgotICAgICAgICAgICAgIiIiKQorICAgICAgb3B0aW9uKEFSR19GTEFHX1ZBTFVFUykKKyAgICAgICAgICAuaGVscChBUkdfRkxBR19WQUxVRVNfSEVMUCkKICAgICAgICAgICAucGF0aChtdXN0RXhpc3QgPSB0cnVlLCBjYW5CZURpciA9IGZhbHNlLCBtdXN0QmVSZWFkYWJsZSA9IHRydWUpCiAgICAgICAgICAgLnJlcXVpcmVkKCkKICAgcHJpdmF0ZSB2YWwgYXBpVmVyc2lvbnNQYXRoIGJ5Ci0gICAgICBvcHRpb24oIi0tYXBpLXZlcnNpb25zIikKLSAgICAgICAgICAuaGVscCgKLSAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICBQYXRoIHRvIEFQSSB2ZXJzaW9ucyBYTUwgZmlsZS4KLSAgICAgICAgICAgIFVzdWFsbHkgbmFtZWQgeG1sLXZlcnNpb25zLnhtbC4KLSAgICAgICAgICAgIFRpcDogYG0gc2RrIGRpc3RgIHdpbGwgZ2VuZXJhdGUgYSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIHBsYXRmb3JtIGFuZCBtYWlubGluZSBBUElzLgotICAgICAgICAgICAgIiIiKQorICAgICAgb3B0aW9uKEFSR19BUElfVkVSU0lPTlMpCisgICAgICAgICAgLmhlbHAoQVJHX0FQSV9WRVJTSU9OU19IRUxQKQogICAgICAgICAgIC5wYXRoKG11c3RFeGlzdCA9IHRydWUsIGNhbkJlRGlyID0gZmFsc2UsIG11c3RCZVJlYWRhYmxlID0gdHJ1ZSkKICAgICAgICAgICAucmVxdWlyZWQoKQogCkBAIC0xOTYsNiArMjEwLDQwIEBACiAgIH0KIH0KIAorY2xhc3MgTGlzdENvbW1hbmQgOgorICAgIENsaWt0Q29tbWFuZCgKKyAgICAgICAgaGVscCA9CisgICAgICAgICAgICAiIiIKK0xpc3QgYWxsIGZsYWdnZWQgQVBJcyBhbmQgY29ycmVzcG9uZGluZyBmbGFncy4KKworVGhlIG91dHB1dCBmb3JtYXQgaXMgIjxmdWxseS1xdWFsaWZpZWQtbmFtZS1vZi1mbGFnPiA8c3RhdGUtb2YtZmxhZz4gPEFQST4iLCBvbmUgbGluZSBwZXIgQVBJLgorCitUaGUgb3V0cHV0IGNhbiBiZSBwb3N0LXByb2Nlc3NlZCBieSBlLmcuIHBpcGluZyBpdCB0byBncmVwIHRvIGZpbHRlciBvdXQgb25seSBlbmFibGVkIEFQSXMsIG9yIGFsbCBBUElzIGd1YXJkZWQgYnkgYSBnaXZlbiBmbGFnLgorIiIiKSB7CisgIHByaXZhdGUgdmFsIGFwaVNpZ25hdHVyZVBhdGggYnkKKyAgICAgIG9wdGlvbihBUkdfQVBJX1NJR05BVFVSRSkKKyAgICAgICAgICAuaGVscChBUkdfQVBJX1NJR05BVFVSRV9IRUxQKQorICAgICAgICAgIC5wYXRoKG11c3RFeGlzdCA9IHRydWUsIGNhbkJlRGlyID0gZmFsc2UsIG11c3RCZVJlYWRhYmxlID0gdHJ1ZSkKKyAgICAgICAgICAucmVxdWlyZWQoKQorICBwcml2YXRlIHZhbCBmbGFnVmFsdWVzUGF0aCBieQorICAgICAgb3B0aW9uKEFSR19GTEFHX1ZBTFVFUykKKyAgICAgICAgICAuaGVscChBUkdfRkxBR19WQUxVRVNfSEVMUCkKKyAgICAgICAgICAucGF0aChtdXN0RXhpc3QgPSB0cnVlLCBjYW5CZURpciA9IGZhbHNlLCBtdXN0QmVSZWFkYWJsZSA9IHRydWUpCisgICAgICAgICAgLnJlcXVpcmVkKCkKKworICBvdmVycmlkZSBmdW4gcnVuKCkgeworICAgIHZhbCBmbGFnZ2VkU3ltYm9scyA9CisgICAgICAgIGFwaVNpZ25hdHVyZVBhdGgudG9GaWxlKCkuaW5wdXRTdHJlYW0oKS51c2UgeworICAgICAgICAgIHBhcnNlQXBpU2lnbmF0dXJlKGFwaVNpZ25hdHVyZVBhdGgudG9TdHJpbmcoKSwgaXQpCisgICAgICAgIH0KKyAgICB2YWwgZmxhZ3MgPSBmbGFnVmFsdWVzUGF0aC50b0ZpbGUoKS5pbnB1dFN0cmVhbSgpLnVzZSB7IHBhcnNlRmxhZ1ZhbHVlcyhpdCkgfQorICAgIHZhbCBvdXRwdXQgPSBsaXN0RmxhZ2dlZEFwaXMoZmxhZ2dlZFN5bWJvbHMsIGZsYWdzKQorICAgIGlmIChvdXRwdXQuaXNOb3RFbXB0eSgpKSB7CisgICAgICBwcmludGxuKG91dHB1dC5qb2luVG9TdHJpbmcoIlxuIikpCisgICAgfQorICB9Cit9CisKIGludGVybmFsIGZ1biBwYXJzZUFwaVNpZ25hdHVyZShwYXRoOiBTdHJpbmcsIGlucHV0OiBJbnB1dFN0cmVhbSk6IFNldDxQYWlyPFN5bWJvbCwgRmxhZz4+IHsKICAgdmFsIG91dHB1dCA9IG11dGFibGVTZXRPZjxQYWlyPFN5bWJvbCwgRmxhZz4+KCkKICAgdmFsIHZpc2l0b3IgPQpAQCAtMjI2LDE1ICsyNzQsMTUgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBvdmVycmlkZSBmdW4gdmlzaXRNZXRob2QobWV0aG9kOiBNZXRob2RJdGVtKSB7Ci0gICAgICAgICAgZ2V0RmxhZ09yTnVsbChtZXRob2QpPy5sZXQgeyBmbGFnIC0+Ci0gICAgICAgICAgICB2YWwgbWV0aG9kTmFtZSA9IGJ1aWxkU3RyaW5nIHsKLSAgICAgICAgICAgICAgYXBwZW5kKG1ldGhvZC5uYW1lKCkpCisgICAgICAgIG92ZXJyaWRlIGZ1biB2aXNpdENhbGxhYmxlKGNhbGxhYmxlOiBDYWxsYWJsZUl0ZW0pIHsKKyAgICAgICAgICBnZXRGbGFnT3JOdWxsKGNhbGxhYmxlKT8ubGV0IHsgZmxhZyAtPgorICAgICAgICAgICAgdmFsIGNhbGxhYmxlU2lnbmF0dXJlID0gYnVpbGRTdHJpbmcgeworICAgICAgICAgICAgICBhcHBlbmQoY2FsbGFibGUubmFtZSgpKQogICAgICAgICAgICAgICBhcHBlbmQoIigiKQotICAgICAgICAgICAgICBtZXRob2QucGFyYW1ldGVycygpLmpvaW5Ubyh0aGlzLCBzZXBhcmF0b3IgPSAiIikgeyBpdC50eXBlKCkuaW50ZXJuYWxOYW1lKCkgfQorICAgICAgICAgICAgICBjYWxsYWJsZS5wYXJhbWV0ZXJzKCkuam9pblRvKHRoaXMsIHNlcGFyYXRvciA9ICIiKSB7IGl0LnR5cGUoKS5pbnRlcm5hbE5hbWUoKSB9CiAgICAgICAgICAgICAgIGFwcGVuZCgiKSIpCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWwgc3ltYm9sID0gU3ltYm9sLmNyZWF0ZU1ldGhvZChtZXRob2QuY29udGFpbmluZ0NsYXNzKCkucXVhbGlmaWVkTmFtZSgpLCBtZXRob2ROYW1lKQorICAgICAgICAgICAgdmFsIHN5bWJvbCA9IFN5bWJvbC5jcmVhdGVNZXRob2QoY2FsbGFibGUuY29udGFpbmluZ0NsYXNzKCkucXVhbGlmaWVkTmFtZSgpLCBjYWxsYWJsZVNpZ25hdHVyZSkKICAgICAgICAgICAgIG91dHB1dC5hZGQoUGFpcihzeW1ib2wsIGZsYWcpKQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDQ2LDQgKzQ5NCwzNSBAQAogICByZXR1cm4gZXJyb3JzCiB9CiAKLWZ1biBtYWluKGFyZ3M6IEFycmF5PFN0cmluZz4pID0gQ2hlY2tDb21tYW5kKCkubWFpbihhcmdzKQorLyoqCisgKiBDb2xsZWN0IGFsbCBrbm93biBpbmZvIGFib3V0IGFsbCBARmxhZ2dlZEFwaSBhbm5vdGF0ZWQgQVBJcy4KKyAqCisgKiBFYWNoIEFQSSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGEgU3RyaW5nLCBvbiB0aGUgZm9ybWF0CisgKiA8cHJlPgorICogICAmbHQ7ZnVsbHktcXVhbGlmaWVkLW5hbWUtb2YtZmxhZyZsdDsgJmx0O3N0YXRlLW9mLWZsYWcmbHQ7ICZsdDtBUEkmbHQ7CisgKiA8L3ByZT4KKyAqCisgKiBAcGFyYW0gZmxhZ2dlZFN5bWJvbHNJblNvdXJjZSB0aGUgc2V0IG9mIHN5bWJvbHMgdGhhdCBhcmUgZmxhZ2dlZCBpbiB0aGUgc291cmNlIGNvZGUKKyAqIEBwYXJhbSBmbGFncyB0aGUgc2V0IG9mIGZsYWdzIGFuZCB0aGVpciB2YWx1ZXMKKyAqIEByZXR1cm4gYSBsaXN0IG9mIFN0cmluZ3MgZW5jb2RpbmcgQVBJIGRhdGEgdXNpbmcgdGhlIGZvcm1hdCBkZXNjcmliZWQgYWJvdmUsIHNvcnRlZAorICogICBhbHBoYWJldGljYWxseQorICovCitpbnRlcm5hbCBmdW4gbGlzdEZsYWdnZWRBcGlzKAorICAgIGZsYWdnZWRTeW1ib2xzSW5Tb3VyY2U6IFNldDxQYWlyPFN5bWJvbCwgRmxhZz4+LAorICAgIGZsYWdzOiBNYXA8RmxhZywgQm9vbGVhbj4KKyk6IExpc3Q8U3RyaW5nPiB7CisgIHZhbCBvdXRwdXQgPSBtdXRhYmxlTGlzdE9mPFN0cmluZz4oKQorICBmb3IgKChzeW1ib2wsIGZsYWcpIGluIGZsYWdnZWRTeW1ib2xzSW5Tb3VyY2UpIHsKKyAgICB2YWwgZmxhZ1N0YXRlID0KKyAgICAgICAgd2hlbiAoZmxhZ3MuZ2V0KGZsYWcpKSB7CisgICAgICAgICAgdHJ1ZSAtPiAiRU5BQkxFRCIKKyAgICAgICAgICBmYWxzZSAtPiAiRElTQUJMRUQiCisgICAgICAgICAgbnVsbCAtPiAiVU5LTk9XTiIKKyAgICAgICAgfQorICAgIG91dHB1dC5hZGQoIiRmbGFnICRmbGFnU3RhdGUgJHtzeW1ib2wudG9QcmV0dHlTdHJpbmcoKX0iKQorICB9CisgIG91dHB1dC5zb3J0KCkKKyAgcmV0dXJuIG91dHB1dAorfQorCitmdW4gbWFpbihhcmdzOiBBcnJheTxTdHJpbmc+KSA9IE1haW5Db21tYW5kKCkuc3ViY29tbWFuZHMoQ2hlY2tDb21tYW5kKCksIExpc3RDb21tYW5kKCkpLm1haW4oYXJncykKZGlmZiAtLWdpdCBhL3Rvb2xzL2VudnNldHVwL3J1bl9lbnZzZXR1cF90ZXN0cyBiL3Rvb2xzL2VudnNldHVwL3J1bl9lbnZzZXR1cF90ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTc3NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZW52c2V0dXAvcnVuX2VudnNldHVwX3Rlc3RzCkBAIC0wLDAgKzEsMjI5IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKK1NPVVJDRV9FTlZTRVRVUD0ic291cmNlIGJ1aWxkL21ha2UvZW52c2V0dXAuc2ggJiYgIgorCitkZWYgdXBkYXRlX2Rpc3BsYXkoKToKKyAgICBzeXMuc3RkZXJyLndyaXRlKCJwYXNzZWRcbiIpCisKK2RlZiBnb190b19yb290KCk6CisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImJ1aWxkL21ha2UvZW52c2V0dXAuc2giKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBvcy5nZXRjd2QoKSA9PSAiLyI6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDYW4ndCBmaW5kIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlXG4iKTsKKyAgICAgICAgICAgIHByaW50KCJcbkZBSUxFRCIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBvcy5jaGRpcigiLi4iKQorCitkZWYgaXNfdGVzdChuYW1lLCB0aGluZyk6CisgICAgaWYgbm90IGNhbGxhYmxlKHRoaW5nKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbmFtZSA9PSAidGVzdCI6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBuYW1lLnN0YXJ0c3dpdGgoInRlc3QiKQorCisKK2RlZiB0ZXN0KHNoZWxsLCBjb21tYW5kLCBleHBlY3RlZF9yZXR1cm4sIGV4cGVjdGVkX3N0ZG91dCwgZXhwZWN0ZWRfc3RkZXJyLCBleHBlY3RlZF9lbnYpOgorICAgIGNvbW1hbmQgKz0gIjsgX3JjPSQ/IgorICAgIGZvciBlbnYgaW4gZXhwZWN0ZWRfZW52LmtleXMoKToKKyAgICAgICAgY29tbWFuZCArPSBmIjsgZWNobyBFTlY6IHtlbnZ9PVxcXCIke2Vudn1cXFwiIgorICAgIGNvbW1hbmQgKz0gIjsgZXhpdCAkX3JjIgorCisgICAgY21kID0gW3NoZWxsLCAiLWMiLCBjb21tYW5kXQorICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGNtZCwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGV4dD1UcnVlKQorCisgICAgc3RhdHVzID0gVHJ1ZQorCisgICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gZXhwZWN0ZWRfcmV0dXJuOgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KGYiRXhwZWN0ZWQgcmV0dXJuIGNvZGU6IHtleHBlY3RlZF9yZXR1cm59IikKKyAgICAgICAgcHJpbnQoZiJBY3R1YWwgcmV0dXJuIGNvZGU6ICAge3Jlc3VsdC5yZXR1cm5jb2RlfSIpCisgICAgICAgIHN0YXR1cyA9IEZhbHNlCisKKyAgICBwcmludGVkX3N0ZG91dCA9IEZhbHNlCisgICAgaWYgZXhwZWN0ZWRfc3Rkb3V0IGFuZCBleHBlY3RlZF9zdGRvdXQgbm90IGluIHJlc3VsdC5zdGRvdXQ6CisgICAgICAgIHByaW50KCkKKyAgICAgICAgcHJpbnQoZiJFeHBlY3RlZCBzdGRvdXQgdG8gY29udGFpbjpcbntleHBlY3RlZF9zdGRvdXR9IikKKyAgICAgICAgcHJpbnQoZiJcbkFjdHVhbCBzdGRvdXQ6XG57cmVzdWx0LnN0ZG91dH0iKQorICAgICAgICBwcmludGVkX3N0ZG91dCA9IFRydWUKKyAgICAgICAgc3RhdHVzID0gRmFsc2UKKworICAgIGlmIGV4cGVjdGVkX3N0ZGVyciBhbmQgZXhwZWN0ZWRfc3RkZXJyIG5vdCBpbiByZXN1bHQuc3RkZXJyOgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KGYiRXhwZWN0ZWQgc3RkZXJyIHRvIGNvbnRhaW46XG57ZXhwZWN0ZWRfc3RkZXJyfSIpCisgICAgICAgIHByaW50KGYiXG5BY3R1YWwgc3RkZXJyOlxue3Jlc3VsdC5zdGRlcnJ9IikKKyAgICAgICAgc3RhdHVzID0gRmFsc2UKKworICAgIGVudl9mYWlsdXJlID0gRmFsc2UKKyAgICBmb3IgaywgdiBpbiBleHBlY3RlZF9lbnYuaXRlbXMoKToKKyAgICAgICAgaWYgZiJ7a309XCJ7dn1cIiIgbm90IGluIHJlc3VsdC5zdGRvdXQ6CisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludChmIkV4cGVjdGVkIGVudmlyb25tZW50IHZhcmlhYmxlIHtrfSB0byBiZToge3Z9IC0tLSB7a309XCJ7dn1cIiIpCisgICAgICAgICAgICBlbnZfZmFpbHVyZSA9IFRydWUKKyAgICAgICAgICAgIHN0YXR1cyA9IEZhbHNlCisKKyAgICBpZiBlbnZfZmFpbHVyZSBhbmQgbm90IHByaW50ZWRfc3Rkb3V0OgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KCJTZWUgc3Rkb3V0OiIpCisgICAgICAgIHByaW50KHJlc3VsdC5zdGRvdXQpCisKKyAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KCJDb21tYW5kIHRvIHJlcHJvZHVjZToiKQorICAgICAgICBwcmludChjb21tYW5kKQorICAgICAgICBwcmludCgpCisKKyAgICByZXR1cm4gc3RhdHVzCisKK05PX0xVTkNIID0geworICAgICJUQVJHRVRfUFJPRFVDVCI6ICIiLAorICAgICJUQVJHRVRfUkVMRUFTRSI6ICIiLAorICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICIiLAorfQorCitkZWYgdGVzdF9pbnZhbGlkX2x1bmNoX3RhcmdldChzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsIFNPVVJDRV9FTlZTRVRVUCArICJsdW5jaCBpbnZhbGlkLXRydW5rX3N0YWdpbmctZW5nIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0xLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX3N0ZGVycj0iQ2Fubm90IGxvY2F0ZSBjb25maWcgbWFrZWZpbGUgZm9yIHByb2R1Y3QiLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCisKK2RlZiB0ZXN0X2Fvc3BfYXJtKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoIGFvc3BfYXJtLXRydW5rX3N0YWdpbmctZW5nIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9eworICAgICAgICAgICAgIlRBUkdFVF9QUk9EVUNUIjogImFvc3BfYXJtIiwKKyAgICAgICAgICAgICJUQVJHRVRfUkVMRUFTRSI6ICJ0cnVua19zdGFnaW5nIiwKKyAgICAgICAgICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICJlbmciLAorICAgICAgICB9KQorCisKK2RlZiB0ZXN0X2x1bmNoMl9lbXB0eShzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsIFNPVVJDRV9FTlZTRVRVUCArICJsdW5jaDIiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTEsIGV4cGVjdGVkX3N0ZG91dD1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfc3RkZXJyPSJObyB0YXJnZXQgc3BlY2lmaWVkLiBTZWUgbHVuY2ggLS1oZWxwIiwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbHVuY2gyX2ZvdXJfcGFyYW1zKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhIGIgYyBkIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0xLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX3N0ZGVycj0iVG9vIG1hbnkgcGFyYW1ldGVycyBnaXZlbi4gU2VlIGx1bmNoIC0taGVscCIsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKK2RlZiB0ZXN0X2x1bmNoMl9hb3NwX2FybShzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsIFNPVVJDRV9FTlZTRVRVUCArICJsdW5jaDIgYW9zcF9hcm0iLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0iPT09PT09PT09IiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9eworICAgICAgICAgICAgIlRBUkdFVF9QUk9EVUNUIjogImFvc3BfYXJtIiwKKyAgICAgICAgICAgICJUQVJHRVRfUkVMRUFTRSI6ICJ0cnVua19zdGFnaW5nIiwKKyAgICAgICAgICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICJlbmciLAorICAgICAgICB9KQorCitkZWYgdGVzdF9sdW5jaDJfYW9zcF9hcm1fdHJ1bmtfc3RhZ2luZyhzaGVsbCk6CisgICAgIyBTb21ld2hhdCB1bmZvcnR1bmF0ZSBiZWNhdXNlIHRydW5rX3N0YWdpbmcgaXMgdGhlIG9ubHkgY29uZmlnIGluCisgICAgIyBhb3NwIHNvIHdlIGNhbid0IHJlYWxseSB0ZXN0IHRoYXQgdGhpcyBpc24ndCBqdXN0IGdldHRpbmcgdGhlIGRlZmF1bHQKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhb3NwX2FybSB0cnVua19zdGFnaW5nIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9Ij09PT09PT09PSIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PXsKKyAgICAgICAgICAgICJUQVJHRVRfUFJPRFVDVCI6ICJhb3NwX2FybSIsCisgICAgICAgICAgICAiVEFSR0VUX1JFTEVBU0UiOiAidHJ1bmtfc3RhZ2luZyIsCisgICAgICAgICAgICAiVEFSR0VUX0JVSUxEX1ZBUklBTlQiOiAiZW5nIiwKKyAgICAgICAgfSkKKworZGVmIHRlc3RfbHVuY2gyX2Fvc3BfYXJtX3RydW5rX3N0YWdpbmdfdXNlcmRlYnVnKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhb3NwX2FybSB0cnVua19zdGFnaW5nIHVzZXJkZWJ1ZyIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSI9PT09PT09PT0iLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj17CisgICAgICAgICAgICAiVEFSR0VUX1BST0RVQ1QiOiAiYW9zcF9hcm0iLAorICAgICAgICAgICAgIlRBUkdFVF9SRUxFQVNFIjogInRydW5rX3N0YWdpbmciLAorICAgICAgICAgICAgIlRBUkdFVF9CVUlMRF9WQVJJQU5UIjogInVzZXJkZWJ1ZyIsCisgICAgICAgIH0pCisKK2RlZiB0ZXN0X2xpc3RfcHJvZHVjdHMoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCAiYnVpbGQvc29vbmcvYmluL2xpc3RfcHJvZHVjdHMiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0iYW9zcF9hcm0iLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbGlzdF9yZWxlYXNlc19wYXJhbShzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsICJidWlsZC9zb29uZy9iaW4vbGlzdF9yZWxlYXNlcyBhb3NwX2FybSIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSJ0cnVua19zdGFnaW5nIiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKK2RlZiB0ZXN0X2xpc3RfcmVsZWFzZXNfZW52KHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgIlRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtIGJ1aWxkL3Nvb25nL2Jpbi9saXN0X3JlbGVhc2VzIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9InRydW5rX3N0YWdpbmciLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbGlzdF9yZWxlYXNlc19ub19wcm9kdWN0KHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgImJ1aWxkL3Nvb25nL2Jpbi9saXN0X3JlbGVhc2VzIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0xLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKK2RlZiB0ZXN0X2xpc3RfdmFyaWFudHMoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCAiYnVpbGQvc29vbmcvYmluL2xpc3RfdmFyaWFudHMiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0idXNlcmRlYnVnIiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKKworZGVmIHRlc3RfZ2V0X2J1aWxkX3Zhcl9pbl9wYXRoKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgIndoaWNoIGdldF9idWlsZF92YXIgIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9InNvb25nL2JpbiIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCisKKworVEVTVFM9c29ydGVkKFsobmFtZSwgdGhpbmcpIGZvciBuYW1lLCB0aGluZyBpbiBsb2NhbHMoKS5pdGVtcygpIGlmIGlzX3Rlc3QobmFtZSwgdGhpbmcpXSkKKworZGVmIG1haW4oKToKKyAgICBpZiBhbnkoW3guZW5kc3dpdGgoIi9zb29uZy9iaW4iKSBmb3IgeCBpbiBvcy5nZXRlbnYoIlBBVEgiKS5zcGxpdCgiOiIpXSk6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInJ1bl9lbnZzZXR1cF90ZXN0cyBtdXN0IGJlIHJ1biBpbiBhIHNoZWxsIHRoYXQgaGFzIG5vdCBzb3VyY2VkIgorICAgICAgICAgICAgICAgICsgIiBlbnZzZXR1cC5zaFxuXG5GQUlMRURcbiIpCisgICAgICAgIHJldHVybiAxCisKKyAgICBnb190b19yb290KCkKKworICAgIHRlc3RzID0gVEVTVFMKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdHMgPSBbKG5hbWUsIGZ1bmMpIGZvciBuYW1lLCBmdW5jIGluIHRlc3RzIGlmIG5hbWUgaW4gc3lzLmFyZ3ZdCisKKyAgICBzaGVsbHMgPSBbIi91c3IvYmluL2Jhc2giLCAiL3Vzci9iaW4venNoIl0KKyAgICB0b3RhbF9jb3VudCA9IGxlbih0ZXN0cykgKiBsZW4oc2hlbGxzKQorICAgIGluZGV4ID0gMQorICAgIGZhaWxlZF90ZXN0cyA9IDAKKworICAgIGZvciBuYW1lLCBmdW5jIGluIHRlc3RzOgorICAgICAgICBmb3Igc2hlbGwgaW4gc2hlbGxzOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShmIlwzM1syS1xye2luZGV4fSBvZiB7dG90YWxfY291bnR9OiB7bmFtZX0gaW4ge3NoZWxsfSIpCisgICAgICAgICAgICBwYXNzZWQgPSBmdW5jKHNoZWxsKQorICAgICAgICAgICAgaWYgbm90IHBhc3NlZDoKKyAgICAgICAgICAgICAgICBmYWlsZWRfdGVzdHMgKz0gMQorICAgICAgICAgICAgaW5kZXggKz0gMQorCisgICAgaWYgZmFpbGVkX3Rlc3RzID4gMDoKKyAgICAgICAgcHJpbnQoZiJcblxuRkFJTEVEOiB7ZmFpbGVkX3Rlc3RzfSBvZiB7dG90YWxfY291bnR9IikKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiXG5cblNVQ0NFU1MiKQorICAgICAgICByZXR1cm4gMAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VudnNldHVwL3NwYW1fZm9yX2x1bmNoIGIvdG9vbHMvZW52c2V0dXAvc3BhbV9mb3JfbHVuY2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmUxNTBhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VudnNldHVwL3NwYW1fZm9yX2x1bmNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGFkIGlzIGtpbmQgb2YgYmlnLCBzbyBvbmx5IHNob3cgaXQgaWYgdGhpcyBhcHBlYXJzIHRvIGJlIGEgY2xlYW4gYnVpbGQuCitzb3VyY2UgJChjZCAkKGRpcm5hbWUgJEJBU0hfU09VUkNFKSAmPiAvZGV2L251bGwgJiYgcHdkKS8uLi8uLi9zaGVsbF91dGlscy5zaAoraWYgW1sgISAtZSAkKGdldG91dGRpcikvc29vbmcvYnVpbGQuJHtUQVJHRVRfUFJPRFVDVH0ubmluamEgXV07IHRoZW4KKyAgZWNobworICBlY2hvICJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IgorICBlY2hvICIgIFdvbmRlcmluZyB3aGV0aGVyIHRvIHVzZSB1c2VyLCB1c2VyZGVidWcgb3IgZW5nPyIKKyAgZWNobworICBlY2hvICIgIHVzZXIgICAgICAgIFRoZSBidWlsZHMgdGhhdCBzaGlwIHRvIHVzZXJzLiBSZWR1Y2VkIGRlYnVnYWJpbGl0eS4iCisgIGVjaG8gIiAgdXNlcmRlYnVnICAgSGlnaCBmaWRlbGl0eSB0byB1c2VyIGJ1aWxkcyBidXQgd2l0aCBzb21lIGRlYnVnZ2luZyBvcHRpb25zIgorICBlY2hvICIgICAgICAgICAgICAgIGVuYWJsZWQuIEJlc3Qgc3VpdGVkIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9yIGRheS10by1kYXkgdXNlIgorICBlY2hvICIgICAgICAgICAgICAgIHdpdGggZGVidWdnaW5nIGVuYWJsZWQuIgorICBlY2hvICIgIGVuZyAgICAgICAgIE1vcmUgZGVidWdnaW5nIG9wdGlvbnMgZW5hYmxlZCBhbmQgZmFzdGVyIGJ1aWxkIHRpbWVzLCBidXQiCisgIGVjaG8gIiAgICAgICAgICAgICAgcnVudGltZSBwZXJmb3JtYW5jZSB0cmFkZW9mZnMuIEJlc3Qgc3VpdGVkIGZvciBkYXktdG8tZGF5IgorICBlY2hvICIgICAgICAgICAgICAgIGxvY2FsIGRldmVsb3BtZW50IHdoZW4gbm90IGRvaW5nIHBlcmZvcm1hbmNlIHRlc3RpbmcuIgorICBlY2hvICJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IgorICBlY2hvCitmaQorCmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icCBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmFkYTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJmaWxlX2xpc3RfZGlmZiIsCisgICAgc3JjczogWyJmaWxlX2xpc3RfZGlmZi5weSJdLAorfQorCitwcmVidWlsdF9ldGNfaG9zdCB7CisgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdCIsCisgICAgc3JjOiAiYWxsb3dsaXN0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2E4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0CkBAIC0wLDAgKzEsMzcgQEAKKyMgS25vd24gZGlmZnMgb25seSBpbiB0aGUgS0FUSSBzeXN0ZW0gaW1hZ2UKK2V0Yy9OT1RJQ0UueG1sLmd6CitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLm9kZXgKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMub2RleC5mc3ZfbWV0YQorZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy52ZGV4CitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLnZkZXguZnN2X21ldGEKK2xpYi9hYXVkaW8tYWlkbC1jcHAuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLmJpb21ldHJpY3MuZmluZ2VycHJpbnRAMi4xLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5jb25maWdAMS4wLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5kZXByZWNhdGVkQDEuMC5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4wLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjEuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMi5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4zLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjQuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyZV9lbGVtZW50QDEuMC5zbworbGliL2NvbS5hbmRyb2lkLm1lZGlhLmFhdWRpby1hY29uZmlnLWNjLnNvCitsaWIvaGVhcHByb2ZkX2NsaWVudC5zbworbGliL2hlYXBwcm9mZF9jbGllbnRfYXBpLnNvCitsaWIvbGliYWF1ZGlvLnNvCitsaWIvbGliYWF1ZGlvX2ludGVybmFsLnNvCitsaWIvbGliYWxhcm1fam5pLnNvCitsaWIvbGliYW1pZGkuc28KK2xpYi9saWJjdXBzLnNvCitsaWIvbGliam5pX2RldmljZUFzV2ViY2FtLnNvCitsaWIvbGlicHJpbnRzcG9vbGVyX2puaS5zbworbGliL2xpYnZlbmRvcnN1cHBvcnQuc28KK2xpYi9saWJ3ZmRzLnNvCitsaWIvbGlieXV2LnNvCisKKyMgYi8zNTEyNTg0NjEKK2FkYl9rZXlzCitpbml0LmVudmlyb24ucmMKKworIyBLbm93biBkaWZmcyBvbmx5IGluIHRoZSBTb29uZyBzeXN0ZW0gaW1hZ2UKK2xpYi9saWJoaWRjb21tYW5kX2puaS5zbworbGliL2xpYnVpbnB1dGNvbW1hbmRfam5pLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmlsZWxpc3RkaWZmL2ZpbGVfbGlzdF9kaWZmLnB5IGIvdG9vbHMvZmlsZWxpc3RkaWZmL2ZpbGVfbGlzdF9kaWZmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzViMmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkKQEAgLTAsMCArMSw2NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK0NPTE9SX1dBUk5JTkcgPSAnXDAzM1s5M20nCitDT0xPUl9FUlJPUiA9ICdcMDMzWzkxbScKK0NPTE9SX05PUk1BTCA9ICdcMDMzWzBtJworCitkZWYgZmluZF91bmlxdWVfaXRlbXMoa2F0aV9pbnN0YWxsZWRfZmlsZXMsIHNvb25nX2luc3RhbGxlZF9maWxlcywgYWxsb3dsaXN0LCBzeXN0ZW1fbW9kdWxlX25hbWUpOgorICAgIHdpdGggb3BlbihrYXRpX2luc3RhbGxlZF9maWxlcywgJ3InKSBhcyBrYXRpX2xpc3RfZmlsZSwgXAorICAgICAgICAgICAgb3Blbihzb29uZ19pbnN0YWxsZWRfZmlsZXMsICdyJykgYXMgc29vbmdfbGlzdF9maWxlLCBcCisgICAgICAgICAgICBvcGVuKGFsbG93bGlzdCwgJ3InKSBhcyBhbGxvd2xpc3RfZmlsZToKKyAgICAgICAga2F0aV9maWxlcyA9IHNldChrYXRpX2xpc3RfZmlsZS5yZWFkKCkuc3BsaXQoKSkKKyAgICAgICAgc29vbmdfZmlsZXMgPSBzZXQoc29vbmdfbGlzdF9maWxlLnJlYWQoKS5zcGxpdCgpKQorICAgICAgICBhbGxvd2VkX2ZpbGVzID0gc2V0KGZpbHRlcihsYW1iZGEgeDogbGVuKHgpLCBtYXAobGFtYmRhIHg6IHgubHN0cmlwKCkuc3BsaXQoJyMnLDEpWzBdLnJzdHJpcCgpICwgYWxsb3dsaXN0X2ZpbGUucmVhZCgpLnNwbGl0KCdcbicpKSkpCisKKyAgICBkZWYgaXNfdW5rbm93bl9kaWZmKGZpbGVwYXRoKToKKyAgICAgICAgcmV0dXJuIG5vdCBmaWxlcGF0aCBpbiBhbGxvd2VkX2ZpbGVzCisKKyAgICB1bmlxdWVfaW5fa2F0aSA9IHNldChmaWx0ZXIoaXNfdW5rbm93bl9kaWZmLCBrYXRpX2ZpbGVzIC0gc29vbmdfZmlsZXMpKQorICAgIHVuaXF1ZV9pbl9zb29uZyA9IHNldChmaWx0ZXIoaXNfdW5rbm93bl9kaWZmLCBzb29uZ19maWxlcyAtIGthdGlfZmlsZXMpKQorCisgICAgaWYgdW5pcXVlX2luX2thdGk6CisgICAgICAgIHByaW50KGYne0NPTE9SX0VSUk9SfVBsZWFzZSBhZGQgZm9sbG93aW5nIG1vZHVsZXMgaW50byBzeXN0ZW0gaW1hZ2UgbW9kdWxlIHtzeXN0ZW1fbW9kdWxlX25hbWV9LntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfV0FSTklOR31LQVRJIG9ubHkgbW9kdWxlKHMpOntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKHVuaXF1ZV9pbl9rYXRpKToKKyAgICAgICAgICAgIHByaW50KGl0ZW0pCisKKyAgICBpZiB1bmlxdWVfaW5fc29vbmc6CisgICAgICAgIGlmIHVuaXF1ZV9pbl9rYXRpOgorICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9UGxlYXNlIGFkZCBmb2xsb3dpbmcgbW9kdWxlcyBpbnRvIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWsue0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfVNvb25nIG9ubHkgbW9kdWxlKHMpOntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKHVuaXF1ZV9pbl9zb29uZyk6CisgICAgICAgICAgICBwcmludChpdGVtKQorCisgICAgaWYgdW5pcXVlX2luX2thdGkgb3IgdW5pcXVlX2luX3Nvb25nOgorICAgICAgICBwcmludCgnJykKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9RkFJTEVEOiBTeXN0ZW0gaW1hZ2UgZnJvbSBLQVRJIGFuZCBTT09ORyBkaWZmZXJzIGZyb20gaW5zdGFsbGVkIGZpbGUgbGlzdC57Q09MT1JfTk9STUFMfScpCisgICAgICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdrYXRpX2luc3RhbGxlZF9maWxlX2xpc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3Nvb25nX2luc3RhbGxlZF9maWxlX2xpc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FsbG93bGlzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnc3lzdGVtX21vZHVsZV9uYW1lJykKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgZmluZF91bmlxdWVfaXRlbXMoYXJncy5rYXRpX2luc3RhbGxlZF9maWxlX2xpc3QsIGFyZ3Muc29vbmdfaW5zdGFsbGVkX2ZpbGVfbGlzdCwgYXJncy5hbGxvd2xpc3QsIGFyZ3Muc3lzdGVtX21vZHVsZV9uYW1lKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9SRUFETUUubWQgYi90b29scy9maW5hbGl6YXRpb24vUkVBRE1FLm1kCmluZGV4IGNjOTdkMWYuLmQwYWVkNjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9SRUFETUUubWQKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL1JFQURNRS5tZApAQCAtMywxOCArMywxOSBAQAogCiAjIyBBdXRvbWF0aW9uOgogMS4gW0Vudmlyb25tZW50IHNldHVwXSguL2Vudmlyb25tZW50LnNoKS4gU2V0IHZhbHVlcyBmb3IgdmFyaW9zIGZpbmFsaXphdGlvbiBjb25zdGFudHMuCi0yLiBbRmluYWxpemUgU0RLXSguL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoKS4gUHJlcGFyZSB0aGUgYnJhbmNoIGZvciBTREsgcmVsZWFzZS4gU0RLIGNvbnRhaW5zIEFuZHJvaWQgSmF2YSBBUElzIGFuZCBvdGhlciBzdGFibGUgQVBJcy4gQ29tbW9ubHkgcmVmZXJyZWQgYXMgYSAxc3Qgc3RlcC4KLTMuIFtGaW5hbGl6ZSBBbmRyb2lkXSguL2ZpbmFsaXplLXNkay1yZWwuc2gpLiBNYXJrIGJyYW5jaCBhcyAiUkVMIiwgaS5lLiBwcmVwYXJlcyBmb3IgQW5kcm9pZCByZWxlYXNlLiBBbnkgc2lnbmVkIGJ1aWxkIGNvbnRhaW5pbmcgdGhlc2UgY2hhbmdlcyB3aWxsIGJlIGNvbnNpZGVyZWQgYW4gb2ZmaWNpYWwgQW5kcm9pZCBSZWxlYXNlLiBSZWZlcnJlZCBhcyBhIDJuZCBmaW5hbGl6YXRpb24gc3RlcC4KLTQuIFtGaW5hbGl6ZSBTREsgYW5kIHN1Ym1pdF0oLi9zdGVwLTEuc2gpLiBEbyBbRmluYWxpemUgU0RLXSguL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoKSBzdGVwLCBjcmVhdGUgQ0xzLCBvcmdhbml6ZSB0aGVtIGludG8gdG9waWMgYW5kIHNlbmQgdG8gR2Vycml0LgotICBhLiBbVXBkYXRlIFNESyBhbmQgc3VibWl0XSguL3VwZGF0ZS1zdGVwLTEuc2gpLiBTYW1lIGFzIGFib3ZlLCBidXQgdXBkYXRlcyB0aGUgZXhpc3RpbmdzIENMcy4KLTUuIFtGaW5hbGl6ZSBBbmRyb2lkIGFuZCBzdWJtaXRdKC4vc3RlcC0yLnNoKS4gRG8gW0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkgc3RlcCwgY3JlYXRlICBDTHMsIG9yZ2FuaXplIHRoZW0gaW50byB0b3BpYyBhbmQgc2VuZCB0byBHZXJyaXQuCi0gIGEuIFtVcGRhdGUgQW5kcm9pZCBhbmQgc3VibWl0XSguL3VwZGF0ZS1zdGVwLTIuc2gpLiBTYW1lIGFzIGFib3ZlLCBidXQgdXBkYXRlcyB0aGUgZXhpc3RpbmdzIENMcy4KKzEuIFtGaW5hbGl6ZSBWSU5URl0oLi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gpLiBQcmVwYXJlIHRoZSBicmFuY2ggZm9yIFZJTlRGIHJlbGVhc2UuCisxLiBbRmluYWxpemUgU0RLXSguL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gpLiBQcmVwYXJlIHRoZSBicmFuY2ggZm9yIFNESyByZWxlYXNlLiBTREsgY29udGFpbnMgQW5kcm9pZCBKYXZhIEFQSXMgYW5kIG90aGVyIHN0YWJsZSBBUElzLiBDb21tb25seSByZWZlcnJlZCBhcyBhIDFzdCBzdGVwLgorMS4gW0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkuIE1hcmsgYnJhbmNoIGFzICJSRUwiLCBpLmUuIHByZXBhcmVzIGZvciBBbmRyb2lkIHJlbGVhc2UuIEFueSBzaWduZWQgYnVpbGQgY29udGFpbmluZyB0aGVzZSBjaGFuZ2VzIHdpbGwgYmUgY29uc2lkZXJlZCBhbiBvZmZpY2lhbCBBbmRyb2lkIFJlbGVhc2UuIFJlZmVycmVkIGFzIGEgMm5kIGZpbmFsaXphdGlvbiBzdGVwLgorMS4gW0ZpbmFsaXplIFZJTlRGIGFuZCBzdWJtaXRdKC4vc3RlcC0wLnNoKS4gRG8gRmluYWxpemUgVklOVEYgc3RlcCwgY3JlYXRlIENMcywgb3JnYW5pemUgdGhlbSBpbnRvIHRvcGljIGFuZCBzZW5kIHRvIEdlcnJpdC4KKzEuIFtGaW5hbGl6ZSBTREsgYW5kIHN1Ym1pdF0oLi9zdGVwLTEuc2gpLiBEbyBGaW5hbGl6ZSBTREsgc3RlcCwgY3JlYXRlIENMcywgb3JnYW5pemUgdGhlbSBpbnRvIHRvcGljIGFuZCBzZW5kIHRvIEdlcnJpdC4KKzEuIFtGaW5hbGl6ZSBBbmRyb2lkIGFuZCBzdWJtaXRdKC4vc3RlcC0yLnNoKS4gRG8gW0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkgc3RlcCwgY3JlYXRlICBDTHMsIG9yZ2FuaXplIHRoZW0gaW50byB0b3BpYyBhbmQgc2VuZCB0byBHZXJyaXQuCiAKICMjIENJOgogUGVyZm9ybWVkIGluIGJ1aWxkIHRhcmdldHMgaW4gRmluYWxpemF0aW9uIGJyYW5jaGVzLgotMS4gW0ZpbmFsaXphdGlvbiBTdGVwIDEsIGdpdF9tYWluLWZpbmEtMS1yZWxlYXNlXShodHRwczovL2FuZHJvaWQtYnVpbGQuY29ycC5nb29nbGUuY29tL2J1aWxkX2V4cGxvcmVyL2JyYW5jaC9naXRfbWFpbi1maW5hLTEtcmVsZWFzZSkuIFRlc3QgWzFzdCBzdGVwL0ZpbmFsaXplIFNES10oLi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaCkuCi0zLiBbRmluYWxpemF0aW9uIFN0ZXAgMiwgZ2l0X21haW4tZmluYS0yLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5jb3JwLmdvb2dsZS5jb20vYnVpbGRfZXhwbG9yZXIvYnJhbmNoL2dpdF9tYWluLWZpbmEtMi1yZWxlYXNlKS4gVGVzdCBbMXN0IHN0ZXAvRmluYWxpemUgU0RLXSguL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoKSBhbmQgWzJuZCBzdGVwL0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkuIFVzZSBbbG9jYWwgZmluYWxpemF0aW9uXSguL2xvY2Fsb25seS1zdGVwcy5zaCkgdG8gYnVpbGQgYW5kIGNvcHkgcHJlc3VibWl0cy4KLTUuIFtMb2NhbCBmaW5hbGl6YXRpb24gc3RlcHNdKC4vbG9jYWxvbmx5LXN0ZXBzLnNoKSBhcmUgZG9uZSBvbmx5IGR1cmluZyBsb2NhbCB0ZXN0aW5nIG9yIGluIHRoZSBDSSBsYWIuIE5vcm1hbGx5IHRoZXNlIHN0ZXBzIHVzZSBhcnRpZmFjdHMgZnJvbSBvdGhlciBidWlsZHMuCisxLiBbRmluYWxpemF0aW9uIFN0ZXAgMCwgZ2l0X21haW4tZmluYS0wLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5jb3JwLmdvb2dsZS5jb20vYnVpbGRfZXhwbG9yZXIvYnJhbmNoL2dpdF9tYWluLWZpbmEtMC1yZWxlYXNlKS4gVGVzdCBGaW5hbGl6ZSBWSU5URi4KKzEuIFtGaW5hbGl6YXRpb24gU3RlcCAxLCBnaXRfbWFpbi1maW5hLTEtcmVsZWFzZV0oaHR0cHM6Ly9hbmRyb2lkLWJ1aWxkLmNvcnAuZ29vZ2xlLmNvbS9idWlsZF9leHBsb3Jlci9icmFuY2gvZ2l0X21haW4tZmluYS0xLXJlbGVhc2UpLiBUZXN0IEZpbmFsaXplIFZJTlRGLCBGaW5hbGl6ZSBTREsuCisxLiBbRmluYWxpemF0aW9uIFN0ZXAgMiwgZ2l0X21haW4tZmluYS0yLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5jb3JwLmdvb2dsZS5jb20vYnVpbGRfZXhwbG9yZXIvYnJhbmNoL2dpdF9tYWluLWZpbmEtMi1yZWxlYXNlKS4gVGVzdCBGaW5hbGl6ZSBWSU5URiwgRmluYWxpemUgU0RLLCBhbmQgWzJuZCBzdGVwL0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkuIFVzZSBbbG9jYWwgZmluYWxpemF0aW9uXSguL2xvY2Fsb25seS1zdGVwcy5zaCkgdG8gYnVpbGQgYW5kIGNvcHkgcHJlc3VibWl0cy4KKzEuIFtMb2NhbCBmaW5hbGl6YXRpb24gc3RlcHNdKC4vbG9jYWxvbmx5LXN0ZXBzLnNoKSBhcmUgZG9uZSBvbmx5IGR1cmluZyBsb2NhbCB0ZXN0aW5nIG9yIGluIHRoZSBDSSBsYWIuIE5vcm1hbGx5IHRoZXNlIHN0ZXBzIHVzZSBhcnRpZmFjdHMgZnJvbSBvdGhlciBidWlsZHMuCiAKICMjIFV0aWxpdHk6CiBbRnVsbCBjbGVhbnVwXSguL2NsZWFudXAuc2gpLiBSZW1vdmUgYWxsIGxvY2FsIGNoYW5nZXMgYW5kIHN3aXRjaCBlYWNoIHByb2plY3QgaW50byBoZWFkLWxlc3Mgc3RhdGUuIFRoaXMgaXMgdGhlIGJlc3Qgc3RhdGUgdG8gc3luYy9yZWJhc2UvZmluYWxpemUgdGhlIGJyYW5jaC4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MWI3MjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLnNoCkBAIC0wLDAgKzEsMTcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK3NldCAtZXgKKworZnVuY3Rpb24gZmluYWxpemVfbWFpbl9zdGVwMCgpIHsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSA7IHRoZW4KKyAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCisgICAgZmk7Cit9CisKK2ZpbmFsaXplX21haW5fc3RlcDAKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtMi5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLTIuc2gKaW5kZXggODRlMjc4Mi4uY2EyMjY3OCAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtMi5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLWFuZC0yLnNoCkBAIC03LDExICs3LDE2IEBACiAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKIAogICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gOyB0aGVuCi0gICAgICAgICMgU0RLIGNvZGVuYW1lIC0+IGludAotICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaAorICAgICAgICAjIFZJTlRGIGZpbmFsaXphdGlvbgorICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKICAgICBmaTsKIAotICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gfHwgWyAiJEZJTkFMX1NUQVRFIiA9ICJzZGsiIF0gOyB0aGVuCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSB8fCBbICIkRklOQUxfU1RBVEUiID0gInZpbnRmIiBdIDsgdGhlbgorICAgICAgICAjIFNESyBjb2RlbmFtZSAtPiBpbnQKKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAorICAgIGZpOworCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSB8fCBbICIkRklOQUxfU1RBVEUiID0gInZpbnRmIiBdIHx8IFsgIiRGSU5BTF9TVEFURSIgPSAic2RrIiBdIDsgdGhlbgogICAgICAgICAjIEFEQiwgUGxhdGZvcm0vTWFpbmxpbmUgU0RLcyBidWlsZCBhbmQgbW92ZSB0byBwcmVidWlsdHMKICAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vbG9jYWxvbmx5LXN0ZXBzLnNoCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEuc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLnNoCmluZGV4IDNkNWVhZGIuLjcyOTQ2OTggMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS5zaApAQCAtNyw4ICs3LDEzIEBACiAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKIAogICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gOyB0aGVuCisgICAgICAgICMgVklOVEYgZmluYWxpemF0aW9uCisgICAgICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaAorICAgIGZpOworCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSB8fCBbICIkRklOQUxfU1RBVEUiID0gInZpbnRmIiBdIDsgdGhlbgogICAgICAgICAjIEJ1aWxkIGZpbmFsaXphdGlvbiBhcnRpZmFjdHMuCi0gICAgICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoCisgICAgICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKICAgICBmaTsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCmluZGV4IGQ5YzQyYzguLjc5NjFlOGIgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKQEAgLTE5LDggKzE5LDE0IEBACiAKICMgT3B0aW9uczoKICMgJ3VuZmluYWxpemVkJyAtIGJyYW5jaCBpcyBpbiBkZXZlbG9wbWVudCBzdGF0ZSwKLSMgJ3NkaycgLSBTREsvQVBJIGlzIGZpbmFsaXplZAorIyAndmludGYnIC0gVklOVEYgaXMgZmluYWxpemVkCisjICdzZGsnIC0gVklOVEYgYW5kIFNESy9BUEkgYXJlIGZpbmFsaXplZAogIyAncmVsJyAtIGJyYW5jaCBpcyBmaW5hbGl6ZWQsIHN3aXRjaGVkIHRvIFJFTAotZXhwb3J0IEZJTkFMX1NUQVRFPSd1bmZpbmFsaXplZCcKK2V4cG9ydCBGSU5BTF9TVEFURT0ndmludGYnCiAKLWV4cG9ydCBCVUlMRF9GUk9NX1NPVVJDRV9TVFVCPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitleHBvcnQgQlVJTERfRlJPTV9TT1VSQ0VfU1RVQj10cnVlCisKKyMgRklOQUwgdmVyc2lvbnMgZm9yIFZJTlRGCisjIFRPRE8oYi8zMjM5ODUyOTcpOiBUaGUgdmVyc2lvbiBtdXN0IG1hdGNoIHdpdGggdGhhdCBmcm9tIHRoZSByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCisjIEluc3RlYWQgb2YgaGFyZGNvZGluZyB0aGUgdmVyc2lvbiBoZXJlLCByZWFkIGl0IGZyb20gYSByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCitleHBvcnQgRklOQUxfQk9BUkRfQVBJX0xFVkVMPScyMDI0MDQnCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlbC5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCmluZGV4IDI0NTMwNWIuLjU5ZmUyOGMgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCkBAIC00MCw5ICs0MCw2IEBACiAgICAgZmkKICAgICBnaXQgLUMgIiR0b3AvY3RzIiBtdiBob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8ke0ZJTkFMX1BMQVRGT1JNX0NPREVOQU1FfSBob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8ke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfQogCi0gICAgIyBzeXN0ZW0vc2Vwb2xpY3kKLSAgICBzeXN0ZW0vc2Vwb2xpY3kvdG9vbHMvZmluYWxpemUtc2RrLXJlbC5zaCAiJHRvcCIgIiRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiIKLQogICAgICMgcHJlYnVpbHRzL2FiaS1kdW1wcy9wbGF0Zm9ybQogICAgIG1rZGlyIC1wICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OIgogICAgIGNwIC1yICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vY3VycmVudC82NC8iICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLyIKQEAgLTUyLDEwICs0OSw2IEBACiAgICAgIyBwcmVidWlsdHMvYWJpLWR1bXBzL25kawogICAgICNta2RpciAtcCAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL25kay8kRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04iCiAgICAgI2NwIC1yICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvbmRrL2N1cnJlbnQvNjQvIiAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL25kay8kRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04vIgotICAgICNpZiBbICIkRklOQUxfU1RBVEUiICE9ICJzZGsiIF0gfHwgWyAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FIiA9PSAiJENVUlJFTlRfUExBVEZPUk1fQ09ERU5BTUUiIF0gOyB0aGVuCi0gICAgICAgICMgcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrCi0gICAgICAgICNtdiAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL3ZuZGsvJENVUlJFTlRfUExBVEZPUk1fQ09ERU5BTUUiICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvdm5kay8kRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04iCi0gICAgI2ZpOwogfQogCiBmaW5hbGl6ZV9zZGtfcmVsCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2ggYi90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSB0b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gKcmVuYW1lIHRvIHRvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVzb3VyY2VzLnNoCmluZGV4IDc1Mzc5ZmYuLjU5NmY4MDMgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaApAQCAtOTYsNyArOTYsNyBAQAogICAgICAgICAkbW9kdWxlc19hcmcKIH0KIAotZnVuY3Rpb24gZmluYWxpemVfYWlkbF92bmRrX3Nka19yZXNvdXJjZXMoKSB7CitmdW5jdGlvbiBmaW5hbGl6ZV9zZGtfcmVzb3VyY2VzKCkgewogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKQEAgLTExMSwxMyArMTExLDYgQEAKICAgICAjIGJpb25pYy9OREsKICAgICBmaW5hbGl6ZV9iaW9uaWNfbmRrCiAKLSAgICAjIHByZS1maW5hbGl6YXRpb24gYnVpbGQgdGFyZ2V0ICh0cnVuaykKLSAgICBsb2NhbCBhaWRsX209IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9SRUxFQVNFPXRydW5rIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBESVNUX0RJUj1vdXQvZGlzdCIKLSAgICBBSURMX1RSQU5TSVRJVkVfRlJFRVpFPXRydWUgJGFpZGxfbSBhaWRsLWZyZWV6ZS1hcGkKLQotICAgICMgVE9ETyhiLzMwOTg4MDQ4NSkKLSAgICAjIEFkZCBiYWNrIGNyZWF0ZV9yZWZlcmVuY2VfZHVtcHMgYW5kICR0b3AvYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQKLQogICAgICMgRmluYWxpemUgU0RLCiAKICAgICAjIGZyYW1ld29ya3MvbGlicy9tb2R1bGVzLXV0aWxzCkBAIC0xMjksMTAgKzEyMiw2IEBACiAgICAgbG9jYWwgYnVpbGRfdG9vbHNfc291cmNlPSIkdG9wL2RldmVsb3BtZW50L3Nkay9idWlsZF90b29sc19zb3VyY2UucHJvcF90ZW1wbGF0ZSIKICAgICBzZWQgLWkgLWUgJ3MvUGtnXC5SZXZpc2lvbi4qL1BrZ1wuUmV2aXNpb249JHtQTEFURk9STV9TREtfVkVSU0lPTn0uMC4wL2cnICRidWlsZF90b29sc19zb3VyY2UKIAotICAgICMgYnVpbGQvbWFrZQotICAgIHNlZCAtaSAtZSAicy9zZXBvbGljeV9tYWpvcl92ZXJzIDo9IC4qL3NlcG9saWN5X21ham9yX3ZlcnMgOj0gJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0vZyIgIiR0b3AvYnVpbGQvbWFrZS9jb3JlL2NvbmZpZy5tayIKLSAgICBjcCAiJHRvcC9idWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dCIgIiR0b3AvYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9nc2kvJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLnR4dCIKLQogICAgICMgYnVpbGQvc29vbmcKICAgICBsb2NhbCBjb2RlbmFtZV92ZXJzaW9uPSJcIiR7RklOQUxfUExBVEZPUk1fQ09ERU5BTUV9XCI6ICR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059IgogICAgIGlmICEgZ3JlcCAtcSAiJGNvZGVuYW1lX3ZlcnNpb24iICIkdG9wL2J1aWxkL3Nvb25nL2FuZHJvaWQvYXBpX2xldmVscy5nbyIgOyB0aGVuCkBAIC0xNzksNSArMTY4LDUgQEAKICAgICAkc2RrX20gdXBkYXRlLWFwaQogfQogCi1maW5hbGl6ZV9haWRsX3ZuZGtfc2RrX3Jlc291cmNlcworZmluYWxpemVfc2RrX3Jlc291cmNlcwogCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTVkOGUxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaApAQCAtMCwwICsxLDYwIEBACisjIS9iaW4vYmFzaAorCitzZXQgLWV4CisKK2Z1bmN0aW9uIGZpbmFsaXplX3ZpbnRmX3Jlc291cmNlcygpIHsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorICAgICMgZW52aXJvbm1lbnQgbmVlZGVkIHRvIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgcnVuIHNjcmlwdHMKKyAgICAjIFRoZXNlIHNob3VsZCByZW1haW4gdGhlIHNhbWUgZm9yIGFsbCBzdGVwcyBoZXJlIHRvIHNwZWVkIHVwIGJ1aWxkIHRpbWUKKyAgICBleHBvcnQgQU5EUk9JRF9CVUlMRF9UT1A9IiR0b3AiCisgICAgZXhwb3J0IEFORFJPSURfSE9TVF9PVVQ9IiRBTkRST0lEX0JVSUxEX1RPUC9vdXQvaG9zdC9saW51eC14ODYiCisgICAgZXhwb3J0IEFORFJPSURfUFJPRFVDVF9PVVQ9IiRBTkRST0lEX0JVSUxEX1RPUC9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19hcm02NCIKKyAgICBleHBvcnQgUEFUSD0iJFBBVEg6JEFORFJPSURfSE9TVF9PVVQvYmluLyIKKyAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnCisgICAgZXhwb3J0IERJU1RfRElSPW91dC9kaXN0CisgICAgZXhwb3J0IFRBUkdFVF9SRUxFQVNFPWZpbmFfMAorICAgIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0CisKKyAgICAjIFRPRE8oYi8zMTQwMTA3NjQpOiBmaW5hbGl6ZSBMTF9OREsKKworICAgICMgc3lzdGVtL3NlcG9saWN5CisgICAgIiR0b3Avc3lzdGVtL3NlcG9saWN5L3Rvb2xzL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaCIgIiR0b3AiICIkRklOQUxfQk9BUkRfQVBJX0xFVkVMIgorCisgICAgY3JlYXRlX25ld19jb21wYXRfbWF0cml4X2FuZF9rZXJuZWxfY29uZmlncworCisgICAgIyBwcmUtZmluYWxpemF0aW9uIGJ1aWxkIHRhcmdldCAodHJ1bmspCisgICAgbG9jYWwgYWlkbF9tPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUiCisgICAgQUlETF9UUkFOU0lUSVZFX0ZSRUVaRT10cnVlICRhaWRsX20gYWlkbC1mcmVlemUtYXBpCit9CisKK2Z1bmN0aW9uIGNyZWF0ZV9uZXdfY29tcGF0X21hdHJpeF9hbmRfa2VybmVsX2NvbmZpZ3MoKSB7CisgICAgIyBUaGUgY29tcGF0aWJpbGl0eSBtYXRyaXggdmVyc2lvbnMgYXJlIGJ1bXBlZCBkdXJpbmcgdkZSQworICAgICMgVGhlc2Ugd2lsbCBjaGFuZ2UgZXZlcnkgdGltZSB3ZSBoYXZlIGEgbmV3IHZGUkMKKyAgICBsb2NhbCBDVVJSRU5UX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMPScyMDI0MDQnCisgICAgbG9jYWwgTkVYVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTD0nMjAyNTA0JworICAgICMgVGhlIGtlcm5lbCBjb25maWdzIG5lZWQgdGhlIGxldHRlciBvZiB0aGUgQW5kcm9pZCByZWxlYXNlCisgICAgbG9jYWwgQ1VSUkVOVF9SRUxFQVNFX0xFVFRFUj0ndicKKyAgICBsb2NhbCBORVhUX1JFTEVBU0VfTEVUVEVSPSd3JworCisKKyAgICAjIGJ1aWxkIHRoZSB0YXJnZXRzIHJlcXVpcmVkIGJlZm9yZSB0b3VjaGluZyB0aGUgQW5kcm9pZC5icC9BbmRyb2lkLm1rIGZpbGVzCisgICAgbG9jYWwgYnVpbGRfY21kPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUiCisgICAgJGJ1aWxkX2NtZCBicG1vZGlmeQorCisgICAgIiR0b3AvcHJlYnVpbHRzL2J1aWxkLXRvb2xzL3BhdGgvbGludXgteDg2L3B5dGhvbjMiICIkdG9wL2hhcmR3YXJlL2ludGVyZmFjZXMvY29tcGF0aWJpbGl0eV9tYXRyaWNlcy9idW1wLnB5IiAiJENVUlJFTlRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwiICIkTkVYVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCIgIiRDVVJSRU5UX1JFTEVBU0VfTEVUVEVSIiAiJE5FWFRfUkVMRUFTRV9MRVRURVIiCisKKyAgICAjIEZyZWV6ZSB0aGUgY3VycmVudCBmcmFtZXdvcmsgbWFuaWZlc3QgZmlsZS4gVGhpcyByZWxpZXMgb24gdGhlCisgICAgIyBhb3NwX2NmX3g4Nl82NC10cnVua19zdGFnaW5nIGJ1aWxkIHRhcmdldCB0byBnZXQgdGhlIHJpZ2h0IG1hbmlmZXN0CisgICAgIyBmcmFnbWVudHMgaW5zdGFsbGVkLgorICAgICIkdG9wL3N5c3RlbS9saWJoaWRsL3ZpbnRmZGF0YS9mcmVlemUuc2giICIkQ1VSUkVOVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCIKK30KKworZnVuY3Rpb24gZnJlZXplX2ZyYW1ld29ya19tYW5pZmVzdCgpIHsKKyAgIEFORFJPSURfUFJPRFVDVF9PVVQ9fi93b3Jrc3BhY2UvaW50ZXJuYWwvbWFpbi9vdXQvdGFyZ2V0L3Byb2R1Y3QvdnNvY194ODYgQU5EUk9JRF9CVUlMRF9UT1A9fi93b3Jrc3BhY2UvaW50ZXJuYWwvbWFpbiBBTkRST0lEX0hPU1RfT1VUPX4vd29ya3NwYWNlL2ludGVybmFsL21haW4vb3V0L2hvc3QvbGludXgteDg2IC4vZnJlZXplLnNoIDIwMjQwNAorCit9CisKKworZmluYWxpemVfdmludGZfcmVzb3VyY2VzCisKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTAuc2ggYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2MWM2NDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0wLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyMgU2NyaXB0IHRvIHBlcmZvcm0gYSAwdGggc3RlcCBvZiBBbmRyb2lkIEZpbmFsaXphdGlvbjogVklOVEYgZmluYWxpemF0aW9uLCBjcmVhdGUgQ0xzIGFuZCB1cGxvYWQgdG8gR2Vycml0LgorCitzZXQgLWV4CisKK2Z1bmN0aW9uIGNvbW1pdF9zdGVwXzBfY2hhbmdlcygpIHsKKyAgICBzZXQgK2UKKyAgICByZXBvIGZvcmFsbCAtYyAnXAorICAgICAgICBpZiBbWyAkKGdpdCBzdGF0dXMgLS1zaG9ydCkgXV07IHRoZW4KKyAgICAgICAgICAgIHJlcG8gc3RhcnQgIlZJTlRGLSRGSU5BTF9CT0FSRF9BUElfTEVWRUwtRmluYWxpemF0aW9uIiA7CisgICAgICAgICAgICBnaXQgYWRkIC1BIC4gOworICAgICAgICAgICAgZ2l0IGNvbW1pdCAtbSAiVmVuZG9yIEFQSSBsZXZlbCAkRklOQUxfQk9BUkRfQVBJX0xFVkVMIGlzIG5vdyBmcm96ZW4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgLW0gIklnbm9yZS1BT1NQLUZpcnN0OiBWSU5URiAkRklOQUxfQk9BUkRfQVBJX0xFVkVMIEZpbmFsaXphdGlvbgorQnVnOiAkRklOQUxfQlVHX0lECitUZXN0OiBidWlsZCI7CisgICAgICAgICAgICByZXBvIHVwbG9hZCAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOworICAgICAgICBmaScKK30KKworZnVuY3Rpb24gZmluYWxpemVfc3RlcF8wX21haW4oKSB7CisgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKKworICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1uZXh0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCisKKyAgICAjIG1vdmUgYWxsIGNoYW5nZXMgdG8gZmluYWxpemF0aW9uIGJyYW5jaC90b3BpYyBhbmQgdXBsb2FkIHRvIGdlcnJpdAorICAgIGNvbW1pdF9zdGVwXzBfY2hhbmdlcworCisgICAgIyBidWlsZCB0byBjb25maXJtIGV2ZXJ5dGhpbmcgaXMgT0sKKyAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbQorfQorCitmaW5hbGl6ZV9zdGVwXzBfbWFpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTEuc2gKaW5kZXggMGRkNGIzYS4uMGU0ODNkNSAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMS5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0xLnNoCkBAIC0yMSwxMCArMjEsOSBAQAogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKLSAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPW5leHQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCiAKLSAgICAjIHZuZGsgZXRjIGZpbmFsaXphdGlvbgotICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAogCiAgICAgIyBtb3ZlIGFsbCBjaGFuZ2VzIHRvIGZpbmFsaXphdGlvbiBicmFuY2gvdG9waWMgYW5kIHVwbG9hZCB0byBnZXJyaXQKICAgICBjb21taXRfc3RlcF8xX2NoYW5nZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTIuc2ggYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0yLnNoCmluZGV4IGQwYjI0YWUuLjM1NmNhZDAgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTIuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMi5zaApAQCAtMTksNyArMTksNyBAQAogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKLSAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPW5leHQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCiAKICAgICAjIHByZWJ1aWx0cyBldGMKICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vdXBkYXRlLXN0ZXAtMS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0xLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDY5OTg4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0xLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgU2NyaXB0IHRvIHBlcmZvcm0gYSAxc3Qgc3RlcCBvZiBBbmRyb2lkIEZpbmFsaXphdGlvbjogQVBJL1NESyBmaW5hbGl6YXRpb24sIHVwZGF0ZSBDTHMgYW5kIHVwbG9hZCB0byBHZXJyaXQuCi0KLSMgV0lQLCBkb2VzIG5vdCB3b3JrIHlldAotZXhpdCAxMAotCi1zZXQgLWV4Ci0KLWZ1bmN0aW9uIHVwZGF0ZV9zdGVwXzFfY2hhbmdlcygpIHsKLSAgICBzZXQgK2UKLSAgICByZXBvIGZvcmFsbCAtYyAnXAotICAgICAgICBpZiBbWyAkKGdpdCBzdGF0dXMgLS1zaG9ydCkgXV07IHRoZW4KLSAgICAgICAgICAgIGdpdCBzdGFzaCAtdSA7Ci0gICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbiIgOwotICAgICAgICAgICAgZ2l0IHN0YXNoIHBvcCA7Ci0gICAgICAgICAgICBnaXQgYWRkIC1BIC4gOwotICAgICAgICAgICAgZ2l0IGNvbW1pdCAtLWFtZW5kIC0tbm8tZWRpdCA7Ci0gICAgICAgICAgICByZXBvIHVwbG9hZCAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOwotICAgICAgICBmaScKLX0KLQotZnVuY3Rpb24gdXBkYXRlX3N0ZXBfMV9tYWluKCkgewotICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgotICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCi0KLQotICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKLQotICAgICMgdm5kayBldGMgZmluYWxpemF0aW9uCi0gICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gKLQotICAgICMgdXBkYXRlIGV4aXN0aW5nIENMcyBhbmQgdXBsb2FkIHRvIGdlcnJpdAotICAgIHVwZGF0ZV9zdGVwXzFfY2hhbmdlcwotCi0gICAgIyBidWlsZCB0byBjb25maXJtIGV2ZXJ5dGhpbmcgaXMgT0sKLSAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbQotfQotCi11cGRhdGVfc3RlcF8xX21haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0yLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyYjg1OTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBTY3JpcHQgdG8gcGVyZm9ybSBhIDJuZCBzdGVwIG9mIEFuZHJvaWQgRmluYWxpemF0aW9uOiBSRUwgZmluYWxpemF0aW9uLCBjcmVhdGUgQ0xzIGFuZCB1cGxvYWQgdG8gR2Vycml0LgotCi0jIFdJUCwgZG9lcyBub3Qgd29yayB5ZXQKLWV4aXQgMTAKLQotc2V0IC1leAotCi1mdW5jdGlvbiB1cGRhdGVfc3RlcF8yX2NoYW5nZXMoKSB7Ci0gICAgc2V0ICtlCi0gICAgcmVwbyBmb3JhbGwgLWMgJ1wKLSAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCi0gICAgICAgICAgICBnaXQgc3Rhc2ggLXUgOwotICAgICAgICAgICAgcmVwbyBzdGFydCAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLVNESy1GaW5hbGl6YXRpb24tUmVsIiA7Ci0gICAgICAgICAgICBnaXQgc3Rhc2ggcG9wIDsKLSAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7Ci0gICAgICAgICAgICBnaXQgY29tbWl0IC0tYW1lbmQgLS1uby1lZGl0IDsKLSAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7Ci0gICAgICAgIGZpJwotfQotCi1mdW5jdGlvbiB1cGRhdGVfc3RlcF8yX21haW4oKSB7Ci0gICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCi0gICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKLQotICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKLQotICAgICMgcHJlYnVpbHRzIGV0YwotICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKLQotICAgICMgbW92ZSBhbGwgY2hhbmdlcyB0byBmaW5hbGl6YXRpb24gYnJhbmNoL3RvcGljIGFuZCB1cGxvYWQgdG8gZ2Vycml0Ci0gICAgdXBkYXRlX3N0ZXBfMl9jaGFuZ2VzCi0KLSAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSwotICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtCi19Ci0KLXVwZGF0ZV9zdGVwXzJfbWFpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L09XTkVSUyBiL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0YTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMKQEAgLTAsMCArMSw0IEBACitpYWxpeWV2QGdvb2dsZS5jb20KK2l2YW5raXJpY2hlbmtvQGdvb2dsZS5jb20KK2thZGlyY2V0QGdvb2dsZS5jb20KK21pY2hhZWxtZXJnQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9BbmRyb2lkLmJwIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKaW5kZXggM2NiYmIwNS4uZTg1ZDQ0NSAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBzaGFyZWRfbGliczogWyJsaWJjbGFuZy1jcHBfaG9zdCJdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJpbmNsdWRlX3NjYW5uZXIiLAotICAgICAgICAiaWRlX3F1ZXJ5X3Byb3RvIiwKKyAgICAgICAgImNjX2FuYWx5emVyX3Byb3RvIiwKICAgICBdLAogICAgIGRlZmF1bHRzOiBbImlkZV9xdWVyeV9jY19hbmFseXplcl9kZWZhdWx0cyJdLAogfQpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWZ1bGwiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImlkZV9xdWVyeV9wcm90byIsCisgICAgICAgICJjY19hbmFseXplcl9wcm90byIsCiAgICAgICAgICJidWlsdGluX2hlYWRlcnMiLAogICAgICAgICAiaW5jbHVkZV9zY2FubmVyIiwKICAgICAgICAgImFuYWx5emVyIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5jYyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5jYwppbmRleCBiYjdjYTBiLi40Y2NlYzU0IDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuY2MKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmNjCkBAIC0yMCw5ICsyMCw5IEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjY19hbmFseXplci5wYi5oIgogI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oIgogI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJpZGVfcXVlcnkucGIuaCIKICNpbmNsdWRlICJpbmNsdWRlX3NjYW5uZXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgpAQCAtNDgsMTEgKzQ4LDExIEBACiB9CiB9ICAvLyBuYW1lc3BhY2UKIAotOjppZGVfcXVlcnk6OkRlcHNSZXNwb25zZSBHZXREZXBzKDo6aWRlX3F1ZXJ5OjpSZXBvU3RhdGUgc3RhdGUpIHsKLSAgOjppZGVfcXVlcnk6OkRlcHNSZXNwb25zZSByZXN1bHRzOworOjpjY19hbmFseXplcjo6RGVwc1Jlc3BvbnNlIEdldERlcHMoOjpjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlKSB7CisgIDo6Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZSByZXN1bHRzOwogICBhdXRvIGRiID0gTG9hZENvbXBEQihzdGF0ZS5jb21wX2RiX3BhdGgoKSk7CiAgIGlmICghZGIpIHsKLSAgICByZXN1bHRzLm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKICAgICByZXN1bHRzLm11dGFibGVfc3RhdHVzKCktPnNldF9tZXNzYWdlKGxsdm06OnRvU3RyaW5nKGRiLnRha2VFcnJvcigpKSk7CiAgICAgcmV0dXJuIHJlc3VsdHM7CiAgIH0KQEAgLTYzLDcgKzYzLDcgQEAKICAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChhYnNfZmlsZSwgYWN0aXZlX2ZpbGUpOwogICAgIGF1dG8gY21kcyA9IGRiLT5nZXQoKS0+Z2V0Q29tcGlsZUNvbW1hbmRzKGFjdGl2ZV9maWxlKTsKICAgICBpZiAoY21kcy5lbXB0eSgpKSB7Ci0gICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjppZGVfcXVlcnk6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKICAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZSgKICAgICAgICAgICBsbHZtOjpUd2luZSgiQ2FuJ3QgZmluZCBjb21waWxlIGZsYWdzIGZvciBmaWxlOiAiLCBhYnNfZmlsZSkuc3RyKCkpOwogICAgICAgY29udGludWU7CkBAIC04MCwxMSArODAsMTEgQEAKICAgcmV0dXJuIHJlc3VsdHM7CiB9CiAKLTo6aWRlX3F1ZXJ5OjpJZGVBbmFseXNpcyBHZXRCdWlsZElucHV0cyg6OmlkZV9xdWVyeTo6UmVwb1N0YXRlIHN0YXRlKSB7Cis6OmNjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBHZXRCdWlsZElucHV0cyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpIHsKICAgYXV0byBkYiA9IExvYWRDb21wREIoc3RhdGUuY29tcF9kYl9wYXRoKCkpOwotICA6OmlkZV9xdWVyeTo6SWRlQW5hbHlzaXMgcmVzdWx0czsKKyAgOjpjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgcmVzdWx0czsKICAgaWYgKCFkYikgewotICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjppZGVfcXVlcnk6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgcmVzdWx0cy5tdXRhYmxlX3N0YXR1cygpLT5zZXRfY29kZSg6OmNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOwogICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UobGx2bTo6dG9TdHJpbmcoZGIudGFrZUVycm9yKCkpKTsKICAgICByZXR1cm4gcmVzdWx0czsKICAgfQpAQCAtOTcsNyArOTcsNiBAQAogICAgIGdlbmZpbGVfcm9vdF9hYnMucHVzaF9iYWNrKCcvJyk7CiAgIH0KIAotICByZXN1bHRzLnNldF9idWlsZF9hcnRpZmFjdF9yb290KHN0YXRlLm91dF9kaXIoKSk7CiAgIGZvciAobGx2bTo6U3RyaW5nUmVmIGFjdGl2ZV9maWxlIDogc3RhdGUuYWN0aXZlX2ZpbGVfcGF0aCgpKSB7CiAgICAgYXV0byYgcmVzdWx0ID0gKnJlc3VsdHMuYWRkX3NvdXJjZXMoKTsKICAgICByZXN1bHQuc2V0X3BhdGgoYWN0aXZlX2ZpbGUuc3RyKCkpOwpAQCAtMTA2LDcgKzEwNSw3IEBACiAgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoYWJzX2ZpbGUsIGFjdGl2ZV9maWxlKTsKICAgICBhdXRvIGNtZHMgPSBkYi0+Z2V0KCktPmdldENvbXBpbGVDb21tYW5kcyhhYnNfZmlsZSk7CiAgICAgaWYgKGNtZHMuZW1wdHkoKSkgewotICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCiAgICAgICAgICAgbGx2bTo6VHdpbmUoIkNhbid0IGZpbmQgY29tcGlsZSBmbGFncyBmb3IgZmlsZTogIiwgYWJzX2ZpbGUpLnN0cigpKTsKICAgICAgIGNvbnRpbnVlOwpAQCAtMTE0LDcgKzExMyw3IEBACiAgICAgY29uc3QgYXV0byYgY21kID0gY21kcy5mcm9udCgpOwogICAgIGxsdm06OlN0cmluZ1JlZiB3b3JraW5nX2RpciA9IGNtZC5EaXJlY3Rvcnk7CiAgICAgaWYgKCF3b3JraW5nX2Rpci5jb25zdW1lX2Zyb250KHJlcG9fZGlyKSkgewotICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoIkNvbW1hbmQgd29ya2luZyBkaXIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19kaXIuc3RyKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb3V0c2lkZSByZXBvc2l0b3J5ICIgKyByZXBvX2Rpcik7CkBAIC0xMjcsNyArMTI2LDcgQEAKICAgICBhdXRvIGluY2x1ZGVzID0KICAgICAgICAgU2NhbkluY2x1ZGVzKGNtZHMuZnJvbnQoKSwgbGx2bTo6dmZzOjpjcmVhdGVQaHlzaWNhbEZpbGVTeXN0ZW0oKSk7CiAgICAgaWYgKCFpbmNsdWRlcykgewotICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6aWRlX3F1ZXJ5OjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCiAgICAgICAgICAgbGx2bTo6dG9TdHJpbmcoaW5jbHVkZXMudGFrZUVycm9yKCkpKTsKICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmggYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaAppbmRleCAzMTMzNzk1Li5mZDE5MDgyIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaApAQCAtMTcsMTcgKzE3LDE3IEBACiAjaWZuZGVmIF9UT09MU19JREVfUVVFUllfQ0NfQU5BTFlaRVJfQU5BTFlaRVJfSF8KICNkZWZpbmUgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9BTkFMWVpFUl9IXwogCi0jaW5jbHVkZSAiaWRlX3F1ZXJ5LnBiLmgiCisjaW5jbHVkZSAiY2NfYW5hbHl6ZXIucGIuaCIKIAogbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyIHsKIAogLy8gU2NhbnMgdGhlIGJ1aWxkIGdyYXBoIGFuZCByZXR1cm5zIHRhcmdldCBuYW1lcyBmcm9tIHRoZSBidWlsZCBncmFwaCB0bwogLy8gZ2VuZXJhdGUgYWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3RpdmUgZmlsZXMuCi06OmlkZV9xdWVyeTo6RGVwc1Jlc3BvbnNlIEdldERlcHMoOjppZGVfcXVlcnk6OlJlcG9TdGF0ZSBzdGF0ZSk7Cis6OmNjX2FuYWx5emVyOjpEZXBzUmVzcG9uc2UgR2V0RGVwcyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpOwogCiAvLyBTY2FucyB0aGUgc291cmNlcyBhbmQgcmV0dXJucyBhbGwgdGhlIHNvdXJjZSBmaWxlcyByZXF1aXJlZCBmb3IgYW5hbHl6aW5nIHRoZQogLy8gYWN0aXZlIGZpbGVzLgotOjppZGVfcXVlcnk6OklkZUFuYWx5c2lzIEdldEJ1aWxkSW5wdXRzKDo6aWRlX3F1ZXJ5OjpSZXBvU3RhdGUgc3RhdGUpOworOjpjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgR2V0QnVpbGRJbnB1dHMoOjpjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlKTsKIAogfSAgLy8gbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9tYWluLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKaW5kZXggOGUwMGM2My4uZDg2ZmM4YyAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgImFuYWx5emVyLmgiCiAjaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCIKLSNpbmNsdWRlICJpZGVfcXVlcnkucGIuaCIKKyNpbmNsdWRlICJjY19hbmFseXplci5wYi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UYXJnZXRTZWxlY3QuaCIKQEAgLTQ4LDkgKzQ4LDkgQEAKICAgICBsbHZtOjpjbDo6ZGVzYygiUHJpbnQgdGhlIGxpc3Qgb2YgaGVhZGVycyB0byBpbnNlcnQgYW5kIHJlbW92ZSIpLAogfTsKIAotaWRlX3F1ZXJ5OjpJZGVBbmFseXNpcyBSZXR1cm5FcnJvcihsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSkgewotICBpZGVfcXVlcnk6OklkZUFuYWx5c2lzIHJlc3VsdDsKLSAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKGlkZV9xdWVyeTo6U3RhdHVzOjpGQUlMVVJFKTsKK2NjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBSZXR1cm5FcnJvcihsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSkgeworICBjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgcmVzdWx0OworICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoY2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CiAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZShtZXNzYWdlLnN0cigpKTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTYxLDcgKzYxLDcgQEAKICAgbGx2bTo6SW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zKCk7CiAgIGxsdm06OmNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KTsKIAotICBpZGVfcXVlcnk6OlJlcG9TdGF0ZSBzdGF0ZTsKKyAgY2NfYW5hbHl6ZXI6OlJlcG9TdGF0ZSBzdGF0ZTsKICAgaWYgKCFzdGF0ZS5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihTVERJTl9GSUxFTk8pKSB7CiAgICAgbGx2bTo6ZXJycygpIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQhXG4iOwogICAgIHJldHVybiAxOwpAQCAtNzAsMTIgKzcwLDEyIEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlPiByZXN1bHQ7CiAgIHN3aXRjaCAobW9kZSkgewogICAgIGNhc2UgT3BNb2RlOjpERVBTOiB7Ci0gICAgICByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPGlkZV9xdWVyeTo6RGVwc1Jlc3BvbnNlPigKKyAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZT4oCiAgICAgICAgICAgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXI6OkdldERlcHMoc3RkOjptb3ZlKHN0YXRlKSkpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgT3BNb2RlOjpJTlBVVFM6IHsKLSAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8aWRlX3F1ZXJ5OjpJZGVBbmFseXNpcz4oCisgICAgICByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPGNjX2FuYWx5emVyOjpJZGVBbmFseXNpcz4oCiAgICAgICAgICAgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXI6OkdldEJ1aWxkSW5wdXRzKHN0ZDo6bW92ZShzdGF0ZSkpKTsKICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIHRvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icApyZW5hbWUgdG8gdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL0FuZHJvaWQuYnAKaW5kZXggNzBmMTVjZC4uMGVkMDdiNCAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9BbmRyb2lkLmJwCkBAIC0xOSw5ICsxOSw5IEBACiB9CiAKIGNjX2xpYnJhcnlfaG9zdF9zdGF0aWMgewotICAgIG5hbWU6ICJpZGVfcXVlcnlfcHJvdG8iLAorICAgIG5hbWU6ICJjY19hbmFseXplcl9wcm90byIsCiAgICAgc3JjczogWwotICAgICAgICAiaWRlX3F1ZXJ5LnByb3RvIiwKKyAgICAgICAgImNjX2FuYWx5emVyLnByb3RvIiwKICAgICBdLAogICAgIHByb3RvOiB7CiAgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLApkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnBiLmdvIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnBiLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmU1YzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vY2NfYW5hbHl6ZXIucGIuZ28KQEAgLTAsMCArMSw3ODkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nby4gRE8gTk9UIEVESVQuCisvLyB2ZXJzaW9uczoKKy8vIAlwcm90b2MtZ2VuLWdvIHYxLjMwLjAKKy8vIAlwcm90b2MgICAgICAgIHYzLjIxLjEyCisvLyBzb3VyY2U6IGNjX2FuYWx5emVyLnByb3RvCisKK3BhY2thZ2UgY2NfYW5hbHl6ZXJfcHJvdG8KKworaW1wb3J0ICgKKwlwcm90b3JlZmxlY3QgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCXByb3RvaW1wbCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2ltcGwiCisJcmVmbGVjdCAicmVmbGVjdCIKKwlzeW5jICJzeW5jIgorKQorCitjb25zdCAoCisJLy8gVmVyaWZ5IHRoYXQgdGhpcyBnZW5lcmF0ZWQgY29kZSBpcyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZS4KKwlfID0gcHJvdG9pbXBsLkVuZm9yY2VWZXJzaW9uKDIwIC0gcHJvdG9pbXBsLk1pblZlcnNpb24pCisJLy8gVmVyaWZ5IHRoYXQgcnVudGltZS9wcm90b2ltcGwgaXMgc3VmZmljaWVudGx5IHVwLXRvLWRhdGUuCisJXyA9IHByb3RvaW1wbC5FbmZvcmNlVmVyc2lvbihwcm90b2ltcGwuTWF4VmVyc2lvbiAtIDIwKQorKQorCit0eXBlIFN0YXR1c19Db2RlIGludDMyCisKK2NvbnN0ICgKKwlTdGF0dXNfT0sgICAgICBTdGF0dXNfQ29kZSA9IDAKKwlTdGF0dXNfRkFJTFVSRSBTdGF0dXNfQ29kZSA9IDEKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBTdGF0dXNfQ29kZS4KK3ZhciAoCisJU3RhdHVzX0NvZGVfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJPSyIsCisJCTE6ICJGQUlMVVJFIiwKKwl9CisJU3RhdHVzX0NvZGVfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiT0siOiAgICAgIDAsCisJCSJGQUlMVVJFIjogMSwKKwl9CispCisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIEVudW0oKSAqU3RhdHVzX0NvZGUgeworCXAgOj0gbmV3KFN0YXR1c19Db2RlKQorCSpwID0geAorCXJldHVybiBwCit9CisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLkVudW1TdHJpbmdPZih4LkRlc2NyaXB0b3IoKSwgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkpCit9CisKK2Z1bmMgKFN0YXR1c19Db2RlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19lbnVtVHlwZXNbMF0uRGVzY3JpcHRvcigpCit9CisKK2Z1bmMgKFN0YXR1c19Db2RlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzWzBdCit9CisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIE51bWJlcigpIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyIHsKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIFN0YXR1c19Db2RlLkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKFN0YXR1c19Db2RlKSBFbnVtRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MCwgMH0KK30KKworLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIGFuYWx5c2lzLgordHlwZSBTdGF0dXMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwlDb2RlIFN0YXR1c19Db2RlIGBwcm90b2J1ZjoidmFyaW50LDEsb3B0LG5hbWU9Y29kZSxwcm90bzMsZW51bT1jY19hbmFseXplci5TdGF0dXNfQ29kZSIganNvbjoiY29kZSxvbWl0ZW1wdHkiYAorCS8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisJTWVzc2FnZSAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT1tZXNzYWdlLHByb3RvMyxvbmVvZiIganNvbjoibWVzc2FnZSxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpTdGF0dXMpIFJlc2V0KCkgeworCSp4ID0gU3RhdHVze30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzBdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKlN0YXR1cykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqU3RhdHVzKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQorfQorCitmdW5jICh4ICpTdGF0dXMpIEdldENvZGUoKSBTdGF0dXNfQ29kZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db2RlCisJfQorCXJldHVybiBTdGF0dXNfT0sKK30KKworZnVuYyAoeCAqU3RhdHVzKSBHZXRNZXNzYWdlKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4Lk1lc3NhZ2UgIT0gbmlsIHsKKwkJcmV0dXJuICp4Lk1lc3NhZ2UKKwl9CisJcmV0dXJuICIiCit9CisKKy8vIFJlcHJlc2VudHMgYW4gQW5kcm9pZCBjaGVja291dCBvbiB1c2VyJ3Mgd29ya3N0YXRpb24uCit0eXBlIFJlcG9TdGF0ZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIEFic29sdXRlIHBhdGggZm9yIHRoZSBjaGVja291dCBpbiB0aGUgd29ya3N0YXRpb24uCisJLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KKwlSZXBvRGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cmVwb19kaXIsanNvbj1yZXBvRGlyLHByb3RvMyIganNvbjoicmVwb19kaXIsb21pdGVtcHR5ImAKKwkvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KKwlBY3RpdmVGaWxlUGF0aCBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIscmVwLG5hbWU9YWN0aXZlX2ZpbGVfcGF0aCxqc29uPWFjdGl2ZUZpbGVQYXRoLHByb3RvMyIganNvbjoiYWN0aXZlX2ZpbGVfcGF0aCxvbWl0ZW1wdHkiYAorCS8vIFJlcG9zaXRvcnkgcmVsYXRpdmUgcGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5IGluIHdvcmtzdGF0aW9uLgorCU91dERpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPW91dF9kaXIsanNvbj1vdXREaXIscHJvdG8zIiBqc29uOiJvdXRfZGlyLG9taXRlbXB0eSJgCisJLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KKwlDb21wRGJQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDQsb3B0LG5hbWU9Y29tcF9kYl9wYXRoLGpzb249Y29tcERiUGF0aCxwcm90bzMiIGpzb246ImNvbXBfZGJfcGF0aCxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIFJlc2V0KCkgeworCSp4ID0gUmVwb1N0YXRle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzFdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKlJlcG9TdGF0ZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgUmVwb1N0YXRlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqUmVwb1N0YXRlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsxfQorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldFJlcG9EaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUmVwb0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRBY3RpdmVGaWxlUGF0aCgpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkFjdGl2ZUZpbGVQYXRoCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRPdXREaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguT3V0RGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldENvbXBEYlBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29tcERiUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworLy8gUHJvdmlkZXMgYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIHByZS1yZXF1aXNpdGllcyBmb3IgcnVubmluZyBsYW5ndWFnZQorLy8gc2VydmljZXMgb24gYWN0aXZlX2ZpbGVfcGF0aHMuCit0eXBlIERlcHNSZXNwb25zZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCURlcHMgICBbXSpEZXBzUmVzcG9uc2VfRGVwcyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKKwlTdGF0dXMgKlN0YXR1cyAgICAgICAgICAgICAgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIFJlc2V0KCkgeworCSp4ID0gRGVwc1Jlc3BvbnNle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzJdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkRlcHNSZXNwb25zZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgRGVwc1Jlc3BvbnNlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqRGVwc1Jlc3BvbnNlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIEdldERlcHMoKSBbXSpEZXBzUmVzcG9uc2VfRGVwcyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5EZXBzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcyBmb3IgdGhlCisvLyBhY3RpdmUgZmlsZXMuCit0eXBlIEdlbmVyYXRlZEZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cGF0aCxwcm90bzMiIGpzb246InBhdGgsb21pdGVtcHR5ImAKKwkvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKwkvLyBmcm9tIHRoZSBwYXRoIGFib3ZlIGluIHVzZXIncyB3b3Jrc3RhdGlvbi4KKwlDb250ZW50cyBbXWJ5dGUgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPWNvbnRlbnRzLHByb3RvMyxvbmVvZiIganNvbjoiY29udGVudHMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgUmVzZXQoKSB7CisJKnggPSBHZW5lcmF0ZWRGaWxle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzNdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpHZW5lcmF0ZWRGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgR2VuZXJhdGVkRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkdlbmVyYXRlZEZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezN9Cit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIEdldFBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgR2V0Q29udGVudHMoKSBbXWJ5dGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29udGVudHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIFNvdXJjZUZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJUGF0aCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXBhdGgscHJvdG8zIiBqc29uOiJwYXRoLG9taXRlbXB0eSJgCisJLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBBbGwgdGhlIHJlbGF0aXZlCisJLy8gcGF0aHMgaW4gY29tcGlsZXJfYXJndW1lbnRzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGlzIHBhdGguCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVdvcmtpbmdEaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT13b3JraW5nX2Rpcixqc29uPXdvcmtpbmdEaXIscHJvdG8zIiBqc29uOiJ3b3JraW5nX2RpcixvbWl0ZW1wdHkiYAorCS8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZS4gSWYgbXVsdGlwbGUgdmFyaWFudHMKKwkvLyBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGFyZSBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHNjcmlwdCB3aWxsIGNob29zZQorCS8vIG9uZS4KKwlDb21waWxlckFyZ3VtZW50cyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMscmVwLG5hbWU9Y29tcGlsZXJfYXJndW1lbnRzLGpzb249Y29tcGlsZXJBcmd1bWVudHMscHJvdG8zIiBqc29uOiJjb21waWxlcl9hcmd1bWVudHMsb21pdGVtcHR5ImAKKwkvLyBBbnkgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgYXJlIHVzZWQgaW4gY29tcGlsaW5nIHRoZSBmaWxlLgorCUdlbmVyYXRlZCBbXSpHZW5lcmF0ZWRGaWxlIGBwcm90b2J1ZjoiYnl0ZXMsNCxyZXAsbmFtZT1nZW5lcmF0ZWQscHJvdG8zIiBqc29uOiJnZW5lcmF0ZWQsb21pdGVtcHR5ImAKKwkvLyBQYXRocyB0byBhbGwgb2YgdGhlIHNvdXJjZXMsIGxpa2UgYnVpbGQgZmlsZXMsIGNvZGUgZ2VuZXJhdG9ycywKKwkvLyBwcm90byBmaWxlcyBldGMuIHRoYXQgd2VyZSB1c2VkIGR1cmluZyBhbmFseXNpcy4gVXNlZCB0byBmaWd1cmUKKwkvLyBvdXQgd2hlbiBhIHNldCBvZiBidWlsZCBhcnRpZmFjdHMgYXJlIHN0YWxlIGFuZCB0aGUgcXVlcnkgdG9vbAorCS8vIG11c3QgYmUgcmUtcnVuLgorCS8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlEZXBzIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNSxyZXAsbmFtZT1kZXBzLHByb3RvMyIganNvbjoiZGVwcyxvbWl0ZW1wdHkiYAorCS8vIFJlcHJlc2VudHMgYW5hbHlzaXMgc3RhdHVzIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsZS4gZS5nLiBub3QgcGFydAorCS8vIG9mIHRoZSBidWlsZCBncmFwaC4KKwlTdGF0dXMgKlN0YXR1cyBgcHJvdG9idWY6ImJ5dGVzLDYsb3B0LG5hbWU9c3RhdHVzLHByb3RvMyxvbmVvZiIganNvbjoic3RhdHVzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIFJlc2V0KCkgeworCSp4ID0gU291cmNlRmlsZXt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s0XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqU291cmNlRmlsZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIFNvdXJjZUZpbGUuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpTb3VyY2VGaWxlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs0fQorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRQYXRoKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlBhdGgKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldFdvcmtpbmdEaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV29ya2luZ0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0Q29tcGlsZXJBcmd1bWVudHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21waWxlckFyZ3VtZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldEdlbmVyYXRlZCgpIFtdKkdlbmVyYXRlZEZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguR2VuZXJhdGVkCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0RGVwcygpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkRlcHMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3R5cGUgSWRlQW5hbHlzaXMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwlTb3VyY2VzIFtdKlNvdXJjZUZpbGUgYHByb3RvYnVmOiJieXRlcywyLHJlcCxuYW1lPXNvdXJjZXMscHJvdG8zIiBqc29uOiJzb3VyY2VzLG9taXRlbXB0eSJgCisJLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgorCS8vIFNob3VsZCBmYWlsIG9ubHkgd2hlbiBubyBhbmFseXNpcyBjYW4gYmUgcGVyZm9ybWVkLgorCVN0YXR1cyAqU3RhdHVzIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFJlc2V0KCkgeworCSp4ID0gSWRlQW5hbHlzaXN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpJZGVBbmFseXNpcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s1XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBJZGVBbmFseXNpcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKklkZUFuYWx5c2lzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs1fQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0U291cmNlcygpIFtdKlNvdXJjZUZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEJ1aWxkIGRlcGVuZGVuY2llcyBvZiBhIHNvdXJjZSBmaWxlIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMuCit0eXBlIERlcHNSZXNwb25zZV9EZXBzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisJU291cmNlRmlsZSBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXNvdXJjZV9maWxlLGpzb249c291cmNlRmlsZSxwcm90bzMiIGpzb246InNvdXJjZV9maWxlLG9taXRlbXB0eSJgCisJLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgorCUJ1aWxkVGFyZ2V0IFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixyZXAsbmFtZT1idWlsZF90YXJnZXQsanNvbj1idWlsZFRhcmdldCxwcm90bzMiIGpzb246ImJ1aWxkX3RhcmdldCxvbWl0ZW1wdHkiYAorCVN0YXR1cyAgICAgICpTdGF0dXMgIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFJlc2V0KCkgeworCSp4ID0gRGVwc1Jlc3BvbnNlX0RlcHN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpEZXBzUmVzcG9uc2VfRGVwcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s2XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBEZXBzUmVzcG9uc2VfRGVwcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkRlcHNSZXNwb25zZV9EZXBzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyLCAwfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgR2V0U291cmNlRmlsZSgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VGaWxlCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgR2V0QnVpbGRUYXJnZXQoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5CdWlsZFRhcmdldAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3ZhciBGaWxlX2NjX2FuYWx5emVyX3Byb3RvIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcgorCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjID0gW11ieXRleworCTB4MGEsIDB4MTEsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NzAsIDB4NzIsCisJMHg2ZiwgMHg3NCwgMHg2ZiwgMHgxMiwgMHgwYiwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwKKwkweDIyLCAweDdlLCAweDBhLCAweDA2LCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDEyLCAweDJjLCAweDBhLCAweDA0LCAweDYzLCAweDZmLAorCTB4NjQsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsCisJMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyZSwgMHg0MywgMHg2ZiwKKwkweDY0LCAweDY1LCAweDUyLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDEyLCAweDFkLCAweDBhLCAweDA3LCAweDZkLCAweDY1LCAweDczLCAweDczLAorCTB4NjEsIDB4NjcsIDB4NjUsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDcsIDB4NmQsIDB4NjUsIDB4NzMsCisJMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHg4OCwgMHgwMSwgMHgwMSwgMHgyMiwgMHgxYiwgMHgwYSwgMHgwNCwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxMiwKKwkweDA2LCAweDBhLCAweDAyLCAweDRmLCAweDRiLCAweDEwLCAweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDU1LAorCTB4NTIsIDB4NDUsIDB4MTAsIDB4MDEsIDB4NDIsIDB4MGEsIDB4MGEsIDB4MDgsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsCisJMHgyMiwgMHg4YiwgMHgwMSwgMHgwYSwgMHgwOSwgMHg1MiwgMHg2NSwgMHg3MCwgMHg2ZiwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2NSwgMHgxMiwgMHgxOSwKKwkweDBhLCAweDA4LCAweDcyLCAweDY1LCAweDcwLCAweDZmLCAweDVmLCAweDY0LCAweDY5LCAweDcyLCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LAorCTB4NTIsIDB4MDcsIDB4NzIsIDB4NjUsIDB4NzAsIDB4NmYsIDB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MjgsIDB4MGEsIDB4MTAsIDB4NjEsIDB4NjMsIDB4NzQsCisJMHg2OSwgMHg3NiwgMHg2NSwgMHg1ZiwgMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMiwgMHgyMCwKKwkweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBlLCAweDYxLCAweDYzLCAweDc0LCAweDY5LCAweDc2LCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLAorCTB4NjEsIDB4NzQsIDB4NjgsIDB4MTIsIDB4MTcsIDB4MGEsIDB4MDcsIDB4NmYsIDB4NzUsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsIDB4MTgsIDB4MDMsCisJMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNiwgMHg2ZiwgMHg3NSwgMHg3NCwgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgyMCwgMHgwYSwgMHgwYywKKwkweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDVmLCAweDY0LCAweDYyLCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDA0LCAweDIwLCAweDAxLAorCTB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NDQsIDB4NjIsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MjIsIDB4ODksCisJMHgwMiwgMHgwYSwgMHgwYywgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgxMiwKKwkweDMyLCAweDBhLCAweDA0LCAweDY0LCAweDY1LCAweDcwLCAweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDFlLCAweDJlLAorCTB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NDQsIDB4NjUsIDB4NzAsIDB4NzMsCisJMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgyZSwgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHgwNCwgMHg2NCwKKwkweDY1LCAweDcwLCAweDczLCAweDEyLCAweDMwLCAweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAyLCAweDIwLAorCTB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTMsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsCisJMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwKKwkweDc1LCAweDczLCAweDg4LCAweDAxLCAweDAxLCAweDFhLCAweDg3LCAweDAxLCAweDBhLCAweDA0LCAweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDEyLCAweDFmLAorCTB4MGEsIDB4MGIsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwKKwkweDIxLCAweDBhLCAweDBjLCAweDYyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDVmLCAweDc0LCAweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDc0LCAweDE4LAorCTB4MDIsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGIsIDB4NjIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NTQsIDB4NjEsIDB4NzIsIDB4NjcsCisJMHg2NSwgMHg3NCwgMHgxMiwgMHgzMCwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwKKwkweDI4LCAweDBiLCAweDMyLCAweDEzLCAweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLAorCTB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsCisJMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwgMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0MiwKKwkweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIyLCAweDUxLCAweDBhLCAweDBkLCAweDQ3LCAweDY1LAorCTB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsIDB4NzAsCisJMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwKKwkweDFmLCAweDBhLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LAorCTB4MGMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwYiwgMHgwYSwgMHgwOSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgyMiwgMHhmYiwgMHgwMSwKKwkweDBhLCAweDBhLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLCAweDEyLCAweDBhLCAweDA0LAorCTB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsCisJMHgxMiwgMHgxZiwgMHgwYSwgMHgwYiwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwgMHg2ZSwgMHg2NywgMHg1ZiwgMHg2NCwgMHg2OSwgMHg3MiwgMHgxOCwKKwkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDc3LCAweDZmLCAweDcyLCAweDZiLCAweDY5LCAweDZlLCAweDY3LCAweDQ0LCAweDY5LAorCTB4NzIsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTIsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsCisJMHg2NywgMHg3NSwgMHg2ZCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywKKwkweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LCAweDcyLCAweDQxLCAweDcyLCAweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLAorCTB4MTIsIDB4MzgsIDB4MGEsIDB4MDksIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4MTgsIDB4MDQsIDB4MjAsCisJMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxYSwgMHgyZSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwKKwkweDcyLCAweDJlLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUyLAorCTB4MDksIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsIDB4NjQsIDB4NjUsCisJMHg3MCwgMHg3MywgMHgxOCwgMHgwNSwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwgMHg3MywgMHgxMiwgMHgzMCwKKwkweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDA2LCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDEzLAorCTB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsCisJMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwKKwkweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIyLCAweDgzLCAweDAxLCAweDBhLCAweDBiLAorCTB4NDksIDB4NjQsIDB4NjUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4MTIsIDB4MzEsIDB4MGEsIDB4MDcsIDB4NzMsCisJMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg3MywgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxNywgMHgyZSwgMHg2MywKKwkweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLAorCTB4NjUsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTIsIDB4MDcsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NzMsIDB4MTIsIDB4MzAsCisJMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxMywKKwkweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDc0LCAweDYxLAorCTB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0YSwgMHgwNCwgMHgwOCwgMHgwMSwgMHgxMCwKKwkweDAyLCAweDQyLCAweDFkLCAweDVhLCAweDFiLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJmLCAweDYzLAorCTB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsIDB4NmYsCisJMHg2MiwgMHgwNiwgMHg3MCwgMHg3MiwgMHg2ZiwgMHg3NCwgMHg2ZiwgMHgzMywKK30KKwordmFyICgKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NPbmNlIHN5bmMuT25jZQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEgPSBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MKKykKKworZnVuYyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCkgW11ieXRlIHsKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NPbmNlLkRvKGZ1bmMoKSB7CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEgPSBwcm90b2ltcGwuWC5Db21wcmVzc0daSVAoZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjRGF0YSkKKwl9KQorCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NEYXRhCit9CisKK3ZhciBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2VudW1UeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuRW51bUluZm8sIDEpCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDcpCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19nb1R5cGVzID0gW11pbnRlcmZhY2V7fXsKKwkoU3RhdHVzX0NvZGUpKDApLCAgICAgICAgICAvLyAwOiBjY19hbmFseXplci5TdGF0dXMuQ29kZQorCSgqU3RhdHVzKShuaWwpLCAgICAgICAgICAgIC8vIDE6IGNjX2FuYWx5emVyLlN0YXR1cworCSgqUmVwb1N0YXRlKShuaWwpLCAgICAgICAgIC8vIDI6IGNjX2FuYWx5emVyLlJlcG9TdGF0ZQorCSgqRGVwc1Jlc3BvbnNlKShuaWwpLCAgICAgIC8vIDM6IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZQorCSgqR2VuZXJhdGVkRmlsZSkobmlsKSwgICAgIC8vIDQ6IGNjX2FuYWx5emVyLkdlbmVyYXRlZEZpbGUKKwkoKlNvdXJjZUZpbGUpKG5pbCksICAgICAgICAvLyA1OiBjY19hbmFseXplci5Tb3VyY2VGaWxlCisJKCpJZGVBbmFseXNpcykobmlsKSwgICAgICAgLy8gNjogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMKKwkoKkRlcHNSZXNwb25zZV9EZXBzKShuaWwpLCAvLyA3OiBjY19hbmFseXplci5EZXBzUmVzcG9uc2UuRGVwcworfQordmFyIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cyA9IFtdaW50MzJ7CisJMCwgLy8gMDogY2NfYW5hbHl6ZXIuU3RhdHVzLmNvZGU6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLlN0YXR1cy5Db2RlCisJNywgLy8gMTogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLmRlcHM6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZS5EZXBzCisJMSwgLy8gMjogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJNCwgLy8gMzogY2NfYW5hbHl6ZXIuU291cmNlRmlsZS5nZW5lcmF0ZWQ6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLkdlbmVyYXRlZEZpbGUKKwkxLCAvLyA0OiBjY19hbmFseXplci5Tb3VyY2VGaWxlLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJNSwgLy8gNTogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMuc291cmNlczp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU291cmNlRmlsZQorCTEsIC8vIDY6IGNjX2FuYWx5emVyLklkZUFuYWx5c2lzLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJMSwgLy8gNzogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLkRlcHMuc3RhdHVzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5TdGF0dXMKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIG1ldGhvZCBvdXRwdXRfdHlwZQorCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIGlucHV0X3R5cGUKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiB0eXBlX25hbWUKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiBleHRlbmRlZQorCTAsIC8vIFswOjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZmllbGQgdHlwZV9uYW1lCit9CisKK2Z1bmMgaW5pdCgpIHsgZmlsZV9jY19hbmFseXplcl9wcm90b19pbml0KCkgfQorZnVuYyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2luaXQoKSB7CisJaWYgRmlsZV9jY19hbmFseXplcl9wcm90byAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgIXByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1swXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpTdGF0dXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqUmVwb1N0YXRlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzJdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkRlcHNSZXNwb25zZSk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpHZW5lcmF0ZWRGaWxlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKlNvdXJjZUZpbGUpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSWRlQW5hbHlzaXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqRGVwc1Jlc3BvbnNlX0RlcHMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJfQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCXR5cGUgeCBzdHJ1Y3R7fQorCW91dCA6PSBwcm90b2ltcGwuVHlwZUJ1aWxkZXJ7CisJCUZpbGU6IHByb3RvaW1wbC5EZXNjQnVpbGRlcnsKKwkJCUdvUGFja2FnZVBhdGg6IHJlZmxlY3QuVHlwZU9mKHh7fSkuUGtnUGF0aCgpLAorCQkJUmF3RGVzY3JpcHRvcjogZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjLAorCQkJTnVtRW51bXM6ICAgICAgMSwKKwkJCU51bU1lc3NhZ2VzOiAgIDcsCisJCQlOdW1FeHRlbnNpb25zOiAwLAorCQkJTnVtU2VydmljZXM6ICAgMCwKKwkJfSwKKwkJR29UeXBlczogICAgICAgICAgIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZ29UeXBlcywKKwkJRGVwZW5kZW5jeUluZGV4ZXM6IGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cywKKwkJRW51bUluZm9zOiAgICAgICAgIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzLAorCQlNZXNzYWdlSW5mb3M6ICAgICAgZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlcywKKwl9LkJ1aWxkKCkKKwlGaWxlX2NjX2FuYWx5emVyX3Byb3RvID0gb3V0LkZpbGUKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MgPSBuaWwKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2dvVHlwZXMgPSBuaWwKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2RlcElkeHMgPSBuaWwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wcm90byBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTRlYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnByb3RvCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGNjX2FuYWx5emVyOworCitvcHRpb24gZ29fcGFja2FnZSA9ICJpZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8iOworCisvLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgYW5hbHlzaXMuCittZXNzYWdlIFN0YXR1cyB7CisgIGVudW0gQ29kZSB7CisgICAgT0sgPSAwOworICAgIEZBSUxVUkUgPSAxOworICB9CisgIENvZGUgY29kZSA9IDE7CisgIC8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisgIG9wdGlvbmFsIHN0cmluZyBtZXNzYWdlID0gMjsKK30KKworLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KK21lc3NhZ2UgUmVwb1N0YXRlIHsKKyAgLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KKyAgLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KKyAgc3RyaW5nIHJlcG9fZGlyID0gMTsKKyAgLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisgIHJlcGVhdGVkIHN0cmluZyBhY3RpdmVfZmlsZV9wYXRoID0gMjsKKyAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCisgIHN0cmluZyBvdXRfZGlyID0gMzsKKyAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KKyAgc3RyaW5nIGNvbXBfZGJfcGF0aCA9IDQ7Cit9CisKKy8vIFByb3ZpZGVzIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBwcmUtcmVxdWlzaXRpZXMgZm9yIHJ1bm5pbmcgbGFuZ3VhZ2UKKy8vIHNlcnZpY2VzIG9uIGFjdGl2ZV9maWxlX3BhdGhzLgorbWVzc2FnZSBEZXBzUmVzcG9uc2UgeworICAvLyBCdWlsZCBkZXBlbmRlbmNpZXMgb2YgYSBzb3VyY2UgZmlsZSBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlIHNlcnZpY2VzLgorICBtZXNzYWdlIERlcHMgeworICAgIC8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgorICAgIHN0cmluZyBzb3VyY2VfZmlsZSA9IDE7CisgICAgLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgorICAgIHJlcGVhdGVkIHN0cmluZyBidWlsZF90YXJnZXQgPSAyOworICAgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAzOworICB9CisgIHJlcGVhdGVkIERlcHMgZGVwcyA9IDE7CisgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAyOworfQorCisvLyBSZXR1cm5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMgZm9yIHRoZQorLy8gYWN0aXZlIGZpbGVzLgorbWVzc2FnZSBHZW5lcmF0ZWRGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyBwYXRoID0gMTsKKworICAvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKyAgLy8gZnJvbSB0aGUgcGF0aCBhYm92ZSBpbiB1c2VyJ3Mgd29ya3N0YXRpb24uCisgIG9wdGlvbmFsIGJ5dGVzIGNvbnRlbnRzID0gMjsKK30KKworbWVzc2FnZSBTb3VyY2VGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICBzdHJpbmcgcGF0aCA9IDE7CisKKyAgLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBBbGwgdGhlIHJlbGF0aXZlCisgIC8vIHBhdGhzIGluIGNvbXBpbGVyX2FyZ3VtZW50cyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyB3b3JraW5nX2RpciA9IDI7CisKKyAgLy8gQ29tcGlsZXIgYXJndW1lbnRzIHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlLiBJZiBtdWx0aXBsZSB2YXJpYW50cworICAvLyBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGFyZSBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHNjcmlwdCB3aWxsIGNob29zZQorICAvLyBvbmUuCisgIHJlcGVhdGVkIHN0cmluZyBjb21waWxlcl9hcmd1bWVudHMgPSAzOworCisgIC8vIEFueSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBhcmUgdXNlZCBpbiBjb21waWxpbmcgdGhlIGZpbGUuCisgIHJlcGVhdGVkIEdlbmVyYXRlZEZpbGUgZ2VuZXJhdGVkID0gNDsKKworICAvLyBQYXRocyB0byBhbGwgb2YgdGhlIHNvdXJjZXMsIGxpa2UgYnVpbGQgZmlsZXMsIGNvZGUgZ2VuZXJhdG9ycywKKyAgLy8gcHJvdG8gZmlsZXMgZXRjLiB0aGF0IHdlcmUgdXNlZCBkdXJpbmcgYW5hbHlzaXMuIFVzZWQgdG8gZmlndXJlCisgIC8vIG91dCB3aGVuIGEgc2V0IG9mIGJ1aWxkIGFydGlmYWN0cyBhcmUgc3RhbGUgYW5kIHRoZSBxdWVyeSB0b29sCisgIC8vIG11c3QgYmUgcmUtcnVuLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHJlcGVhdGVkIHN0cmluZyBkZXBzID0gNTsKKworICAvLyBSZXByZXNlbnRzIGFuYWx5c2lzIHN0YXR1cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUuIGUuZy4gbm90IHBhcnQKKyAgLy8gb2YgdGhlIGJ1aWxkIGdyYXBoLgorICBvcHRpb25hbCBTdGF0dXMgc3RhdHVzID0gNjsKK30KKworbWVzc2FnZSBJZGVBbmFseXNpcyB7CisgIHJlcGVhdGVkIFNvdXJjZUZpbGUgc291cmNlcyA9IDI7CisKKyAgLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgorICAvLyBTaG91bGQgZmFpbCBvbmx5IHdoZW4gbm8gYW5hbHlzaXMgY2FuIGJlIHBlcmZvcm1lZC4KKyAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDM7CisKKyAgcmVzZXJ2ZWQgMTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9yZWdlbi5zaCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9yZWdlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjQ0Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL3JlZ2VuLnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworYXByb3RvYyAtLWdvX291dD1wYXRocz1zb3VyY2VfcmVsYXRpdmU6LiBjY19hbmFseXplci5wcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28KaW5kZXggZGU4NGZiZS4uMjNjN2FiZCAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbworKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LmdvCkBAIC0zMyw2ICszMyw3IEBACiAJInN0cmluZ3MiCiAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcHJvdG8iCisJYXBiICJpZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8iCiAJcGIgImlkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8iCiApCiAKQEAgLTQyLDkgKzQzLDYgQEAKIAlSZXBvRGlyICAgICAgICBzdHJpbmcKIAlPdXREaXIgICAgICAgICBzdHJpbmcKIAlDbGFuZ1Rvb2xzUm9vdCBzdHJpbmcKLQotCUNjRmlsZXMgICBbXXN0cmluZwotCUphdmFGaWxlcyBbXXN0cmluZwogfQogCiAvLyBMdW5jaFRhcmdldCBpcyBhIHBhcnNlZCBBbmRyb2lkIGx1bmNoIHRhcmdldC4KQEAgLTgzLDcgKzgxLDcgQEAKIAogZnVuYyBtYWluKCkgewogCXZhciBlbnYgRW52Ci0JZW52Lk91dERpciA9IG9zLkdldGVudigiT1VUX0RJUiIpCisJZW52Lk91dERpciA9IHN0cmluZ3MuVHJpbVN1ZmZpeChvcy5HZXRlbnYoIk9VVF9ESVIiKSwgIi8iKQogCWVudi5SZXBvRGlyID0gb3MuR2V0ZW52KCJBTkRST0lEX0JVSUxEX1RPUCIpCiAJZW52LkNsYW5nVG9vbHNSb290ID0gb3MuR2V0ZW52KCJQUkVCVUlMVFNfQ0xBTkdfVE9PTFNfUk9PVCIpCiAJZmxhZy5WYXIoJmVudi5MdW5jaFRhcmdldCwgImx1bmNoX3RhcmdldCIsICJUaGUgbHVuY2ggdGFyZ2V0IHRvIHF1ZXJ5IikKQEAgLTk1LDEyICs5MywxMyBAQAogCQlyZXR1cm4KIAl9CiAKKwl2YXIgY2NGaWxlcywgamF2YUZpbGVzIFtdc3RyaW5nCiAJZm9yIF8sIGYgOj0gcmFuZ2UgZmlsZXMgewogCQlzd2l0Y2ggewogCQljYXNlIHN0cmluZ3MuSGFzU3VmZml4KGYsICIuamF2YSIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KGYsICIua3QiKToKLQkJCWVudi5KYXZhRmlsZXMgPSBhcHBlbmQoZW52LkphdmFGaWxlcywgZikKKwkJCWphdmFGaWxlcyA9IGFwcGVuZChqYXZhRmlsZXMsIGYpCiAJCWNhc2Ugc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5jYyIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KGYsICIuY3BwIikgfHwgc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5oIik6Ci0JCQllbnYuQ2NGaWxlcyA9IGFwcGVuZChlbnYuQ2NGaWxlcywgZikKKwkJCWNjRmlsZXMgPSBhcHBlbmQoY2NGaWxlcywgZikKIAkJZGVmYXVsdDoKIAkJCWxvZy5QcmludGYoIkZpbGUgJXEgaXMgc3VwcG9ydGVkIC0gd2lsbCBiZSBza2lwcGVkLiIsIGYpCiAJCX0KQEAgLTExMCwyOCArMTA5LDU0IEBACiAJLy8gVE9ETyhtaWNoYWVsbWVyZyk6IEZpZ3VyZSBvdXQgaWYgbW9kdWxlX2JwX2phdmFfZGVwcy5qc29uIGFuZCBjb21waWxlX2NvbW1hbmRzLmpzb24gaXMgb3V0ZGF0ZWQuCiAJcnVuTWFrZShjdHgsIGVudiwgIm5vdGhpbmciKQogCi0JamF2YU1vZHVsZXMsIGphdmFGaWxlVG9Nb2R1bGVNYXAsIGVyciA6PSBsb2FkSmF2YU1vZHVsZXMoJmVudikKKwlqYXZhTW9kdWxlcywgZXJyIDo9IGxvYWRKYXZhTW9kdWxlcyhlbnYpCiAJaWYgZXJyICE9IG5pbCB7CiAJCWxvZy5QcmludGYoIkZhaWxlZCB0byBsb2FkIGphdmEgbW9kdWxlczogJXYiLCBlcnIpCiAJfQotCXRvTWFrZSA6PSBnZXRKYXZhVGFyZ2V0cyhqYXZhRmlsZVRvTW9kdWxlTWFwKQogCi0JY2NUYXJnZXRzLCBzdGF0dXMgOj0gZ2V0Q0NUYXJnZXRzKGN0eCwgJmVudikKLQlpZiBzdGF0dXMgIT0gbmlsICYmIHN0YXR1cy5Db2RlICE9IHBiLlN0YXR1c19PSyB7Ci0JCWxvZy5GYXRhbGYoIkZhaWxlZCB0byBxdWVyeSBjYyB0YXJnZXRzOiAldiIsICpzdGF0dXMuTWVzc2FnZSkKLQl9Ci0JdG9NYWtlID0gYXBwZW5kKHRvTWFrZSwgY2NUYXJnZXRzLi4uKQotCWZtdC5GcHJpbnRmKG9zLlN0ZGVyciwgIlJ1bm5pbmcgbWFrZSBmb3IgbW9kdWxlczogJXZcbiIsIHN0cmluZ3MuSm9pbih0b01ha2UsICIsICIpKQotCWlmIGVyciA6PSBydW5NYWtlKGN0eCwgZW52LCB0b01ha2UuLi4pOyBlcnIgIT0gbmlsIHsKLQkJbG9nLlByaW50ZigiQnVpbGRpbmcgZGVwcyBmYWlsZWQ6ICV2IiwgZXJyKQorCXZhciB0YXJnZXRzIFtdc3RyaW5nCisJamF2YVRhcmdldHNCeUZpbGUgOj0gZmluZEphdmFNb2R1bGVzKGphdmFGaWxlcywgamF2YU1vZHVsZXMpCisJZm9yIF8sIHQgOj0gcmFuZ2UgamF2YVRhcmdldHNCeUZpbGUgeworCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIHQpCiAJfQogCi0JcmVzIDo9IGdldEphdmFJbnB1dHMoJmVudiwgamF2YU1vZHVsZXMsIGphdmFGaWxlVG9Nb2R1bGVNYXApCi0JY2NBbmFseXNpcyA6PSBnZXRDQ0lucHV0cyhjdHgsICZlbnYpCi0JcHJvdG8uTWVyZ2UocmVzLCBjY0FuYWx5c2lzKQorCWNjVGFyZ2V0cywgZXJyIDo9IGdldENDVGFyZ2V0cyhjdHgsIGVudiwgY2NGaWxlcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiRmFpbGVkIHRvIHF1ZXJ5IGNjIHRhcmdldHM6ICV2IiwgZXJyKQorCX0KKwl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIGNjVGFyZ2V0cy4uLikKKwlpZiBsZW4odGFyZ2V0cykgPT0gMCB7CisJCWZtdC5QcmludGxuKCJObyB0YXJnZXRzIGZvdW5kLiIpCisJCW9zLkV4aXQoMSkKKwkJcmV0dXJuCisJfQogCi0JcmVzLkJ1aWxkQXJ0aWZhY3RSb290ID0gZW52Lk91dERpcgotCWRhdGEsIGVyciA6PSBwcm90by5NYXJzaGFsKHJlcykKKwlmbXQuRnByaW50Zihvcy5TdGRlcnIsICJSdW5uaW5nIG1ha2UgZm9yIG1vZHVsZXM6ICV2XG4iLCBzdHJpbmdzLkpvaW4odGFyZ2V0cywgIiwgIikpCisJaWYgZXJyIDo9IHJ1bk1ha2UoY3R4LCBlbnYsIHRhcmdldHMuLi4pOyBlcnIgIT0gbmlsIHsKKwkJbG9nLlByaW50ZigiQnVpbGRpbmcgbW9kdWxlcyBmYWlsZWQ6ICV2IiwgZXJyKQorCX0KKworCXZhciBhbmFseXNpcyBwYi5JZGVBbmFseXNpcworCXJlc3VsdHMsIHVuaXRzIDo9IGdldEphdmFJbnB1dHMoZW52LCBqYXZhVGFyZ2V0c0J5RmlsZSwgamF2YU1vZHVsZXMpCisJYW5hbHlzaXMuUmVzdWx0cyA9IHJlc3VsdHMKKwlhbmFseXNpcy5Vbml0cyA9IHVuaXRzCisJaWYgZXJyICE9IG5pbCAmJiBhbmFseXNpcy5FcnJvciA9PSBuaWwgeworCQlhbmFseXNpcy5FcnJvciA9ICZwYi5BbmFseXNpc0Vycm9yeworCQkJRXJyb3JNZXNzYWdlOiBlcnIuRXJyb3IoKSwKKwkJfQorCX0KKworCXJlc3VsdHMsIHVuaXRzLCBlcnIgPSBnZXRDQ0lucHV0cyhjdHgsIGVudiwgY2NGaWxlcykKKwlhbmFseXNpcy5SZXN1bHRzID0gYXBwZW5kKGFuYWx5c2lzLlJlc3VsdHMsIHJlc3VsdHMuLi4pCisJYW5hbHlzaXMuVW5pdHMgPSBhcHBlbmQoYW5hbHlzaXMuVW5pdHMsIHVuaXRzLi4uKQorCWlmIGVyciAhPSBuaWwgJiYgYW5hbHlzaXMuRXJyb3IgPT0gbmlsIHsKKwkJYW5hbHlzaXMuRXJyb3IgPSAmcGIuQW5hbHlzaXNFcnJvcnsKKwkJCUVycm9yTWVzc2FnZTogZXJyLkVycm9yKCksCisJCX0KKwl9CisKKwlhbmFseXNpcy5CdWlsZE91dERpciA9IGVudi5PdXREaXIKKwlkYXRhLCBlcnIgOj0gcHJvdG8uTWFyc2hhbCgmYW5hbHlzaXMpCiAJaWYgZXJyICE9IG5pbCB7CiAJCWxvZy5GYXRhbGYoIkZhaWxlZCB0byBtYXJzaGFsIHJlc3VsdCBwcm90bzogJXYiLCBlcnIpCiAJfQpAQCAtMTQxLDIyICsxNjYsMjIgQEAKIAkJbG9nLkZhdGFsZigiRmFpbGVkIHRvIHdyaXRlIHJlc3VsdCBwcm90bzogJXYiLCBlcnIpCiAJfQogCi0JZm9yIF8sIHMgOj0gcmFuZ2UgcmVzLlNvdXJjZXMgewotCQlmbXQuRnByaW50Zihvcy5TdGRlcnIsICIlczogJXYgKERlcHM6ICVkLCBHZW5lcmF0ZWQ6ICVkKVxuIiwgcy5HZXRQYXRoKCksIHMuR2V0U3RhdHVzKCksIGxlbihzLkdldERlcHMoKSksIGxlbihzLkdldEdlbmVyYXRlZCgpKSkKKwlmb3IgXywgciA6PSByYW5nZSBhbmFseXNpcy5SZXN1bHRzIHsKKwkJZm10LkZwcmludGYob3MuU3RkZXJyLCAiJXM6ICUrdlxuIiwgci5HZXRTb3VyY2VGaWxlUGF0aCgpLCByLkdldFN0YXR1cygpKQogCX0KIH0KIAotZnVuYyByZXBvU3RhdGUoZW52ICpFbnYpICpwYi5SZXBvU3RhdGUgeworZnVuYyByZXBvU3RhdGUoZW52IEVudiwgZmlsZVBhdGhzIFtdc3RyaW5nKSAqYXBiLlJlcG9TdGF0ZSB7CiAJY29uc3QgY29tcERiUGF0aCA9ICJzb29uZy9kZXZlbG9wbWVudC9pZGUvY29tcGRiL2NvbXBpbGVfY29tbWFuZHMuanNvbiIKLQlyZXR1cm4gJnBiLlJlcG9TdGF0ZXsKKwlyZXR1cm4gJmFwYi5SZXBvU3RhdGV7CiAJCVJlcG9EaXI6ICAgICAgICBlbnYuUmVwb0RpciwKLQkJQWN0aXZlRmlsZVBhdGg6IGVudi5DY0ZpbGVzLAorCQlBY3RpdmVGaWxlUGF0aDogZmlsZVBhdGhzLAogCQlPdXREaXI6ICAgICAgICAgZW52Lk91dERpciwKIAkJQ29tcERiUGF0aDogICAgIHBhdGguSm9pbihlbnYuT3V0RGlyLCBjb21wRGJQYXRoKSwKIAl9CiB9CiAKLWZ1bmMgcnVuQ0NhbmFseXplcihjdHggY29udGV4dC5Db250ZXh0LCBlbnYgKkVudiwgbW9kZSBzdHJpbmcsIGluIFtdYnl0ZSkgKFtdYnl0ZSwgZXJyb3IpIHsKK2Z1bmMgcnVuQ0NhbmFseXplcihjdHggY29udGV4dC5Db250ZXh0LCBlbnYgRW52LCBtb2RlIHN0cmluZywgaW4gW11ieXRlKSAoW11ieXRlLCBlcnJvcikgewogCWNjQW5hbHl6ZXJQYXRoIDo9IHBhdGguSm9pbihlbnYuQ2xhbmdUb29sc1Jvb3QsICJiaW4vaWRlX3F1ZXJ5X2NjX2FuYWx5emVyIikKIAlvdXRCdWZmZXIgOj0gbmV3KGJ5dGVzLkJ1ZmZlcikKIApAQCAtMTc2LDEyNyArMjAxLDIwNSBAQAogfQogCiAvLyBFeGVjdXRlIGNjX2FuYWx5emVyIGFuZCBnZXQgYWxsIHRoZSB0YXJnZXRzIHRoYXQgbmVlZHMgdG8gYmUgYnVpbGQgZm9yIGFuYWx5emluZyBmaWxlcy4KLWZ1bmMgZ2V0Q0NUYXJnZXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiAqRW52KSAoW11zdHJpbmcsICpwYi5TdGF0dXMpIHsKLQlzdGF0ZSA6PSByZXBvU3RhdGUoZW52KQotCWJ5dGVzLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChzdGF0ZSkKK2Z1bmMgZ2V0Q0NUYXJnZXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiBFbnYsIGZpbGVQYXRocyBbXXN0cmluZykgKFtdc3RyaW5nLCBlcnJvcikgeworCXN0YXRlLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChyZXBvU3RhdGUoZW52LCBmaWxlUGF0aHMpKQogCWlmIGVyciAhPSBuaWwgewogCQlsb2cuRmF0YWxsbigiRmFpbGVkIHRvIHNlcmlhbGl6ZSBzdGF0ZToiLCBlcnIpCiAJfQogCi0JcmVzcCA6PSBuZXcocGIuRGVwc1Jlc3BvbnNlKQotCXJlc3VsdCwgZXJyIDo9IHJ1bkNDYW5hbHl6ZXIoY3R4LCBlbnYsICJkZXBzIiwgYnl0ZXMpCi0JaWYgbWFyc2hhbF9lcnIgOj0gcHJvdG8uVW5tYXJzaGFsKHJlc3VsdCwgcmVzcCk7IG1hcnNoYWxfZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsICZwYi5TdGF0dXN7Ci0JCQlDb2RlOiAgICBwYi5TdGF0dXNfRkFJTFVSRSwKLQkJCU1lc3NhZ2U6IHByb3RvLlN0cmluZygiTWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICIgKyBtYXJzaGFsX2Vyci5FcnJvcigpKSwKLQkJfQorCXJlc3AgOj0gbmV3KGFwYi5EZXBzUmVzcG9uc2UpCisJcmVzdWx0LCBlcnIgOj0gcnVuQ0NhbmFseXplcihjdHgsIGVudiwgImRlcHMiLCBzdGF0ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJaWYgZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigibWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICV2IiwgZXJyKQogCX0KIAogCXZhciB0YXJnZXRzIFtdc3RyaW5nCi0JaWYgcmVzcC5TdGF0dXMgIT0gbmlsICYmIHJlc3AuU3RhdHVzLkNvZGUgIT0gcGIuU3RhdHVzX09LIHsKLQkJcmV0dXJuIHRhcmdldHMsIHJlc3AuU3RhdHVzCisJaWYgcmVzcC5TdGF0dXMgIT0gbmlsICYmIHJlc3AuU3RhdHVzLkNvZGUgIT0gYXBiLlN0YXR1c19PSyB7CisJCXJldHVybiB0YXJnZXRzLCBmbXQuRXJyb3JmKCJjY19hbmFseXplciBmYWlsZWQ6ICV2IiwgcmVzcC5TdGF0dXMuTWVzc2FnZSkKIAl9CisKIAlmb3IgXywgZGVwcyA6PSByYW5nZSByZXNwLkRlcHMgewogCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIGRlcHMuQnVpbGRUYXJnZXQuLi4pCiAJfQotCi0Jc3RhdHVzIDo9ICZwYi5TdGF0dXN7Q29kZTogcGIuU3RhdHVzX09LfQotCWlmIGVyciAhPSBuaWwgewotCQlzdGF0dXMgPSAmcGIuU3RhdHVzewotCQkJQ29kZTogICAgcGIuU3RhdHVzX0ZBSUxVUkUsCi0JCQlNZXNzYWdlOiBwcm90by5TdHJpbmcoZXJyLkVycm9yKCkpLAotCQl9Ci0JfQotCXJldHVybiB0YXJnZXRzLCBzdGF0dXMKKwlyZXR1cm4gdGFyZ2V0cywgbmlsCiB9CiAKLWZ1bmMgZ2V0Q0NJbnB1dHMoY3R4IGNvbnRleHQuQ29udGV4dCwgZW52ICpFbnYpICpwYi5JZGVBbmFseXNpcyB7Ci0Jc3RhdGUgOj0gcmVwb1N0YXRlKGVudikKLQlieXRlcywgZXJyIDo9IHByb3RvLk1hcnNoYWwoc3RhdGUpCitmdW5jIGdldENDSW5wdXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiBFbnYsIGZpbGVQYXRocyBbXXN0cmluZykgKFtdKnBiLkFuYWx5c2lzUmVzdWx0LCBbXSpwYi5CdWlsZGFibGVVbml0LCBlcnJvcikgeworCXN0YXRlLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChyZXBvU3RhdGUoZW52LCBmaWxlUGF0aHMpKQogCWlmIGVyciAhPSBuaWwgewogCQlsb2cuRmF0YWxsbigiRmFpbGVkIHRvIHNlcmlhbGl6ZSBzdGF0ZToiLCBlcnIpCiAJfQogCi0JcmVzcCA6PSBuZXcocGIuSWRlQW5hbHlzaXMpCi0JcmVzdWx0LCBlcnIgOj0gcnVuQ0NhbmFseXplcihjdHgsIGVudiwgImlucHV0cyIsIGJ5dGVzKQotCWlmIG1hcnNoYWxfZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBtYXJzaGFsX2VyciAhPSBuaWwgewotCQlyZXNwLlN0YXR1cyA9ICZwYi5TdGF0dXN7Ci0JCQlDb2RlOiAgICBwYi5TdGF0dXNfRkFJTFVSRSwKLQkJCU1lc3NhZ2U6IHByb3RvLlN0cmluZygiTWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICIgKyBtYXJzaGFsX2Vyci5FcnJvcigpKSwKLQkJfQotCQlyZXR1cm4gcmVzcAorCXJlc3AgOj0gbmV3KGFwYi5JZGVBbmFseXNpcykKKwlyZXN1bHQsIGVyciA6PSBydW5DQ2FuYWx5emVyKGN0eCwgZW52LCAiaW5wdXRzIiwgc3RhdGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiY2NfYW5hbHl6ZXIgZmFpbGVkOiIsIGVycikKKwl9CisJaWYgZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJtYWxmb3JtZWQgcmVzcG9uc2UgZnJvbSBjY19hbmFseXplcjogJXYiLCBlcnIpCisJfQorCWlmIHJlc3AuU3RhdHVzICE9IG5pbCAmJiByZXNwLlN0YXR1cy5Db2RlICE9IGFwYi5TdGF0dXNfT0sgeworCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoImNjX2FuYWx5emVyIGZhaWxlZDogJXYiLCByZXNwLlN0YXR1cy5NZXNzYWdlKQogCX0KIAotCWlmIGVyciAhPSBuaWwgJiYgKHJlc3AuU3RhdHVzID09IG5pbCB8fCByZXNwLlN0YXR1cy5Db2RlID09IHBiLlN0YXR1c19PSykgewotCQlyZXNwLlN0YXR1cyA9ICZwYi5TdGF0dXN7Ci0JCQlDb2RlOiAgICBwYi5TdGF0dXNfRkFJTFVSRSwKLQkJCU1lc3NhZ2U6IHByb3RvLlN0cmluZyhlcnIuRXJyb3IoKSksCisJdmFyIHJlc3VsdHMgW10qcGIuQW5hbHlzaXNSZXN1bHQKKwl2YXIgdW5pdHMgW10qcGIuQnVpbGRhYmxlVW5pdAorCWZvciBfLCBzIDo9IHJhbmdlIHJlc3AuU291cmNlcyB7CisJCXN0YXR1cyA6PSAmcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzeworCQkJQ29kZTogcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0ssCiAJCX0KLQl9Ci0JcmV0dXJuIHJlc3AKLX0KLQotZnVuYyBnZXRKYXZhVGFyZ2V0cyhqYXZhRmlsZVRvTW9kdWxlTWFwIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIFtdc3RyaW5nIHsKLQl2YXIgdGFyZ2V0cyBbXXN0cmluZwotCWZvciBfLCBtIDo9IHJhbmdlIGphdmFGaWxlVG9Nb2R1bGVNYXAgewotCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIG0uTmFtZSkKLQl9Ci0JcmV0dXJuIHRhcmdldHMKLX0KLQotZnVuYyBnZXRKYXZhSW5wdXRzKGVudiAqRW52LCBqYXZhTW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBqYXZhRmlsZVRvTW9kdWxlTWFwIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpICpwYi5JZGVBbmFseXNpcyB7Ci0JdmFyIHNvdXJjZXMgW10qcGIuU291cmNlRmlsZQotCXR5cGUgZGVwc0FuZEdlbmVyYXRlZCBzdHJ1Y3QgewotCQlEZXBzICAgICAgW11zdHJpbmcKLQkJR2VuZXJhdGVkIFtdKnBiLkdlbmVyYXRlZEZpbGUKLQl9Ci0JbW9kdWxlVG9EZXBzIDo9IG1ha2UobWFwW3N0cmluZ10qZGVwc0FuZEdlbmVyYXRlZCkKLQlmb3IgXywgZiA6PSByYW5nZSBlbnYuSmF2YUZpbGVzIHsKLQkJZmlsZSA6PSAmcGIuU291cmNlRmlsZXsKLQkJCVBhdGg6IGYsCi0JCX0KLQkJc291cmNlcyA9IGFwcGVuZChzb3VyY2VzLCBmaWxlKQotCi0JCW0gOj0gamF2YUZpbGVUb01vZHVsZU1hcFtmXQotCQlpZiBtID09IG5pbCB7Ci0JCQlmaWxlLlN0YXR1cyA9ICZwYi5TdGF0dXN7Ci0JCQkJQ29kZTogICAgcGIuU3RhdHVzX0ZBSUxVUkUsCi0JCQkJTWVzc2FnZTogcHJvdG8uU3RyaW5nKCJGaWxlIG5vdCBmb3VuZCBpbiBhbnkgbW9kdWxlLiIpLAotCQkJfQotCQkJY29udGludWUKKwkJaWYgcy5HZXRTdGF0dXMoKS5HZXRDb2RlKCkgIT0gYXBiLlN0YXR1c19PSyB7CisJCQlzdGF0dXMuQ29kZSA9IHBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX0JVSUxEX0ZBSUxFRAorCQkJc3RhdHVzLlN0YXR1c01lc3NhZ2UgPSBwcm90by5TdHJpbmcocy5HZXRTdGF0dXMoKS5HZXRNZXNzYWdlKCkpCiAJCX0KIAotCQlmaWxlLlN0YXR1cyA9ICZwYi5TdGF0dXN7Q29kZTogcGIuU3RhdHVzX09LfQotCQlpZiBtb2R1bGVUb0RlcHNbbS5OYW1lXSAhPSBuaWwgewotCQkJZmlsZS5HZW5lcmF0ZWQgPSBtb2R1bGVUb0RlcHNbbS5OYW1lXS5HZW5lcmF0ZWQKLQkJCWZpbGUuRGVwcyA9IG1vZHVsZVRvRGVwc1ttLk5hbWVdLkRlcHMKLQkJCWNvbnRpbnVlCisJCXJlc3VsdCA6PSAmcGIuQW5hbHlzaXNSZXN1bHR7CisJCQlTb3VyY2VGaWxlUGF0aDogcy5HZXRQYXRoKCksCisJCQlVbml0SWQ6ICAgICAgICAgcy5HZXRQYXRoKCksCisJCQlTdGF0dXM6ICAgICAgICAgc3RhdHVzLAogCQl9CisJCXJlc3VsdHMgPSBhcHBlbmQocmVzdWx0cywgcmVzdWx0KQogCi0JCWRlcHMgOj0gdHJhbnNpdGl2ZURlcHMobSwgamF2YU1vZHVsZXMpCiAJCXZhciBnZW5lcmF0ZWQgW10qcGIuR2VuZXJhdGVkRmlsZQotCQlvdXRQcmVmaXggOj0gZW52Lk91dERpciArICIvIgotCQlmb3IgXywgZCA6PSByYW5nZSBkZXBzIHsKLQkJCWlmIHJlbFBhdGgsIG9rIDo9IHN0cmluZ3MuQ3V0UHJlZml4KGQsIG91dFByZWZpeCk7IG9rIHsKLQkJCQljb250ZW50cywgZXJyIDo9IG9zLlJlYWRGaWxlKGQpCi0JCQkJaWYgZXJyICE9IG5pbCB7Ci0JCQkJCWZtdC5QcmludGYoIkdlbmVyYXRlZCBmaWxlICVxIG5vdCBmb3VuZCAtIHdpbGwgYmUgc2tpcHBlZC5cbiIsIGQpCi0JCQkJCWNvbnRpbnVlCi0JCQkJfQorCQlmb3IgXywgZiA6PSByYW5nZSBzLkdlbmVyYXRlZCB7CisJCQlnZW5lcmF0ZWQgPSBhcHBlbmQoZ2VuZXJhdGVkLCAmcGIuR2VuZXJhdGVkRmlsZXsKKwkJCQlQYXRoOiAgICAgZi5HZXRQYXRoKCksCisJCQkJQ29udGVudHM6IGYuR2V0Q29udGVudHMoKSwKKwkJCX0pCisJCX0KKwkJZ2VuVW5pdCA6PSAmcGIuQnVpbGRhYmxlVW5pdHsKKwkJCUlkOiAgICAgICAgICAgICAgImdlbmZpbGVzX2Zvcl8iICsgcy5HZXRQYXRoKCksCisJCQlTb3VyY2VGaWxlUGF0aHM6IHMuR2V0RGVwcygpLAorCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5lcmF0ZWQsCisJCX0KIAotCQkJCWdlbmVyYXRlZCA9IGFwcGVuZChnZW5lcmF0ZWQsICZwYi5HZW5lcmF0ZWRGaWxlewotCQkJCQlQYXRoOiAgICAgcmVsUGF0aCwKLQkJCQkJQ29udGVudHM6IGNvbnRlbnRzLAotCQkJCX0pCisJCXVuaXQgOj0gJnBiLkJ1aWxkYWJsZVVuaXR7CisJCQlJZDogICAgICAgICAgICAgICAgcy5HZXRQYXRoKCksCisJCQlMYW5ndWFnZTogICAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfQ1BQLAorCQkJU291cmNlRmlsZVBhdGhzOiAgIFtdc3RyaW5ne3MuR2V0UGF0aCgpfSwKKwkJCUNvbXBpbGVyQXJndW1lbnRzOiBzLkdldENvbXBpbGVyQXJndW1lbnRzKCksCisJCQlEZXBlbmRlbmN5SWRzOiAgICAgW11zdHJpbmd7Z2VuVW5pdC5HZXRJZCgpfSwKKwkJfQorCQl1bml0cyA9IGFwcGVuZCh1bml0cywgdW5pdCwgZ2VuVW5pdCkKKwl9CisJcmV0dXJuIHJlc3VsdHMsIHVuaXRzLCBuaWwKK30KKworLy8gZmluZEphdmFNb2R1bGVzIHRyaWVzIHRvIGZpbmQgdGhlIG1vZHVsZXMgdGhhdCBjb3ZlciB0aGUgZ2l2ZW4gZmlsZSBwYXRocy4KKy8vIElmIGEgZmlsZSBpcyBjb3ZlcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMsIHRoZSBmaXJzdCBtb2R1bGUgaXMgcmV0dXJuZWQuCitmdW5jIGZpbmRKYXZhTW9kdWxlcyhwYXRocyBbXXN0cmluZywgbW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJcmV0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJZm9yIG5hbWUsIG1vZHVsZSA6PSByYW5nZSBtb2R1bGVzIHsKKwkJaWYgc3RyaW5ncy5IYXNTdWZmaXgobmFtZSwgIi5pbXBsIikgeworCQkJY29udGludWUKKwkJfQorCisJCWZvciBpLCBwIDo9IHJhbmdlIHBhdGhzIHsKKwkJCWlmIHNsaWNlcy5Db250YWlucyhtb2R1bGUuU3JjcywgcCkgeworCQkJCXJldFtwXSA9IG5hbWUKKwkJCQlwYXRocyA9IGFwcGVuZChwYXRoc1s6aV0sIHBhdGhzW2krMTpdLi4uKQorCQkJCWJyZWFrCiAJCQl9CiAJCX0KLQkJbW9kdWxlVG9EZXBzW20uTmFtZV0gPSAmZGVwc0FuZEdlbmVyYXRlZHtkZXBzLCBnZW5lcmF0ZWR9Ci0JCWZpbGUuR2VuZXJhdGVkID0gZ2VuZXJhdGVkCi0JCWZpbGUuRGVwcyA9IGRlcHMKKwkJaWYgbGVuKHBhdGhzKSA9PSAwIHsKKwkJCWJyZWFrCisJCX0KIAl9Ci0JcmV0dXJuICZwYi5JZGVBbmFseXNpc3sKLQkJU291cmNlczogc291cmNlcywKKwlyZXR1cm4gcmV0Cit9CisKK2Z1bmMgZ2V0SmF2YUlucHV0cyhlbnYgRW52LCBtb2R1bGVzQnlQYXRoIG1hcFtzdHJpbmddc3RyaW5nLCBtb2R1bGVzIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIChbXSpwYi5BbmFseXNpc1Jlc3VsdCwgW10qcGIuQnVpbGRhYmxlVW5pdCkgeworCXZhciByZXN1bHRzIFtdKnBiLkFuYWx5c2lzUmVzdWx0CisJdW5pdHNCeUlkIDo9IG1ha2UobWFwW3N0cmluZ10qcGIuQnVpbGRhYmxlVW5pdCkKKwlmb3IgcCwgbW9kdWxlTmFtZSA6PSByYW5nZSBtb2R1bGVzQnlQYXRoIHsKKwkJciA6PSAmcGIuQW5hbHlzaXNSZXN1bHR7CisJCQlTb3VyY2VGaWxlUGF0aDogcCwKKwkJfQorCQlyZXN1bHRzID0gYXBwZW5kKHJlc3VsdHMsIHIpCisKKwkJbSA6PSBtb2R1bGVzW21vZHVsZU5hbWVdCisJCWlmIG0gPT0gbmlsIHsKKwkJCXIuU3RhdHVzID0gJnBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c3sKKwkJCQlDb2RlOiAgICAgICAgICBwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9OT1RfRk9VTkQsCisJCQkJU3RhdHVzTWVzc2FnZTogcHJvdG8uU3RyaW5nKCJGaWxlIG5vdCBmb3VuZCBpbiBhbnkgbW9kdWxlLiIpLAorCQkJfQorCQkJY29udGludWUKKwkJfQorCisJCXIuVW5pdElkID0gbW9kdWxlTmFtZQorCQlyLlN0YXR1cyA9ICZwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXN7Q29kZTogcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0t9CisJCWlmIHVuaXRzQnlJZFtyLlVuaXRJZF0gIT0gbmlsIHsKKwkJCS8vIEZpbGUgaXMgY292ZXJlZCBieSBhbiBhbHJlYWR5IGNyZWF0ZWQgdW5pdC4KKwkJCWNvbnRpbnVlCisJCX0KKworCQl1IDo9ICZwYi5CdWlsZGFibGVVbml0eworCQkJSWQ6ICAgICAgICAgICAgICBtb2R1bGVOYW1lLAorCQkJTGFuZ3VhZ2U6ICAgICAgICBwYi5MYW5ndWFnZV9MQU5HVUFHRV9KQVZBLAorCQkJU291cmNlRmlsZVBhdGhzOiBtLlNyY3MsCisJCX0KKwkJdW5pdHNCeUlkW3UuSWRdID0gdQorCisJCXEgOj0gbGlzdC5OZXcoKQorCQlmb3IgXywgZCA6PSByYW5nZSBtLkRlcHMgeworCQkJcS5QdXNoQmFjayhkKQorCQl9CisJCWZvciBxLkxlbigpID4gMCB7CisJCQluYW1lIDo9IHEuUmVtb3ZlKHEuRnJvbnQoKSkuKHN0cmluZykKKwkJCW1vZCA6PSBtb2R1bGVzW25hbWVdCisJCQlpZiBtb2QgPT0gbmlsIHx8IHVuaXRzQnlJZFtuYW1lXSAhPSBuaWwgeworCQkJCWNvbnRpbnVlCisJCQl9CisKKwkJCXZhciBwYXRocyBbXXN0cmluZworCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNzLi4uKQorCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNKYXJzLi4uKQorCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5KYXJzLi4uKQorCQkJdW5pdHNCeUlkW25hbWVdID0gJnBiLkJ1aWxkYWJsZVVuaXR7CisJCQkJSWQ6ICAgICAgICAgICAgICBuYW1lLAorCQkJCVNvdXJjZUZpbGVQYXRoczogbW9kLlNyY3MsCisJCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIHBhdGhzKSwKKwkJCX0KKworCQkJZm9yIF8sIGQgOj0gcmFuZ2UgbW9kLkRlcHMgeworCQkJCXEuUHVzaEJhY2soZCkKKwkJCX0KKwkJfQogCX0KKworCXVuaXRzIDo9IG1ha2UoW10qcGIuQnVpbGRhYmxlVW5pdCwgMCwgbGVuKHVuaXRzQnlJZCkpCisJZm9yIF8sIHUgOj0gcmFuZ2UgdW5pdHNCeUlkIHsKKwkJdW5pdHMgPSBhcHBlbmQodW5pdHMsIHUpCisJfQorCXJldHVybiByZXN1bHRzLCB1bml0cworfQorCisvLyBnZW5GaWxlcyByZXR1cm5zIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKHBhdGhzIHRoYXQgc3RhcnQgd2l0aCBvdXREaXIvKSBmb3IgdGhlCisvLyBnaXZlbiBwYXRocy4gR2VuZXJhdGVkIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkLgorZnVuYyBnZW5GaWxlcyhlbnYgRW52LCBwYXRocyBbXXN0cmluZykgW10qcGIuR2VuZXJhdGVkRmlsZSB7CisJcHJlZml4IDo9IGVudi5PdXREaXIgKyAiLyIKKwl2YXIgcmV0IFtdKnBiLkdlbmVyYXRlZEZpbGUKKwlmb3IgXywgcCA6PSByYW5nZSBwYXRocyB7CisJCXJlbFBhdGgsIG9rIDo9IHN0cmluZ3MuQ3V0UHJlZml4KHAsIHByZWZpeCkKKwkJaWYgIW9rIHsKKwkJCWNvbnRpbnVlCisJCX0KKworCQljb250ZW50cywgZXJyIDo9IG9zLlJlYWRGaWxlKHBhdGguSm9pbihlbnYuUmVwb0RpciwgcCkpCisJCWlmIGVyciAhPSBuaWwgeworCQkJY29udGludWUKKwkJfQorCisJCXJldCA9IGFwcGVuZChyZXQsICZwYi5HZW5lcmF0ZWRGaWxleworCQkJUGF0aDogICAgIHJlbFBhdGgsCisJCQlDb250ZW50czogY29udGVudHMsCisJCX0pCisJfQorCXJldHVybiByZXQKIH0KIAogLy8gcnVuTWFrZSBydW5zIFNvb25nIGJ1aWxkIGZvciB0aGUgZ2l2ZW4gbW9kdWxlcy4KQEAgLTMwOCw2ICs0MTEsNyBAQAogCQkiVEFSR0VUX1BST0RVQ1Q9IiArIGVudi5MdW5jaFRhcmdldC5Qcm9kdWN0LAogCQkiVEFSR0VUX1JFTEVBU0U9IiArIGVudi5MdW5jaFRhcmdldC5SZWxlYXNlLAogCQkiVEFSR0VUX0JVSUxEX1ZBUklBTlQ9IiArIGVudi5MdW5jaFRhcmdldC5WYXJpYW50LAorCQkiVEFSR0VUX0JVSUxEX1RZUEU9cmVsZWFzZSIsCiAJCSItayIsCiAJfQogCWFyZ3MgPSBhcHBlbmQoYXJncywgbW9kdWxlcy4uLikKQEAgLTMxOSw3ICs0MjMsNiBAQAogfQogCiB0eXBlIGphdmFNb2R1bGUgc3RydWN0IHsKLQlOYW1lICAgIHN0cmluZwogCVBhdGggICAgW11zdHJpbmcgYGpzb246InBhdGgsb21pdGVtcHR5ImAKIAlEZXBzICAgIFtdc3RyaW5nIGBqc29uOiJkZXBlbmRlbmNpZXMsb21pdGVtcHR5ImAKIAlTcmNzICAgIFtdc3RyaW5nIGBqc29uOiJzcmNzLG9taXRlbXB0eSJgCkBAIC0zMjcsNjYgKzQzMCwyMyBAQAogCVNyY0phcnMgW11zdHJpbmcgYGpzb246InNyY2phcnMsb21pdGVtcHR5ImAKIH0KIAotZnVuYyBsb2FkSmF2YU1vZHVsZXMoZW52ICpFbnYpIChtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBlcnJvcikgeworZnVuYyBsb2FkSmF2YU1vZHVsZXMoZW52IEVudikgKG1hcFtzdHJpbmddKmphdmFNb2R1bGUsIGVycm9yKSB7CiAJamF2YURlcHNQYXRoIDo9IHBhdGguSm9pbihlbnYuUmVwb0RpciwgZW52Lk91dERpciwgInNvb25nL21vZHVsZV9icF9qYXZhX2RlcHMuanNvbiIpCiAJZGF0YSwgZXJyIDo9IG9zLlJlYWRGaWxlKGphdmFEZXBzUGF0aCkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwkJcmV0dXJuIG5pbCwgZXJyCiAJfQogCi0JdmFyIG1vZHVsZU1hcHBpbmcgbWFwW3N0cmluZ10qamF2YU1vZHVsZSAvLyBtb2R1bGUgbmFtZSAtPiBtb2R1bGUKLQlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChkYXRhLCAmbW9kdWxlTWFwcGluZyk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCXZhciByZXQgbWFwW3N0cmluZ10qamF2YU1vZHVsZSAvLyBtb2R1bGUgbmFtZSAtPiBtb2R1bGUKKwlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChkYXRhLCAmcmV0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgogCX0KIAotCWphdmFNb2R1bGVzIDo9IG1ha2UobWFwW3N0cmluZ10qamF2YU1vZHVsZSkKLQlqYXZhRmlsZVRvTW9kdWxlTWFwIDo9IG1ha2UobWFwW3N0cmluZ10qamF2YU1vZHVsZSkKLQlmb3IgbmFtZSwgbW9kdWxlIDo9IHJhbmdlIG1vZHVsZU1hcHBpbmcgewotCQlpZiBzdHJpbmdzLkhhc1N1ZmZpeChuYW1lLCAiLWphcmphciIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KG5hbWUsICIuaW1wbCIpIHsKLQkJCWNvbnRpbnVlCi0JCX0KLQkJbW9kdWxlLk5hbWUgPSBuYW1lCi0JCWphdmFNb2R1bGVzW25hbWVdID0gbW9kdWxlCi0JCWZvciBfLCBzcmMgOj0gcmFuZ2UgbW9kdWxlLlNyY3MgewotCQkJaWYgIXNsaWNlcy5Db250YWlucyhlbnYuSmF2YUZpbGVzLCBzcmMpIHsKLQkJCQkvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGFjdGl2ZSBmaWxlcy4KLQkJCQljb250aW51ZQotCQkJfQotCQkJaWYgamF2YUZpbGVUb01vZHVsZU1hcFtzcmNdICE9IG5pbCB7Ci0JCQkJLy8gVE9ETyhtaWNoYWVsbWVyZyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIGZpbGUgaXMgY292ZXJlZCBieSBtdWx0aXBsZSBtb2R1bGVzLgotCQkJCWxvZy5QcmludGYoIkZpbGUgJXEgZm91bmQgaW4gbW9kdWxlICVxIGJ1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgbW9kdWxlICVxIiwgc3JjLCBtb2R1bGUuTmFtZSwgamF2YUZpbGVUb01vZHVsZU1hcFtzcmNdLk5hbWUpCi0JCQkJY29udGludWUKLQkJCX0KLQkJCWphdmFGaWxlVG9Nb2R1bGVNYXBbc3JjXSA9IG1vZHVsZQorCS8vIEFkZCB0b3AgbGV2ZWwgamF2YV9zZGtfbGlicmFyeSBmb3IgLmltcGwgbW9kdWxlcy4KKwlmb3IgbmFtZSwgbW9kdWxlIDo9IHJhbmdlIHJldCB7CisJCWlmIHN0cmlwZWQgOj0gc3RyaW5ncy5UcmltU3VmZml4KG5hbWUsICIuaW1wbCIpOyBzdHJpcGVkICE9IG5hbWUgeworCQkJcmV0W3N0cmlwZWRdID0gbW9kdWxlCiAJCX0KIAl9Ci0JcmV0dXJuIGphdmFNb2R1bGVzLCBqYXZhRmlsZVRvTW9kdWxlTWFwLCBuaWwKLX0KLQotZnVuYyB0cmFuc2l0aXZlRGVwcyhtICpqYXZhTW9kdWxlLCBtb2R1bGVzIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIFtdc3RyaW5nIHsKLQl2YXIgcmV0IFtdc3RyaW5nCi0JcSA6PSBsaXN0Lk5ldygpCi0JcS5QdXNoQmFjayhtLk5hbWUpCi0Jc2VlbiA6PSBtYWtlKG1hcFtzdHJpbmddYm9vbCkgLy8gbW9kdWxlIG5hbWVzIC0+IHRydWUKLQlmb3IgcS5MZW4oKSA+IDAgewotCQluYW1lIDo9IHEuUmVtb3ZlKHEuRnJvbnQoKSkuKHN0cmluZykKLQkJbW9kIDo9IG1vZHVsZXNbbmFtZV0KLQkJaWYgbW9kID09IG5pbCB7Ci0JCQljb250aW51ZQotCQl9Ci0KLQkJcmV0ID0gYXBwZW5kKHJldCwgbW9kLlNyY3MuLi4pCi0JCXJldCA9IGFwcGVuZChyZXQsIG1vZC5TcmNKYXJzLi4uKQotCQlyZXQgPSBhcHBlbmQocmV0LCBtb2QuSmFycy4uLikKLQkJZm9yIF8sIGQgOj0gcmFuZ2UgbW9kLkRlcHMgewotCQkJaWYgc2VlbltkXSB7Ci0JCQkJY29udGludWUKLQkJCX0KLQkJCXNlZW5bZF0gPSB0cnVlCi0JCQlxLlB1c2hCYWNrKGQpCi0JCX0KLQl9Ci0Jc2xpY2VzLlNvcnQocmV0KQotCXJldCA9IHNsaWNlcy5Db21wYWN0KHJldCkKLQlyZXR1cm4gcmV0CisJcmV0dXJuIHJldCwgbmlsCiB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5zaAppbmRleCAyZGY0OGQwLi42ZjliMGM0IDEwMDc1NQotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2gKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgIDs7CiBlc2FjCiAKK2V4cG9ydCBCVUlMRF9FTlZfU0VRVUVOQ0VfTlVNQkVSPTEzCiBleHBvcnQgQU5EUk9JRF9CVUlMRF9UT1A9JFRPUAogZXhwb3J0IE9VVF9ESVI9JHtPVVRfRElSfQogZXhlYyAiJHtQUkVCVUlMVFNfR09fUk9PVH0vYmluL2dvIiAicnVuIiAiaWRlX3F1ZXJ5IiAiJEAiCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wYi5nbyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCmluZGV4IGYzYTAxNmQuLmExOTAyMjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCkBAIC0xLDYgKzEsMjEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwogLy8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nby4gRE8gTk9UIEVESVQuCiAvLyB2ZXJzaW9uczoKLS8vIAlwcm90b2MtZ2VuLWdvIHYxLjI1LjAtZGV2ZWwKKy8vIAlwcm90b2MtZ2VuLWdvIHYxLjMwLjAKIC8vIAlwcm90b2MgICAgICAgIHYzLjIxLjEyCiAvLyBzb3VyY2U6IGlkZV9xdWVyeS5wcm90bwogCkBAIC0yMCwyNTEgKzM1LDExMyBAQAogCV8gPSBwcm90b2ltcGwuRW5mb3JjZVZlcnNpb24ocHJvdG9pbXBsLk1heFZlcnNpb24gLSAyMCkKICkKIAotdHlwZSBTdGF0dXNfQ29kZSBpbnQzMgordHlwZSBMYW5ndWFnZSBpbnQzMgogCiBjb25zdCAoCi0JU3RhdHVzX09LICAgICAgU3RhdHVzX0NvZGUgPSAwCi0JU3RhdHVzX0ZBSUxVUkUgU3RhdHVzX0NvZGUgPSAxCisJTGFuZ3VhZ2VfTEFOR1VBR0VfVU5TUEVDSUZJRUQgTGFuZ3VhZ2UgPSAwCisJTGFuZ3VhZ2VfTEFOR1VBR0VfSkFWQSAgICAgICAgTGFuZ3VhZ2UgPSAxIC8vIGFsc28gaW5jbHVkZXMgS290bGluCisJTGFuZ3VhZ2VfTEFOR1VBR0VfQ1BQICAgICAgICAgTGFuZ3VhZ2UgPSAyCiApCiAKLS8vIEVudW0gdmFsdWUgbWFwcyBmb3IgU3RhdHVzX0NvZGUuCisvLyBFbnVtIHZhbHVlIG1hcHMgZm9yIExhbmd1YWdlLgogdmFyICgKLQlTdGF0dXNfQ29kZV9uYW1lID0gbWFwW2ludDMyXXN0cmluZ3sKLQkJMDogIk9LIiwKLQkJMTogIkZBSUxVUkUiLAorCUxhbmd1YWdlX25hbWUgPSBtYXBbaW50MzJdc3RyaW5neworCQkwOiAiTEFOR1VBR0VfVU5TUEVDSUZJRUQiLAorCQkxOiAiTEFOR1VBR0VfSkFWQSIsCisJCTI6ICJMQU5HVUFHRV9DUFAiLAogCX0KLQlTdGF0dXNfQ29kZV92YWx1ZSA9IG1hcFtzdHJpbmddaW50MzJ7Ci0JCSJPSyI6ICAgICAgMCwKLQkJIkZBSUxVUkUiOiAxLAorCUxhbmd1YWdlX3ZhbHVlID0gbWFwW3N0cmluZ11pbnQzMnsKKwkJIkxBTkdVQUdFX1VOU1BFQ0lGSUVEIjogMCwKKwkJIkxBTkdVQUdFX0pBVkEiOiAgICAgICAgMSwKKwkJIkxBTkdVQUdFX0NQUCI6ICAgICAgICAgMiwKIAl9CiApCiAKLWZ1bmMgKHggU3RhdHVzX0NvZGUpIEVudW0oKSAqU3RhdHVzX0NvZGUgewotCXAgOj0gbmV3KFN0YXR1c19Db2RlKQorZnVuYyAoeCBMYW5ndWFnZSkgRW51bSgpICpMYW5ndWFnZSB7CisJcCA6PSBuZXcoTGFuZ3VhZ2UpCiAJKnAgPSB4CiAJcmV0dXJuIHAKIH0KIAotZnVuYyAoeCBTdGF0dXNfQ29kZSkgU3RyaW5nKCkgc3RyaW5nIHsKK2Z1bmMgKHggTGFuZ3VhZ2UpIFN0cmluZygpIHN0cmluZyB7CiAJcmV0dXJuIHByb3RvaW1wbC5YLkVudW1TdHJpbmdPZih4LkRlc2NyaXB0b3IoKSwgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkpCiB9CiAKLWZ1bmMgKFN0YXR1c19Db2RlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKK2Z1bmMgKExhbmd1YWdlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKIAlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzWzBdLkRlc2NyaXB0b3IoKQogfQogCi1mdW5jIChTdGF0dXNfQ29kZSkgVHlwZSgpIHByb3RvcmVmbGVjdC5FbnVtVHlwZSB7CitmdW5jIChMYW5ndWFnZSkgVHlwZSgpIHByb3RvcmVmbGVjdC5FbnVtVHlwZSB7CiAJcmV0dXJuICZmaWxlX2lkZV9xdWVyeV9wcm90b19lbnVtVHlwZXNbMF0KIH0KIAotZnVuYyAoeCBTdGF0dXNfQ29kZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgeworZnVuYyAoeCBMYW5ndWFnZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgewogCXJldHVybiBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KQogfQogCi0vLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzX0NvZGUuRGVzY3JpcHRvciBpbnN0ZWFkLgotZnVuYyAoU3RhdHVzX0NvZGUpIEVudW1EZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKLQlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MCwgMH0KLX0KLQotLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIGFuYWx5c2lzLgotdHlwZSBTdGF0dXMgc3RydWN0IHsKLQlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKLQlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKLQl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCi0KLQlDb2RlIFN0YXR1c19Db2RlIGBwcm90b2J1ZjoidmFyaW50LDEsb3B0LG5hbWU9Y29kZSxwcm90bzMsZW51bT1pZGVfcXVlcnkuU3RhdHVzX0NvZGUiIGpzb246ImNvZGUsb21pdGVtcHR5ImAKLQkvLyBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMsIG1pZ2h0IGJlIGRpc3BsYXllZCB0byB1c2VyLgotCU1lc3NhZ2UgKnN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9bWVzc2FnZSxwcm90bzMsb25lb2YiIGpzb246Im1lc3NhZ2Usb21pdGVtcHR5ImAKLX0KLQotZnVuYyAoeCAqU3RhdHVzKSBSZXNldCgpIHsKLQkqeCA9IFN0YXR1c3t9Ci0JaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgewotCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0KLQkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCi0JCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCi0JfQotfQotCi1mdW5jICh4ICpTdGF0dXMpIFN0cmluZygpIHN0cmluZyB7Ci0JcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQotfQotCi1mdW5jICgqU3RhdHVzKSBQcm90b01lc3NhZ2UoKSB7fQotCi1mdW5jICh4ICpTdGF0dXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKLQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7Ci0JCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQotCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgewotCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQkJfQotCQlyZXR1cm4gbXMKLQl9Ci0JcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQotfQotCi0vLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCi1mdW5jICgqU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKy8vIERlcHJlY2F0ZWQ6IFVzZSBMYW5ndWFnZS5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jIChMYW5ndWFnZSkgRW51bURlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewogCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQogfQogCi1mdW5jICh4ICpTdGF0dXMpIEdldENvZGUoKSBTdGF0dXNfQ29kZSB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5Db2RlCit0eXBlIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIGludDMyCisKK2NvbnN0ICgKKwlBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9VTlNQRUNJRklFRCAgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgPSAwCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0sgICAgICAgICAgIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlID0gMQorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX05PVF9GT1VORCAgICBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDIgLy8gbm8gdGFyZ2V0IG9yIG1vZHVsZSBmb3VuZCBmb3IgdGhlIHNvdXJjZSBmaWxlLgorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX0JVSUxEX0ZBSUxFRCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDMKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZS4KK3ZhciAoCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGVfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJDT0RFX1VOU1BFQ0lGSUVEIiwKKwkJMTogIkNPREVfT0siLAorCQkyOiAiQ09ERV9OT1RfRk9VTkQiLAorCQkzOiAiQ09ERV9CVUlMRF9GQUlMRUQiLAogCX0KLQlyZXR1cm4gU3RhdHVzX09LCi19Ci0KLWZ1bmMgKHggKlN0YXR1cykgR2V0TWVzc2FnZSgpIHN0cmluZyB7Ci0JaWYgeCAhPSBuaWwgJiYgeC5NZXNzYWdlICE9IG5pbCB7Ci0JCXJldHVybiAqeC5NZXNzYWdlCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGVfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiQ09ERV9VTlNQRUNJRklFRCI6ICAwLAorCQkiQ09ERV9PSyI6ICAgICAgICAgICAxLAorCQkiQ09ERV9OT1RfRk9VTkQiOiAgICAyLAorCQkiQ09ERV9CVUlMRF9GQUlMRUQiOiAzLAogCX0KLQlyZXR1cm4gIiIKKykKKworZnVuYyAoeCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRW51bSgpICpBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSB7CisJcCA6PSBuZXcoQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUpCisJKnAgPSB4CisJcmV0dXJuIHAKIH0KIAotLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KLXR5cGUgUmVwb1N0YXRlIHN0cnVjdCB7Ci0Jc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCi0Jc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCi0JdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcwotCi0JLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KLQkvLyBlLmcuIC9ob21lL3VzZXIvd29yay9hbmRyb2lkLwotCVJlcG9EaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1yZXBvX2Rpcixqc29uPXJlcG9EaXIscHJvdG8zIiBqc29uOiJyZXBvX2RpcixvbWl0ZW1wdHkiYAotCS8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgotCUFjdGl2ZUZpbGVQYXRoIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixyZXAsbmFtZT1hY3RpdmVfZmlsZV9wYXRoLGpzb249YWN0aXZlRmlsZVBhdGgscHJvdG8zIiBqc29uOiJhY3RpdmVfZmlsZV9wYXRoLG9taXRlbXB0eSJgCi0JLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCi0JT3V0RGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMsb3B0LG5hbWU9b3V0X2Rpcixqc29uPW91dERpcixwcm90bzMiIGpzb246Im91dF9kaXIsb21pdGVtcHR5ImAKLQkvLyBSZXBvc2l0b3J5IHJlbGF0aXZlIHBhdGggdG8gY29tcGlsZV9jb21tYW5kcy5qc29uIGluIHdvcmtzdGF0aW9uLgotCUNvbXBEYlBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNCxvcHQsbmFtZT1jb21wX2RiX3BhdGgsanNvbj1jb21wRGJQYXRoLHByb3RvMyIganNvbjoiY29tcF9kYl9wYXRoLG9taXRlbXB0eSJgCitmdW5jICh4IEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5FbnVtU3RyaW5nT2YoeC5EZXNjcmlwdG9yKCksIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKHgpKQogfQogCi1mdW5jICh4ICpSZXBvU3RhdGUpIFJlc2V0KCkgewotCSp4ID0gUmVwb1N0YXRle30KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7Ci0JCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXQotCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKLQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQl9CitmdW5jIChBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1sxXS5EZXNjcmlwdG9yKCkKIH0KIAotZnVuYyAoeCAqUmVwb1N0YXRlKSBTdHJpbmcoKSBzdHJpbmcgewotCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK2Z1bmMgKEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1sxXQogfQogCi1mdW5jICgqUmVwb1N0YXRlKSBQcm90b01lc3NhZ2UoKSB7fQotCi1mdW5jICh4ICpSZXBvU3RhdGUpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKLQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7Ci0JCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQotCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgewotCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQkJfQotCQlyZXR1cm4gbXMKLQl9Ci0JcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorZnVuYyAoeCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgeworCXJldHVybiBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KQogfQogCi0vLyBEZXByZWNhdGVkOiBVc2UgUmVwb1N0YXRlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCi1mdW5jICgqUmVwb1N0YXRlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKLQlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MX0KKy8vIERlcHJlY2F0ZWQ6IFVzZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZS5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jIChBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRW51bURlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszLCAwLCAwfQogfQogCi1mdW5jICh4ICpSZXBvU3RhdGUpIEdldFJlcG9EaXIoKSBzdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguUmVwb0RpcgotCX0KLQlyZXR1cm4gIiIKLX0KLQotZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRBY3RpdmVGaWxlUGF0aCgpIFtdc3RyaW5nIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LkFjdGl2ZUZpbGVQYXRoCi0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRPdXREaXIoKSBzdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguT3V0RGlyCi0JfQotCXJldHVybiAiIgotfQotCi1mdW5jICh4ICpSZXBvU3RhdGUpIEdldENvbXBEYlBhdGgoKSBzdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguQ29tcERiUGF0aAotCX0KLQlyZXR1cm4gIiIKLX0KLQotLy8gUHJvdmlkZXMgYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIHByZS1yZXF1aXNpdGllcyBmb3IgcnVubmluZyBsYW5ndWFnZQotLy8gc2VydmljZXMgb24gYWN0aXZlX2ZpbGVfcGF0aHMuCi10eXBlIERlcHNSZXNwb25zZSBzdHJ1Y3QgewotCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQotCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQotCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKLQotCURlcHMgICBbXSpEZXBzUmVzcG9uc2VfRGVwcyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKLQlTdGF0dXMgKlN0YXR1cyAgICAgICAgICAgICAgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAotfQotCi1mdW5jICh4ICpEZXBzUmVzcG9uc2UpIFJlc2V0KCkgewotCSp4ID0gRGVwc1Jlc3BvbnNle30KLQlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7Ci0JCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXQotCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKLQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKLQl9Ci19Ci0KLWZ1bmMgKHggKkRlcHNSZXNwb25zZSkgU3RyaW5nKCkgc3RyaW5nIHsKLQlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCi19Ci0KLWZ1bmMgKCpEZXBzUmVzcG9uc2UpIFByb3RvTWVzc2FnZSgpIHt9Ci0KLWZ1bmMgKHggKkRlcHNSZXNwb25zZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewotCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXQotCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKLQkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCi0JCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7Ci0JCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQotCQl9Ci0JCXJldHVybiBtcwotCX0KLQlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCi19Ci0KLS8vIERlcHJlY2F0ZWQ6IFVzZSBEZXBzUmVzcG9uc2UuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KLWZ1bmMgKCpEZXBzUmVzcG9uc2UpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewotCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQotfQotCi1mdW5jICh4ICpEZXBzUmVzcG9uc2UpIEdldERlcHMoKSBbXSpEZXBzUmVzcG9uc2VfRGVwcyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5EZXBzCi0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LlN0YXR1cwotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLS8vIFJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcyBmb3IgdGhlCi0vLyBhY3RpdmUgZmlsZXMuCiB0eXBlIEdlbmVyYXRlZEZpbGUgc3RydWN0IHsKIAlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKIAlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKIAl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCiAKLQkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIElkZUFuYWx5c2lzLmJ1aWxkX2FydGlmYWN0X3Jvb3QuCisJLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byBidWlsZF9vdXRfZGlyLgogCVBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wYXRoLHByb3RvMyIganNvbjoicGF0aCxvbWl0ZW1wdHkiYAogCS8vIFRoZSB0ZXh0IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZSwgaWYgbm90IHByb3ZpZGVkIGNvbnRlbnRzIHdpbGwgYmUgcmVhZAogCS8vIGZyb20gdGhlIHBhdGggYWJvdmUgaW4gdXNlcidzIHdvcmtzdGF0aW9uLgpAQCAtMjc0LDcgKzE1MSw3IEBACiBmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBSZXNldCgpIHsKIAkqeCA9IEdlbmVyYXRlZEZpbGV7fQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKLQkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdCisJCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXQogCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKIAkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKIAl9CkBAIC0yODcsNyArMTY0LDcgQEAKIGZ1bmMgKCpHZW5lcmF0ZWRGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQogCiBmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7Ci0JbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdCisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzBdCiAJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgewogCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKIAkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKQEAgLTMwMCw3ICsxNzcsNyBAQAogCiAvLyBEZXByZWNhdGVkOiBVc2UgR2VuZXJhdGVkRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgogZnVuYyAoKkdlbmVyYXRlZEZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewotCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszfQorCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQogfQogCiBmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBHZXRQYXRoKCkgc3RyaW5nIHsKQEAgLTMxNywxMjcgKzE5NCwyOSBAQAogCXJldHVybiBuaWwKIH0KIAotdHlwZSBTb3VyY2VGaWxlIHN0cnVjdCB7Ci0Jc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCi0Jc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCi0JdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcwotCi0JLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgotCVBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wYXRoLHByb3RvMyIganNvbjoicGF0aCxvbWl0ZW1wdHkiYAotCS8vIFdvcmtpbmcgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4gQWxsIHRoZSByZWxhdGl2ZQotCS8vIHBhdGhzIGluIGNvbXBpbGVyX2FyZ3VtZW50cyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoLgotCS8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KLQlXb3JraW5nRGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9d29ya2luZ19kaXIsanNvbj13b3JraW5nRGlyLHByb3RvMyIganNvbjoid29ya2luZ19kaXIsb21pdGVtcHR5ImAKLQkvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGUuIElmIG11bHRpcGxlIHZhcmlhbnRzCi0JLy8gb2YgdGhlIG1vZHVsZSBiZWluZyBjb21waWxlZCBhcmUgcG9zc2libGUsIHRoZSBxdWVyeSBzY3JpcHQgd2lsbCBjaG9vc2UKLQkvLyBvbmUuCi0JQ29tcGlsZXJBcmd1bWVudHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywzLHJlcCxuYW1lPWNvbXBpbGVyX2FyZ3VtZW50cyxqc29uPWNvbXBpbGVyQXJndW1lbnRzLHByb3RvMyIganNvbjoiY29tcGlsZXJfYXJndW1lbnRzLG9taXRlbXB0eSJgCi0JLy8gQW55IGdlbmVyYXRlZCBmaWxlcyB0aGF0IGFyZSB1c2VkIGluIGNvbXBpbGluZyB0aGUgZmlsZS4KLQlHZW5lcmF0ZWQgW10qR2VuZXJhdGVkRmlsZSBgcHJvdG9idWY6ImJ5dGVzLDQscmVwLG5hbWU9Z2VuZXJhdGVkLHByb3RvMyIganNvbjoiZ2VuZXJhdGVkLG9taXRlbXB0eSJgCi0JLy8gUGF0aHMgdG8gYWxsIG9mIHRoZSBzb3VyY2VzLCBsaWtlIGJ1aWxkIGZpbGVzLCBjb2RlIGdlbmVyYXRvcnMsCi0JLy8gcHJvdG8gZmlsZXMgZXRjLiB0aGF0IHdlcmUgdXNlZCBkdXJpbmcgYW5hbHlzaXMuIFVzZWQgdG8gZmlndXJlCi0JLy8gb3V0IHdoZW4gYSBzZXQgb2YgYnVpbGQgYXJ0aWZhY3RzIGFyZSBzdGFsZSBhbmQgdGhlIHF1ZXJ5IHRvb2wKLQkvLyBtdXN0IGJlIHJlLXJ1bi4KLQkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCi0JRGVwcyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDUscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKLQkvLyBSZXByZXNlbnRzIGFuYWx5c2lzIHN0YXR1cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUuIGUuZy4gbm90IHBhcnQKLQkvLyBvZiB0aGUgYnVpbGQgZ3JhcGguCi0JU3RhdHVzICpTdGF0dXMgYHByb3RvYnVmOiJieXRlcyw2LG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAotfQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBSZXNldCgpIHsKLQkqeCA9IFNvdXJjZUZpbGV7fQotCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKLQkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdCi0JCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQotCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQotCX0KLX0KLQotZnVuYyAoeCAqU291cmNlRmlsZSkgU3RyaW5nKCkgc3RyaW5nIHsKLQlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCi19Ci0KLWZ1bmMgKCpTb3VyY2VGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7Ci0JbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdCi0JaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgewotCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKLQkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKLQkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCi0JCX0KLQkJcmV0dXJuIG1zCi0JfQotCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKLX0KLQotLy8gRGVwcmVjYXRlZDogVXNlIFNvdXJjZUZpbGUuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KLWZ1bmMgKCpTb3VyY2VGaWxlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKLQlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7NH0KLX0KLQotZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0UGF0aCgpIHN0cmluZyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5QYXRoCi0JfQotCXJldHVybiAiIgotfQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRXb3JraW5nRGlyKCkgc3RyaW5nIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LldvcmtpbmdEaXIKLQl9Ci0JcmV0dXJuICIiCi19Ci0KLWZ1bmMgKHggKlNvdXJjZUZpbGUpIEdldENvbXBpbGVyQXJndW1lbnRzKCkgW11zdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguQ29tcGlsZXJBcmd1bWVudHMKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRHZW5lcmF0ZWQoKSBbXSpHZW5lcmF0ZWRGaWxlIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LkdlbmVyYXRlZAotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHggKlNvdXJjZUZpbGUpIEdldERlcHMoKSBbXXN0cmluZyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5EZXBzCi0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0U3RhdHVzKCkgKlN0YXR1cyB7Ci0JaWYgeCAhPSBuaWwgewotCQlyZXR1cm4geC5TdGF0dXMKLQl9Ci0JcmV0dXJuIG5pbAotfQotCiB0eXBlIElkZUFuYWx5c2lzIHN0cnVjdCB7CiAJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCiAJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCiAJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcwogCi0JLy8gUGF0aCByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QsIGNvbnRhaW5pbmcgYWxsIHRoZSBhcnRpZmFjdHMKLQkvLyBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4gR2VuZXJhdGVkRmlsZS5wYXRoIGFyZSBhbHdheXMKLQkvLyByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KLQlCdWlsZEFydGlmYWN0Um9vdCBzdHJpbmcgICAgICAgIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1idWlsZF9hcnRpZmFjdF9yb290LGpzb249YnVpbGRBcnRpZmFjdFJvb3QscHJvdG8zIiBqc29uOiJidWlsZF9hcnRpZmFjdF9yb290LG9taXRlbXB0eSJgCi0JU291cmNlcyAgICAgICAgICAgW10qU291cmNlRmlsZSBgcHJvdG9idWY6ImJ5dGVzLDIscmVwLG5hbWU9c291cmNlcyxwcm90bzMiIGpzb246InNvdXJjZXMsb21pdGVtcHR5ImAKLQkvLyBTdGF0dXMgcmVwcmVzZW50aW5nIG92ZXJhbGwgYW5hbHlzaXMuCi0JLy8gU2hvdWxkIGZhaWwgb25seSB3aGVuIG5vIGFuYWx5c2lzIGNhbiBiZSBwZXJmb3JtZWQuCi0JU3RhdHVzICpTdGF0dXMgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGJ1aWxkIG91dHB1dHMgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCUJ1aWxkT3V0RGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9YnVpbGRfb3V0X2Rpcixqc29uPWJ1aWxkT3V0RGlyLHByb3RvMyIganNvbjoiYnVpbGRfb3V0X2RpcixvbWl0ZW1wdHkiYAorCS8vIFdvcmtpbmcgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KKwkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJV29ya2luZ0RpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcyw0LG9wdCxuYW1lPXdvcmtpbmdfZGlyLGpzb249d29ya2luZ0Rpcixwcm90bzMiIGpzb246IndvcmtpbmdfZGlyLG9taXRlbXB0eSJgCisJLy8gT25seSBzZXQgaWYgdGhlIHdob2xlIHF1ZXJ5IGZhaWxlZC4KKwlFcnJvciAqQW5hbHlzaXNFcnJvciBgcHJvdG9idWY6ImJ5dGVzLDUsb3B0LG5hbWU9ZXJyb3IscHJvdG8zLG9uZW9mIiBqc29uOiJlcnJvcixvbWl0ZW1wdHkiYAorCS8vIExpc3Qgb2YgcmVzdWx0cywgb25lIHBlciBxdWVyaWVkIGZpbGUuCisJUmVzdWx0cyBbXSpBbmFseXNpc1Jlc3VsdCBgcHJvdG9idWY6ImJ5dGVzLDYscmVwLG5hbWU9cmVzdWx0cyxwcm90bzMiIGpzb246InJlc3VsdHMsb21pdGVtcHR5ImAKKwkvLyBMaXN0IG9mIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgYnkgdGhlIHJlc3VsdHMuCisJVW5pdHMgW10qQnVpbGRhYmxlVW5pdCBgcHJvdG9idWY6ImJ5dGVzLDcscmVwLG5hbWU9dW5pdHMscHJvdG8zIiBqc29uOiJ1bml0cyxvbWl0ZW1wdHkiYAogfQogCiBmdW5jICh4ICpJZGVBbmFseXNpcykgUmVzZXQoKSB7CiAJKnggPSBJZGVBbmFseXNpc3t9CiAJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgewotCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNV0KKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzFdCiAJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQogCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQogCX0KQEAgLTQ1MCw3ICsyMjksNyBAQAogZnVuYyAoKklkZUFuYWx5c2lzKSBQcm90b01lc3NhZ2UoKSB7fQogCiBmdW5jICh4ICpJZGVBbmFseXNpcykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewotCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XQorCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKIAkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCiAJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CkBAIC00NjMsNDUgKzI0MiwzNDUgQEAKIAogLy8gRGVwcmVjYXRlZDogVXNlIElkZUFuYWx5c2lzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCiBmdW5jICgqSWRlQW5hbHlzaXMpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgewotCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs1fQorCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsxfQogfQogCi1mdW5jICh4ICpJZGVBbmFseXNpcykgR2V0QnVpbGRBcnRpZmFjdFJvb3QoKSBzdHJpbmcgeworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldEJ1aWxkT3V0RGlyKCkgc3RyaW5nIHsKIAlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LkJ1aWxkQXJ0aWZhY3RSb290CisJCXJldHVybiB4LkJ1aWxkT3V0RGlyCiAJfQogCXJldHVybiAiIgogfQogCi1mdW5jICh4ICpJZGVBbmFseXNpcykgR2V0U291cmNlcygpIFtdKlNvdXJjZUZpbGUgeworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldFdvcmtpbmdEaXIoKSBzdHJpbmcgewogCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguU291cmNlcworCQlyZXR1cm4geC5Xb3JraW5nRGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0RXJyb3IoKSAqQW5hbHlzaXNFcnJvciB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5FcnJvcgogCX0KIAlyZXR1cm4gbmlsCiB9CiAKLWZ1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRSZXN1bHRzKCkgW10qQW5hbHlzaXNSZXN1bHQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUmVzdWx0cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRVbml0cygpIFtdKkJ1aWxkYWJsZVVuaXQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguVW5pdHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIEFuYWx5c2lzRXJyb3Igc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBIdW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorCUVycm9yTWVzc2FnZSBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPWVycm9yX21lc3NhZ2UsanNvbj1lcnJvck1lc3NhZ2UscHJvdG8zIiBqc29uOiJlcnJvcl9tZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzRXJyb3IpIFJlc2V0KCkgeworCSp4ID0gQW5hbHlzaXNFcnJvcnt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkFuYWx5c2lzRXJyb3IpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkFuYWx5c2lzRXJyb3IpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNFcnJvci5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkFuYWx5c2lzRXJyb3IpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBHZXRFcnJvck1lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRXJyb3JNZXNzYWdlCisJfQorCXJldHVybiAiIgorfQorCit0eXBlIEFuYWx5c2lzUmVzdWx0IHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgdGhhdCB3YXMgcXVlcmllZCwgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVNvdXJjZUZpbGVQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9c291cmNlX2ZpbGVfcGF0aCxqc29uPXNvdXJjZUZpbGVQYXRoLHByb3RvMyIganNvbjoic291cmNlX2ZpbGVfcGF0aCxvbWl0ZW1wdHkiYAorCS8vIFJlcHJlc2VudHMgc3RhdHVzIGZvciB0aGlzIHJlc3VsdC4gZS5nLiBub3QgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGguCisJU3RhdHVzICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIElEIG9mIGJ1aWxkYWJsZSB1bml0IHRoYXQgY29udGFpbnMgdGhlIHNvdXJjZSBmaWxlLgorCS8vIFRoZSBpZGVfcXVlcnkgc2NyaXB0IGNhbiBjaG9vc2UgdGhlIG1vc3QgcmVsZXZhbnQgdW5pdCBmcm9tIG11bHRpcGxlCisJLy8gb3B0aW9ucy4KKwlVbml0SWQgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT11bml0X2lkLGpzb249dW5pdElkLHByb3RvMyIganNvbjoidW5pdF9pZCxvbWl0ZW1wdHkiYAorCS8vIEludmFsaWRhdGlvbiBydWxlIHRvIGNoZWNrIGlmIHRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQuCisJSW52YWxpZGF0aW9uICpJbnZhbGlkYXRpb24gYHByb3RvYnVmOiJieXRlcyw0LG9wdCxuYW1lPWludmFsaWRhdGlvbixwcm90bzMiIGpzb246ImludmFsaWRhdGlvbixvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgUmVzZXQoKSB7CisJKnggPSBBbmFseXNpc1Jlc3VsdHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdCkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNSZXN1bHQuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdCkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezN9Cit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRTb3VyY2VGaWxlUGF0aCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VGaWxlUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIEdldFN0YXR1cygpICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMgewogCWlmIHggIT0gbmlsIHsKIAkJcmV0dXJuIHguU3RhdHVzCiAJfQogCXJldHVybiBuaWwKIH0KIAotLy8gQnVpbGQgZGVwZW5kZW5jaWVzIG9mIGEgc291cmNlIGZpbGUgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcy4KLXR5cGUgRGVwc1Jlc3BvbnNlX0RlcHMgc3RydWN0IHsKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRVbml0SWQoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguVW5pdElkCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgR2V0SW52YWxpZGF0aW9uKCkgKkludmFsaWRhdGlvbiB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5JbnZhbGlkYXRpb24KKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIEJ1aWxkYWJsZVVuaXQgc3RydWN0IHsKIAlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKIAlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKIAl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCiAKLQkvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KLQlTb3VyY2VGaWxlIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9c291cmNlX2ZpbGUsanNvbj1zb3VyY2VGaWxlLHByb3RvMyIganNvbjoic291cmNlX2ZpbGUsb21pdGVtcHR5ImAKLQkvLyBCdWlsZCB0YXJnZXQgdG8gZXhlY3V0ZSBmb3IgZ2VuZXJhdGluZyBkZXAuCi0JQnVpbGRUYXJnZXQgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLHJlcCxuYW1lPWJ1aWxkX3RhcmdldCxqc29uPWJ1aWxkVGFyZ2V0LHByb3RvMyIganNvbjoiYnVpbGRfdGFyZ2V0LG9taXRlbXB0eSJgCi0JU3RhdHVzICAgICAgKlN0YXR1cyAgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWlsZGFibGUgdW5pdC4KKwkvLworCS8vIEV4YW1wbGVzOgorCS8vICAgLSBKYXZhOiBtb2R1bGUgb3IgdGFyZ2V0IG5hbWUsIGUuZy4gImZyYW1ld29yay1ibHVldG9vdGgiIG9yCisJLy8gICAgICIvL3RoaXJkX3BhcnR5L2hhbWNyZXN0OmhhbWNyZXN0X2phdmEiCisJLy8gICAtIEMrKzogc291cmNlIGZpbGUsIGUuZy4gInBhdGgvdG8vZmlsZS5jYyIKKwlJZCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPWlkLHByb3RvMyIganNvbjoiaWQsb21pdGVtcHR5ImAKKwkvLyBMYW5ndWFnZSBvZiB0aGUgdW5pdC4KKwkvLyBSZXF1aXJlZCBmb3IgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgdGhlIEFuYWx5c2lzUmVzdWx0LAorCS8vIGUuZy4gdGhlIHVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21waWxhdGlvbiBzdGFnZSBmb3IgdGhlIHNvdXJjZSBmaWxlLgorCUxhbmd1YWdlIExhbmd1YWdlIGBwcm90b2J1ZjoidmFyaW50LDIsb3B0LG5hbWU9bGFuZ3VhZ2UscHJvdG8zLGVudW09aWRlX3F1ZXJ5Lkxhbmd1YWdlIiBqc29uOiJsYW5ndWFnZSxvbWl0ZW1wdHkiYAorCS8vIFNvdXJjZSBmaWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgdW5pdC4KKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtpbmdfZGlyLgorCVNvdXJjZUZpbGVQYXRocyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMscmVwLG5hbWU9c291cmNlX2ZpbGVfcGF0aHMsanNvbj1zb3VyY2VGaWxlUGF0aHMscHJvdG8zIiBqc29uOiJzb3VyY2VfZmlsZV9wYXRocyxvbWl0ZW1wdHkiYAorCS8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMuCisJQ29tcGlsZXJBcmd1bWVudHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw0LHJlcCxuYW1lPWNvbXBpbGVyX2FyZ3VtZW50cyxqc29uPWNvbXBpbGVyQXJndW1lbnRzLHByb3RvMyIganNvbjoiY29tcGlsZXJfYXJndW1lbnRzLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiBnZW5lcmF0ZWQgZmlsZXMgcHJvZHVjZWQgYnkgdGhpcyB1bml0LgorCUdlbmVyYXRlZEZpbGVzIFtdKkdlbmVyYXRlZEZpbGUgYHByb3RvYnVmOiJieXRlcyw1LHJlcCxuYW1lPWdlbmVyYXRlZF9maWxlcyxqc29uPWdlbmVyYXRlZEZpbGVzLHByb3RvMyIganNvbjoiZ2VuZXJhdGVkX2ZpbGVzLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiBvdGhlciBCdWlsZGFibGVVbml0cyB0aGlzIHVuaXQgZGVwZW5kIG9uLgorCURlcGVuZGVuY3lJZHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw2LHJlcCxuYW1lPWRlcGVuZGVuY3lfaWRzLGpzb249ZGVwZW5kZW5jeUlkcyxwcm90bzMiIGpzb246ImRlcGVuZGVuY3lfaWRzLG9taXRlbXB0eSJgCiB9CiAKLWZ1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBSZXNldCgpIHsKLQkqeCA9IERlcHNSZXNwb25zZV9EZXBze30KK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIFJlc2V0KCkgeworCSp4ID0gQnVpbGRhYmxlVW5pdHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkJ1aWxkYWJsZVVuaXQpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQnVpbGRhYmxlVW5pdC5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkJ1aWxkYWJsZVVuaXQpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs0fQorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBHZXRJZCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5JZAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0TGFuZ3VhZ2UoKSBMYW5ndWFnZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5MYW5ndWFnZQorCX0KKwlyZXR1cm4gTGFuZ3VhZ2VfTEFOR1VBR0VfVU5TUEVDSUZJRUQKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0U291cmNlRmlsZVBhdGhzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlRmlsZVBhdGhzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0Q29tcGlsZXJBcmd1bWVudHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21waWxlckFyZ3VtZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldEdlbmVyYXRlZEZpbGVzKCkgW10qR2VuZXJhdGVkRmlsZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5HZW5lcmF0ZWRGaWxlcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldERlcGVuZGVuY3lJZHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5EZXBlbmRlbmN5SWRzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gSW52YWxpZGF0aW9uIHJ1bGUgdG8gY2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBzdGlsbCB2YWxpZC4KKy8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gZmlsZXMvZGlycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGgKKy8vIGJ1dCBzdGlsbCBhZmZlY3QgdGhlIHJlc3VsdC4gRm9yIGV4YW1wbGUgQlVJTEQgZmlsZXMsIGRpcmVjdG9yeSB0byB0aGUKKy8vIHRvb2xjaGFpbiBvciBjb25maWcgZmlsZXMgZXRjLgordHlwZSBJbnZhbGlkYXRpb24gc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBJZiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlIHRoZSByZXN1bHQgbWF5IGJlY29tZSBpbnZhbGlkLgorCS8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCUZpbGVQYXRocyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZmlsZV9wYXRocyxqc29uPWZpbGVQYXRocyxwcm90bzMiIGpzb246ImZpbGVfcGF0aHMsb21pdGVtcHR5ImAKKwkvLyBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgbWF0Y2ggYSBjaGFuZ2VkIGZpbGUgdGhlIHJlc3VsdCBtYXkgYmVjb21lIGludmFsaWQuCisJV2lsZGNhcmRzIFtdKkludmFsaWRhdGlvbl9XaWxkY2FyZCBgcHJvdG9idWY6ImJ5dGVzLDQscmVwLG5hbWU9d2lsZGNhcmRzLHByb3RvMyIganNvbjoid2lsZGNhcmRzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgUmVzZXQoKSB7CisJKnggPSBJbnZhbGlkYXRpb257fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkludmFsaWRhdGlvbikgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEludmFsaWRhdGlvbi5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkludmFsaWRhdGlvbikgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezV9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgR2V0RmlsZVBhdGhzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRmlsZVBhdGhzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBHZXRXaWxkY2FyZHMoKSBbXSpJbnZhbGlkYXRpb25fV2lsZGNhcmQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV2lsZGNhcmRzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIHRoZSBxdWVyeS4KK3R5cGUgQW5hbHlzaXNSZXN1bHRfU3RhdHVzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJQ29kZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSBgcHJvdG9idWY6InZhcmludCwxLG9wdCxuYW1lPWNvZGUscHJvdG8zLGVudW09aWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIiBqc29uOiJjb2RlLG9taXRlbXB0eSJgCisJLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKwlTdGF0dXNNZXNzYWdlICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1c19tZXNzYWdlLGpzb249c3RhdHVzTWVzc2FnZSxwcm90bzMsb25lb2YiIGpzb246InN0YXR1c19tZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUmVzZXQoKSB7CisJKnggPSBBbmFseXNpc1Jlc3VsdF9TdGF0dXN7fQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKIAkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdCiAJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQpAQCAtNTA5LDEzICs1ODgsMTMgQEAKIAl9CiB9CiAKLWZ1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBTdHJpbmcoKSBzdHJpbmcgeworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgewogCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKIH0KIAotZnVuYyAoKkRlcHNSZXNwb25zZV9EZXBzKSBQcm90b01lc3NhZ2UoKSB7fQorZnVuYyAoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUHJvdG9NZXNzYWdlKCkge30KIAotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XQogCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKIAkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCkBAIC01MjcsMTA0ICs2MDYsMTkwIEBACiAJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQogfQogCi0vLyBEZXByZWNhdGVkOiBVc2UgRGVwc1Jlc3BvbnNlX0RlcHMuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KLWZ1bmMgKCpEZXBzUmVzcG9uc2VfRGVwcykgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7Ci0JcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezIsIDB9CisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNSZXN1bHRfU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MywgMH0KIH0KIAotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIEdldFNvdXJjZUZpbGUoKSBzdHJpbmcgeworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBHZXRDb2RlKCkgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgewogCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguU291cmNlRmlsZQorCQlyZXR1cm4geC5Db2RlCisJfQorCXJldHVybiBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9VTlNQRUNJRklFRAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIEdldFN0YXR1c01lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsICYmIHguU3RhdHVzTWVzc2FnZSAhPSBuaWwgeworCQlyZXR1cm4gKnguU3RhdHVzTWVzc2FnZQogCX0KIAlyZXR1cm4gIiIKIH0KIAotZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIEdldEJ1aWxkVGFyZ2V0KCkgW11zdHJpbmcgewotCWlmIHggIT0gbmlsIHsKLQkJcmV0dXJuIHguQnVpbGRUYXJnZXQKLQl9Ci0JcmV0dXJuIG5pbAordHlwZSBJbnZhbGlkYXRpb25fV2lsZGNhcmQgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQcmVmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAicGF0aC90by8iKQorCVByZWZpeCAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wcmVmaXgscHJvdG8zLG9uZW9mIiBqc29uOiJwcmVmaXgsb21pdGVtcHR5ImAKKwkvLyBTdWZmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAiQW5kcm9pZC5icCIpCisJU3VmZml4ICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN1ZmZpeCxwcm90bzMsb25lb2YiIGpzb246InN1ZmZpeCxvbWl0ZW1wdHkiYAorCS8vIElmIGZhbHNlLCB0aGUgcGFydCBvZiB0aGUgcGF0aCBiZXR3ZWVuIHRoZSBnaXZlbiBgcHJlZml4YCBhbmQgYHN1ZmZpeGAKKwkvLyBzaG91bGQgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMgKCcvJykuCisJQ2FuQ3Jvc3NGb2xkZXIgKmJvb2wgYHByb3RvYnVmOiJ2YXJpbnQsMyxvcHQsbmFtZT1jYW5fY3Jvc3NfZm9sZGVyLGpzb249Y2FuQ3Jvc3NGb2xkZXIscHJvdG8zLG9uZW9mIiBqc29uOiJjYW5fY3Jvc3NfZm9sZGVyLG9taXRlbXB0eSJgCiB9CiAKLWZ1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKLQlpZiB4ICE9IG5pbCB7Ci0JCXJldHVybiB4LlN0YXR1cworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBSZXNldCgpIHsKKwkqeCA9IEludmFsaWRhdGlvbl9XaWxkY2FyZHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCiAJfQotCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzddCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEludmFsaWRhdGlvbl9XaWxkY2FyZC5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezUsIDB9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgR2V0UHJlZml4KCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4LlByZWZpeCAhPSBuaWwgeworCQlyZXR1cm4gKnguUHJlZml4CisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb25fV2lsZGNhcmQpIEdldFN1ZmZpeCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgJiYgeC5TdWZmaXggIT0gbmlsIHsKKwkJcmV0dXJuICp4LlN1ZmZpeAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBHZXRDYW5Dcm9zc0ZvbGRlcigpIGJvb2wgeworCWlmIHggIT0gbmlsICYmIHguQ2FuQ3Jvc3NGb2xkZXIgIT0gbmlsIHsKKwkJcmV0dXJuICp4LkNhbkNyb3NzRm9sZGVyCisJfQorCXJldHVybiBmYWxzZQogfQogCiB2YXIgRmlsZV9pZGVfcXVlcnlfcHJvdG8gcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yCiAKIHZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjID0gW11ieXRlewogCTB4MGEsIDB4MGYsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsCi0JMHg2ZiwgMHgxMiwgMHgwOSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyMiwgMHg3YywgMHgwYSwgMHgwNiwKLQkweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDEyLCAweDJhLCAweDBhLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDE4LCAweDAxLAotCTB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsIDB4MzIsIDB4MTYsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksCi0JMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyZSwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHg1MiwgMHgwNCwgMHg2MywgMHg2ZiwKLQkweDY0LCAweDY1LCAweDEyLCAweDFkLCAweDBhLCAweDA3LCAweDZkLCAweDY1LCAweDczLCAweDczLCAweDYxLCAweDY3LCAweDY1LCAweDE4LCAweDAyLCAweDIwLAotCTB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDcsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4ODgsIDB4MDEsCi0JMHgwMSwgMHgyMiwgMHgxYiwgMHgwYSwgMHgwNCwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxMiwgMHgwNiwgMHgwYSwgMHgwMiwgMHg0ZiwgMHg0YiwgMHgxMCwKLQkweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDU1LCAweDUyLCAweDQ1LCAweDEwLCAweDAxLCAweDQyLCAweDBhLAotCTB4MGEsIDB4MDgsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MjIsIDB4OGIsIDB4MDEsIDB4MGEsIDB4MDksIDB4NTIsCi0JMHg2NSwgMHg3MCwgMHg2ZiwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2NSwgMHgxMiwgMHgxOSwgMHgwYSwgMHgwOCwgMHg3MiwgMHg2NSwgMHg3MCwgMHg2ZiwKLQkweDVmLCAweDY0LCAweDY5LCAweDcyLCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA3LCAweDcyLCAweDY1LCAweDcwLCAweDZmLAotCTB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MjgsIDB4MGEsIDB4MTAsIDB4NjEsIDB4NjMsIDB4NzQsIDB4NjksIDB4NzYsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksCi0JMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwZSwgMHg2MSwKLQkweDYzLCAweDc0LCAweDY5LCAweDc2LCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LCAweDEyLCAweDE3LCAweDBhLAotCTB4MDcsIDB4NmYsIDB4NzUsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDYsCi0JMHg2ZiwgMHg3NSwgMHg3NCwgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgyMCwgMHgwYSwgMHgwYywgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg1ZiwgMHg2NCwKLQkweDYyLCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDA0LCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDYzLCAweDZmLAotCTB4NmQsIDB4NzAsIDB4NDQsIDB4NjIsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MjIsIDB4ODMsIDB4MDIsIDB4MGEsIDB4MGMsIDB4NDQsIDB4NjUsIDB4NzAsCi0JMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgxMiwgMHgzMCwgMHgwYSwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwKLQkweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDFjLCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LAotCTB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDQsIDB4NjUsIDB4NzAsIDB4NzMsIDB4NTIsIDB4NjUsIDB4NzMsIDB4NzAsIDB4NmYsIDB4NmUsIDB4NzMsIDB4NjUsCi0JMHgyZSwgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwgMHg3MywgMHgxMiwgMHgyZSwgMHgwYSwgMHgwNiwgMHg3MywKLQkweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDExLCAweDJlLCAweDY5LCAweDY0LAotCTB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsCi0JMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwgMHgxYSwgMHg4NSwgMHgwMSwgMHgwYSwgMHgwNCwKLQkweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDEyLCAweDFmLCAweDBhLCAweDBiLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLCAweDY2LAotCTB4NjksIDB4NmMsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsCi0JMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwgMHgyMSwgMHgwYSwgMHgwYywgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg1ZiwgMHg3NCwKLQkweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDc0LCAweDE4LCAweDAyLCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBiLCAweDYyLCAweDc1LCAweDY5LAotCTB4NmMsIDB4NjQsIDB4NTQsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIDB4NzQsIDB4MTIsIDB4MmUsIDB4MGEsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsCi0JMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxMSwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwKLQkweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDQ4LCAweDAwLCAweDUyLCAweDA2LCAweDczLAotCTB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsIDB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsCi0JMHg3NCwgMHg3NSwgMHg3MywgMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyMiwgMHg1MSwKLQkweDBhLCAweDBkLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLAotCTB4MTIsIDB4MGEsIDB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NzAsCi0JMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwgMHgxZiwgMHgwYSwgMHgwOCwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwKLQkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDBjLCAweDQ4LCAweDAwLCAweDUyLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LAotCTB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsIDB4NDIsIDB4MGIsIDB4MGEsIDB4MDksIDB4NWYsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsCi0JMHg3MywgMHgyMiwgMHhmNywgMHgwMSwgMHgwYSwgMHgwYSwgMHg1MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwKLQkweDEyLCAweDEyLCAweDBhLCAweDA0LCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA0LAotCTB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTIsIDB4MWYsIDB4MGEsIDB4MGIsIDB4NzcsIDB4NmYsIDB4NzIsIDB4NmIsIDB4NjksIDB4NmUsIDB4NjcsIDB4NWYsCi0JMHg2NCwgMHg2OSwgMHg3MiwgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwKLQkweDZlLCAweDY3LCAweDQ0LCAweDY5LCAweDcyLCAweDEyLCAweDJkLCAweDBhLCAweDEyLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LAotCTB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NzUsIDB4NmQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDMsIDB4MjgsCi0JMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2OSwgMHg2YywgMHg2NSwgMHg3MiwgMHg0MSwgMHg3MiwgMHg2NywgMHg3NSwgMHg2ZCwKLQkweDY1LCAweDZlLCAweDc0LCAweDczLCAweDEyLCAweDM2LCAweDBhLCAweDA5LCAweDY3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LAotCTB4NjQsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsCi0JMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwgMHg2OSwgMHg2YywKLQkweDY1LCAweDUyLCAweDA5LCAweDY3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDEyLCAweDEyLCAweDBhLCAweDA0LAotCTB4NjQsIDB4NjUsIDB4NzAsIDB4NzMsIDB4MTgsIDB4MDUsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NjQsIDB4NjUsIDB4NzAsIDB4NzMsCi0JMHgxMiwgMHgyZSwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwNiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwKLQkweDMyLCAweDExLCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDUzLCAweDc0LCAweDYxLAotCTB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCi0JMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyMiwgMHhhOSwgMHgwMSwgMHgwYSwgMHgwYiwKLQkweDQ5LCAweDY0LCAweDY1LCAweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDEyLCAweDJlLCAweDBhLCAweDEzLCAweDYyLAotCTB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NWYsIDB4NjEsIDB4NzIsIDB4NzQsIDB4NjksIDB4NjYsIDB4NjEsIDB4NjMsIDB4NzQsIDB4NWYsIDB4NzIsIDB4NmYsCi0JMHg2ZiwgMHg3NCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg0MSwKLQkweDcyLCAweDc0LCAweDY5LCAweDY2LCAweDYxLCAweDYzLCAweDc0LCAweDUyLCAweDZmLCAweDZmLCAweDc0LCAweDEyLCAweDJmLCAweDBhLCAweDA3LCAweDczLAotCTB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTUsIDB4MmUsIDB4NjksCi0JMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg1MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwKLQkweDY5LCAweDZjLCAweDY1LCAweDUyLCAweDA3LCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDczLCAweDEyLCAweDJlLCAweDBhLCAweDA2LAotCTB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTEsIDB4MmUsIDB4NjksCi0JMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwKLQkweDAwLCAweDUyLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDg4LCAweDAxLCAweDAxLCAweDQyLCAweDA5LCAweDBhLCAweDA3LAotCTB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDIsIDB4MWIsIDB4NWEsIDB4MTksIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsCi0JMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZiwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHg1ZiwgMHg3MCwKLQkweDcyLCAweDZmLCAweDc0LCAweDZmLCAweDYyLCAweDA2LCAweDcwLCAweDcyLCAweDZmLCAweDc0LCAweDZmLCAweDMzLAorCTB4NmYsIDB4MTIsIDB4MDksIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MjIsIDB4NTEsIDB4MGEsIDB4MGQsCisJMHg0NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwgMHgxMiwgMHgwYSwKKwkweDA0LCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA0LCAweDcwLCAweDYxLCAweDc0LAorCTB4NjgsIDB4MTIsIDB4MWYsIDB4MGEsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwYywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwOCwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHg4OCwKKwkweDAxLCAweDAxLCAweDQyLCAweDBiLCAweDBhLCAweDA5LCAweDVmLCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDIyLAorCTB4ODIsIDB4MDIsIDB4MGEsIDB4MGIsIDB4NDksIDB4NjQsIDB4NjUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4MTIsCisJMHgyMiwgMHgwYSwgMHgwZCwgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg1ZiwgMHg2ZiwgMHg3NSwgMHg3NCwgMHg1ZiwgMHg2NCwgMHg2OSwgMHg3MiwKKwkweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBiLCAweDYyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDRmLCAweDc1LCAweDc0LAorCTB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MWYsIDB4MGEsIDB4MGIsIDB4NzcsIDB4NmYsIDB4NzIsIDB4NmIsIDB4NjksIDB4NmUsIDB4NjcsIDB4NWYsIDB4NjQsCisJMHg2OSwgMHg3MiwgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwgMHg2ZSwKKwkweDY3LCAweDQ0LCAweDY5LCAweDcyLCAweDEyLCAweDMzLCAweDBhLCAweDA1LCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDE4LCAweDA1LCAweDIwLAorCTB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsCisJMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg0NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHg0OCwgMHgwMCwgMHg1MiwKKwkweDA1LCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDg4LCAweDAxLCAweDAxLCAweDEyLCAweDMzLCAweDBhLCAweDA3LCAweDcyLCAweDY1LCAweDczLAorCTB4NzUsIDB4NmMsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDYsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTksIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsCisJMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg1MiwKKwkweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDUyLCAweDA3LCAweDcyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDczLCAweDEyLCAweDJlLAorCTB4MGEsIDB4MDUsIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDcsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsCisJMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg2MSwKKwkweDYyLCAweDZjLCAweDY1LCAweDU1LCAweDZlLCAweDY5LCAweDc0LCAweDUyLCAweDA1LCAweDc1LCAweDZlLCAweDY5LCAweDc0LCAweDczLCAweDQyLCAweDA4LAorCTB4MGEsIDB4MDYsIDB4NWYsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4NGEsIDB4MDQsIDB4MDgsIDB4MDIsIDB4MTAsIDB4MDMsIDB4NGEsIDB4MDQsCisJMHgwOCwgMHgwMywgMHgxMCwgMHgwNCwgMHgyMiwgMHgzNCwgMHgwYSwgMHgwZCwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywKKwkweDQ1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDEyLCAweDIzLCAweDBhLCAweDBkLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDVmLCAweDZkLAorCTB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGMsIDB4NjUsIDB4NzIsCisJMHg3MiwgMHg2ZiwgMHg3MiwgMHg0ZCwgMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHgyMiwgMHhhNSwgMHgwMywgMHgwYSwgMHgwZSwgMHg0MSwKKwkweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDUyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDEyLCAweDI4LCAweDBhLAorCTB4MTAsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NWYsIDB4NzAsIDB4NjEsIDB4NzQsCisJMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwZSwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwKKwkweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LCAweDEyLCAweDM4LCAweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LAorCTB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MjAsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsCisJMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3NSwKKwkweDZjLCAweDc0LCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDUyLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LAorCTB4NzMsIDB4MTIsIDB4MTcsIDB4MGEsIDB4MDcsIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NWYsIDB4NjksIDB4NjQsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsCisJMHgyOCwgMHgwOSwgMHg1MiwgMHgwNiwgMHg3NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHg0OSwgMHg2NCwgMHgxMiwgMHgzYiwgMHgwYSwgMHgwYywgMHg2OSwgMHg2ZSwKKwkweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDE4LCAweDA0LCAweDIwLCAweDAxLCAweDI4LCAweDBiLAorCTB4MzIsIDB4MTcsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDksIDB4NmUsIDB4NzYsCisJMHg2MSwgMHg2YywgMHg2OSwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHg1MiwgMHgwYywgMHg2OSwgMHg2ZSwgMHg3NiwgMHg2MSwgMHg2YywKKwkweDY5LCAweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDFhLCAweGQ4LCAweDAxLCAweDBhLCAweDA2LCAweDUzLCAweDc0LCAweDYxLCAweDc0LAorCTB4NzUsIDB4NzMsIDB4MTIsIDB4MzksIDB4MGEsIDB4MDQsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsCisJMHgzMiwgMHgyNSwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0MSwgMHg2ZSwgMHg2MSwKKwkweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDUyLCAweDY1LCAweDczLCAweDc1LCAweDZjLCAweDc0LCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LAorCTB4NzUsIDB4NzMsIDB4MmUsIDB4NDMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4NTIsIDB4MDQsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4MTIsIDB4MmEsIDB4MGEsCisJMHgwZSwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg1ZiwgMHg2ZCwgMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHgxOCwKKwkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDQ4LCAweDAwLCAweDUyLCAweDBkLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDRkLAorCTB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4ODgsIDB4MDEsIDB4MDEsIDB4MjIsIDB4NTQsIDB4MGEsIDB4MDQsIDB4NDMsIDB4NmYsIDB4NjQsCisJMHg2NSwgMHgxMiwgMHgxNCwgMHgwYSwgMHgxMCwgMHg0MywgMHg0ZiwgMHg0NCwgMHg0NSwgMHg1ZiwgMHg1NSwgMHg0ZSwgMHg1MywgMHg1MCwgMHg0NSwgMHg0MywKKwkweDQ5LCAweDQ2LCAweDQ5LCAweDQ1LCAweDQ0LCAweDEwLCAweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQzLCAweDRmLCAweDQ0LCAweDQ1LCAweDVmLAorCTB4NGYsIDB4NGIsIDB4MTAsIDB4MDEsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MGUsIDB4NDMsIDB4NGYsIDB4NDQsIDB4NDUsIDB4NWYsIDB4NGUsIDB4NGYsIDB4NTQsCisJMHg1ZiwgMHg0NiwgMHg0ZiwgMHg1NSwgMHg0ZSwgMHg0NCwgMHgxMCwgMHgwMiwgMHgxMiwgMHgxNSwgMHgwYSwgMHgxMSwgMHg0MywgMHg0ZiwgMHg0NCwgMHg0NSwKKwkweDVmLCAweDQyLCAweDU1LCAweDQ5LCAweDRjLCAweDQ0LCAweDVmLCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDQ1LCAweDQ0LCAweDEwLCAweDAzLCAweDQyLAorCTB4MTEsIDB4MGEsIDB4MGYsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsCisJMHg2NywgMHg2NSwgMHgyMiwgMHg5NSwgMHgwMiwgMHgwYSwgMHgwZCwgMHg0MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwKKwkweDU1LCAweDZlLCAweDY5LCAweDc0LCAweDEyLCAweDBlLCAweDBhLCAweDAyLCAweDY5LCAweDY0LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LAorCTB4NTIsIDB4MDIsIDB4NjksIDB4NjQsIDB4MTIsIDB4MmYsIDB4MGEsIDB4MDgsIDB4NmMsIDB4NjEsIDB4NmUsIDB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsCisJMHgxOCwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwZSwgMHgzMiwgMHgxMywgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwKKwkweDcyLCAweDc5LCAweDJlLCAweDRjLCAweDYxLCAweDZlLCAweDY3LCAweDc1LCAweDYxLCAweDY3LCAweDY1LCAweDUyLCAweDA4LCAweDZjLCAweDYxLCAweDZlLAorCTB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTIsIDB4MmEsIDB4MGEsIDB4MTEsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsCisJMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwKKwkweDUyLCAweDBmLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LAorCTB4NzMsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTIsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsCisJMHg2NywgMHg3NSwgMHg2ZCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywKKwkweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LCAweDcyLCAweDQxLCAweDcyLCAweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLAorCTB4MTIsIDB4NDEsIDB4MGEsIDB4MGYsIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NWYsIDB4NjYsIDB4NjksCisJMHg2YywgMHg2NSwgMHg3MywgMHgxOCwgMHgwNSwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxOCwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwKKwkweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LAorCTB4NjksIDB4NmMsIDB4NjUsIDB4NTIsIDB4MGUsIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksCisJMHg2YywgMHg2NSwgMHg3MywgMHgxMiwgMHgyNSwgMHgwYSwgMHgwZSwgMHg2NCwgMHg2NSwgMHg3MCwgMHg2NSwgMHg2ZSwgMHg2NCwgMHg2NSwgMHg2ZSwgMHg2MywKKwkweDc5LCAweDVmLCAweDY5LCAweDY0LCAweDczLCAweDE4LCAweDA2LCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBkLCAweDY0LCAweDY1LCAweDcwLAorCTB4NjUsIDB4NmUsIDB4NjQsIDB4NjUsIDB4NmUsIDB4NjMsIDB4NzksIDB4NDksIDB4NjQsIDB4NzMsIDB4MjIsIDB4OGUsIDB4MDIsIDB4MGEsIDB4MGMsIDB4NDksCisJMHg2ZSwgMHg3NiwgMHg2MSwgMHg2YywgMHg2OSwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgxMiwgMHgxZCwgMHgwYSwgMHgwYSwgMHg2NiwKKwkweDY5LCAweDZjLCAweDY1LCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLAorCTB4MDksIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4NzMsIDB4MTIsIDB4M2UsIDB4MGEsIDB4MDksIDB4NzcsIDB4NjksCisJMHg2YywgMHg2NCwgMHg2MywgMHg2MSwgMHg3MiwgMHg2NCwgMHg3MywgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgyMCwgMHgyZSwKKwkweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQ5LCAweDZlLCAweDc2LCAweDYxLCAweDZjLCAweDY5LAorCTB4NjQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4MmUsIDB4NTcsIDB4NjksIDB4NmMsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NzIsIDB4NjQsIDB4NTIsCisJMHgwOSwgMHg3NywgMHg2OSwgMHg2YywgMHg2NCwgMHg2MywgMHg2MSwgMHg3MiwgMHg2NCwgMHg3MywgMHgxYSwgMHg5ZSwgMHgwMSwgMHgwYSwgMHgwOCwgMHg1NywKKwkweDY5LCAweDZjLCAweDY0LCAweDYzLCAweDYxLCAweDcyLCAweDY0LCAweDEyLCAweDFiLCAweDBhLCAweDA2LCAweDcwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LAorCTB4NzgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzAsIDB4NzIsIDB4NjUsIDB4NjYsIDB4NjksCisJMHg3OCwgMHg4OCwgMHgwMSwgMHgwMSwgMHgxMiwgMHgxYiwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NSwgMHg2NiwgMHg2NiwgMHg2OSwgMHg3OCwgMHgxOCwgMHgwMiwKKwkweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDQ4LCAweDAxLCAweDUyLCAweDA2LCAweDczLCAweDc1LCAweDY2LCAweDY2LCAweDY5LCAweDc4LCAweDg4LCAweDAxLAorCTB4MDEsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTAsIDB4NjMsIDB4NjEsIDB4NmUsIDB4NWYsIDB4NjMsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NWYsIDB4NjYsCisJMHg2ZiwgMHg2YywgMHg2NCwgMHg2NSwgMHg3MiwgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOCwgMHg0OCwgMHgwMiwgMHg1MiwgMHgwZSwgMHg2MywKKwkweDYxLCAweDZlLCAweDQzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDQ2LCAweDZmLCAweDZjLCAweDY0LCAweDY1LCAweDcyLCAweDg4LCAweDAxLCAweDAxLAorCTB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsIDB4NzAsIDB4NzIsIDB4NjUsIDB4NjYsIDB4NjksIDB4NzgsIDB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsCisJMHg3MywgMHg3NSwgMHg2NiwgMHg2NiwgMHg2OSwgMHg3OCwgMHg0MiwgMHgxMywgMHgwYSwgMHgxMSwgMHg1ZiwgMHg2MywgMHg2MSwgMHg2ZSwgMHg1ZiwgMHg2MywKKwkweDcyLCAweDZmLCAweDczLCAweDczLCAweDVmLCAweDY2LCAweDZmLCAweDZjLCAweDY0LCAweDY1LCAweDcyLCAweDJhLCAweDQ5LCAweDBhLCAweDA4LCAweDRjLAorCTB4NjEsIDB4NmUsIDB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTIsIDB4MTgsIDB4MGEsIDB4MTQsIDB4NGMsIDB4NDEsIDB4NGUsIDB4NDcsIDB4NTUsCisJMHg0MSwgMHg0NywgMHg0NSwgMHg1ZiwgMHg1NSwgMHg0ZSwgMHg1MywgMHg1MCwgMHg0NSwgMHg0MywgMHg0OSwgMHg0NiwgMHg0OSwgMHg0NSwgMHg0NCwgMHgxMCwKKwkweDAwLCAweDEyLCAweDExLCAweDBhLCAweDBkLCAweDRjLCAweDQxLCAweDRlLCAweDQ3LCAweDU1LCAweDQxLCAweDQ3LCAweDQ1LCAweDVmLCAweDRhLCAweDQxLAorCTB4NTYsIDB4NDEsIDB4MTAsIDB4MDEsIDB4MTIsIDB4MTAsIDB4MGEsIDB4MGMsIDB4NGMsIDB4NDEsIDB4NGUsIDB4NDcsIDB4NTUsIDB4NDEsIDB4NDcsIDB4NDUsCisJMHg1ZiwgMHg0MywgMHg1MCwgMHg1MCwgMHgxMCwgMHgwMiwgMHg0MiwgMHgxYiwgMHg1YSwgMHgxOSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwKKwkweDY1LCAweDcyLCAweDc5LCAweDJmLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDVmLCAweDcwLCAweDcyLAorCTB4NmYsIDB4NzQsIDB4NmYsIDB4NjIsIDB4MDYsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsIDB4NmYsIDB4MzMsCiB9CiAKIHZhciAoCkBAIC02MzksMzIgKzgwNCwzNSBAQAogCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjRGF0YQogfQogCi12YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzID0gbWFrZShbXXByb3RvaW1wbC5FbnVtSW5mbywgMSkKLXZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDcpCit2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzID0gbWFrZShbXXByb3RvaW1wbC5FbnVtSW5mbywgMikKK3ZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDgpCiB2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZ29UeXBlcyA9IFtdaW50ZXJmYWNle317Ci0JKFN0YXR1c19Db2RlKSgwKSwgICAgICAgICAgLy8gMDogaWRlX3F1ZXJ5LlN0YXR1cy5Db2RlCi0JKCpTdGF0dXMpKG5pbCksICAgICAgICAgICAgLy8gMTogaWRlX3F1ZXJ5LlN0YXR1cwotCSgqUmVwb1N0YXRlKShuaWwpLCAgICAgICAgIC8vIDI6IGlkZV9xdWVyeS5SZXBvU3RhdGUKLQkoKkRlcHNSZXNwb25zZSkobmlsKSwgICAgICAvLyAzOiBpZGVfcXVlcnkuRGVwc1Jlc3BvbnNlCi0JKCpHZW5lcmF0ZWRGaWxlKShuaWwpLCAgICAgLy8gNDogaWRlX3F1ZXJ5LkdlbmVyYXRlZEZpbGUKLQkoKlNvdXJjZUZpbGUpKG5pbCksICAgICAgICAvLyA1OiBpZGVfcXVlcnkuU291cmNlRmlsZQotCSgqSWRlQW5hbHlzaXMpKG5pbCksICAgICAgIC8vIDY6IGlkZV9xdWVyeS5JZGVBbmFseXNpcwotCSgqRGVwc1Jlc3BvbnNlX0RlcHMpKG5pbCksIC8vIDc6IGlkZV9xdWVyeS5EZXBzUmVzcG9uc2UuRGVwcworCShMYW5ndWFnZSkoMCksICAgICAgICAgICAgICAgICAgIC8vIDA6IGlkZV9xdWVyeS5MYW5ndWFnZQorCShBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkoMCksIC8vIDE6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMuQ29kZQorCSgqR2VuZXJhdGVkRmlsZSkobmlsKSwgICAgICAgICAgIC8vIDI6IGlkZV9xdWVyeS5HZW5lcmF0ZWRGaWxlCisJKCpJZGVBbmFseXNpcykobmlsKSwgICAgICAgICAgICAgLy8gMzogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzCisJKCpBbmFseXNpc0Vycm9yKShuaWwpLCAgICAgICAgICAgLy8gNDogaWRlX3F1ZXJ5LkFuYWx5c2lzRXJyb3IKKwkoKkFuYWx5c2lzUmVzdWx0KShuaWwpLCAgICAgICAgICAvLyA1OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQKKwkoKkJ1aWxkYWJsZVVuaXQpKG5pbCksICAgICAgICAgICAvLyA2OiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdAorCSgqSW52YWxpZGF0aW9uKShuaWwpLCAgICAgICAgICAgIC8vIDc6IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24KKwkoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykobmlsKSwgICAvLyA4OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzCisJKCpJbnZhbGlkYXRpb25fV2lsZGNhcmQpKG5pbCksICAgLy8gOTogaWRlX3F1ZXJ5LkludmFsaWRhdGlvbi5XaWxkY2FyZAogfQogdmFyIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2RlcElkeHMgPSBbXWludDMyewotCTAsIC8vIDA6IGlkZV9xdWVyeS5TdGF0dXMuY29kZTp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlN0YXR1cy5Db2RlCi0JNywgLy8gMTogaWRlX3F1ZXJ5LkRlcHNSZXNwb25zZS5kZXBzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuRGVwc1Jlc3BvbnNlLkRlcHMKLQkxLCAvLyAyOiBpZGVfcXVlcnkuRGVwc1Jlc3BvbnNlLnN0YXR1czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlN0YXR1cwotCTQsIC8vIDM6IGlkZV9xdWVyeS5Tb3VyY2VGaWxlLmdlbmVyYXRlZDp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkdlbmVyYXRlZEZpbGUKLQkxLCAvLyA0OiBpZGVfcXVlcnkuU291cmNlRmlsZS5zdGF0dXM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5TdGF0dXMKLQk1LCAvLyA1OiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMuc291cmNlczp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlNvdXJjZUZpbGUKLQkxLCAvLyA2OiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMuc3RhdHVzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuU3RhdHVzCi0JMSwgLy8gNzogaWRlX3F1ZXJ5LkRlcHNSZXNwb25zZS5EZXBzLnN0YXR1czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LlN0YXR1cwotCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIG91dHB1dF90eXBlCi0JOCwgLy8gWzg6OF0gaXMgdGhlIHN1Yi1saXN0IGZvciBtZXRob2QgaW5wdXRfdHlwZQotCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIHR5cGVfbmFtZQotCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIGV4dGVuZGVlCi0JMCwgLy8gWzA6OF0gaXMgdGhlIHN1Yi1saXN0IGZvciBmaWVsZCB0eXBlX25hbWUKKwk0LCAvLyAwOiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMuZXJyb3I6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc0Vycm9yCisJNSwgLy8gMTogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzLnJlc3VsdHM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdAorCTYsIC8vIDI6IGlkZV9xdWVyeS5JZGVBbmFseXNpcy51bml0czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkJ1aWxkYWJsZVVuaXQKKwk4LCAvLyAzOiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuc3RhdHVzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzCisJNywgLy8gNDogaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LmludmFsaWRhdGlvbjp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkludmFsaWRhdGlvbgorCTAsIC8vIDU6IGlkZV9xdWVyeS5CdWlsZGFibGVVbml0Lmxhbmd1YWdlOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuTGFuZ3VhZ2UKKwkyLCAvLyA2OiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdC5nZW5lcmF0ZWRfZmlsZXM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5HZW5lcmF0ZWRGaWxlCisJOSwgLy8gNzogaWRlX3F1ZXJ5LkludmFsaWRhdGlvbi53aWxkY2FyZHM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24uV2lsZGNhcmQKKwkxLCAvLyA4OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzLmNvZGU6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMuQ29kZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIG91dHB1dF90eXBlCisJOSwgLy8gWzk6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBtZXRob2QgaW5wdXRfdHlwZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIHR5cGVfbmFtZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIGV4dGVuZGVlCisJMCwgLy8gWzA6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBmaWVsZCB0eXBlX25hbWUKIH0KIAogZnVuYyBpbml0KCkgeyBmaWxlX2lkZV9xdWVyeV9wcm90b19pbml0KCkgfQpAQCAtNjc0LDQyICs4NDIsNiBAQAogCX0KIAlpZiAhcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgewogCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKLQkJCXN3aXRjaCB2IDo9IHYuKCpTdGF0dXMpOyBpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gJnYuc3RhdGUKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCi0JCQljYXNlIDI6Ci0JCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5pbAotCQkJfQotCQl9Ci0JCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzFdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30gewotCQkJc3dpdGNoIHYgOj0gdi4oKlJlcG9TdGF0ZSk7IGkgewotCQkJY2FzZSAwOgotCQkJCXJldHVybiAmdi5zdGF0ZQotCQkJY2FzZSAxOgotCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKLQkJCWNhc2UgMjoKLQkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbmlsCi0JCQl9Ci0JCX0KLQkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7Ci0JCQlzd2l0Y2ggdiA6PSB2LigqRGVwc1Jlc3BvbnNlKTsgaSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuICZ2LnN0YXRlCi0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuICZ2LnNpemVDYWNoZQotCQkJY2FzZSAyOgotCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBuaWwKLQkJCX0KLQkJfQotCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKIAkJCXN3aXRjaCB2IDo9IHYuKCpHZW5lcmF0ZWRGaWxlKTsgaSB7CiAJCQljYXNlIDA6CiAJCQkJcmV0dXJuICZ2LnN0YXRlCkBAIC03MjEsMTkgKzg1Myw3IEBACiAJCQkJcmV0dXJuIG5pbAogCQkJfQogCQl9Ci0JCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30gewotCQkJc3dpdGNoIHYgOj0gdi4oKlNvdXJjZUZpbGUpOyBpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gJnYuc3RhdGUKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCi0JCQljYXNlIDI6Ci0JCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5pbAotCQkJfQotCQl9Ci0JCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKIAkJCXN3aXRjaCB2IDo9IHYuKCpJZGVBbmFseXNpcyk7IGkgewogCQkJY2FzZSAwOgogCQkJCXJldHVybiAmdi5zdGF0ZQpAQCAtNzQ1LDggKzg2NSw2OCBAQAogCQkJCXJldHVybiBuaWwKIAkJCX0KIAkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc0Vycm9yKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc1Jlc3VsdCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqQnVpbGRhYmxlVW5pdCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSW52YWxpZGF0aW9uKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQogCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKLQkJCXN3aXRjaCB2IDo9IHYuKCpEZXBzUmVzcG9uc2VfRGVwcyk7IGkgeworCQkJc3dpdGNoIHYgOj0gdi4oKkFuYWx5c2lzUmVzdWx0X1N0YXR1cyk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSW52YWxpZGF0aW9uX1dpbGRjYXJkKTsgaSB7CiAJCQljYXNlIDA6CiAJCQkJcmV0dXJuICZ2LnN0YXRlCiAJCQljYXNlIDE6CkBAIC03NTksMTggKzkzOSwxNiBAQAogCQl9CiAJfQogCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzBdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KLQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9Ci0JZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQotCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KLQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQogCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KKwlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s3XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CiAJdHlwZSB4IHN0cnVjdHt9CiAJb3V0IDo9IHByb3RvaW1wbC5UeXBlQnVpbGRlcnsKIAkJRmlsZTogcHJvdG9pbXBsLkRlc2NCdWlsZGVyewogCQkJR29QYWNrYWdlUGF0aDogcmVmbGVjdC5UeXBlT2YoeHt9KS5Qa2dQYXRoKCksCiAJCQlSYXdEZXNjcmlwdG9yOiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjLAotCQkJTnVtRW51bXM6ICAgICAgMSwKLQkJCU51bU1lc3NhZ2VzOiAgIDcsCisJCQlOdW1FbnVtczogICAgICAyLAorCQkJTnVtTWVzc2FnZXM6ICAgOCwKIAkJCU51bUV4dGVuc2lvbnM6IDAsCiAJCQlOdW1TZXJ2aWNlczogICAwLAogCQl9LApkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucHJvdG8gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bwppbmRleCAzZDdhOGU3Li4xM2YzNDljIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bworKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bwpAQCAtMTYsNTEgKzE2LDExIEBACiBzeW50YXggPSAicHJvdG8zIjsKIAogcGFja2FnZSBpZGVfcXVlcnk7CisKIG9wdGlvbiBnb19wYWNrYWdlID0gImlkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8iOwogCi0vLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgYW5hbHlzaXMuCi1tZXNzYWdlIFN0YXR1cyB7Ci0gIGVudW0gQ29kZSB7Ci0gICAgT0sgPSAwOwotICAgIEZBSUxVUkUgPSAxOwotICB9Ci0gIENvZGUgY29kZSA9IDE7Ci0gIC8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCi0gIG9wdGlvbmFsIHN0cmluZyBtZXNzYWdlID0gMjsKLX0KLQotLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KLW1lc3NhZ2UgUmVwb1N0YXRlIHsKLSAgLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KLSAgLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KLSAgc3RyaW5nIHJlcG9fZGlyID0gMTsKLSAgLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCi0gIHJlcGVhdGVkIHN0cmluZyBhY3RpdmVfZmlsZV9wYXRoID0gMjsKLSAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCi0gIHN0cmluZyBvdXRfZGlyID0gMzsKLSAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KLSAgc3RyaW5nIGNvbXBfZGJfcGF0aCA9IDQ7Ci19Ci0KLS8vIFByb3ZpZGVzIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBwcmUtcmVxdWlzaXRpZXMgZm9yIHJ1bm5pbmcgbGFuZ3VhZ2UKLS8vIHNlcnZpY2VzIG9uIGFjdGl2ZV9maWxlX3BhdGhzLgotbWVzc2FnZSBEZXBzUmVzcG9uc2UgewotICAvLyBCdWlsZCBkZXBlbmRlbmNpZXMgb2YgYSBzb3VyY2UgZmlsZSBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlIHNlcnZpY2VzLgotICBtZXNzYWdlIERlcHMgewotICAgIC8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgotICAgIHN0cmluZyBzb3VyY2VfZmlsZSA9IDE7Ci0gICAgLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgotICAgIHJlcGVhdGVkIHN0cmluZyBidWlsZF90YXJnZXQgPSAyOwotICAgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAzOwotICB9Ci0gIHJlcGVhdGVkIERlcHMgZGVwcyA9IDE7Ci0gIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAyOwotfQotCi0vLyBSZXR1cm5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMgZm9yIHRoZQotLy8gYWN0aXZlIGZpbGVzLgogbWVzc2FnZSBHZW5lcmF0ZWRGaWxlIHsKLSAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byBJZGVBbmFseXNpcy5idWlsZF9hcnRpZmFjdF9yb290LgorICAvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIGJ1aWxkX291dF9kaXIuCiAgIHN0cmluZyBwYXRoID0gMTsKIAogICAvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKQEAgLTY4LDQ0ICsyOCwxMDAgQEAKICAgb3B0aW9uYWwgYnl0ZXMgY29udGVudHMgPSAyOwogfQogCi1tZXNzYWdlIFNvdXJjZUZpbGUgewotICAvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCi0gIHN0cmluZyBwYXRoID0gMTsKLQotICAvLyBXb3JraW5nIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIEFsbCB0aGUgcmVsYXRpdmUKLSAgLy8gcGF0aHMgaW4gY29tcGlsZXJfYXJndW1lbnRzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGlzIHBhdGguCi0gIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KLSAgc3RyaW5nIHdvcmtpbmdfZGlyID0gMjsKLQotICAvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGUuIElmIG11bHRpcGxlIHZhcmlhbnRzCi0gIC8vIG9mIHRoZSBtb2R1bGUgYmVpbmcgY29tcGlsZWQgYXJlIHBvc3NpYmxlLCB0aGUgcXVlcnkgc2NyaXB0IHdpbGwgY2hvb3NlCi0gIC8vIG9uZS4KLSAgcmVwZWF0ZWQgc3RyaW5nIGNvbXBpbGVyX2FyZ3VtZW50cyA9IDM7Ci0KLSAgLy8gQW55IGdlbmVyYXRlZCBmaWxlcyB0aGF0IGFyZSB1c2VkIGluIGNvbXBpbGluZyB0aGUgZmlsZS4KLSAgcmVwZWF0ZWQgR2VuZXJhdGVkRmlsZSBnZW5lcmF0ZWQgPSA0OwotCi0gIC8vIFBhdGhzIHRvIGFsbCBvZiB0aGUgc291cmNlcywgbGlrZSBidWlsZCBmaWxlcywgY29kZSBnZW5lcmF0b3JzLAotICAvLyBwcm90byBmaWxlcyBldGMuIHRoYXQgd2VyZSB1c2VkIGR1cmluZyBhbmFseXNpcy4gVXNlZCB0byBmaWd1cmUKLSAgLy8gb3V0IHdoZW4gYSBzZXQgb2YgYnVpbGQgYXJ0aWZhY3RzIGFyZSBzdGFsZSBhbmQgdGhlIHF1ZXJ5IHRvb2wKLSAgLy8gbXVzdCBiZSByZS1ydW4uCi0gIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KLSAgcmVwZWF0ZWQgc3RyaW5nIGRlcHMgPSA1OwotCi0gIC8vIFJlcHJlc2VudHMgYW5hbHlzaXMgc3RhdHVzIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsZS4gZS5nLiBub3QgcGFydAotICAvLyBvZiB0aGUgYnVpbGQgZ3JhcGguCi0gIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSA2OwotfQotCiBtZXNzYWdlIElkZUFuYWx5c2lzIHsKLSAgLy8gUGF0aCByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QsIGNvbnRhaW5pbmcgYWxsIHRoZSBhcnRpZmFjdHMKLSAgLy8gZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIEdlbmVyYXRlZEZpbGUucGF0aCBhcmUgYWx3YXlzCi0gIC8vIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgotICBzdHJpbmcgYnVpbGRfYXJ0aWZhY3Rfcm9vdCA9IDE7CisgIC8vIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGJ1aWxkIG91dHB1dHMgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisgIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIGJ1aWxkX291dF9kaXIgPSAxOworICAvLyBXb3JraW5nIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisgIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIHdvcmtpbmdfZGlyID0gNDsKKyAgLy8gT25seSBzZXQgaWYgdGhlIHdob2xlIHF1ZXJ5IGZhaWxlZC4KKyAgb3B0aW9uYWwgQW5hbHlzaXNFcnJvciBlcnJvciA9IDU7CisgIC8vIExpc3Qgb2YgcmVzdWx0cywgb25lIHBlciBxdWVyaWVkIGZpbGUuCisgIHJlcGVhdGVkIEFuYWx5c2lzUmVzdWx0IHJlc3VsdHMgPSA2OworICAvLyBMaXN0IG9mIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgYnkgdGhlIHJlc3VsdHMuCisgIHJlcGVhdGVkIEJ1aWxkYWJsZVVuaXQgdW5pdHMgPSA3OwogCi0gIHJlcGVhdGVkIFNvdXJjZUZpbGUgc291cmNlcyA9IDI7Ci0KLSAgLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgotICAvLyBTaG91bGQgZmFpbCBvbmx5IHdoZW4gbm8gYW5hbHlzaXMgY2FuIGJlIHBlcmZvcm1lZC4KLSAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDM7CisgIHJlc2VydmVkIDIsIDM7CiB9CisKK21lc3NhZ2UgQW5hbHlzaXNFcnJvciB7CisgIC8vIEh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgIHN0cmluZyBlcnJvcl9tZXNzYWdlID0gMTsKK30KKworbWVzc2FnZSBBbmFseXNpc1Jlc3VsdCB7CisgIC8vIFBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIHRoYXQgd2FzIHF1ZXJpZWQsIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIHNvdXJjZV9maWxlX3BhdGggPSAxOworICAvLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgdGhlIHF1ZXJ5LgorICBtZXNzYWdlIFN0YXR1cyB7CisgICAgZW51bSBDb2RlIHsKKyAgICAgIENPREVfVU5TUEVDSUZJRUQgPSAwOworICAgICAgQ09ERV9PSyA9IDE7CisgICAgICBDT0RFX05PVF9GT1VORCA9IDI7ICAvLyBubyB0YXJnZXQgb3IgbW9kdWxlIGZvdW5kIGZvciB0aGUgc291cmNlIGZpbGUuCisgICAgICBDT0RFX0JVSUxEX0ZBSUxFRCA9IDM7CisgICAgfQorICAgIENvZGUgY29kZSA9IDE7CisgICAgLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKyAgICBvcHRpb25hbCBzdHJpbmcgc3RhdHVzX21lc3NhZ2UgPSAyOworICB9CisgIC8vIFJlcHJlc2VudHMgc3RhdHVzIGZvciB0aGlzIHJlc3VsdC4gZS5nLiBub3QgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGguCisgIFN0YXR1cyBzdGF0dXMgPSAyOworICAvLyBJRCBvZiBidWlsZGFibGUgdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBzb3VyY2UgZmlsZS4KKyAgLy8gVGhlIGlkZV9xdWVyeSBzY3JpcHQgY2FuIGNob29zZSB0aGUgbW9zdCByZWxldmFudCB1bml0IGZyb20gbXVsdGlwbGUKKyAgLy8gb3B0aW9ucy4KKyAgc3RyaW5nIHVuaXRfaWQgPSAzOworICAvLyBJbnZhbGlkYXRpb24gcnVsZSB0byBjaGVjayBpZiB0aGUgcmVzdWx0IGlzIHN0aWxsIHZhbGlkLgorICBJbnZhbGlkYXRpb24gaW52YWxpZGF0aW9uID0gNDsKK30KKworZW51bSBMYW5ndWFnZSB7CisgIExBTkdVQUdFX1VOU1BFQ0lGSUVEID0gMDsKKyAgTEFOR1VBR0VfSkFWQSA9IDE7ICAvLyBhbHNvIGluY2x1ZGVzIEtvdGxpbgorICBMQU5HVUFHRV9DUFAgPSAyOworfQorCittZXNzYWdlIEJ1aWxkYWJsZVVuaXQgeworICAvLyBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYnVpbGRhYmxlIHVuaXQuCisgIC8vCisgIC8vIEV4YW1wbGVzOgorICAvLyAgIC0gSmF2YTogbW9kdWxlIG9yIHRhcmdldCBuYW1lLCBlLmcuICJmcmFtZXdvcmstYmx1ZXRvb3RoIiBvcgorICAvLyAgICIvL3RoaXJkX3BhcnR5L2hhbWNyZXN0OmhhbWNyZXN0X2phdmEiCisgIC8vICAgLSBDKys6IHNvdXJjZSBmaWxlLCBlLmcuICJwYXRoL3RvL2ZpbGUuY2MiCisgIHN0cmluZyBpZCA9IDE7CisgIC8vIExhbmd1YWdlIG9mIHRoZSB1bml0LgorICAvLyBSZXF1aXJlZCBmb3IgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgdGhlIEFuYWx5c2lzUmVzdWx0LAorICAvLyBlLmcuIHRoZSB1bml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcGlsYXRpb24gc3RhZ2UgZm9yIHRoZSBzb3VyY2UgZmlsZS4KKyAgTGFuZ3VhZ2UgbGFuZ3VhZ2UgPSAyOworICAvLyBTb3VyY2UgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHVuaXQuCisgIC8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya2luZ19kaXIuCisgIHJlcGVhdGVkIHN0cmluZyBzb3VyY2VfZmlsZV9wYXRocyA9IDM7CisgIC8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMuCisgIHJlcGVhdGVkIHN0cmluZyBjb21waWxlcl9hcmd1bWVudHMgPSA0OworICAvLyBMaXN0IG9mIGdlbmVyYXRlZCBmaWxlcyBwcm9kdWNlZCBieSB0aGlzIHVuaXQuCisgIHJlcGVhdGVkIEdlbmVyYXRlZEZpbGUgZ2VuZXJhdGVkX2ZpbGVzID0gNTsKKyAgLy8gTGlzdCBvZiBvdGhlciBCdWlsZGFibGVVbml0cyB0aGlzIHVuaXQgZGVwZW5kIG9uLgorICByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeV9pZHMgPSA2OworfQorCisvLyBJbnZhbGlkYXRpb24gcnVsZSB0byBjaGVjayBpZiB0aGUgcmVzdWx0IGlzIHN0aWxsIHZhbGlkLgorLy8gVGhpcyBzaG91bGQgY29udGFpbiBmaWxlcy9kaXJzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSBwYXJ0IG9mIHRoZSBidWlsZCBncmFwaAorLy8gYnV0IHN0aWxsIGFmZmVjdCB0aGUgcmVzdWx0LiBGb3IgZXhhbXBsZSBCVUlMRCBmaWxlcywgZGlyZWN0b3J5IHRvIHRoZQorLy8gdG9vbGNoYWluIG9yIGNvbmZpZyBmaWxlcyBldGMuCittZXNzYWdlIEludmFsaWRhdGlvbiB7CisgIC8vIElmIGFueSBvZiB0aGVzZSBmaWxlcyBjaGFuZ2UgdGhlIHJlc3VsdCBtYXkgYmVjb21lIGludmFsaWQuCisgIC8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICByZXBlYXRlZCBzdHJpbmcgZmlsZV9wYXRocyA9IDE7CisKKyAgbWVzc2FnZSBXaWxkY2FyZCB7CisgICAgLy8gUHJlZml4IG9mIHRoZSBmaWxlIHBhdGggKGUuZy4gInBhdGgvdG8vIikKKyAgICBvcHRpb25hbCBzdHJpbmcgcHJlZml4ID0gMTsKKyAgICAvLyBTdWZmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAiQW5kcm9pZC5icCIpCisgICAgb3B0aW9uYWwgc3RyaW5nIHN1ZmZpeCA9IDI7CisgICAgLy8gSWYgZmFsc2UsIHRoZSBwYXJ0IG9mIHRoZSBwYXRoIGJldHdlZW4gdGhlIGdpdmVuIGBwcmVmaXhgIGFuZCBgc3VmZml4YAorICAgIC8vIHNob3VsZCBub3QgY29udGFpbiBkaXJlY3Rvcnkgc2VwYXJhdG9ycyAoJy8nKS4KKyAgICBvcHRpb25hbCBib29sIGNhbl9jcm9zc19mb2xkZXIgPSAzOworICB9CisgIC8vIElmIGFueSBvZiB0aGVzZSBydWxlcyBtYXRjaCBhIGNoYW5nZWQgZmlsZSB0aGUgcmVzdWx0IG1heSBiZWNvbWUgaW52YWxpZC4KKyAgcmVwZWF0ZWQgV2lsZGNhcmQgd2lsZGNhcmRzID0gNDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA3NCUKY29weSBmcm9tIHRvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vQW5kcm9pZC5icApjb3B5IHRvIHRvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icAppbmRleCA3MGYxNWNkLi41MTkwMjEwIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9BbmRyb2lkLmJwCkBAIC0xOCwxNiArMTgsMTQgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2xpYnJhcnlfaG9zdF9zdGF0aWMgewotICAgIG5hbWU6ICJpZGVfcXVlcnlfcHJvdG8iLAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYyIsCiAgICAgc3JjczogWwotICAgICAgICAiaWRlX3F1ZXJ5LnByb3RvIiwKKyAgICAgICAgImdlbmVyYWwuY2MiLAorICAgICAgICAiZm9vLnByb3RvIiwKICAgICBdLAorICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKICAgICBwcm90bzogewotICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKLSAgICAgICAgdHlwZTogImZ1bGwiLAotICAgICAgICBjYW5vbmljYWxfcGF0aF9mcm9tX3Jvb3Q6IGZhbHNlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnByb3RvYnVmLWNwcC1mdWxsIl0sCiB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9BbmRyb2lkLmJwCmNvcHkgdG8gdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8KaW5kZXggNzBmMTVjZC4uNWE4NTE0NyAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCkBAIC0xNCwyMCArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgewotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KK3N5bnRheCA9ICJwcm90bzMiOwogCi1jY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKLSAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb3RvIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJpZGVfcXVlcnkucHJvdG8iLAotICAgIF0sCi0gICAgcHJvdG86IHsKLSAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCi0gICAgICAgIHR5cGU6ICJmdWxsIiwKLSAgICAgICAgY2Fub25pY2FsX3BhdGhfZnJvbV9yb290OiBmYWxzZSwKLSAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICI2NCIsCi0gICAgc2hhcmVkX2xpYnM6IFsibGlicHJvdG9idWYtY3BwLWZ1bGwiXSwKK3BhY2thZ2UgaWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzOworCittZXNzYWdlIFByb3RvTXNnIHsKKyAgLy8gVGVzdCBwcm90byBmaWVsZC4KKyAgaW50NjQgc29tZV9maWVsZCA9IDE7CisgIC8vICAgICAgICAgICAgICAgICAgIF4gc29tZV9maWVsZAogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDYzOWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZm9vLnBiLmgiCisKK3VzaW5nIGlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnOworCit2b2lkIEZvbyhpbnQgeCwgZG91YmxlIHkpIHt9CitmbG9hdCBGb28oZmxvYXQgeCwgZmxvYXQgeSkgeyByZXR1cm4gMC4wZjsgfQorCit2b2lkIFRlc3RDb21wbGV0aW9uKCkgeworICAvLyBUZXN0IGNvbXBsZXRpb24gb24gcHJvdG9zIGFuZCBmdXp6eSBtYXRjaGluZyBvZiBjb21wbGV0aW9uIHN1Z2dlc3Rpb25zLgorCisgIFByb3RvTXNnIGZvbzsKKworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gdHlwZSgiZiIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0iZm9vIikKKyAgLy8gZGVsbGluZSgpCisgIC8vIHR5cGUoImZvby5zZiIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcigKKyAgLy8gIGxhYmVsPSJzb21lX2ZpZWxkLioiLAorICAvLyAgaW5zZXJ0VGV4dD0ic29tZV9maWVsZC4qIiwKKyAgLy8gKQorICAvLyBkZWxsaW5lKCkKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisKKyAgLy8gXgorCisgIC8vIHN0ZXAKKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIHR5cGUoInYucHVzaCIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0icHVzaF9iYWNrLioiKQorICAvLyBkZWxsaW5lKCkKK30KKwordm9pZCBUZXN0TmF2aWdhdGlvbigpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBpbnRzOworICAvLyAgICAgICAgICAgICAgIHwgICB8IGludHMKKyAgLy8gICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIFNUTCB0eXBlcy4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIG5hdmlnYXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBuYXZpZ2F0aW9uLml0ZW1zLmZpbHRlcihwYXRoPSIuKi92ZWN0b3IiKQorCisgIGludHMucHVzaF9iYWNrKDApOworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIGxvY2FsIHN5bWJvbHMuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBuYXZpZ2F0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgbmF2aWdhdGlvbi5pdGVtcy5maWx0ZXIocGF0aD0iLiovZ2VuZXJhbC5jYyIsIHJhbmdlPWludHMpCisKKyAgUHJvdG9Nc2cgbXNnOworICBtc2cuc2V0X3NvbWVfZmllbGQoMCk7CisgIC8vICAgICAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gcHJvdG8gZmllbGRzLiBXZSBkbyBub3QgY2hlY2sgZm9yIGEKKyAgLy8gOyBzcGVjaWZpYyB0YXJnZXQgYXMgaXQgY2FuIGJlIGluIGdlbmVyYXRlZCBjb2RlLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gbmF2aWdhdGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IG5hdmlnYXRpb24uaXRlbXMKK30KKwordm9pZCBUZXN0UGFyYW1ldGVySW5mbygpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworICB2LnB1c2hfYmFjaygwKTsKKyAgLy8gICAgICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IHRoZSBzaWduYXR1cmUgaGVscCBmb3IgU1RMIGZ1bmN0aW9ucy4gV2UgZG8gbm90IGNoZWNrIGZvciBhIHNwZWNpZmljCisgIC8vIDsgdGV4dCBhcyBpdCBjYW4gYmUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zCisKKyAgRm9vKDAsIDAuMCk7CisgIC8vICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IHRoZSBzaWduYXR1cmUgaGVscCBmb3IgdGhlIGZ1bmN0aW9uICdGb28nIGhhdmluZyB0d28gb3ZlcmxvYWRzLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgLy8gIGFjdGl2ZT10cnVlLAorICAvLyAgbGFiZWw9IkZvb1xcKGludCB4LCBkb3VibGUgeVxcKSAtPiB2b2lkIiwKKyAgLy8gIHNlbGVjdGlvbj0iZG91YmxlIHkiLAorICAvLyApCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAvLyAgYWN0aXZlPWZhbHNlLAorICAvLyAgbGFiZWw9IkZvb1xcKGZsb2F0IHgsIGZsb2F0IHlcXCkgLT4gZmxvYXQiLAorICAvLyApCit9CisKK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc3MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIKQEAgLTAsMCArMSw1IEBACit0ZXN0czogeworICBuYW1lOiAiZ2VuZXJhbCIKKyAgc2NyaXB0czogImJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIgorICBzY3JpcHRzOiAiYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90byIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0IGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3Y2U2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CkBAIC0wLDAgKzEsMjM5IEBACisKKwNvdXQSlmEKKzhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxo4cHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYmluL2NsYW5nKysaBy1tdGh1bWIaAy1PcxoULWZvbWl0LWZyYW1lLXBvaW50ZXIaBi1tbGx2bRoZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZRoDLU8yGgUtV2FsbBoHLVdleHRyYRoLLVdpbml0LXNlbGYaDy1XcG9pbnRlci1hcml0aBoYLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5GhEtV2Vycm9yPWRhdGUtdGltZRoWLVdlcnJvcj1pbnQtY29udmVyc2lvbhoTLVdlcnJvcj1wcmFnbWEtcGFjaxomLVdlcnJvcj1wcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUaGC1XZXJyb3I9c2l6ZW9mLWFycmF5LWRpdhoXLVdlcnJvcj1zdHJpbmctcGx1cy1pbnQaJy1XZXJyb3I9dW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudBoiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucxoTLVduby1jOTktZGVzaWduYXRvchoZLVduby1nbnUtZm9sZGluZy1jb25zdGFudBoiLVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZRocLVduby1lcnJvcj1yZW9yZGVyLWluaXQtbGlzdBoWLVduby1yZW9yZGVyLWluaXQtbGlzdBoRLVduby1zaWduLWNvbXBhcmUaCy1Xbm8tdW51c2VkGgktREFORFJPSUQaCC1ETkRFQlVHGgctVURFQlVHGigtRF9fY29tcGlsZXJfb2Zmc2V0b2Y9X19idWlsdGluX29mZnNldG9mGiotRF9fQU5EUk9JRF9VTkFWQUlMQUJMRV9TWU1CT0xTX0FSRV9XRUFLX18aCS1mYWRkcnNpZxoZLWZkZWJ1Zy1kZWZhdWx0LXZlcnNpb249NRoTLWZjb2xvci1kaWFnbm9zdGljcxoRLWZmcC1jb250cmFjdD1vZmYaDy1mbm8tZXhjZXB0aW9ucxoULWZuby1zdHJpY3QtYWxpYXNpbmcaEi1mbWVzc2FnZS1sZW5ndGg9MBojLWZuby1yZWxheGVkLXRlbXBsYXRlLXRlbXBsYXRlLWFyZ3MaFy1nc2ltcGxlLXRlbXBsYXRlLW5hbWVzGggtZ3o9enN0ZBoWLW5vLWNhbm9uaWNhbC1wcmVmaXhlcxoRLVduby1lcnJvcj1mb3JtYXQaIi1mZGVidWctcHJlZml4LW1hcD0vcHJvYy9zZWxmL2N3ZD0aHC1mdHJpdmlhbC1hdXRvLXZhci1pbml0PXplcm8aAi1nGhMtZmZ1bmN0aW9uLXNlY3Rpb25zGg8tZmRhdGEtc2VjdGlvbnMaEC1mbm8tc2hvcnQtZW51bXMaDy1mdW53aW5kLXRhYmxlcxoYLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nGhEtV2EsLS1ub2V4ZWNzdGFjaxoTLURfRk9SVElGWV9TT1VSQ0U9MhoTLVdzdHJpY3QtYWxpYXNpbmc9MhoTLVdlcnJvcj1yZXR1cm4tdHlwZRoYLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yGg8tV2Vycm9yPWFkZHJlc3MaFi1XZXJyb3I9c2VxdWVuY2UtcG9pbnQaFy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5Ggwtbm9zdGRsaWJpbmMaGi1mZGVidWctaW5mby1mb3ItcHJvZmlsaW5nGgwtbXNvZnQtZmxvYXQaDi1tYXJjaD1hcm12Ny1hGhItbWZsb2F0LWFiaT1zb2Z0ZnAaCistbWZwdT1uZW9uGi8tSWJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcBqzAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGoUBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90bxoULURfX0xJQkNfQVBJX189MTAwMDAaFC1EX19MSUJNX0FQSV9fPTEwMDAwGhUtRF9fTElCRExfQVBJX189MTAwMDAaFy1JZXh0ZXJuYWwvcHJvdG9idWYvc3JjGlktSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2FuZHJvaWRfbGliYysrL3BsYXRmb3JtL2FybS9pbmNsdWRlL2MrKy92MRo9LUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9pbmNsdWRlL2MrKy92MRogLUliaW9uaWMvbGliYy9hc3luY19zYWZlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaJy1JYmlvbmljL2xpYmMvc3lzdGVtX3Byb3BlcnRpZXMvaW5jbHVkZRo8LUlzeXN0ZW0vY29yZS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlGggtaXN5c3RlbRoTYmlvbmljL2xpYmMvaW5jbHVkZRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm0aCC1pc3lzdGVtGhdiaW9uaWMvbGliYy9rZXJuZWwvdWFwaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3Njc2kaCC1pc3lzdGVtGh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC91YXBpGgctdGFyZ2V0Gh1hcm12N2EtbGludXgtYW5kcm9pZGVhYmkxMDAwMBoQLURBTkRST0lEX1NUUklDVBoFLWZQSUUaBy1XZXJyb3IaFS1Xbm8tdW51c2VkLXBhcmFtZXRlchoZLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSRoWLVdpbXBsaWNpdC1mYWxsdGhyb3VnaBoqLURfTElCQ1BQX0VOQUJMRV9USFJFQURfU0FGRVRZX0FOTk9UQVRJT05TGhUtV25vLWdudS1pbmNsdWRlLW5leHQaGy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbhoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgwtc3RkPWdudSsrMjAaCS1mbm8tcnR0aRoVLUlzeXN0ZW0vY29yZS9pbmNsdWRlGh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlGhwtSXN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlGh4tSWhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUaJS1JaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUaFi1JaGFyZHdhcmUvcmlsL2luY2x1ZGUaGy1JZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZRoiLUlmcmFtZXdvcmtzL25hdGl2ZS9vcGVuZ2wvaW5jbHVkZRoXLUlmcmFtZXdvcmtzL2F2L2luY2x1ZGUaFi1XZXJyb3I9Ym9vbC1vcGVyYXRpb24aIC1XZXJyb3I9Zm9ybWF0LWluc3VmZmljaWVudC1hcmdzGiUtV2Vycm9yPWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uGhstV2Vycm9yPWludC1pbi1ib29sLWNvbnRleHQaGy1XZXJyb3I9aW50LXRvLXBvaW50ZXItY2FzdBobLVdlcnJvcj1wb2ludGVyLXRvLWludC1jYXN0GhctV2Vycm9yPXhvci11c2VkLWFzLXBvdxoeLVduby12b2lkLXBvaW50ZXItdG8tZW51bS1jYXN0Gh0tV25vLXZvaWQtcG9pbnRlci10by1pbnQtY2FzdBoYLVduby1wb2ludGVyLXRvLWludC1jYXN0GhYtV2Vycm9yPWZvcnRpZnktc291cmNlGhQtV25vLXVudXNlZC12YXJpYWJsZRofLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycxoTLVduby1wYWNrZWQtbm9uLXBvZBocLVdlcnJvcj1hZGRyZXNzLW9mLXRlbXBvcmFyeRorLVdlcnJvcj1pbmNvbXBhdGlibGUtZnVuY3Rpb24tcG9pbnRlci10eXBlcxoYLVdlcnJvcj1udWxsLWRlcmVmZXJlbmNlGhMtV2Vycm9yPXJldHVybi10eXBlGiItV25vLXRhdXRvbG9naWNhbC1jb25zdGFudC1jb21wYXJlGiQtV25vLXRhdXRvbG9naWNhbC10eXBlLWxpbWl0LWNvbXBhcmUaIi1Xbm8taW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aIS1Xbm8tdGF1dG9sb2dpY2FsLW92ZXJsYXAtY29tcGFyZRoULVduby1kZXByZWNhdGVkLWNvcHkaGS1Xbm8tcmFuZ2UtbG9vcC1jb25zdHJ1Y3QaIi1Xbm8temVyby1hcy1udWxsLXBvaW50ZXItY29uc3RhbnQaKS1Xbm8tZGVwcmVjYXRlZC1hbm9uLWVudW0tZW51bS1jb252ZXJzaW9uGiQtV25vLWRlcHJlY2F0ZWQtZW51bS1lbnVtLWNvbnZlcnNpb24aFS1Xbm8tcGVzc2ltaXppbmctbW92ZRoeLVduby1ub24tYy10eXBlZGVmLWZvci1saW5rYWdlGhMtV25vLWFsaWduLW1pc21hdGNoGiItV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXZhcmlhYmxlGiMtV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXBhcmFtZXRlchoeLVduby1lcnJvcj1kZXByZWNhdGVkLWJ1aWx0aW5zGhUtV25vLWVycm9yPWRlcHJlY2F0ZWQaMi1Xbm8tZXJyb3I9c2luZ2xlLWJpdC1iaXRmaWVsZC1jb25zdGFudC1jb252ZXJzaW9uGiQtV25vLWVycm9yPWVudW0tY29uc3RleHByLWNvbnZlcnNpb24aGy1Xbm8tZXJyb3I9aW52YWxpZC1vZmZzZXRvZhomLVduby1kZXByZWNhdGVkLWR5bmFtaWMtZXhjZXB0aW9uLXNwZWMaOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjItU/Ciu2AXNvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wYi5oEpk+Ly8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDEyIDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEFueU1ldGFkYXRhOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy4KK3N0cnVjdCBUYWJsZVN0cnVjdF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IDo6dWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKK2NsYXNzIFByb3RvTXNnOworc3RydWN0IFByb3RvTXNnRGVmYXVsdFR5cGVJbnRlcm5hbDsKK2V4dGVybiBQcm90b01zZ0RlZmF1bHRUeXBlSW50ZXJuYWwgX1Byb3RvTXNnX2RlZmF1bHRfaW5zdGFuY2VfOworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiA6OmlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6aWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2c+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQcm90b01zZyBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjppZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2cpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBQcm90b01zZygpIDogUHJvdG9Nc2cobnVsbHB0cikge30KKyAgflByb3RvTXNnKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBQcm90b01zZyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFByb3RvTXNnKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUHJvdG9Nc2coUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogUHJvdG9Nc2coKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBQcm90b01zZyYgb3BlcmF0b3I9KGNvbnN0IFByb3RvTXNnJiBmcm9tKSB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFByb3RvTXNnJiBvcGVyYXRvcj0oUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFByb3RvTXNnJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgUHJvdG9Nc2cqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvdG9Nc2cqPigKKyAgICAgICAgICAgICAgICZfUHJvdG9Nc2dfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoUHJvdG9Nc2cmIGEsIFByb3RvTXNnJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFByb3RvTXNnKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChQcm90b01zZyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUHJvdG9Nc2cqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxQcm90b01zZz4oYXJlbmEpOworICB9CisgIFByb3RvTXNnKiBOZXcoKSBjb25zdCB7CisgICAgcmV0dXJuIE5ldyhudWxscHRyKTsKKyAgfQorICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUmIGZyb20pICBmaW5hbDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBQcm90b01zZyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIDo6dWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgOjp1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoUHJvdG9Nc2cqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJpZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2ciOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUHJvdG9Nc2coOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1NvbWVGaWVsZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gaW50NjQgc29tZV9maWVsZCA9IDE7CisgIHZvaWQgY2xlYXJfc29tZV9maWVsZCgpOworICA6OmludDY0X3Qgc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIHNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6aW50NjRfdCBfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjppbnQ2NF90IHNvbWVfZmllbGRfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBQcm90b01zZworCisvLyBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKK2lubGluZSB2b2lkIFByb3RvTXNnOjpjbGVhcl9zb21lX2ZpZWxkKCkgeworICBfaW1wbF8uc29tZV9maWVsZF8gPSA6OmludDY0X3R7MH07Cit9CitpbmxpbmUgOjppbnQ2NF90IFByb3RvTXNnOjpfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zb21lX2ZpZWxkXzsKK30KK2lubGluZSA6OmludDY0X3QgUHJvdG9Nc2c6OnNvbWVfZmllbGQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnLnNvbWVfZmllbGQpCisgIHJldHVybiBfaW50ZXJuYWxfc29tZV9maWVsZCgpOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6Ol9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zb21lX2ZpZWxkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6OnNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3NvbWVfZmllbGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZy5zb21lX2ZpZWxkKQorfQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9HT09HTEVfUFJPVE9CVUZfSU5DTFVERURfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9Gb28uamF2YSBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0M2Y3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBqdm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCisvKiogRm9vIGNsYXNzLiAqLworcHVibGljIGZpbmFsIGNsYXNzIEZvbyB7CisKKyAgdm9pZCB0ZXN0Q29tcGxldGlvbigpIHsKKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaXN0KTsKKworICAgIC8vIF4KKworICAgIC8vIHN0ZXAKKyAgICAvLyA7IFRlc3QgY29tcGxldGlvbiBvbiB0aGUgc3RhbmRhcmQgdHlwZXMuCisgICAgLy8gdHlwZSgibGlzdC4iKQorICAgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgICAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJhZGQuKiIpCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vc3VpdGUudGV4dHBiIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9zdWl0ZS50ZXh0cGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwZTA4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vc3VpdGUudGV4dHBiCkBAIC0wLDAgKzEsNCBAQAordGVzdHM6IHsKKyAgbmFtZTogImdlbmVyYWwiCisgIHNjcmlwdHM6ICJidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmEiCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2ggYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmVkZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9yZWdlbi5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaCAtZQorCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGlkZV9xdWVyeS5vdXQgZmlsZS4KKyMKKyMgVGhlIGlkZV9xdWVyeS5vdXQgZmlsZSBpcyBhIHByZS1jb21wdXRlZCByZXN1bHQgb2YgcnVubmluZyBpZGVfcXVlcnkuc2gKKyMgb24gYSBzZXQgb2YgZmlsZXMuIFRoaXMgYWxsb3dzIHRoZSBwcm9iZXIgdG8gcnVuIGl0cyB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcKKyMgaWRlX3F1ZXJ5LnNoLiBUaGUgcHJvYmVyIGRvZXNuJ3QgY2hlY2stb3V0IHRoZSBmdWxsIHNvdXJjZSBjb2RlLCBzbyBpdAorIyBjYW4ndCBydW4gaWRlX3F1ZXJ5LnNoIGl0c2VsZi4KKworY2QgJChkaXJuYW1lICRCQVNIX1NPVVJDRSkKK3NvdXJjZSAkKHB3ZCkvLi4vLi4vLi4vc2hlbGxfdXRpbHMuc2gKK3JlcXVpcmVfdG9wCisKK2ZpbGVzX3RvX2J1aWxkPSgKKyAgYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKKykKKworY2QgJHtUT1B9CitidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2ggLS1sdW5jaF90YXJnZXQ9YW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmcgJHtmaWxlc190b19idWlsZFtAXX0gPiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icCBiL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCmluZGV4IDliMTM0ZjIuLmNmN2UyYWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCkBAIC05Niw2ICs5Niw3IEBACiAgICAgXSwKICAgICBsaWJzOiBbCiAgICAgICAgICJhcGV4X21hbmlmZXN0IiwKKyAgICAgICAgInJlbGVhc2V0b29sc19hcGV4X3V0aWxzIiwKICAgICAgICAgInJlbGVhc2V0b29sc19jb21tb24iLAogICAgIF0sCiAgICAgcmVxdWlyZWQ6IFsKQEAgLTEwNyw3ICsxMDgsNyBAQAogcHl0aG9uX2xpYnJhcnlfaG9zdCB7CiAgICAgbmFtZTogIm90YV9tZXRhZGF0YV9wcm90byIsCiAgICAgc3JjczogWwotICAgICAgICJvdGFfbWV0YWRhdGEucHJvdG8iLAorICAgICAgICAib3RhX21ldGFkYXRhLnByb3RvIiwKICAgICBdLAogICAgIHByb3RvOiB7CiAgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCkBAIC0xMTcsNyArMTE4LDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAib3RhX21ldGFkYXRhX3Byb3RvX2NjIiwKICAgICBzcmNzOiBbCi0gICAgICAgIm90YV9tZXRhZGF0YS5wcm90byIsCisgICAgICAgICJvdGFfbWV0YWRhdGEucHJvdG8iLAogICAgIF0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLApAQCAtMTQ0LDcgKzE0NSw3IEBACiAgICAgICAgICAgICBzdGF0aWNfbGliczogWyJsaWJwcm90b2J1Zi1qYXZhLW5hbm8iXSwKICAgICAgICAgfSwKICAgICB9LAotICAgIHZpc2liaWxpdHk6IFsiLy9mcmFtZXdvcmtzL2Jhc2U6X19zdWJwYWNrYWdlc19fIl0KKyAgICB2aXNpYmlsaXR5OiBbIi8vZnJhbWV3b3Jrcy9iYXNlOl9fc3VicGFja2FnZXNfXyJdLAogfQogCiBweXRob25fZGVmYXVsdHMgewpAQCAtNDM2LDcgKzQzNyw3IEBACiAgICAgbmFtZTogImNoZWNrX3RhcmdldF9maWxlc192aW50ZiIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgInJlbGVhc2V0b29sc19iaW5hcnlfZGVmYXVsdHMiLAotICAgICAgICAicmVsZWFzZXRvb2xzX2NoZWNrX3RhcmdldF9maWxlc192aW50Zl9kZWZhdWx0cyIKKyAgICAgICAgInJlbGVhc2V0b29sc19jaGVja190YXJnZXRfZmlsZXNfdmludGZfZGVmYXVsdHMiLAogICAgIF0sCiB9CiAKQEAgLTU0NiwxMyArNTQ3LDE0IEBACiAgICAgZGVmYXVsdHM6IFsicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKICAgICAgICAgInNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkiLAotICAgICAgICAicGF5bG9hZF9zaWduZXIucHkiLAotICAgICAgICAib3RhX3NpZ25pbmdfdXRpbHMucHkiLAorICAgICAgICAib3RhX2Zyb21fcmF3X2ltZy5weSIsCiAgICAgXSwKICAgICBsaWJzOiBbCiAgICAgICAgICJyZWxlYXNldG9vbHNfYWRkX2ltZ190b190YXJnZXRfZmlsZXMiLAogICAgICAgICAicmVsZWFzZXRvb2xzX2FwZXhfdXRpbHMiLAogICAgICAgICAicmVsZWFzZXRvb2xzX2NvbW1vbiIsCisgICAgICAgICJvdGFfbWV0YWRhdGFfcHJvdG8iLAorICAgICAgICAib3RhX3V0aWxzX2xpYiIsCiAgICAgXSwKIH0KIApAQCAtNjMyLDcgKzYzNCw3IEBACiAgICAgZGF0YTogWwogICAgICAgICAidGVzdGRhdGEvKiovKiIsCiAgICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC5jb21wcmVzc2VkLnYxIiwKLSAgICAgICAgIjpjb20uYW5kcm9pZC5hcGV4LnZlbmRvci5mb28ud2l0aF92aW50ZiIKKyAgICAgICAgIjpjb20uYW5kcm9pZC5hcGV4LnZlbmRvci5mb28ud2l0aF92aW50ZiIsCiAgICAgXSwKICAgICB0YXJnZXQ6IHsKICAgICAgICAgZGFyd2luOiB7CmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYXBleF91dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5CmluZGV4IDNhYmVmM2IuLjU0ZGY5NTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5CkBAIC0zNiw2ICszNiw4IEBACiAKIEFQRVhfUFVCS0VZID0gJ2FwZXhfcHVia2V5JwogCisjIFBhcnRpdGlvbnMgc3VwcG9ydGluZyBBUEVYZXMKK1BBUlRJVElPTlMgPSBbJ3N5c3RlbScsICdzeXN0ZW1fZXh0JywgJ3Byb2R1Y3QnLCAndmVuZG9yJywgJ29kbSddCiAKIGNsYXNzIEFwZXhJbmZvRXJyb3IoRXhjZXB0aW9uKToKICAgIiIiQW4gRXhjZXB0aW9uIHJhaXNlZCBkdXJpbmcgQXBleCBJbmZvcm1hdGlvbiBjb21tYW5kLiIiIgpAQCAtNTUwLDcgKzU1Miw3IEBACiAgIGlmIG5vdCBpc2luc3RhbmNlKGlucHV0X2ZpbGUsIHN0cik6CiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJtdXN0IHBhc3MgZmlsZXBhdGggdG8gdGFyZ2V0LWZpbGVzIHppcCBvciBkaXJlY3RvcnkiKQogICBhcGV4X2luZm9zID0gW10KLSAgZm9yIHBhcnRpdGlvbiBpbiBbJ3N5c3RlbScsICdzeXN0ZW1fZXh0JywgJ3Byb2R1Y3QnLCAndmVuZG9yJ106CisgIGZvciBwYXJ0aXRpb24gaW4gUEFSVElUSU9OUzoKICAgICBhcGV4X2luZm9zLmV4dGVuZChHZXRBcGV4SW5mb0ZvclBhcnRpdGlvbihpbnB1dF9maWxlLCBwYXJ0aXRpb24pKQogICByZXR1cm4gYXBleF9pbmZvcwogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weQppbmRleCBiOGRjZDg0Li5kYzEyM2VmIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfdmludGYucHkKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBzeXMKIGltcG9ydCB6aXBmaWxlCiAKK2ltcG9ydCBhcGV4X3V0aWxzCiBpbXBvcnQgY29tbW9uCiBmcm9tIGFwZXhfbWFuaWZlc3QgaW1wb3J0IFBhcnNlQXBleE1hbmlmZXN0CiAKQEAgLTIyOSw3ICsyMzAsNyBAQAogICBhcGV4X2hvc3QgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5zZWFyY2hfcGF0aCwgJ2JpbicsICdhcGV4ZF9ob3N0JykKICAgY21kID0gW2FwZXhfaG9zdCwgJy0tdG9vbF9wYXRoJywgT1BUSU9OUy5zZWFyY2hfcGF0aF0KICAgY21kICs9IFsnLS1hcGV4X3BhdGgnLCBkaXJtYXBbJy9hcGV4J11dCi0gIGZvciBwIGluIFsnc3lzdGVtJywgJ3N5c3RlbV9leHQnLCAncHJvZHVjdCcsICd2ZW5kb3InXToKKyAgZm9yIHAgaW4gYXBleF91dGlscy5QQVJUSVRJT05TOgogICAgIGlmICcvJyArIHAgaW4gZGlybWFwOgogICAgICAgY21kICs9IFsnLS0nICsgcCArICdfcGF0aCcsIGRpcm1hcFsnLycgKyBwXV0KICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkgYi90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CmluZGV4IGQ5MWE3MTMuLmVkZDQzNjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQpAQCAtODk4LDcgKzg5OCw3IEBACiAgICAgICBpZiBrZXkuZW5kc3dpdGgoInNlbGludXhfZmMiKToKICAgICAgICAgZmNfYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGRba2V5XSkKICAgICAgICAgZmNfY29uZmlnID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICJNRVRBIiwgZmNfYmFzZW5hbWUpCi0gICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhmY19jb25maWcpCisgICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhmY19jb25maWcpLCAie30gZG9lcyBub3QgZXhpc3QiLmZvcm1hdChmY19jb25maWcpCiAKICAgICAgICAgZFtrZXldID0gZmNfY29uZmlnCiAKQEAgLTkwNyw5ICs5MDcsMTAgQEAKICAgICBkWyJyb290X2ZzX2NvbmZpZyJdID0gb3MucGF0aC5qb2luKAogICAgICAgICBpbnB1dF9maWxlLCAiTUVUQSIsICJyb290X2ZpbGVzeXN0ZW1fY29uZmlnLnR4dCIpCiAKKyAgICBwYXJ0aXRpb25zID0gWyJzeXN0ZW0iLCAidmVuZG9yIiwgInN5c3RlbV9leHQiLCAicHJvZHVjdCIsICJvZG0iLAorICAgICAgICAgICAgICAgICAgInZlbmRvcl9kbGttIiwgIm9kbV9kbGttIiwgInN5c3RlbV9kbGttIl0KICAgICAjIFJlZGlyZWN0IHtwYXJ0aXRpb259X2Jhc2VfZnNfZmlsZSBmb3IgZWFjaCBvZiB0aGUgbmFtZWQgcGFydGl0aW9ucy4KLSAgICBmb3IgcGFydF9uYW1lIGluIFsic3lzdGVtIiwgInZlbmRvciIsICJzeXN0ZW1fZXh0IiwgInByb2R1Y3QiLCAib2RtIiwKLSAgICAgICAgICAgICAgICAgICAgICAidmVuZG9yX2Rsa20iLCAib2RtX2Rsa20iLCAic3lzdGVtX2Rsa20iXToKKyAgICBmb3IgcGFydF9uYW1lIGluIHBhcnRpdGlvbnM6CiAgICAgICBrZXlfbmFtZSA9IHBhcnRfbmFtZSArICJfYmFzZV9mc19maWxlIgogICAgICAgaWYga2V5X25hbWUgbm90IGluIGQ6CiAgICAgICAgIGNvbnRpbnVlCkBAIC05MjIsNiArOTIzLDI1IEBACiAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgJXMgYmFzZSBmcyBmaWxlOiAlcyIsIHBhcnRfbmFtZSwgYmFzZV9mc19maWxlKQogICAgICAgICBkZWwgZFtrZXlfbmFtZV0KIAorICAgICMgUmVkaXJlY3RpbmcgaGVscGVyIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIGxpa2UgZXJvZnNfY29tcHJlc3NfaGludHMKKyAgICBkZWYgcmVkaXJlY3RfZmlsZShwcm9wLCBmaWxlbmFtZSk6CisgICAgICBpZiBwcm9wIG5vdCBpbiBkOgorICAgICAgICByZXR1cm4KKyAgICAgIGNvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICJNRVRBLyIgKyBmaWxlbmFtZSkKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmZpZ19maWxlKToKKyAgICAgICAgZFtwcm9wXSA9IGNvbmZpZ19maWxlCisgICAgICBlbHNlOgorICAgICAgICBsb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICJGYWlsZWQgdG8gZmluZCAlcyBmcm8gJXMiLCBmaWxlbmFtZSwgcHJvcCkKKyAgICAgICAgZGVsIGRbcHJvcF0KKworICAgICMgUmVkaXJlY3QgZXJvZnNfW2RlZmF1bHRfXWNvbXByZXNzX2hpbnRzIGZpbGVzCisgICAgcmVkaXJlY3RfZmlsZSgiZXJvZnNfZGVmYXVsdF9jb21wcmVzc19oaW50cyIsCisgICAgICAgICAgICAgICAgICAiZXJvZnNfZGVmYXVsdF9jb21wcmVzc19oaW50cy50eHQiKQorICAgIGZvciBwYXJ0IGluIHBhcnRpdGlvbnM6CisgICAgICByZWRpcmVjdF9maWxlKHBhcnQgKyAiX2Vyb2ZzX2NvbXByZXNzX2hpbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgcGFydCArICJfZXJvZnNfY29tcHJlc3NfaGludHMudHh0IikKKwogICBkZWYgbWFrZWludChrZXkpOgogICAgIGlmIGtleSBpbiBkOgogICAgICAgZFtrZXldID0gaW50KGRba2V5XSwgMCkKQEAgLTE3ODQsMTIgKzE4MDQsNyBAQAogICBpZiBoYXNfcmFtZGlzazoKICAgICBjbWQuZXh0ZW5kKFsiLS1yYW1kaXNrIiwgcmFtZGlza19pbWcubmFtZV0pCiAKLSAgaW1nX3Vuc2lnbmVkID0gTm9uZQotICBpZiBpbmZvX2RpY3QuZ2V0KCJ2Ym9vdCIpOgotICAgIGltZ191bnNpZ25lZCA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgY21kLmV4dGVuZChbIi0tb3V0cHV0IiwgaW1nX3Vuc2lnbmVkLm5hbWVdKQotICBlbHNlOgotICAgIGNtZC5leHRlbmQoWyItLW91dHB1dCIsIGltZy5uYW1lXSkKKyAgY21kLmV4dGVuZChbIi0tb3V0cHV0IiwgaW1nLm5hbWVdKQogCiAgIGlmIHBhcnRpdGlvbl9uYW1lID09ICJyZWNvdmVyeSI6CiAgICAgaWYgaW5mb19kaWN0LmdldCgiaW5jbHVkZV9yZWNvdmVyeV9kdGJvIikgPT0gInRydWUiOgpAQCAtMTgwMSwyOCArMTgxNiw2IEBACiAKICAgUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQogCi0gICMgU2lnbiB0aGUgaW1hZ2UgaWYgdmJvb3QgaXMgbm9uLWVtcHR5LgotICBpZiBpbmZvX2RpY3QuZ2V0KCJ2Ym9vdCIpOgotICAgIHBhdGggPSAiLyIgKyBwYXJ0aXRpb25fbmFtZQotICAgIGltZ19rZXlibG9jayA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgIyBXZSBoYXZlIHN3aXRjaGVkIGZyb20gdGhlIHByZWJ1aWx0IGZ1dGlsaXR5IGJpbmFyeSB0byB1c2luZyB0aGUgdG9vbAotICAgICMgKGZ1dGlsaXR5LWhvc3QpIGJ1aWx0IGZyb20gdGhlIHNvdXJjZS4gT3ZlcnJpZGUgdGhlIHNldHRpbmcgaW4gdGhlIG9sZAotICAgICMgVEYuemlwLgotICAgIGZ1dGlsaXR5ID0gaW5mb19kaWN0WyJmdXRpbGl0eSJdCi0gICAgaWYgZnV0aWxpdHkuc3RhcnRzd2l0aCgicHJlYnVpbHRzLyIpOgotICAgICAgZnV0aWxpdHkgPSAiZnV0aWxpdHktaG9zdCIKLSAgICBjbWQgPSBbaW5mb19kaWN0WyJ2Ym9vdF9zaWduZXJfY21kIl0sIGZ1dGlsaXR5LAotICAgICAgICAgICBpbWdfdW5zaWduZWQubmFtZSwgaW5mb19kaWN0WyJ2Ym9vdF9rZXkiXSArICIudmJwdWJrIiwKLSAgICAgICAgICAgaW5mb19kaWN0WyJ2Ym9vdF9rZXkiXSArICIudmJwcml2ayIsCi0gICAgICAgICAgIGluZm9fZGljdFsidmJvb3Rfc3Via2V5Il0gKyAiLnZicHJpdmsiLAotICAgICAgICAgICBpbWdfa2V5YmxvY2submFtZSwKLSAgICAgICAgICAgaW1nLm5hbWVdCi0gICAgUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQotCi0gICAgIyBDbGVhbiB1cCB0aGUgdGVtcCBmaWxlcy4KLSAgICBpbWdfdW5zaWduZWQuY2xvc2UoKQotICAgIGltZ19rZXlibG9jay5jbG9zZSgpCi0KICAgIyBBVkI6IGlmIGVuYWJsZWQsIGNhbGN1bGF0ZSBhbmQgYWRkIGhhc2ggdG8gYm9vdC5pbWcgb3IgcmVjb3ZlcnkuaW1nLgogICBpZiBpbmZvX2RpY3QuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgogICAgIGF2YnRvb2wgPSBpbmZvX2RpY3RbImF2Yl9hdmJ0b29sIl0KQEAgLTI0NjEsMTIgKzI0NTQsMjMgQEAKICAgICAgICAgIkZhaWxlZCB0byBvYnRhaW4gbWluU2RrVmVyc2lvbiBmb3Ige306IGFhcHQyIHJldHVybiBjb2RlIHt9Olxue31cbnt9Ii5mb3JtYXQoCiAgICAgICAgICAgICBhcGtfbmFtZSwgcHJvYy5yZXR1cm5jb2RlLCBzdGRvdXRkYXRhLCBzdGRlcnJkYXRhKSkKIAorICBpc19zcGxpdF9hcGsgPSBGYWxzZQogICBmb3IgbGluZSBpbiBzdGRvdXRkYXRhLnNwbGl0KCJcbiIpOgorICAgICMgU2VlIGIvMzUzODM3MzQ3ICwgc3BsaXQgQVBLcyBkbyBub3QgaGF2ZSBzZGsgdmVyc2lvbiBkZWZpbmVkLAorICAgICMgc28gd2UgZGVmYXVsdCB0byAyMSBhcyBzcGxpdCBBUEtzIGFyZSBvbmx5IHN1cHBvcnRlZCBzaW5jZSBTREsKKyAgICAjIDIxLgorICAgIGlmIChyZS5zZWFyY2gociJzcGxpdD1bXCInXS4qW1wiJ10iLCBsaW5lKSk6CisgICAgICBpc19zcGxpdF9hcGsgPSBUcnVlCiAgICAgIyBEdWUgdG8gYWcvMjQxNjE3MDgsIGxvb2tpbmcgZm9yIGxpbmVzIHN1Y2ggYXMgbWluU2RrVmVyc2lvbjonMjMnLG1pblNka1ZlcnNpb246J00nCiAgICAgIyBvciBzZGtWZXJzaW9uOicyMycsIHNka1ZlcnNpb246J00nLgogICAgIG0gPSByZS5tYXRjaChyJyg/Om1pblNka1ZlcnNpb258c2RrVmVyc2lvbik6XCcoW15cJ10qKVwnJywgbGluZSkKICAgICBpZiBtOgogICAgICAgcmV0dXJuIG0uZ3JvdXAoMSkKKyAgaWYgaXNfc3BsaXRfYXBrOgorICAgIGxvZ2dlci5pbmZvKCIlcyBpcyBhIHNwbGl0IEFQSywgaXQgZG9lcyBub3QgaGF2ZSBtaW5pbXVtIFNESyB2ZXJzaW9uIgorICAgICAgICAgICAgICAgICIgZGVmaW5lZC4gRGVmYXVsdGluZyB0byAyMSBiZWNhdXNlIHNwbGl0IEFQSyBpc24ndCBzdXBwb3J0ZWQiCisgICAgICAgICAgICAgICAgIiBiZWZvcmUgdGhhdC4iLCBhcGtfbmFtZSkKKyAgICByZXR1cm4gMjEKICAgcmFpc2UgRXh0ZXJuYWxFcnJvcigiTm8gbWluU2RrVmVyc2lvbiByZXR1cm5lZCBieSBhYXB0MiBmb3IgYXBrOiB7fSIuZm9ybWF0KGFwa19uYW1lKSkKIAogCkBAIC0yODE1LDYgKzI4MTksNyBAQAogICAgICAgICAgICAgYnJlYWsKICAgICAgICAgZWxpZiBoYW5kbGVyKG8sIGEpOgogICAgICAgICAgIHN1Y2Nlc3MgPSBUcnVlCisgICAgICAgICAgYnJlYWsKICAgICAgIGlmIG5vdCBzdWNjZXNzOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIG9wdGlvbiBcIiVzXCIiICUgKG8sKSkKIApAQCAtMzAwMyw3ICszMDA4LDcgQEAKICAgICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gc2F2ZWRfemlwNjRfbGltaXQKIAogCi1kZWYgWmlwV3JpdGVTdHIoemlwX2ZpbGUsIHppbmZvX29yX2FyY25hbWUsIGRhdGEsIHBlcm1zPU5vbmUsCitkZWYgWmlwV3JpdGVTdHIoemlwX2ZpbGU6IHppcGZpbGUuWmlwRmlsZSwgemluZm9fb3JfYXJjbmFtZSwgZGF0YSwgcGVybXM9Tm9uZSwKICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPU5vbmUpOgogICAiIiJXcmFwIHppcGZpbGUud3JpdGVzdHIoKSBmdW5jdGlvbiB0byB3b3JrIGFyb3VuZCB0aGUgemlwNjQgbGltaXQuCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV9yYXdfaW1nLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKaW5kZXggYzE4Njk0MC4uMDNiNDRmMSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgIHByb2c9YXJndlswXSwgZGVzY3JpcHRpb249IkdpdmVuIGEgc2VyaWVzIG9mIC5pbWcgZmlsZXMsIHByb2R1Y2VzIGEgZnVsbCBPVEEgcGFja2FnZSB0aGF0IGluc3RhbGxzIHRob2VzZSBpbWFnZXMiKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJpbWFnZXMiLCBuYXJncz0iKyIsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3Qgb2YgaW1hZ2VzIHRvIGdlbmVyYXRlIE9UQSIpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcGFydGl0aW9uX25hbWVzIiwgbmFyZ3M9JysnLCB0eXBlPXN0ciwKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wYXJ0aXRpb25fbmFtZXMiLCBuYXJncz0nPycsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhcnRpdGlvbiBuYW1lcyB0byBpbnN0YWxsIHRoZSBpbWFnZXMsIGRlZmF1bHQgdG8gYmFzZW5hbWUgb2YgdGhlIGltYWdlKG5vIGZpbGUgbmFtZSBleHRlbnNpb24pIikKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLCB0eXBlPXN0ciwKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRocyB0byBvdXRwdXQgbWVyZ2VkIG90YScsIHJlcXVpcmVkPVRydWUpCkBAIC03NCwxOCArNzQsMjAgQEAKICAgICAgIG9sZF9pbWdzW2ldLCBhcmdzLmltYWdlc1tpXSA9IGltZy5zcGxpdCgiOiIsIG1heHNwbGl0PTEpCiAKICAgaWYgbm90IGFyZ3MucGFydGl0aW9uX25hbWVzOgotICAgIGFyZ3MucGFydGl0aW9uX25hbWVzID0gW29zLnBhdGgub3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHBhdGgpKVsKKyAgICBhcmdzLnBhcnRpdGlvbl9uYW1lcyA9IFtvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUocGF0aCkpWwogICAgICAgICAwXSBmb3IgcGF0aCBpbiBhcmdzLmltYWdlc10KKyAgZWxzZToKKyAgICBhcmdzLnBhcnRpdGlvbl9uYW1lcyA9IGFyZ3MucGFydGl0aW9uX25hbWVzLnNwbGl0KCIsIikKICAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKSBhcyB1bnNpZ25lZF9wYXlsb2FkLCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKSBhcyBkeW5hbWljX3BhcnRpdGlvbl9pbmZvX2ZpbGU6CiAgICAgZHluYW1pY19wYXJ0aXRpb25faW5mb19maWxlLndyaXRlbGluZXMoCiAgICAgICAgIFtiInZpcnR1YWxfYWI9dHJ1ZVxuIiwgYiJzdXBlcl9wYXJ0aXRpb25fZ3JvdXBzPVxuIl0pCiAgICAgZHluYW1pY19wYXJ0aXRpb25faW5mb19maWxlLmZsdXNoKCkKICAgICBjbWQgPSBbUmVzb2x2ZUJpbmFyeVBhdGgoImRlbHRhX2dlbmVyYXRvciIsIGFyZ3Muc2VhcmNoX3BhdGgpXQotICAgIGNtZC5hcHBlbmQoIi0tcGFydGl0aW9uX25hbWVzPSIgKyAiLCIuam9pbihhcmdzLnBhcnRpdGlvbl9uYW1lcykpCisgICAgY21kLmFwcGVuZCgiLS1wYXJ0aXRpb25fbmFtZXM9IiArICI6Ii5qb2luKGFyZ3MucGFydGl0aW9uX25hbWVzKSkKICAgICBjbWQuYXBwZW5kKCItLWR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZT0iICsKICAgICAgICAgICAgICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZS5uYW1lKQotICAgIGNtZC5hcHBlbmQoIi0tb2xkX3BhcnRpdGlvbnM9IiArICIsIi5qb2luKG9sZF9pbWdzKSkKLSAgICBjbWQuYXBwZW5kKCItLW5ld19wYXJ0aXRpb25zPSIgKyAiLCIuam9pbihhcmdzLmltYWdlcykpCisgICAgY21kLmFwcGVuZCgiLS1vbGRfcGFydGl0aW9ucz0iICsgIjoiLmpvaW4ob2xkX2ltZ3MpKQorICAgIGNtZC5hcHBlbmQoIi0tbmV3X3BhcnRpdGlvbnM9IiArICI6Ii5qb2luKGFyZ3MuaW1hZ2VzKSkKICAgICBjbWQuYXBwZW5kKCItLW91dF9maWxlPSIgKyB1bnNpZ25lZF9wYXlsb2FkLm5hbWUpCiAgICAgY21kLmFwcGVuZCgiLS1pc19wYXJ0aWFsX3VwZGF0ZSIpCiAgICAgaWYgYXJncy5tYXhfdGltZXN0YW1wOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQppbmRleCBiOGY4NDhmLi5iNDg1NDQwIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQpAQCAtMTg5LDYgKzE4OSw4IEBACiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKIAogaW1wb3J0IGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzCitpbXBvcnQgb3RhX2Zyb21fcmF3X2ltZworaW1wb3J0IG90YV91dGlscwogaW1wb3J0IGFwZXhfdXRpbHMKIGltcG9ydCBjb21tb24KIGltcG9ydCBwYXlsb2FkX3NpZ25lcgpAQCAtNTc5LDcgKzU4MSw2MSBAQAogICAgICAgICBmaWxlbmFtZS5lbmRzd2l0aCgiL3Byb3AuZGVmYXVsdCIpCiAKIAotZGVmIFByb2Nlc3NUYXJnZXRGaWxlcyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvLAorZGVmIFJlZ2VuZXJhdGVLZXJuZWxQYXJ0aXRpb25zKGlucHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBvdXRwdXRfdGZfemlwOiB6aXBmaWxlLlppcEZpbGUsIG1pc2NfaW5mbyk6CisgICIiIlJlLWdlbmVyYXRlIGJvb3QgYW5kIGR0Ym8gcGFydGl0aW9ucyB1c2luZyBuZXcgc2lnbmluZyBjb25maWd1cmF0aW9uIiIiCisgIGlmIE9QVElPTlMuaW5wdXRfdG1wIGlzIE5vbmU6CisgICAgT1BUSU9OUy5pbnB1dF90bXAgPSBjb21tb24uVW56aXBUZW1wKGlucHV0X3RmX3ppcC5maWxlbmFtZSwgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKi9ib290LmltZyIsICIqL2R0Ym8uaW1nIl0pCisgIGVsc2U6CisgICAgY29tbW9uLlVuemlwVG9EaXIoaW5wdXRfdGZfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKi9ib290LmltZyIsICIqL2R0Ym8uaW1nIl0pCisgIHVuemlwX2RpciA9IE9QVElPTlMuaW5wdXRfdG1wCisgIGltYWdlX2RpciA9IG9zLnBhdGguam9pbih1bnppcF9kaXIsICJJTUFHRVMiKQorICBzaHV0aWwucm10cmVlKGltYWdlX2RpcikKKyAgb3MubWFrZWRpcnMoaW1hZ2VfZGlyLCBleGlzdF9vaz1UcnVlKQorCisgIGJvb3RfaW1hZ2UgPSBjb21tb24uR2V0Qm9vdGFibGVJbWFnZSgKKyAgICAgICJJTUFHRVMvYm9vdC5pbWciLCAiYm9vdC5pbWciLCB1bnppcF9kaXIsICJCT09UIiwgbWlzY19pbmZvKQorICBpZiBib290X2ltYWdlOgorICAgIGJvb3RfaW1hZ2UuV3JpdGVUb0Rpcih1bnppcF9kaXIpCisgICAgYm9vdF9pbWFnZSA9IG9zLnBhdGguam9pbih1bnppcF9kaXIsIGJvb3RfaW1hZ2UubmFtZSkKKyAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3RmX3ppcCwgYm9vdF9pbWFnZSwgIklNQUdFUy9ib290LmltZyIsCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQorICBhZGRfaW1nX3RvX3RhcmdldF9maWxlcy5BZGREdGJvKG91dHB1dF90Zl96aXApCisgIHJldHVybiB1bnppcF9kaXIKKworCitkZWYgUmVnZW5lcmF0ZUJvb3RPVEEoaW5wdXRfdGZfemlwOiB6aXBmaWxlLlppcEZpbGUsIG91dHB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgbWlzY19pbmZvLCBmaWxlbmFtZSwgaW5wdXRfb3RhKToKKyAgaWYgZmlsZW5hbWUgbm90IGluIFsiVkVORE9SL2Jvb3Rfb3Rhcy9ib290X290YV80ay56aXAiLCAiU1lTVEVNL2Jvb3Rfb3Rhcy9ib290X290YV80ay56aXAiXToKKyAgICAjIFdlIG9ubHkgbmVlZCB0byByZS1nZW5lcmF0ZSA0SyBib290IE9UQSwgZm9yIG90aGVyIE9UQSBwYWNrYWdlcworICAgICMgc2ltcGx5IGNvcHkgYXMgaXMKKyAgICB3aXRoIGlucHV0X3RmX3ppcC5vcGVuKGZpbGVuYW1lLCAiciIpIGFzIGluX2ZwOgorICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGluX2ZwLCBpbnB1dF9vdGEpCisgICAgICBpbnB1dF9vdGEuZmx1c2goKQorICAgIHJldHVybgorICB0aW1lc3RhbXAgPSBtaXNjX2luZm9bImJ1aWxkLnByb3AiXS5HZXRQcm9wKAorICAgICAgInJvLnN5c3RlbS5idWlsZC5kYXRlLnV0YyIpCisgIHVuemlwX2RpciA9IFJlZ2VuZXJhdGVLZXJuZWxQYXJ0aXRpb25zKAorICAgICAgaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pCisgIHNpZ25lZF9ib290X2ltYWdlID0gb3MucGF0aC5qb2luKHVuemlwX2RpciwgIklNQUdFUy9ib290LmltZyIpCisgIHNpZ25lZF9kdGJvX2ltYWdlID0gb3MucGF0aC5qb2luKHVuemlwX2RpciwgIklNQUdFUy9kdGJvLmltZyIpCisKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNpZ25lZF9ib290X2ltYWdlKToKKyAgICBsb2dnZXIud2FybigiTmVlZCB0byByZS1nZW5lcmF0ZSBib290IE9UQSB7fSBidXQgZmFpbGVkIHRvIGdldCBzaWduZWQgYm9vdCBpbWFnZS4gMTZLIGRldiBvcHRpb24gd2lsbCBiZSBpbXBhY3RlZCwgYWZ0ZXIgcm9sbGluZyBiYWNrIHRvIDRLIHVzZXIgd291bGQgbmVlZCB0byBzaWRlbG9hZC9mbGFzaCB0aGVpciBkZXZpY2UgdG8gY29udGludWUgcmVjZWl2aW5nIE9UQXMuIikKKyAgICByZXR1cm4KKyAgbG9nZ2VyLmluZm8oCisgICAgICAiUmUtZ2VuZXJhdGluZyBib290IE9UQSB7fSB3aXRoIHRpbWVzdGFtcCB7fSIuZm9ybWF0KGZpbGVuYW1lLCB0aW1lc3RhbXApKQorICBhcmdzID0gWyJvdGFfZnJvbV9yYXdfaW1nIiwgIi0tcGFja2FnZV9rZXkiLCBPUFRJT05TLnBhY2thZ2Vfa2V5LAorICAgICAgICAgICItLW1heF90aW1lc3RhbXAiLCB0aW1lc3RhbXAsICItLW91dHB1dCIsIGlucHV0X290YS5uYW1lXQorICBpZiBvcy5wYXRoLmV4aXN0cyhzaWduZWRfZHRib19pbWFnZSk6CisgICAgYXJncy5leHRlbmQoWyItLXBhcnRpdGlvbl9uYW1lIiwgImJvb3QsZHRibyIsCisgICAgICAgICAgICAgICAgc2lnbmVkX2Jvb3RfaW1hZ2UsIHNpZ25lZF9kdGJvX2ltYWdlXSkKKyAgZWxzZToKKyAgICBhcmdzLmV4dGVuZChbIi0tcGFydGl0aW9uX25hbWUiLCAiYm9vdCIsIHNpZ25lZF9ib290X2ltYWdlXSkKKyAgb3RhX2Zyb21fcmF3X2ltZy5tYWluKGFyZ3MpCisKKworZGVmIFByb2Nlc3NUYXJnZXRGaWxlcyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBtaXNjX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgIGFwa19rZXlzLCBhcGV4X2tleXMsIGtleV9wYXNzd29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2FwaV9sZXZlbCwgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24pOgpAQCAtNTkzLDYgKzY0OSwxNCBAQAogICAgICMgU2V0cyB0aGlzIHRvIHplcm8gZm9yIHRhcmdldHMgd2l0aG91dCBBUEsgZmlsZXMuCiAgICAgbWF4c2l6ZSA9IDAKIAorICAjIFJlcGxhY2UgdGhlIEFWQiBzaWduaW5nIGtleXMsIGlmIGFueS4KKyAgUmVwbGFjZUF2YlNpZ25pbmdLZXlzKG1pc2NfaW5mbykKKyAgT1BUSU9OUy5pbmZvX2RpY3QgPSBtaXNjX2luZm8KKworICAjIFJld3JpdGUgdGhlIHByb3BzIGluIEFWQiBzaWduaW5nIGFyZ3MuCisgIGlmIG1pc2NfaW5mby5nZXQoJ2F2Yl9lbmFibGUnKSA9PSAndHJ1ZSc6CisgICAgUmV3cml0ZUF2YlByb3BzKG1pc2NfaW5mbykKKwogICBmb3IgaW5mbyBpbiBpbnB1dF90Zl96aXAuaW5mb2xpc3QoKToKICAgICBmaWxlbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICBpZiBmaWxlbmFtZS5zdGFydHN3aXRoKCJJTUFHRVMvIik6CkBAIC02NzAsOSArNzM0LDkgQEAKICAgICBlbGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIuemlwIikgYW5kIElzRW50cnlPdGFQYWNrYWdlKGlucHV0X3RmX3ppcCwgZmlsZW5hbWUpOgogICAgICAgbG9nZ2VyLmluZm8oIlJlLXNpZ25pbmcgT1RBIHBhY2thZ2Uge30iLmZvcm1hdChmaWxlbmFtZSkpCiAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGlucHV0X290YSwgdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgb3V0cHV0X290YToKLSAgICAgICAgd2l0aCBpbnB1dF90Zl96aXAub3BlbihmaWxlbmFtZSwgInIiKSBhcyBpbl9mcDoKLSAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooaW5fZnAsIGlucHV0X290YSkKLSAgICAgICAgICBpbnB1dF9vdGEuZmx1c2goKQorICAgICAgICBSZWdlbmVyYXRlQm9vdE9UQShpbnB1dF90Zl96aXAsIG91dHB1dF90Zl96aXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfaW5mbywgZmlsZW5hbWUsIGlucHV0X290YSkKKwogICAgICAgICBTaWduT3RhUGFja2FnZShpbnB1dF9vdGEubmFtZSwgb3V0cHV0X290YS5uYW1lKQogICAgICAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3RmX3ppcCwgb3V0cHV0X290YS5uYW1lLCBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQpAQCAtODExLDE3ICs4NzUsMTggQEAKICAgICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF90Zl96aXAsIGltYWdlLm5hbWUsIGZpbGVuYW1lKQogICAgICMgQSBub24tQVBLIGZpbGU7IGNvcHkgaXQgdmVyYmF0aW0uCiAgICAgZWxzZToKLSAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfdGZfemlwLCBvdXRfaW5mbywgZGF0YSkKKyAgICAgIHRyeToKKyAgICAgICAgZW50cnkgPSBvdXRwdXRfdGZfemlwLmdldGluZm8oZmlsZW5hbWUpCisgICAgICAgIGlmIG91dHB1dF90Zl96aXAucmVhZChlbnRyeSkgIT0gZGF0YToKKyAgICAgICAgICBsb2dnZXIud2FybigKKyAgICAgICAgICAgICAgIk91dHB1dCB6aXAgY29udGFpbnMgZHVwbGljYXRlIGVudHJpZXMgZm9yICVzIHdpdGggZGlmZmVyZW50IGNvbnRlbnRzIiwgZmlsZW5hbWUpCisgICAgICAgIGNvbnRpbnVlCisgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfdGZfemlwLCBvdXRfaW5mbywgZGF0YSkKIAogICBpZiBPUFRJT05TLnJlcGxhY2Vfb3RhX2tleXM6CiAgICAgUmVwbGFjZU90YUtleXMoaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pCiAKLSAgIyBSZXBsYWNlIHRoZSBBVkIgc2lnbmluZyBrZXlzLCBpZiBhbnkuCi0gIFJlcGxhY2VBdmJTaWduaW5nS2V5cyhtaXNjX2luZm8pCi0KLSAgIyBSZXdyaXRlIHRoZSBwcm9wcyBpbiBBVkIgc2lnbmluZyBhcmdzLgotICBpZiBtaXNjX2luZm8uZ2V0KCdhdmJfZW5hYmxlJykgPT0gJ3RydWUnOgotICAgIFJld3JpdGVBdmJQcm9wcyhtaXNjX2luZm8pCiAKICAgIyBXcml0ZSBiYWNrIG1pc2NfaW5mbyB3aXRoIHRoZSBsYXRlc3QgdmFsdWVzLgogICBSZXBsYWNlTWlzY0luZm9UeHQoaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pCmRpZmYgLS1naXQgYS90b29scy9zYm9tL0FuZHJvaWQuYnAgYi90b29scy9zYm9tL0FuZHJvaWQuYnAKaW5kZXggMmIyYjU3My4uNjkwMWIwNiAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3Nib20vQW5kcm9pZC5icApAQCAtMzMsNiArMzMsMjMgQEAKICAgICBdLAogfQogCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJnZW5fc2JvbSIsCisgICAgc3JjczogWworICAgICAgICAiZ2VuX3Nib20ucHkiLAorICAgIF0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisgICAgbGliczogWworICAgICAgICAibWV0YWRhdGFfZmlsZV9wcm90b19weSIsCisgICAgICAgICJsaWJwcm90b2J1Zi1weXRob24iLAorICAgICAgICAic2JvbV9saWIiLAorICAgIF0sCit9CisKIHB5dGhvbl9saWJyYXJ5X2hvc3QgewogICAgIG5hbWU6ICJzYm9tX2xpYiIsCiAgICAgc3JjczogWwpAQCAtOTEsNCArMTA4LDQgQEAKICAgICBsaWJzOiBbCiAgICAgICAgICJzYm9tX2xpYiIsCiAgICAgXSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS90b29scy9zYm9tL2dlbl9zYm9tLnB5IGIvdG9vbHMvc2JvbS9nZW5fc2JvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjAzMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2JvbS9nZW5fc2JvbS5weQpAQCAtMCwwICsxLDkyNiBAQAorIyAhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIgorR2VuZXJhdGUgdGhlIFNCT00gb2YgdGhlIGN1cnJlbnQgdGFyZ2V0IHByb2R1Y3QgaW4gU1BEWCBmb3JtYXQuCitVc2FnZSBleGFtcGxlOgorICBnZW5fc2JvbS5weSAtLW91dHB1dF9maWxlIG91dC9zb29uZy9zYm9tL2Fvc3BfY2ZfeDg2XzY0X3Bob25lL3Nib20uc3BkeCBcCisgICAgICAgICAgICAgIC0tbWV0YWRhdGEgb3V0L3Nvb25nL21ldGFkYXRhL2Fvc3BfY2ZfeDg2XzY0X3Bob25lL21ldGFkYXRhLmRiIFwKKyAgICAgICAgICAgICAgLS1wcm9kdWN0X291dCBvdXQvdGFyZ2V0L3Zzb2NfeDg2XzY0CisgICAgICAgICAgICAgIC0tc29vbmdfb3V0IG91dC9zb29uZworICAgICAgICAgICAgICAtLWJ1aWxkX3ZlcnNpb24gJChjYXQgb3V0L3RhcmdldC9wcm9kdWN0L3Zzb2NfeDg2XzY0L2J1aWxkX2ZpbmdlcnByaW50LnR4dCkgXAorICAgICAgICAgICAgICAtLXByb2R1Y3RfbWZyPUdvb2dsZQorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLnRleHRfZm9ybWF0IGFzIHRleHRfZm9ybWF0CitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHF1ZXVlCitpbXBvcnQgbWV0YWRhdGFfZmlsZV9wYjIKK2ltcG9ydCBzYm9tX2RhdGEKK2ltcG9ydCBzYm9tX3dyaXRlcnMKK2ltcG9ydCBzcWxpdGUzCisKKyMgUGFja2FnZSB0eXBlCitQS0dfU09VUkNFID0gJ1NPVVJDRScKK1BLR19VUFNUUkVBTSA9ICdVUFNUUkVBTScKK1BLR19QUkVCVUlMVCA9ICdQUkVCVUlMVCcKKworIyBTZWN1cml0eSB0YWcKK05WRF9DUEUyMyA9ICdOVkQtQ1BFMi4zOicKKworIyBSZXBvcnQKK0lTU1VFX05PX01FVEFEQVRBID0gJ05vIG1ldGFkYXRhIGdlbmVyYXRlZCBpbiBNYWtlIGZvciBpbnN0YWxsZWQgZmlsZXM6JworSVNTVUVfTk9fTUVUQURBVEFfRklMRSA9ICdObyBNRVRBREFUQSBmaWxlIGZvdW5kIGZvciBpbnN0YWxsZWQgZmlsZTonCitJU1NVRV9NRVRBREFUQV9GSUxFX0lOQ09NUExFVEUgPSAnTUVUQURBVEEgZmlsZSBpbmNvbXBsZXRlOicKK0lTU1VFX1VOS05PV05fU0VDVVJJVFlfVEFHX1RZUEUgPSAnVW5rbm93biBzZWN1cml0eSB0YWcgdHlwZTonCitJU1NVRV9JTlNUQUxMRURfRklMRV9OT1RfRVhJU1QgPSAnTm9uLWV4aXN0ZW50IGluc3RhbGxlZCBmaWxlczonCitJU1NVRV9OT19NT0RVTEVfRk9VTkRfRk9SX1NUQVRJQ19ERVAgPSAnTm8gbW9kdWxlIGZvdW5kIGZvciBzdGF0aWMgZGVwZW5kZW5jeSBmaWxlczonCitJTkZPX01FVEFEQVRBX0ZPVU5EX0ZPUl9QQUNLQUdFID0gJ01FVEFEQVRBIGZpbGUgZm91bmQgZm9yIHBhY2thZ2VzOicKKworU09PTkdfUFJFQlVJTFRfTU9EVUxFX1RZUEVTID0gWworICAgICdhbmRyb2lkX2FwcF9pbXBvcnQnLAorICAgICdhbmRyb2lkX2xpYnJhcnlfaW1wb3J0JywKKyAgICAnY2NfcHJlYnVpbHRfYmluYXJ5JywKKyAgICAnY2NfcHJlYnVpbHRfbGlicmFyeScsCisgICAgJ2NjX3ByZWJ1aWx0X2xpYnJhcnlfaGVhZGVycycsCisgICAgJ2NjX3ByZWJ1aWx0X2xpYnJhcnlfc2hhcmVkJywKKyAgICAnY2NfcHJlYnVpbHRfbGlicmFyeV9zdGF0aWMnLAorICAgICdjY19wcmVidWlsdF9vYmplY3QnLAorICAgICdkZXhfaW1wb3J0JywKKyAgICAnamF2YV9pbXBvcnQnLAorICAgICdqYXZhX3Nka19saWJyYXJ5X2ltcG9ydCcsCisgICAgJ2phdmFfc3lzdGVtX21vZHVsZXNfaW1wb3J0JywKKyAgICAnbGliY2xhbmdfcnRfcHJlYnVpbHRfbGlicmFyeV9zdGF0aWMnLAorICAgICdsaWJjbGFuZ19ydF9wcmVidWlsdF9saWJyYXJ5X3NoYXJlZCcsCisgICAgJ2xsdm1fcHJlYnVpbHRfbGlicmFyeV9zdGF0aWMnLAorICAgICduZGtfcHJlYnVpbHRfb2JqZWN0JywKKyAgICAnbmRrX3ByZWJ1aWx0X3NoYXJlZF9zdGwnLAorICAgICdua2RfcHJlYnVpbHRfc3RhdGljX3N0bCcsCisgICAgJ3ByZWJ1aWx0X2FwZXgnLAorICAgICdwcmVidWlsdF9ib290Y2xhc3NwYXRoX2ZyYWdtZW50JywKKyAgICAncHJlYnVpbHRfZHNwJywKKyAgICAncHJlYnVpbHRfZmlybXdhcmUnLAorICAgICdwcmVidWlsdF9rZXJuZWxfbW9kdWxlcycsCisgICAgJ3ByZWJ1aWx0X3Jmc2EnLAorICAgICdwcmVidWlsdF9yb290JywKKyAgICAncnVzdF9wcmVidWlsdF9keWxpYicsCisgICAgJ3J1c3RfcHJlYnVpbHRfbGlicmFyeScsCisgICAgJ3J1c3RfcHJlYnVpbHRfcmxpYicsCisgICAgJ3ZuZGtfcHJlYnVpbHRfc2hhcmVkJywKK10KKworVEhJUkRfUEFSVFlfSURFTlRJRklFUl9UWVBFUyA9IFsKKyAgICAjIFR5cGVzIGRlZmluZWQgaW4gbWV0YWRhdGFfZmlsZS5wcm90bworICAgICdHaXQnLAorICAgICdTVk4nLAorICAgICdIZycsCisgICAgJ0RhcmNzJywKKyAgICAnVkNTJywKKyAgICAnQXJjaGl2ZScsCisgICAgJ1ByZWJ1aWx0QnlBbHBoYWJldCcsCisgICAgJ0xvY2FsU291cmNlJywKKyAgICAnT3RoZXInLAorICAgICMgT1NWIGVjb3N5c3RlbXMgZGVmaW5lZCBhdCBodHRwczovL29zc2YuZ2l0aHViLmlvL29zdi1zY2hlbWEvI2FmZmVjdGVkcGFja2FnZS1maWVsZC4KKyAgICAnR28nLAorICAgICducG0nLAorICAgICdPU1MtRnV6eicsCisgICAgJ1B5UEknLAorICAgICdSdWJ5R2VtcycsCisgICAgJ2NyYXRlcy5pbycsCisgICAgJ0hhY2thZ2UnLAorICAgICdHSEMnLAorICAgICdQYWNrYWdpc3QnLAorICAgICdNYXZlbicsCisgICAgJ051R2V0JywKKyAgICAnTGludXgnLAorICAgICdEZWJpYW4nLAorICAgICdBbHBpbmUnLAorICAgICdIZXgnLAorICAgICdBbmRyb2lkJywKKyAgICAnR2l0SHViIEFjdGlvbnMnLAorICAgICdQdWInLAorICAgICdDb25hbkNlbnRlcicsCisgICAgJ1JvY2t5IExpbnV4JywKKyAgICAnQWxtYUxpbnV4JywKKyAgICAnQml0bmFtaScsCisgICAgJ1Bob3RvbiBPUycsCisgICAgJ0NSQU4nLAorICAgICdCaW9jb25kdWN0b3InLAorICAgICdTd2lmdFVSTCcKK10KKworCitkZWYgZ2V0X2FyZ3MoKToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdQcmludCBtb3JlIGluZm9ybWF0aW9uLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kJywgJy0tZGVidWcnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdEZWJ1ZyBtb2RlJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXRfZmlsZScsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBnZW5lcmF0ZWQgU0JPTSBmaWxlIGluIFNQRFggZm9ybWF0LicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbWV0YWRhdGEnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgbWV0YWRhdGEgREIgZmlsZSBwYXRoLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdF9vdXQnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBQUk9EVUNUX09VVCwgZS5nLiBvdXQvdGFyZ2V0L3Byb2R1Y3QvdnNvY194ODZfNjQuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zb29uZ19vdXQnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBTb29uZyBvdXRwdXQgZGlyZWN0b3J5LCBlLmcuIG91dC9zb29uZycpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYnVpbGRfdmVyc2lvbicsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBidWlsZCB2ZXJzaW9uLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdF9tZnInLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcHJvZHVjdCBtYW51ZmFjdHVyZXIuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1qc29uJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nR2VuZXJhdGVkIFNCT00gZmlsZSBpbiBTUERYIEpTT04gZm9ybWF0JykKKworICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBsb2coKmluZm8pOgorICBpZiBhcmdzLnZlcmJvc2U6CisgICAgZm9yIGkgaW4gaW5mbzoKKyAgICAgIHByaW50KGkpCisKKworZGVmIG5ld19wYWNrYWdlX2lkKHBhY2thZ2VfbmFtZSwgdHlwZSk6CisgIHJldHVybiBmJ1NQRFhSZWYte3R5cGV9LXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQocGFja2FnZV9uYW1lKX0nCisKKworZGVmIG5ld19maWxlX2lkKGZpbGVfcGF0aCk6CisgIHJldHVybiBmJ1NQRFhSZWYte3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChmaWxlX3BhdGgpfScKKworCitkZWYgbmV3X2xpY2Vuc2VfaWQobGljZW5zZV9uYW1lKToKKyAgcmV0dXJuIGYnTGljZW5zZVJlZi17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKGxpY2Vuc2VfbmFtZSl9JworCisKK2RlZiBjaGVja3N1bShmaWxlX3BhdGgpOgorICBoID0gaGFzaGxpYi5zaGExKCkKKyAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZV9wYXRoKToKKyAgICBoLnVwZGF0ZShvcy5yZWFkbGluayhmaWxlX3BhdGgpLmVuY29kZSgndXRmLTgnKSkKKyAgZWxzZToKKyAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgorICAgICAgaC51cGRhdGUoZi5yZWFkKCkpCisgIHJldHVybiBmJ1NIQTE6IHtoLmhleGRpZ2VzdCgpfScKKworCitkZWYgaXNfc29vbmdfcHJlYnVpbHRfbW9kdWxlKGZpbGVfbWV0YWRhdGEpOgorICByZXR1cm4gKGZpbGVfbWV0YWRhdGFbJ3Nvb25nX21vZHVsZV90eXBlJ10gYW5kCisgICAgICAgICAgZmlsZV9tZXRhZGF0YVsnc29vbmdfbW9kdWxlX3R5cGUnXSBpbiBTT09OR19QUkVCVUlMVF9NT0RVTEVfVFlQRVMpCisKKworZGVmIGlzX3NvdXJjZV9wYWNrYWdlKGZpbGVfbWV0YWRhdGEpOgorICBtb2R1bGVfcGF0aCA9IGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgcmV0dXJuIG1vZHVsZV9wYXRoLnN0YXJ0c3dpdGgoJ2V4dGVybmFsLycpIGFuZCBub3QgaXNfcHJlYnVpbHRfcGFja2FnZShmaWxlX21ldGFkYXRhKQorCisKK2RlZiBpc19wcmVidWlsdF9wYWNrYWdlKGZpbGVfbWV0YWRhdGEpOgorICBtb2R1bGVfcGF0aCA9IGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgaWYgbW9kdWxlX3BhdGg6CisgICAgcmV0dXJuIChtb2R1bGVfcGF0aC5zdGFydHN3aXRoKCdwcmVidWlsdHMvJykgb3IKKyAgICAgICAgICAgIGlzX3Nvb25nX3ByZWJ1aWx0X21vZHVsZShmaWxlX21ldGFkYXRhKSBvcgorICAgICAgICAgICAgZmlsZV9tZXRhZGF0YVsnaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUnXSkKKworICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgPSBmaWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXQorICBpZiBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgYW5kIG5vdCBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMuc3RhcnRzd2l0aCgnQU5EUk9JRC1HRU46Jyk6CisgICAgcmV0dXJuIFRydWUKKworICByZXR1cm4gRmFsc2UKKworCitkZWYgZ2V0X3NvdXJjZV9wYWNrYWdlX2luZm8oZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIHNvdXJjZSBwYWNrYWdlIGluZm8gZXhpc3RzIGluIGl0cyBNRVRBREFUQSBmaWxlLCBjdXJyZW50bHkgaW5jbHVkaW5nIG5hbWUsIHNlY3VyaXR5IHRhZworICBhbmQgZXh0ZXJuYWwgU0JPTSByZWZlcmVuY2UuCisKKyAgU2VlIGdvL2FuZHJvaWQtc3BkeCBhbmQgZ28vYW5kcm9pZC1zYm9tLWdlbiBmb3IgbW9yZSBkZXRhaWxzLgorICAiIiIKKyAgaWYgbm90IG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICByZXR1cm4gZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXSwgW10KKworICBtZXRhZGF0YV9wcm90byA9IG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0KKyAgZXh0ZXJuYWxfcmVmcyA9IFtdCisgIGZvciB0YWcgaW4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2VjdXJpdHkudGFnOgorICAgIGlmIHRhZy5sb3dlcigpLnN0YXJ0c3dpdGgoKE5WRF9DUEUyMyArICdjcGU6Mi4zOicpLmxvd2VyKCkpOgorICAgICAgZXh0ZXJuYWxfcmVmcy5hcHBlbmQoCisgICAgICAgICAgc2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZihjYXRlZ29yeT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmQ2F0ZWdvcnkuU0VDVVJJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZUeXBlLmNwZTIzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3I9dGFnLnJlbW92ZXByZWZpeChOVkRfQ1BFMjMpKSkKKyAgICBlbGlmIHRhZy5sb3dlcigpLnN0YXJ0c3dpdGgoKE5WRF9DUEUyMyArICdjcGU6LycpLmxvd2VyKCkpOgorICAgICAgZXh0ZXJuYWxfcmVmcy5hcHBlbmQoCisgICAgICAgICAgc2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZihjYXRlZ29yeT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmQ2F0ZWdvcnkuU0VDVVJJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZUeXBlLmNwZTIyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3I9dGFnLnJlbW92ZXByZWZpeChOVkRfQ1BFMjMpKSkKKworICBpZiBtZXRhZGF0YV9wcm90by5uYW1lOgorICAgIHJldHVybiBtZXRhZGF0YV9wcm90by5uYW1lLCBleHRlcm5hbF9yZWZzCisgIGVsc2U6CisgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUobWV0YWRhdGFfZmlsZV9wYXRoKSwgZXh0ZXJuYWxfcmVmcyAgIyByZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lIG9ubHkgYXMgcGFja2FnZSBuYW1lCisKKworZGVmIGdldF9wcmVidWlsdF9wYWNrYWdlX25hbWUoZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIG5hbWUgb2YgYSBwcmVidWlsdCBwYWNrYWdlLCB3aGljaCBjYW4gYmUgZnJvbSB0aGUgTUVUQURBVEEgZmlsZSwgbWV0YWRhdGEgZmlsZSBwYXRoLAorICBtb2R1bGUgcGF0aCBvciBrZXJuZWwgbW9kdWxlJ3Mgc291cmNlIHBhdGggaWYgdGhlIGluc3RhbGxlZCBmaWxlIGlzIGEga2VybmVsIG1vZHVsZS4KKworICBTZWUgZ28vYW5kcm9pZC1zcGR4IGFuZCBnby9hbmRyb2lkLXNib20tZ2VuIGZvciBtb3JlIGRldGFpbHMuCisgICIiIgorICBuYW1lID0gTm9uZQorICBpZiBtZXRhZGF0YV9maWxlX3BhdGg6CisgICAgbWV0YWRhdGFfcHJvdG8gPSBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdCisgICAgaWYgbWV0YWRhdGFfcHJvdG8ubmFtZToKKyAgICAgIG5hbWUgPSBtZXRhZGF0YV9wcm90by5uYW1lCisgICAgZWxzZToKKyAgICAgIG5hbWUgPSBtZXRhZGF0YV9maWxlX3BhdGgKKyAgZWxpZiBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddOgorICAgIG5hbWUgPSBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgIGVsaWYgZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ106CisgICAgc3JjX3BhdGggPSBmaWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXS5zcGxpdCgnOicpWzBdCisgICAgbmFtZSA9IG9zLnBhdGguZGlybmFtZShzcmNfcGF0aCkKKworICByZXR1cm4gbmFtZS5yZW1vdmVwcmVmaXgoJ3ByZWJ1aWx0cy8nKS5yZXBsYWNlKCcvJywgJy0nKQorCisKK2RlZiBnZXRfbWV0YWRhdGFfZmlsZV9wYXRoKGZpbGVfbWV0YWRhdGEpOgorICAiIiJTZWFyY2ggZm9yIE1FVEFEQVRBIGZpbGUgb2YgYSBwYWNrYWdlIGFuZCByZXR1cm4gaXRzIHBhdGguIiIiCisgIG1ldGFkYXRhX3BhdGggPSAnJworICBpZiBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddOgorICAgIG1ldGFkYXRhX3BhdGggPSBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgIGVsaWYgZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ106CisgICAgbWV0YWRhdGFfcGF0aCA9IG9zLnBhdGguZGlybmFtZShmaWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXS5zcGxpdCgnOicpWzBdKQorCisgIHdoaWxlIG1ldGFkYXRhX3BhdGggYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhtZXRhZGF0YV9wYXRoICsgJy9NRVRBREFUQScpOgorICAgIG1ldGFkYXRhX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUobWV0YWRhdGFfcGF0aCkKKworICByZXR1cm4gbWV0YWRhdGFfcGF0aAorCisKK2RlZiBnZXRfcGFja2FnZV92ZXJzaW9uKG1ldGFkYXRhX2ZpbGVfcGF0aCk6CisgICIiIlJldHVybiBhIHBhY2thZ2UncyB2ZXJzaW9uIGluIGl0cyBNRVRBREFUQSBmaWxlLiIiIgorICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJldHVybiBOb25lCisgIG1ldGFkYXRhX3Byb3RvID0gbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXQorICByZXR1cm4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkudmVyc2lvbgorCisKK2RlZiBnZXRfcGFja2FnZV9ob21lcGFnZShtZXRhZGF0YV9maWxlX3BhdGgpOgorICAiIiJSZXR1cm4gYSBwYWNrYWdlJ3MgaG9tZXBhZ2UgVVJMIGluIGl0cyBNRVRBREFUQSBmaWxlLiIiIgorICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJldHVybiBOb25lCisgIG1ldGFkYXRhX3Byb3RvID0gbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXQorICBpZiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5ob21lcGFnZToKKyAgICByZXR1cm4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuaG9tZXBhZ2UKKyAgZm9yIHVybCBpbiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS51cmw6CisgICAgaWYgdXJsLnR5cGUgPT0gbWV0YWRhdGFfZmlsZV9wYjIuVVJMLlR5cGUuSE9NRVBBR0U6CisgICAgICByZXR1cm4gdXJsLnZhbHVlCisKKyAgcmV0dXJuIE5vbmUKKworCitkZWYgZ2V0X3BhY2thZ2VfZG93bmxvYWRfbG9jYXRpb24obWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIGEgcGFja2FnZSdzIGNvZGUgcmVwb3NpdG9yeSBVUkwgaW4gaXRzIE1FVEFEQVRBIGZpbGUuIiIiCisgIGlmIG5vdCBtZXRhZGF0YV9maWxlX3BhdGg6CisgICAgcmV0dXJuIE5vbmUKKyAgbWV0YWRhdGFfcHJvdG8gPSBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdCisgIGlmIG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnVybDoKKyAgICB1cmxzID0gc29ydGVkKG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnVybCwga2V5PWxhbWJkYSB1cmw6IHVybC50eXBlKQorICAgIGlmIHVybHNbMF0udHlwZSAhPSBtZXRhZGF0YV9maWxlX3BiMi5VUkwuVHlwZS5IT01FUEFHRToKKyAgICAgIHJldHVybiB1cmxzWzBdLnZhbHVlCisgICAgZWxpZiBsZW4odXJscykgPiAxOgorICAgICAgcmV0dXJuIHVybHNbMV0udmFsdWUKKworICByZXR1cm4gTm9uZQorCisKK2RlZiBnZXRfbGljZW5zZV90ZXh0KGxpY2Vuc2VfZmlsZXMpOgorICBsaWNlbnNlX3RleHQgPSAnJworICBmb3IgbGljZW5zZV9maWxlIGluIGxpY2Vuc2VfZmlsZXM6CisgICAgaWYgYXJncy5kZWJ1ZzoKKyAgICAgIGxpY2Vuc2VfdGV4dCArPSAnIyMjIyBDb250ZW50IGZyb20gJyArIGxpY2Vuc2VfZmlsZSArICdcbicKKyAgICBlbHNlOgorICAgICAgbGljZW5zZV90ZXh0ICs9IHBhdGhsaWIuUGF0aChsaWNlbnNlX2ZpbGUpLnJlYWRfdGV4dChlcnJvcnM9J3JlcGxhY2UnKSArICdcblxuJworICByZXR1cm4gbGljZW5zZV90ZXh0CisKKworZGVmIGdldF9zYm9tX2ZyYWdtZW50cyhpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIFNQRFggZnJhZ21lbnQgb2Ygc291cmNlL3ByZWJ1aWx0IHBhY2thZ2VzLCB3aGljaCB1c3VhbGx5IGNvbnRhaW5zIGEgU09VUkNFL1BSRUJVSUxUCisgIHBhY2thZ2UsIGEgVVBTVFJFQU0gcGFja2FnZSBhbmQgYW4gZXh0ZXJuYWwgU0JPTSBkb2N1bWVudCByZWZlcmVuY2UgaWYgc2JvbV9yZWYgZGVmaW5lZCBpbiBpdHMKKyAgTUVUQURBVEEgZmlsZS4KKworICBTZWUgZ28vYW5kcm9pZC1zcGR4IGFuZCBnby9hbmRyb2lkLXNib20tZ2VuIGZvciBtb3JlIGRldGFpbHMuCisgICIiIgorICBleHRlcm5hbF9kb2NfcmVmID0gTm9uZQorICBwYWNrYWdlcyA9IFtdCisgIHJlbGF0aW9uc2hpcHMgPSBbXQorICBsaWNlbnNlcyA9IFtdCisKKyAgIyBJbmZvIGZyb20gTUVUQURBVEEgZmlsZQorICBob21lcGFnZSA9IGdldF9wYWNrYWdlX2hvbWVwYWdlKG1ldGFkYXRhX2ZpbGVfcGF0aCkKKyAgdmVyc2lvbiA9IGdldF9wYWNrYWdlX3ZlcnNpb24obWV0YWRhdGFfZmlsZV9wYXRoKQorICBkb3dubG9hZF9sb2NhdGlvbiA9IGdldF9wYWNrYWdlX2Rvd25sb2FkX2xvY2F0aW9uKG1ldGFkYXRhX2ZpbGVfcGF0aCkKKworICBsaWNzID0gZGIuZ2V0X3BhY2thZ2VfbGljZW5zZXMoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10pCisgIGlmIG5vdCBsaWNzOgorICAgIGxpY3MgPSBkYi5nZXRfcGFja2FnZV9saWNlbnNlcyhtZXRhZGF0YV9maWxlX3BhdGgpCisKKyAgaWYgbGljczoKKyAgICBmb3IgbGljZW5zZV9uYW1lLCBsaWNlbnNlX2ZpbGVzIGluIGxpY3MuaXRlbXMoKToKKyAgICAgIGlmIG5vdCBsaWNlbnNlX2ZpbGVzOgorICAgICAgICBjb250aW51ZQorICAgICAgbGljZW5zZV9pZCA9IG5ld19saWNlbnNlX2lkKGxpY2Vuc2VfbmFtZSkKKyAgICAgIGlmIGxpY2Vuc2VfbmFtZSBub3QgaW4gbGljZW5zZXNfdGV4dDoKKyAgICAgICAgbGljZW5zZXNfdGV4dFtsaWNlbnNlX25hbWVdID0gZ2V0X2xpY2Vuc2VfdGV4dChsaWNlbnNlX2ZpbGVzLnNwbGl0KCcgJykpCisgICAgICBsaWNlbnNlcy5hcHBlbmQoc2JvbV9kYXRhLkxpY2Vuc2UoaWQ9bGljZW5zZV9pZCwgbmFtZT1saWNlbnNlX25hbWUsIHRleHQ9bGljZW5zZXNfdGV4dFtsaWNlbnNlX25hbWVdKSkKKworICBpZiBpc19zb3VyY2VfcGFja2FnZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSk6CisgICAgIyBTb3VyY2UgZm9yayBwYWNrYWdlcworICAgIG5hbWUsIGV4dGVybmFsX3JlZnMgPSBnZXRfc291cmNlX3BhY2thZ2VfaW5mbyhpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKQorICAgIHNvdXJjZV9wYWNrYWdlX2lkID0gbmV3X3BhY2thZ2VfaWQobmFtZSwgUEtHX1NPVVJDRSkKKyAgICBzb3VyY2VfcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXNvdXJjZV9wYWNrYWdlX2lkLCBuYW1lPW5hbWUsIHZlcnNpb249YXJncy5idWlsZF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX3JlZnM9ZXh0ZXJuYWxfcmVmcykKKworICAgIHVwc3RyZWFtX3BhY2thZ2VfaWQgPSBuZXdfcGFja2FnZV9pZChuYW1lLCBQS0dfVVBTVFJFQU0pCisgICAgdXBzdHJlYW1fcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXVwc3RyZWFtX3BhY2thZ2VfaWQsIG5hbWU9bmFtZSwgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPcmdhbml6YXRpb246ICcgKyBob21lcGFnZSkgaWYgaG9tZXBhZ2UgZWxzZSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPWRvd25sb2FkX2xvY2F0aW9uKQorICAgIHBhY2thZ2VzICs9IFtzb3VyY2VfcGFja2FnZSwgdXBzdHJlYW1fcGFja2FnZV0KKyAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1zb3VyY2VfcGFja2FnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5WQVJJQU5UX09GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPXVwc3RyZWFtX3BhY2thZ2VfaWQpKQorCisgICAgZm9yIGxpY2Vuc2UgaW4gbGljZW5zZXM6CisgICAgICBzb3VyY2VfcGFja2FnZS5kZWNsYXJlZF9saWNlbnNlX2lkcy5hcHBlbmQobGljZW5zZS5pZCkKKyAgICAgIHVwc3RyZWFtX3BhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2UuaWQpCisKKyAgZWxpZiBpc19wcmVidWlsdF9wYWNrYWdlKGluc3RhbGxlZF9maWxlX21ldGFkYXRhKToKKyAgICAjIFByZWJ1aWx0IGZvcmsgcGFja2FnZXMKKyAgICBuYW1lID0gZ2V0X3ByZWJ1aWx0X3BhY2thZ2VfbmFtZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKQorICAgIHByZWJ1aWx0X3BhY2thZ2VfaWQgPSBuZXdfcGFja2FnZV9pZChuYW1lLCBQS0dfUFJFQlVJTFQpCisgICAgcHJlYnVpbHRfcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXByZWJ1aWx0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiBpZiB2ZXJzaW9uIGVsc2UgYXJncy5idWlsZF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mcikKKworICAgIHVwc3RyZWFtX3BhY2thZ2VfaWQgPSBuZXdfcGFja2FnZV9pZChuYW1lLCBQS0dfVVBTVFJFQU0pCisgICAgdXBzdHJlYW1fcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXVwc3RyZWFtX3BhY2thZ2VfaWQsIG5hbWU9bmFtZSwgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPcmdhbml6YXRpb246ICcgKyBob21lcGFnZSkgaWYgaG9tZXBhZ2UgZWxzZSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPWRvd25sb2FkX2xvY2F0aW9uKQorICAgIHBhY2thZ2VzICs9IFtwcmVidWlsdF9wYWNrYWdlLCB1cHN0cmVhbV9wYWNrYWdlXQorICAgIHJlbGF0aW9uc2hpcHMuYXBwZW5kKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPXByZWJ1aWx0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuVkFSSUFOVF9PRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj11cHN0cmVhbV9wYWNrYWdlX2lkKSkKKyAgICBmb3IgbGljZW5zZSBpbiBsaWNlbnNlczoKKyAgICAgIHByZWJ1aWx0X3BhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2UuaWQpCisgICAgICB1cHN0cmVhbV9wYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLmFwcGVuZChsaWNlbnNlLmlkKQorCisgIGlmIG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICBtZXRhZGF0YV9wcm90byA9IG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0KKyAgICBpZiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5XaGljaE9uZW9mKCdzYm9tJykgPT0gJ3Nib21fcmVmJzoKKyAgICAgIHNib21fdXJsID0gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2JvbV9yZWYudXJsCisgICAgICBzYm9tX2NoZWNrc3VtID0gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2JvbV9yZWYuY2hlY2tzdW0KKyAgICAgIHVwc3RyZWFtX2VsZW1lbnRfaWQgPSBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5zYm9tX3JlZi5lbGVtZW50X2lkCisgICAgICBpZiBzYm9tX3VybCBhbmQgc2JvbV9jaGVja3N1bSBhbmQgdXBzdHJlYW1fZWxlbWVudF9pZDoKKyAgICAgICAgZG9jX3JlZl9pZCA9IGYnRG9jdW1lbnRSZWYte1BLR19VUFNUUkVBTX0te3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChuYW1lKX0nCisgICAgICAgIGV4dGVybmFsX2RvY19yZWYgPSBzYm9tX2RhdGEuRG9jdW1lbnRFeHRlcm5hbFJlZmVyZW5jZShpZD1kb2NfcmVmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpPXNib21fdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW09c2JvbV9jaGVja3N1bSkKKyAgICAgICAgcmVsYXRpb25zaGlwcy5hcHBlbmQoCisgICAgICAgICAgICBzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT11cHN0cmVhbV9wYWNrYWdlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuVkFSSUFOVF9PRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPWRvY19yZWZfaWQgKyAnOicgKyB1cHN0cmVhbV9lbGVtZW50X2lkKSkKKworICByZXR1cm4gZXh0ZXJuYWxfZG9jX3JlZiwgcGFja2FnZXMsIHJlbGF0aW9uc2hpcHMsIGxpY2Vuc2VzCisKKworZGVmIHNhdmVfcmVwb3J0KHJlcG9ydF9maWxlX3BhdGgsIHJlcG9ydCk6CisgIHdpdGggb3BlbihyZXBvcnRfZmlsZV9wYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHJlcG9ydF9maWxlOgorICAgIGZvciB0eXBlLCBpc3N1ZXMgaW4gcmVwb3J0Lml0ZW1zKCk6CisgICAgICByZXBvcnRfZmlsZS53cml0ZSh0eXBlICsgJ1xuJykKKyAgICAgIGZvciBpc3N1ZSBpbiBpc3N1ZXM6CisgICAgICAgIHJlcG9ydF9maWxlLndyaXRlKCdcdCcgKyBpc3N1ZSArICdcbicpCisgICAgICByZXBvcnRfZmlsZS53cml0ZSgnXG4nKQorCisKKyMgVmFsaWRhdGUgdGhlIG1ldGFkYXRhIGdlbmVyYXRlZCBieSBNYWtlIGZvciBpbnN0YWxsZWQgZmlsZXMgYW5kIHJlcG9ydCBpZiB0aGVyZSBpcyBubyBtZXRhZGF0YS4KK2RlZiBpbnN0YWxsZWRfZmlsZV9oYXNfbWV0YWRhdGEoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CisgIGluc3RhbGxlZF9maWxlID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2luc3RhbGxlZF9maWxlJ10KKyAgbW9kdWxlX3BhdGggPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXQorICBwcm9kdWN0X2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsncHJvZHVjdF9jb3B5X2ZpbGVzJ10KKyAga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyddCisgIGlzX3BsYXRmb3JtX2dlbmVyYXRlZCA9IGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpc19wbGF0Zm9ybV9nZW5lcmF0ZWQnXQorCisgIGlmIChub3QgbW9kdWxlX3BhdGggYW5kCisgICAgICBub3QgcHJvZHVjdF9jb3B5X2ZpbGVzIGFuZAorICAgICAgbm90IGtlcm5lbF9tb2R1bGVfY29weV9maWxlcyBhbmQKKyAgICAgIG5vdCBpc19wbGF0Zm9ybV9nZW5lcmF0ZWQgYW5kCisgICAgICBub3QgaW5zdGFsbGVkX2ZpbGUuZW5kc3dpdGgoJy5mc3ZfbWV0YScpKToKKyAgICByZXBvcnRbSVNTVUVfTk9fTUVUQURBVEFdLmFwcGVuZChpbnN0YWxsZWRfZmlsZSkKKyAgICByZXR1cm4gRmFsc2UKKworICByZXR1cm4gVHJ1ZQorCisKKyMgVmFsaWRhdGUgaWRlbnRpZmllcnMgaW4gYSBwYWNrYWdlJ3MgTUVUQURBVEEuCisjIDEpIE9ubHkga25vd24gaWRlbnRpZmllciB0eXBlIGlzIGFsbG93ZWQKKyMgMikgT25seSBvbmUgaWRlbnRpZmllcidzIHByaW1hcnlfc291cmNlIGNhbiBiZSB0cnVlCitkZWYgdmFsaWRhdGVfcGFja2FnZV9tZXRhZGF0YShtZXRhZGF0YV9maWxlX3BhdGgsIHBhY2thZ2VfbWV0YWRhdGEpOgorICBwcmltYXJ5X3NvdXJjZV9mb3VuZCA9IEZhbHNlCisgIGZvciBpZGVudGlmaWVyIGluIHBhY2thZ2VfbWV0YWRhdGEudGhpcmRfcGFydHkuaWRlbnRpZmllcjoKKyAgICBpZiBpZGVudGlmaWVyLnR5cGUgbm90IGluIFRISVJEX1BBUlRZX0lERU5USUZJRVJfVFlQRVM6CisgICAgICBzeXMuZXhpdChmJ1Vua25vd24gdmFsdWUgb2YgdGhpcmRfcGFydHkuaWRlbnRpZmllci50eXBlIGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBOiB7aWRlbnRpZmllci50eXBlfS4nKQorICAgIGlmIHByaW1hcnlfc291cmNlX2ZvdW5kIGFuZCBpZGVudGlmaWVyLnByaW1hcnlfc291cmNlOgorICAgICAgc3lzLmV4aXQoCisgICAgICAgICAgZidGaWVsZCAicHJpbWFyeV9zb3VyY2UiIGlzIHNldCB0byB0cnVlIGluIG11bHRpcGxlIHRoaXJkX3BhcnR5LmlkZW50aWZpZXIgaW4ge21ldGFkYXRhX2ZpbGVfcGF0aH0vTUVUQURBVEEuJykKKyAgICBwcmltYXJ5X3NvdXJjZV9mb3VuZCA9IGlkZW50aWZpZXIucHJpbWFyeV9zb3VyY2UKKworCitkZWYgcmVwb3J0X21ldGFkYXRhX2ZpbGUobWV0YWRhdGFfZmlsZV9wYXRoLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgcmVwb3J0KToKKyAgaWYgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJlcG9ydFtJTkZPX01FVEFEQVRBX0ZPVU5EX0ZPUl9QQUNLQUdFXS5hcHBlbmQoCisgICAgICAgICdpbnN0YWxsZWRfZmlsZToge30sIG1vZHVsZV9wYXRoOiB7fSwgTUVUQURBVEEgZmlsZToge30nLmZvcm1hdCgKKyAgICAgICAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpbnN0YWxsZWRfZmlsZSddLAorICAgICAgICAgICAgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10sCisgICAgICAgICAgICBtZXRhZGF0YV9maWxlX3BhdGggKyAnL01FVEFEQVRBJykpCisKKyAgICBwYWNrYWdlX21ldGFkYXRhID0gbWV0YWRhdGFfZmlsZV9wYjIuTWV0YWRhdGEoKQorICAgIHdpdGggb3BlbihtZXRhZGF0YV9maWxlX3BhdGggKyAnL01FVEFEQVRBJywgJ3J0JykgYXMgZjoKKyAgICAgIHRleHRfZm9ybWF0LlBhcnNlKGYucmVhZCgpLCBwYWNrYWdlX21ldGFkYXRhKQorCisgICAgdmFsaWRhdGVfcGFja2FnZV9tZXRhZGF0YShtZXRhZGF0YV9maWxlX3BhdGgsIHBhY2thZ2VfbWV0YWRhdGEpCisKKyAgICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoIGluIG1ldGFkYXRhX2ZpbGVfcHJvdG9zOgorICAgICAgbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXSA9IHBhY2thZ2VfbWV0YWRhdGEKKyAgICAgIGlmIG5vdCBwYWNrYWdlX21ldGFkYXRhLm5hbWU6CisgICAgICAgIHJlcG9ydFtJU1NVRV9NRVRBREFUQV9GSUxFX0lOQ09NUExFVEVdLmFwcGVuZChmJ3ttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBIGRvZXMgbm90IGhhcyAibmFtZSInKQorCisgICAgICBpZiBub3QgcGFja2FnZV9tZXRhZGF0YS50aGlyZF9wYXJ0eS52ZXJzaW9uOgorICAgICAgICByZXBvcnRbSVNTVUVfTUVUQURBVEFfRklMRV9JTkNPTVBMRVRFXS5hcHBlbmQoCisgICAgICAgICAgICBmJ3ttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBIGRvZXMgbm90IGhhcyAidGhpcmRfcGFydHkudmVyc2lvbiInKQorCisgICAgICBmb3IgdGFnIGluIHBhY2thZ2VfbWV0YWRhdGEudGhpcmRfcGFydHkuc2VjdXJpdHkudGFnOgorICAgICAgICBpZiBub3QgdGFnLnN0YXJ0c3dpdGgoTlZEX0NQRTIzKToKKyAgICAgICAgICByZXBvcnRbSVNTVUVfVU5LTk9XTl9TRUNVUklUWV9UQUdfVFlQRV0uYXBwZW5kKAorICAgICAgICAgICAgICBmJ1Vua25vd24gc2VjdXJpdHkgdGFnIHR5cGU6IHt0YWd9IGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBJykKKyAgZWxzZToKKyAgICByZXBvcnRbSVNTVUVfTk9fTUVUQURBVEFfRklMRV0uYXBwZW5kKAorICAgICAgICAiaW5zdGFsbGVkX2ZpbGU6IHt9LCBtb2R1bGVfcGF0aDoge30iLmZvcm1hdCgKKyAgICAgICAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpbnN0YWxsZWRfZmlsZSddLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXSkpCisKKworIyBJZiBhIGZpbGUgaXMgZnJvbSBhIHNvdXJjZSBmb3JrIG9yIHByZWJ1aWx0IGZvcmsgcGFja2FnZSwgYWRkIGl0cyBwYWNrYWdlIGluZm9ybWF0aW9uIHRvIFNCT00KK2RlZiBhZGRfcGFja2FnZV9vZl9maWxlKGZpbGVfaWQsIGZpbGVfbWV0YWRhdGEsIGRvYywgcmVwb3J0KToKKyAgbWV0YWRhdGFfZmlsZV9wYXRoID0gZ2V0X21ldGFkYXRhX2ZpbGVfcGF0aChmaWxlX21ldGFkYXRhKQorICByZXBvcnRfbWV0YWRhdGFfZmlsZShtZXRhZGF0YV9maWxlX3BhdGgsIGZpbGVfbWV0YWRhdGEsIHJlcG9ydCkKKworICBleHRlcm5hbF9kb2NfcmVmLCBwa2dzLCByZWxzLCBsaWNlbnNlcyA9IGdldF9zYm9tX2ZyYWdtZW50cyhmaWxlX21ldGFkYXRhLCBtZXRhZGF0YV9maWxlX3BhdGgpCisgIGlmIGxlbihwa2dzKSA+IDA6CisgICAgaWYgZXh0ZXJuYWxfZG9jX3JlZjoKKyAgICAgIGRvYy5hZGRfZXh0ZXJuYWxfcmVmKGV4dGVybmFsX2RvY19yZWYpCisgICAgZm9yIHAgaW4gcGtnczoKKyAgICAgIGRvYy5hZGRfcGFja2FnZShwKQorICAgIGZvciByZWwgaW4gcmVsczoKKyAgICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHJlbCkKKyAgICBmb3JrX3BhY2thZ2VfaWQgPSBwa2dzWzBdLmlkICAjIFRoZSBmaXJzdCBwYWNrYWdlIHNob3VsZCBiZSB0aGUgc291cmNlL3ByZWJ1aWx0IGZvcmsgcGFja2FnZQorICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9Zm9ya19wYWNrYWdlX2lkKSkKKyAgICBmb3IgbGljZW5zZSBpbiBsaWNlbnNlczoKKyAgICAgIGRvYy5hZGRfbGljZW5zZShsaWNlbnNlKQorCisKKyMgQWRkIFNUQVRJQ19MSU5LIHJlbGF0aW9uc2hpcCBmb3Igc3RhdGljIGRlcGVuZGVuY2llcyBvZiBhIGZpbGUKK2RlZiBhZGRfc3RhdGljX2RlcHNfb2ZfZmlsZShmaWxlX2lkLCBmaWxlX21ldGFkYXRhLCBkb2MpOgorICBpZiBub3QgZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddIGFuZCBub3QgZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddOgorICAgIHJldHVybgorICBzdGF0aWNfZGVwX2ZpbGVzID0gW10KKyAgaWYgZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddOgorICAgIHN0YXRpY19kZXBfZmlsZXMgKz0gZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJykKKyAgaWYgZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddOgorICAgIHN0YXRpY19kZXBfZmlsZXMgKz0gZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJykKKworICBmb3IgZGVwX2ZpbGUgaW4gc3RhdGljX2RlcF9maWxlczoKKyAgICAjIFN0YXRpYyBsaWJzIGFyZSBub3Qgc2hpcHBlZCBvbiBkZXZpY2VzLCBzbyBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIC5pbnRlcm1lZGlhdGVzIHBhdGhzLgorICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuU1RBVElDX0xJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9bmV3X2ZpbGVfaWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcF9maWxlLnJlbW92ZXByZWZpeChhcmdzLnNvb25nX291dCArICcvLmludGVybWVkaWF0ZXMvJykpKSkKKworCitkZWYgYWRkX2xpY2Vuc2VzX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jKToKKyAgbGljcyA9IGRiLmdldF9tb2R1bGVfbGljZW5zZXMoZmlsZV9tZXRhZGF0YS5nZXQoJ25hbWUnLCAnJyksIGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10pCisgIGlmIGxpY3M6CisgICAgZmlsZSA9IG5leHQoZiBmb3IgZiBpbiBkb2MuZmlsZXMgaWYgZmlsZV9pZCA9PSBmLmlkKQorICAgIGZvciBsaWNlbnNlX25hbWUsIGxpY2Vuc2VfZmlsZXMgaW4gbGljcy5pdGVtcygpOgorICAgICAgaWYgbm90IGxpY2Vuc2VfZmlsZXM6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBsaWNlbnNlX2lkID0gbmV3X2xpY2Vuc2VfaWQobGljZW5zZV9uYW1lKQorICAgICAgZmlsZS5jb25jbHVkZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2VfaWQpCisgICAgICBpZiBsaWNlbnNlX25hbWUgbm90IGluIGxpY2Vuc2VzX3RleHQ6CisgICAgICAgIGxpY2Vuc2VfdGV4dCA9IGdldF9saWNlbnNlX3RleHQobGljZW5zZV9maWxlcy5zcGxpdCgnICcpKQorICAgICAgICBsaWNlbnNlc190ZXh0W2xpY2Vuc2VfbmFtZV0gPSBsaWNlbnNlX3RleHQKKworICAgICAgZG9jLmFkZF9saWNlbnNlKHNib21fZGF0YS5MaWNlbnNlKGlkPWxpY2Vuc2VfaWQsIG5hbWU9bGljZW5zZV9uYW1lLCB0ZXh0PWxpY2Vuc2VzX3RleHRbbGljZW5zZV9uYW1lXSkpCisKKworZGVmIGdldF9hbGxfdHJhbnNpdGl2ZV9zdGF0aWNfZGVwX2ZpbGVzX29mX2luc3RhbGxlZF9maWxlcyhpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEsIGRiLCByZXBvcnQpOgorICAjIEZpbmQgYWxsIHRyYW5zaXRpdmUgc3RhdGljIGRlcCBmaWxlcyBvZiBhbGwgaW5zdGFsbGVkIGZpbGVzCisgIHEgPSBxdWV1ZS5RdWV1ZSgpCisgIGZvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSBpbiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGE6CisgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICAgIGZvciBmIGluIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzdGF0aWNfZGVwX2ZpbGVzJ10uc3BsaXQoJyAnKToKKyAgICAgICAgcS5wdXQoZikKKyAgICBpZiBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddOgorICAgICAgZm9yIGYgaW4gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpOgorICAgICAgICBxLnB1dChmKQorCisgIGFsbF9zdGF0aWNfZGVwX2ZpbGVzID0ge30KKyAgd2hpbGUgbm90IHEuZW1wdHkoKToKKyAgICBkZXBfZmlsZSA9IHEuZ2V0KCkKKyAgICBpZiBkZXBfZmlsZSBpbiBhbGxfc3RhdGljX2RlcF9maWxlczoKKyAgICAgICMgSXQgaGFzIGJlZW4gcHJvY2Vzc2VkCisgICAgICBjb250aW51ZQorCisgICAgYWxsX3N0YXRpY19kZXBfZmlsZXNbZGVwX2ZpbGVdID0gVHJ1ZQorICAgIHNvb25nX21vZHVsZSA9IGRiLmdldF9zb29uZ19tb2R1bGVfb2ZfYnVpbHRfZmlsZShkZXBfZmlsZSkKKyAgICBpZiBub3Qgc29vbmdfbW9kdWxlOgorICAgICAgIyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBhZGQgdG8gcmVwb3J0W0lTU1VFX05PX01PRFVMRV9GT1VORF9GT1JfU1RBVElDX0RFUF0KKyAgICAgIHJlcG9ydFtJU1NVRV9OT19NT0RVTEVfRk9VTkRfRk9SX1NUQVRJQ19ERVBdLmFwcGVuZChmKQorICAgICAgY29udGludWUKKworICAgIGlmIHNvb25nX21vZHVsZVsnc3RhdGljX2RlcF9maWxlcyddOgorICAgICAgZm9yIGYgaW4gc29vbmdfbW9kdWxlWydzdGF0aWNfZGVwX2ZpbGVzJ10uc3BsaXQoJyAnKToKKyAgICAgICAgaWYgZiBub3QgaW4gYWxsX3N0YXRpY19kZXBfZmlsZXM6CisgICAgICAgICAgcS5wdXQoZikKKyAgICBpZiBzb29uZ19tb2R1bGVbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICAgIGZvciBmIGluIHNvb25nX21vZHVsZVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJyk6CisgICAgICAgIGlmIGYgbm90IGluIGFsbF9zdGF0aWNfZGVwX2ZpbGVzOgorICAgICAgICAgIHEucHV0KGYpCisKKyAgcmV0dXJuIHNvcnRlZChhbGxfc3RhdGljX2RlcF9maWxlcy5rZXlzKCkpCisKKworY2xhc3MgTWV0YWRhdGFEYjoKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRiKToKKyAgICBzZWxmLmNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoJzptZW1vcnknKQorICAgIHNlbGYuY29ubi5yb3dfZmFjdG9yeSA9IHNxbGl0ZTMuUm93CisgICAgd2l0aCBzcWxpdGUzLmNvbm5lY3QoZGIpIGFzIGM6CisgICAgICBjLmJhY2t1cChzZWxmLmNvbm4pCisgICAgc2VsZi5yZW9yZygpCisKKyAgZGVmIHJlb3JnKHNlbGYpOgorICAgICMgcGFja2FnZV9saWNlbnNlIHRhYmxlCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBwYWNrYWdlX2xpY2Vuc2UgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgbmFtZSBhcyBwYWNrYWdlLCBwa2dfZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzIGFzIGxpY2Vuc2UgIgorICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBtb2R1bGVfdHlwZSA9ICdwYWNrYWdlJyAiKQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCJzZWxlY3QgcGFja2FnZSxsaWNlbnNlIGZyb20gcGFja2FnZV9saWNlbnNlIHdoZXJlIGxpY2Vuc2UgbGlrZSAnJSAlJyIpCisgICAgbXVsdGlfbGljZW5zZXNfcGFja2FnZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIHAgaW4gbXVsdGlfbGljZW5zZXNfcGFja2FnZXM6CisgICAgICBsaWNlbnNlcyA9IHBbJ2xpY2Vuc2UnXS5zdHJpcCgpLnNwbGl0KCcgJykKKyAgICAgIGZvciBsaWMgaW4gbGljZW5zZXM6CisgICAgICAgIHJvd3MuYXBwZW5kKChwWydwYWNrYWdlJ10sIGxpYykpCisgICAgc2VsZi5jb25uLmV4ZWN1dGVtYW55KCdpbnNlcnQgaW50byBwYWNrYWdlX2xpY2Vuc2UgdmFsdWVzICg/LCA/KScsIHJvd3MpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gcGFja2FnZV9saWNlbnNlIHdoZXJlIGxpY2Vuc2UgbGlrZSAnJSAlJyIpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICAjIG1vZHVsZV9saWNlbnNlIHRhYmxlCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBtb2R1bGVfbGljZW5zZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBkaXN0aW5jdCBuYW1lIGFzIG1vZHVsZSwgcGFja2FnZSwgbGljZW5zZXMgYXMgbGljZW5zZSAiCisgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIGxpY2Vuc2VzICE9ICcnICIpCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBtb2R1bGUscGFja2FnZSxsaWNlbnNlIGZyb20gbW9kdWxlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKKyAgICBtdWx0aV9saWNlbnNlc19tb2R1bGVzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIHJvd3MgPSBbXQorICAgIGZvciBtIGluIG11bHRpX2xpY2Vuc2VzX21vZHVsZXM6CisgICAgICBsaWNlbnNlcyA9IG1bJ2xpY2Vuc2UnXS5zdHJpcCgpLnNwbGl0KCcgJykKKyAgICAgIGZvciBsaWMgaW4gbGljZW5zZXM6CisgICAgICAgIHJvd3MuYXBwZW5kKChtWydtb2R1bGUnXSwgbVsncGFja2FnZSddLGxpYykpCisgICAgc2VsZi5jb25uLmV4ZWN1dGVtYW55KCdpbnNlcnQgaW50byBtb2R1bGVfbGljZW5zZSB2YWx1ZXMgKD8sID8sID8pJywgcm93cykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIHNlbGYuY29ubi5leGVjdXRlKCJkZWxldGUgZnJvbSBtb2R1bGVfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgIyBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgdGFibGUKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBpZCBhcyBtb2R1bGVfaWQsIG5hbWUgYXMgbW9kdWxlX25hbWUsIHBhY2thZ2UsIGluc3RhbGxlZF9maWxlcyBhcyBpbnN0YWxsZWRfZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIGluc3RhbGxlZF9maWxlcyAhPSAnJyAiKQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCJzZWxlY3QgbW9kdWxlX2lkLCBtb2R1bGVfbmFtZSwgcGFja2FnZSwgaW5zdGFsbGVkX2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB3aGVyZSBpbnN0YWxsZWRfZmlsZSBsaWtlICclICUnIikKKyAgICBtdWx0aV9pbnN0YWxsZWRfZmlsZV9tb2R1bGVzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIHJvd3MgPSBbXQorICAgIGZvciBtIGluIG11bHRpX2luc3RhbGxlZF9maWxlX21vZHVsZXM6CisgICAgICBpbnN0YWxsZWRfZmlsZXMgPSBtWydpbnN0YWxsZWRfZmlsZSddLnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgZm9yIGYgaW4gaW5zdGFsbGVkX2ZpbGVzOgorICAgICAgICByb3dzLmFwcGVuZCgobVsnbW9kdWxlX2lkJ10sIG1bJ21vZHVsZV9uYW1lJ10sIG1bJ3BhY2thZ2UnXSwgZikpCisgICAgc2VsZi5jb25uLmV4ZWN1dGVtYW55KCdpbnNlcnQgaW50byBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgdmFsdWVzICg/LCA/LCA/LCA/KScsIHJvd3MpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gbW9kdWxlX2luc3RhbGxlZF9maWxlIHdoZXJlIGluc3RhbGxlZF9maWxlIGxpa2UgJyUgJSciKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgIyBtb2R1bGVfYnVpbHRfZmlsZSB0YWJsZQorICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgbW9kdWxlX2J1aWx0X2ZpbGUgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgaWQgYXMgbW9kdWxlX2lkLCBuYW1lIGFzIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBidWlsdF9maWxlcyBhcyBidWlsdF9maWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgYnVpbHRfZmlsZXMgIT0gJycgIikKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IG1vZHVsZV9pZCwgbW9kdWxlX25hbWUsIHBhY2thZ2UsIGJ1aWx0X2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZV9idWlsdF9maWxlIHdoZXJlIGJ1aWx0X2ZpbGUgbGlrZSAnJSAlJyIpCisgICAgbXVsdGlfYnVpbHRfZmlsZV9tb2R1bGVzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIHJvd3MgPSBbXQorICAgIGZvciBtIGluIG11bHRpX2J1aWx0X2ZpbGVfbW9kdWxlczoKKyAgICAgIGJ1aWx0X2ZpbGVzID0gbVsnaW5zdGFsbGVkX2ZpbGUnXS5zdHJpcCgpLnNwbGl0KCcgJykKKyAgICAgIGZvciBmIGluIGJ1aWx0X2ZpbGVzOgorICAgICAgICByb3dzLmFwcGVuZCgobVsnbW9kdWxlX2lkJ10sIG1bJ21vZHVsZV9uYW1lJ10sIG1bJ3BhY2thZ2UnXSwgZikpCisgICAgc2VsZi5jb25uLmV4ZWN1dGVtYW55KCdpbnNlcnQgaW50byBtb2R1bGVfYnVpbHRfZmlsZSB2YWx1ZXMgKD8sID8sID8sID8pJywgcm93cykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIHNlbGYuY29ubi5leGVjdXRlKCJkZWxldGUgZnJvbSBtb2R1bGVfYnVpbHRfZmlsZSB3aGVyZSBidWlsdF9maWxlIGxpa2UgJyUgJSciKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisKKyAgICAjIEluZGV4ZXMKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVzX2lkIG9uIG1vZHVsZXMgKGlkKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlc19uYW1lIG9uIG1vZHVsZXMgKG5hbWUpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9wYWNrYWdlX2xpY25lc2VfcGFja2FnZSBvbiBwYWNrYWdlX2xpY2Vuc2UgKHBhY2thZ2UpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9wYWNrYWdlX2xpY25lc2VfbGljZW5zZSBvbiBwYWNrYWdlX2xpY2Vuc2UgKGxpY2Vuc2UpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfbGljbmVzZV9tb2R1bGUgb24gbW9kdWxlX2xpY2Vuc2UgKG1vZHVsZSknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9saWNuZXNlX2xpY2Vuc2Ugb24gbW9kdWxlX2xpY2Vuc2UgKGxpY2Vuc2UpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfaW5zdGFsbGVkX2ZpbGVfbW9kdWxlX2lkIG9uIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSAobW9kdWxlX2lkKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2luc3RhbGxlZF9maWxlX2luc3RhbGxlZF9maWxlIG9uIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSAoaW5zdGFsbGVkX2ZpbGUpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfYnVpbHRfZmlsZV9tb2R1bGVfaWQgb24gbW9kdWxlX2J1aWx0X2ZpbGUgKG1vZHVsZV9pZCknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9idWlsdF9maWxlX2J1aWx0X2ZpbGUgb24gbW9kdWxlX2J1aWx0X2ZpbGUgKGJ1aWx0X2ZpbGUpJykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIGlmIGFyZ3MuZGVidWc6CisgICAgICB3aXRoIHNxbGl0ZTMuY29ubmVjdChvcy5wYXRoLmRpcm5hbWUoYXJncy5tZXRhZGF0YSkgKyAnL2NvbXBsaWFuY2UtbWV0YWRhdGEtZGVidWcuZGInKSBhcyBjOgorICAgICAgICBzZWxmLmNvbm4uYmFja3VwKGMpCisKKworICBkZWYgZ2V0X2luc3RhbGxlZF9maWxlcyhzZWxmKToKKyAgICAjIEdldCBhbGwgcmVjb3JkcyBmcm9tIHRhYmxlIG1ha2VfbWV0YWRhdGEsIHdoaWNoIGNvbnRhaW5zIGFsbCBpbnN0YWxsZWQgZmlsZXMgYW5kIGNvcnJlc3BvbmRpbmcgbWFrZSBtb2R1bGVzJyBtZXRhZGF0YQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgaW5zdGFsbGVkX2ZpbGUsIG1vZHVsZV9wYXRoLCBpc19wcmVidWlsdF9tYWtlX21vZHVsZSwgcHJvZHVjdF9jb3B5X2ZpbGVzLCBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsIGlzX3BsYXRmb3JtX2dlbmVyYXRlZCwgbGljZW5zZV90ZXh0IGZyb20gbWFrZV9tZXRhZGF0YScpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEgPSBbXQorICAgIGZvciByb3cgaW4gcm93czoKKyAgICAgIG1ldGFkYXRhID0gZGljdCh6aXAocm93LmtleXMoKSwgcm93KSkKKyAgICAgIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YS5hcHBlbmQobWV0YWRhdGEpCisgICAgcmV0dXJuIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YQorCisgIGRlZiBnZXRfc29vbmdfbW9kdWxlcyhzZWxmKToKKyAgICAjIEdldCBhbGwgcmVjb3JkcyBmcm9tIHRhYmxlIG1vZHVsZXMsIHdoaWNoIGNvbnRhaW5zIG1ldGFkYXRhIG9mIGFsbCBzb29uZyBtb2R1bGVzCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBuYW1lLCBwYWNrYWdlLCBwYWNrYWdlIGFzIG1vZHVsZV9wYXRoLCBtb2R1bGVfdHlwZSBhcyBzb29uZ19tb2R1bGVfdHlwZSwgYnVpbHRfZmlsZXMsIGluc3RhbGxlZF9maWxlcywgc3RhdGljX2RlcF9maWxlcywgd2hvbGVfc3RhdGljX2RlcF9maWxlcyBmcm9tIG1vZHVsZXMnKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgc29vbmdfbW9kdWxlcyA9IFtdCisgICAgZm9yIHJvdyBpbiByb3dzOgorICAgICAgc29vbmdfbW9kdWxlID0gZGljdCh6aXAocm93LmtleXMoKSwgcm93KSkKKyAgICAgIHNvb25nX21vZHVsZXMuYXBwZW5kKHNvb25nX21vZHVsZSkKKyAgICByZXR1cm4gc29vbmdfbW9kdWxlcworCisgIGRlZiBnZXRfcGFja2FnZV9saWNlbnNlcyhzZWxmLCBwYWNrYWdlKToKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG0ubmFtZSwgbS5wYWNrYWdlLCBtLmxpY19saWNlbnNlX3RleHQgYXMgbGljZW5zZV90ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBwYWNrYWdlX2xpY2Vuc2UgcGwgam9pbiBtb2R1bGVzIG0gb24gcGwubGljZW5zZSA9IG0ubmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIHBsLnBhY2thZ2UgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy8vJyArIHBhY2thZ2UsKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBsaWNlbnNlcyA9IHt9CisgICAgZm9yIHIgaW4gcm93czoKKyAgICAgIGxpY2Vuc2VzW3JbJ25hbWUnXV0gPSByWydsaWNlbnNlX3RleHQnXQorICAgIHJldHVybiBsaWNlbnNlcworCisgIGRlZiBnZXRfbW9kdWxlX2xpY2Vuc2VzKHNlbGYsIG1vZHVsZV9uYW1lLCBwYWNrYWdlKToKKyAgICBsaWNlbnNlcyA9IHt9CisgICAgIyBJZiBwcm9wZXJ0eSAibGljZW5zZXMiIGlzIGRlZmluZWQgb24gbW9kdWxlCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBtLm5hbWUsIG0ucGFja2FnZSwgbS5saWNfbGljZW5zZV90ZXh0IGFzIGxpY2Vuc2VfdGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbW9kdWxlX2xpY2Vuc2UgbWwgam9pbiBtb2R1bGVzIG0gb24gbWwubGljZW5zZSA9IG0ubmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIG1sLm1vZHVsZSA9ID8gYW5kIG1sLnBhY2thZ2UgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kdWxlX25hbWUsIHBhY2thZ2UpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGZvciByIGluIHJvd3M6CisgICAgICBsaWNlbnNlc1tyWyduYW1lJ11dID0gclsnbGljZW5zZV90ZXh0J10KKyAgICBpZiBsZW4obGljZW5zZXMpID4gMDoKKyAgICAgIHJldHVybiBsaWNlbnNlcworCisgICAgIyBVc2UgZGVmYXVsdCBwYWNrYWdlIGxpY2Vuc2UKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG0ubmFtZSwgbS5wYWNrYWdlLCBtLmxpY19saWNlbnNlX3RleHQgYXMgbGljZW5zZV90ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBwYWNrYWdlX2xpY2Vuc2UgcGwgam9pbiBtb2R1bGVzIG0gb24gcGwubGljZW5zZSA9IG0ubmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIHBsLnBhY2thZ2UgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy8vJyArIHBhY2thZ2UsKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBmb3IgciBpbiByb3dzOgorICAgICAgbGljZW5zZXNbclsnbmFtZSddXSA9IHJbJ2xpY2Vuc2VfdGV4dCddCisgICAgcmV0dXJuIGxpY2Vuc2VzCisKKyAgZGVmIGdldF9zb29uZ19tb2R1bGVfb2ZfaW5zdGFsbGVkX2ZpbGUoc2VsZiwgaW5zdGFsbGVkX2ZpbGUpOgorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbmFtZSwgbS5wYWNrYWdlLCBtLnBhY2thZ2UgYXMgbW9kdWxlX3BhdGgsIG1vZHVsZV90eXBlIGFzIHNvb25nX21vZHVsZV90eXBlLCBidWlsdF9maWxlcywgaW5zdGFsbGVkX2ZpbGVzLCBzdGF0aWNfZGVwX2ZpbGVzLCB3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBtb2R1bGVzIG0gam9pbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgbWlmIG9uIG0uaWQgPSBtaWYubW9kdWxlX2lkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgbWlmLmluc3RhbGxlZF9maWxlID0gPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluc3RhbGxlZF9maWxlLCkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBpZiByb3dzOgorICAgICAgc29vbmdfbW9kdWxlID0gZGljdCh6aXAocm93c1swXS5rZXlzKCksIHJvd3NbMF0pKQorICAgICAgcmV0dXJuIHNvb25nX21vZHVsZQorCisgICAgcmV0dXJuIE5vbmUKKworICBkZWYgZ2V0X3Nvb25nX21vZHVsZV9vZl9idWlsdF9maWxlKHNlbGYsIGJ1aWx0X2ZpbGUpOgorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbmFtZSwgbS5wYWNrYWdlLCBtLnBhY2thZ2UgYXMgbW9kdWxlX3BhdGgsIG1vZHVsZV90eXBlIGFzIHNvb25nX21vZHVsZV90eXBlLCBidWlsdF9maWxlcywgaW5zdGFsbGVkX2ZpbGVzLCBzdGF0aWNfZGVwX2ZpbGVzLCB3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBtb2R1bGVzIG0gam9pbiBtb2R1bGVfYnVpbHRfZmlsZSBtYmYgb24gbS5pZCA9IG1iZi5tb2R1bGVfaWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBtYmYuYnVpbHRfZmlsZSA9ID8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWlsdF9maWxlLCkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBpZiByb3dzOgorICAgICAgc29vbmdfbW9kdWxlID0gZGljdCh6aXAocm93c1swXS5rZXlzKCksIHJvd3NbMF0pKQorICAgICAgcmV0dXJuIHNvb25nX21vZHVsZQorCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgbWFpbigpOgorICBnbG9iYWwgYXJncworICBhcmdzID0gZ2V0X2FyZ3MoKQorICBsb2coJ0FyZ3M6JywgdmFycyhhcmdzKSkKKworICBnbG9iYWwgZGIKKyAgZGIgPSBNZXRhZGF0YURiKGFyZ3MubWV0YWRhdGEpCisgIGdsb2JhbCBtZXRhZGF0YV9maWxlX3Byb3RvcworICBtZXRhZGF0YV9maWxlX3Byb3RvcyA9IHt9CisgIGdsb2JhbCBsaWNlbnNlc190ZXh0CisgIGxpY2Vuc2VzX3RleHQgPSB7fQorCisgIHByb2R1Y3RfcGFja2FnZV9pZCA9IHNib21fZGF0YS5TUERYSURfUFJPRFVDVAorICBwcm9kdWN0X3BhY2thZ2VfbmFtZSA9IHNib21fZGF0YS5QQUNLQUdFX05BTUVfUFJPRFVDVAorICBwcm9kdWN0X3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD1wcm9kdWN0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9cHJvZHVjdF9wYWNrYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPWFyZ3MuYnVpbGRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9J09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzX2FuYWx5emVkPVRydWUpCisgIGRvY19uYW1lID0gYXJncy5idWlsZF92ZXJzaW9uCisgIGRvYyA9IHNib21fZGF0YS5Eb2N1bWVudChuYW1lPWRvY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPWYnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zYm9tL3NwZHgvYW5kcm9pZC97ZG9jX25hbWV9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JzPVsnT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZXM9cHJvZHVjdF9wYWNrYWdlX2lkKQorCisgIGRvYy5wYWNrYWdlcy5hcHBlbmQocHJvZHVjdF9wYWNrYWdlKQorICBkb2MucGFja2FnZXMuYXBwZW5kKHNib21fZGF0YS5QYWNrYWdlKGlkPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1zYm9tX2RhdGEuUEFDS0FHRV9OQU1FX1BMQVRGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249YXJncy5idWlsZF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPSdPcmdhbml6YXRpb246ICcgKyBhcmdzLnByb2R1Y3RfbWZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXSkpCisKKyAgIyBSZXBvcnQgb24gc29tZSBpc3N1ZXMgYW5kIGluZm9ybWF0aW9uCisgIHJlcG9ydCA9IHsKKyAgICAgIElTU1VFX05PX01FVEFEQVRBOiBbXSwKKyAgICAgIElTU1VFX05PX01FVEFEQVRBX0ZJTEU6IFtdLAorICAgICAgSVNTVUVfTUVUQURBVEFfRklMRV9JTkNPTVBMRVRFOiBbXSwKKyAgICAgIElTU1VFX1VOS05PV05fU0VDVVJJVFlfVEFHX1RZUEU6IFtdLAorICAgICAgSVNTVUVfSU5TVEFMTEVEX0ZJTEVfTk9UX0VYSVNUOiBbXSwKKyAgICAgIElTU1VFX05PX01PRFVMRV9GT1VORF9GT1JfU1RBVElDX0RFUDogW10sCisgICAgICBJTkZPX01FVEFEQVRBX0ZPVU5EX0ZPUl9QQUNLQUdFOiBbXSwKKyAgfQorCisgICMgR2V0IGluc3RhbGxlZCBmaWxlcyBhbmQgY29ycmVzcG9uZGluZyBtYWtlIG1vZHVsZXMnIG1ldGFkYXRhIGlmIGFuIGluc3RhbGxlZCBmaWxlIGlzIGZyb20gYSBtYWtlIG1vZHVsZS4KKyAgaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhID0gZGIuZ2V0X2luc3RhbGxlZF9maWxlcygpCisKKyAgIyBGaW5kIHdoaWNoIFNvb25nIG1vZHVsZSBhbiBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIGFuZCBtZXJnZSBtZXRhZGF0YSBmcm9tIE1ha2UgYW5kIFNvb25nCisgIGZvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSBpbiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGE6CisgICAgc29vbmdfbW9kdWxlID0gZGIuZ2V0X3Nvb25nX21vZHVsZV9vZl9pbnN0YWxsZWRfZmlsZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXSkKKyAgICBpZiBzb29uZ19tb2R1bGU6CisgICAgICAjIE1lcmdlIHNvb25nIG1ldGFkYXRhIHRvIG1ha2UgbWV0YWRhdGEKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhLnVwZGF0ZShzb29uZ19tb2R1bGUpCisgICAgZWxzZToKKyAgICAgICMgRm9yIG1ha2UgbW9kdWxlcyBzb29uZ19tb2R1bGVfdHlwZSBzaG91bGQgYmUgZW1wdHkKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzb29uZ19tb2R1bGVfdHlwZSddID0gJycKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzdGF0aWNfZGVwX2ZpbGVzJ10gPSAnJworICAgICAgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXSA9ICcnCisKKyAgIyBTY2FuIHRoZSBtZXRhZGF0YSBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UgYW5kIGZpbGUgcmVjb3JkcyBpbiBTUERYCisgIGZvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSBpbiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGE6CisgICAgaW5zdGFsbGVkX2ZpbGUgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXQorICAgIG1vZHVsZV9wYXRoID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgICBwcm9kdWN0X2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsncHJvZHVjdF9jb3B5X2ZpbGVzJ10KKyAgICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10KKyAgICBidWlsZF9vdXRwdXRfcGF0aCA9IGluc3RhbGxlZF9maWxlCisgICAgaW5zdGFsbGVkX2ZpbGUgPSBpbnN0YWxsZWRfZmlsZS5yZW1vdmVwcmVmaXgoYXJncy5wcm9kdWN0X291dCkKKworICAgIGlmIG5vdCBpbnN0YWxsZWRfZmlsZV9oYXNfbWV0YWRhdGEoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CisgICAgICBjb250aW51ZQorICAgIGlmIG5vdCAob3MucGF0aC5pc2xpbmsoYnVpbGRfb3V0cHV0X3BhdGgpIG9yIG9zLnBhdGguaXNmaWxlKGJ1aWxkX291dHB1dF9wYXRoKSk6CisgICAgICByZXBvcnRbSVNTVUVfSU5TVEFMTEVEX0ZJTEVfTk9UX0VYSVNUXS5hcHBlbmQoaW5zdGFsbGVkX2ZpbGUpCisgICAgICBjb250aW51ZQorCisgICAgZmlsZV9pZCA9IG5ld19maWxlX2lkKGluc3RhbGxlZF9maWxlKQorICAgIHNoYTEgPSBjaGVja3N1bShidWlsZF9vdXRwdXRfcGF0aCkKKyAgICBmID0gc2JvbV9kYXRhLkZpbGUoaWQ9ZmlsZV9pZCwgbmFtZT1pbnN0YWxsZWRfZmlsZSwgY2hlY2tzdW09c2hhMSkKKyAgICBkb2MuZmlsZXMuYXBwZW5kKGYpCisgICAgcHJvZHVjdF9wYWNrYWdlLmZpbGVfaWRzLmFwcGVuZChmaWxlX2lkKQorCisgICAgaWYgaXNfc291cmNlX3BhY2thZ2UoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEpIG9yIGlzX3ByZWJ1aWx0X3BhY2thZ2UoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEpOgorICAgICAgYWRkX3BhY2thZ2Vfb2ZfZmlsZShmaWxlX2lkLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgZG9jLCByZXBvcnQpCisKKyAgICBlbGlmIG1vZHVsZV9wYXRoIG9yIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpc19wbGF0Zm9ybV9nZW5lcmF0ZWQnXToKKyAgICAgICMgRmlsZSBmcm9tIFBMQVRGT1JNIHBhY2thZ2UKKyAgICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5HRU5FUkFURURfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0pKQorICAgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2lzX3BsYXRmb3JtX2dlbmVyYXRlZCddOgorICAgICAgICBmLmNvbmNsdWRlZF9saWNlbnNlX2lkcyA9IFtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXQorCisgICAgZWxpZiBwcm9kdWN0X2NvcHlfZmlsZXM6CisgICAgICAjIEZvcm1hdCBvZiBwcm9kdWN0X2NvcHlfZmlsZXM6IDxzb3VyY2UgcGF0aD46PGRlc3QgcGF0aD4KKyAgICAgIHNyY19wYXRoID0gcHJvZHVjdF9jb3B5X2ZpbGVzLnNwbGl0KCc6JylbMF0KKyAgICAgICMgU28gZmFyIHByb2R1Y3RfY29weV9maWxlcyBhcmUgY29waWVkIGZyb20gZGlyZWN0b3J5IHN5c3RlbSwga2VybmVsLCBoYXJkd2FyZSwgZnJhbWV3b3JrcyBhbmQgZGV2aWNlLAorICAgICAgIyBzbyBwcm9jZXNzIHRoZW0gYXMgZmlsZXMgZnJvbSBQTEFURk9STSBwYWNrYWdlCisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKKyAgICAgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydsaWNlbnNlX3RleHQnXToKKyAgICAgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2xpY2Vuc2VfdGV4dCddID09ICdidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFJzoKKyAgICAgICAgICBmLmNvbmNsdWRlZF9saWNlbnNlX2lkcyA9IFtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXQorCisgICAgZWxpZiBpbnN0YWxsZWRfZmlsZS5lbmRzd2l0aCgnLmZzdl9tZXRhJyk6CisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKKyAgICAgIGYuY29uY2x1ZGVkX2xpY2Vuc2VfaWRzID0gW3Nib21fZGF0YS5TUERYSURfTElDRU5TRV9BUEFDSEVdCisKKyAgICBlbGlmIGtlcm5lbF9tb2R1bGVfY29weV9maWxlcy5zdGFydHN3aXRoKCdBTkRST0lELUdFTicpOgorICAgICAgIyBGb3IgdGhlIGZvdXIgZmlsZXMgZ2VuZXJhdGVkIGZvciBfZGxrbSwgX3JhbWRpc2sgcGFydGl0aW9ucworICAgICAgZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9ZmlsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9c2JvbV9kYXRhLlNQRFhJRF9QTEFURk9STSkpCisKKyAgICAjIFByb2Nlc3Mgc3RhdGljIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5zdGFsbGVkIGZpbGUKKyAgICBhZGRfc3RhdGljX2RlcHNfb2ZfZmlsZShmaWxlX2lkLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgZG9jKQorCisgICAgIyBBZGQgbGljZW5zZXMgb2YgdGhlIGluc3RhbGxlZCBmaWxlCisgICAgYWRkX2xpY2Vuc2VzX29mX2ZpbGUoZmlsZV9pZCwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIGRvYykKKworICAjIEFkZCBhbGwgc3RhdGljIGxpYnJhcnkgZmlsZXMgdG8gU0JPTQorICBmb3IgZGVwX2ZpbGUgaW4gZ2V0X2FsbF90cmFuc2l0aXZlX3N0YXRpY19kZXBfZmlsZXNfb2ZfaW5zdGFsbGVkX2ZpbGVzKGluc3RhbGxlZF9maWxlc19tZXRhZGF0YSwgZGIsIHJlcG9ydCk6CisgICAgZmlsZXBhdGggPSBkZXBfZmlsZS5yZW1vdmVwcmVmaXgoYXJncy5zb29uZ19vdXQgKyAnLy5pbnRlcm1lZGlhdGVzLycpCisgICAgZmlsZV9pZCA9IG5ld19maWxlX2lkKGZpbGVwYXRoKQorICAgICMgU0hBMSBvZiBlbXB0eSBzdHJpbmcuIFNvbWV0aW1lcyAuYSBmaWxlcyBtaWdodCBub3QgYmUgYnVpbHQuCisgICAgc2hhMSA9ICdTSEExOiBkYTM5YTNlZTVlNmI0YjBkMzI1NWJmZWY5NTYwMTg5MGFmZDgwNzA5JworICAgIGlmIG9zLnBhdGguaXNsaW5rKGRlcF9maWxlKSBvciBvcy5wYXRoLmlzZmlsZShkZXBfZmlsZSk6CisgICAgICBzaGExID0gY2hlY2tzdW0oZGVwX2ZpbGUpCisgICAgZG9jLmZpbGVzLmFwcGVuZChzYm9tX2RhdGEuRmlsZShpZD1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1maWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPXNoYTEpKQorICAgIGZpbGVfbWV0YWRhdGEgPSB7CisgICAgICAgICdpbnN0YWxsZWRfZmlsZSc6IGRlcF9maWxlLAorICAgICAgICAnaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUnOiBGYWxzZQorICAgIH0KKyAgICBmaWxlX21ldGFkYXRhLnVwZGF0ZShkYi5nZXRfc29vbmdfbW9kdWxlX29mX2J1aWx0X2ZpbGUoZGVwX2ZpbGUpKQorICAgIGFkZF9wYWNrYWdlX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jLCByZXBvcnQpCisKKyAgICAjIEFkZCByZWxhdGlvbnNoaXBzIGZvciBzdGF0aWMgZGVwcyBvZiBzdGF0aWMgbGlicmFyaWVzCisgICAgYWRkX3N0YXRpY19kZXBzX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jKQorCisgICAgIyBBZGQgbGljZW5zZXMgb2YgdGhlIHN0YXRpYyBsaWIKKyAgICBhZGRfbGljZW5zZXNfb2ZfZmlsZShmaWxlX2lkLCBmaWxlX21ldGFkYXRhLCBkb2MpCisKKyAgIyBTYXZlIFNCT00gcmVjb3JkcyB0byBvdXRwdXQgZmlsZQorICBkb2MuZ2VuZXJhdGVfcGFja2FnZXNfdmVyaWZpY2F0aW9uX2NvZGUoKQorICBkb2MuY3JlYXRlZCA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdyh0ej1kYXRldGltZS50aW1lem9uZS51dGMpLnN0cmZ0aW1lKCclWS0lbS0lZFQlSDolTTolU1onKQorICBwcmVmaXggPSBhcmdzLm91dHB1dF9maWxlCisgIGlmIHByZWZpeC5lbmRzd2l0aCgnLnNwZHgnKToKKyAgICBwcmVmaXggPSBwcmVmaXgucmVtb3Zlc3VmZml4KCcuc3BkeCcpCisgIGVsaWYgcHJlZml4LmVuZHN3aXRoKCcuc3BkeC5qc29uJyk6CisgICAgcHJlZml4ID0gcHJlZml4LnJlbW92ZXN1ZmZpeCgnLnNwZHguanNvbicpCisKKyAgb3V0cHV0X2ZpbGUgPSBwcmVmaXggKyAnLnNwZHgnCisgIHdpdGggb3BlbihvdXRwdXRfZmlsZSwgJ3cnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlOgorICAgIHNib21fd3JpdGVycy5UYWdWYWx1ZVdyaXRlci53cml0ZShkb2MsIGZpbGUpCisgIGlmIGFyZ3MuanNvbjoKKyAgICB3aXRoIG9wZW4ocHJlZml4ICsgJy5zcGR4Lmpzb24nLCAndycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZpbGU6CisgICAgICBzYm9tX3dyaXRlcnMuSlNPTldyaXRlci53cml0ZShkb2MsIGZpbGUpCisKKyAgc2F2ZV9yZXBvcnQocHJlZml4ICsgJy1nZW4tcmVwb3J0LnR4dCcsIHJlcG9ydCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzLnB5IGIvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKaW5kZXggZDBkMjMyZC4uMjdmM2QyZSAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKKysrIGIvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKQEAgLTgwLDcgKzgwLDggQEAKIAogICByZXNvdXJjZV9maWxlX3NwZHhpZHMgPSBbXQogICBmb3IgZmlsZSBpbiBsYXlvdXRsaWJfc2JvbVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLkZJTEVTXToKLSAgICBpZiBmaWxlW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuRklMRV9OQU1FXS5zdGFydHN3aXRoKCdkYXRhL3Jlcy8nKToKKyAgICBmaWxlX3BhdGggPSBmaWxlW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuRklMRV9OQU1FXQorICAgIGlmIGZpbGVfcGF0aC5zdGFydHN3aXRoKCdkYXRhL3Jlcy8nKSBvciBmaWxlX3BhdGguc3RhcnRzd2l0aCgnZGF0YS9vdmVybGF5cy8nKToKICAgICAgIHJlc291cmNlX2ZpbGVfc3BkeGlkcy5hcHBlbmQoZmlsZVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLlNQRFhJRF0pCiAKICAgZG9jLnJlbGF0aW9uc2hpcHMgPSBbCmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Nib21fZGF0YS5weSBiL3Rvb2xzL3Nib20vc2JvbV9kYXRhLnB5CmluZGV4IGI1YWM4YTUuLmZjNWM3MDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vc2JvbV9kYXRhLnB5CisrKyBiL3Rvb2xzL3Nib20vc2JvbV9kYXRhLnB5CkBAIC0zMCw2ICszMCw3IEBACiBTUERYSURfRE9DID0gJ1NQRFhSZWYtRE9DVU1FTlQnCiBTUERYSURfUFJPRFVDVCA9ICdTUERYUmVmLVBST0RVQ1QnCiBTUERYSURfUExBVEZPUk0gPSAnU1BEWFJlZi1QTEFURk9STScKK1NQRFhJRF9MSUNFTlNFX0FQQUNIRSA9ICdMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMCcKIAogUEFDS0FHRV9OQU1FX1BST0RVQ1QgPSAnUFJPRFVDVCcKIFBBQ0tBR0VfTkFNRV9QTEFURk9STSA9ICdQTEFURk9STScKQEAgLTUwLDcgKzUxLDcgQEAKICAgY3BlMjNUeXBlID0gJ2NwZTIzVHlwZScKIAogCi1AZGF0YWNsYXNzCitAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQogY2xhc3MgUGFja2FnZUV4dGVybmFsUmVmOgogICBjYXRlZ29yeTogUGFja2FnZUV4dGVybmFsUmVmQ2F0ZWdvcnkKICAgdHlwZTogUGFja2FnZUV4dGVybmFsUmVmVHlwZQpAQCAtNjgsNiArNjksNyBAQAogICB2ZXJpZmljYXRpb25fY29kZTogc3RyID0gTm9uZQogICBmaWxlX2lkczogTGlzdFtzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgIGV4dGVybmFsX3JlZnM6IExpc3RbUGFja2FnZUV4dGVybmFsUmVmXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQorICBkZWNsYXJlZF9saWNlbnNlX2lkczogTGlzdFtzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAKIAogQGRhdGFjbGFzcwpAQCAtNzUsNiArNzcsNyBAQAogICBpZDogc3RyCiAgIG5hbWU6IHN0cgogICBjaGVja3N1bTogc3RyCisgIGNvbmNsdWRlZF9saWNlbnNlX2lkczogTGlzdFtzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAKIAogY2xhc3MgUmVsYXRpb25zaGlwVHlwZToKQEAgLTg1LDIwICs4OCwyNyBAQAogICBTVEFUSUNfTElOSyA9ICdTVEFUSUNfTElOSycKIAogCi1AZGF0YWNsYXNzCitAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQogY2xhc3MgUmVsYXRpb25zaGlwOgogICBpZDE6IHN0cgogICByZWxhdGlvbnNoaXA6IFJlbGF0aW9uc2hpcFR5cGUKICAgaWQyOiBzdHIKIAogCi1AZGF0YWNsYXNzCitAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQogY2xhc3MgRG9jdW1lbnRFeHRlcm5hbFJlZmVyZW5jZToKICAgaWQ6IHN0cgogICB1cmk6IHN0cgogICBjaGVja3N1bTogc3RyCiAKIAorQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIExpY2Vuc2U6CisgIGlkOiBzdHIKKyAgdGV4dDogc3RyCisgIG5hbWU6IHN0cgorCisKIEBkYXRhY2xhc3MKIGNsYXNzIERvY3VtZW50OgogICBuYW1lOiBzdHIKQEAgLTExMSwyMCArMTIxLDMwIEBACiAgIHBhY2thZ2VzOiBMaXN0W1BhY2thZ2VdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgIGZpbGVzOiBMaXN0W0ZpbGVdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgIHJlbGF0aW9uc2hpcHM6IExpc3RbUmVsYXRpb25zaGlwXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQorICBsaWNlbnNlczogTGlzdFtMaWNlbnNlXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogCiAgIGRlZiBhZGRfZXh0ZXJuYWxfcmVmKHNlbGYsIGV4dGVybmFsX3JlZik6CiAgICAgaWYgbm90IGFueShleHRlcm5hbF9yZWYudXJpID09IHJlZi51cmkgZm9yIHJlZiBpbiBzZWxmLmV4dGVybmFsX3JlZnMpOgogICAgICAgc2VsZi5leHRlcm5hbF9yZWZzLmFwcGVuZChleHRlcm5hbF9yZWYpCiAKICAgZGVmIGFkZF9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgotICAgIGlmIG5vdCBhbnkocGFja2FnZS5pZCA9PSBwLmlkIGZvciBwIGluIHNlbGYucGFja2FnZXMpOgorICAgIHAgPSBuZXh0KChwIGZvciBwIGluIHNlbGYucGFja2FnZXMgaWYgcGFja2FnZS5pZCA9PSBwLmlkKSwgTm9uZSkKKyAgICBpZiBub3QgcDoKICAgICAgIHNlbGYucGFja2FnZXMuYXBwZW5kKHBhY2thZ2UpCisgICAgZWxzZToKKyAgICAgIGZvciBsaWNlbnNlX2lkIGluIHBhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHM6CisgICAgICAgIGlmIGxpY2Vuc2VfaWQgbm90IGluIHAuZGVjbGFyZWRfbGljZW5zZV9pZHM6CisgICAgICAgICAgcC5kZWNsYXJlZF9saWNlbnNlX2lkcy5hcHBlbmQobGljZW5zZV9pZCkKIAogICBkZWYgYWRkX3JlbGF0aW9uc2hpcChzZWxmLCByZWwpOgogICAgIGlmIG5vdCBhbnkocmVsLmlkMSA9PSByLmlkMSBhbmQgcmVsLmlkMiA9PSByLmlkMiBhbmQgcmVsLnJlbGF0aW9uc2hpcCA9PSByLnJlbGF0aW9uc2hpcAogICAgICAgICAgICAgICAgZm9yIHIgaW4gc2VsZi5yZWxhdGlvbnNoaXBzKToKICAgICAgIHNlbGYucmVsYXRpb25zaGlwcy5hcHBlbmQocmVsKQogCisgIGRlZiBhZGRfbGljZW5zZShzZWxmLCBsaWNlbnNlKToKKyAgICBpZiBub3QgYW55KGxpY2Vuc2UuaWQgPT0gbC5pZCBmb3IgbCBpbiBzZWxmLmxpY2Vuc2VzKToKKyAgICAgIHNlbGYubGljZW5zZXMuYXBwZW5kKGxpY2Vuc2UpCisKICAgZGVmIGdlbmVyYXRlX3BhY2thZ2VzX3ZlcmlmaWNhdGlvbl9jb2RlKHNlbGYpOgogICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXM6CiAgICAgICBpZiBub3QgcGFja2FnZS5maWxlX2lkczoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vc2JvbV9kYXRhX3Rlc3QucHkgYi90b29scy9zYm9tL3Nib21fZGF0YV90ZXN0LnB5CmluZGV4IDY5YmM5ZDIuLjlkOTg3YzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vc2JvbV9kYXRhX3Rlc3QucHkKKysrIGIvdG9vbHMvc2JvbS9zYm9tX2RhdGFfdGVzdC5weQpAQCAtMjMsNiArMjMsNyBAQAogU1VQUExJRVJfVVBTVFJFQU0gPSAnT3JnYW5pemF0aW9uOiB1cHN0cmVhbScKIAogU1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UxID0gJ1NQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTEnCitTUERYSURfUFJFQlVJTFRfUEFDS0FHRTIgPSAnU1BEWFJlZi1QUkVCVUlMVC1wYWNrYWdlMicKIFNQRFhJRF9TT1VSQ0VfUEFDS0FHRTEgPSAnU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEnCiBTUERYSURfVVBTVFJFQU1fUEFDS0FHRTEgPSAnU1BEWFJlZi1VUFNUUkVBTS1wYWNrYWdlMScKIApAQCAtMzEsNiArMzIsOSBAQAogU1BEWElEX0ZJTEUzID0gJ1NQRFhSZWYtZmlsZTMnCiBTUERYSURfRklMRTQgPSAnU1BEWFJlZi1maWxlNCcKIAorU1BEWElEX0xJQ0VOU0UxID0gIlNQRFhSZWYtTGljZW5zZS0xIgorU1BEWElEX0xJQ0VOU0UyID0gIlNQRFhSZWYtTGljZW5zZS0yIgorCiAKIGNsYXNzIFNCT01EYXRhVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTEzNCw2ICsxMzgsNDcgQEAKICAgICBzZWxmLnNib21fZG9jLmdlbmVyYXRlX3BhY2thZ2VzX3ZlcmlmaWNhdGlvbl9jb2RlKCkKICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3BhY2thZ2VfdmVyaWZpY2F0aW9uX2NvZGUsIHNlbGYuc2JvbV9kb2MucGFja2FnZXNbMF0udmVyaWZpY2F0aW9uX2NvZGUpCiAKKyAgZGVmIHRlc3RfYWRkX3BhY2thZ2VfKHNlbGYpOgorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2Uoc2JvbV9kYXRhLlBhY2thZ2UoaWQ9U1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nUHJlYnVpbHQgcGFja2FnZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgcCA9IG5leHQoKHAgZm9yIHAgaW4gc2VsZi5zYm9tX2RvYy5wYWNrYWdlcyBpZiBwLmlkID09IFNQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMiksIE5vbmUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwLCBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5kZWNsYXJlZF9saWNlbnNlX2lkcywgW10pCisKKyAgICAjIEFkZCBzYW1lIHBhY2thZ2Ugd2l0aCBsaWNlbnNlIDEKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKHNib21fZGF0YS5QYWNrYWdlKGlkPVNQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1ByZWJ1aWx0IHBhY2thZ2UyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bU1BEWElEX0xJQ0VOU0UxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHAuZGVjbGFyZWRfbGljZW5zZV9pZHMsIFtTUERYSURfTElDRU5TRTFdKQorCisgICAgIyBBZGQgc2FtZSBwYWNrYWdlIHdpdGggbGljZW5zZSAyCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZShzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdQcmVidWlsdCBwYWNrYWdlMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLCBbU1BEWElEX0xJQ0VOU0UxLCBTUERYSURfTElDRU5TRTJdKQorCisgICAgIyBBZGQgc2FtZSBwYWNrYWdlIHdpdGggbGljZW5zZSAyIGFnYWluCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZShzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdQcmVidWlsdCBwYWNrYWdlMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLCBbU1BEWElEX0xJQ0VOU0UxLCBTUERYSURfTElDRU5TRTJdKQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Nib21fd3JpdGVycy5weSBiL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzLnB5CmluZGV4IDFjYjg2NGQuLjI2YjNjNTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzLnB5CisrKyBiL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzLnB5CkBAIC02NCw2ICs2NCwxMSBAQAogICAjIFJlbGF0aW9uc2hpcAogICBSRUxBVElPTlNISVAgPSAnUmVsYXRpb25zaGlwJwogCisgICMgTGljZW5zZQorICBMSUNFTlNFX0lEID0gJ0xpY2Vuc2VJRCcKKyAgTElDRU5TRV9OQU1FID0gJ0xpY2Vuc2VOYW1lJworICBMSUNFTlNFX0VYVFJBQ1RFRF9URVhUID0gJ0V4dHJhY3RlZFRleHQnCisKIAogY2xhc3MgVGFnVmFsdWVXcml0ZXI6CiAgIEBzdGF0aWNtZXRob2QKQEAgLTk5LDYgKzEwNCwxMiBAQAogICAgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLlBBQ0tBR0VfVkVSU0lPTn06IHtwYWNrYWdlLnZlcnNpb259JykKICAgICBpZiBwYWNrYWdlLnN1cHBsaWVyOgogICAgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLlBBQ0tBR0VfU1VQUExJRVJ9OiB7cGFja2FnZS5zdXBwbGllcn0nKQorCisgICAgbGljZW5zZSA9IHNib21fZGF0YS5WQUxVRV9OT0FTU0VSVElPTgorICAgIGlmIHBhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHM6CisgICAgICBsaWNlbnNlID0gJyBPUiAnLmpvaW4ocGFja2FnZS5kZWNsYXJlZF9saWNlbnNlX2lkcykKKyAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuUEFDS0FHRV9MSUNFTlNFX0RFQ0xBUkVEfToge2xpY2Vuc2V9JykKKwogICAgIGlmIHBhY2thZ2UudmVyaWZpY2F0aW9uX2NvZGU6CiAgICAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuUEFDS0FHRV9WRVJJRklDQVRJT05fQ09ERX06IHtwYWNrYWdlLnZlcmlmaWNhdGlvbl9jb2RlfScpCiAgICAgaWYgcGFja2FnZS5leHRlcm5hbF9yZWZzOgpAQCAtMTU1LDggKzE2NiwxMiBAQAogICAgICAgZid7VGFncy5GSUxFX05BTUV9OiB7ZmlsZS5uYW1lfScsCiAgICAgICBmJ3tUYWdzLlNQRFhJRH06IHtmaWxlLmlkfScsCiAgICAgICBmJ3tUYWdzLkZJTEVfQ0hFQ0tTVU19OiB7ZmlsZS5jaGVja3N1bX0nLAotICAgICAgJycsCiAgICAgXQorICAgIGxpY2Vuc2UgPSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04KKyAgICBpZiBmaWxlLmNvbmNsdWRlZF9saWNlbnNlX2lkczoKKyAgICAgIGxpY2Vuc2UgPSAnIE9SICcuam9pbihmaWxlLmNvbmNsdWRlZF9saWNlbnNlX2lkcykKKyAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuRklMRV9MSUNFTlNFX0NPTkNMVURFRH06IHtsaWNlbnNlfScpCisgICAgdGFndmFsdWVzLmFwcGVuZCgnJykKIAogICAgIHJldHVybiB0YWd2YWx1ZXMKIApAQCAtMTk0LDYgKzIwOSwyMiBAQAogICAgIHJldHVybiB0YWd2YWx1ZXMKIAogICBAc3RhdGljbWV0aG9kCisgIGRlZiBtYXJzaGFsX2xpY2Vuc2UobGljZW5zZSk6CisgICAgdGFndmFsdWVzID0gW10KKyAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuTElDRU5TRV9JRH06IHtsaWNlbnNlLmlkfScpCisgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLkxJQ0VOU0VfTkFNRX06IHtsaWNlbnNlLm5hbWV9JykKKyAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuTElDRU5TRV9FWFRSQUNURURfVEVYVH06IDx0ZXh0PntsaWNlbnNlLnRleHR9PC90ZXh0PicpCisgICAgcmV0dXJuIHRhZ3ZhbHVlcworCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIG1hcnNoYWxfbGljZW5zZXMoc2JvbV9kb2MpOgorICAgIHRhZ3ZhbHVlcyA9IFtdCisgICAgZm9yIGxpY2Vuc2UgaW4gc2JvbV9kb2MubGljZW5zZXM6CisgICAgICB0YWd2YWx1ZXMgKz0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9saWNlbnNlKGxpY2Vuc2UpCisgICAgICB0YWd2YWx1ZXMuYXBwZW5kKCcnKQorICAgIHJldHVybiB0YWd2YWx1ZXMKKworICBAc3RhdGljbWV0aG9kCiAgIGRlZiB3cml0ZShzYm9tX2RvYywgZmlsZSwgZnJhZ21lbnQ9RmFsc2UpOgogICAgIGNvbnRlbnQgPSBbXQogICAgIGlmIG5vdCBmcmFnbWVudDoKQEAgLTIwMiw2ICsyMzMsNyBAQAogICAgIHRhZ3ZhbHVlcywgbWFyc2hhbGVkX3JlbGF0aW9uc2hpcHMgPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3BhY2thZ2VzKHNib21fZG9jLCBmcmFnbWVudCkKICAgICBjb250ZW50ICs9IHRhZ3ZhbHVlcwogICAgIGNvbnRlbnQgKz0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9yZWxhdGlvbnNoaXBzKHNib21fZG9jLCBtYXJzaGFsZWRfcmVsYXRpb25zaGlwcykKKyAgICBjb250ZW50ICs9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfbGljZW5zZXMoc2JvbV9kb2MpCiAgICAgZmlsZS53cml0ZSgnXG4nLmpvaW4oY29udGVudCkpCiAKIApAQCAtMjM2LDExICsyNjgsMTMgQEAKICAgUEFDS0FHRV9FWFRFUk5BTF9SRUZfVFlQRSA9ICdyZWZlcmVuY2VUeXBlJwogICBQQUNLQUdFX0VYVEVSTkFMX1JFRl9MT0NBVE9SID0gJ3JlZmVyZW5jZUxvY2F0b3InCiAgIFBBQ0tBR0VfSEFTX0ZJTEVTID0gJ2hhc0ZpbGVzJworICBQQUNLQUdFX0xJQ0VOU0VfREVDTEFSRUQgPSAnbGljZW5zZURlY2xhcmVkJwogCiAgICMgRmlsZQogICBGSUxFUyA9ICdmaWxlcycKICAgRklMRV9OQU1FID0gJ2ZpbGVOYW1lJwogICBGSUxFX0NIRUNLU1VNUyA9ICdjaGVja3N1bXMnCisgIEZJTEVfTElDRU5TRV9DT05DTFVERUQgPSAnbGljZW5zZUNvbmNsdWRlZCcKIAogICAjIFJlbGF0aW9uc2hpcAogICBSRUxBVElPTlNISVBTID0gJ3JlbGF0aW9uc2hpcHMnCkBAIC0yNDgsNiArMjgyLDEyIEBACiAgIFJFTF9SRUxBVEVEX0VMRU1FTlRfSUQgPSAncmVsYXRlZFNwZHhFbGVtZW50JwogICBSRUxfVFlQRSA9ICdyZWxhdGlvbnNoaXBUeXBlJwogCisgICMgTGljZW5zZQorICBMSUNFTlNFUyA9ICdoYXNFeHRyYWN0ZWRMaWNlbnNpbmdJbmZvcycKKyAgTElDRU5TRV9JRCA9ICdsaWNlbnNlSWQnCisgIExJQ0VOU0VfTkFNRSA9ICduYW1lJworICBMSUNFTlNFX0VYVFJBQ1RFRF9URVhUID0gJ2V4dHJhY3RlZFRleHQnCisKIAogY2xhc3MgSlNPTldyaXRlcjoKICAgQHN0YXRpY21ldGhvZApAQCAtMjk0LDYgKzMzNCw5IEBACiAgICAgICAgIHBhY2thZ2VbUHJvcE5hbWVzLlBBQ0tBR0VfVkVSU0lPTl0gPSBwLnZlcnNpb24KICAgICAgIGlmIHAuc3VwcGxpZXI6CiAgICAgICAgIHBhY2thZ2VbUHJvcE5hbWVzLlBBQ0tBR0VfU1VQUExJRVJdID0gcC5zdXBwbGllcgorICAgICAgcGFja2FnZVtQcm9wTmFtZXMuUEFDS0FHRV9MSUNFTlNFX0RFQ0xBUkVEXSA9IHNib21fZGF0YS5WQUxVRV9OT0FTU0VSVElPTgorICAgICAgaWYgcC5kZWNsYXJlZF9saWNlbnNlX2lkczoKKyAgICAgICAgcGFja2FnZVtQcm9wTmFtZXMuUEFDS0FHRV9MSUNFTlNFX0RFQ0xBUkVEXSA9ICcgT1IgJy5qb2luKHAuZGVjbGFyZWRfbGljZW5zZV9pZHMpCiAgICAgICBpZiBwLnZlcmlmaWNhdGlvbl9jb2RlOgogICAgICAgICBwYWNrYWdlW1Byb3BOYW1lcy5QQUNLQUdFX1ZFUklGSUNBVElPTl9DT0RFXSA9IHsKICAgICAgICAgICBQcm9wTmFtZXMuUEFDS0FHRV9WRVJJRklDQVRJT05fQ09ERV9WQUxVRTogcC52ZXJpZmljYXRpb25fY29kZQpAQCAtMzI5LDYgKzM3Miw5IEBACiAgICAgICAgIFByb3BOYW1lcy5BTEdPUklUSE06IGNoZWNrc3VtWzBdLAogICAgICAgICBQcm9wTmFtZXMuQ0hFQ0tTVU1fVkFMVUU6IGNoZWNrc3VtWzFdLAogICAgICAgfV0KKyAgICAgIGZpbGVbUHJvcE5hbWVzLkZJTEVfTElDRU5TRV9DT05DTFVERURdID0gc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OCisgICAgICBpZiBmLmNvbmNsdWRlZF9saWNlbnNlX2lkczoKKyAgICAgICAgZmlsZVtQcm9wTmFtZXMuRklMRV9MSUNFTlNFX0NPTkNMVURFRF0gPSAnIE9SICcuam9pbihmLmNvbmNsdWRlZF9saWNlbnNlX2lkcykKICAgICAgIGZpbGVzLmFwcGVuZChmaWxlKQogICAgIHJldHVybiB7UHJvcE5hbWVzLkZJTEVTOiBmaWxlc30KIApAQCAtMzQ3LDEwICszOTMsMjIgQEAKICAgICByZXR1cm4ge1Byb3BOYW1lcy5SRUxBVElPTlNISVBTOiByZWxhdGlvbnNoaXBzfQogCiAgIEBzdGF0aWNtZXRob2QKKyAgZGVmIG1hcnNoYWxfbGljZW5zZXMoc2JvbV9kb2MpOgorICAgIGxpY2Vuc2VzID0gW10KKyAgICBmb3IgbCBpbiBzYm9tX2RvYy5saWNlbnNlczoKKyAgICAgIGxpY2Vuc2VzLmFwcGVuZCh7CisgICAgICAgICAgUHJvcE5hbWVzLkxJQ0VOU0VfSUQ6IGwuaWQsCisgICAgICAgICAgUHJvcE5hbWVzLkxJQ0VOU0VfTkFNRTogbC5uYW1lLAorICAgICAgICAgIFByb3BOYW1lcy5MSUNFTlNFX0VYVFJBQ1RFRF9URVhUOiBmJzx0ZXh0PntsLnRleHR9PC90ZXh0PicKKyAgICAgIH0pCisgICAgcmV0dXJuIHtQcm9wTmFtZXMuTElDRU5TRVM6IGxpY2Vuc2VzfQorCisgIEBzdGF0aWNtZXRob2QKICAgZGVmIHdyaXRlKHNib21fZG9jLCBmaWxlKToKICAgICBkb2MgPSB7fQogICAgIGRvYy51cGRhdGUoSlNPTldyaXRlci5tYXJzaGFsX2RvY19oZWFkZXJzKHNib21fZG9jKSkKICAgICBkb2MudXBkYXRlKEpTT05Xcml0ZXIubWFyc2hhbF9wYWNrYWdlcyhzYm9tX2RvYykpCiAgICAgZG9jLnVwZGF0ZShKU09OV3JpdGVyLm1hcnNoYWxfZmlsZXMoc2JvbV9kb2MpKQogICAgIGRvYy51cGRhdGUoSlNPTldyaXRlci5tYXJzaGFsX3JlbGF0aW9uc2hpcHMoc2JvbV9kb2MpKQorICAgIGRvYy51cGRhdGUoSlNPTldyaXRlci5tYXJzaGFsX2xpY2Vuc2VzKHNib21fZG9jKSkKICAgICBmaWxlLndyaXRlKGpzb24uZHVtcHMoZG9jLCBpbmRlbnQ9NCkpCmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Nib21fd3JpdGVyc190ZXN0LnB5IGIvdG9vbHMvc2JvbS9zYm9tX3dyaXRlcnNfdGVzdC5weQppbmRleCBjZjg1ZTAxLi5mOWY1MjMwIDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Nib21fd3JpdGVyc190ZXN0LnB5CisrKyBiL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzX3Rlc3QucHkKQEAgLTMzLDYgKzMzLDE0IEBACiBTUERYSURfRklMRTMgPSAnU1BEWFJlZi1maWxlMycKIFNQRFhJRF9GSUxFNCA9ICdTUERYUmVmLWZpbGU0JwogCitTUERYSURfTElDRU5TRV8xID0gJ0xpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEnCitTUERYSURfTElDRU5TRV8yID0gJ0xpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTInCitTUERYSURfTElDRU5TRV8zID0gJ0xpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMnCisKK0xJQ0VOU0VfQVBBQ0hFX1RFWFQgPSAiTElDRU5TRV9BUEFDSEUiCitMSUNFTlNFMV9URVhUID0gJ0xJQ0VOU0UgMScKK0xJQ0VOU0UyX1RFWFQgPSAnTElDRU5TRSAyJworTElDRU5TRTNfVEVYVCA9ICdMSUNFTlNFIDMnCiAKIGNsYXNzIFNCT01Xcml0ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTYzLDYgKzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0KICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAKICAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKApAQCAtNzEsNiArODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8xXSwKICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAKICAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKApAQCAtNzksNiArODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8yLCBTUERYSURfTElDRU5TRV8zXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX3JlZnM9W3Nib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZDYXRlZ29yeS5TRUNVUklUWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmVHlwZS5jcGUyMlR5cGUsCkBAIC05MCw2ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nVXBzdHJlYW0gcGFja2FnZTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfVVBTVFJFQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPScxLjEnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFXzIsIFNQRFhJRF9MSUNFTlNFXzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgKSkKIAogICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfU09VUkNFX1BBQ0tBR0UxLApAQCAtOTcsMTEgKzEwOSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1TUERYSURfVVBTVFJFQU1fUEFDS0FHRTEpKQogCiAgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCi0gICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTEsIG5hbWU9Jy9iaW4vZmlsZTEnLCBjaGVja3N1bT0nU0hBMTogMTExMTEnKSkKKyAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMSwgbmFtZT0nL2Jpbi9maWxlMScsIGNoZWNrc3VtPSdTSEExOiAxMTExMScsIGNvbmNsdWRlZF9saWNlbnNlX2lkcz1bc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0pKQogICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAotICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEUyLCBuYW1lPScvYmluL2ZpbGUyJywgY2hlY2tzdW09J1NIQTE6IDIyMjIyJykpCisgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTIsIG5hbWU9Jy9iaW4vZmlsZTInLCBjaGVja3N1bT0nU0hBMTogMjIyMjInLCBjb25jbHVkZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFXzFdKSkKICAgICBzZWxmLnNib21fZG9jLmZpbGVzLmFwcGVuZCgKLSAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMywgbmFtZT0nL2Jpbi9maWxlMycsIGNoZWNrc3VtPSdTSEExOiAzMzMzMycpKQorICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEUzLCBuYW1lPScvYmluL2ZpbGUzJywgY2hlY2tzdW09J1NIQTE6IDMzMzMzJywgY29uY2x1ZGVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8yLCBTUERYSURfTElDRU5TRV8zXSkpCiAgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCiAgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTQsIG5hbWU9J2ZpbGU0LmEnLCBjaGVja3N1bT0nU0hBMTogNDQ0NDQnKSkKIApAQCAtMTIwLDYgKzEzMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1TUERYSURfRklMRTQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQogCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfbGljZW5zZShzYm9tX2RhdGEuTGljZW5zZShzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFLCBMSUNFTlNFX0FQQUNIRV9URVhULCAiTGljZW5zZS1BcGFjaGUiKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9saWNlbnNlKHNib21fZGF0YS5MaWNlbnNlKFNQRFhJRF9MSUNFTlNFXzEsIExJQ0VOU0UxX1RFWFQsICJMaWNlbnNlLTEiKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9saWNlbnNlKHNib21fZGF0YS5MaWNlbnNlKFNQRFhJRF9MSUNFTlNFXzIsIExJQ0VOU0UyX1RFWFQsICJMaWNlbnNlLTIiKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9saWNlbnNlKHNib21fZGF0YS5MaWNlbnNlKFNQRFhJRF9MSUNFTlNFXzMsIExJQ0VOU0UzX1RFWFQsICJMaWNlbnNlLTMiKSkKKwogICAgICMgU0JPTSBmcmFnbWVudCBvZiBhIEFQSwogICAgIHNlbGYudW5idW5kbGVkX3Nib21fZG9jID0gc2JvbV9kYXRhLkRvY3VtZW50KG5hbWU9J3Rlc3QgZG9jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9J2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zYm9tL3NwZHgvYW5kcm9pZCcsCmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX2pzb25fc2JvbS5zcGR4Lmpzb24gYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX2pzb25fc2JvbS5zcGR4Lmpzb24KaW5kZXggNTM5MzZjNS4uYTg3NzgxMCAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF9qc29uX3Nib20uc3BkeC5qc29uCisrKyBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfanNvbl9zYm9tLnNwZHguanNvbgpAQCAtMzEsNiArMzEsNyBAQAogICAgICAgICAgICAgImZpbGVzQW5hbHl6ZWQiOiB0cnVlLAogICAgICAgICAgICAgInZlcnNpb25JbmZvIjogImJ1aWxkX2Zpbmdlcl9wcmludCIsCiAgICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiBHb29nbGUiLAorICAgICAgICAgICAgImxpY2Vuc2VEZWNsYXJlZCI6ICJOT0FTU0VSVElPTiIsCiAgICAgICAgICAgICAicGFja2FnZVZlcmlmaWNhdGlvbkNvZGUiOiB7CiAgICAgICAgICAgICAgICAgInBhY2thZ2VWZXJpZmljYXRpb25Db2RlVmFsdWUiOiAiMTIzNDU2IgogICAgICAgICAgICAgfSwKQEAgLTQ2LDcgKzQ3LDggQEAKICAgICAgICAgICAgICJkb3dubG9hZExvY2F0aW9uIjogIk5PTkUiLAogICAgICAgICAgICAgImZpbGVzQW5hbHl6ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICJ2ZXJzaW9uSW5mbyI6ICJidWlsZF9maW5nZXJfcHJpbnQiLAotICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogR29vZ2xlIgorICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogR29vZ2xlIiwKKyAgICAgICAgICAgICJsaWNlbnNlRGVjbGFyZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAiCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJuYW1lIjogIlByZWJ1aWx0IHBhY2thZ2UxIiwKQEAgLTU0LDcgKzU2LDggQEAKICAgICAgICAgICAgICJkb3dubG9hZExvY2F0aW9uIjogIk5PTkUiLAogICAgICAgICAgICAgImZpbGVzQW5hbHl6ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICJ2ZXJzaW9uSW5mbyI6ICJidWlsZF9maW5nZXJfcHJpbnQiLAotICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogR29vZ2xlIgorICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogR29vZ2xlIiwKKyAgICAgICAgICAgICJsaWNlbnNlRGVjbGFyZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMSIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgIm5hbWUiOiAiU291cmNlIHBhY2thZ2UxIiwKQEAgLTYzLDYgKzY2LDcgQEAKICAgICAgICAgICAgICJmaWxlc0FuYWx5emVkIjogZmFsc2UsCiAgICAgICAgICAgICAidmVyc2lvbkluZm8iOiAiYnVpbGRfZmluZ2VyX3ByaW50IiwKICAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IEdvb2dsZSIsCisgICAgICAgICAgICAibGljZW5zZURlY2xhcmVkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMyIsCiAgICAgICAgICAgICAiZXh0ZXJuYWxSZWZzIjogWwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZUNhdGVnb3J5IjogIlNFQ1VSSVRZIiwKQEAgLTc3LDcgKzgxLDggQEAKICAgICAgICAgICAgICJkb3dubG9hZExvY2F0aW9uIjogIk5PQVNTRVJUSU9OIiwKICAgICAgICAgICAgICJmaWxlc0FuYWx5emVkIjogZmFsc2UsCiAgICAgICAgICAgICAidmVyc2lvbkluZm8iOiAiMS4xIiwKLSAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IHVwc3RyZWFtIgorICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogdXBzdHJlYW0iLAorICAgICAgICAgICAgImxpY2Vuc2VEZWNsYXJlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMiCiAgICAgICAgIH0KICAgICBdLAogICAgICJmaWxlcyI6IFsKQEAgLTg5LDcgKzk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgImFsZ29yaXRobSI6ICJTSEExIiwKICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtVmFsdWUiOiAiMTExMTEiCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJsaWNlbnNlQ29uY2x1ZGVkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1BcGFjaGUtMi4wIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAiZmlsZU5hbWUiOiAiL2Jpbi9maWxlMiIsCkBAIC05OSw3ICsxMDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtIjogIlNIQTEiLAogICAgICAgICAgICAgICAgICAgICAiY2hlY2tzdW1WYWx1ZSI6ICIyMjIyMiIKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImxpY2Vuc2VDb25jbHVkZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMSIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgImZpbGVOYW1lIjogIi9iaW4vZmlsZTMiLApAQCAtMTA5LDcgKzExNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBMSIsCiAgICAgICAgICAgICAgICAgICAgICJjaGVja3N1bVZhbHVlIjogIjMzMzMzIgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibGljZW5zZUNvbmNsdWRlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMiCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJmaWxlTmFtZSI6ICJmaWxlNC5hIiwKQEAgLTExOSw3ICsxMjcsOCBAQAogICAgICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtIjogIlNIQTEiLAogICAgICAgICAgICAgICAgICAgICAiY2hlY2tzdW1WYWx1ZSI6ICI0NDQ0NCIKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImxpY2Vuc2VDb25jbHVkZWQiOiAiTk9BU1NFUlRJT04iCiAgICAgICAgIH0KICAgICBdLAogICAgICJyZWxhdGlvbnNoaXBzIjogWwpAQCAtMTQ4LDUgKzE1NywyNyBAQAogICAgICAgICAgICAgInJlbGF0ZWRTcGR4RWxlbWVudCI6ICJTUERYUmVmLVVQU1RSRUFNLXBhY2thZ2UxIiwKICAgICAgICAgICAgICJyZWxhdGlvbnNoaXBUeXBlIjogIlZBUklBTlRfT0YiCiAgICAgICAgIH0KKyAgICBdLAorICAgICJoYXNFeHRyYWN0ZWRMaWNlbnNpbmdJbmZvcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImxpY2Vuc2VJZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMCIsCisgICAgICAgICAgICAibmFtZSI6ICJMaWNlbnNlLUFwYWNoZSIsCisgICAgICAgICAgICAiZXh0cmFjdGVkVGV4dCI6ICI8dGV4dD5MSUNFTlNFX0FQQUNIRTwvdGV4dD4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJsaWNlbnNlSWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMSIsCisgICAgICAgICAgICAibmFtZSI6ICJMaWNlbnNlLTEiLAorICAgICAgICAgICAgImV4dHJhY3RlZFRleHQiOiAiPHRleHQ+TElDRU5TRSAxPC90ZXh0PiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImxpY2Vuc2VJZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIiwKKyAgICAgICAgICAgICJuYW1lIjogIkxpY2Vuc2UtMiIsCisgICAgICAgICAgICAiZXh0cmFjdGVkVGV4dCI6ICI8dGV4dD5MSUNFTlNFIDI8L3RleHQ+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibGljZW5zZUlkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMiLAorICAgICAgICAgICAgIm5hbWUiOiAiTGljZW5zZS0zIiwKKyAgICAgICAgICAgICJleHRyYWN0ZWRUZXh0IjogIjx0ZXh0PkxJQ0VOU0UgMzwvdGV4dD4iCisgICAgICAgIH0KICAgICBdCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tLnNwZHggYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib20uc3BkeAppbmRleCBlNmZkMTdlLi4xYzU0NDEwIDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib20uc3BkeAorKysgYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib20uc3BkeApAQCAtMTAsNiArMTAsNyBAQAogRmlsZU5hbWU6IGZpbGU0LmEKIFNQRFhJRDogU1BEWFJlZi1maWxlNAogRmlsZUNoZWNrc3VtOiBTSEExOiA0NDQ0NAorTGljZW5zZUNvbmNsdWRlZDogTk9BU1NFUlRJT04KIAogUGFja2FnZU5hbWU6IFBST0RVQ1QKIFNQRFhJRDogU1BEWFJlZi1QUk9EVUNUCkBAIC0xNyw2ICsxOCw3IEBACiBGaWxlc0FuYWx5emVkOiB0cnVlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBOT0FTU0VSVElPTgogUGFja2FnZVZlcmlmaWNhdGlvbkNvZGU6IDEyMzQ1NgogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtRE9DVU1FTlQgREVTQ1JJQkVTIFNQRFhSZWYtUFJPRFVDVApAQCAtMjQsMTQgKzI2LDE3IEBACiBGaWxlTmFtZTogL2Jpbi9maWxlMQogU1BEWElEOiBTUERYUmVmLWZpbGUxCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDExMTExCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAogCiBGaWxlTmFtZTogL2Jpbi9maWxlMgogU1BEWElEOiBTUERYUmVmLWZpbGUyCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDIyMjIyCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xCiAKIEZpbGVOYW1lOiAvYmluL2ZpbGUzCiBTUERYSUQ6IFNQRFhSZWYtZmlsZTMKIEZpbGVDaGVja3N1bTogU0hBMTogMzMzMzMKK0xpY2Vuc2VDb25jbHVkZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogCiBQYWNrYWdlTmFtZTogUExBVEZPUk0KIFNQRFhJRDogU1BEWFJlZi1QTEFURk9STQpAQCAtMzksNiArNDQsNyBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1BcGFjaGUtMi4wCiAKIFBhY2thZ2VOYW1lOiBQcmVidWlsdCBwYWNrYWdlMQogU1BEWElEOiBTUERYUmVmLVBSRUJVSUxULXBhY2thZ2UxCkBAIC00Niw2ICs1Miw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQogCiBQYWNrYWdlTmFtZTogU291cmNlIHBhY2thZ2UxCiBTUERYSUQ6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxCkBAIC01Myw2ICs2MCw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zCiBFeHRlcm5hbFJlZjogU0VDVVJJVFkgY3BlMjJUeXBlIGNwZTovYTpqc29uY3BwX3Byb2plY3Q6anNvbmNwcDoxLjkuNAogCiBQYWNrYWdlTmFtZTogVXBzdHJlYW0gcGFja2FnZTEKQEAgLTYxLDYgKzY5LDcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogMS4xCiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogdXBzdHJlYW0KK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxIFZBUklBTlRfT0YgU1BEWFJlZi1VUFNUUkVBTS1wYWNrYWdlMQogCkBAIC02OCwzICs3NywxOSBAQAogUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUyIEdFTkVSQVRFRF9GUk9NIFNQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTEKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMyBHRU5FUkFURURfRlJPTSBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQogUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUxIFNUQVRJQ19MSU5LIFNQRFhSZWYtZmlsZTQKKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAorTGljZW5zZU5hbWU6IExpY2Vuc2UtQXBhY2hlCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFX0FQQUNIRTwvdGV4dD4KKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xCitMaWNlbnNlTmFtZTogTGljZW5zZS0xCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFIDE8L3RleHQ+CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMgorTGljZW5zZU5hbWU6IExpY2Vuc2UtMgorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRSAyPC90ZXh0PgorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLTMKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0UgMzwvdGV4dD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV9kb2NfZGVzY3JpYmVzX2ZpbGUuc3BkeCBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV9kb2NfZGVzY3JpYmVzX2ZpbGUuc3BkeAppbmRleCA0MjhkN2UzLi4zNmFmYzhiIDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fZG9jX2Rlc2NyaWJlc19maWxlLnNwZHgKKysrIGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX2RvY19kZXNjcmliZXNfZmlsZS5zcGR4CkBAIC0xMCw2ICsxMCw3IEBACiBGaWxlTmFtZTogZmlsZTQuYQogU1BEWElEOiBTUERYUmVmLWZpbGU0CiBGaWxlQ2hlY2tzdW06IFNIQTE6IDQ0NDQ0CitMaWNlbnNlQ29uY2x1ZGVkOiBOT0FTU0VSVElPTgogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtRE9DVU1FTlQgREVTQ1JJQkVTIFNQRFhSZWYtZmlsZTQKIApAQCAtMTksMTkgKzIwLDIzIEBACiBGaWxlc0FuYWx5emVkOiB0cnVlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBOT0FTU0VSVElPTgogUGFja2FnZVZlcmlmaWNhdGlvbkNvZGU6IDEyMzQ1NgogCiBGaWxlTmFtZTogL2Jpbi9maWxlMQogU1BEWElEOiBTUERYUmVmLWZpbGUxCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDExMTExCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAogCiBGaWxlTmFtZTogL2Jpbi9maWxlMgogU1BEWElEOiBTUERYUmVmLWZpbGUyCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDIyMjIyCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xCiAKIEZpbGVOYW1lOiAvYmluL2ZpbGUzCiBTUERYSUQ6IFNQRFhSZWYtZmlsZTMKIEZpbGVDaGVja3N1bTogU0hBMTogMzMzMzMKK0xpY2Vuc2VDb25jbHVkZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogCiBQYWNrYWdlTmFtZTogUExBVEZPUk0KIFNQRFhJRDogU1BEWFJlZi1QTEFURk9STQpAQCAtMzksNiArNDQsNyBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1BcGFjaGUtMi4wCiAKIFBhY2thZ2VOYW1lOiBQcmVidWlsdCBwYWNrYWdlMQogU1BEWElEOiBTUERYUmVmLVBSRUJVSUxULXBhY2thZ2UxCkBAIC00Niw2ICs1Miw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQogCiBQYWNrYWdlTmFtZTogU291cmNlIHBhY2thZ2UxCiBTUERYSUQ6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxCkBAIC01Myw2ICs2MCw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zCiBFeHRlcm5hbFJlZjogU0VDVVJJVFkgY3BlMjJUeXBlIGNwZTovYTpqc29uY3BwX3Byb2plY3Q6anNvbmNwcDoxLjkuNAogCiBQYWNrYWdlTmFtZTogVXBzdHJlYW0gcGFja2FnZTEKQEAgLTYxLDYgKzY5LDcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogMS4xCiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogdXBzdHJlYW0KK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxIFZBUklBTlRfT0YgU1BEWFJlZi1VUFNUUkVBTS1wYWNrYWdlMQogCkBAIC02OCwzICs3NywxOSBAQAogUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUyIEdFTkVSQVRFRF9GUk9NIFNQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTEKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMyBHRU5FUkFURURfRlJPTSBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQogUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUxIFNUQVRJQ19MSU5LIFNQRFhSZWYtZmlsZTQKKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAorTGljZW5zZU5hbWU6IExpY2Vuc2UtQXBhY2hlCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFX0FQQUNIRTwvdGV4dD4KKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xCitMaWNlbnNlTmFtZTogTGljZW5zZS0xCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFIDE8L3RleHQ+CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMgorTGljZW5zZU5hbWU6IExpY2Vuc2UtMgorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRSAyPC90ZXh0PgorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLTMKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0UgMzwvdGV4dD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV91bmJ1bmRsZWQuc3BkeCBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV91bmJ1bmRsZWQuc3BkeAppbmRleCBhMDBjMjkxLi40YjE0YTRiIDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fdW5idW5kbGVkLnNwZHgKKysrIGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX3VuYnVuZGxlZC5zcGR4CkBAIC0xLDYgKzEsNyBAQAogRmlsZU5hbWU6IC9iaW4vZmlsZTEuYXBrCiBTUERYSUQ6IFNQRFhSZWYtZmlsZTEKIEZpbGVDaGVja3N1bTogU0hBMTogMTExMTEKK0xpY2Vuc2VDb25jbHVkZWQ6IE5PQVNTRVJUSU9OCiAKIFBhY2thZ2VOYW1lOiBVbmJ1bmRsZWQgYXBrIHBhY2thZ2UKIFNQRFhJRDogU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEKQEAgLTgsNSArOSw2IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTk9BU1NFUlRJT04KIAogUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUxIEdFTkVSQVRFRF9GUk9NIFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxCmRpZmYgLS1naXQgYS90b29scy90b29sX2V2ZW50X2xvZ2dlci9wcm90by90b29sX2V2ZW50LnByb3RvIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvcHJvdG8vdG9vbF9ldmVudC5wcm90bwppbmRleCA2MWUyOGEyLi5lZjcxZWFjIDEwMDY0NAotLS0gYS90b29scy90b29sX2V2ZW50X2xvZ2dlci9wcm90by90b29sX2V2ZW50LnByb3RvCisrKyBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Byb3RvL3Rvb2xfZXZlbnQucHJvdG8KQEAgLTI3LDYgKzI3LDggQEAKICAgc3RyaW5nIHNvdXJjZV9yb290ID0gMzsKICAgLy8gTmFtZSBvZiB0aGUgdG9vbCB1c2VkLgogICBzdHJpbmcgdG9vbF90YWcgPSA2OworICAvLyBOYW1lIG9mIHRoZSBob3N0IHdvcmtzdGF0aW9uLgorICBzdHJpbmcgaG9zdF9uYW1lID0gNzsKIAogICBvbmVvZiBldmVudCB7CiAgICAgSW52b2NhdGlvblN0YXJ0ZWQgaW52b2NhdGlvbl9zdGFydGVkID0gNDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyLnB5IGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXIucHkKaW5kZXggNjVhOTY5Ni4uYjI0OWQ5MSAxMDA2NDQKLS0tIGEvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXIucHkKKysrIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXIucHkKQEAgLTM4LDYgKzM4LDcgQEAKICAgICAgIHRvb2xfdGFnOiBzdHIsCiAgICAgICBpbnZvY2F0aW9uX2lkOiBzdHIsCiAgICAgICB1c2VyX25hbWU6IHN0ciwKKyAgICAgIGhvc3RfbmFtZTogc3RyLAogICAgICAgc291cmNlX3Jvb3Q6IHN0ciwKICAgICAgIHBsYXRmb3JtX3ZlcnNpb246IHN0ciwKICAgICAgIHB5dGhvbl92ZXJzaW9uOiBzdHIsCkBAIC00Niw2ICs0Nyw3IEBACiAgICAgc2VsZi50b29sX3RhZyA9IHRvb2xfdGFnCiAgICAgc2VsZi5pbnZvY2F0aW9uX2lkID0gaW52b2NhdGlvbl9pZAogICAgIHNlbGYudXNlcl9uYW1lID0gdXNlcl9uYW1lCisgICAgc2VsZi5ob3N0X25hbWUgPSBob3N0X25hbWUKICAgICBzZWxmLnNvdXJjZV9yb290ID0gc291cmNlX3Jvb3QKICAgICBzZWxmLnBsYXRmb3JtX3ZlcnNpb24gPSBwbGF0Zm9ybV92ZXJzaW9uCiAgICAgc2VsZi5weXRob25fdmVyc2lvbiA9IHB5dGhvbl92ZXJzaW9uCkBAIC01Nyw2ICs1OSw3IEBACiAgICAgICAgIHRvb2xfdGFnPXRvb2xfdGFnLAogICAgICAgICBpbnZvY2F0aW9uX2lkPXN0cih1dWlkLnV1aWQ0KCkpLAogICAgICAgICB1c2VyX25hbWU9Z2V0cGFzcy5nZXR1c2VyKCksCisgICAgICAgIGhvc3RfbmFtZT1wbGF0Zm9ybS5ub2RlKCksCiAgICAgICAgIHNvdXJjZV9yb290PW9zLmVudmlyb24uZ2V0KCdBTkRST0lEX0JVSUxEX1RPUCcsICcnKSwKICAgICAgICAgcGxhdGZvcm1fdmVyc2lvbj1wbGF0Zm9ybS5wbGF0Zm9ybSgpLAogICAgICAgICBweXRob25fdmVyc2lvbj1wbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLApAQCAtMTEwLDYgKzExMyw3IEBACiAgICAgICAgIHRvb2xfdGFnPXNlbGYudG9vbF90YWcsCiAgICAgICAgIGludm9jYXRpb25faWQ9c2VsZi5pbnZvY2F0aW9uX2lkLAogICAgICAgICB1c2VyX25hbWU9c2VsZi51c2VyX25hbWUsCisgICAgICAgIGhvc3RfbmFtZT1zZWxmLmhvc3RfbmFtZSwKICAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKICAgICApCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyX3Rlc3QucHkgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci90b29sX2V2ZW50X2xvZ2dlcl90ZXN0LnB5CmluZGV4IDM0YjZjMzUuLjc4ODgxMmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyX3Rlc3QucHkKKysrIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXJfdGVzdC5weQpAQCAtMjUsNiArMjUsNyBAQAogCiBURVNUX0lOVk9DQVRJT05fSUQgPSAndGVzdF9pbnZvY2F0aW9uX2lkJwogVEVTVF9VU0VSX05BTUUgPSAndGVzdF91c2VyJworVEVTVF9IT1NUX05BTUUgPSAndGVzdF9ob3N0X25hbWUnCiBURVNUX1RPT0xfVEFHID0gJ3Rlc3RfdG9vbCcKIFRFU1RfU09VUkNFX1JPT1QgPSAndGVzdF9zb3VyY2Vfcm9vdCcKIFRFU1RfUExBVEZPUk1fVkVSU0lPTiA9ICd0ZXN0X3BsYXRmb3JtX3ZlcnNpb24nCkBAIC00MSw2ICs0Miw3IEBACiAgICAgICAgIFRFU1RfVE9PTF9UQUcsCiAgICAgICAgIFRFU1RfSU5WT0NBVElPTl9JRCwKICAgICAgICAgVEVTVF9VU0VSX05BTUUsCisgICAgICAgIFRFU1RfSE9TVF9OQU1FLAogICAgICAgICBURVNUX1NPVVJDRV9ST09ULAogICAgICAgICBURVNUX1BMQVRGT1JNX1ZFUlNJT04sCiAgICAgICAgIFRFU1RfUFlUSE9OX1ZFUlNJT04sCkBAIC02NSw2ICs2Nyw3IEBACiAgICAgbG9nX2V2ZW50ID0gdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50LkZyb21TdHJpbmcoc2VudF9ldmVudC5zb3VyY2VfZXh0ZW5zaW9uKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX2V2ZW50Lmludm9jYXRpb25faWQsIFRFU1RfSU5WT0NBVElPTl9JRCkKICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ19ldmVudC51c2VyX25hbWUsIFRFU1RfVVNFUl9OQU1FKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX2V2ZW50Lmhvc3RfbmFtZSwgVEVTVF9IT1NUX05BTUUpCiAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dfZXZlbnQudG9vbF90YWcsIFRFU1RfVE9PTF9UQUcpCiAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dfZXZlbnQuc291cmNlX3Jvb3QsIFRFU1RfU09VUkNFX1JPT1QpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduLmNwcCBiL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduLmNwcAppbmRleCBmMzJmOTBiLi4zZDY1YmMwIDEwMDY0NAotLS0gYS90b29scy96aXBhbGlnbi9aaXBBbGlnbi5jcHAKKysrIGIvdG9vbHMvemlwYWxpZ24vWmlwQWxpZ24uY3BwCkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICB9CiAKICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgcHJpbnRmKCJWZXJpZmljYXRpb24gJXNcbiIsIGZvdW5kQmFkID8gIkZBSUxFRCIgOiAic3VjY2VzZnVsIik7CisgICAgICAgIHByaW50ZigiVmVyaWZpY2F0aW9uICVzXG4iLCBmb3VuZEJhZCA/ICJGQUlMRUQiIDogInN1Y2Nlc3NmdWwiKTsKIAogICAgIHJldHVybiBmb3VuZEJhZCA/IDEgOiAwOwogfQo=