ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDMwNDEwNjUuLjVmYjczNjYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCQkkKGZyYW1ld29yay1yZXMtc291cmNlLXBhdGgpL2NvbS9hbmRyb2lkL2ludGVybmFsL1IuamF2YQogCiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgOj0gdHJ1ZQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBleHQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUgY29yZS1qdW5pdCBleHQKIAogTE9DQUxfTU9EVUxFIDo9IGZyYW1ld29yawogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCkBAIC0zMDIsMzQgKzMwMiwxNCBAQAogIyBJbnRlbnRpb25hbGx5IG5vdCBpbmNsdWRlZCBmcm9tIGxpYmNvcmU6CiAjICAgICBpY3Ugb3BlbnNzbCBzdW5jb21wYXQgc3VwcG9ydAogbGliY29yZV90b19kb2N1bWVudCA6PSBcCi0JYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL2phdmEgXAotCWFyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhIFwKLQlhdXRoL3NyYy9tYWluL2phdmEvamF2YXggXAotCWF3dC1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhIFwKLQljb25jdXJyZW50L3NyYy9tYWluL2phdmEgXAotCWNyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4IFwKIAlkYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsgXAogCWpzb24vc3JjL21haW4vamF2YSBcCiAJanVuaXQvc3JjL21haW4vamF2YSBcCi0JbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEgXAogCWx1bmkvc3JjL21haW4vamF2YS9qYXZhIFwKLQlsdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEgXAotCW1hdGgvc3JjL21haW4vamF2YS9qYXZhIFwKLQluaW8vc3JjL21haW4vamF2YS9qYXZhIFwKLQluaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXByZWZzL3NyYy9tYWluL2phdmEvamF2YSBcCi0JcmVnZXgvc3JjL21haW4vamF2YS9qYXZhIFwKLQlzZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXNlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXggXAotCXNlY3VyaXR5LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXNxbC9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXNxbC9zcmMvbWFpbi9qYXZhL2phdmF4IFwKLQl0ZXh0L3NyYy9tYWluL2phdmEvamF2YSBcCi0JeC1uZXQvc3JjL21haW4vamF2YS9qYXZheCBcCi0JeG1sL3NyYy9tYWluL2phdmEvamF2YXggXAotCXhtbC9zcmMvbWFpbi9qYXZhL29yZy94bWwvc2F4IFwKKwlsdW5pL3NyYy9tYWluL2phdmEvamF2YXggXAorCWx1bmkvc3JjL21haW4vamF2YS9vcmcveG1sL3NheCBcCisJbHVuaS9zcmMvbWFpbi9qYXZhL29yZy93M2MgXAogCXhtbC9zcmMvbWFpbi9qYXZhL29yZy94bWxwdWxsL3YxIFwKLQl4bWwvc3JjL21haW4vamF2YS9vcmcvdzNjCiAKIG5vbl9iYXNlX2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYy9vcmcvYXBhY2hlL2h0dHAKQEAgLTQ4Niw3ICs0NjYsOCBAQAogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKLSQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkKKyMgJChnZW4pLCBpLmUuIGZyYW1ld29yay5haWRsLCBpcyBhbHNvIG5lZWRlZCB3aGlsZSBidWlsZGluZyBhZ2FpbnN0IHRoZSBjdXJyZW50IHN0dWIuCiskKGZ1bGxfdGFyZ2V0KTogJChmcmFtZXdvcmtfYnVpbHQpICQoZ2VuKQogJChJTlRFUk5BTF9QTEFURk9STV9BUElfRklMRSk6ICQoZnVsbF90YXJnZXQpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsc2RrLCQoSU5URVJOQUxfUExBVEZPUk1fQVBJX0ZJTEUpKQogCkBAIC01ODgsMTAgKzU2OSwxNCBAQAogCiBleHRfZGlycyA6PSBcCiAJLi4vLi4vZXh0ZXJuYWwvYXBhY2hlLWh0dHAvc3JjIFwKLQkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYworCS4uLy4uL2V4dGVybmFsL3RhZ3NvdXAvc3JjIFwKKwkuLi8uLi9leHRlcm5hbC9saWJwaG9uZW51bWJlci9qYXZhL3NyYwogCiBleHRfc3JjX2ZpbGVzIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwkKGV4dF9kaXJzKSkKIAorZXh0X3Jlc19kaXJzIDo9IFwKKwkuLi8uLi9leHRlcm5hbC9saWJwaG9uZW51bWJlci9qYXZhL3NyYworCiAjID09PT0gIHRoZSBsaWJyYXJ5ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKQEAgLTU5OSw3ICs1ODQsNyBAQAogCiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgOj0gdHJ1ZQogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZQotCitMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gJChleHRfcmVzX2RpcnMpCiBMT0NBTF9NT0RVTEUgOj0gZXh0CiAKIExPQ0FMX05PX0VNTUFfSU5TVFJVTUVOVCA6PSB0cnVlCmRpZmYgLS1naXQgYS9hcGkvOS54bWwgYi9hcGkvOS54bWwKaW5kZXggYjc1OTZiZC4uMjAzOTdkZiAxMDA2NDQKLS0tIGEvYXBpLzkueG1sCisrKyBiL2FwaS85LnhtbApAQCAtMTQ3NzgyLDE3ICsxNDc3ODIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0NzgwNCwzMCArMTQ3NzkzLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0Nzg1NCwxNyArMTQ3ODE5LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODA2MSwxNyArMTQ4MDE1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODI3NSwxNyArMTQ4MjE4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3VwcG9ydHNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgzMTIsMTI0ICsxNDgyNDQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRG91YmxlIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVGbG9hdCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVJbnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUxvbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTaG9ydCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJzaG9ydCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTdHJpbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVUb051bGwiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1vY2tEaWFsb2dJbnRlcmZhY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE2NDY5Niw3ICsxNjQ1MTAsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTY0NzA3LDcgKzE2NDUyMSw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMjE2NTcyLDMzICsyMTYzODYsNiBAQAogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iZGFsdmlrLnN5c3RlbSIKID4KLTxjbGFzcyBuYW1lPSJBbGxvY2F0aW9uTGltaXRFcnJvciIKLSBleHRlbmRzPSJqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5BbGxvY2F0aW9uTGltaXRFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IkFsbG9jYXRpb25MaW1pdEVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJkZXRhaWxNZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRGV4Q2xhc3NMb2FkZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjc3OCwxMDEwICsyMTY1NjUsNiBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJQb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIGV4dGVuZHM9ImphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uUG90ZW50aWFsRGVhZGxvY2tFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlBvdGVudGlhbERlYWRsb2NrRXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5Qb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV0YWlsTWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlN0YWxlRGV4Q2FjaGVFcnJvciIKLSBleHRlbmRzPSJqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iU3RhbGVEZXhDYWNoZUVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uU3RhbGVEZXhDYWNoZUVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iU3RhbGVEZXhDYWNoZUVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uU3RhbGVEZXhDYWNoZUVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV0YWlsTWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlRlbXBvcmFyeURpcmVjdG9yeSIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJUZW1wb3JhcnlEaXJlY3RvcnkiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5UZW1wb3JhcnlEaXJlY3RvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0ic2V0VXBEaXJlY3RvcnkiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImJhc2VEaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0VXBEaXJlY3RvcnkiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0idHJ1ZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYmFzZURpciIgdHlwZT0iamF2YS5pby5GaWxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlRvdWNoRGV4IgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlRvdWNoRGV4IgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uVG91Y2hEZXgiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0ibWFpbiIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImRleEZpbGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlZNRGVidWciCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxtZXRob2QgbmFtZT0iZHVtcEhwcm9mRGF0YSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmaWxlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0QWxsb2NDb3VudCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImtpbmQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnN0cnVjdGlvbkNvdW50IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvdW50cyIgdHlwZT0iaW50W10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TG9hZGVkQ2xhc3NDb3VudCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNEZWJ1Z2dlckNvbm5lY3RlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzRGVidWdnaW5nRW5hYmxlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imxhc3REZWJ1Z2dlckFjdGl2aXR5IgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icHJpbnRMb2FkZWRDbGFzc2VzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icmVzZXRBbGxvY0NvdW50IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImtpbmRzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icmVzZXRJbnN0cnVjdGlvbkNvdW50IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0QWxsb2NhdGlvbkxpbWl0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ibGltaXQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRHbG9iYWxBbGxvY2F0aW9uTGltaXQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJsaW1pdCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0QWxsb2NDb3VudGluZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0RW11bGF0b3JUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRJbnN0cnVjdGlvbkNvdW50aW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRNZXRob2RUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRNZXRob2RUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0cmFjZUZpbGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJidWZmZXJTaXplIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RvcEFsbG9jQ291bnRpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdG9wRW11bGF0b3JUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RvcEluc3RydWN0aW9uQ291bnRpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdG9wTWV0aG9kVHJhY2luZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InRocmVhZENwdVRpbWVOYW5vcyIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08ZmllbGQgbmFtZT0iREVGQVVMVF9NRVRIT0RfVFJBQ0VfRklMRV9OQU1FIgotIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oy9zZGNhcmQvZG10cmFjZS50cmFjZSZxdW90OyIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfQUxMX0NPVU5UUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9Ii0xIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0FMTE9DQVRFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfQUxMT0NBVEVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0NMQVNTX0lOSVRfQ09VTlQiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIzMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9DTEFTU19JTklUX1RJTUUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI2NCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9FWFRfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iODE5MiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9FWFRfQUxMT0NBVEVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0MDk2IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0VYVF9GUkVFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjMyNzY4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0VYVF9GUkVFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTYzODQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0ZSRUVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0dDX0lOVk9DQVRJT05TIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTMxMDcyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0FMTE9DQVRFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNjU1MzYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQ0xBU1NfSU5JVF9DT1VOVCIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIwOTcxNTIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQ0xBU1NfSU5JVF9USU1FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNDE5NDMwNCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNTM2ODcwOTEyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0VYVF9BTExPQ0FURURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjI2ODQzNTQ1NiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSItMjE0NzQ4MzY0OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfRlJFRURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEwNzM3NDE4MjQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI1MjQyODgiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRlJFRURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjI2MjE0NCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9HQ19JTlZPQ0FUSU9OUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEwNDg1NzYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iVFJBQ0VfQ09VTlRfQUxMT0NTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVk1SdW50aW1lIgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08bWV0aG9kIG5hbWU9ImdjU29mdFJlZmVyZW5jZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0RXh0ZXJuYWxCeXRlc0FsbG9jYXRlZCIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRNaW5pbXVtSGVhcFNpemUiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFJ1bnRpbWUiCi0gcmV0dXJuPSJkYWx2aWsuc3lzdGVtLlZNUnVudGltZSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFRhcmdldEhlYXBVdGlsaXphdGlvbiIKLSByZXR1cm49ImZsb2F0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icnVuRmluYWxpemF0aW9uU3luYyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRNaW5pbXVtSGVhcFNpemUiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0idHJ1ZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InNpemUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uIgotIHJldHVybj0iZmxvYXQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9Im5ld1RhcmdldCIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVk1TdGFjayIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlZNU3RhY2siCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5WTVN0YWNrIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImdldENhbGxpbmdDbGFzc0xvYWRlciIKLSByZXR1cm49ImphdmEubGFuZy5DbGFzc0xvYWRlciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyMiIKLSByZXR1cm49ImphdmEubGFuZy5DbGFzc0xvYWRlciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2xhc3NlcyIKLSByZXR1cm49ImphdmEubGFuZy5DbGFzcyZsdDs/Jmd0O1tdIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4RGVwdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RvcEF0UHJpdmlsZWdlZCIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRUaHJlYWRTdGFja1RyYWNlIgotIHJldHVybj0iamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0IiB0eXBlPSJqYXZhLmxhbmcuVGhyZWFkIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9Ilp5Z290ZSIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxtZXRob2QgbmFtZT0iZm9yayIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9ya0FuZFNwZWNpYWxpemUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWJ1Z0ZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJsaW1pdHMiIHR5cGU9ImludFtdW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9ya0FuZFNwZWNpYWxpemUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJlbmFibGVEZWJ1Z2dlciIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icmxpbWl0cyIgdHlwZT0iaW50W11bXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JrU3lzdGVtU2VydmVyIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idWlkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWRzIiB0eXBlPSJpbnRbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVidWdGbGFncyIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJybGltaXRzIiB0eXBlPSJpbnRbXVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmtTeXN0ZW1TZXJ2ZXIiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJlbmFibGVEZWJ1Z2dlciIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icmxpbWl0cyIgdHlwZT0iaW50W11bXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkRFQlVHX0VOQUJMRV9BU1NFUlQiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkRFQlVHX0VOQUJMRV9DSEVDS0pOSSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iREVCVUdfRU5BQkxFX0RFQlVHR0VSIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJERUJVR19FTkFCTEVfU0FGRU1PREUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImphdmEuYXd0LmZvbnQiCiA+CkBAIC0yODg1NDUsMjEgKzI4NzMyOCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9IndoZXJlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEludCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TGluZUluc3RhbmNlIgogIHJldHVybj0iamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjg4NTg0LDIxICsyODczNTIsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRMb25nIgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2VudGVuY2VJbnN0YW5jZSIKICByZXR1cm49ImphdmEudGV4dC5CcmVha0l0ZXJhdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI4ODYyMywyMSArMjg3Mzc2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2hvcnQiCi0gcmV0dXJuPSJzaG9ydCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKICByZXR1cm49ImphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4OTI1NSw5ICsyODc5OTMsOSBAQAogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb2xsYXRpb25LZXkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCisgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgpAQCAtMjg5MjY1LDcgKzI4ODAwMyw3IEBACiA8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImNvbXBhcmVUbyIKICByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCisgYWJzdHJhY3Q9InRydWUiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yODkyODksNyArMjg4MDI3LDcgQEAKIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ0b0J5dGVBcnJheSIKICByZXR1cm49ImJ5dGVbXSIKLSBhYnN0cmFjdD0iZmFsc2UiCisgYWJzdHJhY3Q9InRydWUiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yOTEwMTMsNyArMjg5NzUxLDcgQEAKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CkBAIC0yOTE1MTUsNyArMjkwMjUzLDcgQEAKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvbmUiCkBAIC0yOTE5MTUsNyArMjkwNjUzLDcgQEAKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZm9ybWF0IgpAQCAtMzA1NjI5LDcgKzMwNDM2Nyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0zMDU2NDQsNyArMzA0MzgyLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTMwNTY2Myw3ICszMDQ0MDEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJFeGVjdXRpb25FeGNlcHRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTMwNTY4MCw3ICszMDQ0MTgsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzA3NjkzLDcgKzMwNjQzMSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0zMDc3MDgsNyArMzA2NDQ2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTMwNzcyNyw3ICszMDY0NjUsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJFeGVjdXRpb25FeGNlcHRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTMwNzc0NCw3ICszMDY0ODIsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzA3ODg5LDcgKzMwNjYyNyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbiI+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uJmx0Oz8mZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNhbGxhYmxlIgpAQCAtMzA3OTAyLDcgKzMwNjY0MCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiI+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uJmx0Oz8mZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImRlZmF1bHRUaHJlYWRGYWN0b3J5IgpAQCAtMzEyMjI3LDcgKzMxMDk2NSw3IEBACiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0iIgorIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KIDwvaW1wbGVtZW50cz4KQEAgLTMzNzQxMywxMSArMzM2MTUxLDExIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuQnVpbGRlciZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRQYXJhbWV0ZXJzIgotIHJldHVybj0iamF2YS51dGlsLkxpc3QiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLnNlY3VyaXR5LktleVN0b3JlLkJ1aWxkZXImZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0zMzkwNDgsNyArMzM3Nzg2LDcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8bWV0aG9kIG5hbWU9ImdldElkcyIKLSByZXR1cm49ImphdmEudXRpbC5FbnVtZXJhdGlvbiIKKyByZXR1cm49ImphdmEudXRpbC5FbnVtZXJhdGlvbiZsdDtieXRlW10mZ3Q7IgogIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBiYzIxYzNhLi41MDU0NmQzIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0yMDg4LDYgKzIwODgsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhY3Rpdml0eUNsb3NlRW50ZXJBbmltYXRpb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTMyLDYgKzIxNjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFkYXB0ZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhZGRTdGF0ZXNGcm9tQ2hpbGRyZW4iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTY1LDYgKzIyMDksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFsbG93QmFja3VwIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjI1Myw2ICsyMzA4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYW5pbWF0ZU9uQ2xpY2siCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzQxLDYgKzI0MDcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYXV0aG9yIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAwMSw2ICszMDc4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjb2x1bW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJjb2x1bW5EZWxheSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxNDQsNiArMzIzMiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImN5Y2xlcyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0MDgsNiArMzUwNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGlzcGxheU9wdGlvbnMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkaXRoZXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zNjA2LDYgKzM3MTYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNjcsNiArNDI4OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxODksNiArNDMyMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbVZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJvbVhEZWx0YSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ0NzUsNiArNDYxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imhhc0NvZGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02Njg2LDYgKzY4NDAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibWVudUNhdGVnb3J5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjgxOCw2ICs2OTgzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJuYXZpZ2F0aW9uTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im5lZ2F0aXZlQnV0dG9uVGV4dCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgzMDMsNiArODQ3OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2VsZWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg0MTMsNiArODYwMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2hvd0FzQWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2hvd0RlZmF1bHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDkwLDYgKzg2ODgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNvcnRPcmRlciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNvdW5kRWZmZWN0c0VuYWJsZWQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04ODQyLDYgKzkwNTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1YnRpdGxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3VnZ2VzdEFjdGlvbk1zZyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk2NzgsNiArOTg5OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0b0FscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTcwMCw2ICs5OTMxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0b1ZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idG9YRGVsdGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05ODc2LDYgKzEwMTE4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ1cmkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ1c2VMZXZlbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEwMjE3LDYgKzEwNDcwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndpbmRvd0FuaW1hdGlvblN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTA0MjYsNiArMTA3MDEsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhFeHByZXNzaW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0id3JpdGVQZXJtaXNzaW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwNzUsNiArMTQzNzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhvbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjkwODM1MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyNDUsNiArMTY1NTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX1dpdGhBY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk2OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjI2Nyw2ICsxNjU4NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0FjdGlvbkJ1dHRvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTcxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9BdXRvQ29tcGxldGVUZXh0VmlldyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2NjQxLDYgKzE2OTcxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfU3Bpbm5lcl9Ecm9wRG93biIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTcwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9UYWJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTA2Nyw2ICsxOTQwOCwzOTkgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYXBwIgogPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIiCisgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbU5hdmlnYXRpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VidGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmFja2dyb3VuZERyYXdhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhbGxiYWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbU5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcHRpb25zIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1hc2siIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX0hJREVfSE9NRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9VU0VfTE9HTyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX0NVU1RPTSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9TVEFOREFSRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1RBQlMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWN0aW9uQmFyLkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkNvbnRleHRJdGVtQ2xpY2tlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUNvbnRleHRNb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtUG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbUlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZUNvbnRleHRNb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhci5TaW1wbGVDYWxsYmFjayIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5DYWxsYmFjayI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uQmFyLlNpbXBsZUNhbGxiYWNrIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5TaW1wbGVDYWxsYmFjayIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkNvbnRleHRJdGVtQ2xpY2tlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVDb250ZXh0TW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtUG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbUlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZUNvbnRleHRNb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFjdGl2aXR5IgogIGV4dGVuZHM9ImFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjEyLDYgKzE5OTQ2LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2IiB0eXBlPSJhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlJZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5VGFnIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaW5kVmlld0J5SWQiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI3Nyw2ICsyMDAzNywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFwcGxpY2F0aW9uIgogIHJldHVybj0iYW5kcm9pZC5hcHAuQXBwbGljYXRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1MjEsNiArMjAyOTIsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0NoYW5naW5nQ29uZmlndXJhdGlvbnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQ2hpbGQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzE1LDYgKzIxMTA4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5GcmFnbWVudFRyYW5zYWN0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvcGVuT3B0aW9uc01lbnUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzQxLDYgKzIxMTQ1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV4aXRBbmltIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDc3Nyw2ICsyMTU5NCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5SWZOZWVkZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NzM3LDYgKzI1NTcxLDkzNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRnJhZ21lbnQiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImVxdWFscyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpdml0eSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGl2aXR5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXRhaW5JbnN0YW5jZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYWciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc2hDb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBZGRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hpZGRlbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Zpc2libGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eVJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc3VsdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3Q29uZmlnIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db250ZXh0SXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUFuaW1hdGlvbiIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXh0QW5pbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51SW5mbyIgdHlwZT0iYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRldGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IaWRkZW5DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGlkZGVuIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSW5mbGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb3dNZW1vcnkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uT3B0aW9uc0l0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNNZW51Q2xvc2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QYXVzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVwYXJlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlYWR5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlc3VtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TYXZlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0b3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIYXNPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imhhc01lbnUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXRhaW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkVG9CYWNrU3RhY2siCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tbWl0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21BbmltYXRpb25zIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRlciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleGl0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNpdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb25TdHlsZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0FDVElWSVRZX0NMT1NFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODE5OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0FDVElWSVRZX09QRU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MTAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRU5URVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRU5URVJfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FWElUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODE5NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VYSVRfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9ISURFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODE5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfUFJFVklFV19ET05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1NIT1ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVEFTS19DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgyMDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9UQVNLX09QRU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MTA0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVEFTS19UT19CQUNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODIwMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1RBU0tfVE9fRlJPTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MTA2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVU5TRVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgyMDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MjA3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MTEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfV0FMTFBBUEVSX09QRU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MTA5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iSW5zdHJ1bWVudGF0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjYxODYsNiArMjc5NTEsMjI4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMaXN0RnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0RnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25MaXN0SXRlbUNsaWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibCIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyTWFuYWdpbmdGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdpbmdGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlTG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkluaXRpYWxpemVMb2FkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZENvbXBsZXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb2FkRmluaXNoZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTG9jYWxBY3Rpdml0eU1hbmFnZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDE4OCw2ICszMjE3NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNYXhpbXVtTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMjE0LDYgKzMyMjE0LDg0IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZFF1YWxpdHkiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzMjAsNiArMzIzOTgsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGltZU1zIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDMzNSw2ICszMjQyOCw5NiBAQAogPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZFF1YWxpdHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNDI5LDYgKzMyNjEyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzOTMyMTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzQwMjMsNiArMzYyMTcsNzEgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQXN5bmNUYXNrTG9hZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFzeW5jVGFza0xvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQXN5bmNUYXNrTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjYW5jZWxMb2FkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmb3JjZUxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRJbkJhY2tncm91bmQiCisgcmV0dXJuPSJEIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWxsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkJyb2FkY2FzdFJlY2VpdmVyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNzY2Niw2ICszOTkyNSwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zODI4OCw2ICs0MDU2NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RPUkFHRV9TRVJWSUNFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3N0b3JhZ2UmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVEVMRVBIT05ZX1NFUlZJQ0UiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzkwODIsNiArNDEzNzEsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zOTQwOCw2ICs0MTcxNiwyMjUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkN1cnNvckxvYWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQXN5bmNUYXNrTG9hZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGl2ZXJSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb2plY3Rpb24iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0aW9uIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNvcnRPcmRlciIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRJbkJhY2tncm91bmQiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvamVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uQXJncyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTb3J0T3JkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VXJpIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkRpYWxvZ0ludGVyZmFjZSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtNDQzODUsNiArNDY5MTIsMTcyIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsaXZlclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmb3JjZUxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29udGV4dCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRDb21wbGV0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJNdXRhYmxlQ29udGV4dFdyYXBwZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTQ0OTI0LDYgKzQ3NjE3LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmluZ1NldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZWYWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVnaXN0ZXJPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC00NTA1NSw2ICs0Nzc2MywyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRTdHJpbmdTZXQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlbW92ZSIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC00NTc3Miw2ICs0ODQ5NSwxNDUgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlhtbERvY3VtZW50UHJvdmlkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlhtbERvY3VtZW50UHJvdmlkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LlhtbERvY3VtZW50UHJvdmlkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsZXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyIgorIHJldHVybj0ib3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VVcmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpWG1sUHVsbFBhcnNlciIKKyByZXR1cm49Im9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnNlcnQiCisgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJxdWVyeSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5jb250ZW50LnBtIgogPgpAQCAtNDY0MzYsNiArNDkyOTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDk3MTUyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfSEFTX0NPREUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01MzQ5NCw2ICs1NjM2NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRVcGRhdGVkRmllbGQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU0NTE3LDYgKzU3NDAzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTQ3NTcsNiArNTc2NTYsNjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9CTE9CIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0ZMT0FUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0lOVEVHRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfTlVMTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9TVFJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ3Vyc29ySW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIKICBleHRlbmRzPSJqYXZhLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIKQEAgLTU1MTE0LDYgKzU4MDY4LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2wiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0Jsb2IiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1MTIxLDcgKzU4MDkwLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTEzNiw3ICs1ODEwNSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUxNTEsNyArNTgxMjAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTY2LDcgKzU4MTM1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTE4MSw3ICs1ODE1MCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTU1OTIsNiArNTg1NjEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1NjAzLDYgKzU4NTg1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdyYXBwZWRDdXJzb3IiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FmdGVyTGFzdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU5MTEsNiArNTg5MDQsMjcgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRGF0YWJhc2VFcnJvckhhbmRsZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkNvcnJ1cHRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiT2JqIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iRGF0YWJhc2VVdGlscyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2Nzk1LDYgKzU5ODA5LDM4IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1hdHJpeEN1cnNvciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0Q3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NTM4LDYgKzYwNTg0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NTUxLDYgKzYwNjA4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InRyYW5zYWN0aW9uTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zYWN0aW9uTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NjA3LDYgKzYwNjc3LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9IndoZXJlQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuZFRyYW5zYWN0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzY2Myw2ICs2MDc0NCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXR0YWNoZWREYnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQudXRpbC5QYWlyJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNYXhpbXVtU2l6ZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc3ODQsNiArNjA4NzYsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29uZmxpY3RBbGdvcml0aG0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RhdGFiYXNlSW50ZWdyaXR5T2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3OTAxLDYgKzYxMDA0LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlbkRhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc5MzEsNiArNjEwNTMsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4MTI0LDYgKzYxMjYzLDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29ubmVjdGlvblBvb2xTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9jYWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODE1MCw2ICs2MTMwMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NraW5nRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNYXhTcWxDYWNoZVNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhY2hlU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODM1Miw2ICs2MTUxNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUFYX1NRTF9DQUNIRV9TSVpFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik5PX0xPQ0FMSVpFRF9DT0xMQVRPUlMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01ODYxMCw2ICs2MTc4NiwyNCBAQAogPHBhcmFtZXRlciBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU9wZW5IZWxwZXIiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MjQ4OSw3ICs2NTY4Myw3IEBACiAgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImdsIiB0eXBlPSJqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCI+CkBAIC02MzI2OCw3ICs2NjQ2Miw3IEBACiA8bWV0aG9kIG5hbWU9ImRyYXdUZXh0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKQEAgLTYzNDE4LDcgKzY2NjEyLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTYzNDc1LDcgKzY2NjY5LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC02MzUzNiw2ICs2NjczMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzT3BhcXVlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02Mzg0OSw3ICs2NzA1NCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+CkBAIC03MzIxMCw2ICs3NjQxNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wdXRlQ29uc3RhbnRTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc0MTA0LDYgKzc3MzIwLDM2IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNaXBtYXBEcmF3YWJsZSIKKyBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5NaXBtYXBEcmF3YWJsZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRyYXdhYmxlIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik5pbmVQYXRjaERyYXdhYmxlIgogIGV4dGVuZHM9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTI1NTYzLDYgKzEyODgwOSwyNDAgQEAKIDwvbWV0aG9kPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KKzxwYWNrYWdlIG5hbWU9ImFuZHJvaWQub3Muc3RvcmFnZSIKKz4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25TdG9yYWdlU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVXNiTWFzc1N0b3JhZ2VDb25uZWN0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3RlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlTWFuYWdlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImRpc2FibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlVXNiTWFzc1N0b3JhZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVJlc3VsdENvZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRJbnRlcm5hbEVycm9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFCbGFuayIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0zIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQ29ycnVwdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii00IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE5vTWVkaWEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlQnVzeSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii03IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU5vdE1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25TdWNjZWVkZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZSIKID4KIDxjbGFzcyBuYW1lPSJDaGVja0JveFByZWZlcmVuY2UiCkBAIC0xMjYzNTYsNiArMTI5ODM2LDE0OCBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImZpbmRJbmRleE9mVmFsdWUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEVudHJpZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyaWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cmllcyIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJpZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJ5VmFsdWVzIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyeVZhbHVlc1Jlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlByZWZlcmVuY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzQ3MjYsNiArMTM4MzQ4LDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgorPGZpZWxkIG5hbWU9IkFVVE9fQUREIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2F1dG9fYWRkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkRFTEVURUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTM0NzM3LDYgKzEzODM3MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkFWT1JJVEVTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Zhdm9yaXRlcyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJHUk9VUF9WSVNJQkxFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0NDc2Miw3ICsxNDg0MDYsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KKzxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJlZm9yZVRleHRDaGFuZ2VkIgpAQCAtMTUyNTEzLDYgKzE1NjE1NywyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1Mjg1NywxNyArMTU2NTIwLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJhYm9ydFVwZGF0ZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTI4NzksMzAgKzE1NjUzMSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbW1pdFVwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbW1pdFVwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5Mb25nLCA/IGV4dGVuZHMgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Jmd0OyZndDsiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY29weVN0cmluZ1RvQnVmZmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTI5MjksMTcgKzE1NjU1Nyw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImRlbGV0ZVJvdyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QmxvYiIKICByZXR1cm49ImJ5dGVbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTMxMjUsOCArMTU2NzQyLDggQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgotIHJldHVybj0iYm9vbGVhbiIKKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMTUzMTM1LDggKzE1Njc1MiwxMCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJoYXNVcGRhdGVzIgorPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTE1MzM1MCwxNyArMTU2OTY5LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3VwcG9ydHNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTMzODcsMTI0ICsxNTY5OTUsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRG91YmxlIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVGbG9hdCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVJbnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUxvbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTaG9ydCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJzaG9ydCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTdHJpbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVUb051bGwiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1vY2tEaWFsb2dJbnRlcmZhY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE1ODQ4MCw2ICsxNjE5NzAsMjkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHRSdW5DdXJzb3IiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRTdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0RW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3JPcHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbnNlcnQiCiAgcmV0dXJuPSJhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTk1NDAsNyArMTYzMDUzLDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC50ZXh0LlRleHRQYWludCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJhdmFpbCIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CkBAIC0xNjk4MjksNyArMTczMzQyLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE2OTg0MCw3ICsxNzMzNTMsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSkmcXVvdDsiCisgdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkpJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE4MTAwOSw2ICsxODQ1MjIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2Nyb2xsYmFyRmFkaW5nRW5hYmxlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTgyNDg3LDYgKzE4NjAxMSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsQmFyU3R5bGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NjgxMiw2ICsxOTAzNDksMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzRmVhdHVyZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNTb2Z0SW5wdXRNb2RlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODY4MjMsNiArMTkwMzczLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVQYW5lbE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWN0aXZlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc0ODgsNiArMTkxMDUxLDE3IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9CQVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZFQVRVUkVfQ09OVEVYVF9NRU5VIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwMjQ0LDYgKzE5MzgxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZUZhY3RvciIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN0YXJ0T2Zmc2V0IgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAyODEsNiArMTkzODY2LDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zZm9ybWF0aW9uIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3VycmVudFRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0WkFkanVzdG1lbnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk3NTYwLDYgKzIwMTE2MiwxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QWxsb3dGaWxlQWNjZXNzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTgxNzUsNiArMjAxNzg4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWciIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGYW50YXN5Rm9udEZhbWlseSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk5MTU3LDYgKzIwMjc4MywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjYW5ab29tSW4iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhblpvb21PdXQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNhcHR1cmVQaWN0dXJlIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMjc0Niw2ICsyMDYzOTQsMTk1IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImxvYWRBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEN1cnNvckFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEN1cnNvckFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmluZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ29udGV4dCIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibVRyYW5zZm9ybWF0aW9uIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyYW5zZm9ybVRvUmVzb3VyY2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ29udGV4dCIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFscGhhYmV0SW5kZXhlciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQ3MzMsNiArMjA4NTcwLDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDdXJzb3JBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJiaW5kVmlldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMDQ4ODAsNiArMjA4NzMxLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluaXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibmV3RHJvcERvd25WaWV3IgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0OTUxLDYgKzIwODgxOSwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJRdWVyeVByb3ZpZGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5GaWx0ZXJRdWVyeVByb3ZpZGVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRkxBR19BVVRPX1JFUVVFUlkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkN1cnNvclRyZWVBZGFwdGVyIgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIiCkBAIC0yMDczOTAsNiArMjExMjgwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE51bUNvbHVtbnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3RyZXRjaE1vZGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NTc2LDYgKzIxMjQ3NywyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGluZWFyTGF5b3V0IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldEJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NjIwLDYgKzIxMjUzNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc01lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25MYXlvdXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODY5Myw2ICsyMTI2MTksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaG9yaXpvbnRhbEdyYXZpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE9yaWVudGF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg4ODksNiArMjEyODI4LDY2NSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjbGVhckxpc3RTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuY2hvclZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRpb25TdHlsZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCYWNrZ3JvdW5kIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SG9yaXpvbnRhbE9mZnNldCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnB1dE1ldGhvZE1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9tcHRQb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW0iCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbUlkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTb2Z0SW5wdXRNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZlcnRpY2FsT2Zmc2V0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdpZHRoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSW5wdXRNZXRob2ROb3ROZWVkZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTW9kYWwiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU2hvd2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25LZXlEb3duIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5UHJlSW1lIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5VXAiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXlDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVyZm9ybUl0ZW1DbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9zdFNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmNob3JWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmltYXRpb25TdHlsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvblN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmFja2dyb3VuZERyYXdhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIZWlnaHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIb3Jpem9udGFsT2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5wdXRNZXRob2RNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RTZWxlY3RvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdG9yIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1vZGFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kYWwiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25JdGVtQ2xpY2tMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNsaWNrTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGVkTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvbXB0UG9zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9tcHQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U29mdElucHV0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbE9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFdpZHRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX05FRURFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX05PVF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1BVENIX1BBUkVOVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9BQk9WRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9TSVRJT05fUFJPTVBUX0JFTE9XIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXUkFQX0NPTlRFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXciCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA5OTI5LDYgKzIxNDUyNywyMiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cFdpbmRvdyIKICB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyIKQEAgLTIxMDk1OCw2ICsyMTU1NzIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXhjbHVkZU1pbWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW1hZ2VUb0RlZmF1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1vZGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDUwNCw2ICsyMTkxMjksMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0SWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Ik1PREVfRElBTE9HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RST1BET1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNwaW5uZXJBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjIwMzMzLDYgKzIyNDk4MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1BfSUdFVF9XSURFX1ZPTEFUSUxFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjMyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik9QX0lOU1RBTkNFX09GIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjIwNjg1LDYgKzIyNTM0MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1BfSVBVVF9XSURFX1ZPTEFUSUxFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjMzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik9QX0xPTkdfVE9fRE9VQkxFIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjIxNDIyLDYgKzIyNjA5MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1BfU0dFVF9XSURFX1ZPTEFUSUxFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjM0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik9QX1NITF9JTlQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMjE2MjAsNiArMjI2MzAwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPUF9TUFVUX1dJREVfVk9MQVRJTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iT1BfU1VCX0RPVUJMRSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyMTg1NSwzMyArMjI2NTQ2LDYgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImRhbHZpay5zeXN0ZW0iCiA+Ci08Y2xhc3MgbmFtZT0iQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IkFsbG9jYXRpb25MaW1pdEVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJBbGxvY2F0aW9uTGltaXRFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLkFsbG9jYXRpb25MaW1pdEVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV0YWlsTWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgogPGNsYXNzIG5hbWU9IkRleENsYXNzTG9hZGVyIgogIGV4dGVuZHM9ImphdmEubGFuZy5DbGFzc0xvYWRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjIwNzQsMTAxMCArMjI2NzM4LDYgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgotPGNsYXNzIG5hbWU9IlBvdGVudGlhbERlYWRsb2NrRXJyb3IiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlBvdGVudGlhbERlYWRsb2NrRXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5Qb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iUG90ZW50aWFsRGVhZGxvY2tFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlBvdGVudGlhbERlYWRsb2NrRXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJkZXRhaWxNZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iU3RhbGVEZXhDYWNoZUVycm9yIgotIGV4dGVuZHM9ImphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJTdGFsZURleENhY2hlRXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5TdGFsZURleENhY2hlRXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJTdGFsZURleENhY2hlRXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5TdGFsZURleENhY2hlRXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJkZXRhaWxNZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVGVtcG9yYXJ5RGlyZWN0b3J5IgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlRlbXBvcmFyeURpcmVjdG9yeSIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlRlbXBvcmFyeURpcmVjdG9yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJzZXRVcERpcmVjdG9yeSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYmFzZURpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRVcERpcmVjdG9yeSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJ0cnVlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJiYXNlRGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVG91Y2hEZXgiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iVG91Y2hEZXgiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5Ub3VjaERleCIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJtYWluIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV4RmlsZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVk1EZWJ1ZyIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPG1ldGhvZCBuYW1lPSJkdW1wSHByb2ZEYXRhIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Ci08L2V4Y2VwdGlvbj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRBbGxvY0NvdW50IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEluc3RydWN0aW9uQ291bnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY291bnRzIiB0eXBlPSJpbnRbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRMb2FkZWRDbGFzc0NvdW50IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc0RlYnVnZ2VyQ29ubmVjdGVkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNEZWJ1Z2dpbmdFbmFibGVkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ibGFzdERlYnVnZ2VyQWN0aXZpdHkiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJwcmludExvYWRlZENsYXNzZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJyZXNldEFsbG9jQ291bnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ia2luZHMiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJyZXNldEluc3RydWN0aW9uQ291bnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRBbGxvY2F0aW9uTGltaXQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJsaW1pdCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEdsb2JhbEFsbG9jYXRpb25MaW1pdCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImxpbWl0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRBbGxvY0NvdW50aW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRFbXVsYXRvclRyYWNpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydEluc3RydWN0aW9uQ291bnRpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydE1ldGhvZFRyYWNpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydE1ldGhvZFRyYWNpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InRyYWNlRmlsZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImJ1ZmZlclNpemUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdG9wQWxsb2NDb3VudGluZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0b3BFbXVsYXRvclRyYWNpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdG9wSW5zdHJ1Y3Rpb25Db3VudGluZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0b3BNZXRob2RUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idGhyZWFkQ3B1VGltZU5hbm9zIgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxmaWVsZCBuYW1lPSJERUZBVUxUX01FVEhPRF9UUkFDRV9GSUxFX05BTUUiCi0gdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7L3NkY2FyZC9kbXRyYWNlLnRyYWNlJnF1b3Q7IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9BTExfQ09VTlRTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iLTEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9BTExPQ0FURURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfQ0xBU1NfSU5JVF9DT1VOVCIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjMyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0NMQVNTX0lOSVRfVElNRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjY0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0VYVF9BTExPQ0FURURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI4MTkyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0VYVF9BTExPQ0FURURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjQwOTYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRVhUX0ZSRUVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMzI3NjgiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRVhUX0ZSRUVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxNjM4NCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9GUkVFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjgiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRlJFRURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfR0NfSU5WT0NBVElPTlMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxNiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9BTExPQ0FURURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxMzEwNzIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQUxMT0NBVEVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI2NTUzNiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9DTEFTU19JTklUX0NPVU5UIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMjA5NzE1MiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9DTEFTU19JTklUX1RJTUUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0MTk0MzA0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0VYVF9BTExPQ0FURURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI1MzY4NzA5MTIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRVhUX0FMTE9DQVRFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMjY4NDM1NDU2IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0VYVF9GUkVFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9Ii0yMTQ3NDgzNjQ4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0VYVF9GUkVFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTA3Mzc0MTgyNCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9GUkVFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjUyNDI4OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9GUkVFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMjYyMTQ0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0dDX0lOVk9DQVRJT05TIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTA0ODU3NiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJUUkFDRV9DT1VOVF9BTExPQ1MiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJWTVJ1bnRpbWUiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxtZXRob2QgbmFtZT0iZ2NTb2Z0UmVmZXJlbmNlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRFeHRlcm5hbEJ5dGVzQWxsb2NhdGVkIgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldE1pbmltdW1IZWFwU2l6ZSIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0UnVudGltZSIKLSByZXR1cm49ImRhbHZpay5zeXN0ZW0uVk1SdW50aW1lIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uIgotIHJldHVybj0iZmxvYXQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJydW5GaW5hbGl6YXRpb25TeW5jIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldE1pbmltdW1IZWFwU2l6ZSIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJ0cnVlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic2l6ZSIgdHlwZT0ibG9uZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRUYXJnZXRIZWFwVXRpbGl6YXRpb24iCi0gcmV0dXJuPSJmbG9hdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ibmV3VGFyZ2V0IiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJWTVN0YWNrIgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iVk1TdGFjayIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlZNU3RhY2siCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyIgotIHJldHVybj0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDYWxsaW5nQ2xhc3NMb2FkZXIyIgotIHJldHVybj0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDbGFzc2VzIgotIHJldHVybj0iamF2YS5sYW5nLkNsYXNzJmx0Oz8mZ3Q7W10iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJtYXhEZXB0aCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdG9wQXRQcml2aWxlZ2VkIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFRocmVhZFN0YWNrVHJhY2UiCi0gcmV0dXJuPSJqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRbXSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InQiIHR5cGU9ImphdmEubGFuZy5UaHJlYWQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iWnlnb3RlIgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPG1ldGhvZCBuYW1lPSJmb3JrIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JrQW5kU3BlY2lhbGl6ZSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InVpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkcyIgdHlwZT0iaW50W10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlYnVnRmxhZ3MiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icmxpbWl0cyIgdHlwZT0iaW50W11bXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JrQW5kU3BlY2lhbGl6ZSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InVpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkcyIgdHlwZT0iaW50W10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImVuYWJsZURlYnVnZ2VyIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJybGltaXRzIiB0eXBlPSJpbnRbXVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmtTeXN0ZW1TZXJ2ZXIiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWJ1Z0ZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJsaW1pdHMiIHR5cGU9ImludFtdW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9ya1N5c3RlbVNlcnZlciIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InVpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkcyIgdHlwZT0iaW50W10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImVuYWJsZURlYnVnZ2VyIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJybGltaXRzIiB0eXBlPSJpbnRbXVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08ZmllbGQgbmFtZT0iREVCVUdfRU5BQkxFX0FTU0VSVCIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iREVCVUdfRU5BQkxFX0NIRUNLSk5JIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJERUJVR19FTkFCTEVfREVCVUdHRVIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkRFQlVHX0VOQUJMRV9TQUZFTU9ERSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjgiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08L2NsYXNzPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iamF2YS5hd3QuZm9udCIKID4KQEAgLTIyMzUzOSw2ICsyMjcxOTksNDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFUk5JTkciCisgdHlwZT0iamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFUk5JTkdfT04iCisgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTElHQVRVUkVTIgorIHR5cGU9ImphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMSUdBVFVSRVNfT04iCisgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTlVNRVJJQ19TSEFQSU5HIgogIHR5cGU9ImphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjIzNjg5LDYgKzIyNzM4OSwzNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBQ0tJTkciCisgdHlwZT0iamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQUNLSU5HX0xPT1NFIgorIHR5cGU9ImphdmEubGFuZy5GbG9hdCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFDS0lOR19USUdIVCIKKyB0eXBlPSJqYXZhLmxhbmcuRmxvYXQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVFJBTlNGT1JNIgogIHR5cGU9ImphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjI1MDk3LDcgKzIyODgyNyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJjaGFyW10iPgorPHBhcmFtZXRlciBuYW1lPSJidWZmZXIiIHR5cGU9ImNoYXJbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CkBAIC0yMjUxODksNiArMjI4OTE5LDEzMiBAQAogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkNvbnNvbGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkZsdXNoYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImZsdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmb3JtYXQiCisgcmV0dXJuPSJqYXZhLmlvLkNvbnNvbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwcmludGYiCisgcmV0dXJuPSJqYXZhLmlvLkNvbnNvbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWFkTGluZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZExpbmUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZFBhc3N3b3JkIgorIHJldHVybj0iY2hhcltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRQYXNzd29yZCIKKyByZXR1cm49ImNoYXJbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRlciIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlciIKKyByZXR1cm49ImphdmEuaW8uUHJpbnRXcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkRhdGFJbnB1dCIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjI2MjMxLDYgKzIzMDA4NywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubmV0LlVSSSI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNhbkV4ZWN1dGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNhblJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyNjM5Niw2ICsyMzAyNjMsMTcgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJlZVNwYWNlIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXROYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjY0NDAsNiArMjMwMzE4LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRvdGFsU3BhY2UiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVzYWJsZVNwYWNlIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0Fic29sdXRlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjY2MTMsNiArMjMwNTEzLDM0IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFeGVjdXRhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3duZXJPbmx5IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEV4ZWN1dGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJleGVjdXRhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldExhc3RNb2RpZmllZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjI2NjM3LDYgKzIzMDU2NSw2MiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZWFkYWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvd25lck9ubHkiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVhZGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXcml0YWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndyaXRhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvd25lck9ubHkiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V3JpdGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3cml0YWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ0b1VSSSIKICByZXR1cm49ImphdmEubmV0LlVSSSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjY2NTUsNyArMjMwNjM5LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPGV4Y2VwdGlvbiBuYW1lPSJNYWxmb3JtZWRVUkxFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiI+CkBAIC0yMjc0NjUsNiArMjMxNDQ5LDI1IEBACiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iSU9FcnJvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuRXJyb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJT0Vycm9yIgorIHR5cGU9ImphdmEuaW8uSU9FcnJvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iSU9FeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkV4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjc0OTEsNiArMjMxNDk0LDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRldGFpbE1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IklPRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iSU9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iSW5wdXRTdHJlYW0iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTIyNzcyNiw3ICsyMzE3NTEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJjaGFyW10iPgorPHBhcmFtZXRlciBuYW1lPSJidWZmZXIiIHR5cGU9ImNoYXJbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CkBAIC0yMjk1NjUsNiArMjMzNTkwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNsIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7PyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9va3VwQW55IgorIHJldHVybj0iamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0Oz8mZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iTk9fRklFTERTIgogIHR5cGU9ImphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjMwMjk5LDcgKzIzNDMzNyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImNoYXJbXSI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1ZmZlciIgdHlwZT0iY2hhcltdIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KQEAgLTIzMDMzNyw2ICsyMzQzNzUsMzAgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBpcGVkSW5wdXRTdHJlYW0iCisgdHlwZT0iamF2YS5pby5QaXBlZElucHV0U3RyZWFtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGlwZVNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUGlwZWRJbnB1dFN0cmVhbSIKKyB0eXBlPSJqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBpcGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY29ubmVjdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjMwNTEwLDYgKzIzNDU3MiwzMCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUGlwZWRSZWFkZXIiCisgdHlwZT0iamF2YS5pby5QaXBlZFJlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpcGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBpcGVkUmVhZGVyIgorIHR5cGU9ImphdmEuaW8uUGlwZWRSZWFkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uUGlwZWRXcml0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBpcGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIzMDgwNyw2ICsyMzQ4OTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xlYXJFcnJvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZm9ybWF0IgogIHJldHVybj0iamF2YS5pby5QcmludFN0cmVhbSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzEyNDcsNiArMjM1MzQ0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsZWFyRXJyb3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzIxNTAsNyArMjM2MjU4LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0ibG9uZyI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0yMzMxNjksNyArMjM3Mjc3LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImNidWYiIHR5cGU9ImNoYXJbXSI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoYXJzIiB0eXBlPSJjaGFyW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMjM5Mjg1LDYgKzI0MzM5MywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJkb3VibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJNQVhfRVhQT05FTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik1BWF9WQUxVRSIKICB0eXBlPSJkb3VibGUiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzOTI5Niw2ICsyNDM0MTUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTl9FWFBPTkVOVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xMDIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTl9OT1JNQUwiCisgdHlwZT0iZG91YmxlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJNSU5fVkFMVUUiCiAgdHlwZT0iZG91YmxlIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzk0MjUsNiArMjQzNTY2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9Im90aGVyIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmFsaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldERlY2xhcmluZ0NsYXNzIgogIHJldHVybj0iamF2YS5sYW5nLkNsYXNzJmx0O0UmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIzOTk0NCw2ICsyNDQwOTYsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJNQVhfRVhQT05FTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTUFYX1ZBTFVFIgogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzk5NTUsNiArMjQ0MTE4LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU5fRVhQT05FTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMTI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTl9OT1JNQUwiCisgdHlwZT0iZmxvYXQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEuMTc1NDk0MzVFLTM4ZiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJNSU5fVkFMVUUiCiAgdHlwZT0iZmxvYXQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI0MTU1OCw2ICsyNDU3NDMsMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlTaWduIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9InRydWUiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFnbml0dWRlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNpZ24iIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5U2lnbiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9InRydWUiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFnbml0dWRlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2lnbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY29zIgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0MTYyMyw2ICsyNDU4MzgsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEV4cG9uZW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImYiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEV4cG9uZW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoeXBvdCIKICByZXR1cm49ImRvdWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDE3OTcsNiArMjQ2MDM4LDYyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImwyIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRBZnRlciIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0QWZ0ZXIiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRVcCIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dFVwIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icG93IgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0MTg2Miw2ICsyNDYxNTksMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2NhbGIiCisgcmV0dXJuPSJkb3VibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZUZhY3RvciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNjYWxiIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlRmFjdG9yIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2lnbnVtIgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0MjUzMyw3ICsyNDY4NjAsNyBAQAogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudCI+CiA8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImdldEFubm90YXRpb24iCi0gcmV0dXJuPSJUIgorIHJldHVybj0iQSIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMjQyNTQyLDcgKzI0Njg2OSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhbm5vdGF0aW9uVHlwZSIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5ub3RhdGlvblR5cGUiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtBJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBbm5vdGF0aW9ucyIKQEAgLTI0NDUwOSw2ICsyNDg4MzYsMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlTaWduIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1hZ25pdHVkZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzaWduIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weVNpZ24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYWduaXR1ZGUiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzaWduIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3MiCiAgcmV0dXJuPSJkb3VibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ0NTc0LDYgKzI0ODkzMSwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJkb3VibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXhwb25lbnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXhwb25lbnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imh5cG90IgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NDc0OCw2ICsyNDkxMzEsNjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibDIiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEFmdGVyIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRBZnRlciIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dFVwIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0VXAiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwb3ciCiAgcmV0dXJuPSJkb3VibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ0ODEzLDYgKzI0OTI1MiwzNiBAQAogPHBhcmFtZXRlciBuYW1lPSJmIiB0eXBlPSJmbG9hdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzY2FsYiIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlRmFjdG9yIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2NhbGIiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVGYWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzaWdudW0iCiAgcmV0dXJuPSJkb3VibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ1MDkyLDYgKzI0OTU2MSwzNCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RyaW5nIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0cmluZyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iY2hhcltdIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTI0NTM2Niw3ICsyNDk4NjMsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ibG9jIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0yNDU0MTgsNiArMjQ5OTE1LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCeXRlcyIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFycyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ1NTA0LDYgKzI1MDAxNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0VtcHR5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsYXN0SW5kZXhPZiIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDU1ODEsNyArMjUwMTAyLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImV4cHIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvZmZzZXRCeUNvZGVQb2ludHMiCkBAIC0yNDU2NzksOSArMjUwMjAwLDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImV4cHIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3Vic3RpdHV0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcGxhY2VtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlcGxhY2VGaXJzdCIKQEAgLTI0NTY5NCw5ICsyNTAyMTUsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iZXhwciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InJlZ3VsYXJFeHByZXNzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdWJzdGl0dXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVwbGFjZW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3BsaXQiCkBAIC0yNDU3MDksNyArMjUwMjMwLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImV4cHIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzcGxpdCIKQEAgLTI0NTcyMiw5ICsyNTAyNDMsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iZXhwciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InJlZ3VsYXJFeHByZXNzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXgiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImxpbWl0IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRzV2l0aCIKQEAgLTI0NzA2NCw2ICsyNTE1ODUsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbnNvbGUiCisgcmV0dXJuPSJqYXZhLmlvLkNvbnNvbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjdXJyZW50VGltZU1pbGxpcyIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjUzOTIyLDYgKzI1ODQ1NCwyMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNvb2tpZU1hbmFnZXIiCisgZXh0ZW5kcz0iamF2YS5uZXQuQ29va2llSGFuZGxlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvb2tpZU1hbmFnZXIiCisgdHlwZT0iamF2YS5uZXQuQ29va2llTWFuYWdlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvb2tpZU1hbmFnZXIiCisgdHlwZT0iamF2YS5uZXQuQ29va2llTWFuYWdlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0b3JlIiB0eXBlPSJqYXZhLm5ldC5Db29raWVTdG9yZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29va2llUG9saWN5IiB0eXBlPSJqYXZhLm5ldC5Db29raWVQb2xpY3kiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RIZWFkZXJzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29va2llU3RvcmUiCisgcmV0dXJuPSJqYXZhLm5ldC5Db29raWVTdG9yZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubmV0LlVSSSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzcG9uc2VIZWFkZXJzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29va2llUG9saWN5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29va2llUG9saWN5IiB0eXBlPSJqYXZhLm5ldC5Db29raWVQb2xpY3kiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvb2tpZVBvbGljeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9InNob3VsZEFjY2VwdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvb2tpZSIgdHlwZT0iamF2YS5uZXQuSHR0cENvb2tpZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFDQ0VQVF9BTEwiCisgdHlwZT0iamF2YS5uZXQuQ29va2llUG9saWN5IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSJudWxsIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDQ0VQVF9OT05FIgorIHR5cGU9ImphdmEubmV0LkNvb2tpZVBvbGljeSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ0NFUFRfT1JJR0lOQUxfU0VSVkVSIgorIHR5cGU9ImphdmEubmV0LkNvb2tpZVBvbGljeSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJDb29raWVTdG9yZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvb2tpZSIgdHlwZT0iamF2YS5uZXQuSHR0cENvb2tpZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLm5ldC5IdHRwQ29va2llJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubmV0LlVSSSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb29raWVzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5uZXQuSHR0cENvb2tpZSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVUklzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5uZXQuVVJJJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvb2tpZSIgdHlwZT0iamF2YS5uZXQuSHR0cENvb2tpZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBbGwiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkRhdGFncmFtUGFja2V0IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjU0OTgwLDYgKzI1OTczOSwzMzAgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJIdHRwQ29va2llIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSHR0cENvb2tpZSIKKyB0eXBlPSJqYXZhLm5ldC5IdHRwQ29va2llIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZG9tYWluTWF0Y2hlcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZG9tYWluUGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaG9zdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb21tZW50IgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb21tZW50VVJMIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNjYXJkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREb21haW4iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1heEFnZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGF0aCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UG9ydGxpc3QiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlY3VyZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZlcnNpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzRXhwaXJlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGFyc2UiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLm5ldC5IdHRwQ29va2llJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoZWFkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29tbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29tbWVudFVSTCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbW1lbnRVUkwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzY2FyZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRpc2NhcmQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RG9tYWluIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNYXhBZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZWx0YVNlY29uZHMiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGF0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UG9ydGxpc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3J0TGlzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWN1cmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWN1cmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWZXJzaW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikh0dHBSZXRyeUV4Y2VwdGlvbiIKICBleHRlbmRzPSJqYXZhLmlvLklPRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI1NTY4Miw2ICsyNjA3NjUsOTMgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IklETiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0idG9BU0NJSSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9BU0NJSSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9Vbmljb2RlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0b1VuaWNvZGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUxMT1dfVU5BU1NJR05FRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVVNFX1NURDNfQVNDSUlfUlVMRVMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJJbmV0NEFkZHJlc3MiCiAgZXh0ZW5kcz0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjU2MDI0LDcgKzI2MTE5NCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJuZXRpZiIgdHlwZT0iamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ldHdvcmtJbnRlcmZhY2UiIHR5cGU9ImphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InR0bCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMjU2MTcxLDYgKzI2MTM0MSw0OCBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkludGVyZmFjZUFkZHJlc3MiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRBZGRyZXNzIgorIHJldHVybj0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QnJvYWRjYXN0IgorIHJldHVybj0iamF2YS5uZXQuSW5ldEFkZHJlc3MiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmV0d29ya1ByZWZpeExlbmd0aCIKKyByZXR1cm49InNob3J0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkphclVSTENvbm5lY3Rpb24iCiAgZXh0ZW5kcz0iamF2YS5uZXQuVVJMQ29ubmVjdGlvbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI1NjY3Myw2ICsyNjE4ODUsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGFyZHdhcmVBZGRyZXNzIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTb2NrZXRFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRJbmV0QWRkcmVzc2VzIgogIHJldHVybj0iamF2YS51dGlsLkVudW1lcmF0aW9uJmx0O2phdmEubmV0LkluZXRBZGRyZXNzJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNTY2ODQsNiArMjYxOTA5LDMwIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEludGVyZmFjZUFkZHJlc3NlcyIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubmV0LkludGVyZmFjZUFkZHJlc3MmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1UVSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU29ja2V0RXhjZXB0aW9uIiB0eXBlPSJqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjU2NzA4LDYgKzI2MTk1Nyw5MSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTb2NrZXRFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXJlbnQiCisgcmV0dXJuPSJqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YkludGVyZmFjZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24mbHQ7amF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNMb29wYmFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNvY2tldEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUG9pbnRUb1BvaW50IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU29ja2V0RXhjZXB0aW9uIiB0eXBlPSJqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNVcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNvY2tldEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVmlydHVhbCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3VwcG9ydHNNdWx0aWNhc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTb2NrZXRFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiIKQEAgLTI1NzA0Miw5ICsyNjIzNzYsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubmV0LlVSSSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icnFzdE1ldGhvZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RNZXRob2QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJxc3RIZWFkZXJzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RIZWFkZXJzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0yNTc2MTQsNyArMjYyOTQ4LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImFuSW1wbCIgdHlwZT0iamF2YS5uZXQuU29ja2V0SW1wbCI+Cis8cGFyYW1ldGVyIG5hbWU9ImltcGwiIHR5cGU9ImphdmEubmV0LlNvY2tldEltcGwiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IlNvY2tldEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMjU4OTQwLDcgKzI2NDI3NCw3IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9InNjaGVtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idXNlcmluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJ1c2VySW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTI2MDYyMCw3ICsyNjU5NTQsNyBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJlbmMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMjYwOTY2LDYgKzI2NjMwMCwyOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iYXJyYXkiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXJyYXlPZmZzZXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYXBhY2l0eSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNjA5OTksNiArMjY2MzU1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0FycmF5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1JlbWFpbmluZyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjYxMDEwLDYgKzI2NjM3NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RpcmVjdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1JlYWRPbmx5IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI2NzQ0Niw3ICsyNzI4MjQsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icmVwbCIgdHlwZT0iYnl0ZVtdIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVwbGFjZW1lbnQiIHR5cGU9ImJ5dGVbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtYWxmb3JtZWRJbnB1dEFjdGlvbiIKQEAgLTI2Nzc2NSw3ICsyNzMxNDMsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iY2hhcnNldCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoYXJzZXROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0Q2hhcnNldE5hbWUiCkBAIC0yNjc4NTUsNyArMjczMjMzLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImNoYXJzZXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJjaGFyc2V0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldENoYXJzZXROYW1lIgpAQCAtMjgxNTY2LDYgKzI4Njk0NCwxOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZnJlZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QXJyYXkiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgxNzQ2LDYgKzI4NzEzNyw3NiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXBkYXRlQ291bnRzIiB0eXBlPSJpbnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cGRhdGVDb3VudHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQmF0Y2hVcGRhdGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuQmF0Y2hVcGRhdGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IlNRTFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cGRhdGVDb3VudHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQmF0Y2hVcGRhdGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuQmF0Y2hVcGRhdGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IlNRTFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVwZGF0ZUNvdW50cyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJCYXRjaFVwZGF0ZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5CYXRjaFVwZGF0ZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9InVwZGF0ZUNvdW50cyIgdHlwZT0iaW50W10iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgpAQCAtMjgxODEwLDYgKzI4NzI3MSwxOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZnJlZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QmluYXJ5U3RyZWFtIgogIHJldHVybj0iamF2YS5pby5JbnB1dFN0cmVhbSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MTgyMyw2ICsyODcyOTcsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QmluYXJ5U3RyZWFtIgorIHJldHVybj0iamF2YS5pby5JbnB1dFN0cmVhbSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Qnl0ZXMiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODIxNjIsNiArMjg3NjUzLDM2IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsb2IiCiAgcmV0dXJuPSJqYXZhLnNxbC5DbG9iIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgyMzc2LDYgKzI4Nzg5Nyw5NiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0iamF2YS5pby5SZWFkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5DbG9iIgorIHJldHVybj0iamF2YS5zcWwuTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TkNsb2IiCisgcmV0dXJuPSJqYXZhLnNxbC5OQ2xvYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROU3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROU3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRPYmplY3QiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgyNDcwLDYgKzI4ODA4MSw2NiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3dJZCIKKyByZXR1cm49ImphdmEuc3FsLlJvd0lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvd0lkIgorIHJldHVybj0iamF2YS5zcWwuUm93SWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U1FMWE1MIgorIHJldHVybj0iamF2YS5zcWwuU1FMWE1MIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNRTFhNTCIKKyByZXR1cm49ImphdmEuc3FsLlNRTFhNTCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTaG9ydCIKICByZXR1cm49InNob3J0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgyODE3LDYgKzI4ODQ4OCw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QmlnRGVjaW1hbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODI4NTMsNiArMjg4NTYwLDk1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJpbmFyeVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuc3FsLkJsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRCb29sZWFuIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MjkyMyw2ICsyODg3MTksOTUgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5DbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MzAyNyw2ICsyODg5MTIsMTEyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROU3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TnVsbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODMxMjAsNiArMjg5MTExLDQwIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvd0lkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4bWxPYmplY3QiIHR5cGU9ImphdmEuc3FsLlNRTFhNTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2hvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzMjU3LDYgKzI4OTI4MiwzOSBAQAogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkNsaWVudEluZm9TdGF0dXMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLkVudW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZU9mIgorIHJldHVybj0iamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlcyIKKyByZXR1cm49ImphdmEuc3FsLkNsaWVudEluZm9TdGF0dXNbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkNsb2IiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI4MzI2NCw2ICsyODkzMjIsMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImZyZWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFzY2lpU3RyZWFtIgogIHJldHVybj0iamF2YS5pby5JbnB1dFN0cmVhbSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MzI5MCw2ICsyODkzNjEsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0iamF2YS5pby5SZWFkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN1YlN0cmluZyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODM0NDUsNiArMjg5NTMzLDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnNxbC5XcmFwcGVyIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iY2xlYXJXYXJuaW5ncyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODM0ODQsNiArMjg5NTc0LDc1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZUFycmF5T2YiCisgcmV0dXJuPSJqYXZhLnNxbC5BcnJheSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0eXBlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudHMiIHR5cGU9ImphdmEubGFuZy5PYmplY3RbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlQmxvYiIKKyByZXR1cm49ImphdmEuc3FsLkJsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlQ2xvYiIKKyByZXR1cm49ImphdmEuc3FsLkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlTkNsb2IiCisgcmV0dXJuPSJqYXZhLnNxbC5OQ2xvYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjcmVhdGVTUUxYTUwiCisgcmV0dXJuPSJqYXZhLnNxbC5TUUxYTUwiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY3JlYXRlU3RhdGVtZW50IgogIHJldHVybj0iamF2YS5zcWwuU3RhdGVtZW50IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzNTMzLDYgKzI4OTY5MiwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjcmVhdGVTdHJ1Y3QiCisgcmV0dXJuPSJqYXZhLnNxbC5TdHJ1Y3QiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHlwZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9ImphdmEubGFuZy5PYmplY3RbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QXV0b0NvbW1pdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODM1NTksNiArMjg5NzM1LDM0IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENsaWVudEluZm8iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENsaWVudEluZm8iCisgcmV0dXJuPSJqYXZhLnV0aWwuUHJvcGVydGllcyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIb2xkYWJpbGl0eSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MzY1MCw2ICsyODk4NTQsMjEgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNWYWxpZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuYXRpdmVTUUwiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzODk5LDYgKzI5MDExOCwzOCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbGllbnRJbmZvIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbGllbnRJbmZvIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJqYXZhLnV0aWwuUHJvcGVydGllcyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRIb2xkYWJpbGl0eSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODQwNzEsNiArMjkwMzIyLDI2IEBACiA8cGFyYW1ldGVyIG5hbWU9InRyYW5zZmVyU2l6ZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEYXRhVHJ1bmNhdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5EYXRhVHJ1bmNhdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlciIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YVNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNmZXJTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0RGF0YVNpemUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjg0MTM0LDYgKzI5MDQwNSw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5zcWwuV3JhcHBlciI+Cis8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImFsbFByb2NlZHVyZXNBcmVDYWxsYWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODQxNjAsNiArMjkwNDMzLDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImF1dG9Db21taXRGYWlsdXJlQ2xvc2VzQWxsUmVzdWx0U2V0cyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGF0YURlZmluaXRpb25DYXVzZXNUcmFuc2FjdGlvbkNvbW1pdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODQyOTcsNiArMjkwNTgzLDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENsaWVudEluZm9Qcm9wZXJ0aWVzIgorIHJldHVybj0iamF2YS5zcWwuUmVzdWx0U2V0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENvbHVtblByaXZpbGVnZXMiCiAgcmV0dXJuPSJqYXZhLnNxbC5SZXN1bHRTZXQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODQ1MjIsNiArMjkwODIxLDQ2IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZ1bmN0aW9uQ29sdW1ucyIKKyByZXR1cm49ImphdmEuc3FsLlJlc3VsdFNldCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXRhbG9nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2hlbWFQYXR0ZXJuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmdW5jdGlvbk5hbWVQYXR0ZXJuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5OYW1lUGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnVuY3Rpb25zIgorIHJldHVybj0iamF2YS5zcWwuUmVzdWx0U2V0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdGFsb2ciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjaGVtYVBhdHRlcm4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ1bmN0aW9uTmFtZVBhdHRlcm4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldElkZW50aWZpZXJRdW90ZVN0cmluZyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODQ5NjEsNiArMjkxMzAwLDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvd0lkTGlmZXRpbWUiCisgcmV0dXJuPSJqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNRTEtleXdvcmRzIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4NTAxMyw2ICsyOTEzNjUsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2NoZW1hcyIKKyByZXR1cm49ImphdmEuc3FsLlJlc3VsdFNldCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXRhbG9nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2hlbWFQYXR0ZXJuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTZWFyY2hTdHJpbmdFc2NhcGUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg2MjYyLDYgKzI5MjYzMSwxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1N0b3JlZEZ1bmN0aW9uc1VzaW5nQ2FsbFN5bnRheCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3VwcG9ydHNTdG9yZWRQcm9jZWR1cmVzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4NjU2Nyw2ICsyOTI5NDksMTM4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbkNvbHVtbkluIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbkNvbHVtbkluT3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbkNvbHVtbk91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25Db2x1bW5SZXN1bHQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZ1bmN0aW9uQ29sdW1uVW5rbm93biIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25Ob051bGxzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbk5vVGFibGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZ1bmN0aW9uTnVsbGFibGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZ1bmN0aW9uTnVsbGFibGVVbmtub3duIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvblJlc3VsdFVua25vd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZ1bmN0aW9uUmV0dXJuIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvblJldHVybnNUYWJsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaW1wb3J0ZWRLZXlDYXNjYWRlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjg2Nzg3LDYgKzI5MzMwMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3FsU3RhdGVTUUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNxbFN0YXRlU1FMOTkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yODczNzMsNiArMjkzODk4LDE2IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5zcWwuQ2xvYiI+Cis8L2ltcGxlbWVudHM+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iUGFyYW1ldGVyTWV0YURhdGEiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI4NzM4MCw2ICsyOTM5MTUsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuc3FsLldyYXBwZXIiPgorPC9pbXBsZW1lbnRzPgogPG1ldGhvZCBuYW1lPSJnZXRQYXJhbWV0ZXJDbGFzc05hbWUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg3NzI3LDYgKzI5NDI2NCw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QmlnRGVjaW1hbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODc3NjMsNiArMjk0MzM2LDQyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJpbmFyeVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg3NzgwLDYgKzI5NDM4OSw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Qm9vbGVhbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODc4NTAsNiArMjk0NDk1LDQyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg3ODY3LDYgKzI5NDU0OCw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERhdGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg3OTcxLDYgKzI5NDY4OCwxMTIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLnNxbC5OQ2xvYiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5TdHJpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXROdWxsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4ODA4MSw2ICsyOTQ5MDQsNDAgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um93SWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuc3FsLlJvd0lkIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTUUxYTUwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InhtbE9iamVjdCIgdHlwZT0iamF2YS5zcWwuU1FMWE1MIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTaG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODgyOTUsNiArMjk1MTUyLDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnNxbC5XcmFwcGVyIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iYWJzb2x1dGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg4OTI2LDYgKzI5NTc4NSwxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIb2xkYWJpbGl0eSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRJbnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODg5OTksNiArMjk1ODcxLDk2IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLlJlYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0iamF2YS5pby5SZWFkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5DbG9iIgorIHJldHVybj0iamF2YS5zcWwuTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TkNsb2IiCisgcmV0dXJuPSJqYXZhLnNxbC5OQ2xvYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TlN0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TlN0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE9iamVjdCIKICByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODkxMDYsNiArMjk2MDY4LDY2IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvd0lkIgorIHJldHVybj0iamF2YS5zcWwuUm93SWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um93SWQiCisgcmV0dXJuPSJqYXZhLnNxbC5Sb3dJZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U1FMWE1MIgorIHJldHVybj0iamF2YS5zcWwuU1FMWE1MIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNRTFhNTCIKKyByZXR1cm49ImphdmEuc3FsLlNRTFhNTCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2hvcnQiCiAgcmV0dXJuPSJzaG9ydCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4OTQzMiw2ICsyOTY0NTQsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNDbG9zZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRmlyc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg5NjkyLDYgKzI5NjcyNyw3OCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUFzY2lpU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQmlnRGVjaW1hbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODk3NjQsNiArMjk2ODcxLDc4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUJpbmFyeVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUJpbmFyeVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODk3OTgsNiArMjk2OTc3LDc4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGVCb29sZWFuIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4OTkzOCw2ICsyOTcxODksNzggQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZUNsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg5OTcyLDYgKzI5NzI5NSw3OCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGVEYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5MDE0Miw2ICsyOTc1MzcsMjE4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5DbG9iIiB0eXBlPSJqYXZhLnNxbC5OQ2xvYiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuQ2xvYiIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOU3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOU3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iblN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlTnVsbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTAyOTEsNiArMjk3ODk4LDc0IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZVJvd0lkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlUm93SWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlU1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4bWxPYmplY3QiIHR5cGU9ImphdmEuc3FsLlNRTFhNTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlU1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieG1sT2JqZWN0IiB0eXBlPSJqYXZhLnNxbC5TUUxYTUwiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5MDU1OCw2ICsyOTgyMzMsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuc3FsLldyYXBwZXIiPgorPC9pbXBsZW1lbnRzPgogPG1ldGhvZCBuYW1lPSJnZXRDYXRhbG9nTmFtZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTA5MDUsNiArMjk4NTgyLDIzMyBAQAogPgogPC9maWVsZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJSb3dJZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImVxdWFscyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJ5dGVzIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzaENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0b1N0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iUm93SWRMaWZldGltZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuRW51bSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9InZhbHVlT2YiCisgcmV0dXJuPSJqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWVzIgorIHJldHVybj0iamF2YS5zcWwuUm93SWRMaWZldGltZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFpbGVkUHJvcGVydGllcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFpbGVkUHJvcGVydGllcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWlsZWRQcm9wZXJ0aWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFpbGVkUHJvcGVydGllcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFpbGVkUHJvcGVydGllcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRGYWlsZWRQcm9wZXJ0aWVzIgorIHJldHVybj0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU1FMRGF0YSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjkwOTU4LDYgKzI5ODg2MiwxMTEgQEAKIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJTUUxEYXRhRXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRGF0YUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxEYXRhRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRGF0YUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxEYXRhRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxEYXRhRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTERhdGFFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRGF0YUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxEYXRhRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRGF0YUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxEYXRhRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkV4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTA5NjYsNiArMjk4OTc1LDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuSXRlcmFibGUiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgogPC9pbXBsZW1lbnRzPgogPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEV4Y2VwdGlvbiIKQEAgLTI5MTAxMiw2ICsyOTkwMjMsNTggQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGhlRXJyb3JDb2RlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVDYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQ2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVNRTFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVDYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlU1FMU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUVycm9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVDYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldEVycm9yQ29kZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTEwNDUsNiArMjk5MTA4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Iml0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O2phdmEubGFuZy5UaHJvd2FibGUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE5leHRFeGNlcHRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5MTA1OSw2ICsyOTkxMzMsMTExIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU1FMSW5wdXQiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI5MTI2MSw2ICsyOTk0NDAsMzIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZE5DbG9iIgorIHJldHVybj0iamF2YS5zcWwuTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZE5TdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlYWRPYmplY3QiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkxMjg3LDYgKzI5OTQ5MiwzMiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWFkUm93SWQiCisgcmV0dXJuPSJqYXZhLnNxbC5Sb3dJZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWFkU1FMWE1MIgorIHJldHVybj0iamF2YS5zcWwuU1FMWE1MIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlYWRTaG9ydCIKICByZXR1cm49InNob3J0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkxMzY2LDYgKzI5OTU5Nyw0MjYgQEAKIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJTUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgZXh0ZW5kcz0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJTUUxPdXRwdXQiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI5MTU5OCw2ICszMDAyNDksMzYgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVOQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlTlN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0id3JpdGVPYmplY3QiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkxNjI4LDYgKzMwMDMwOSwzNiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZVJvd0lkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVTUUxYTUwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuc3FsLlNRTFhNTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0id3JpdGVTaG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTE3NTQsNiArMzAwNDY1LDYzNiBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFJlY292ZXJhYmxlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMU3ludGF4RXJyb3JFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMVGltZW91dEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRpbWVvdXRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVGltZW91dEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRpbWVvdXRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVGltZW91dEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVGltZW91dEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUaW1lb3V0RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRpbWVvdXRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVGltZW91dEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRpbWVvdXRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVGltZW91dEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTFdhcm5pbmciCiAgZXh0ZW5kcz0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5MTgwOCw2ICszMDExNDksNTggQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGhlRXJyb3JDb2RlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFdhcm5pbmciCisgdHlwZT0iamF2YS5zcWwuU1FMV2FybmluZyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxXYXJuaW5nIgorIHR5cGU9ImphdmEuc3FsLlNRTFdhcm5pbmciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxXYXJuaW5nIgorIHR5cGU9ImphdmEuc3FsLlNRTFdhcm5pbmciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IlNRTFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMV2FybmluZyIKKyB0eXBlPSJqYXZhLnNxbC5TUUxXYXJuaW5nIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJTUUxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldE5leHRXYXJuaW5nIgogIHJldHVybj0iamF2YS5zcWwuU1FMV2FybmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTE4MzMsNiArMzAxMjI2LDEzNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlNRTFhNTCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImZyZWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJpbmFyeVN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uSW5wdXRTdHJlYW0iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0iamF2YS5pby5SZWFkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U291cmNlIgorIHJldHVybj0iVCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzb3VyY2VDbGFzcyIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJpbmFyeVN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uT3V0cHV0U3RyZWFtIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uV3JpdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlc3VsdCIKKyByZXR1cm49IlQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzdWx0Q2xhc3MiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJTYXZlcG9pbnQiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI5MTg3NCw2ICszMDEzOTgsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuc3FsLldyYXBwZXIiPgorPC9pbXBsZW1lbnRzPgogPG1ldGhvZCBuYW1lPSJhZGRCYXRjaCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTIyOTgsNiArMzAxODI0LDMyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ2xvc2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Bvb2xhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDdXJzb3JOYW1lIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5MjM4OCw2ICszMDE5NDAsMjEgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UG9vbGFibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvb2xhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRRdWVyeVRpbWVvdXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkyODk2LDYgKzMwMjQ2MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTE9OR05WQVJDSEFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTE2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkxPTkdWQVJCSU5BUlkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTI5MTgsNiArMzAyNDk2LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQ0hBUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQ0xPQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIwMTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTlVMTCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI5Mjk0MCw2ICszMDI1NDAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5WQVJDSEFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iT1RIRVIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTI5NzMsNiArMzAyNTg0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJST1dJRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii04IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlNNQUxMSU5UIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjkyOTg0LDYgKzMwMjYwNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1FMWE1MIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjAwOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJTVFJVQ1QiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTMwNTEsNiArMzAyNjg0LDQ0IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iV3JhcHBlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImlzV3JhcHBlckZvciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWZhY2UiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDs/Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW53cmFwIgorIHJldHVybj0iVCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZmFjZSIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJqYXZhLnRleHQiCiA+CkBAIC0yOTM4NDEsMjEgKzMwMzUxMiw2IEBACiA8cGFyYW1ldGVyIG5hbWU9IndoZXJlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEludCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TGluZUluc3RhbmNlIgogIHJldHVybj0iamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjkzODgwLDIxICszMDM1MzYsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRMb25nIgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2VudGVuY2VJbnN0YW5jZSIKICByZXR1cm49ImphdmEudGV4dC5CcmVha0l0ZXJhdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5MzkxOSwyMSArMzAzNTYwLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2hvcnQiCi0gcmV0dXJuPSJzaG9ydCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJidWYiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKICByZXR1cm49ImphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5NDU1MSwxNyArMzA0MTc3LDI3IEBACiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvbGxhdGlvbktleSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ29tcGFyYWJsZSI+CiA8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29sbGF0aW9uS2V5IgorIHR5cGU9ImphdmEudGV4dC5Db2xsYXRpb25LZXkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJzb3VyY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjb21wYXJlVG8iCiAgcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjk0NTg1LDcgKzMwNDIyMSw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idG9CeXRlQXJyYXkiCiAgcmV0dXJuPSJieXRlW10iCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjk1NzU0LDYgKzMwNTM5MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBdmFpbGFibGVMb2NhbGVzIgorIHJldHVybj0iamF2YS51dGlsLkxvY2FsZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0RXJhcyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTU3NjUsNiArMzA1NDEyLDMwIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlIgorIHJldHVybj0iamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZSIKKyByZXR1cm49ImphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMb2NhbFBhdHRlcm5DaGFycyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk1OTMyLDcgKzMwNTYwMyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW11bXSI+Cis8cGFyYW1ldGVyIG5hbWU9InpvbmVTdHJpbmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW11bXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KQEAgLTI5NjMwOSw3ICszMDU5ODAsNyBAQAogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KQEAgLTI5NjM0Niw2ICszMDYwMTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXZhaWxhYmxlTG9jYWxlcyIKKyByZXR1cm49ImphdmEudXRpbC5Mb2NhbGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEN1cnJlbmN5IgogIHJldHVybj0iamF2YS51dGlsLkN1cnJlbmN5IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5NjM5MCw2ICszMDYwNzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXhwb25lbnRTZXBhcmF0b3IiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEdyb3VwaW5nU2VwYXJhdG9yIgogIHJldHVybj0iY2hhciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTY0MTIsNiArMzA2MTA1LDMwIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlIgorIHJldHVybj0iamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5zdGFuY2UiCisgcmV0dXJuPSJqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVybmF0aW9uYWxDdXJyZW5jeVN5bWJvbCIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk2NTUyLDYgKzMwNjI2OSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iY2hhciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFeHBvbmVudFNlcGFyYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEdyb3VwaW5nU2VwYXJhdG9yIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTY4MTEsNyArMzA2NTQxLDcgQEAKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvbmUiCkBAIC0yOTcwMDUsOSArMzA2NzM1LDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRlbXBsYXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvYmplY3RzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRGb3JtYXRzIgpAQCAtMjk3MTk4LDYgKzMwNjkyOCw3OCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTm9ybWFsaXplciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iaXNOb3JtYWxpemVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm0iIHR5cGU9ImphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibm9ybWFsaXplIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm0iIHR5cGU9ImphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTm9ybWFsaXplci5Gb3JtIgorIGV4dGVuZHM9ImphdmEubGFuZy5FbnVtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZU9mIgorIHJldHVybj0iamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlcyIKKyByZXR1cm49ImphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm1bXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTnVtYmVyRm9ybWF0IgogIGV4dGVuZHM9ImphdmEudGV4dC5Gb3JtYXQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTcyMTEsNyArMzA3MDEzLDcgQEAKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZm9ybWF0IgpAQCAtMjk3NDc3LDYgKzMwNzI3OSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um91bmRpbmdNb2RlIgorIHJldHVybj0iamF2YS5tYXRoLlJvdW5kaW5nTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0dyb3VwaW5nVXNlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk3NjM1LDYgKzMwNzQ0OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3VuZGluZ01vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3VuZGluZ01vZGUiIHR5cGU9ImphdmEubWF0aC5Sb3VuZGluZ01vZGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJGUkFDVElPTl9GSUVMRCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI5ODg3Myw2ICszMDg2OTksMTQ2IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuTWFwLkVudHJ5Ij4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeSIKKyB0eXBlPSJqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVLZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeSIKKyB0eXBlPSJqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb3B5RnJvbSIgdHlwZT0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDs/IGV4dGVuZHMgSywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0S2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZSIKKyByZXR1cm49IlYiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWUiCisgcmV0dXJuPSJWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmplY3QiIHR5cGU9IlYiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuTWFwLkVudHJ5Ij4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBYnN0cmFjdE1hcC5TaW1wbGVJbW11dGFibGVFbnRyeSIKKyB0eXBlPSJqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVLZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBYnN0cmFjdE1hcC5TaW1wbGVJbW11dGFibGVFbnRyeSIKKyB0eXBlPSJqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb3B5RnJvbSIgdHlwZT0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDs/IGV4dGVuZHMgSywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0S2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZSIKKyByZXR1cm49IlYiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWUiCisgcmV0dXJuPSJWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmplY3QiIHR5cGU9IlYiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWJzdHJhY3RRdWV1ZSIKICBleHRlbmRzPSJqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjk4OTc2LDYgKzMwODk0MiwzNDAgQEAKID4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFycmF5RGVxdWUiCisgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuRGVxdWUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFycmF5RGVxdWUiCisgdHlwZT0iamF2YS51dGlsLkFycmF5RGVxdWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBcnJheURlcXVlIgorIHR5cGU9ImphdmEudXRpbC5BcnJheURlcXVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWluU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBcnJheURlcXVlIgorIHR5cGU9ImphdmEudXRpbC5BcnJheURlcXVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIEUmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkRmlyc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZExhc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb25lIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5RGVxdWUmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0l0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVsZW1lbnQiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJGaXJzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJMYXN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWtMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3AiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUZpcnN0T2NjdXJyZW5jZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVMYXN0T2NjdXJyZW5jZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFycmF5TGlzdCIKICBleHRlbmRzPSJqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5OTEyNCw2ICszMDk0MjQsMjUgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJjaGFyW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJjaGFyIj4KQEAgLTI5OTEzOSw2ICszMDk0NTgsMjUgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJjaGFyW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImNoYXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJkb3VibGVbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+CkBAIC0yOTkxNTQsNiArMzA5NDkyLDI1IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iZG91YmxlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiaW5hcnlTZWFyY2giCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImZsb2F0W10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+CkBAIC0yOTkxNjksNiArMzA5NTI2LDI1IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iZmxvYXRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJpbnRbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+CkBAIC0yOTkxODQsNiArMzA5NTYwLDI1IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiaW5hcnlTZWFyY2giCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImxvbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgpAQCAtMjk5MTk5LDYgKzMwOTU5NCwyNSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImxvbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiaW5hcnlTZWFyY2giCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImphdmEubGFuZy5PYmplY3RbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgpAQCAtMjk5MjE0LDYgKzMwOTYyOCwyNSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImphdmEubGFuZy5PYmplY3RbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiaW5hcnlTZWFyY2giCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9IlRbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9IlQiPgpAQCAtMjk5MjMxLDExICszMDk2NjQsMzc1IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iVFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb21wYXJhdG9yIiB0eXBlPSJqYXZhLnV0aWwuQ29tcGFyYXRvciZsdDs/IHN1cGVyIFQmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJpbmFyeVNlYXJjaCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0ic2hvcnRbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJpbmFyeVNlYXJjaCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0ic2hvcnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iYm9vbGVhbltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJib29sZWFuW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0xlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZiIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJjaGFyW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImNoYXJbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iZG91YmxlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImRvdWJsZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJmbG9hdFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJmbG9hdFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJpbnRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0xlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZiIKKyByZXR1cm49ImxvbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0ibG9uZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJzaG9ydFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJzaG9ydFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJUW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9IlRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iVFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJVW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0xlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdUeXBlIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIFRbXSZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJib29sZWFuW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImJvb2xlYW5bXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJjaGFyW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImNoYXJbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJkb3VibGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iZG91YmxlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iZmxvYXRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iZmxvYXRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJpbnRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0ibG9uZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJsb25nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0ic2hvcnRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0ic2hvcnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJUW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9IlRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mUmFuZ2UiCisgcmV0dXJuPSJUW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9IlVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1R5cGUiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDs/IGV4dGVuZHMgVFtdJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZWVwRXF1YWxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDAzMTUsNyArMzExMTEyLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbGVhciIKQEAgLTMwMDMyOCw5ICszMTExMjUsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMSIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InBvczIiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9uZSIKQEAgLTMwMDM1NCw3ICszMTExNTEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZsaXAiCkBAIC0zMDAzNjcsOSArMzExMTY0LDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvczEiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJwb3MyIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJ0b0luZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0IgpAQCAtMzAwMzgyLDcgKzMxMTE3OSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0IgpAQCAtMzAwMzk1LDkgKzMxMTE5Miw5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MxIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMiIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idG9JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImludGVyc2VjdHMiCkBAIC0zMDA0NDUsNyArMzExMjQyLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuZXh0U2V0Qml0IgpAQCAtMzAwNDU4LDcgKzMxMTI1NSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3IiCkBAIC0zMDA0ODQsNyArMzExMjgxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXQiCkBAIC0zMDA0OTcsNyArMzExMjk0LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzAwNTEyLDkgKzMxMTMwOSw5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MxIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMiIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idG9JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldCIKQEAgLTMwMDUyNyw5ICszMTEzMjQsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMSIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InBvczIiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idmFsIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzAwNzY1LDYgKzMxMTU2Miw0MCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpZWxkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5TmFtZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmllbGQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEZpcnN0RGF5T2ZXZWVrIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMTE0NSw2ICszMTE5NzYsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGltZXpvbmUiIHR5cGU9ImphdmEudXRpbC5UaW1lWm9uZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFMTF9TVFlMRVMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFNIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAxMzY1LDYgKzMxMjIwNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTE9ORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTUFSQ0giCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMDE0OTcsNiArMzEyMzUwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iU1VOREFZIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAxODY1LDYgKzMxMjcyOSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhIiB0eXBlPSJULi4uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFzTGlmb1F1ZXVlIgorIHJldHVybj0iamF2YS51dGlsLlF1ZXVlJmx0O1QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlcXVlIiB0eXBlPSJqYXZhLnV0aWwuRGVxdWUmbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMjIxMSw2ICszMTMwODgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0IiB0eXBlPSJUIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1NldEZyb21NYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1hcCIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtFLCBqYXZhLmxhbmcuQm9vbGVhbiZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVwbGFjZUFsbCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzMTIwLDYgKzMxNDAxMCwyMTcgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRGVxdWUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLlF1ZXVlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iYWRkRmlyc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkTGFzdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nSXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyRmlyc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJMYXN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWtGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlRmlyc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkRpY3Rpb25hcnkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTMwNTI3Miw2ICszMTYzNzMsOCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuRGVxdWUiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLkxpc3QiPgogPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLlF1ZXVlIj4KQEAgLTMwNTMzMyw2ICszMTY0MzYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0l0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVsZW1lbnQiCiAgcmV0dXJuPSJFIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNTM5Miw2ICszMTY1MDYsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iRSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckZpcnN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckxhc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWsiCiAgcmV0dXJuPSJFIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNTQwMyw2ICszMTY1NDMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0ZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icG9sbCIKICByZXR1cm49IkUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA1NDE0LDYgKzMxNjU3Niw1MiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3AiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlbW92ZSIKICByZXR1cm49IkUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA1NDM2LDYgKzMxNjY0NCwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVGaXJzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3QiCiAgcmV0dXJuPSJFIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNTQ0Nyw2ICszMTY2NjgsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNpemUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA2Mzk1LDYgKzMxNzYyOSwxNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUk9PVCIKKyB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlNJTVBMSUZJRURfQ0hJTkVTRSIKICB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMDY3OTYsNiArMzE4MDQwLDQwMSBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJOYXZpZ2FibGVNYXAiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLlNvcnRlZE1hcCI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmdFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmdLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlyc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbG9vckVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3JLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoZWFkTWFwIgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmRLZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXJFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZ2hlcktleSIKKyByZXR1cm49IksiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxhc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb3dlckVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXJLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuYXZpZ2FibGVLZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0smZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdWJNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0S2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRLZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9Ik5hdmlnYWJsZVNldCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuU29ydGVkU2V0Ij4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iY2VpbGluZyIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nSXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsb29yIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhlYWRTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZ2hlciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb3dlciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRhaWxTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIKICBleHRlbmRzPSJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDcyMDIsNiArMzE4ODQxLDIxIEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9hZEZyb21YTUwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNzI3Nyw2ICszMTg5MzEsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndyaXRlciIgdHlwZT0iamF2YS5pby5Xcml0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0b3JlVG9YTUwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNzMxMyw2ICszMTg5ODQsMTcgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RyaW5nUHJvcGVydHlOYW1lcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJkZWZhdWx0cyIKICB0eXBlPSJqYXZhLnV0aWwuUHJvcGVydGllcyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzA3MzY1LDYgKzMxOTA0NywxOCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSIKKyB0eXBlPSJqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0S2V5cyIKICByZXR1cm49ImphdmEudXRpbC5FbnVtZXJhdGlvbiZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDc2MjgsNiArMzE5MzIyLDQzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xlYXJDYWNoZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsZWFyQ2FjaGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3NMb2FkZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29udGFpbnNLZXkiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QnVuZGxlIgogIHJldHVybj0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNzY3Nyw2ICszMTk0MDgsNTcgQEAKIDxleGNlcHRpb24gbmFtZT0iTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJ1bmRsZSIKKyByZXR1cm49ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250cm9sIiB0eXBlPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuQ29udHJvbCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCdW5kbGUiCisgcmV0dXJuPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0TG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250cm9sIiB0eXBlPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuQ29udHJvbCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCdW5kbGUiCisgcmV0dXJuPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldExvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3NMb2FkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRyb2wiIHR5cGU9ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5Db250cm9sIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEtleXMiCiAgcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24mbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zMDc3NTEsNiArMzE5NTMzLDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYW5kbGVLZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFyZW50IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDc3NzUsNiArMzE5NTc5LDIzOSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUmVzb3VyY2VCdW5kbGUuQ29udHJvbCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSZXNvdXJjZUJ1bmRsZS5Db250cm9sIgorIHR5cGU9ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5Db250cm9sIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldENhbmRpZGF0ZUxvY2FsZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLnV0aWwuTG9jYWxlJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb250cm9sIgorIHJldHVybj0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlLkNvbnRyb2wiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXRzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGYWxsYmFja0xvY2FsZSIKKyByZXR1cm49ImphdmEudXRpbC5Mb2NhbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Rm9ybWF0cyIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROb0ZhbGxiYWNrQ29udHJvbCIKKyByZXR1cm49ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5Db250cm9sIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0cyIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGltZVRvTGl2ZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmVlZHNSZWxvYWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJidW5kbGUiIHR5cGU9ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZFRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3QnVuZGxlIgorIHJldHVybj0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWxvYWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9CdW5kbGVOYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0b1Jlc291cmNlTmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVuZGxlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VmZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRk9STUFUX0NMQVNTIgorIHR5cGU9ImphdmEudXRpbC5MaXN0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZPUk1BVF9ERUZBVUxUIgorIHR5cGU9ImphdmEudXRpbC5MaXN0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZPUk1BVF9QUk9QRVJUSUVTIgorIHR5cGU9ImphdmEudXRpbC5MaXN0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRUTF9ET05UX0NBQ0hFIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xTCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUVExfTk9fRVhQSVJBVElPTl9DT05UUk9MIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yTCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU2Nhbm5lciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwODQzMiw2ICszMjA0NjksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVzZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2Nhbm5lciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJza2lwIgogIHJldHVybj0iamF2YS51dGlsLlNjYW5uZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA4NTExLDYgKzMyMDU1OSwxMTEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLkVycm9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciIKKyB0eXBlPSJqYXZhLnV0aWwuU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IiCisgdHlwZT0iamF2YS51dGlsLlNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlcnZpY2VMb2FkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuSXRlcmFibGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJpdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtTJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkIgorIHJldHVybj0iamF2YS51dGlsLlNlcnZpY2VMb2FkZXImbHQ7UyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZSIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1MmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjbGFzc0xvYWRlciIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2VydmljZUxvYWRlciZsdDtTJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7UyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluc3RhbGxlZCIKKyByZXR1cm49ImphdmEudXRpbC5TZXJ2aWNlTG9hZGVyJmx0O1MmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlcnZpY2UiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtTJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJTZXQiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTMwOTQ3Miw3ICszMjE2MjUsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXRNaWxsaXMiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXREU1RTYXZpbmdzIgpAQCAtMzA5NTk3LDcgKzMyMTc1MCw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iZGF5T2ZXZWVrIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InRpbWUiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVPZkRheU1pbGxpcyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFJhd09mZnNldCIKQEAgLTMwOTYyMSw3ICszMjE3NzQsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1NhbWVSdWxlcyIKQEAgLTMwOTYzNCw3ICszMjE3ODcsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iem9uZSIgdHlwZT0iamF2YS51dGlsLlRpbWVab25lIj4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZVpvbmUiIHR5cGU9ImphdmEudXRpbC5UaW1lWm9uZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbkRheWxpZ2h0VGltZSIKQEAgLTMwOTY2MCw3ICszMjE4MTMsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGltZXpvbmUiIHR5cGU9ImphdmEudXRpbC5UaW1lWm9uZSI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVab25lIiB0eXBlPSJqYXZhLnV0aWwuVGltZVpvbmUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0SUQiCkBAIC0zMDk2NzMsNyArMzIxODI2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRSYXdPZmZzZXQiCkBAIC0zMDk2ODYsNyArMzIxODM5LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0TWlsbGlzIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXNlRGF5bGlnaHRUaW1lIgpAQCAtMzA5OTgxLDYgKzMyMjEzNCw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5OYXZpZ2FibGVNYXAiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgogPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLlNvcnRlZE1hcCI+CkBAIC0zMTAwMDAsNiArMzIyMTU1LDE2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb3B5RnJvbSIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgSywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJUcmVlTWFwIgorIHR5cGU9ImphdmEudXRpbC5UcmVlTWFwIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iY29tcGFyYXRvciIgdHlwZT0iamF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7PyBzdXBlciBLJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CkBAIC0zMTAwMTAsMTkgKzMyMjE3NSwzNSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ibWFwIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgViZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJjb3B5RnJvbSIgdHlwZT0iamF2YS51dGlsLlNvcnRlZE1hcCZsdDtLLCA/IGV4dGVuZHMgViZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlRyZWVNYXAiCi0gdHlwZT0iamF2YS51dGlsLlRyZWVNYXAiCis8bWV0aG9kIG5hbWU9ImNlaWxpbmdFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9Im1hcCIgdHlwZT0iamF2YS51dGlsLlNvcnRlZE1hcCZsdDtLLCA/IGV4dGVuZHMgViZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgogPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmdLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvbmUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDA0NSw2ICszMjIyMjYsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0tleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ01hcCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW50cnlTZXQiCiAgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDA1Niw2ICszMjIyNTksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlyc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZmlyc3RLZXkiCiAgcmV0dXJuPSJLIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDA2Nyw2ICszMjIyODEsNDcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3JFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbG9vcktleSIKKyByZXR1cm49IksiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoZWFkTWFwIgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idG8iIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoZWFkTWFwIgogIHJldHVybj0iamF2YS51dGlsLlNvcnRlZE1hcCZsdDtLLCBWJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAwNzcsOSArMzIyMzMyLDQ2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJlbmRLZXkiIHR5cGU9IksiPgorPHBhcmFtZXRlciBuYW1lPSJ0b0V4Y2x1c2l2ZSIgdHlwZT0iSyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXJFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXJLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGFzdEVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsYXN0S2V5IgogIHJldHVybj0iSyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAwOTEsNiArMzIyMzgzLDg0IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvd2VyRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXJLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmF2aWdhYmxlS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViTWFwIgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG8iIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN1Yk1hcCIKICByZXR1cm49ImphdmEudXRpbC5Tb3J0ZWRNYXAmbHQ7SywgViZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMTAxLDkgKzMyMjQ3MSwyNCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRLZXkiIHR5cGU9IksiPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tSW5jbHVzaXZlIiB0eXBlPSJLIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJlbmRLZXkiIHR5cGU9IksiPgorPHBhcmFtZXRlciBuYW1lPSJ0b0V4Y2x1c2l2ZSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsTWFwIgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRhaWxNYXAiCkBAIC0zMTAxMTYsNyArMzIyNTAxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0S2V5IiB0eXBlPSJLIj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluY2x1c2l2ZSIgdHlwZT0iSyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KQEAgLTMxMDEzMCw5ICszMjI1MTUsOSBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+CiA8L2ltcGxlbWVudHM+Ci08aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Ij4KIDwvaW1wbGVtZW50cz4KLTxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5Tb3J0ZWRTZXQiPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgogPC9pbXBsZW1lbnRzPgogPGNvbnN0cnVjdG9yIG5hbWU9IlRyZWVTZXQiCiAgdHlwZT0iamF2YS51dGlsLlRyZWVTZXQiCkBAIC0zMTAxNzIsNiArMzIyNTU3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InNldCIgdHlwZT0iamF2YS51dGlsLlNvcnRlZFNldCZsdDtFJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmciCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb25lIgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAxOTQsNiArMzIyNTkyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdJdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaXJzdCIKICByZXR1cm49IkUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMjA1LDYgKzMyMjYyNSwzNCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbG9vciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZFNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImhlYWRTZXQiCiAgcmV0dXJuPSJqYXZhLnV0aWwuU29ydGVkU2V0Jmx0O0UmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDIxOCw2ICszMjI2NjYsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJFIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZ2hlciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXRlcmF0b3IiCiAgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMjQwLDYgKzMyMjcwMSw0MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb3dlciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2l6ZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAyNTIsNiArMzIyNzQ4LDI1IEBACiA+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3ViU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdWJTZXQiCiAgcmV0dXJuPSJqYXZhLnV0aWwuU29ydGVkU2V0Jmx0O0UmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMzEwMjY3LDYgKzMyMjc4MiwyMSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idGFpbFNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsU2V0IgogIHJldHVybj0iamF2YS51dGlsLlNvcnRlZFNldCZsdDtFJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTMxMDkyNSw3ICszMjM0NTUsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMzEwOTQwLDcgKzMyMzQ3MCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0zMTA5NTksNyArMzIzNDg5LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iRXhlY3V0aW9uRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0zMTA5NzYsNyArMzIzNTA2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTMxMDk4OSw2ICszMjM1MTksMzQgQEAKIDxleGNlcHRpb24gbmFtZT0iVGltZW91dEV4Y2VwdGlvbiIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdUYXNrRm9yIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVGdXR1cmUmbHQ7VCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJ1bm5hYmxlIiB0eXBlPSJqYXZhLmxhbmcuUnVubmFibGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1Rhc2tGb3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZUZ1dHVyZSZsdDtUJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGFibGUiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN1Ym1pdCIKICByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSZsdDs/Jmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTEyNDAsNiArMzIzNzk4LDQxOSBAQAogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkJsb2NraW5nRGVxdWUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuRGVxdWUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkRmlyc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkTGFzdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb250YWlucyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbGVtZW50IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Iml0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyRmlyc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJGaXJzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idW5pdCIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJMYXN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyTGFzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idW5pdCIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVlayIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGwiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idW5pdCIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dEZpcnN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dExhc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVGaXJzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2l6ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRha2UiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFrZUZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRha2VMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQmxvY2tpbmdRdWV1ZSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzExNTkyLDYgKzMyNDU2MywxOCBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJpbml0aWFsQ2FwYWNpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZEZhY3RvciIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvbmN1cnJlbnRIYXNoTWFwIgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5pdGlhbENhcGFjaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IkNvbmN1cnJlbnRIYXNoTWFwIgogIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwIgpAQCAtMzExODgwLDYgKzMyNDg2Myw4OTggQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iQ29uY3VycmVudE5hdmlnYWJsZU1hcCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5OYXZpZ2FibGVNYXAiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idG9LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoZWFkTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0b0tleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJrZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0smZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmF2aWdhYmxlS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1Yk1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1Yk1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRhaWxNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkNvbmN1cnJlbnRTa2lwTGlzdE1hcCIKKyBleHRlbmRzPSJqYXZhLnV0aWwuQWJzdHJhY3RNYXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29uY3VycmVudFNraXBMaXN0TWFwIgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvbmN1cnJlbnRTa2lwTGlzdE1hcCIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RNYXAiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb21wYXJhdG9yIiB0eXBlPSJqYXZhLnV0aWwuQ29tcGFyYXRvciZsdDs/IHN1cGVyIEsmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RNYXAiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibSIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgSywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RNYXAiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibSIgdHlwZT0iamF2YS51dGlsLlNvcnRlZE1hcCZsdDtLLCA/IGV4dGVuZHMgViZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2VpbGluZ0tleSIKKyByZXR1cm49IksiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wYXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7PyBzdXBlciBLJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbnRyeVNldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlyc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlyc3RLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsb29yRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3JLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZ2hlckVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZ2hlcktleSIKKyByZXR1cm49IksiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxhc3RLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvd2VyRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXJLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmF2aWdhYmxlS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0SWZBYnNlbnQiCisgcmV0dXJuPSJWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkVmFsdWUiIHR5cGU9IlYiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1Yk1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0luY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdWJNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0tleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRhaWxNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNvbmN1cnJlbnRTa2lwTGlzdFNldCIKKyBleHRlbmRzPSJqYXZhLnV0aWwuQWJzdHJhY3RTZXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLk5hdmlnYWJsZVNldCI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29uY3VycmVudFNraXBMaXN0U2V0IgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdFNldCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvbmN1cnJlbnRTa2lwTGlzdFNldCIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RTZXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb21wYXJhdG9yIiB0eXBlPSJqYXZhLnV0aWwuQ29tcGFyYXRvciZsdDs/IHN1cGVyIEUmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RTZXQiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0U2V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIEUmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RTZXQiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0U2V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iamF2YS51dGlsLlNvcnRlZFNldCZsdDtFJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmciCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb25lIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0U2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbXBhcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuQ29tcGFyYXRvciZsdDs/IHN1cGVyIEUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdJdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3IiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhlYWRTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0b0VsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoZWFkU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idG9FbGVtZW50IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZ2hlciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXIiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpemUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUVsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvRWxlbWVudCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9JbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUVsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvRWxlbWVudCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUVsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUVsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ29weU9uV3JpdGVBcnJheUxpc3QiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTI5ODksNyArMzI2ODY0LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTMxMzAwNCw3ICszMjY4NzksNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzEzMDIzLDcgKzMyNjg5OCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IkV4ZWN1dGlvbkV4Y2VwdGlvbiIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMzEzMDQwLDcgKzMyNjkxNSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0zMTMxODUsNyArMzI3MDYwLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIiB0eXBlPSJqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24mbHQ7PyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2FsbGFibGUiCkBAIC0zMTMxOTgsNyArMzI3MDczLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIiB0eXBlPSJqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24mbHQ7PyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGVmYXVsdFRocmVhZEZhY3RvcnkiCkBAIC0zMTM0OTEsOSArMzI3MzY2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUiPgotPC9pbXBsZW1lbnRzPgotPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LlJ1bm5hYmxlRnV0dXJlIj4KIDwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJGdXR1cmVUYXNrIgogIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2siCkBAIC0zMTM2NDgsNiArMzI3NTIxLDUzNiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyBleHRlbmRzPSJqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdEZXF1ZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ0RlcXVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ0RlcXVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FwYWNpdHkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ0RlcXVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIEUmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkRmlyc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZExhc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdJdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkcmFpblRvIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IHN1cGVyIEUmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRyYWluVG8iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gc3VwZXIgRSZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1heEVsZW1lbnRzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Rmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Iml0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyRmlyc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyRmlyc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckxhc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyTGFzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWsiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWtGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0xhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGwiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGwiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHVzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRGaXJzdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0TGFzdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtYWluaW5nQ2FwYWNpdHkiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUZpcnN0T2NjdXJyZW5jZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpemUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFrZSIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFrZUZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWtlTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlua2VkQmxvY2tpbmdRdWV1ZSIKICBleHRlbmRzPSJqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTQxNDEsNiArMzI4NTQ0LDUyIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IlJ1bm5hYmxlRnV0dXJlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuUnVubmFibGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJydW4iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJSdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZUZ1dHVyZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJpc1BlcmlvZGljIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zMTQyOTMsNiArMzI4NzQyLDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImhhbmRsZXIiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlY29yYXRlVGFzayIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LlJ1bm5hYmxlU2NoZWR1bGVkRnV0dXJlJmx0O1YmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJydW5uYWJsZSIgdHlwZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZSZsdDtWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZWNvcmF0ZVRhc2siCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZSZsdDtWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGFibGUiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1YmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZSZsdDtWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDb250aW51ZUV4aXN0aW5nUGVyaW9kaWNUYXNrc0FmdGVyU2h1dGRvd25Qb2xpY3kiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNDk3Nyw2ICszMjk0NTYsMzAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idCIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhbGxvd0NvcmVUaHJlYWRUaW1lT3V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWxsb3dzQ29yZVRocmVhZFRpbWVPdXQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImF3YWl0VGVybWluYXRpb24iCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNTUzMyw2ICszMzAwMzYsMzIgQEAKIDxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0b0RheXMiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0b0hvdXJzIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idG9NaWNyb3MiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNTU1OSw2ICszMzAwODgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9NaW51dGVzIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idG9OYW5vcyIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE1NzA3LDYgKzMzMDI0OSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXp5U2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNTkwNiw2ICszMzA0NjEsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb25nVmFsdWUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNjEwMyw2ICszMzA2NzEsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE2MjkwLDYgKzMzMDg3MywyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9IlQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im5ld1VwZGF0ZXIiCiAgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlciZsdDtVJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTY1MDgsNiArMzMxMTA2LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvbmdWYWx1ZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE2NzA1LDYgKzMzMTMxNiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJpIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE2ODkyLDYgKzMzMTUxOCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9IlQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuZXdVcGRhdGVyIgogIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmdGaWVsZFVwZGF0ZXImbHQ7VSZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE3MTMxLDYgKzMzMTc3MiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iViI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXp5U2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNzIzNSw2ICszMzE4ODksMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9IkUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE3MzQwLDYgKzMzMjAwOSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iViI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXp5U2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im5ld1VwZGF0ZXIiCiAgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyJmx0O1UsIFcmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNzUyMyw3ICszMzIyMDcsNyBAQAogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9IiIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+CiA8L2ltcGxlbWVudHM+CkBAIC0zMTc1NjAsNiArMzMyMjQ0LDUzMiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWJzdHJhY3RRdWV1ZWRMb25nU3luY2hyb25pemVyIgorIGV4dGVuZHM9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0T3duYWJsZVN5bmNocm9uaXplciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWJzdHJhY3RRdWV1ZWRMb25nU3luY2hyb25pemVyIgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhY3F1aXJlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWNxdWlyZUludGVycnVwdGlibHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhY3F1aXJlU2hhcmVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWNxdWlyZVNoYXJlZEludGVycnVwdGlibHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wYXJlQW5kU2V0U3RhdGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImV4cGVjdCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXBkYXRlIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEV4Y2x1c2l2ZVF1ZXVlZFRocmVhZHMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLmxhbmcuVGhyZWFkJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZpcnN0UXVldWVkVGhyZWFkIgorIHJldHVybj0iamF2YS5sYW5nLlRocmVhZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFF1ZXVlTGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UXVldWVkVGhyZWFkcyIKKyByZXR1cm49ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEubGFuZy5UaHJlYWQmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2hhcmVkUXVldWVkVGhyZWFkcyIKKyByZXR1cm49ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEubGFuZy5UaHJlYWQmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RhdGUiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2FpdFF1ZXVlTGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbmRpdGlvbiIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRMb25nU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXYWl0aW5nVGhyZWFkcyIKKyByZXR1cm49ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEubGFuZy5UaHJlYWQmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbmRpdGlvbiIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRMb25nU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNDb250ZW5kZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzUXVldWVkVGhyZWFkcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNXYWl0ZXJzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb25kaXRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNIZWxkRXhjbHVzaXZlbHkiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUXVldWVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWQiIHR5cGU9ImphdmEubGFuZy5UaHJlYWQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3ducyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uZGl0aW9uIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZExvbmdTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbGVhc2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWxlYXNlU2hhcmVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N0YXRlIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyeUFjcXVpcmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJ5QWNxdWlyZU5hbm9zIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbm9zVGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cnlBY3F1aXJlU2hhcmVkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyeUFjcXVpcmVTaGFyZWROYW5vcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuYW5vc1RpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJ5UmVsZWFzZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cnlSZWxlYXNlU2hhcmVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBYnN0cmFjdFF1ZXVlZExvbmdTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0IgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYXdhaXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXdhaXQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImF3YWl0TmFub3MiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbm9zVGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhd2FpdFVuaW50ZXJydXB0aWJseSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhd2FpdFVudGlsIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZWFkbGluZSIgdHlwZT0iamF2YS51dGlsLkRhdGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2FpdFF1ZXVlTGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2FpdGluZ1RocmVhZHMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLmxhbmcuVGhyZWFkJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1dhaXRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2lnbmFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpZ25hbEFsbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciIKICBleHRlbmRzPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdE93bmFibGVTeW5jaHJvbml6ZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zMTgyNzcsNiArMzMzNDg3LDMyIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPG1ldGhvZCBuYW1lPSJnZXRCbG9ja2VyIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0IiB0eXBlPSJqYXZhLmxhbmcuVGhyZWFkIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcmsiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrZXIiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGFyayIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE4Mjk4LDkgKzMzMzUzNCwzOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYmxvY2tlciIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ibmFub3MiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGFya05hbm9zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW5vcyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJrVW50aWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrZXIiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlYWRsaW5lIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBhcmtVbnRpbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE4Njg4LDYgKzMzMzk1NCwxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZWFkSG9sZENvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFJlYWRMb2NrQ291bnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE4OTQ4LDYgKzMzNDIyNSwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NrIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0SG9sZENvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGVsZEJ5Q3VycmVudFRocmVhZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9jayIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzIyMjI0LDEzICszMzc1MjMsMjQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibXNnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iR0xPQkFMX0xPR0dFUl9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2dsb2JhbCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJnbG9iYWwiCiAgdHlwZT0iamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+CkBAIC0zMjQ1OTcsNyArMzM5OTA3LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBhdHRlcm4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KQEAgLTMyNDY1MSw3ICszMzk5NjEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icmVnZXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgogPC9wYXJhbWV0ZXI+CkBAIC0zMjQ2NzcsNyArMzM5OTg3LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJzdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3BsaXQiCkBAIC0zMjQ2OTAsNyArMzQwMDAwLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImlucHV0U2VxIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImxpbWl0IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CkBAIC0zMjU1MjgsNiArMzQwODM4LDcyIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEZWZsYXRlcklucHV0U3RyZWFtIgorIGV4dGVuZHM9ImphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEZWZsYXRlcklucHV0U3RyZWFtIgorIHR5cGU9ImphdmEudXRpbC56aXAuRGVmbGF0ZXJJbnB1dFN0cmVhbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEZWZsYXRlcklucHV0U3RyZWFtIgorIHR5cGU9ImphdmEudXRpbC56aXAuRGVmbGF0ZXJJbnB1dFN0cmVhbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZsYXRlciIgdHlwZT0iamF2YS51dGlsLnppcC5EZWZsYXRlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGVmbGF0ZXJJbnB1dFN0cmVhbSIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkRlZmxhdGVySW5wdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmbGF0ZXIiIHR5cGU9ImphdmEudXRpbC56aXAuRGVmbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1ZmZlclNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iYnVmIgorIHR5cGU9ImJ5dGVbXSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGVmIgorIHR5cGU9ImphdmEudXRpbC56aXAuRGVmbGF0ZXIiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJEZWZsYXRlck91dHB1dFN0cmVhbSIKICBleHRlbmRzPSJqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMjYwMDAsNyArMzQxMzc2LDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaXMiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImluZiIgdHlwZT0iamF2YS51dGlsLnppcC5JbmZsYXRlciI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJJbmZsYXRlcklucHV0U3RyZWFtIgpAQCAtMzI2MDEyLDcgKzM0MTM4OCw3IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImlzIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpbmYiIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXIiPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iamF2YS51dGlsLnppcC5JbmZsYXRlciI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iYnNpemUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KQEAgLTMyNjA2Miw2ICszNDE0MzgsODUgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkluZmxhdGVyT3V0cHV0U3RyZWFtIgorIGV4dGVuZHM9ImphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iSW5mbGF0ZXJPdXRwdXRTdHJlYW0iCisgdHlwZT0iamF2YS51dGlsLnppcC5JbmZsYXRlck91dHB1dFN0cmVhbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iamF2YS5pby5PdXRwdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkluZmxhdGVyT3V0cHV0U3RyZWFtIgorIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXJPdXRwdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uT3V0cHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmYiIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkluZmxhdGVyT3V0cHV0U3RyZWFtIgorIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXJPdXRwdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uT3V0cHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmYiIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1ZmZlclNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImZpbmlzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iYnVmIgorIHR5cGU9ImJ5dGVbXSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW5mIgorIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXIiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJaaXBFbnRyeSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMyNjMxNiw2ICszNDE3NzEsMjUgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlppcEVycm9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5JbnRlcm5hbEVycm9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iWmlwRXJyb3IiCisgdHlwZT0iamF2YS51dGlsLnppcC5aaXBFcnJvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJaaXBFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5pby5JT0V4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDIxMTcsOCArMzU3NTkxLDYgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Ci08L2ltcGxlbWVudHM+CiA8Y29uc3RydWN0b3IgbmFtZT0iSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQiCiAgdHlwZT0iamF2YXgubmV0LnNzbC5IYW5kc2hha2VDb21wbGV0ZWRFdmVudCIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzQyNzA5LDExICszNTgxODEsMTEgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEudXRpbC5MaXN0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5zZWN1cml0eS5LZXlTdG9yZS5CdWlsZGVyJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldFBhcmFtZXRlcnMiCi0gcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuQnVpbGRlciZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTM0Mjc5MSw2ICszNTgyNjMsMzAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGVmYXVsdCIKKyByZXR1cm49ImphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERlZmF1bHRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW5zdGFuY2UiCiAgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTENvbnRleHQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQyODk3LDYgKzM1ODM5MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdXBwb3J0ZWRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaW5pdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQyOTE2LDYgKzM1ODQyMywxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGVmYXVsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3NsQ29udGV4dCIgdHlwZT0iamF2YXgubmV0LnNzbC5TU0xDb250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNTTENvbnRleHRTcGkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTM0Mjk3MCw2ICszNTg0OTAsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5naW5lR2V0RGVmYXVsdFNTTFBhcmFtZXRlcnMiCisgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnMiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5naW5lR2V0U2VydmVyU2Vzc2lvbkNvbnRleHQiCiAgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25Db250ZXh0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQzMDAzLDYgKzM1ODUzNCwxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmdpbmVHZXRTdXBwb3J0ZWRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuZ2luZUluaXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQzMTc2LDYgKzM1ODcxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNlc3Npb24iCiAgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDMzMDUsNiArMzU4ODU4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Im5lZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U1NMUGFyYW1ldGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InAiIHR5cGU9ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRVc2VDbGllbnRNb2RlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0MzY1Niw2ICszNTkyMjIsMTQxIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNTTFBhcmFtZXRlcnMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNTTFBhcmFtZXRlcnMiCisgdHlwZT0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1NMUGFyYW1ldGVycyIKKyB0eXBlPSJqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjaXBoZXJTdWl0ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1NMUGFyYW1ldGVycyIKKyB0eXBlPSJqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjaXBoZXJTdWl0ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvdG9jb2xzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRDaXBoZXJTdWl0ZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmVlZENsaWVudEF1dGgiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb3RvY29scyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXYW50Q2xpZW50QXV0aCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2lwaGVyU3VpdGVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2lwaGVyU3VpdGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TmVlZENsaWVudEF1dGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZWVkQ2xpZW50QXV0aCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm90b2NvbHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm90b2NvbHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXYW50Q2xpZW50QXV0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndhbnRDbGllbnRBdXRoIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0NDI2Myw4ICszNTk5NjQsNiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KLTwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJTU0xTZXNzaW9uQmluZGluZ0V2ZW50IgogIHR5cGU9ImphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzQ0MzQ0LDcgKzM2MDA0Myw3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJnZXRJZHMiCi0gcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24iCisgcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24mbHQ7Ynl0ZVtdJmd0OyIKICBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0zNDQ1NjEsNiArMzYwMjYwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNTTFBhcmFtZXRlcnMiCisgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnMiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2Vzc2lvbiIKICByZXR1cm49ImphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NDY4MSw2ICszNjAzOTEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmVlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFVzZUNsaWVudE1vZGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ1ODkwLDYgKzM2MTYxMywxOCBAQAogPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJYNTAwUHJpbmNpcGFsIgorIHR5cGU9ImphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5d29yZE1hcCIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldEVuY29kZWQiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQ1OTI1LDYgKzM2MTY2MCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2lkTWFwIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iQ0FOT05JQ0FMIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0NjM3OCw2ICszNjIxMjgsNzAgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImphdmF4LnNxbCIKID4KKzxpbnRlcmZhY2UgbmFtZT0iQ29tbW9uRGF0YVNvdXJjZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldExvZ1dyaXRlciIKKyByZXR1cm49ImphdmEuaW8uUHJpbnRXcml0ZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9naW5UaW1lb3V0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExvZ1dyaXRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLlByaW50V3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMb2dpblRpbWVvdXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlY29uZHMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbm5lY3Rpb25FdmVudCIKICBleHRlbmRzPSJqYXZhLnV0aWwuRXZlbnRPYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQ2NDY1LDMyICszNjIyNzksOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxtZXRob2QgbmFtZT0iZ2V0TG9nV3JpdGVyIgotIHJldHVybj0iamF2YS5pby5QcmludFdyaXRlciIKLSBhYnN0cmFjdD0idHJ1ZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Ci08L2V4Y2VwdGlvbj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRMb2dpblRpbWVvdXQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9InRydWUiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmF4LnNxbC5Db21tb25EYXRhU291cmNlIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iZ2V0UG9vbGVkQ29ubmVjdGlvbiIKICByZXR1cm49ImphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2NTIxLDM2ICszNjIzMTEsNiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRMb2dXcml0ZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJ0cnVlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InRoZVdyaXRlciIgdHlwZT0iamF2YS5pby5QcmludFdyaXRlciI+Ci08L3BhcmFtZXRlcj4KLTxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0TG9naW5UaW1lb3V0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0idHJ1ZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0aGVUaW1lb3V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iRGF0YVNvdXJjZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NjU1OSw2ICszNjIzMTksMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZheC5zcWwuQ29tbW9uRGF0YVNvdXJjZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnNxbC5XcmFwcGVyIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iZ2V0Q29ubmVjdGlvbiIKICByZXR1cm49ImphdmEuc3FsLkNvbm5lY3Rpb24iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDY1ODksNjIgKzM2MjM1Myw2IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldExvZ1dyaXRlciIKLSByZXR1cm49ImphdmEuaW8uUHJpbnRXcml0ZXIiCi0gYWJzdHJhY3Q9InRydWUiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TG9naW5UaW1lb3V0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJ0cnVlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldExvZ1dyaXRlciIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9InRydWUiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idGhlV3JpdGVyIiB0eXBlPSJqYXZhLmlvLlByaW50V3JpdGVyIj4KLTwvcGFyYW1ldGVyPgotPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Ci08L2V4Y2VwdGlvbj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRMb2dpblRpbWVvdXQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJ0cnVlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InRoZVRpbWVvdXQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KIDwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJQb29sZWRDb25uZWN0aW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2NjY2LDYgKzM2MjM3NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0aGVMaXN0ZW5lciIgdHlwZT0iamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudExpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFN0YXRlbWVudEV2ZW50TGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJqYXZheC5zcWwuU3RhdGVtZW50RXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDY3MDUsNiArMzYyNDI2LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InRoZUxpc3RlbmVyIiB0eXBlPSJqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50TGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlU3RhdGVtZW50RXZlbnRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImphdmF4LnNxbC5TdGF0ZW1lbnRFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iUm93U2V0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2OTQ3LDYgKzM2MjY4MSw1OSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlSW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFzY2lpU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QmlnRGVjaW1hbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDY5NjQsNiArMzYyNzUxLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJpZ0RlY2ltYWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUJpZ0RlY2ltYWwiIHR5cGU9ImphdmEubWF0aC5CaWdEZWNpbWFsIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2OTgzLDYgKzM2Mjc4Nyw1OSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QmxvYiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcwMDAsNiArMzYyODU3LDk1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlSW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQmxvYiIgdHlwZT0iamF2YS5zcWwuQmxvYiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Qm9vbGVhbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcwMTcsNiArMzYyOTYzLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJvb2xlYW4iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUJvb2xlYW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJ5dGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MDM0LDYgKzM2Mjk5NywyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCeXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVCeXRlIiB0eXBlPSJieXRlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRCeXRlcyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcwNTEsNiArMzYzMDMxLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJ5dGVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVCeXRlQXJyYXkiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q2hhcmFjdGVyU3RyZWFtIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzA3MCw2ICszNjMwNjcsNTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MDg3LDYgKzM2MzEzNyw5NSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUNsb2IiIHR5cGU9ImphdmEuc3FsLkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q29tbWFuZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcxNjgsNiArMzYzMzA3LDQyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZURhdGUiIHR5cGU9ImphdmEuc3FsLkRhdGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZURhdGUiIHR5cGU9ImphdmEuc3FsLkRhdGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUNhbGVuZGFyIiB0eXBlPSJqYXZhLnV0aWwuQ2FsZW5kYXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERvdWJsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcxODUsNiArMzYzMzYwLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERvdWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlRG91YmxlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEVzY2FwZVByb2Nlc3NpbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MjE3LDYgKzM2MzQwOSwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGbG9hdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlRmxvYXQiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRJbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MjM0LDYgKzM2MzQ0MywyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUludGVnZXIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9uZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcyNTEsNiArMzYzNDc3LDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExvbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUxvbmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heEZpZWxkU2l6ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcyODEsNiArMzYzNTI0LDIxOCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZU5DbG9iIiB0eXBlPSJqYXZhLnNxbC5OQ2xvYiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVOQ2xvYiIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROU3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVOU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROU3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVOU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXROdWxsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzMxNyw2ICszNjM3NzIsNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TnVsbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROdWxsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxUeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InR5cGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPYmplY3QiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3Mzc0LDYgKzM2Mzg2NSw2MyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPYmplY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZU9iamVjdCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVPYmplY3QiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldFNxbFR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVPYmplY3QiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldFNxbFR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3NDM2LDYgKzM2Mzk4NCw3NCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3dJZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUm93SWQiIHR5cGU9ImphdmEuc3FsLlJvd0lkIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3dJZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUm93SWQiIHR5cGU9ImphdmEuc3FsLlJvd0lkIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTUUxYTUwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVNRTFhNTCIgdHlwZT0iamF2YS5zcWwuU1FMWE1MIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTUUxYTUwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVNRTFhNTCIgdHlwZT0iamF2YS5zcWwuU1FMWE1MIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTaG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDc0NTMsNiArMzY0MDY5LDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3J0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVTaG9ydCIgdHlwZT0ic2hvcnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFN0cmluZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDc0NzAsNiArMzY0MTAzLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRUaW1lIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzUwNiw2ICszNjQxNTYsNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlVGltZSIgdHlwZT0iamF2YS5zcWwuVGltZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlVGltZSIgdHlwZT0iamF2YS5zcWwuVGltZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQ2FsZW5kYXIiIHR5cGU9ImphdmEudXRpbC5DYWxlbmRhciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGltZXN0YW1wIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzU0Miw2ICszNjQyMjgsNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZXN0YW1wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVUaW1lc3RhbXAiIHR5cGU9ImphdmEuc3FsLlRpbWVzdGFtcCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZXN0YW1wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVUaW1lc3RhbXAiIHR5cGU9ImphdmEuc3FsLlRpbWVzdGFtcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQ2FsZW5kYXIiIHR5cGU9ImphdmEudXRpbC5DYWxlbmRhciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VHJhbnNhY3Rpb25Jc29sYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3NTg3LDYgKzM2NDMwOSwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRVUkwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVVSTCIgdHlwZT0iamF2YS5uZXQuVVJMIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRVcmwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ4MTA2LDYgKzM2NDg0NSw5OSBAQAogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlN0YXRlbWVudEV2ZW50IgorIGV4dGVuZHM9ImphdmEudXRpbC5FdmVudE9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0YXRlbWVudEV2ZW50IgorIHR5cGU9ImphdmF4LnNxbC5TdGF0ZW1lbnRFdmVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbiIgdHlwZT0iamF2YXguc3FsLlBvb2xlZENvbm5lY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXRlbWVudCIgdHlwZT0iamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGF0ZW1lbnRFdmVudCIKKyB0eXBlPSJqYXZheC5zcWwuU3RhdGVtZW50RXZlbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb24iIHR5cGU9ImphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZW1lbnQiIHR5cGU9ImphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0U1FMRXhjZXB0aW9uIgorIHJldHVybj0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXRlbWVudCIKKyByZXR1cm49ImphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJTdGF0ZW1lbnRFdmVudExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5FdmVudExpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ic3RhdGVtZW50Q2xvc2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iamF2YXguc3FsLlN0YXRlbWVudEV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXRlbWVudEVycm9yT2NjdXJyZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJqYXZheC5zcWwuU3RhdGVtZW50RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iamF2YXgueG1sIgogPgpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYwppbmRleCAwODJlNzA0Li4xZmRlNDM3IDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYworKysgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYwpAQCAtMTAzLDYgKzEwMyw5IEBACiAgICAgZHVtcF9maWxlKCJORVRXT1JLIFJPVVRFUyIsICIvcHJvYy9uZXQvcm91dGUiKTsKICAgICBkdW1wX2ZpbGUoIkFSUCBDQUNIRSIsICIvcHJvYy9uZXQvYXJwIik7CiAKKyAgICBydW5fY29tbWFuZCgiV0lGSSBORVRXT1JLUyIsIDIwLAorICAgICAgICAgICAgInN1IiwgInJvb3QiLCAid3BhX2NsaSIsICJsaXN0X25ldHdvcmtzIiwgTlVMTCk7CisKICNpZmRlZiBGV0RVTVBfYmNtNDMyOQogICAgIHJ1bl9jb21tYW5kKCJEVU1QIFdJRkkgRklSTVdBUkUgTE9HIiwgNjAsCiAgICAgICAgICAgICAic3UiLCAicm9vdCIsICJkaGR1dGlsIiwgIi1pIiwgImV0aDAiLCAidXBsb2FkIiwgIi9kYXRhL2xvY2FsL3RtcC93bGFuX2NyYXNoLmR1bXAiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMWQ5ZTBmMS4uMmVhZDk3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE2NTcsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0ZWxlcGhvbnkuZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255Lm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyBwcm92aXNpb25pbmciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBOT1Qgd2lwaW5nIG91dCB0aGUgcGFzc3dvcmRzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NzM2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBjb250ZXh0dWFsIEFjdGlvbkJhci4KKyAqIFRoZSBBY3Rpb25CYXIgYWN0cyBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgdGl0bGUgYmFyIGluIEFjdGl2aXRpZXMuCisgKiBJdCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBjcmVhdGluZyB0b29sYmFyIGFjdGlvbnMgYXMgd2VsbCBhcworICogbWV0aG9kcyBvZiBuYXZpZ2F0aW5nIGFyb3VuZCBhbiBhcHBsaWNhdGlvbi4gCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25CYXIgeworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4gQ29uc2lzdHMgb2YgZWl0aGVyIGEgbG9nbyBvciBpY29uCisgICAgICogYW5kIHRpdGxlIHRleHQgd2l0aCBhbiBvcHRpb25hbCBzdWJ0aXRsZS4gQ2xpY2tpbmcgYW55IG9mIHRoZXNlIGVsZW1lbnRzCisgICAgICogd2lsbCBkaXNwYXRjaCBvbkFjdGlvbkl0ZW1TZWxlY3RlZCB0byB0aGUgcmVnaXN0ZXJlZCBDYWxsYmFjayB3aXRoCisgICAgICogYSBNZW51SXRlbSB3aXRoIGl0ZW0gSUQgYW5kcm9pZC5SLmlkLmhvbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEcm9wZG93biBsaXN0IG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIGRyb3Bkb3duIG1lbnUgZm9yIG5hdmlnYXRpb24gd2l0aGluIHRoZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCA9IDE7CisgICAgCisgICAgLyoqCisgICAgICogVGFiIG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIHNlcmllcyBvZiB0YWJzIGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1RBQlMgPSAyOworICAgIAorICAgIC8qKgorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUuIFRoaXMgbmF2aWdhdGlvbiBtb2RlIGlzIHNldCBpbXBsaWNpdGx5IHdoZW5ldmVyCisgICAgICogYSBjdXN0b20gbmF2aWdhdGlvbiB2aWV3IGlzIHNldC4gU2VlIHtAbGluayAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9DVVNUT00gPSAzOworCisgICAgLyoqCisgICAgICogVXNlIGxvZ28gaW5zdGVhZCBvZiBpY29uIGlmIGF2YWlsYWJsZS4gVGhpcyBmbGFnIHdpbGwgY2F1c2UgYXBwcm9wcmlhdGUKKyAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzIHRvIHVzZSBhIHdpZGVyIGxvZ28gaW4gcGxhY2Ugb2YgdGhlIHN0YW5kYXJkIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9VU0VfTE9HTyA9IDB4MTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlICdob21lJyBlbGVtZW50cyBpbiB0aGlzIGFjdGlvbiBiYXIsIGxlYXZpbmcgbW9yZSBzcGFjZSBmb3Igb3RoZXIKKyAgICAgKiBuYXZpZ2F0aW9uIGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIGxvZ28gYW5kIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ISURFX0hPTUUgPSAweDI7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFjayB0aGF0IHRoZSBBY3Rpb25CYXIgd2lsbCB1c2UgdG8gaGFuZGxlIGV2ZW50cworICAgICAqIGFuZCBwb3B1bGF0ZSBtZW51cy4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHZpZXcKKyAgICAgKiBmb3IgY3VzdG9tIG5hdmlnYXRpb24uCisgICAgICogCisgICAgICogQ3VzdG9tIG5hdmlnYXRpb24gdmlld3MgYXBwZWFyIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGljb24gYW5kCisgICAgICogYW55IGFjdGlvbiBidXR0b25zIGFuZCBtYXkgdXNlIGFueSBzcGFjZSBhdmFpbGFibGUgdGhlcmUuIENvbW1vbgorICAgICAqIHVzZSBjYXNlcyBmb3IgY3VzdG9tIG5hdmlnYXRpb24gdmlld3MgbWlnaHQgaW5jbHVkZSBhbiBhdXRvLXN1Z2dlc3RpbmcKKyAgICAgKiBhZGRyZXNzIGJhciBmb3IgYSBicm93c2VyIG9yIG90aGVyIG5hdmlnYXRpb24gbWVjaGFuaXNtcyB0aGF0IGRvIG5vdAorICAgICAqIHRyYW5zbGF0ZSB3ZWxsIHRvIHByb3ZpZGVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIG5hdmlnYXRpb24gdmlldyB0byBwbGFjZSBpbiB0aGUgQWN0aW9uQmFyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldyk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gZHJvcGRvd24gbmF2aWdhdGlvbiBtb2RlIGFuZCBzdXBwbHkgYW4gYWRhcHRlcgorICAgICAqIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGZvciBuYXZpZ2F0aW9uIGNob2ljZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYWRhcHRlciB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBib3RoIHRvIGRpc3BsYXkKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIHNlbGVjdGlvbiBhbmQgcG9wdWxhdGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGRyb3Bkb3duIG5hdmlnYXRpb24gbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB0aXRsZSBhbmQgc3VidGl0bGUuCisgICAgICogCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUKKyAgICAgKiBuYW1lIG9mIHlvdXIgQWN0aXZpdHkuIFN1YnRpdGxlcyBhcmUgZGlzcGxheWVkIHVuZGVybmVhdGggdGhlIHRpdGxlLCB1c3VhbGx5CisgICAgICogaW4gYSBzbWFsbGVyIGZvbnQgb3Igb3RoZXJ3aXNlIGxlc3MgcHJvbWluZW50bHkgdGhhbiB0aGUgdGl0bGUuIFN1YnRpdGxlcyBhcmUKKyAgICAgKiBnb29kIGZvciBleHRlbmRlZCBkZXNjcmlwdGlvbnMgb2YgYWN0aXZpdHkgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gbnVsbCBpcyB0cmVhdGVkIGFzIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgVGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gbnVsbCBpcyB0cmVhdGVkIGFzIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSwgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdGl0bGUgYW5kIHN1YnRpdGxlLgorICAgICAqIAorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCisgICAgICogbmFtZSBvZiB5b3VyIEFjdGl2aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIG51bGwgaXMgdHJlYXRlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IGRpc3BsYXkgb3B0aW9ucy4gVGhpcyBjaGFuZ2VzIGFsbCBkaXNwbGF5IG9wdGlvbiBiaXRzIGF0IG9uY2UuIFRvIGNoYW5nZQorICAgICAqIGEgbGltaXRlZCBzdWJzZXQgb2YgZGlzcGxheSBvcHRpb25zLCBzZWUge0BsaW5rICNzZXREaXNwbGF5T3B0aW9ucyhpbnQsIGludCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgY29tYmluYXRpb24gb2YgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgRElTUExBWV8gY29uc3RhbnRzCisgICAgICogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBBY3Rpb25CYXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCBzZWxlY3RlZCBkaXNwbGF5IG9wdGlvbnMuIE9ubHkgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGJ5IG1hc2sgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAqIFRvIGNoYW5nZSBhbGwgZGlzcGxheSBvcHRpb24gYml0cyBhdCBvbmNlLCBzZWUge0BsaW5rICNzZXREaXNwbGF5T3B0aW9ucyhpbnQpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5FeGFtcGxlOiBzZXREaXNwbGF5T3B0aW9ucygwLCBESVNQTEFZX0hJREVfSE9NRSkgd2lsbCBkaXNhYmxlIHRoZQorICAgICAqIHtAbGluayAjRElTUExBWV9ISURFX0hPTUV9IG9wdGlvbi4KKyAgICAgKiBzZXREaXNwbGF5T3B0aW9ucyhESVNQTEFZX0hJREVfSE9NRSwgRElTUExBWV9ISURFX0hPTUUgfCBESVNQTEFZX1VTRV9MT0dPKQorICAgICAqIHdpbGwgZW5hYmxlIHtAbGluayAjRElTUExBWV9ISURFX0hPTUV9IGFuZCBkaXNhYmxlIHtAbGluayAjRElTUExBWV9VU0VfTE9HT30uCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiB0aGUgYml0cyBkZWZpbmVkIGJ5IHRoZSBESVNQTEFZXyBjb25zdGFudHMKKyAgICAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIEFjdGlvbkJhci4KKyAgICAgKiBAcGFyYW0gbWFzayBBIGJpdCBtYXNrIGRlY2xhcmluZyB3aGljaCBkaXNwbGF5IG9wdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEFjdGlvbkJhcidzIGJhY2tncm91bmQuCisgICAgICogCisgICAgICogQHBhcmFtIGQgQmFja2dyb3VuZCBkcmF3YWJsZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEFjdGlvbkJhciB0aXRsZSBpbiBzdGFuZGFyZCBtb2RlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB7QGxpbmsgI2dldE5hdmlnYXRpb25Nb2RlKCl9IHdvdWxkIG5vdCByZXR1cm4KKyAgICAgKiB7QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH0uIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBBY3Rpb25CYXIgdGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBBY3Rpb25CYXIgc3VidGl0bGUgaW4gc3RhbmRhcmQgbW9kZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYge0BsaW5rICNnZXROYXZpZ2F0aW9uTW9kZSgpfSB3b3VsZCBub3QgcmV0dXJuCisgICAgICoge0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQWN0aW9uQmFyIHN1YnRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgcmVzdWx0IHdpbGwgYmUgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9UQUJTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX0NVU1RPTX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSwgQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgb2YgZGlzcGxheSBvcHRpb25zLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERpc3BsYXlPcHRpb25zKCk7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBBY3Rpb25CYXIgZXZlbnRzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5hdmlnYXRpb24gaXRlbSBpbiB5b3VyIGFjdGlvbiBiYXIKKyAgICAgICAgICogaXMgc2VsZWN0ZWQuCisgICAgICAgICAqICAgIAorICAgICAgICAgKiBAcGFyYW0gaXRlbVBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEBwYXJhbSBpdGVtSWQgSUQgb2YgdGhlIGl0ZW0gY2xpY2tlZC4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkKGludCBpdGVtUG9zaXRpb24sIGxvbmcgaXRlbUlkKTsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIEluIHByb2dyZXNzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUNvbnRleHRNb2RlKGludCBtb2RlSWQsIE1lbnUgbWVudSk7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUNvbnRleHRNb2RlKGludCBtb2RlSWQsIE1lbnUgbWVudSk7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1DbGlja2VkKGludCBtb2RlSWQsIE1lbnVJdGVtIGl0ZW0pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgc3R1YiBpbXBsZW1lbnRhdGlvbnMgb2YgQWN0aW9uQmFyLkNhbGxiYWNrIG1ldGhvZHMuCisgICAgICogRXh0ZW5kIHRoaXMgaWYgeW91IG9ubHkgbmVlZCBhIHN1YnNldCBvZiBDYWxsYmFjayBmdW5jdGlvbmFsaXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlQ2FsbGJhY2sgaW1wbGVtZW50cyBDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQ29udGV4dE1vZGUoaW50IG1vZGVJZCwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUNvbnRleHRNb2RlKGludCBtb2RlSWQsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtQ2xpY2tlZChpbnQgbW9kZUlkLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQoaW50IGl0ZW1Qb3NpdGlvbiwgbG9uZyBpdGVtSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCA5YjlhZTUyLi40YTQ3YjY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtMTYsMTkgKzE2LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CkBAIC0zOSw3ICs0MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKQEAgLTUwLDggKzUyLDEwIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25CYXJWaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5mbGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwpAQCAtNjgsOSArNzIsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuU3BsaXRBY3Rpb25CYXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiAKIC8qKgogICogQW4gYWN0aXZpdHkgaXMgYSBzaW5nbGUsIGZvY3VzZWQgdGhpbmcgdGhhdCB0aGUgdXNlciBjYW4gZG8uICBBbG1vc3QgYWxsCkBAIC02MDYsNiArNjExLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfSElFUkFSQ0hZX1RBRyA9ICJhbmRyb2lkOnZpZXdIaWVyYXJjaHlTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UU19UQUcgPSAiYW5kcm9pZDpmcmFnbWVudHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfSURTX0tFWSA9ICJhbmRyb2lkOnNhdmVkRGlhbG9nSWRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HU19UQUcgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ3MiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfS0VZX1BSRUZJWCA9ICJhbmRyb2lkOmRpYWxvZ18iOwpAQCAtNjI3LDE4ICs2MzMsMjUgQEAKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudDsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eUluZm8gbUFjdGl2aXR5SW5mbzsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZDsKLSAgICAvKnBhY2thZ2UqLyBPYmplY3QgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgLypwYWNrYWdlKi8gSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKICAgICBBY3Rpdml0eSBtUGFyZW50OwogICAgIGJvb2xlYW4gbUNhbGxlZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc3VtZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkOwogICAgIGJvb2xlYW4gbUZpbmlzaGVkOwogICAgIGJvb2xlYW4gbVN0YXJ0ZWRBY3Rpdml0eTsKKyAgICAvKiogdHJ1ZSBpZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIHJlY3JlYXRlIGl0IHdpdGggYSBuZXcgY29uZmlndXJhdGlvbiAqLworICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBpbnQgbUNvbmZpZ0NoYW5nZUZsYWdzOwogICAgIC8qcGFja2FnZSovIENvbmZpZ3VyYXRpb24gbUN1cnJlbnRDb25maWc7CiAgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyOwogCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgeworICAgICAgICBPYmplY3QgYWN0aXZpdHk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50czsKKyAgICB9CisgICAgLyogcGFja2FnZSAqLyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKKyAgICAKICAgICBwcml2YXRlIFdpbmRvdyBtV2luZG93OwogCiAgICAgcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwpAQCAtNjQ2LDEwICs2NTksMTMgQEAKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1XaW5kb3dBZGRlZCA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tU2VydmVyID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtVmlzaWJsZUZyb21DbGllbnQgPSB0cnVlOworICAgIC8qcGFja2FnZSovIEFjdGlvbkJhciBtQWN0aW9uQmFyID0gbnVsbDsKIAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKICAgICBwcml2YXRlIGludCBtVGl0bGVDb2xvciA9IDA7CiAKKyAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXIgbUZyYWdtZW50cyA9IG5ldyBGcmFnbWVudE1hbmFnZXIoKTsKKyAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNYW5hZ2VkQ3Vyc29yIHsKICAgICAgICAgTWFuYWdlZEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwpAQCAtNjc2LDcgKzY5Miw3IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NUQVRFX1NFVCA9IHtjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuc3RhdGVfZm9jdXNlZH07CiAKICAgICBwcml2YXRlIFRocmVhZCBtVWlUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKIAogICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKICAgICAvKgpAQCAtODAwLDYgKzgxNiwxMiBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgbVZpc2libGVGcm9tQ2xpZW50ID0gIW1XaW5kb3cuZ2V0V2luZG93U3R5bGUoKS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb0Rpc3BsYXksIGZhbHNlKTsKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXJjZWxhYmxlIHAgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHKTsKKyAgICAgICAgICAgIG1GcmFnbWVudHMucmVzdG9yZUFsbFN0YXRlKHAsIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmZyYWdtZW50cyA6IG51bGwpOworICAgICAgICB9CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGUoKTsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogCkBAIC05MTQsNiArOTM2LDEwIEBACiAgICAgICAgICAgICBtVGl0bGVSZWFkeSA9IHRydWU7CiAgICAgICAgICAgICBvblRpdGxlQ2hhbmdlZChnZXRUaXRsZSgpLCBnZXRUaXRsZUNvbG9yKCkpOwogICAgICAgICB9CisgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwgJiYgbVdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpKSB7CisgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHRoZSBhY3Rpb24gYmFyIG1lbnUgc28gdGhhdCBpdCBjYW4gaW5pdGlhbGl6ZSBwcm9wZXJseS4gCisgICAgICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgIH0KICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogCkBAIC0xMDg0LDYgKzExMTAsMTAgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewogICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoV0lORE9XX0hJRVJBUkNIWV9UQUcsIG1XaW5kb3cuc2F2ZUhpZXJhcmNoeVN0YXRlKCkpOworICAgICAgICBQYXJjZWxhYmxlIHAgPSBtRnJhZ21lbnRzLnNhdmVBbGxTdGF0ZSgpOworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRQYXJjZWxhYmxlKEZSQUdNRU5UU19UQUcsIHApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzg4LDcgKzE0MTgsOCBAQAogICAgICAqIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmFjdGl2aXR5IDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDQ0LDggKzE0NzUsOSBAQAogICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCl9CiAgICAgICovCi0gICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCkgewotICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuY2hpbGRyZW4gOiBudWxsOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTE0NTksMTEgKzE0OTEsMzQgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICAgIAorICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgcmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpIHsKKyAgICAgICAgT2JqZWN0IGFjdGl2aXR5ID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRyZW4gPSBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG1GcmFnbWVudHMucmV0YWluTm9uQ29uZmlnKCk7CisgICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsICYmIGNoaWxkcmVuID09IG51bGwgJiYgZnJhZ21lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG5jaSA9IG5ldyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CisgICAgICAgIG5jaS5hY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBuY2kuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICAgICAgbmNpLmZyYWdtZW50cyA9IGZyYWdtZW50czsKKyAgICAgICAgcmV0dXJuIG5jaTsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKSB7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBTdGFydCBhIHNlcmllcyBvZiBlZGl0IG9wZXJhdGlvbnMgb24gdGhlIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IEJhY2tTdGFja0VudHJ5KG1GcmFnbWVudHMpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBXcmFwcGVyIGFyb3VuZAogICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZyl9CiAgICAgICogdGhhdCBnaXZlcyB0aGUgcmVzdWx0aW5nIHtAbGluayBDdXJzb3J9IHRvIGNhbGwKQEAgLTE1MjUsNDAgKzE1ODAsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBwZXIgYXJvdW5kIHtAbGluayBDdXJzb3IjY29tbWl0VXBkYXRlcygpfSB0aGF0IHRha2VzIGNhcmUgb2Ygbm90aW5nCi0gICAgICogdGhhdCB0aGUgQ3Vyc29yIG5lZWRzIHRvIGJlIHJlcXVlcmllZC4gIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBpbgotICAgICAqIHtAbGluayAjb25QYXVzZX0gb3Ige0BsaW5rICNvblN0b3B9IHRvIGhhdmUgdGhlIHN5c3RlbSBjYWxsCi0gICAgICoge0BsaW5rIEN1cnNvciNyZXF1ZXJ5fSBmb3IgeW91IGlmIHRoZSBhY3Rpdml0eSBpcyBsYXRlciByZXN1bWVkLiAgVGhpcwotICAgICAqIGFsbG93cyB5b3UgdG8gYXZvaWQgZGV0ZXJtaW5nIHdoZW4gdG8gZG8gdGhlIHJlcXVlcnkgeW91cnNlbGYgKHdoaWNoIGlzCi0gICAgICogcmVxdWlyZWQgZm9yIHRoZSBDdXJzb3IgdG8gc2VlIGFueSBkYXRhIGNoYW5nZXMgdGhhdCB3ZXJlIGNvbW1pdHRlZCB3aXRoCi0gICAgICogaXQpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjIFRoZSBDdXJzb3Igd2hvc2UgY2hhbmdlcyBhcmUgdG8gYmUgY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEBzZWUgI21hbmFnZWRRdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQotICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKLSAgICAgKiBAc2VlIEN1cnNvciNjb21taXRVcGRhdGVzKCkKLSAgICAgKiBAc2VlIEN1cnNvciNyZXF1ZXJ5Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyB2b2lkIG1hbmFnZWRDb21taXRVcGRhdGVzKEN1cnNvciBjKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFuYWdlZEN1cnNvciBtYyA9IG1NYW5hZ2VkQ3Vyc29ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1jLm1DdXJzb3IgPT0gYykgewotICAgICAgICAgICAgICAgICAgICBjLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbWMubVVwZGF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkN1cnNvciAiICsgYyArICIgaXMgbm90IGN1cnJlbnRseSBtYW5hZ2VkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFjdGl2aXR5IHRvIHRha2UgY2FyZSBvZiBtYW5hZ2luZyB0aGUgZ2l2ZW4KICAgICAgKiB7QGxpbmsgQ3Vyc29yfSdzIGxpZmVjeWNsZSBmb3IgeW91IGJhc2VkIG9uIHRoZSBhY3Rpdml0eSdzIGxpZmVjeWNsZS4KICAgICAgKiBUaGF0IGlzLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBzdG9wcGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBjYWxsCkBAIC0xNjM2LDcgKzE2NTcsNjAgQEAKICAgICBwdWJsaWMgVmlldyBmaW5kVmlld0J5SWQoaW50IGlkKSB7CiAgICAgICAgIHJldHVybiBnZXRXaW5kb3coKS5maW5kVmlld0J5SWQoaWQpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoaXMgYWN0aXZpdHkncyBBY3Rpb25CYXIuCisgICAgICogCisgICAgICogPHA+PGVtPk5vdGU6PC9lbT4gVGhlIEFjdGlvbkJhciBpcyBpbml0aWFsaXplZCB3aGVuIGEgY29udGVudCB2aWV3CisgICAgICogaXMgc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI3NldENvbnRlbnRWaWV3fQorICAgICAqIG9yIHtAbGluayAjYWRkQ29udGVudFZpZXd9LgorICAgICAqIEByZXR1cm4gVGhlIEFjdGl2aXR5J3MgQWN0aW9uQmFyLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25CYXIgZ2V0QWN0aW9uQmFyKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvbkJhcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBBY3Rpb25CYXIsIGxvY2F0ZXMgdGhlIGluZmxhdGVkIEFjdGlvbkJhclZpZXcsCisgICAgICogaW5pdGlhbGl6ZXMgdGhlIEFjdGlvbkJhciB3aXRoIHRoZSB2aWV3LCBhbmQgc2V0cyBtQWN0aW9uQmFyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0QWN0aW9uQmFyKCkgeworICAgICAgICBpZiAoIWdldFdpbmRvdygpLmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQWN0aW9uQmFyVmlldyB2aWV3ID0gKEFjdGlvbkJhclZpZXcpIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXIpOworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgIAlMaW5lYXJMYXlvdXQgc3BsaXRWaWV3ID0gCisgICAgICAgIAkJKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuY29udGV4dF9hY3Rpb25fYmFyKTsKKyAgICAgICAgCWlmIChzcGxpdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAJCW1BY3Rpb25CYXIgPSBuZXcgU3BsaXRBY3Rpb25CYXIodmlldywgc3BsaXRWaWV3KTsKKyAgICAgICAgCX0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjcmVhdGUgYWN0aW9uIGJhcjsgdmlldyBub3QgZm91bmQgaW4gd2luZG93IGRlY29yLiIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyB0aGUgY29udGFpbmVyIElEIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeUlkKGlkKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB0YWcgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyBzdXBwbGllZCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIG9ubHkKKyAgICAgKiByZXR1cm5zIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIGFjdGl2aXR5J3MgY29udGVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVRhZyh0YWcpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGFjdGl2aXR5IGNvbnRlbnQgZnJvbSBhIGxheW91dCByZXNvdXJjZS4gIFRoZSByZXNvdXJjZSB3aWxsIGJlCiAgICAgICogaW5mbGF0ZWQsIGFkZGluZyBhbGwgdG9wLWxldmVsIHZpZXdzIHRvIHRoZSBhY3Rpdml0eS4KQEAgLTE2NDUsNiArMTcxOSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoaW50IGxheW91dFJlc0lEKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KGxheW91dFJlc0lEKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1Niw2ICsxNzMxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NjgsNiArMTc0NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjc5LDYgKzE3NTYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKICAgICAgICAgZ2V0V2luZG93KCkuYWRkQ29udGVudFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkwMiwxMiArMTk4MCwyNSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBQb3AgdGhlIGxhc3QgZnJhZ21lbnQgdHJhbnNpdGlvbiBmcm9tIHRoZSBsb2NhbCBhY3Rpdml0eSdzIGZyYWdtZW50CisgICAgICogYmFjayBzdGFjay4gIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcG9wLCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHByZXZpb3VzIGJhY2sgc3RhdGUKKyAgICAgKiB0byBsb29rIGZvcjsgaWYgZm91bmQsIGFsbCBzdGF0ZXMgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGF0CisgICAgICogc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBJZiBudWxsLCBvbmx5IHRoZSB0b3Agc3RhdGUgaXMgcG9wcGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2tTdGF0ZShtSGFuZGxlciwgbmFtZSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBoYXMgZGV0ZWN0ZWQgdGhlIHVzZXIncyBwcmVzcyBvZiB0aGUgYmFjawogICAgICAqIGtleS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBmaW5pc2hlcyB0aGUgY3VycmVudCBhY3Rpdml0eSwKICAgICAgKiBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIHRvIGRvIHdoYXRldmVyIHlvdSB3YW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIGZpbmlzaCgpOworICAgICAgICBpZiAoIXBvcEJhY2tTdGFjayhudWxsKSkgeworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xOTc3LDYgKzIwNjgsMTMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkgeworICAgICAgICAvLyBGaXJzdCB0aW1lIGNvbnRlbnQgaXMgYXZhaWxhYmxlLCBsZXQgdGhlIGZyYWdtZW50IG1hbmFnZXIKKyAgICAgICAgLy8gYXR0YWNoIGFsbCBvZiB0aGUgZnJhZ21lbnRzIHRvIGl0LiAgRG9uJ3QgZG8gdGhpcyBpZiB0aGUKKyAgICAgICAgLy8gYWN0aXZpdHkgaXMgbm8gbG9uZ2VyIGF0dGFjaGVkIChiZWNhdXNlIGl0IGlzIGJlaW5nIGRlc3Ryb3llZCkuCisgICAgICAgIGlmIChtRnJhZ21lbnRzLm1DdXJTdGF0ZSA8IEZyYWdtZW50LkNPTlRFTlQKKyAgICAgICAgICAgICAgICAmJiBtRnJhZ21lbnRzLm1BY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtRnJhZ21lbnRzLm1vdmVUb1N0YXRlKEZyYWdtZW50LkNPTlRFTlQsIGZhbHNlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjE0NSw3ICsyMjQzLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdyA9IG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBzaG93IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShtZW51LCBnZXRNZW51SW5mbGF0ZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gc2hvdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjE2Miw2ICsyMjYyLDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVQYW5lbChpbnQgZmVhdHVyZUlkLCBWaWV3IHZpZXcsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbWVudSAhPSBudWxsKSB7CiAgICAgICAgICAgICBib29sZWFuIGdvZm9yaXQgPSBvblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGdvZm9yaXQgfD0gbUZyYWdtZW50cy5kaXNwYXRjaFByZXBhcmVPcHRpb25zTWVudShtZW51KTsKICAgICAgICAgICAgIHJldHVybiBnb2Zvcml0ICYmIG1lbnUuaGFzVmlzaWJsZUl0ZW1zKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yMTkyLDExICsyMjkzLDE3IEBACiAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBjYWxsIHRocm91Z2ggdG8gc3VwZXJjbGFzcydzIGltcGxtZWVudGF0aW9uIG9mIGVhY2gKICAgICAgICAgICAgICAgICAvLyBvZiB0aGVzZSBtZXRob2RzIGJlbG93CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMCwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfQ09OVEVYVF9NRU5VOgogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDEsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyMTUsNiArMjMyMiw3IEBACiAgICAgcHVibGljIHZvaWQgb25QYW5lbENsb3NlZChpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgc3dpdGNoIChmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTDoKKyAgICAgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgb25PcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKQEAgLTIyMjUsNiArMjMzMywxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlY2xhcmUgdGhhdCB0aGUgb3B0aW9ucyBtZW51IGhhcyBjaGFuZ2VkLCBzbyBzaG91bGQgYmUgcmVjcmVhdGVkLgorICAgICAqIFRoZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aGUgbmV4dAorICAgICAqIHRpbWUgaXQgbmVlZHMgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVPcHRpb25zTWVudSgpIHsKKyAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKICAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4KICAgICAgKiAKQEAgLTMwNjYsNiArMzE4MywzNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBGcmFnbWVudCBpbiB0aGlzIGFjdGl2aXR5IGNhbGxzIGl0cyAKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eX0gb3Ige0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHR9CisgICAgICogbWV0aG9kLgorICAgICAqIAorICAgICAqIDxwPlRoaXMgbWV0aG9kIHRocm93cyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb259CisgICAgICogaWYgdGhlcmUgd2FzIG5vIEFjdGl2aXR5IGZvdW5kIHRvIHJ1biB0aGUgZ2l2ZW4gSW50ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgbWFraW5nIHRoZSBjYWxsLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuIAorICAgICAqIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHkgCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEludGVudCBpbnRlbnQsIAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIHRoaXMsIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG1Ub2tlbiwgZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgICAgIGlmIChhciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFpblRocmVhZC5zZW5kQWN0aXZpdHlSZXN1bHQoCisgICAgICAgICAgICAgICAgbVRva2VuLCBmcmFnbWVudC5tV2hvLCByZXF1ZXN0Q29kZSwKKyAgICAgICAgICAgICAgICBhci5nZXRSZXN1bHRDb2RlKCksIGFyLmdldFJlc3VsdERhdGEoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMaWtlIHtAbGluayAjc3RhcnRBY3Rpdml0eUZyb21DaGlsZChBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwgYnV0CiAgICAgICogdGFraW5nIGEgSW50ZW50U2VuZGVyOyBzZWUKICAgICAgKiB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KEludGVudFNlbmRlciwgaW50LCBJbnRlbnQsIGludCwgaW50LCBpbnQpfQpAQCAtMzIyNCw2ICszMzcxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhpcyBhY3Rpdml0eSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYmUKKyAgICAgKiByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBUaGlzIGlzIG9mdGVuIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uU3RvcH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0YXRlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgb3Igd2lsbCBiZSBwYXNzZWQKKyAgICAgKiBvbiB0byB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgdmlhIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCisgICAgICogCisgICAgICogQHJldHVybiBJZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgdG9ybiBkb3duIGluIG9yZGVyIHRvIGJlIHJlY3JlYXRlZCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24sCisgICAgICogcmV0dXJucyB0cnVlOyBlbHNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCB0aGlzIHdoZW4geW91ciBhY3Rpdml0eSBpcyBkb25lIGFuZCBzaG91bGQgYmUgY2xvc2VkLiAgVGhlCiAgICAgICogQWN0aXZpdHlSZXN1bHQgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHdob2V2ZXIgbGF1bmNoZWQgeW91IHZpYQogICAgICAqIG9uQWN0aXZpdHlSZXN1bHQoKS4KQEAgLTMzMjQsOCArMzQ4NCw3IEBACiAgICAgICogQHNlZSAjY3JlYXRlUGVuZGluZ1Jlc3VsdAogICAgICAqIEBzZWUgI3NldFJlc3VsdChpbnQpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLAotICAgICAgICAgICAgSW50ZW50IGRhdGEpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzA5LDE1ICszODY4LDY5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KLSAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4gIFRoaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBudWxsIGZvciBhbGwgdmlldyBuYW1lcy4KKyAgICAgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSNvbkNyZWF0ZVZpZXd9IHVzZWQgd2hlbgorICAgICAqIGluZmxhdGluZyB3aXRoIHRoZSBMYXlvdXRJbmZsYXRlciByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9LgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyA8ZnJhZ21lbnQ+IHRhZ3MgdG8gZW1iZWQgZnJhZ21lbnRzIGluc2lkZQorICAgICAqIG9mIHRoZSBhY3Rpdml0eS4KICAgICAgKgogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyI2NyZWF0ZVZpZXcKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3cjZ2V0TGF5b3V0SW5mbGF0ZXIKICAgICAgKi8KICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoISJmcmFnbWVudCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gCisgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50KTsKKyAgICAgICAgU3RyaW5nIGZuYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfbmFtZSk7CisgICAgICAgIGludCBpZCA9IGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF9pZCwgMCk7CisgICAgICAgIFN0cmluZyB0YWcgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF90YWcpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IE11c3Qgc3BlY2lmeSB1bmlxdWUgYW5kcm9pZDppZCBmb3IgIiArIGZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHdlIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZSwgd2UgbWF5IGFscmVhZHkgaGF2ZQorICAgICAgICAgICAgLy8gaW5zdGFudGlhdGVkIHRoaXMgZnJhZ21lbnQgZnJvbSB0aGUgc3RhdGUgYW5kIHNob3VsZCB1c2UKKyAgICAgICAgICAgIC8vIHRoYXQgaW5zdGFuY2UgaW5zdGVhZCBvZiBtYWtpbmcgYSBuZXcgb25lLgorICAgICAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlci5ERUJVRykgTG9nLnYoVEFHLCAib25DcmVhdGVWaWV3OiBpZD0weCIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSArICIgZm5hbWU9IiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBleGlzdGluZz0iICsgZnJhZ21lbnQpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudCA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIGZuYW1lKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tRnJvbUxheW91dCA9IHRydWU7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50SWQgPSBpZDsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVGFnID0gdGFnOworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IHRoaXM7CisgICAgICAgICAgICAgICAgbUZyYWdtZW50cy5hZGRGcmFnbWVudChmcmFnbWVudCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGlzIGZyYWdtZW50IGlzIG5ld2x5IGluc3RhbnRpYXRlZCAoZWl0aGVyIHJpZ2h0IG5vdywgb3IKKyAgICAgICAgICAgIC8vIGZyb20gbGFzdCBzYXZlZCBzdGF0ZSksIHRoZW4gZ2l2ZSBpdCB0aGUgYXR0cmlidXRlcyB0bworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBpdHNlbGYuCisgICAgICAgICAgICBpZiAoIWZyYWdtZW50Lm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5vbkluZmxhdGUodGhpcywgYXR0cnMsIGZyYWdtZW50Lm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNyZWF0ZSBhIHZpZXcuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRJZChpZCk7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcuZ2V0VGFnKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFRhZyh0YWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50Lm1WaWV3OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IEVycm9yIGluZmxhdGluZyBmcmFnbWVudCAiICsgZm5hbWUpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM3NjgsMjMgKzM5ODEsMjUgQEAKIAogICAgIGZpbmFsIHZvaWQgYXR0YWNoKENvbnRleHQgY29udGV4dCwgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCwgSW5zdHJ1bWVudGF0aW9uIGluc3RyLCBJQmluZGVyIHRva2VuLAogICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBpbmZvLCBDaGFyU2VxdWVuY2UgdGl0bGUsIAotICAgICAgICAgICAgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAorICAgICAgICAgICAgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsCiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICBhdHRhY2goY29udGV4dCwgYVRocmVhZCwgaW5zdHIsIHRva2VuLCAwLCBhcHBsaWNhdGlvbiwgaW50ZW50LCBpbmZvLCB0aXRsZSwgcGFyZW50LCBpZCwKLSAgICAgICAgICAgIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsIG51bGwsIGNvbmZpZyk7CisgICAgICAgICAgICBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBhdHRhY2goQ29udGV4dCBjb250ZXh0LCBBY3Rpdml0eVRocmVhZCBhVGhyZWFkLAogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RyLCBJQmluZGVyIHRva2VuLCBpbnQgaWRlbnQsCiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGluZm8sCiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUsIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLAotICAgICAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMsCisgICAgICAgICAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLAogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgYXR0YWNoQmFzZUNvbnRleHQoY29udGV4dCk7CiAKKyAgICAgICAgbUZyYWdtZW50cy5hdHRhY2hBY3Rpdml0eSh0aGlzKTsKKyAgICAgICAgCiAgICAgICAgIG1XaW5kb3cgPSBQb2xpY3lNYW5hZ2VyLm1ha2VOZXdXaW5kb3codGhpcyk7CiAgICAgICAgIG1XaW5kb3cuc2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1XaW5kb3cuZ2V0TGF5b3V0SW5mbGF0ZXIoKS5zZXRGYWN0b3J5KHRoaXMpOwogICAgICAgICBpZiAoaW5mby5zb2Z0SW5wdXRNb2RlICE9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgIG1XaW5kb3cuc2V0U29mdElucHV0TW9kZShpbmZvLnNvZnRJbnB1dE1vZGUpOwogICAgICAgICB9CkBAIC0zODAxLDggKzQwMTYsNyBAQAogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKICAgICAgICAgbUVtYmVkZGVkSUQgPSBpZDsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogCiAgICAgICAgIG1XaW5kb3cuc2V0V2luZG93TWFuYWdlcihudWxsLCBtVG9rZW4sIG1Db21wb25lbnQuZmxhdHRlblRvU3RyaW5nKCkpOwogICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsKSB7CkBAIC0zODE2LDYgKzQwMzAsMTAgQEAKICAgICAgICAgcmV0dXJuIG1QYXJlbnQgIT0gbnVsbCA/IG1QYXJlbnQuZ2V0QWN0aXZpdHlUb2tlbigpIDogbVRva2VuOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgcGVyZm9ybUNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIG9uQ3JlYXRlKGljaWNsZSk7CisgICAgfQorICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVN0YXJ0KCkgewogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25TdGFydCh0aGlzKTsKQEAgLTM4MjQsNiArNDA0Miw3IEBACiAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBtQ29tcG9uZW50LnRvU2hvcnRTdHJpbmcoKSArCiAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKICAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RhcnQoKTsKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdGFydCgpIHsKQEAgLTM4NTUsNyArNDA3NCw3IEBACiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdW1lKCkgewogICAgICAgICBwZXJmb3JtUmVzdGFydCgpOwogICAgICAgICAKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOworICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBudWxsOwogICAgICAgICAKICAgICAgICAgLy8gRmlyc3QgY2FsbCBvblJlc3VtZSgpIC1iZWZvcmUtIHNldHRpbmcgbVJlc3VtZWQsIHNvIHdlIGRvbid0CiAgICAgICAgIC8vIHNlbmQgb3V0IGFueSBzdGF0dXMgYmFyIC8gbWVudSBub3RpZmljYXRpb25zIHRoZSBjbGllbnQgbWFrZXMuCkBAIC0zODcwLDYgKzQwODksOSBAQAogICAgICAgICAvLyBOb3cgcmVhbGx5IHJlc3VtZSwgYW5kIGluc3RhbGwgdGhlIGN1cnJlbnQgc3RhdHVzIGJhciBhbmQgbWVudS4KICAgICAgICAgbVJlc3VtZWQgPSB0cnVlOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUmVzdW1lKCk7CisgICAgICAgIAogICAgICAgICBvblBvc3RSZXN1bWUoKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCkBAIC0zODc5LDYgKzQxMDEsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVBhdXNlKCkgeworICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUGF1c2UoKTsKICAgICAgICAgb25QYXVzZSgpOwogICAgIH0KICAgICAKQEAgLTM4OTMsNiArNDExNiw4IEBACiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbG9zZUFsbFBhbmVscygpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RvcCgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RvcCh0aGlzKTsKICAgICAgICAgICAgIGlmICghbUNhbGxlZCkgewpAQCAtMzkxNyw2ICs0MTQyLDExIEBACiAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtRGVzdHJveSgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaERlc3Ryb3koKTsKKyAgICAgICAgb25EZXN0cm95KCk7CisgICAgfQorICAgIAogICAgIGZpbmFsIGJvb2xlYW4gaXNSZXN1bWVkKCkgewogICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CiAgICAgfQpAQCAtMzkyOCw2ICs0MTU4LDExIEBACiAgICAgICAgICAgICArICIsIHJlc0NvZGU9IiArIHJlc3VsdENvZGUgKyAiLCBkYXRhPSIgKyBkYXRhKTsKICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICBvbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZyYWdtZW50IGZyYWcgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5V2hvKHdobyk7CisgICAgICAgICAgICBpZiAoZnJhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhZy5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKaW5kZXggMDNiYjg1OC4uMWIzOGM0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwpAQCAtMTk0LDggKzE5NSw3IEBACiAgICAgICAgIFdpbmRvdyB3aW5kb3c7CiAgICAgICAgIEFjdGl2aXR5IHBhcmVudDsKICAgICAgICAgU3RyaW5nIGVtYmVkZGVkSUQ7Ci0gICAgICAgIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAgICAgICAgIGJvb2xlYW4gcGF1c2VkOwogICAgICAgICBib29sZWFuIHN0b3BwZWQ7CiAgICAgICAgIGJvb2xlYW4gaGlkZUZvck5vdzsKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUF9DT0xVTU4gPSAiJTE3cyAlOHMgJThzICU4cyAlOHMiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX0NPVU5UX0NPTFVNTiA9ICIlMTdzICU4ZCI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV09fQ09VTlRfQ09MVU1OUyA9ICIlMTdzICU4ZCAlMTdzICU4ZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9JTkZPX0ZPUk1BVCA9ICIgICU4ZCAlOGQgJTEwZCAgJXMiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlNGQgJTZkICU4ZCAlMTRzICAlcyI7CiAKICAgICAgICAgLy8gRm9ybWF0dGluZyBmb3IgY2hlY2tpbiBzZXJ2aWNlIC0gdXBkYXRlIHZlcnNpb24gaWYgcm93IGZvcm1hdCBjaGFuZ2VzCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9USFJFQURfQ0hFQ0tJTl9WRVJTSU9OID0gMTsKQEAgLTc2OCw3ICs3NjgsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHMuZGJTdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCcsJyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04MTksMTEgKzgxOSwxMiBAQAogICAgICAgICAgICAgaW50IE4gPSBzdGF0cy5kYlN0YXRzLnNpemUoKTsKICAgICAgICAgICAgIGlmIChOID4gMCkgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiBEQVRBQkFTRVMiKTsKLSAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJThzICU4cyAlMTBzICAlcyIsICJQYWdlc2l6ZSIsICJEYnNpemUiLCAiTG9va2FzaWRlIiwgIkRibmFtZSIpOworICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlNHMgJTZzICU4cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAibGthc2lkZSIsICJjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICJEYm5hbWUiKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xMDQ5LDggKzEwNTAsMjcgQEAKIAogICAgICAgICB2b2lkIG1heWJlU25hcHNob3QoKSB7CiAgICAgICAgICAgICBpZiAobUJvdW5kQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KAotICAgICAgICAgICAgICAgICAgICAgICAgbUJvdW5kQXBwbGljYXRpb24ucHJvY2Vzc05hbWUpOworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlICpwcml2YXRlKiBBY3Rpdml0eVRocmVhZC5QYWNrYWdlSW5mbyB0byAqcHVibGljKiBrbm93bgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG1Cb3VuZEFwcGxpY2F0aW9uLmluZm8ubVBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbyBwYWNrYWdlSW5mbyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZihjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgYSB2YWxpZCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHBtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgYSB2YWxpZCBQYWNrYWdlTWFuYWdlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VJbmZvID0gcG0uZ2V0UGFja2FnZUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9BQ1RJVklUSUVTKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IHBhY2thZ2UgaW5mbyBmb3IgIiArIHBhY2thZ2VOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QobUJvdW5kQXBwbGljYXRpb24ucHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE0NDEsNyArMTQ2MSw3IEBACiAKICAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHkgc3RhcnRBY3Rpdml0eU5vdyhBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwKICAgICAgICAgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGFjdGl2aXR5SW5mbywgSUJpbmRlciB0b2tlbiwgQnVuZGxlIHN0YXRlLAotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSkgeworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzKSB7CiAgICAgICAgIEFjdGl2aXR5Q2xpZW50UmVjb3JkIHIgPSBuZXcgQWN0aXZpdHlDbGllbnRSZWNvcmQoKTsKICAgICAgICAgICAgIHIudG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgIHIuaWRlbnQgPSAwOwpAQCAtMTQ1MCw3ICsxNDcwLDcgQEAKICAgICAgICAgICAgIHIucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgci5lbWJlZGRlZElEID0gaWQ7CiAgICAgICAgICAgICByLmFjdGl2aXR5SW5mbyA9IGFjdGl2aXR5SW5mbzsKLSAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7CisgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG5hbWUgPSBpbnRlbnQuZ2V0Q29tcG9uZW50KCk7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZTsKQEAgLTE1NzIsMTQgKzE1OTIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgci5hY3Rpdml0eUluZm8ubmFtZSArICIgd2l0aCBjb25maWcgIiArIGNvbmZpZyk7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGFwcENvbnRleHQsIHRoaXMsIGdldEluc3RydW1lbnRhdGlvbigpLCByLnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgci5pZGVudCwgYXBwLCByLmludGVudCwgci5hY3Rpdml0eUluZm8sIHRpdGxlLCByLnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzLCBjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgci5lbWJlZGRlZElELCByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogCiAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbUludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm1JbnRlbnQgPSBjdXN0b21JbnRlbnQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzID0gbnVsbDsKKyAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tU3RhcnRlZEFjdGl2aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW50IHRoZW1lID0gci5hY3Rpdml0eUluZm8uZ2V0VGhlbWVSZXNvdXJjZSgpOwogICAgICAgICAgICAgICAgIGlmICh0aGVtZSAhPSAwKSB7CkBAIC0yNTM3LDYgKzI1NTUsOSBAQAogICAgICAgICAgICAgaWYgKGZpbmlzaGluZykgewogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXROb25Db25maWdJbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFyLnBhdXNlZCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNhbGxlZCA9IGZhbHNlOwpAQCAtMjU3Nyw4ICsyNTk4LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChnZXROb25Db25maWdJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByLmFjdGl2aXR5LnJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKApAQCAtMjU4NywyMiArMjYwOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUluc3RydW1lbnRhdGlvbi5vbkV4Y2VwdGlvbihyLmFjdGl2aXR5LCBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmV0YWluIGNoaWxkIGFjdGl2aXRpZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNhZmVUb0NvbXBvbmVudFNob3J0U3RyaW5nKHIuaW50ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkub25EZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5jYWxsQWN0aXZpdHlPbkRlc3Ryb3koci5hY3Rpdml0eSk7CiAgICAgICAgICAgICAgICAgaWYgKCFyLmFjdGl2aXR5Lm1DYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkgKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQmFja1N0YWNrRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTlhZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgQmFja1N0YWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBpbnRbXSBtT3BzOworICAgIGZpbmFsIGludCBtVHJhbnNpdGlvbjsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBmaW5hbCBTdHJpbmcgbU5hbWU7CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja1N0YXRlKEZyYWdtZW50TWFuYWdlciBmbSwgQmFja1N0YWNrRW50cnkgYnNlKSB7CisgICAgICAgIG1PcHMgPSBuZXcgaW50W2JzZS5tTnVtT3AqNF07CisgICAgICAgIEJhY2tTdGFja0VudHJ5Lk9wIG9wID0gYnNlLm1IZWFkOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuY21kOworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5mcmFnbWVudC5tSW5kZXg7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zaXRpb24gPSBic2UubVRyYW5zaXRpb247CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBic2UubVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgbU5hbWUgPSBic2UubU5hbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCYWNrU3RhY2tTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbU9wcyA9IGluLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIG1UcmFuc2l0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gaW4ucmVhZEludCgpOworICAgICAgICBtTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5IGluc3RhbnRpYXRlKEZyYWdtZW50TWFuYWdlciBmbSkgeworICAgICAgICBCYWNrU3RhY2tFbnRyeSBic2UgPSBuZXcgQmFja1N0YWNrRW50cnkoZm0pOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyA8IG1PcHMubGVuZ3RoKSB7CisgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeS5PcCBvcCA9IG5ldyBCYWNrU3RhY2tFbnRyeS5PcCgpOworICAgICAgICAgICAgb3AuY21kID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBGcmFnbWVudCBmID0gZm0ubUFjdGl2ZS5nZXQobU9wc1twb3MrK10pOworICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgb3AuZnJhZ21lbnQgPSBmOworICAgICAgICAgICAgb3AuZW50ZXJBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBvcC5leGl0QW5pbSA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgYnNlLmFkZE9wKG9wKTsKKyAgICAgICAgfQorICAgICAgICBic2UubVRyYW5zaXRpb24gPSBtVHJhbnNpdGlvbjsKKyAgICAgICAgYnNlLm1UcmFuc2l0aW9uU3R5bGUgPSBtVHJhbnNpdGlvblN0eWxlOworICAgICAgICBic2UubU5hbWUgPSBtTmFtZTsKKyAgICAgICAgcmV0dXJuIGJzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUludEFycmF5KG1PcHMpOworICAgICAgICBkZXN0LndyaXRlSW50KG1UcmFuc2l0aW9uKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtTmFtZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFja1N0YWNrU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQGhpZGUgRW50cnkgb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICovCitmaW5hbCBjbGFzcyBCYWNrU3RhY2tFbnRyeSBpbXBsZW1lbnRzIEZyYWdtZW50VHJhbnNhY3Rpb24sIFJ1bm5hYmxlIHsKKyAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXIgbU1hbmFnZXI7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGludCBPUF9OVUxMID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0FERCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9SRVBMQUNFID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFTU9WRSA9IDM7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9ISURFID0gNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1NIT1cgPSA1OworICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBPcCB7CisgICAgICAgIE9wIG5leHQ7CisgICAgICAgIE9wIHByZXY7CisgICAgICAgIGludCBjbWQ7CisgICAgICAgIEZyYWdtZW50IGZyYWdtZW50OworICAgICAgICBpbnQgZW50ZXJBbmltOworICAgICAgICBpbnQgZXhpdEFuaW07CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmVtb3ZlZDsKKyAgICB9CisgICAgCisgICAgT3AgbUhlYWQ7CisgICAgT3AgbVRhaWw7CisgICAgaW50IG1OdW1PcDsKKyAgICBpbnQgbUVudGVyQW5pbTsKKyAgICBpbnQgbUV4aXRBbmltOworICAgIGludCBtVHJhbnNpdGlvbjsKKyAgICBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBib29sZWFuIG1BZGRUb0JhY2tTdGFjazsKKyAgICBTdHJpbmcgbU5hbWU7CisgICAgYm9vbGVhbiBtQ29tbWl0dGVkOworICAgIAorICAgIHB1YmxpYyBCYWNrU3RhY2tFbnRyeShGcmFnbWVudE1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgfQorICAgIAorICAgIHZvaWQgYWRkT3AoT3Agb3ApIHsKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbVRhaWwgPSBvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wLnByZXYgPSBtVGFpbDsKKyAgICAgICAgICAgIG1UYWlsLm5leHQgPSBvcDsKKyAgICAgICAgICAgIG1UYWlsID0gb3A7CisgICAgICAgIH0KKyAgICAgICAgb3AuZW50ZXJBbmltID0gbUVudGVyQW5pbTsKKyAgICAgICAgb3AuZXhpdEFuaW0gPSBtRXhpdEFuaW07CisgICAgICAgIG1OdW1PcCsrOworICAgIH0KKyAgICAgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGRvQWRkT3AoMCwgZnJhZ21lbnQsIHRhZywgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGRvQWRkT3AoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgbnVsbCwgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGRvQWRkT3AoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgdGFnLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9BZGRPcChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZywgaW50IG9wY21kKSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgYWxyZWFkeSBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgIAorICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVGFnICE9IG51bGwgJiYgIXRhZy5lcXVhbHMoZnJhZ21lbnQubVRhZykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBjaGFuZ2UgdGFnIG9mIGZyYWdtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZnJhZ21lbnQgKyAiOiB3YXMgIiArIGZyYWdtZW50Lm1UYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3cgIiArIHRhZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5tVGFnID0gdGFnOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY29udGFpbmVyVmlld0lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tRnJhZ21lbnRJZCAhPSAwICYmIGZyYWdtZW50Lm1GcmFnbWVudElkICE9IGNvbnRhaW5lclZpZXdJZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNoYW5nZSBjb250YWluZXIgSUQgb2YgZnJhZ21lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudCArICI6IHdhcyAiICsgZnJhZ21lbnQubUZyYWdtZW50SWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3cgIiArIGNvbnRhaW5lclZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5tQ29udGFpbmVySWQgPSBmcmFnbWVudC5tRnJhZ21lbnRJZCA9IGNvbnRhaW5lclZpZXdJZDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gb3BjbWQ7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZXBsYWNlKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIHJldHVybiByZXBsYWNlKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZXBsYWNlKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGlmIChjb250YWluZXJWaWV3SWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCB1c2Ugbm9uLXplcm8gY29udGFpbmVyVmlld0lkIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRvQWRkT3AoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgdGFnLCBPUF9SRVBMQUNFKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlbW92ZShGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfUkVNT1ZFOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9ISURFOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfU0hPVzsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCkgeworICAgICAgICBtRW50ZXJBbmltID0gZW50ZXI7CisgICAgICAgIG1FeGl0QW5pbSA9IGV4aXQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uKGludCB0cmFuc2l0aW9uKSB7CisgICAgICAgIG1UcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb25TdHlsZShpbnQgc3R5bGVSZXMpIHsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IHN0eWxlUmVzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkVG9CYWNrU3RhY2soU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbUFkZFRvQmFja1N0YWNrID0gdHJ1ZTsKKyAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIGlmIChtQ29tbWl0dGVkKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21taXQgYWxyZWFkeSBjYWxsZWQiKTsKKyAgICAgICAgbUNvbW1pdHRlZCA9IHRydWU7CisgICAgICAgIG1NYW5hZ2VyLm1BY3Rpdml0eS5tSGFuZGxlci5wb3N0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobU1hbmFnZXIubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWFuYWdlci5tQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBtTWFuYWdlci5tQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGQubUNvbnRhaW5lcklkID09IGYubUNvbnRhaW5lcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQuYWRkKG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQob2xkLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRU1PVkU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9ISURFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NIT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY21kOiAiICsgb3AuY21kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbU1hbmFnZXIubW92ZVRvU3RhdGUobU1hbmFnZXIubUN1clN0YXRlLCBtVHJhbnNpdGlvbiwKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvblN0eWxlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgJiYgbU1hbmFnZXIubUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgbU1hbmFnZXIuYWRkQmFja1N0YWNrU3RhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcG9wRnJvbUJhY2tTdGFjaygpIHsKKyAgICAgICAgT3Agb3AgPSBtVGFpbDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AuY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9BREQ6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRVBMQUNFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VyLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG9wLnJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBvcC5yZW1vdmVkLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChvbGQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRU1PVkU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9ISURFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TSE9XOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IG9wLnByZXY7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwKKyAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgJiYgbU1hbmFnZXIubUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb25TdHlsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IGZjOWJjZjcuLjRmZjhlMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC01Nyw2ICs1Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC01NDMsNiArNTQ0LDE1IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIEZpbGUgZiA9IHZhbGlkYXRlRmlsZVBhdGgobmFtZSwgdHJ1ZSk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UoZi5nZXRQYXRoKCksIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgICAgIHNldEZpbGVQZXJtaXNzaW9uc0Zyb21Nb2RlKGYuZ2V0UGF0aCgpLCBtb2RlLCAwKTsKKyAgICAgICAgcmV0dXJuIGRiOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIGYgPSB2YWxpZGF0ZUZpbGVQYXRoKG5hbWUsIGZhbHNlKTsKQEAgLTYyMCw3ICs2MzAsOCBAQAogICAgICAgICAgICAgICAgICAgICArICIgSXMgdGhpcyByZWFsbHkgd2hhdCB5b3Ugd2FudD8iKTsKICAgICAgICAgfQogICAgICAgICBtTWFpblRocmVhZC5nZXRJbnN0cnVtZW50YXRpb24oKS5leGVjU3RhcnRBY3Rpdml0eSgKLSAgICAgICAgICAgIGdldE91dGVyQ29udGV4dCgpLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBudWxsLCBudWxsLCBpbnRlbnQsIC0xKTsKKyAgICAgICAgICAgIGdldE91dGVyQ29udGV4dCgpLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBudWxsLAorICAgICAgICAgICAgKEFjdGl2aXR5KW51bGwsIGludGVudCwgLTEpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjczNyw2ICsyNzQ4LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHYgPSAoU2V0PFN0cmluZz4pIG1NYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmVmFsdWUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMjc3OSw2ICsyNzk3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIEVkaXRvciBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZC5wdXQoa2V5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMWQ2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitmaW5hbCBjbGFzcyBGcmFnbWVudFN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1NUQVRFX1RBRyA9ICJhbmRyb2lkOnZpZXdfc3RhdGUiOworICAgIAorICAgIGZpbmFsIFN0cmluZyBtQ2xhc3NOYW1lOworICAgIGZpbmFsIGludCBtSW5kZXg7CisgICAgZmluYWwgYm9vbGVhbiBtRnJvbUxheW91dDsKKyAgICBmaW5hbCBpbnQgbUZyYWdtZW50SWQ7CisgICAgZmluYWwgaW50IG1Db250YWluZXJJZDsKKyAgICBmaW5hbCBTdHJpbmcgbVRhZzsKKyAgICBmaW5hbCBib29sZWFuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICAKKyAgICBCdW5kbGUgbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAKKyAgICBGcmFnbWVudCBtSW5zdGFuY2U7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50U3RhdGUoRnJhZ21lbnQgZnJhZykgeworICAgICAgICBtQ2xhc3NOYW1lID0gZnJhZy5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgbUluZGV4ID0gZnJhZy5tSW5kZXg7CisgICAgICAgIG1Gcm9tTGF5b3V0ID0gZnJhZy5tRnJvbUxheW91dDsKKyAgICAgICAgbUZyYWdtZW50SWQgPSBmcmFnLm1GcmFnbWVudElkOworICAgICAgICBtQ29udGFpbmVySWQgPSBmcmFnLm1Db250YWluZXJJZDsKKyAgICAgICAgbVRhZyA9IGZyYWcubVRhZzsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gZnJhZy5tUmV0YWluSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtQ2xhc3NOYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtSW5kZXggPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1Gcm9tTGF5b3V0ID0gaW4ucmVhZEludCgpICE9IDA7CisgICAgICAgIG1GcmFnbWVudElkID0gaW4ucmVhZEludCgpOworICAgICAgICBtQ29udGFpbmVySWQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1UYWcgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtU2F2ZWRGcmFnbWVudFN0YXRlID0gaW4ucmVhZEJ1bmRsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgaWYgKG1JbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byByZXN0b3JlIGZyYWdtZW50ICIgKyBtQ2xhc3NOYW1lLCBlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRWaWV3U3RhdGUKKyAgICAgICAgICAgICAgICAgICAgPSBtU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheShWSUVXX1NUQVRFX1RBRyk7CisgICAgICAgIH0KKyAgICAgICAgbUluc3RhbmNlLnNldEluZGV4KG1JbmRleCk7CisgICAgICAgIG1JbnN0YW5jZS5tRnJvbUxheW91dCA9IG1Gcm9tTGF5b3V0OworICAgICAgICBtSW5zdGFuY2UubUZyYWdtZW50SWQgPSBtRnJhZ21lbnRJZDsKKyAgICAgICAgbUluc3RhbmNlLm1Db250YWluZXJJZCA9IG1Db250YWluZXJJZDsKKyAgICAgICAgbUluc3RhbmNlLm1UYWcgPSBtVGFnOworICAgICAgICBtSW5zdGFuY2UubVJldGFpbkluc3RhbmNlID0gbVJldGFpbkluc3RhbmNlOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtQ2xhc3NOYW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtSW5kZXgpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Gcm9tTGF5b3V0ID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlSW50KG1GcmFnbWVudElkKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtQ29udGFpbmVySWQpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UYWcpOworICAgICAgICBkZXN0LndyaXRlSW50KG1SZXRhaW5JbnN0YW5jZSA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShtU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50U3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudFN0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEZyYWdtZW50U3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudFN0YXRlW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KKworLyoqCisgKiBBIEZyYWdtZW50IGlzIGEgcGllY2Ugb2YgYW4gYXBwbGljYXRpb24ncyB1c2VyIGludGVyZmFjZSBvciBiZWhhdmlvcgorICogdGhhdCBjYW4gYmUgcGxhY2VkIGluIGFuIHtAbGluayBBY3Rpdml0eX0uCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcywgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ2xhc3M+IHNDbGFzc01hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaSU5HID0gMDsgIC8vIE5vdCB5ZXQgY3JlYXRlZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IENSRUFURUQgPSAxOyAgICAgICAvLyBDcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVCA9IDI7ICAgICAgIC8vIFZpZXcgaGllcmFyY2h5IGNvbnRlbnQgYXZhaWxhYmxlLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRCA9IDM7ICAgICAgIC8vIENyZWF0ZWQgYW5kIHN0YXJ0ZWQsIG5vdCByZXN1bWVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FRCA9IDQ7ICAgICAgIC8vIENyZWF0ZWQgc3RhcnRlZCBhbmQgcmVzdW1lZC4KKyAgICAKKyAgICBpbnQgbVN0YXRlID0gSU5JVElBTElaSU5HOworICAgIAorICAgIC8vIFdoZW4gaW5zdGFudGlhdGVkIGZyb20gc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHNhdmVkIHN0YXRlLgorICAgIEJ1bmRsZSBtU2F2ZWRGcmFnbWVudFN0YXRlOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TYXZlZFZpZXdTdGF0ZTsKKyAgICAKKyAgICAvLyBJbmRleCBpbnRvIGFjdGl2ZSBmcmFnbWVudCBhcnJheS4KKyAgICBpbnQgbUluZGV4ID0gLTE7CisgICAgCisgICAgLy8gSW50ZXJuYWwgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnJhZ21lbnQ7CisgICAgU3RyaW5nIG1XaG87CisgICAgCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIGxpc3Qgb2YgYWRkZWQgZnJhZ21lbnRzLgorICAgIGJvb2xlYW4gbUFkZGVkOworICAgIAorICAgIC8vIFNldCB0byB0cnVlIGlmIHRoaXMgZnJhZ21lbnQgd2FzIGluc3RhbnRpYXRlZCBmcm9tIGEgbGF5b3V0IGZpbGUuCisgICAgYm9vbGVhbiBtRnJvbUxheW91dDsKKyAgICAKKyAgICAvLyBOdW1iZXIgb2YgYWN0aXZlIGJhY2sgc3RhY2sgZW50cmllcyB0aGlzIGZyYWdtZW50IGlzIGluLgorICAgIGludCBtQmFja1N0YWNrTmVzdGluZzsKKyAgICAKKyAgICAvLyBTZXQgYXMgc29vbiBhcyBhIGZyYWdtZW50IGlzIGFkZGVkIHRvIGEgdHJhbnNhY3Rpb24gKG9yIHJlbW92ZWQpLAorICAgIC8vIHRvIGJlIGFibGUgdG8gZG8gdmFsaWRhdGlvbi4KKyAgICBBY3Rpdml0eSBtSW1tZWRpYXRlQWN0aXZpdHk7CisgICAgCisgICAgLy8gQWN0aXZpdHkgdGhpcyBmcmFnbWVudCBpcyBhdHRhY2hlZCB0by4KKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgLy8gVGhlIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgZnJhZ21lbnQgLS0gZWl0aGVyIHRoZSBjb250YWluZXIgSUQgaWYgaXQKKyAgICAvLyB3YXMgZHluYW1pY2FsbHkgYWRkZWQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LCBvciB0aGUgSUQgc3VwcGxpZWQgaW4KKyAgICAvLyBsYXlvdXQuCisgICAgaW50IG1GcmFnbWVudElkOworICAgIAorICAgIC8vIFdoZW4gYSBmcmFnbWVudCBpcyBiZWluZyBkeW5hbWljYWxseSBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIHRoaXMKKyAgICAvLyBpcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IGNvbnRhaW5lciBpdCBpcyBiZWluZyBhZGRlZCB0by4KKyAgICBpbnQgbUNvbnRhaW5lcklkOworICAgIAorICAgIC8vIFRoZSBvcHRpb25hbCBuYW1lZCB0YWcgZm9yIHRoaXMgZnJhZ21lbnQgLS0gdXN1YWxseSB1c2VkIHRvIGZpbmQKKyAgICAvLyBmcmFnbWVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGxheW91dC4KKyAgICBTdHJpbmcgbVRhZzsKKyAgICAKKyAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBhcHAgaGFzIHJlcXVlc3RlZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmUgaGlkZGVuCisgICAgLy8gZnJvbSB0aGUgdXNlci4KKyAgICBib29sZWFuIG1IaWRkZW47CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgd291bGQgbGlrZSBpdHMgaW5zdGFuY2UgcmV0YWluZWQgYWNyb3NzCisgICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgIGJvb2xlYW4gbVJldGFpbkluc3RhbmNlOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJldGFpbmVkIGFjcm9zcyB0aGUgY3VycmVudCBjb25maWcgY2hhbmdlLgorICAgIGJvb2xlYW4gbVJldGFpbmluZzsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCBoYXMgbWVudSBpdGVtcyB0byBjb250cmlidXRlLgorICAgIGJvb2xlYW4gbUhhc01lbnU7CisgICAgCisgICAgLy8gVXNlZCB0byB2ZXJpZnkgdGhhdCBzdWJjbGFzc2VzIGNhbGwgdGhyb3VnaCB0byBzdXBlciBjbGFzcy4KKyAgICBib29sZWFuIG1DYWxsZWQ7CisgICAgCisgICAgLy8gSWYgYXBwIGhhcyByZXF1ZXN0ZWQgYSBzcGVjaWZpYyBhbmltYXRpb24sIHRoaXMgaXMgdGhlIG9uZSB0byB1c2UuCisgICAgaW50IG1OZXh0QW5pbTsKKyAgICAKKyAgICAvLyBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGUgZnJhZ21lbnQgYWZ0ZXIgZHluYW1pY2FsbHkgYWRkZWQgdG8gVUkuCisgICAgVmlld0dyb3VwIG1Db250YWluZXI7CisgICAgCisgICAgLy8gVGhlIFZpZXcgZ2VuZXJhdGVkIGZvciB0aGlzIGZyYWdtZW50LgorICAgIFZpZXcgbVZpZXc7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50KCkgeworICAgIH0KKworICAgIHN0YXRpYyBGcmFnbWVudCBpbnN0YW50aWF0ZShBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIGZuYW1lKQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICBDbGFzcyBjbGF6eiA9IHNDbGFzc01hcC5nZXQoZm5hbWUpOworCisgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAorICAgICAgICAgICAgY2xhenogPSBhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhmbmFtZSk7CisgICAgICAgICAgICBzQ2xhc3NNYXAucHV0KGZuYW1lLCBjbGF6eik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChGcmFnbWVudCljbGF6ei5uZXdJbnN0YW5jZSgpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHJlc3RvcmVWaWV3U3RhdGUoKSB7CisgICAgICAgIGlmIChtU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVZpZXcucmVzdG9yZUhpZXJhcmNoeVN0YXRlKG1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICBtU2F2ZWRWaWV3U3RhdGUgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIG1JbmRleCA9IGluZGV4OworICAgICAgICBtV2hvID0gImFuZHJvaWQ6ZnJhZ21lbnQ6IiArIG1JbmRleDsKKyAgIH0KKyAgICAKKyAgICB2b2lkIGNsZWFySW5kZXgoKSB7CisgICAgICAgIG1JbmRleCA9IC0xOworICAgICAgICBtV2hvID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gbm90IG92ZXJyaWRlIGVxdWFscygpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgaGFzaENvZGUoKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgZmluYWwgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICBzYi5hcHBlbmQoIkZyYWdtZW50eyIpOworICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSkpOworICAgICAgICBpZiAobUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICMiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRnJhZ21lbnRJZCAhPSAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBpZD0weCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcobUZyYWdtZW50SWQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtVGFnKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaWRlbnRpZmllciB0aGlzIGZyYWdtZW50IGlzIGtub3duIGJ5LiAgVGhpcyBpcyBlaXRoZXIKKyAgICAgKiB0aGUgYW5kcm9pZDppZCB2YWx1ZSBzdXBwbGllZCBpbiBhIGxheW91dCBvciB0aGUgY29udGFpbmVyIHZpZXcgSUQKKyAgICAgKiBzdXBwbGllZCB3aGVuIGFkZGluZyB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudElkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRhZyBuYW1lIG9mIHRoZSBmcmFnbWVudCwgaWYgc3BlY2lmaWVkLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gbVRhZzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBBY3Rpdml0eSB0aGlzIGZyYWdtZW50IGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgZmluYWwgcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2aXR5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgY3VycmVudGx5IGFkZGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0FkZGVkKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2aXR5ICE9IG51bGwgJiYgbUFjdGl2aXR5Lm1GcmFnbWVudHMubUFkZGVkLmNvbnRhaW5zKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuICBUaGlzIG1lYW5zCisgICAgICogaXQ6ICgxKSBoYXMgYmVlbiBhZGRlZCwgKDIpIGhhcyBpdHMgdmlldyBhdHRhY2hlZCB0byB0aGUgd2luZG93LCBhbmQgCisgICAgICogKDMpIGlzIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gaXNBZGRlZCgpICYmICFpc0hpZGRlbigpICYmIG1WaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBtVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwgJiYgbVZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGZyYWdtZW50IGhhcyBiZWVuIGhpZGRlbi4gIEJ5IGRlZmF1bHQgZnJhZ21lbnRzCisgICAgICogYXJlIHNob3duLiAgWW91IGNhbiBmaW5kIG91dCBhYm91dCBjaGFuZ2VzIHRvIHRoaXMgc3RhdGUgd2l0aAorICAgICAqIHtAbGluayAjb25IaWRkZW5DaGFuZ2VkfS4gIE5vdGUgdGhhdCB0aGUgaGlkZGVuIHN0YXRlIGlzIG9ydGhvZ29uYWwKKyAgICAgKiB0byBvdGhlciBzdGF0ZXMgLS0gdGhhdCBpcywgdG8gYmUgdmlzaWJsZSB0byB0aGUgdXNlciwgYSBmcmFnbWVudAorICAgICAqIG11c3QgYmUgYm90aCBzdGFydGVkIGFuZCBub3QgaGlkZGVuLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgeworICAgICAgICByZXR1cm4gbUhpZGRlbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGhpZGRlbiBzdGF0ZSAoYXMgcmV0dXJuZWQgYnkge0BsaW5rICNpc0hpZGRlbigpfSBvZgorICAgICAqIHRoZSBmcmFnbWVudCBoYXMgY2hhbmdlZC4gIEZyYWdtZW50cyBzdGFydCBvdXQgbm90IGhpZGRlbjsgdGhpcyB3aWxsCisgICAgICogYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBmcmFnbWVudCBjaGFuZ2VzIHN0YXRlIGZyb20gdGhhdC4KKyAgICAgKiBAcGFyYW0gaGlkZGVuIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIG5vdyBoaWRkZW4sIGZhbHNlIGlmIGl0IGlzIG5vdAorICAgICAqIHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IaWRkZW5DaGFuZ2VkKGJvb2xlYW4gaGlkZGVuKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciBhIGZyYWdtZW50IGluc3RhbmNlIGlzIHJldGFpbmVkIGFjcm9zcyBBY3Rpdml0eQorICAgICAqIHJlLWNyZWF0aW9uIChzdWNoIGFzIGZyb20gYSBjb25maWd1cmF0aW9uIGNoYW5nZSkuICBUaGlzIGNhbiBvbmx5CisgICAgICogYmUgdXNlZCB3aXRoIGZyYWdtZW50cyBub3QgaW4gdGhlIGJhY2sgc3RhY2suICBJZiBzZXQsIHRoZSBmcmFnbWVudAorICAgICAqIGxpZmVjeWNsZSB3aWxsIGJlIHNsaWdodGx5IGRpZmZlcmVudCB3aGVuIGFuIGFjdGl2aXR5IGlzIHJlY3JlYXRlZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiB7QGxpbmsgI29uRGVzdHJveSgpfSB3aWxsIG5vdCBiZSBjYWxsZWQgKGJ1dCB7QGxpbmsgI29uRGV0YWNoKCl9IHN0aWxsCisgICAgICogd2lsbCBiZSwgYmVjYXVzZSB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSBpdHMgY3VycmVudCBhY3Rpdml0eSkuCisgICAgICogPGxpPiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgbm90IGJlIGNhbGxlZCBzaW5jZSB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBub3QgYmVpbmcgcmUtY3JlYXRlZC4KKyAgICAgKiA8bGk+IHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBhbmQge0BsaW5rICNvblJlYWR5KEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0gb24gdGhlIGZyYWdtZW50J3MKKyAgICAgKiBjb250YWluaW5nIEFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGludGVudCkgeworICAgICAgICBtQWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudCh0aGlzLCBpbnRlbnQsIC0xKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbCB7QGxpbmsgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KEludGVudCBpbnRlbnQsIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBtQWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudCh0aGlzLCBpbnRlbnQsIHJlcXVlc3RDb2RlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVjZWl2ZSB0aGUgcmVzdWx0IGZyb20gYSBwcmV2aW91cyBjYWxsIHRvCisgICAgICoge0BsaW5rICNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KEludGVudCwgaW50KX0uICBUaGlzIGZvbGxvd3MgdGhlCisgICAgICogcmVsYXRlZCBBY3Rpdml0eSBBUEkgYXMgZGVzY3JpYmVkIHRoZXJlIGluCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uQWN0aXZpdHlSZXN1bHQoaW50LCBpbnQsIEludGVudCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBUaGUgaW50ZWdlciByZXF1ZXN0IGNvZGUgb3JpZ2luYWxseSBzdXBwbGllZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KCksIGFsbG93aW5nIHlvdSB0byBpZGVudGlmeSB3aG8gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICByZXN1bHQgY2FtZSBmcm9tLgorICAgICAqIEBwYXJhbSByZXN1bHRDb2RlIFRoZSBpbnRlZ2VyIHJlc3VsdCBjb2RlIHJldHVybmVkIGJ5IHRoZSBjaGlsZCBhY3Rpdml0eQorICAgICAqICAgICAgICAgICAgICAgICAgIHRocm91Z2ggaXRzIHNldFJlc3VsdCgpLgorICAgICAqIEBwYXJhbSBkYXRhIEFuIEludGVudCwgd2hpY2ggY2FuIHJldHVybiByZXN1bHQgZGF0YSB0byB0aGUgY2FsbGVyCisgICAgICogICAgICAgICAgICAgICAodmFyaW91cyBkYXRhIGNhbiBiZSBhdHRhY2hlZCB0byBJbnRlbnQgImV4dHJhcyIpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBmcmFnbWVudCBpcyBiZWluZyBjcmVhdGVkIGFzIHBhcnQgb2YgYSB2aWV3IGxheW91dAorICAgICAqIGluZmxhdGlvbiwgdHlwaWNhbGx5IGZyb20gc2V0dGluZyB0aGUgY29udGVudCB2aWV3IG9mIGFuIGFjdGl2aXR5LiAgVGhpcworICAgICAqIHdpbGwgYmUgY2FsbGVkIGJvdGggdGhlIGZpcnN0IHRpbWUgdGhlIGZyYWdtZW50IGlzIGNyZWF0ZWQsIGFzIHdlbGwKKyAgICAgKiBsYXRlciB3aGVuIGl0IGlzIGJlaW5nIHJlLWNyZWF0ZWQgZnJvbSBpdHMgc2F2ZWQgc3RhdGUgKHdoaWNoIGlzIGFsc28KKyAgICAgKiBnaXZlbiBoZXJlKS4KKyAgICAgKiAKKyAgICAgKiBYWFggVGhpcyBpcyBraW5kLW9mIHl1Y2t5Li4uICBtYXliZSB3ZSBjb3VsZCBqdXN0IHN1cHBseSB0aGUKKyAgICAgKiBBdHRyaWJ1dGVTZXQgdG8gb25DcmVhdGUoKT8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWN0aXZpdHkgVGhlIEFjdGl2aXR5IHRoYXQgaXMgaW5mbGF0aW5nIHRoZSBmcmFnbWVudC4KKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgYXQgdGhlIHRhZyB3aGVyZSB0aGUgZnJhZ21lbnQgaXMKKyAgICAgKiBiZWluZyBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhlIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNyZWF0ZWQgZnJvbQorICAgICAqIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uSW5mbGF0ZShBY3Rpdml0eSBhY3Rpdml0eSwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBmcmFnbWVudCBpcyBmaXJzdCBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICoge0BsaW5rICNvbkNyZWF0ZShCdW5kbGUpfSB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQW5pbWF0aW9uIG9uQ3JlYXRlQW5pbWF0aW9uKGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyLCBpbnQgbmV4dEFuaW0pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIGEgZnJhZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgorICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBhbmQgYmVmb3JlIHtAbGluayAjb25SZWFkeShCdW5kbGUpfS4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaGF2ZSB0aGUgZnJhZ21lbnQgaW5zdGFudGlhdGUgaXRzIHVzZXIgaW50ZXJmYWNlIHZpZXcuCisgICAgICogVGhpcyBpcyBvcHRpb25hbCwgYW5kIG5vbi1ncmFwaGljYWwgZnJhZ21lbnRzIGNhbiByZXR1cm4gbnVsbCAod2hpY2gKKyAgICAgKiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbikuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJldHdlZW4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IGFuZCB7QGxpbmsgI29uUmVhZHkoQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+SWYgeW91IHJldHVybiBhIFZpZXcgZnJvbSBoZXJlLCB5b3Ugd2lsbCBsYXRlciBiZSBjYWxsZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IHdoZW4gdGhlIHZpZXcgaXMgYmVpbmcgcmVsZWFzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGluZmxhdGVyIFRoZSBMYXlvdXRJbmZsYXRlciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmZsYXRlCisgICAgICogYW55IHZpZXdzIGluIHRoZSBmcmFnbWVudCwKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBwYXJlbnQgdmlldyB0aGF0IHRoZSBmcmFnbWVudCdzCisgICAgICogVUkgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLiAgVGhlIGZyYWdtZW50IHNob3VsZCBub3QgYWRkIHRoZSB2aWV3IGl0c2VsZiwKKyAgICAgKiBidXQgdGhpcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgTGF5b3V0UGFyYW1zIG9mIHRoZSB2aWV3LgorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgbm9uLW51bGwsIHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY29uc3RydWN0ZWQKKyAgICAgKiBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUgYXMgZ2l2ZW4gaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybiB0aGUgVmlldyBmb3IgdGhlIGZyYWdtZW50J3MgVUksIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgcmVhZHkgZm9yIHRoZSBmcmFnbWVudCB0byBydW4uICBUaGlzIGlzCisgICAgICogbW9zdCB1c2VmdWwgZm9yIGZyYWdtZW50cyB0aGF0IHVzZSB7QGxpbmsgI3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pfQorICAgICAqIGluc3RhbmNlLCBhcyB0aGlzIHRlbGxzIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzIGZ1bGx5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBuZXcgYWN0aXZpdHkgaW5zdGFuY2UuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uQ3JlYXRlVmlld30KKyAgICAgKiBhbmQgYmVmb3JlIHtAbGluayAjb25TdGFydCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlYWR5KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblN0YXJ0KCkgQWN0aXZpdHkub25TdGFydH0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIHZpc2libGUgdG8gdGhlIHVzZXIgYW5kIGFjdGl2ZWx5IHJ1bm5pbmcuCisgICAgICogVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblJlc3VtZSgpIEFjdGl2aXR5Lm9uUmVzdW1lfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIG5vIGxvbmdlciByZXN1bWVkLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblBhdXNlKCkgQWN0aXZpdHkub25QYXVzZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIG5vIGxvbmdlciBzdGFydGVkLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblN0b3AoKSBBY3Rpdml0eS5vblN0b3B9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlldyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZVZpZXd9IGhhcworICAgICAqIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZnJhZ21lbnQuICBUaGUgbmV4dCB0aW1lIHRoZSBmcmFnbWVudCBuZWVkcworICAgICAqIHRvIGJlIGRpc3BsYXllZCwgYSBuZXcgdmlldyB3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGlzIGNhbGxlZAorICAgICAqIGFmdGVyIHtAbGluayAjb25TdG9wKCl9IGFuZCBiZWZvcmUge0BsaW5rICNvbkRlc3Ryb3koKX07IGl0IGlzIG9ubHkKKyAgICAgKiBjYWxsZWQgaWYge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHJldHVybnMgYSBub24tbnVsbCBWaWV3LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIFRoaXMgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNvblN0b3AoKX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uRGV0YWNoKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIG5vIGxvbmdlciBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuICBUaGlzCisgICAgICogaXMgY2FsbGVkIGFmdGVyIHtAbGluayAjb25EZXN0cm95KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIEFjdGl2aXR5J3Mgc3RhbmRhcmQgb3B0aW9ucyBtZW51LiAgWW91CisgICAgICogc2hvdWxkIHBsYWNlIHlvdXIgbWVudSBpdGVtcyBpbiB0byA8dmFyPm1lbnU8L3Zhcj4uICBGb3IgdGhpcyBtZXRob2QKKyAgICAgKiB0byBiZSBjYWxsZWQsIHlvdSBtdXN0IGhhdmUgZmlyc3QgY2FsbGVkIHtAbGluayAjc2V0SGFzT3B0aW9uc01lbnV9LiAgU2VlCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSkgQWN0aXZpdHkub25DcmVhdGVPcHRpb25zTWVudX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGluIHdoaWNoIHlvdSBwbGFjZSB5b3VyIGl0ZW1zLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldEhhc09wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25QcmVwYXJlT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvbk9wdGlvbnNJdGVtU2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSB0aGUgU2NyZWVuJ3Mgc3RhbmRhcmQgb3B0aW9ucyBtZW51IHRvIGJlIGRpc3BsYXllZC4gIFRoaXMgaXMKKyAgICAgKiBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBtZW51IGlzIHNob3duLCBldmVyeSB0aW1lIGl0IGlzIHNob3duLiAgWW91IGNhbgorICAgICAqIHVzZSB0aGlzIG1ldGhvZCB0byBlZmZpY2llbnRseSBlbmFibGUvZGlzYWJsZSBpdGVtcyBvciBvdGhlcndpc2UKKyAgICAgKiBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNvbnRlbnRzLiAgU2VlCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUpIEFjdGl2aXR5Lm9uUHJlcGFyZU9wdGlvbnNNZW51fQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgYXMgbGFzdCBzaG93biBvciBmaXJzdCBpbml0aWFsaXplZCBieQorICAgICAqICAgICAgICAgICAgIG9uQ3JlYXRlT3B0aW9uc01lbnUoKS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRIYXNPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGl0ZW0gaW4geW91ciBvcHRpb25zIG1lbnUgaXMgc2VsZWN0ZWQuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgZmFsc2UgdG8gaGF2ZSB0aGUgbm9ybWFsCisgICAgICogcHJvY2Vzc2luZyBoYXBwZW4gKGNhbGxpbmcgdGhlIGl0ZW0ncyBSdW5uYWJsZSBvciBzZW5kaW5nIGEgbWVzc2FnZSB0bworICAgICAqIGl0cyBIYW5kbGVyIGFzIGFwcHJvcHJpYXRlKS4gIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIGZvciBhbnkgaXRlbXMKKyAgICAgKiBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gZG8gcHJvY2Vzc2luZyB3aXRob3V0IHRob3NlIG90aGVyCisgICAgICogZmFjaWxpdGllcy4KKyAgICAgKiAKKyAgICAgKiA8cD5EZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGNhbGwgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBmb3IgaXQgdG8KKyAgICAgKiBwZXJmb3JtIHRoZSBkZWZhdWx0IG1lbnUgaGFuZGxpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIG1lbnUgaXRlbSB0aGF0IHdhcyBzZWxlY3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBtZW51IHByb2Nlc3NpbmcgdG8KKyAgICAgKiAgICAgICAgIHByb2NlZWQsIHRydWUgdG8gY29uc3VtZSBpdCBoZXJlLgorICAgICAqIAorICAgICAqIEBzZWUgI29uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgb3B0aW9ucyBtZW51IGlzIGJlaW5nIGNsb3NlZCAoZWl0aGVyIGJ5IHRoZSB1c2VyIGNhbmNlbGluZworICAgICAqIHRoZSBtZW51IHdpdGggdGhlIGJhY2svbWVudSBidXR0b24sIG9yIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCkuCisgICAgICogIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgYXMgbGFzdCBzaG93biBvciBmaXJzdCBpbml0aWFsaXplZCBieQorICAgICAqICAgICAgICAgICAgIG9uQ3JlYXRlT3B0aW9uc01lbnUoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbk9wdGlvbnNNZW51Q2xvc2VkKE1lbnUgbWVudSkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHtAY29kZSB2aWV3fSBpcyBhYm91dCB0byBiZSBzaG93bi4KKyAgICAgKiBVbmxpa2Uge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fSwgdGhpcyB3aWxsIGJlIGNhbGxlZCBldmVyeQorICAgICAqIHRpbWUgdGhlIGNvbnRleHQgbWVudSBpcyBhYm91dCB0byBiZSBzaG93biBhbmQgc2hvdWxkIGJlIHBvcHVsYXRlZCBmb3IKKyAgICAgKiB0aGUgdmlldyAob3IgaXRlbSBpbnNpZGUgdGhlIHZpZXcgZm9yIHtAbGluayBBZGFwdGVyVmlld30gc3ViY2xhc3NlcywKKyAgICAgKiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUge0Bjb2RlIG1lbnVJbmZvfSkpLgorICAgICAqIDxwPgorICAgICAqIFVzZSB7QGxpbmsgI29uQ29udGV4dEl0ZW1TZWxlY3RlZChhbmRyb2lkLnZpZXcuTWVudUl0ZW0pfSB0byBrbm93IHdoZW4gYW4KKyAgICAgKiBpdGVtIGhhcyBiZWVuIHNlbGVjdGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHVwIHRvCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlQ29udGV4dE1lbnUgQWN0aXZpdHkub25DcmVhdGVDb250ZXh0TWVudX0sIHRob3VnaAorICAgICAqIHlvdSBjYW4gbm90IGNhbGwgdGhpcyBpbXBsZW1lbnRhdGlvbiBpZiB5b3UgZG9uJ3Qgd2FudCB0aGF0IGJlaGF2aW9yLgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG5vdCBzYWZlIHRvIGhvbGQgb250byB0aGUgY29udGV4dCBtZW51IGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKKyAgICAgICAgZ2V0QWN0aXZpdHkoKS5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjb250ZXh0IG1lbnUgdG8gYmUgc2hvd24gZm9yIHRoZSBnaXZlbiB2aWV3IChtdWx0aXBsZSB2aWV3cworICAgICAqIGNhbiBzaG93IHRoZSBjb250ZXh0IG1lbnUpLiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUKKyAgICAgKiB7QGxpbmsgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyfSBvbiB0aGUgdmlldyB0byB0aGlzIGZyYWdtZW50LCBzbworICAgICAqIHtAbGluayAjb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSwgVmlldywgQ29udGV4dE1lbnVJbmZvKX0gd2lsbCBiZQorICAgICAqIGNhbGxlZCB3aGVuIGl0IGlzIHRpbWUgdG8gc2hvdyB0aGUgY29udGV4dCBtZW51LgorICAgICAqIAorICAgICAqIEBzZWUgI3VucmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3KQorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgc2hvdWxkIHNob3cgYSBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByZXZlbnRzIGEgY29udGV4dCBtZW51IHRvIGJlIHNob3duIGZvciB0aGUgZ2l2ZW4gdmlldy4gVGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHJlbW92ZSB0aGUge0BsaW5rIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcn0gb24gdGhlIHZpZXcuCisgICAgICogCisgICAgICogQHNlZSAjcmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3KQorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgc2hvdWxkIHN0b3Agc2hvd2luZyBhIGNvbnRleHQgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGl0ZW0gaW4gYSBjb250ZXh0IG1lbnUgaXMgc2VsZWN0ZWQuIFRoZQorICAgICAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgZmFsc2UgdG8gaGF2ZSB0aGUgbm9ybWFsIHByb2Nlc3NpbmcKKyAgICAgKiBoYXBwZW4gKGNhbGxpbmcgdGhlIGl0ZW0ncyBSdW5uYWJsZSBvciBzZW5kaW5nIGEgbWVzc2FnZSB0byBpdHMgSGFuZGxlcgorICAgICAqIGFzIGFwcHJvcHJpYXRlKS4gWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgZm9yIGFueSBpdGVtcyBmb3Igd2hpY2ggeW91CisgICAgICogd291bGQgbGlrZSB0byBkbyBwcm9jZXNzaW5nIHdpdGhvdXQgdGhvc2Ugb3RoZXIgZmFjaWxpdGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Uge0BsaW5rIE1lbnVJdGVtI2dldE1lbnVJbmZvKCl9IHRvIGdldCBleHRyYSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhlCisgICAgICogVmlldyB0aGF0IGFkZGVkIHRoaXMgbWVudSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgY2FsbCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBpdCB0byBwZXJmb3JtCisgICAgICogdGhlIGRlZmF1bHQgbWVudSBoYW5kbGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgY29udGV4dCBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogQHJldHVybiBib29sZWFuIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgY29udGV4dCBtZW51IHByb2Nlc3NpbmcgdG8KKyAgICAgKiAgICAgICAgIHByb2NlZWQsIHRydWUgdG8gY29uc3VtZSBpdCBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhYjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIEZyYWdtZW50U3RhdGVbXSBtQWN0aXZlOworICAgIGludFtdIG1BZGRlZDsKKyAgICBCYWNrU3RhY2tTdGF0ZVtdIG1CYWNrU3RhY2s7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlKCkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1BY3RpdmUgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEZyYWdtZW50U3RhdGUuQ1JFQVRPUik7CisgICAgICAgIG1BZGRlZCA9IGluLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIG1CYWNrU3RhY2sgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEJhY2tTdGFja1N0YXRlLkNSRUFUT1IpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQWN0aXZlLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtQWRkZWQpOworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQmFja1N0YWNrLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50TWFuYWdlclN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQGhpZGUKKyAqIENvbnRhaW5lciBmb3IgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBhY3Rpdml0eS4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50TWFuYWdlciB7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZyYWdtZW50TWFuYWdlciI7CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWN0aXZlOworICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFkZGVkOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxJbmRpY2VzOworICAgIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gbUJhY2tTdGFjazsKKyAgICAKKyAgICBpbnQgbUN1clN0YXRlID0gRnJhZ21lbnQuSU5JVElBTElaSU5HOworICAgIEFjdGl2aXR5IG1BY3Rpdml0eTsKKyAgICAKKyAgICBib29sZWFuIG1OZWVkTWVudUludmFsaWRhdGU7CisgICAgCisgICAgLy8gVGVtcG9yYXJ5IHZhcnMgZm9yIHN0YXRlIHNhdmUgYW5kIHJlc3RvcmUuCisgICAgQnVuZGxlIG1TdGF0ZUJ1bmRsZSA9IG51bGw7CisgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gbVN0YXRlQXJyYXkgPSBudWxsOworICAgIAorICAgIEFuaW1hdGlvbiBsb2FkQW5pbWF0aW9uKEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwKKyAgICAgICAgICAgIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgQW5pbWF0aW9uIGFuaW1PYmogPSBmcmFnbWVudC5vbkNyZWF0ZUFuaW1hdGlvbih0cmFuc2l0aW9uU3R5bGUsIGVudGVyLAorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgIGlmIChhbmltT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltT2JqOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZnJhZ21lbnQubU5leHRBbmltICE9IDApIHsKKyAgICAgICAgICAgIEFuaW1hdGlvbiBhbmltID0gQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihtQWN0aXZpdHksIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0cmFuc2l0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgc3R5bGVJbmRleCA9IHRyYW5zaXRUb1N0eWxlSW5kZXgodHJhbnNpdCwgZW50ZXIpOworICAgICAgICBpZiAoc3R5bGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDAgJiYgbUFjdGl2aXR5LmdldFdpbmRvdygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSA9IG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2luZG93QW5pbWF0aW9uczsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGF0dHJzID0gbUFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXModHJhbnNpdGlvblN0eWxlLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbik7CisgICAgICAgIGludCBhbmltID0gYXR0cnMuZ2V0UmVzb3VyY2VJZChzdHlsZUluZGV4LCAwKTsKKyAgICAgICAgYXR0cnMucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKGFuaW0gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKG1BY3Rpdml0eSwgYW5pbSk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoRnJhZ21lbnQgZiwgaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICAvLyBGcmFnbWVudHMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhZGRlZCB3aWxsIHNpdCBpbiB0aGUgb25DcmVhdGUoKSBzdGF0ZS4KKyAgICAgICAgaWYgKCFmLm1BZGRlZCAmJiBuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgIG5ld1N0YXRlID0gRnJhZ21lbnQuQ1JFQVRFRDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGYubVN0YXRlIDwgbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZi5tU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LklOSVRJQUxJWklORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGYub25BdHRhY2gobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQXR0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkNyZWF0ZShmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25DcmVhdGUoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubVJldGFpbmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tRnJvbUxheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGZyYWdtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBjb250ZW50IHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxheW91dCwgd2UgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGUgdmlldyBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBpbmZsYXRlciB3aWxsIHRha2UgY2FyZSBvZiBhZGRpbmcgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3ID0gZi5vbkNyZWF0ZVZpZXcobUFjdGl2aXR5LmdldExheW91dEluZmxhdGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVzdG9yZVZpZXdTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1IaWRkZW4pIGYubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gQ09OVEVOVDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1Gcm9tTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwIGNvbnRhaW5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUNvbnRhaW5lcklkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gKFZpZXdHcm91cCltQWN0aXZpdHkuZmluZFZpZXdCeUlkKGYubUNvbnRhaW5lcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZXcgdmlldyBmb3VuZCBmb3IgaWQgMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhmLm1Db250YWluZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBmcmFnbWVudCAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYW5pbSA9IGxvYWRBbmltYXRpb24oZiwgdHJhbnNpdCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uUmVhZHkoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQ09OVEVOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVzdW1lKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGYubVN0YXRlID4gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZi5tU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlJFU1VNRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlJFU1VNRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gUkVTVU1FRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUGF1c2UoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIFNUQVJURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RvcCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNPTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkNPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ09OVEVOVDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXN0cm95VmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95ZWRWaWV3KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBzYXZlIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgaWYgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjdGl2aXR5LmlzRmluaXNoaW5nKCkgJiYgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJTdGF0ZSA+IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBsb2FkQW5pbWF0aW9uKGYsIHRyYW5zaXQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lci5yZW1vdmVWaWV3KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBDUkVBVEVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkRlc3Ryb3koKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGV0YWNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkRldGFjaCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZi5tU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBtb3ZlVG9TdGF0ZShpbnQgbmV3U3RhdGUsIGJvb2xlYW4gYWx3YXlzKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKG5ld1N0YXRlLCAwLCAwLCBhbHdheXMpOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKGludCBuZXdTdGF0ZSwgaW50IHRyYW5zaXQsIGludCB0cmFuc2l0U3R5bGUsIGJvb2xlYW4gYWx3YXlzKSB7CisgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCAmJiBuZXdTdGF0ZSAhPSBGcmFnbWVudC5JTklUSUFMSVpJTkcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjdGl2aXR5Iik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghYWx3YXlzICYmIG1DdXJTdGF0ZSA9PSBuZXdTdGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtQ3VyU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BY3RpdmUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZShmLCBuZXdTdGF0ZSwgdHJhbnNpdCwgdHJhbnNpdFN0eWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlQWN0aXZlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCB8fCBtQXZhaWxJbmRpY2VzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmLnNldEluZGV4KG1BY3RpdmUuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1BY3RpdmUuYWRkKGYpOworICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmLnNldEluZGV4KG1BdmFpbEluZGljZXMucmVtb3ZlKG1BdmFpbEluZGljZXMuc2l6ZSgpLTEpKTsKKyAgICAgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIG1ha2VJbmFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUFjdGl2ZS5zZXQoZi5tSW5kZXgsIG51bGwpOworICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQXZhaWxJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICB9CisgICAgICAgIG1BdmFpbEluZGljZXMuYWRkKGYubUluZGV4KTsKKyAgICAgICAgZi5jbGVhckluZGV4KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBib29sZWFuIG1vdmVUb1N0YXRlTm93KSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiYWRkOiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAobUFkZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUFkZGVkLmFkZChmcmFnbWVudCk7CisgICAgICAgIG1ha2VBY3RpdmUoZnJhZ21lbnQpOworICAgICAgICBmcmFnbWVudC5tQWRkZWQgPSB0cnVlOworICAgICAgICBpZiAoZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtb3ZlVG9TdGF0ZU5vdykgeworICAgICAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIG1DdXJTdGF0ZSwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVtb3ZlOiAiICsgZnJhZ21lbnQpOworICAgICAgICBtQWRkZWQucmVtb3ZlKGZyYWdtZW50KTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpbmFjdGl2ZSA9IGZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nIDw9IDA7CisgICAgICAgIGlmIChpbmFjdGl2ZSkgeworICAgICAgICAgICAgbWFrZUluYWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCwgaW5hY3RpdmUgPyBGcmFnbWVudC5JTklUSUFMSVpJTkcgOiBGcmFnbWVudC5DUkVBVEVELAorICAgICAgICAgICAgICAgIHRyYW5zaXRpb24sIHRyYW5zaXRpb25TdHlsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGhpZGVGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJoaWRlOiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoIWZyYWdtZW50Lm1IaWRkZW4pIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1IaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRpb24gYW5pbSA9IGxvYWRBbmltYXRpb24oZnJhZ21lbnQsIHRyYW5zaXRpb24sIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1BZGRlZCAmJiBmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQub25IaWRkZW5DaGFuZ2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNob3dGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzaG93OiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoZnJhZ21lbnQubUhpZGRlbikgeworICAgICAgICAgICAgZnJhZ21lbnQubUhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRpb24gYW5pbSA9IGxvYWRBbmltYXRpb24oZnJhZ21lbnQsIHRyYW5zaXRpb24sIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUFkZGVkICYmIGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5vbkhpZGRlbkNoYW5nZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRocm91Z2ggYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRkZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tRnJhZ21lbnRJZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3cgZm9yIGFueSBrbm93biBmcmFnbWVudC4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tRnJhZ21lbnRJZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwgJiYgdGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdGhyb3VnaCBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BZGRlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB0YWcuZXF1YWxzKGYubVRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm93IGZvciBhbnkga25vd24gZnJhZ21lbnQuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHRhZy5lcXVhbHMoZi5tVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVdobyhTdHJpbmcgd2hvKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwgJiYgd2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgd2hvLmVxdWFscyhmLm1XaG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkQmFja1N0YWNrU3RhdGUoQmFja1N0YWNrRW50cnkgc3RhdGUpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJhY2tTdGFjay5hZGQoc3RhdGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2tTdGF0ZShIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbGFzdCA9IG1CYWNrU3RhY2suc2l6ZSgpLTE7CisgICAgICAgICAgICBpZiAobGFzdCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLnJlbW92ZShsYXN0KTsKKyAgICAgICAgICAgIGhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBic3MucG9wRnJvbUJhY2tTdGFjaygpOworICAgICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZShtQ3VyU3RhdGUsIHJldmVyc2VUcmFuc2l0KGJzcy5nZXRUcmFuc2l0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcy5nZXRUcmFuc2l0aW9uU3R5bGUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgd2hpbGUgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGJzcy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPT0gbUJhY2tTdGFjay5zaXplKCktMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gc3RhdGVzCisgICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUJhY2tTdGFjay5zaXplKCktMTsgaT5pbmRleDsgaS0tKSB7CisgICAgICAgICAgICAgICAgc3RhdGVzLmFkZChtQmFja1N0YWNrLnJlbW92ZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHN0YXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLmdldChpKS5wb3BGcm9tQmFja1N0YWNrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUobUN1clN0YXRlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZXRhaW5Ob25Db25maWcoKSB7CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzID0gbnVsbDsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BY3RpdmUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1SZXRhaW5JbnN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZChmKTsKKyAgICAgICAgICAgICAgICAgICAgZi5tUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZyYWdtZW50czsKKyAgICB9CisgICAgCisgICAgdm9pZCBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZUFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TdGF0ZUFycmF5ID0gbmV3IFNwYXJzZUFycmF5PFBhcmNlbGFibGU+KCk7CisgICAgICAgIH0KKyAgICAgICAgZi5tVmlldy5zYXZlSGllcmFyY2h5U3RhdGUobVN0YXRlQXJyYXkpOworICAgICAgICBpZiAobVN0YXRlQXJyYXkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZi5tU2F2ZWRWaWV3U3RhdGUgPSBtU3RhdGVBcnJheTsKKyAgICAgICAgICAgIG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBQYXJjZWxhYmxlIHNhdmVBbGxTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCB8fCBtQWN0aXZlLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRmlyc3QgY29sbGVjdCBhbGwgYWN0aXZlIGZyYWdtZW50cy4KKyAgICAgICAgaW50IE4gPSBtQWN0aXZlLnNpemUoKTsKKyAgICAgICAgRnJhZ21lbnRTdGF0ZVtdIGFjdGl2ZSA9IG5ldyBGcmFnbWVudFN0YXRlW05dOworICAgICAgICBib29sZWFuIGhhdmVGcmFnbWVudHMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhdmVGcmFnbWVudHMgPSB0cnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBuZXcgRnJhZ21lbnRTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVbaV0gPSBmczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLm9uU2F2ZUluc3RhbmNlU3RhdGUobVN0YXRlQnVuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0ZUJ1bmRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TdGF0ZUJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudFN0YXRlLlZJRVdfU1RBVEVfVEFHLCBmLm1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaGF2ZUZyYWdtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludFtdIGFkZGVkID0gbnVsbDsKKyAgICAgICAgQmFja1N0YWNrU3RhdGVbXSBiYWNrU3RhY2sgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBOID0gbUFkZGVkLnNpemUoKTsKKyAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkZWRbaV0gPSBtQWRkZWQuZ2V0KGkpLm1JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTm93IHNhdmUgYmFjayBzdGFjay4KKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1CYWNrU3RhY2suc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgYmFja1N0YWNrID0gbmV3IEJhY2tTdGFja1N0YXRlW05dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja1N0YWNrW2ldID0gbmV3IEJhY2tTdGFja1N0YXRlKHRoaXMsIG1CYWNrU3RhY2suZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZSgpOworICAgICAgICBmbXMubUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgZm1zLm1BZGRlZCA9IGFkZGVkOworICAgICAgICBmbXMubUJhY2tTdGFjayA9IGJhY2tTdGFjazsKKyAgICAgICAgcmV0dXJuIGZtczsKKyAgICB9CisgICAgCisgICAgdm9pZCByZXN0b3JlQWxsU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSwgQXJyYXlMaXN0PEZyYWdtZW50PiBub25Db25maWcpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2F2ZWQgc3RhdGUgYXQgYWxsLCB0aGVuIHRoZXJlIGNhbiBub3QgYmUKKyAgICAgICAgLy8gYW55IG5vbkNvbmZpZyBmcmFnbWVudHMgZWl0aGVyLCBzbyB0aGF0IGlzIHRoYXQuCisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IChGcmFnbWVudE1hbmFnZXJTdGF0ZSlzdGF0ZTsKKyAgICAgICAgaWYgKGZtcy5tQWN0aXZlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIC8vIEZpcnN0IHJlLWF0dGFjaCBhbnkgbm9uLWNvbmZpZyBpbnN0YW5jZXMgd2UgYXJlIHJldGFpbmluZyBiYWNrCisgICAgICAgIC8vIHRvIHRoZWlyIHNhdmVkIHN0YXRlLCBzbyB3ZSBkb24ndCB0cnkgdG8gaW5zdGFudGlhdGUgdGhlbSBhZ2Fpbi4KKyAgICAgICAgaWYgKG5vbkNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bm9uQ29uZmlnLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG5vbkNvbmZpZy5nZXQoaSk7CisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2YubUluZGV4XTsKKyAgICAgICAgICAgICAgICBmcy5tSW5zdGFuY2UgPSBmOworICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nID0gMDsKKyAgICAgICAgICAgICAgICBmLm1BZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRWaWV3U3RhdGUgPSBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudFN0YXRlLlZJRVdfU1RBVEVfVEFHKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIHRoZSBmdWxsIGxpc3Qgb2YgYWN0aXZlIGZyYWdtZW50cywgaW5zdGFudGlhdGluZyB0aGVtIGZyb20KKyAgICAgICAgLy8gdGhlaXIgc2F2ZWQgc3RhdGUuCisgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PihmbXMubUFjdGl2ZS5sZW5ndGgpOworICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQXZhaWxJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQWN0aXZlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudFN0YXRlIGZzID0gZm1zLm1BY3RpdmVbaV07CisgICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUuYWRkKGZzLmluc3RhbnRpYXRlKG1BY3Rpdml0eSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMuYWRkKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBpZiAoZm1zLm1BZGRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PihmbXMubUFkZGVkLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm1zLm1BZGRlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChmbXMubUFkZGVkW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGluc3RhbnRpYXRlZCBmcmFnbWVudCBmb3IgaW5kZXggIyIgKyBmbXMubUFkZGVkW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbUFjdGl2aXR5OworICAgICAgICAgICAgICAgIG1BZGRlZC5hZGQoZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWRkZWQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgYmFjayBzdGFjay4KKyAgICAgICAgaWYgKGZtcy5tQmFja1N0YWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PihmbXMubUJhY2tTdGFjay5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQmFja1N0YWNrLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gZm1zLm1CYWNrU3RhY2tbaV0uaW5zdGFudGlhdGUodGhpcyk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFjay5hZGQoYnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGF0dGFjaEFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtQWN0aXZpdHkgIT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBtQWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hDcmVhdGUoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkNSRUFURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTdGFydCgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFJlc3VtZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuUkVTVU1FRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFBhdXNlKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5TVEFSVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RvcCgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuQ09OVEVOVCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERlc3Ryb3koKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LklOSVRJQUxJWklORywgZmFsc2UpOworICAgICAgICBtQWN0aXZpdHkgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaENyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25DcmVhdGVPcHRpb25zTWVudShtZW51LCBpbmZsYXRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93ID0gZmFsc2U7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBzaG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZi5vblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNob3c7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDb250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5vbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hPcHRpb25zTWVudUNsb3NlZChNZW51IG1lbnUpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIGYub25PcHRpb25zTWVudUNsb3NlZChtZW51KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmV2ZXJzZVRyYW5zaXQoaW50IHRyYW5zaXQpIHsKKyAgICAgICAgaW50IHJldiA9IDA7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdCkgeworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRU5URVI6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0VYSVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9FWElUOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9FTlRFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1NIT1c6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0hJREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9ISURFOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9TSE9XOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfQUNUSVZJVFlfQ0xPU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9BQ1RJVklUWV9DTE9TRToKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfT1BFTjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19DTE9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfT1BFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfVE9fRlJPTlQ6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfVE9fQkFDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfVE9fQkFDSzoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19UT19GUk9OVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9PUEVOOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9PUEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRToKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHRyYW5zaXRUb1N0eWxlSW5kZXgoaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIpIHsKKyAgICAgICAgaW50IGFuaW1BdHRyID0gLTE7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdCkgeworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRU5URVI6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2luZG93RW50ZXJBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9FWElUOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dpbmRvd0V4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9TSE9XOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dpbmRvd1Nob3dBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9ISURFOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dpbmRvd0hpZGVBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9BQ1RJVklUWV9PUEVOOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5T3BlbkVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eU9wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfQUNUSVZJVFlfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fYWN0aXZpdHlDbG9zZUVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eUNsb3NlRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrT3BlbkVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrT3BlbkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX0NMT1NFOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tDbG9zZUVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrQ2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19UT19GUk9OVDoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrVG9Gcm9udEVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrVG9Gcm9udEV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX1RPX0JBQ0s6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza1RvQmFja0VudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrVG9CYWNrRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9PUEVOOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlck9wZW5FbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVyT3BlbkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVyQ2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU46CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVySW50cmFPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlckludHJhT3BlbkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVySW50cmFDbG9zZUVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJJbnRyYUNsb3NlRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbUF0dHI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwZjI3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKKy8qKgorICogQVBJIGZvciBwZXJmb3JtaW5nIGEgc2V0IG9mIEZyYWdtZW50IG9wZXJhdGlvbnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRUcmFuc2FjdGlvbiB7CisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCBhIDAgY29udGFpbmVyVmlld0lkLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCBhIG51bGwgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgZnJhZ21lbnQgdG8gdGhlIGFjdGl2aXR5IHN0YXRlLiAgVGhpcyBmcmFnbWVudCBtYXkgb3B0aW9uYWxseQorICAgICAqIGFsc28gaGF2ZSBpdHMgdmlldyAoaWYge0BsaW5rIEZyYWdtZW50I29uQ3JlYXRlVmlldyBGcmFnbWVudC5vbkNyZWF0ZVZpZXd9CisgICAgICogcmV0dXJucyBub24tbnVsbCkgaW50byBhIGNvbnRhaW5lciB2aWV3IG9mIHRoZSBhY3Rpdml0eS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyVmlld0lkIE9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lciB0aGlzIGZyYWdtZW50IGlzCisgICAgICogdG8gYmUgcGxhY2VkIGluLiAgSWYgMCwgaXQgd2lsbCBub3QgYmUgcGxhY2VkIGluIGEgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgYWRkZWQuICBUaGlzIGZyYWdtZW50IG11c3Qgbm90IGFscmVhZHkKKyAgICAgKiBiZSBhZGRlZCB0byB0aGUgYWN0aXZpdHkuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI3JlcGxhY2UoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCBhIG51bGwgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIFJlcGxhY2UgYW4gZXhpc3RpbmcgZnJhZ21lbnQgdGhhdCB3YXMgYWRkZWQgdG8gYSBjb250YWluZXIuICBUaGlzIGlzCisgICAgICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgY2FsbGluZyB7QGxpbmsgI3JlbW92ZShGcmFnbWVudCl9IGZvciBhbGwKKyAgICAgKiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzIHRoYXQgd2VyZSBhZGRlZCB3aXRoIHRoZSBzYW1lIGNvbnRhaW5lclZpZXdJZAorICAgICAqIGFuZCB0aGVuIHtAbGluayAjYWRkKGludCwgRnJhZ21lbnQsIFN0cmluZyl9IHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCisgICAgICogZ2l2ZW4gaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyVmlld0lkIElkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lciB3aG9zZSBmcmFnbWVudChzKSBhcmUKKyAgICAgKiB0byBiZSByZXBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIG5ldyBmcmFnbWVudCB0byBwbGFjZSBpbiB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSB0YWcgT3B0aW9uYWwgdGFnIG5hbWUgZm9yIHRoZSBmcmFnbWVudCwgdG8gbGF0ZXIgcmV0cmlldmUgdGhlCisgICAgICogZnJhZ21lbnQgd2l0aCB7QGxpbmsgQWN0aXZpdHkjZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKQorICAgICAqIEFjdGl2aXR5LmZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBmcmFnbWVudC4gIElmIGl0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lciwgaXRzIHZpZXcKKyAgICAgKiBpcyBhbHNvIHJlbW92ZWQgZnJvbSB0aGF0IGNvbnRhaW5lci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIHJlbW92ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVtb3ZlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhbiBleGlzdGluZyBmcmFnbWVudC4gIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgZnJhZ21lbnRzIHdob3NlCisgICAgICogdmlld3MgaGF2ZSBiZWVuIGFkZGVkIHRvIGEgY29udGFpbmVyLCBhcyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZpZXcgdG8KKyAgICAgKiBiZSBoaWRkZW4uCisgICAgICogCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBoaWRkZW4uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gaGlkZShGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogSGlkZXMgYSBwcmV2aW91c2x5IGhpZGRlbiBmcmFnbWVudC4gIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgZnJhZ21lbnRzIHdob3NlCisgICAgICogdmlld3MgaGF2ZSBiZWVuIGFkZGVkIHRvIGEgY29udGFpbmVyLCBhcyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZpZXcgdG8KKyAgICAgKiBiZSBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNob3coRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIHRoYXQgaXMgc2V0IGZvciBhbGwgZW50ZXIgdHJhbnNpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VOVEVSX01BU0sgPSAweDEwMDA7CisgICAgCisgICAgLyoqCisgICAgICogQml0IG1hc2sgdGhhdCBpcyBzZXQgZm9yIGFsbCBleGl0IHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FWElUX01BU0sgPSAweDIwMDA7CisgICAgCisgICAgLyoqIE5vdCBzZXQgdXAgZm9yIGEgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfVU5TRVQgPSAtMTsKKyAgICAvKiogTm8gYW5pbWF0aW9uIGZvciB0cmFuc2l0aW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9OT05FID0gMDsKKyAgICAvKiogV2luZG93IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzY3JlZW4uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VOVEVSID0gMSB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogV2luZG93IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2NyZWVuLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FWElUID0gMiB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBXaW5kb3cgaGFzIGJlZW4gbWFkZSB2aXNpYmxlLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9TSE9XID0gMyB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogV2luZG93IGhhcyBiZWVuIG1hZGUgaW52aXNpYmxlLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9ISURFID0gNCB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBUaGUgImFwcGxpY2F0aW9uIHN0YXJ0aW5nIiBwcmV2aWV3IHdpbmRvdyBpcyBubyBsb25nZXIgbmVlZGVkLCBhbmQgd2lsbAorICAgICAqIGFuaW1hdGUgYXdheSB0byBzaG93IHRoZSByZWFsIHdpbmRvdy4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfUFJFVklFV19ET05FID0gNTsKKyAgICAvKiogQSB3aW5kb3cgaW4gYSBuZXcgYWN0aXZpdHkgaXMgYmVpbmcgb3BlbmVkIG9uIHRvcCBvZiBhbiBleGlzdGluZyBvbmUKKyAgICAgKiBpbiB0aGUgc2FtZSB0YXNrLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9BQ1RJVklUWV9PUEVOID0gNiB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogVGhlIHdpbmRvdyBpbiB0aGUgdG9wLW1vc3QgYWN0aXZpdHkgaXMgYmVpbmcgY2xvc2VkIHRvIHJldmVhbCB0aGUKKyAgICAgKiBwcmV2aW91cyBhY3Rpdml0eSBpbiB0aGUgc2FtZSB0YXNrLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSA9IDcgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gYSBuZXcgdGFzayBpcyBiZWluZyBvcGVuZWQgb24gdG9wIG9mIGFuIGV4aXN0aW5nIG9uZQorICAgICAqIGluIGFub3RoZXIgYWN0aXZpdHkncyB0YXNrLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9UQVNLX09QRU4gPSA4IHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiB0aGUgdG9wLW1vc3QgYWN0aXZpdHkgaXMgYmVpbmcgY2xvc2VkIHRvIHJldmVhbCB0aGUKKyAgICAgKiBwcmV2aW91cyBhY3Rpdml0eSBpbiBhIGRpZmZlcmVudCB0YXNrLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9UQVNLX0NMT1NFID0gOSB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiBhbiBleGlzdGluZyB0YXNrIGlzIGJlaW5nIGRpc3BsYXllZCBvbiB0b3Agb2YgYW4gZXhpc3Rpbmcgb25lCisgICAgICogaW4gYW5vdGhlciBhY3Rpdml0eSdzIHRhc2suICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1RBU0tfVE9fRlJPTlQgPSAxMCB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gYW4gZXhpc3RpbmcgdGFzayBpcyBiZWluZyBwdXQgYmVsb3cgYWxsIG90aGVyIHRhc2tzLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9UQVNLX1RPX0JBQ0sgPSAxMSB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiBhIG5ldyBhY3Rpdml0eSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHdhbGxwYXBlciBpcyBiZWluZworICAgICAqIG9wZW5lZCBvbiB0b3Agb2Ygb25lIHRoYXQgZG9lcywgZWZmZWN0aXZlbHkgY2xvc2luZyB0aGUgd2FsbHBhcGVyLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0UgPSAxMiB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBBIHdpbmRvdyBpbiBhIG5ldyBhY3Rpdml0eSB0aGF0IGRvZXMgaGF2ZSBhIHdhbGxwYXBlciBpcyBiZWluZworICAgICAqIG9wZW5lZCBvbiBvbmUgdGhhdCBkaWRuJ3QsIGVmZmVjdGl2ZWx5IG9wZW5pbmcgdGhlIHdhbGxwYXBlci4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfV0FMTFBBUEVSX09QRU4gPSAxMyB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gYSBuZXcgYWN0aXZpdHkgaXMgYmVpbmcgb3BlbmVkIG9uIHRvcCBvZiBhbiBleGlzdGluZyBvbmUsCisgICAgICogYW5kIGJvdGggYXJlIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTiA9IDE0IHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBUaGUgd2luZG93IGluIHRoZSB0b3AtbW9zdCBhY3Rpdml0eSBpcyBiZWluZyBjbG9zZWQgdG8gcmV2ZWFsIHRoZQorICAgICAqIHByZXZpb3VzIGFjdGl2aXR5LCBhbmQgYm90aCBhcmUgb24gdG9wIG9mIGhlIHdhbGxwYXBlci4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFID0gMTUgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRDdXN0b21BbmltYXRpb25zKGludCBlbnRlciwgaW50IGV4aXQpOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXQpOworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb25TdHlsZShpbnQgc3R5bGVSZXMpOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZFRvQmFja1N0YWNrKFN0cmluZyBuYW1lKTsKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQppbmRleCBiOGMzYWEzLi40ZDVmMzZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCkBAIC05OTcsOCArOTk3LDEwIEBACiAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCA9IG51bGw7Ci0gICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsCi0gICAgICAgICAgICAgICAgcGFyZW50LCBpZCwgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbmV3IENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwKKyAgICAgICAgICAgICAgICBpbmZvLCB0aXRsZSwgcGFyZW50LCBpZCwKKyAgICAgICAgICAgICAgICAoQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcylsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCkpOwogICAgICAgICByZXR1cm4gYWN0aXZpdHk7CiAgICAgfQogCkBAIC0xMDU4LDIxICsxMDYwLDIzIEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIGNhbGxBY3Rpdml0eU9uRGVzdHJveShBY3Rpdml0eSBhY3Rpdml0eSkgewotICAgICAgaWYgKG1XYWl0aW5nQWN0aXZpdGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewotICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmZpbHRlckVxdWFscyhhY3Rpdml0eS5nZXRJbnRlbnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KKyAgICAgIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgYmxvY2sgY2F1c2VzIGludGVybWl0dGVudCBoYW5ncyB3aGVuIHVzaW5nIHN0YXJ0QWN0aXZpdHkKKyAgICAgIC8vIHRlbXBvcmFyaWx5IGNvbW1lbnQgb3V0IHVudGlsIHJvb3QgY2F1c2UgaXMgZml4ZWQgKGJ1ZyAyNjMwNjgzKQorLy8gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKKy8vICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKy8vICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7CisvLyAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworLy8gICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVdhaXRlciBhdyA9IG1XYWl0aW5nQWN0aXZpdGllcy5nZXQoaSk7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7CisvLyAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgYXcuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKKy8vICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgIH0KKy8vICAgICAgfQogICAgICAgCi0gICAgICBhY3Rpdml0eS5vbkRlc3Ryb3koKTsKKyAgICAgIGFjdGl2aXR5LnBlcmZvcm1EZXN0cm95KCk7CiAgICAgICAKICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CiAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtMTMzMSw3ICsxMzM1LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgogICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKICAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm0gdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBhY3Rpdml0eSBpcyBwZXJmb3JtaW5nIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAogICAgICAqICAgICAgICAgICAgICAgYW55IHJlc3VsdCk7IG1heSBiZSBudWxsIGlmIHRoaXMgY2FsbCBpcyBub3QgYmVpbmcgbWFkZQogICAgICAqICAgICAgICAgICAgICAgZnJvbSBhbiBhY3Rpdml0eS4KICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgpAQCAtMTM4MSw2ICsxMzg1LDY0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNleGVjU3RhcnRBY3Rpdml0eShDb250ZXh0LCBJQmluZGVyLCBJQmluZGVyLCBBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwKKyAgICAgKiBidXQgZm9yIGNhbGxzIGZyb20gYSB7I2xpbmsgRnJhZ21lbnR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aG8gVGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dFRocmVhZCBUaGUgbWFpbiB0aHJlYWQgb2YgdGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKKyAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGZyYWdtZW50IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBJZGVudGlmaWVyIGZvciB0aGlzIHJlcXVlc3QncyByZXN1bHQ7IGxlc3MgdGhhbiB6ZXJvIAorICAgICAqICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY2FsbGVyIGlzIG5vdCBleHBlY3RpbmcgYSByZXN1bHQuCisgICAgICogCisgICAgICogQHJldHVybiBUbyBmb3JjZSB0aGUgcmV0dXJuIG9mIGEgcGFydGljdWxhciByZXN1bHQsIHJldHVybiBhbiAKKyAgICAgKiAgICAgICAgIEFjdGl2aXR5UmVzdWx0IG9iamVjdCBjb250YWluaW5nIHRoZSBkZXNpcmVkIGRhdGE7IG90aGVyd2lzZQorICAgICAqICAgICAgICAgcmV0dXJuIG51bGwuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBudWxsLgorICAgICAqICAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5RnJvbUNoaWxkCisgICAgICogCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpdml0eVJlc3VsdCBleGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgQ29udGV4dCB3aG8sIElCaW5kZXIgY29udGV4dFRocmVhZCwgSUJpbmRlciB0b2tlbiwgRnJhZ21lbnQgdGFyZ2V0LAorICAgICAgICBJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkIHdob1RocmVhZCA9IChJQXBwbGljYXRpb25UaHJlYWQpIGNvbnRleHRUaHJlYWQ7CisgICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWN0aXZpdHlNb25pdG9ycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1vbml0b3IgYW0gPSBtQWN0aXZpdHlNb25pdG9ycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbS5tYXRjaCh3aG8sIG51bGwsIGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtLm1IaXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW0uaXNCbG9ja2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RDb2RlID49IDAgPyBhbS5nZXRSZXN1bHQoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eSh3aG9UaHJlYWQsIGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5yZXNvbHZlVHlwZUlmTmVlZGVkKHdoby5nZXRDb250ZW50UmVzb2x2ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAwLCB0b2tlbiwgdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubVdobyA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrU3RhcnRBY3Rpdml0eVJlc3VsdChyZXN1bHQsIGludGVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLypwYWNrYWdlKi8gZmluYWwgdm9pZCBpbml0KEFjdGl2aXR5VGhyZWFkIHRocmVhZCwKICAgICAgICAgICAgIENvbnRleHQgaW5zdHJDb250ZXh0LCBDb250ZXh0IGFwcENvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50LCAKICAgICAgICAgICAgIElJbnN0cnVtZW50YXRpb25XYXRjaGVyIHdhdGNoZXIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDhlYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworLyoqCisgKiBBbiBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgbGlzdCBvZiBpdGVtcyBieSBiaW5kaW5nIHRvIGEgZGF0YSBzb3VyY2Ugc3VjaCBhcworICogYW4gYXJyYXkgb3IgQ3Vyc29yLCBhbmQgZXhwb3NlcyBldmVudCBoYW5kbGVycyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbS4KKyAqIDxwPgorICogTGlzdEFjdGl2aXR5IGhvc3RzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IExpc3RWaWV3fSBvYmplY3QgdGhhdCBjYW4KKyAqIGJlIGJvdW5kIHRvIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMsIHR5cGljYWxseSBlaXRoZXIgYW4gYXJyYXkgb3IgYSBDdXJzb3IKKyAqIGhvbGRpbmcgcXVlcnkgcmVzdWx0cy4gQmluZGluZywgc2NyZWVuIGxheW91dCwgYW5kIHJvdyBsYXlvdXQgYXJlIGRpc2N1c3NlZAorICogaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKyAqIDxwPgorICogPHN0cm9uZz5TY3JlZW4gTGF5b3V0PC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIExpc3RBY3Rpdml0eSBoYXMgYSBkZWZhdWx0IGxheW91dCB0aGF0IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGxpc3Qgdmlldy4KKyAqIEhvd2V2ZXIsIGlmIHlvdSBkZXNpcmUsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBmcmFnbWVudCBsYXlvdXQgYnkgcmV0dXJuaW5nCisgKiB5b3VyIG93biB2aWV3IGhpZXJhcmNoeSBmcm9tIHtAbGluayAjb25DcmVhdGVWaWV3fS4KKyAqIFRvIGRvIHRoaXMsIHlvdXIgdmlldyBoaWVyYXJjaHkgTVVTVCBjb250YWluIGEgTGlzdFZpZXcgb2JqZWN0IHdpdGggdGhlCisgKiBpZCAiQGFuZHJvaWQ6aWQvbGlzdCIgKG9yIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdH0gaWYgaXQncyBpbiBjb2RlKQorICogPHA+CisgKiBPcHRpb25hbGx5LCB5b3VyIHZpZXcgaGllcmFyY2h5IGNhbiBjb250YWluIGFub3RoZXIgdmlldyBvYmplY3Qgb2YgYW55IHR5cGUgdG8KKyAqIGRpc3BsYXkgd2hlbiB0aGUgbGlzdCB2aWV3IGlzIGVtcHR5LiBUaGlzICJlbXB0eSBsaXN0IiBub3RpZmllciBtdXN0IGhhdmUgYW4KKyAqIGlkICJhbmRyb2lkOmVtcHR5Ii4gTm90ZSB0aGF0IHdoZW4gYW4gZW1wdHkgdmlldyBpcyBwcmVzZW50LCB0aGUgbGlzdCB2aWV3CisgKiB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyBhbiAodWdseSkgY3VzdG9tIGxpc3kgbGF5b3V0LiBJdCBoYXMgYSBsaXN0CisgKiB3aXRoIGEgZ3JlZW4gYmFja2dyb3VuZCwgYW5kIGFuIGFsdGVybmF0ZSByZWQgIm5vIGRhdGEiIG1lc3NhZ2UuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9JnF1b3Q7OGRwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSZxdW90OzhkcCZxdW90OyZndDsKKyAqCisgKiAgICAgJmx0O0xpc3RWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6bGlzdCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9JnF1b3Q7IzAwRkYwMCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9JnF1b3Q7MSZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6ZW1wdHkmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSZxdW90OyNGRjAwMDAmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSZxdW90O05vIGRhdGEmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIDxzdHJvbmc+Um93IExheW91dDwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBZb3UgY2FuIHNwZWNpZnkgdGhlIGxheW91dCBvZiBpbmRpdmlkdWFsIHJvd3MgaW4gdGhlIGxpc3QuIFlvdSBkbyB0aGlzIGJ5CisgKiBzcGVjaWZ5aW5nIGEgbGF5b3V0IHJlc291cmNlIGluIHRoZSBMaXN0QWRhcHRlciBvYmplY3QgaG9zdGVkIGJ5IHRoZSBmcmFnbWVudAorICogKHRoZSBMaXN0QWRhcHRlciBiaW5kcyB0aGUgTGlzdFZpZXcgdG8gdGhlIGRhdGE7IG1vcmUgb24gdGhpcyBsYXRlcikuCisgKiA8cD4KKyAqIEEgTGlzdEFkYXB0ZXIgY29uc3RydWN0b3IgdGFrZXMgYSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgYSBsYXlvdXQgcmVzb3VyY2UKKyAqIGZvciBlYWNoIHJvdy4gSXQgYWxzbyBoYXMgdHdvIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGxldCB5b3Ugc3BlY2lmeQorICogd2hpY2ggZGF0YSBmaWVsZCB0byBhc3NvY2lhdGUgd2l0aCB3aGljaCBvYmplY3QgaW4gdGhlIHJvdyBsYXlvdXQgcmVzb3VyY2UuCisgKiBUaGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdHlwaWNhbGx5IHBhcmFsbGVsIGFycmF5cy4KKyAqIDwvcD4KKyAqIDxwPgorICogQW5kcm9pZCBwcm92aWRlcyBzb21lIHN0YW5kYXJkIHJvdyBsYXlvdXQgcmVzb3VyY2VzLiBUaGVzZSBhcmUgaW4gdGhlCisgKiB7QGxpbmsgYW5kcm9pZC5SLmxheW91dH0gY2xhc3MsIGFuZCBoYXZlIG5hbWVzIHN1Y2ggYXMgc2ltcGxlX2xpc3RfaXRlbV8xLAorICogc2ltcGxlX2xpc3RfaXRlbV8yLCBhbmQgdHdvX2xpbmVfbGlzdF9pdGVtLiBUaGUgZm9sbG93aW5nIGxheW91dCBYTUwgaXMgdGhlCisgKiBzb3VyY2UgZm9yIHRoZSByZXNvdXJjZSB0d29fbGluZV9saXN0X2l0ZW0sIHdoaWNoIGRpc3BsYXlzIHR3byBkYXRhCisgKiBmaWVsZHMsb25lIGFib3ZlIHRoZSBvdGhlciwgZm9yIGVhY2ggbGlzdCByb3cuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsKKyAqICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7Jmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAK2lkL3RleHQxJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9JnF1b3Q7MTZzcCZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0mcXVvdDtib2xkJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QCtpZC90ZXh0MiZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSZxdW90OzE2c3AmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFlvdSBtdXN0IGlkZW50aWZ5IHRoZSBkYXRhIGJvdW5kIHRvIGVhY2ggVGV4dFZpZXcgb2JqZWN0IGluIHRoaXMgbGF5b3V0LiBUaGUKKyAqIHN5bnRheCBmb3IgdGhpcyBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogPHN0cm9uZz5CaW5kaW5nIHRvIERhdGE8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGJpbmQgdGhlIExpc3RGcmFnbWVudCdzIExpc3RWaWV3IG9iamVjdCB0byBkYXRhIHVzaW5nIGEgY2xhc3MgdGhhdAorICogaW1wbGVtZW50cyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIExpc3RBZGFwdGVyfSBpbnRlcmZhY2UuCisgKiBBbmRyb2lkIHByb3ZpZGVzIHR3byBzdGFuZGFyZCBsaXN0IGFkYXB0ZXJzOgorICoge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIgU2ltcGxlQWRhcHRlcn0gZm9yIHN0YXRpYyBkYXRhIChNYXBzKSwKKyAqIGFuZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciBTaW1wbGVDdXJzb3JBZGFwdGVyfSBmb3IgQ3Vyc29yCisgKiBxdWVyeSByZXN1bHRzLgorICogPC9wPgorICoKKyAqIEBzZWUgI3NldExpc3RBZGFwdGVyCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3CisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgZmluYWwgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIGZpbmFsIHByaXZhdGUgUnVubmFibGUgbVJlcXVlc3RGb2N1cyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbUxpc3QuZm9jdXNhYmxlVmlld0F2YWlsYWJsZShtTGlzdCk7CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIGZpbmFsIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtT25DbGlja0xpc3RlbmVyCisgICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBvbkxpc3RJdGVtQ2xpY2soKExpc3RWaWV3KXBhcmVudCwgdiwgcG9zaXRpb24sIGlkKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBMaXN0VmlldyBtTGlzdDsKKworICAgIHB1YmxpYyBMaXN0RnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIHNpbXBsZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRvIGxpc3QgdmlldyBvbmNlIEZyYWdtZW50IGlzIHJlYWR5IHRvIHJ1bi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlYWR5KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25SZWFkeShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0YWNoIGZyb20gbGlzdCB2aWV3LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVxdWVzdEZvY3VzKTsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhbiBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLiBTdWJjbGFzc2VzIGNhbiBjYWxsCisgICAgICogZ2V0TGlzdFZpZXcoKS5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbikgaWYgdGhleSBuZWVkIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsIFRoZSBMaXN0VmlldyB3aGVyZSB0aGUgY2xpY2sgaGFwcGVuZWQKKyAgICAgKiBAcGFyYW0gdiBUaGUgdmlldyB0aGF0IHdhcyBjbGlja2VkIHdpdGhpbiB0aGUgTGlzdFZpZXcKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSB2aWV3IGluIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGlkIFRoZSByb3cgaWQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgdGhlIGN1cnNvciBmb3IgdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIG1BZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHBvc2l0aW9uIHdpdGggdGhlIGFkYXB0ZXIncyBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgbUxpc3Quc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJzb3Igcm93IElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWN0aXZpdHkncyBsaXN0IHZpZXcgd2lkZ2V0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBMaXN0QWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpdml0eSdzIExpc3RWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRMaXN0QWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVMaXN0KCkgeworICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZpZXcgcm9vdCA9IGdldFZpZXcoKTsKKyAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udGVudCB2aWV3IG5vdCB5ZXQgY3JlYXRlZCIpOworICAgICAgICB9CisgICAgICAgIFZpZXcgZW1wdHlWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5lbXB0eSk7CisgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubGlzdCk7CisgICAgICAgIGlmIChtTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIllvdXIgY29udGVudCBtdXN0IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZCBhdHRyaWJ1dGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICInYW5kcm9pZC5SLmlkLmxpc3QnIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVtcHR5VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdC5zZXRFbXB0eVZpZXcoZW1wdHlWaWV3KTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVJlcXVlc3RGb2N1cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhNWNhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIEEgRnJhZ21lbnQgdGhhdCBoYXMgdXRpbGl0eSBtZXRob2RzIGZvciBtYW5hZ2luZyB7QGxpbmsgTG9hZGVyfXMuCisgKgorICogQHBhcmFtIDxEPiBUaGUgdHlwZSBvZiBkYXRhIHJldHVybmVkIGJ5IHRoZSBMb2FkZXIuIElmIHlvdSdyZSB1c2luZyBtdWx0aXBsZSBMb2FkZXJzIHdpdGgKKyAqIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgdXNlIE9iamVjdCBhbmQgY2FzZSB0aGUgcmVzdWx0cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIExvYWRlck1hbmFnaW5nRnJhZ21lbnQ8RD4gZXh0ZW5kcyBGcmFnbWVudAorICAgICAgICBpbXBsZW1lbnRzIExvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2FkZXJJbmZvPEQ+IHsKKyAgICAgICAgcHVibGljIEJ1bmRsZSBhcmdzOworICAgICAgICBwdWJsaWMgTG9hZGVyPEQ+IGxvYWRlcjsKKyAgICB9CisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+IG1Mb2FkZXJzOworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBtSW5hY3RpdmVMb2FkZXJzOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbG9hZGVyIHdpdGggdGhpcyBhY3Rpdml0eSwgcmVnaXN0ZXJzIHRoZSBjYWxsYmFja3Mgb24gaXQsIGFuZCBzdGFydHMgaXQgbG9hZGluZy4KKyAgICAgKiBJZiBhIGxvYWRlciB3aXRoIHRoZSBzYW1lIGlkIGhhcyBwcmV2aW91c2x5IGJlZW4gc3RhcnRlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVzdHJveWVkCisgICAgICogd2hlbiB0aGUgbmV3IGxvYWRlciBjb21wbGV0ZXMgaXQncyB3b3JrLiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBkZWxpdmVyZWQgYmVmb3JlIHRoZSBvbGQgbG9hZGVyCisgICAgICogaXMgZGVzdHJveWVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2FkZXI8RD4gc3RhcnRMb2FkaW5nKGludCBpZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcyBsb2FkZXIgc28gd2UgY2FuIGRlc3Ryb3kKKyAgICAgICAgICAgIC8vIGl0IHdoZW4gdGhlIG5ldyBvbmUgY29tcGxldGVzLgorICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICB9CisgICAgICAgIGluZm8gPSBuZXcgTG9hZGVySW5mbzxEPigpOworICAgICAgICBpbmZvLmFyZ3MgPSBhcmdzOworICAgICAgICBtTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gb25DcmVhdGVMb2FkZXIoaWQsIGFyZ3MpOworICAgICAgICBpbmZvLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBUaGUgYWN0aXZpdHkgd2lsbCBzdGFydCBhbGwgZXhpc3RpbmcgbG9hZGVycyBpbiBpdCdzIG9uU3RhcnQoKSwgc28gb25seSBzdGFydCB0aGVtCisgICAgICAgICAgICAvLyBoZXJlIGlmIHdlJ3JlIHBhc3QgdGhhdCBwb2ludCBvZiB0aGUgYWN0aXZpdGl5J3MgbGlmZSBjeWNsZQorICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoaWQsIHRoaXMpOworICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsb2FkZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExvYWRlcjxEPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkluaXRpYWxpemVMb2FkZXJzKCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKTsKKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSkgeworICAgICAgICAvLyBOb3RpZnkgb2YgdGhlIG5ldyBkYXRhIHNvIHRoZSBhcHAgY2FuIHN3aXRjaCBvdXQgdGhlIG9sZCBkYXRhIGJlZm9yZQorICAgICAgICAvLyB3ZSB0cnkgdG8gZGVzdHJveSBpdC4KKyAgICAgICAgb25Mb2FkRmluaXNoZWQobG9hZGVyLCBkYXRhKTsKKworICAgICAgICAvLyBMb29rIGZvciBhbiBpbmFjdGl2ZSBsb2FkZXIgYW5kIGRlc3Ryb3kgaXQgaWYgZm91bmQKKyAgICAgICAgaW50IGlkID0gbG9hZGVyLmdldElkKCk7CisgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVyPEQ+IG9sZExvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaWYgKG9sZExvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2xkTG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucmVtb3ZlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkU3RhdGUpOworCisgICAgICAgIGlmIChtTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMb29rIGZvciBhIHBhc3NlZCBhbG9uZyBsb2FkZXIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgaXQncyBub3QgdGhlcmUKKy8vIFRPRE86IHVuY29tbWVudCBvbmNlIGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgbWV0aG9kIGlzIGF2YWlsYWJsZQorLy8gICAgICAgICAgICBtTG9hZGVycyA9IChIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm8+KSBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAobUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkZXJzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4oKTsKKyAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVMb2FkZXJzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbmFjdGl2ZUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisKKyAgICAgICAgLy8gQ2FsbCBvdXQgdG8gc3ViIGNsYXNzZXMgc28gdGhleSBjYW4gc3RhcnQgdGhlaXIgbG9hZGVycworICAgICAgICAvLyBMZXQgdGhlIGV4aXN0aW5nIGxvYWRlcnMga25vdyB0aGF0IHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIGxvYWQgaXMgY29tcGxldGUKKyAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGludCBpZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICBsb2FkZXIgPSBvbkNyZWF0ZUxvYWRlcihpZCwgaW5mby5hcmdzKTsKKyAgICAgICAgICAgICAgIGluZm8ubG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoaWQsIHRoaXMpOworICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisKKyAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMZXQgdGhlIGxvYWRlciBrbm93IHdlJ3JlIGRvbmUgd2l0aCBpdAorICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgLy8gVGhlIGxvYWRlciBpc24ndCBnZXR0aW5nIHBhc3NlZCBhbG9uZyB0byB0aGUgbmV4dCBpbnN0YW5jZSBzbyBhc2sgaXQgdG8gc3RvcCBsb2FkaW5nCisgICAgICAgICAgICBpZiAoIWdldEFjdGl2aXR5KCkuaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqIFRPIERPOiBUaGlzIG5lZWRzIHRvIGJlIHR1cm5lZCBpbnRvIGEgcmV0YWluZWQgZnJhZ21lbnQuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgbG9hZGVyIGFsb25nIHRvIHRoZSBuZXh0IGd1eQorICAgICAgICBPYmplY3QgcmVzdWx0ID0gbUxvYWRlcnM7CisgICAgICAgIG1Mb2FkZXJzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgKiovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworCisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIGxvYWRlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZyhpbnQgaWQpIHsKKyAgICAgICAgaWYgKG1Mb2FkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1Mb2FkZXJzLnJlbW92ZShpZCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBsb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIExvYWRlciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vIG1hdGNoaW5nIExvYWRlcgorICAgICAqIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCkgeworICAgICAgICBMb2FkZXJJbmZvPEQ+IGxvYWRlckluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAobG9hZGVySW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlcnMuZ2V0KGlkKS5sb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBhMjRmY2FlLi41MjRkZTZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMjAsMTMgKzIwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgpAQCAtMzgsNyArMzYsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgTG9jYWxBY3Rpdml0eU1hbmFnZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9jYWxBY3Rpdml0eU1hbmFnZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2UgfHwgQ29uZmlnLkxPR1Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YgPSBmYWxzZTsKIAogICAgIC8vIEludGVybmFsIHRva2VuIGZvciBhbiBBY3Rpdml0eSBiZWluZyBtYW5hZ2VkIGJ5IExvY2FsQWN0aXZpdHlNYW5hZ2VyLgogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQWN0aXZpdHlSZWNvcmQgZXh0ZW5kcyBCaW5kZXIgewpAQCAtMTEyLDExICsxMTAsMTYgQEAKICAgICAgICAgCiAgICAgICAgIGlmIChyLmN1clN0YXRlID09IElOSVRJQUxJWklORykgewogICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlIGZvciB0aGUgYWN0aXZpdHkKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPQotICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOwotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KKyAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5nZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCk7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2VPYmogPSBudWxsOwogICAgICAgICAgICAgaWYgKGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmdldChyLmlkKTsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZU9iaiA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmdldChyLmlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgaW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgaWYgKGluc3RhbmNlT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZpdHkgPSBpbnN0YW5jZU9iajsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGFsd2F5cyBjcmVhdGVkIHRoZSBhY3Rpdml0eS4KQEAgLTM0Niw3ICszNDksNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgV2luZG93IHBlcmZvcm1EZXN0cm95KExvY2FsQWN0aXZpdHlSZWNvcmQgciwgYm9vbGVhbiBmaW5pc2gpIHsKLSAgICAgICAgV2luZG93IHdpbiA9IG51bGw7CisgICAgICAgIFdpbmRvdyB3aW47CiAgICAgICAgIHdpbiA9IHIud2luZG93OwogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBSRVNVTUVEICYmICFmaW5pc2gpIHsKICAgICAgICAgICAgIHBlcmZvcm1QYXVzZShyLCBmaW5pc2gpOwpAQCAtMzgwLDcgKzM4Myw4IEBACiAgICAgICAgIGlmIChyICE9IG51bGwpIHsKICAgICAgICAgICAgIHdpbiA9IHBlcmZvcm1EZXN0cm95KHIsIGZpbmlzaCk7CiAgICAgICAgICAgICBpZiAoZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2aXRpZXMucmVtb3ZlKHIpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShpZCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5QXJyYXkucmVtb3ZlKHIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiB3aW47CkBAIC00NDEsMTAgKzQ0NSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hDcmVhdGUoQnVuZGxlIHN0YXRlKSB7CiAgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGkgPSBzdGF0ZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IHN0YXRlLmtleVNldCgpKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gaS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhc3RhdGUgPSBzdGF0ZS5nZXRCdW5kbGUoaWQpOwogICAgICAgICAgICAgICAgICAgICBMb2NhbEFjdGl2aXR5UmVjb3JkIHIgPSBtQWN0aXZpdGllcy5nZXQoaWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CkBAIC00NTcsOSArNDU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgZnJvbSAtYWxsLSBhcHAgZXJyb3JzLgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB0aHJvd24gd2hlbiByZXN0b3JpbmcgTG9jYWxBY3Rpdml0eU1hbmFnZXIgc3RhdGUiLCBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCmluZGV4IDI5NmQ3MGE0Li4zMDY2ZjVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIElEZXZpY2VQb2xpY3lNYW5hZ2VyIG1TZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CkBAIC02MSwxNCArNjEsMTQgQEAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtZSA9IG5ldyBEZXZpY2VQb2xpY3lNYW5hZ2VyKGNvbnRleHQsIGhhbmRsZXIpOwogICAgICAgICByZXR1cm4gbWUubVNlcnZpY2UgIT0gbnVsbCA/IG1lIDogbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGFzayB0aGUgdXNlciB0byBhZGQgYSBuZXcgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbS4KICAgICAgKiBUaGUgZGVzaXJlZCBwb2xpY3kgaXMgdGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIHBvbGljeSBpbiB0aGUKICAgICAgKiB7QGxpbmsgI0VYVFJBX0RFVklDRV9BRE1JTn0gZXh0cmEgZmllbGQuICBUaGlzIHdpbGwgaW52b2tlIGEgVUkgdG8KICAgICAgKiBicmluZyB0aGUgdXNlciB0aHJvdWdoIGFkZGluZyB0aGUgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbSAob3IKICAgICAgKiBhbGxvd2luZyB0aGVtIHRvIHJlamVjdCBpdCkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5Zb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUge0BsaW5rICNFWFRSQV9BRERfRVhQTEFOQVRJT059CiAgICAgICogZmllbGQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIGFkZGl0aW9uCiAgICAgICogdG8geW91ciBjb21wb25lbnQncyBkZXNjcmlwdGlvbikgYWJvdXQgd2hhdCBpcyBiZWluZyBhZGRlZC4KQEAgLTc2LDcgKzc2LDcgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BRERfREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IGFjdGlvbjogc2VuZCB3aGVuIGFueSBwb2xpY3kgYWRtaW4gY2hhbmdlcyBhIHBvbGljeS4KICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gYSBuZXcgcG9saWN5IGlzIGluIGVmZmVjdC4KQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFVklDRV9BRE1JTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5ERVZJQ0VfQURNSU4iOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgQ2hhclNlcXVlbmNlIHByb3ZpZGluZyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhlCiAgICAgICogYWRtaW4gaXMgYmVpbmcgYWRkZWQuCkBAIC0xMDAsMjIgKzEwMCwyMSBAQAogICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGhhdmUgdGhlIHVzZXIgZW50ZXIgYSBuZXcgcGFzc3dvcmQuICBUaGlzIGFjdGl2aXR5Ci0gICAgICogc2hvdWxkIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9Ci0gICAgICogb3Ige0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSwgaW50KX0gdG8gaGF2ZSB0aGUKLSAgICAgKiB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLiAgWW91IGNhbgotICAgICAqIHVzZSB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkCi0gICAgICogdG8gaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAotICAgICAqIGNvbnN0cmFpbnRzLiAgVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwKLSAgICAgKiB5b3UgY2FuIGNoZWNrIHRoZSBuZXcgcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIHN1ZmZpY2llbnQuCisgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiBUaGlzIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9LAorICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlIHVzZXIKKyAgICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gWW91IGNhbiB1c2UKKyAgICAgKiB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkIHRvCisgICAgICogaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAorICAgICAqIGNvbnN0cmFpbnRzLiBVcG9uIGJlaW5nIHJlc3VtZWQgZnJvbSB0aGlzIGFjdGl2aXR5LCB5b3UgY2FuIGNoZWNrIHRoZSBuZXcKKyAgICAgKiBwYXNzd29yZCBjaGFyYWN0ZXJpc3RpY3MgdG8gc2VlIGlmIHRoZXkgYXJlIHN1ZmZpY2llbnQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfTkVXX1BBU1NXT1JECiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VUX05FV19QQVNTV09SRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRtaW5pc3RyYXRvciBjb21wb25lbnQgaXMgY3VycmVudGx5CiAgICAgICogYWN0aXZlIChlbmFibGVkKSBpbiB0aGUgc3lzdGVtLgpAQCAtMTMwLDcgKzEyOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGFkbWluaXN0cmF0b3IncyBjb21wb25lbnQKICAgICAgKiBuYW1lcy4gIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gYWRtaW5pc3RyYXRvcnMgdGhhbiBudWxsIG1heSBiZQpAQCAtMTQ2LDcgKzE0NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE2MCw3ICsxNTksNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYSBjdXJyZW50IGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3ducyB0aGUgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50OyBpZiB5b3UKQEAgLTE3NiwyOCArMTc1LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgcG9saWN5IGhhcyBubyByZXF1aXJlbWVudHMKICAgICAgKiBmb3IgdGhlIHBhc3N3b3JkLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyCiAgICAgICogdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQgPSAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSByZXF1aXJlcyBzb21lIGtpbmQKICAgICAgKiBvZiBwYXNzd29yZCwgYnV0IGRvZXNuJ3QgY2FyZSB3aGF0IGl0IGlzLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzCiAgICAgICogYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HID0gMHgxMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IG51bWVyaWMgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBxdWFsaXR5CiAgICAgICogY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMgPSAweDIwMDAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQogICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYWxwaGFiZXRpYyAob3Igb3RoZXIgc3ltYm9sKSBjaGFyYWN0ZXJzLgpAQCAtMjA1LDcgKzIwNCw3IEBACiAgICAgICogcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID0gMHg0MDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IDxlbT5ib3RoPjwvZW0+IG51bWVyaWMgPGVtPmFuZDwvZW0+CkBAIC0yMTMsNyArMjEyLDE5IEBACiAgICAgICogb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPSAweDUwMDAwOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQorICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYSBsZXR0ZXIsIGEgbnVtZXJpY2FsIGRpZ2l0IGFuZCBhIHNwZWNpYWwKKyAgICAgKiBzeW1ib2wsIGJ5IGRlZmF1bHQuIFdpdGggdGhpcyBwYXNzd29yZCBxdWFsaXR5LCBwYXNzd29yZHMgY2FuIGJlCisgICAgICogcmVzdHJpY3RlZCB0byBjb250YWluIHZhcmlvdXMgc2V0cyBvZiBjaGFyYWN0ZXJzLCBsaWtlIGF0IGxlYXN0IGFuCisgICAgICogdXBwZXJjYXNlIGxldHRlciwgZXRjLiBUaGVzZSBhcmUgc3BlY2lmaWVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywKKyAgICAgKiBsaWtlIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9LiBOb3RlCisgICAgICogdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPSAweDYwMDAwOworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBwYXNzd29yZCByZXN0cmljdGlvbnMgaXQgaXMgaW1wb3NpbmcuICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yMjIsMjEgKzIzMywyMSBAQAogICAgICAqIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90CiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZTsKICAgICAgKiB0aHVzIHRoZSBoaWdoZXN0IHJlcXVlc3RlZCBxdWFsaXR5IGNvbnN0YW50IChiZXR3ZWVuIHRoZSBwb2xpY3kgc2V0IGhlcmUsCiAgICAgICogdGhlIHVzZXIncyBwcmVmZXJlbmNlLCBhbmQgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zKSBpcyB0aGUgb25lIHRoYXQKICAgICAgKiBpcyBpbiBlZmZlY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgbmV3IGRlc2lyZWQgcXVhbGl0eS4gIE9uZSBvZgogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRH0sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkd9LAogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LgorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKQEAgLTI0Nyw3ICsyNTgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWluaW11bSBwYXNzd29yZCBxdWFsaXR5IGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTI2NCw3ICsyNzUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogbWluaW11bSBhbGxvd2VkIHBhc3N3b3JkIGxlbmd0aC4gIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIKQEAgLTI3NCwxNCArMjg1LDE0IEBACiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gIFRoaXMKICAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQgZWl0aGVyCi0gICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sCi0gICAgICogb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfQorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LCBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0KICAgICAgKiB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiAgQSB2YWx1ZSBvZiAwCiAgICAgICogbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC0yOTUsNyArMzA2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTMxMiw3ICszMjMsMzc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyCisgICAgICogc2V0dGluZyB0aGlzLCB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMKKyAgICAgKiBub3QgYXQgbGVhc3QgYXMgcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudAorICAgICAqIHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMKKyAgICAgKiBub3QgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkCisgICAgICogZm9yIGFsbCBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIHN5bWJvbHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsCisgICAgICogdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcworICAgICAqIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbAorICAgICAqIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlCisgICAgICogcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZCBmb3IgYWxsCisgICAgICogYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgKG51bWVyaWNhbCBkaWdpdHMgb3Igc3ltYm9scykKKyAgICAgKiByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAqIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzCisgICAgICogYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMKKyAgICAgKiBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdAorICAgICAqIHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyCisgICAgICogc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yCisgICAgICogaGFzIGFsc28gcmVxdWVzdGVkIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoCisgICAgICoge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBsZW5ndGgKKyAgICogb2YgdGhlIHBhc3N3b3JkIGhpc3RvcnkuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0bworICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIHRoZSBzYW1lIGFzIGFueSBwYXNzd29yZCBpbiB0aGUgaGlzdG9yeS4gTm90ZQorICAgKiB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbworICAgKiB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcKKyAgICogcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAqIFRoaXMgY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAqIGVpdGhlciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwgb3IKKyAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCisgICAqCisgICAqIDxwPgorICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwgdGhpcworICAgKiBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAqICAgICAgICB3aXRoLgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBsZW5ndGggb2YgcGFzc3dvcmQgaGlzdG9yeS4gQSB2YWx1ZSBvZiAwCisgICAqICAgICAgICBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGggZm9yIGFsbCBhZG1pbnMKKyAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvIGFnZ3JlZ2F0ZQorICAgICAqIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gcGFzc3dvcmQgbGVuZ3RoIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBmb3IgYQogICAgICAqIHBhcnRpY3VsYXIgcGFzc3dvcmQgcXVhbGl0eS4KQEAgLTMyMywxNiArNzA2LDE2IEBACiAgICAgICAgIC8vIEtpbmQtb2YgYXJiaXRyYXJ5LgogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdGhlIHVzZXIgaGFzIHNldCBpcyBzdWZmaWNpZW50CiAgICAgICogdG8gbWVldCB0aGUgcG9saWN5IHJlcXVpcmVtZW50cyAocXVhbGl0eSwgbWluaW11bSBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuCiAgICAgICogcmVxdWVzdGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLAogICAgICAqIGVsc2UgZmFsc2UuCiAgICAgICovCkBAIC0zNDYsMTEgKzcyOSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIGhhcyBmYWlsZWQgYXQgZW50ZXJpbmcgYQogICAgICAqIHBhc3N3b3JkIHNpbmNlIHRoYXQgbGFzdCBzdWNjZXNzZnVsIHBhc3N3b3JkIGVudHJ5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC0zNzMsMTQgKzc1NiwxNCBAQAogICAgICAqIHdhdGNoaW5nIGZvciBmYWlsZWQgcGFzc3dvcmRzIGFuZCB3aXBpbmcgdGhlIGRldmljZSwgYW5kIHJlcXVpcmVzCiAgICAgICogdGhhdCB5b3UgcmVxdWVzdCBib3RoIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU59IGFuZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0lQRV9EQVRBfX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UbyBpbXBsZW1lbnQgYW55IG90aGVyIHBvbGljeSAoZS5nLiB3aXBpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogYXBwbGljYXRpb24gb25seSwgZXJhc2luZyBvciByZXZva2luZyBjcmVkZW50aWFscywgb3IgcmVwb3J0aW5nIHRoZQogICAgICAqIGZhaWx1cmUgdG8gYSBzZXJ2ZXIpLCB5b3Ugc2hvdWxkIGltcGxlbWVudAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyI29uUGFzc3dvcmRGYWlsZWQoQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CiAgICAgICogaW5zdGVhZC4gIERvIG5vdCB1c2UgdGhpcyBBUEksIGJlY2F1c2UgaWYgdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZCwKICAgICAgKiB0aGUgZGV2aWNlIHdpbGwgYmUgd2lwZWQgaW1tZWRpYXRlbHksIGFuZCB5b3VyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIG51bSBUaGUgbnVtYmVyIG9mIGZhaWxlZCBwYXNzd29yZCBhdHRlbXB0cyBhdCB3aGljaCBwb2ludCB0aGUKICAgICAgKiBkZXZpY2Ugd2lsbCB3aXBlIGl0cyBkYXRhLgpAQCAtMzk0LDcgKzc3Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBhbGxvd2VkCiAgICAgICogYmVmb3JlIHRoZSBkZXZpY2Ugd2lwZXMgaXRzZWxmLCBmb3IgYWxsIGFkbWlucwpAQCAtNDEyLDEzICs3OTUsMTMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3Jlc2V0UGFzc3dvcmR9OiBkb24ndCBhbGxvdyBvdGhlciBhZG1pbnMgdG8gY2hhbmdlCiAgICAgICogdGhlIHBhc3N3b3JkIGFnYWluIHVudGlsIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGl0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VUX1BBU1NXT1JEX1JFUVVJUkVfRU5UUlkgPSAweDAwMDE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3JjZSBhIG5ldyBkZXZpY2UgdW5sb2NrIHBhc3N3b3JkICh0aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUKICAgICAgKiBlbnRpcmUgZGV2aWNlLCBub3QgZm9yIGluZGl2aWR1YWwgYWNjb3VudHMpIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcwpAQCAtNDMxLDExICs4MTQsMTEgQEAKICAgICAgKiB0aGF0IHRoZSBwYXNzd29yZCBtYXkgYmUgYSBzdHJvbmdlciBxdWFsaXR5IChjb250YWluaW5nIGFscGhhbnVtZXJpYwogICAgICAqIGNoYXJhY3RlcnMgd2hlbiB0aGUgcmVxdWVzdGVkIHF1YWxpdHkgaXMgb25seSBudW1lcmljKSwgaW4gd2hpY2ggY2FzZQogICAgICAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIHF1YWxpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfUkVTRVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gZmxhZ3MgTWF5IGJlIDAgb3Ige0BsaW5rICNSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZfS4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgd2FzIGFwcGxpZWQsIG9yIGZhbHNlIGlmIGl0IGlzCkBAIC00NTEsMTYgKzgzNCwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1heGltdW0gdGltZSBmb3IgdXNlciBhY3Rpdml0eSB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgbG9jay4gIFRoaXMgbGltaXRzCiAgICAgICogdGhlIGxlbmd0aCB0aGF0IHRoZSB1c2VyIGNhbiBzZXQuICBJdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIG5ldyBkZXNpcmVkIG1heGltdW0gdGltZSB0byBsb2NrIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC00NzQsNyArODU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1heGltdW0gdGltZSB0byB1bmxvY2sgZm9yIGFsbCBhZG1pbnMKICAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgpAQCAtNDkxLDExICs4NzQsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYWtlIHRoZSBkZXZpY2UgbG9jayBpbW1lZGlhdGVseSwgYXMgaWYgdGhlIGxvY2sgc2NyZWVuIHRpbWVvdXQgaGFzCiAgICAgICogZXhwaXJlZCBhdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KQEAgLTUwOSwxNiArODkyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBc2sgdGhlIHVzZXIgZGF0ZSBiZSB3aXBlZC4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHJlYm9vdCwKICAgICAgKiBlcmFzaW5nIGFsbCB1c2VyIGRhdGEgd2hpbGUgbmV4dCBib290aW5nIHVwLiAgRXh0ZXJuYWwgc3RvcmFnZSBzdWNoCiAgICAgICogYXMgU0QgY2FyZHMgd2lsbCBub3QgYmUgZXJhc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWdzIEJpdCBtYXNrIG9mIGFkZGl0aW9uYWwgb3B0aW9uczogY3VycmVudGx5IG11c3QgYmUgMC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKQEAgLTUzMCw3ICs5MTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU0Myw3ICs5MjYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU1NiwxMCArOTM5LDEwIEBACiAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gcmV0cmlldmUgZGV2aWNlIHBvbGljeSAiICsgY24sIGUpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgUmVzb2x2ZUluZm8gcmkgPSBuZXcgUmVzb2x2ZUluZm8oKTsKICAgICAgICAgcmkuYWN0aXZpdHlJbmZvID0gYWk7Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IERldmljZUFkbWluSW5mbyhtQ29udGV4dCwgcmkpOwogICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKQEAgLTU3MCw3ICs5NTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTg3LDE2ICs5NzAsMTggQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKHF1YWxpdHksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgsIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC02MDksNyArOTk0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCmluZGV4IDZmYzRkYzUuLjNhZGE5NWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCkBAIC0yNywxMCArMjcsMzEgQEAKIGludGVyZmFjZSBJRGV2aWNlUG9saWN5TWFuYWdlciB7CiAgICAgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KTsKICAgICBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvKTsKLSAgICAKKwogICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKICAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICAKKyAgICB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKICAgICBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCk7CiAgICAgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgCkBAIC01Myw3ICs3NCw4IEBACiAgICAgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIsIGluIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICAKLSAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpOworICAgIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsIGludCBsb3dlcmNhc2UsCisgICAgICAgIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcik7CiAgICAgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKTsKICAgICB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKaW5kZXggYjMzYjA5Ny4uM2MxOWVhMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKQEAgLTIzLDkgKzIzLDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKQEAgLTI3NSw2ICsyNzUsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHJhd0NoaWxkKENhbnZhcyBjYW52YXMsIFZpZXcgY2hpbGQsIGxvbmcgZHJhd2luZ1RpbWUpIHsKICAgICAgICAgaWYgKENST1NTRkFERSkgewogICAgICAgICAgICAgaW50IGFscGhhOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQppbmRleCBjN2ZlYTllLi4wYzliYWIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQpAQCAtMjU5LDYgKzI1OSw4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQID0gMTsKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX09QUCA9IDI7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9ISUQgPSAzOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgY2xhc3MgYml0cyBmb3IgcG9zc2libGUgYmx1ZXRvb3RoIHByb2ZpbGUgc3VwcG9ydC4KQEAgLTMyNCw2ICszMjYsOCBAQAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IFBST0ZJTEVfSElEKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldERldmljZUNsYXNzKCkgJiBEZXZpY2UuTWFqb3IuUEVSSVBIRVJBTCkgPT0gRGV2aWNlLk1ham9yLlBFUklQSEVSQUw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFB1YmxpYyBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggSElEIChJbnB1dCBEZXZpY2UpIFByb2ZpbGUKKyAqCisgKiBCbHVldG9vdGhJbnB1dERldmljZSBpcyBhIHByb3h5IG9iamVjdCB1c2VkIHRvIG1ha2UgY2FsbHMgdG8gQmx1ZXRvb3RoIFNlcnZpY2UKKyAqIHdoaWNoIGhhbmRsZXMgdGhlIEhJRCBwcm9maWxlLgorICoKKyAqIENyZWF0aW5nIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2Ugb2JqZWN0IHdpbGwgaW5pdGlhdGUgYSBiaW5kaW5nIHdpdGggdGhlCisgKiBCbHVldG9vdGggc2VydmljZS4gVXNlcnMgb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGNhbGwgY2xvc2UoKSB3aGVuIHRoZXkKKyAqIGFyZSBmaW5pc2hlZCwgc28gdGhhdCB0aGlzIHByb3h5IG9iamVjdCBjYW4gdW5iaW5kIGZyb20gdGhlIHNlcnZpY2UuCisgKgorICogQ3VycmVudGx5IHRoZSBCbHVldG9vdGggc2VydmljZSBydW5zIGluIHRoZSBzeXN0ZW0gc2VydmVyIGFuZCB0aGlzCisgKiBwcm94eSBvYmplY3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUgc2VydmljZSBvbiBjb25zdHJ1Y3Rpb24uCisgKgorICogIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhJbnB1dERldmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhJbnB1dERldmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5JTlBVVF9ERVZJQ0VfU1RBVEUiOworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUiOworCisgICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gaW5wdXQgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLAorICAgICAqIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSBhbmQgQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRQorICAgICAqIGV4dHJhcy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5hY3Rpb24uSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBdXRvIGNvbm5lY3Rpb24sIGluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMKKyAgICAgKiBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9BVVRPX0NPTk5FQ1QgPSAxMDAwOworICAgIC8qKgorICAgICAqIEluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9ucyB0byB0aGUgZGV2aWNlIGFyZSBub3QgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09GRiA9IDA7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSBsZXZlbCB3aGVuIHRoZSBkZXZpY2UgaXMgdW5wYWlyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfVU5ERUZJTkVEID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2UgcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAorICAgICAqIEJsdWV0b290aCBTZXJ2aWNlIHdoaWNoIGhhbmRsZSB0aGUgSElEIHByb2ZpbGUuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhJbnB1dERldmljZShDb250ZXh0IGMpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQmx1ZXRvb3RoQWRhcHRlci5CTFVFVE9PVEhfU0VSVklDRSk7CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSEiKTsKKworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hpY2ggcHJldmVudHMgcGVvcGxlIGZyb20gZ29pbmcKKyAgICAgICAgICAgIC8vIGludG8gV2lyZWxlc3Mgc2V0dGluZ3MgaW4gdGhlIGVtdWxhdG9yLiBMZXQgaXQgY3Jhc2ggbGF0ZXIgd2hlbiBpdCBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBJbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuIHRoZQorICAgICAqICBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RJbnB1dERldmljZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBhbiBJbnB1dCBEZXZpY2UuCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJuIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBkaXNjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCisgICAgICogIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIHNwZWNpZmllZCBJbnB1dERldmljZSBpcyBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRydWUgaWYgY29ubmVjdGVkICwgZmFsc2Ugb3RoZXJ3aXNlIGFuZCBvbiBlcnJvci4KKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJpc0lucHV0RGV2aWNlQ29ubmVjdGVkKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpbnQgc3RhdGUgPSBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9DT05ORUNURUQpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIENoZWNrIGlmIGFueSBJbnB1dCBEZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIElucHV0IERldmljZXMsIG9yIG51bGwgb24gZXJyb3IuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGF0ZSBvZiBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBJbnB1dCBEZXZpY2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHByaW9yaXR5IG9mIGFuIGlucHV0IGRldmljZS4KKyAgICAgKgorICAgICAqIFByaW9yaXR5IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIFByaW9yaXR5IGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKKyAgICAgKiB2YWx1ZXM6CisgICAgICoge0BsaW5rIFBSSU9SSVRZX09OfSwge0BsaW5rIFBSSU9SSVRZX09GRn0sIHtAbGluayBQUklPUklUWV9BVVRPX0NPTk5FQ1R9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBkZXZpY2UuCisgICAgICogQHBhcmFtIHByaW9yaXR5IEludGVnZXIgcHJpb3JpdHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpb3JpdHkgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIiwgIiArIHByaW9yaXR5ICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIElucHV0IERldmljZQorICAgICAqIEByZXR1cm4gbm9uLW5lZ2F0aXZlIHByaW9yaXR5LCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBQUklPUklUWV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQppbmRleCA0MTY0YTNkLi5mMWVlOTA3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKQEAgLTQ5LDYgKzQ5LDggQEAKICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMEMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE9iZXhPYmplY3RQdXNoID0KICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEhpZCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTI0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkW10gUkVTRVJWRURfVVVJRFMgPSB7CiAgICAgICAgIEF1ZGlvU2luaywgQXVkaW9Tb3VyY2UsIEFkdkF1ZGlvRGlzdCwgSFNQLCBIYW5kc2ZyZWUsIEF2cmNwQ29udHJvbGxlciwgQXZyY3BUYXJnZXQsCkBAIC04Miw2ICs4NCwxMCBAQAogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXZyY3BUYXJnZXQpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoSGlkKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgUGFyY2VsVXVpZCBpcyBwcmVzZW50IGluIHV1aWRBcnJheQogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAppbmRleCBlYTcxMDM0Li43NWYwOTNjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIAogLyoqCkBAIC03Miw0ICs3MywxMiBAQAogICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gbm90aWZ5SW5jb21pbmdDb25uZWN0aW9uKFN0cmluZyBhZGRyZXNzKTsKKworICAgIC8vIEhJRCBwcm9maWxlIEFQSXMKKyAgICBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKTsgIC8vIGNoYW5nZSB0byBTZXQ8PiBvbmNlIEFJREwgc3VwcG9ydHMKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWMwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKKworLyoqCisgKiBBYnN0cmFjdCBMb2FkZXIgdGhhdCBwcm92aWRlcyBhbiB7QGxpbmsgQXN5bmNUYXNrfSB0byBkbyB0aGUgd29yay4KKyAqCisgKiBAcGFyYW0gPEQ+IHRoZSBkYXRhIHR5cGUgdG8gYmUgbG9hZGVkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNUYXNrTG9hZGVyPEQ+IGV4dGVuZHMgTG9hZGVyPEQ+IHsKKyAgICBmaW5hbCBjbGFzcyBMb2FkVGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBEPiB7CisKKyAgICAgICAgcHJpdmF0ZSBEIHJlc3VsdDsKKworICAgICAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEQgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFzeW5jVGFza0xvYWRlci50aGlzLmxvYWRJbkJhY2tncm91bmQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBSdW5zIG9uIHRoZSBVSSB0aHJlYWQgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRCBkYXRhKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5kaXNwYXRjaE9uTG9hZENvbXBsZXRlKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgQXN5bmNUYXNrTG9hZGVyLnRoaXMub25DYW5jZWxsZWQocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExvYWRUYXNrIG1UYXNrOworCisgICAgcHVibGljIEFzeW5jVGFza0xvYWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yY2VMb2FkKCkgeworICAgICAgICBjYW5jZWxMb2FkKCk7CisgICAgICAgIG1UYXNrID0gbmV3IExvYWRUYXNrKCk7CisgICAgICAgIG1UYXNrLmV4ZWN1dGUoKFZvaWRbXSkgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrLiBTZWUge0BsaW5rIEFzeW5jVGFzayNjYW5jZWwoYm9vbGVhbil9CisgICAgICogZm9yIG1vcmUgaW5mby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPHR0PmZhbHNlPC90dD4gaWYgdGhlIHRhc2sgY291bGQgbm90IGJlIGNhbmNlbGVkLAorICAgICAqICAgICAgICAgdHlwaWNhbGx5IGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgY29tcGxldGVkIG5vcm1hbGx5LCBvcgorICAgICAqICAgICAgICAgYmVjYXVzZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGFuZAorICAgICAqICAgICAgICAgPHR0PnRydWU8L3R0PiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxMb2FkKCkgeworICAgICAgICBpZiAobVRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBtVGFzay5jYW5jZWwoZmFsc2UpOworICAgICAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGNhbmNlbGxlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGlmIHRoZSB0YXNrIHdhcyBjYW5jZWxlZCBiZWZvcmUgaXQgd2FzIGNvbXBsZXRlZC4gIEdpdmVzIHRoZSBjbGFzcyBhIGNoYW5jZQorICAgICAqIHRvIHByb3Blcmx5IGRpc3Bvc2Ugb2YgdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbGxlZChEIGRhdGEpIHsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BhdGNoT25Mb2FkQ29tcGxldGUoRCBkYXRhKSB7CisgICAgICAgIG1UYXNrID0gbnVsbDsKKyAgICAgICAgZGVsaXZlclJlc3VsdChkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgb24gYSB3b3JrZXIgdGhyZWFkIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBsb2FkLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBkZWxpdmVyIHRoZQorICAgICAqIHJlc3VsdHMgZGlyZWN0bHksIGJ1dCBzaG91bGQgcmV0dXJuIHRoZW0gZnJvbSB0aGlzIG1ldGhvZCwgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cAorICAgICAqIGNhbGxpbmcgZGVsaXZlclJlc3VsdCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBpbXBsZW1lbnRhdGlvbnMgbmVlZCB0byBwcm9jZXNzCisgICAgICogdGhlIHJlc3VsdHMgb24gdGhlIFVJIHRocmVhZCB0aGV5IG1heSBvdmVycmlkZSBkZWxpdmVyUmVzdWx0IGFuZCBkbyBzbworICAgICAqIHRoZXJlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEQgbG9hZEluQmFja2dyb3VuZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKaW5kZXggNjlmNzYxMS4uMmVhMGRmOTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQpAQCAtNDQsOSArNDQsOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogCiAvKioKQEAgLTQwMSw4ICs0MDEsNyBAQAogICAgIC8qKgogICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzCiAgICAgICogaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlfQotICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlKCl9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgorICAgICAqIG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIGFueSBmaWxlIHN0b3JlZCB0aGVyZS4KICAgICAgKgogICAgICAqIDxoNT5BY2NlcHRzIHRoZSBmb2xsb3dpbmcgVVJJIHNjaGVtZXM6PC9oNT4KICAgICAgKiA8dWw+CkBAIC0xMzQyLDcgKzEzNDEsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ3Vyc29yV3JhcHBlcklubmVyIGV4dGVuZHMgQ3Vyc29yV3JhcHBlciB7Ci0gICAgICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJDdXJzb3JXcmFwcGVySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlRmxhZyA9IGZhbHNlOwogCkBAIC0xMzcxLDcgKzEzNzAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBleHRlbmRzIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IlBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VQcm92aWRlckZsYWcgPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQppbmRleCAzMDgyMmQ0Li44NmRkZWU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC01ODgsNiArNTg5LDMyIEBACiAgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5KTsKIAogICAgIC8qKgorICAgICAqIE9wZW4gYSBuZXcgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250ZXh0J3MKKyAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQ3JlYXRlcyB0aGUgZGF0YWJhc2UgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgKHVuaXF1ZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSkgb2YgdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBtb2RlIE9wZXJhdGluZyBtb2RlLiAgVXNlIDAgb3Ige0BsaW5rICNNT0RFX1BSSVZBVEV9IGZvciB0aGUKKyAgICAgKiAgICAgZGVmYXVsdCBvcGVyYXRpb24sIHtAbGluayAjTU9ERV9XT1JMRF9SRUFEQUJMRX0KKyAgICAgKiAgICAgYW5kIHtAbGluayAjTU9ERV9XT1JMRF9XUklURUFCTEV9IHRvIGNvbnRyb2wgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIGZhY3RvcnkgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB0byBpbnN0YW50aWF0ZSBhCisgICAgICogICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIGlmIG51bGwsIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcn0gaXMgYXNzdW1lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiBhIG5ld2x5IGNyZWF0ZWQgZGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLgorICAgICAqCisgICAgICogQHNlZSAjTU9ERV9QUklWQVRFCisgICAgICogQHNlZSAjTU9ERV9XT1JMRF9SRUFEQUJMRQorICAgICAqIEBzZWUgI01PREVfV09STERfV1JJVEVBQkxFCisgICAgICogQHNlZSAjZGVsZXRlRGF0YWJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpOworCisgICAgLyoqCiAgICAgICogRGVsZXRlIGFuIGV4aXN0aW5nIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCiAgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4KICAgICAgKgpAQCAtMTM3Miw3ICsxMzk5LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5TT1JfU0VSVklDRSA9ICJzZW5zb3IiOwogICAgIAogICAgIC8qKgotICAgICAqIEBoaWRlCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhIHtAbGluawogICAgICAqIGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcn0gZm9yIGFjY2Vzc3Npbmcgc3lzdGVtIHN0b3JhZ2UKICAgICAgKiBmdW5jdGlvbnMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKaW5kZXggYTQ0NzEwOC4uM2Y1ZDIxNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0yMDQsNiArMjA1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBtQmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShuYW1lLCBtb2RlLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBtQmFzZS5kZWxldGVEYXRhYmFzZShuYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMwMzk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCisvKioKKyAqIEEgbG9hZGVyIHRoYXQgcXVlcmllcyB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gYW5kIHJldHVybnMgYSB7QGxpbmsgQ3Vyc29yfS4KKyAqLworcHVibGljIGNsYXNzIEN1cnNvckxvYWRlciBleHRlbmRzIEFzeW5jVGFza0xvYWRlcjxDdXJzb3I+IHsKKyAgICBDdXJzb3IgbUN1cnNvcjsKKyAgICBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIgbU9ic2VydmVyOworICAgIGJvb2xlYW4gbVN0b3BwZWQ7CisgICAgVXJpIG1Vcmk7CisgICAgU3RyaW5nW10gbVByb2plY3Rpb247CisgICAgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgU3RyaW5nIG1Tb3J0T3JkZXI7CisKKyAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgbG9hZEluQmFja2dyb3VuZCgpIHsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShtVXJpLCBtUHJvamVjdGlvbiwgbVNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgY3Vyc29yIHdpbmRvdyBpcyBmaWxsZWQKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJzb3I7CisgICAgfQorCisgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtU3RvcHBlZCkgeworICAgICAgICAgICAgLy8gQW4gYXN5bmMgcXVlcnkgY2FtZSBpbiB3aGlsZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CisgICAgICAgIHN1cGVyLmRlbGl2ZXJSZXN1bHQoY3Vyc29yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3Vyc29yTG9hZGVyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1PYnNlcnZlciA9IG5ldyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKTsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9hZGluZygpIHsKKyAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWxpdmVyUmVzdWx0KG1DdXJzb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yY2VMb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCAmJiAhbUN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dGVtcHQgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGxvYWQgdGFzayBpZiBwb3NzaWJsZS4KKyAgICAgICAgY2FuY2VsTG9hZCgpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFueSBvdXRzdGFuZGluZyBsb2FkcyBjbGVhbiB0aGVtc2VsdmVzIHVwIHByb3Blcmx5CisgICAgICAgIG1TdG9wcGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbGxlZChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiAhY3Vyc29yLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBsb2FkZXIgaXMgc3RvcHBlZAorICAgICAgICBzdG9wTG9hZGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBVcmkgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gbVVyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmkoVXJpIHVyaSkgeworICAgICAgICBtVXJpID0gdXJpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9qZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbVByb2plY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdGlvbihTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisgICAgICAgIG1Qcm9qZWN0aW9uID0gcHJvamVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFN0cmluZyBzZWxlY3Rpb24pIHsKKyAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VsZWN0aW9uQXJncygpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3Rpb25BcmdzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkFyZ3MoU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb3J0T3JkZXIoKSB7CisgICAgICAgIHJldHVybiBtU29ydE9yZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0MGU0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHBlcmZvcm1zIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIGRhdGEuIFdoaWxlIExvYWRlcnMgYXJlIGFjdGl2ZQorICogdGhleSBzaG91bGQgbW9uaXRvciB0aGUgc291cmNlIG9mIHRoZWlyIGRhdGEgYW5kIGRlbGl2ZXIgbmV3IHJlc3VsdHMgd2hlbiB0aGUgY29udGVudHMKKyAqIGNoYW5nZS4gCisgKgorICogQHBhcmFtIDxEPiBUaGUgcmVzdWx0IHJldHVybmVkIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIExvYWRlcjxEPiB7CisgICAgaW50IG1JZDsKKyAgICBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IG1MaXN0ZW5lcjsKKyAgICBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHVibGljIGZpbmFsIGNsYXNzIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHB1YmxpYyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKSB7CisgICAgICAgICAgICBzdXBlcihuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWxpdmVyU2VsZk5vdGlmaWNhdGlvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIGZvcmNlTG9hZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgTG9hZGVyIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlciB0aGF0IGNvbXBsZXRlZCB0aGUgbG9hZAorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhd2F5IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0LiBTaW5jZSBMb2FkZXJzIGNhbiBiZSB1c2VkCisgICAgICogYWNyb3NzIG11bHRpcGxlIGFjdGl2aXRpZXMgaXQncyBkYW5nZXJvdXMgdG8gc3RvcmUgdGhlIGNvbnRleHQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEQgZGF0YSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvYWRDb21wbGV0ZSh0aGlzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gYXBwbGljYXRpb24gY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgQ29udGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBzbyBpdCdzIHNhZmUgdG8gcGFzcyB0aGUgcmVzdWx0cyB0byB3aWRnZXRzLgorICAgICAqIAorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoaW50IGlkLCBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgYWxyZWFkeSBhIGxpc3RlbmVyIHJlZ2lzdGVyZWQiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgbUlkID0gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBsaXN0ZW5lciByZWdpc3RlciIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gdW5yZWdpc3RlciB0aGUgd3JvbmcgbGlzdGVuZXIiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhbiBhc3luY2hyb25vdXMgbG9hZCBvZiB0aGUgY29udGFjdHMgbGlzdCBkYXRhLiBXaGVuIHRoZSByZXN1bHQgaXMgcmVhZHkgdGhlIGNhbGxiYWNrcworICAgICAqIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuIElmIGEgcHJldmlvdXMgbG9hZCBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIGlzIHN0aWxsIHZhbGlkCisgICAgICogdGhlIHJlc3VsdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MgaW1tZWRpYXRlbHkuIFRoZSBsb2FkZXIgd2lsbCBtb25pdG9yIHRoZSBzb3VyY2Ugb2YKKyAgICAgKiB0aGUgZGF0YSBzZXQgYW5kIG1heSBkZWxpdmVyIGZ1dHVyZSBjYWxsYmFja3MgaWYgdGhlIHNvdXJjZSBjaGFuZ2VzLiBDYWxsaW5nCisgICAgICoge0BsaW5rICNzdG9wTG9hZGluZ30gd2lsbCBzdG9wIHRoZSBkZWxpdmVyeSBvZiBjYWxsYmFja3MuIAorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRMb2FkaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBhbiBhc3luY2hyb25vdXMgbG9hZC4gVW5saWtlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IHRoaXMgd2lsbCBpZ25vcmUgYSBwcmV2aW91c2x5CisgICAgICogbG9hZGVkIGRhdGEgc2V0IGFuZCBsb2FkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb3JjZUxvYWQoKTsKKworICAgIC8qKgorICAgICAqIFN0b3BzIGRlbGl2ZXJ5IG9mIHVwZGF0ZXMgdW50aWwgdGhlIG5leHQgdGltZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSBpcyBjYWxsZWQKKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3BMb2FkaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbG9hZGVyIGFuZCBmcmVlcyBpdHMgcmVzb3VyY2VzLCBtYWtpbmcgaXQgdW51c2FibGUuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXN0cm95KCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCmluZGV4IGExNWUyOWUuLjU4NDcyMTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGFuZCBtb2RpZnlpbmcgcHJlZmVyZW5jZSBkYXRhIHJldHVybmVkIGJ5IHtAbGluawpAQCAtNjksNiArNzAsMTcgQEAKICAgICAgICAgRWRpdG9yIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwogICAgICAgICAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHNldCBvZiBTdHJpbmcgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlcyBlZGl0b3IsIHRvIGJlIHdyaXR0ZW4KKyAgICAgICAgICogYmFjayBvbmNlIHtAbGluayAjY29tbWl0fSBpcyBjYWxsZWQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRvIG1vZGlmeS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgbmV3IHZhbHVlcyBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc2FtZSBFZGl0b3Igb2JqZWN0LCBzbyB5b3UgY2FuCisgICAgICAgICAqIGNoYWluIHB1dCBjYWxscyB0b2dldGhlci4KKyAgICAgICAgICovCisgICAgICAgIEVkaXRvciBwdXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gdmFsdWVzKTsKKyAgICAgICAgCisgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgYW4gaW50IHZhbHVlIGluIHRoZSBwcmVmZXJlbmNlcyBlZGl0b3IsIHRvIGJlIHdyaXR0ZW4gYmFjayBvbmNlCiAgICAgICAgICAqIHtAbGluayAjY29tbWl0fSBpcyBjYWxsZWQuCiAgICAgICAgICAqIApAQCAtMTg2LDYgKzE5OCwyMCBAQAogICAgIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZlZhbHVlKTsKICAgICAKICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHNldCBvZiBTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHByZWZlcmVuY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCisgICAgICogQHBhcmFtIGRlZlZhbHVlcyBWYWx1ZXMgdG8gcmV0dXJuIGlmIHRoaXMgcHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2UgdmFsdWVzIGlmIHRoZXkgZXhpc3QsIG9yIGRlZlZhbHVlcy4KKyAgICAgKiBUaHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJlZmVyZW5jZSB3aXRoIHRoaXMgbmFtZQorICAgICAqIHRoYXQgaXMgbm90IGEgU2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCisgICAgU2V0PFN0cmluZz4gZ2V0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IGRlZlZhbHVlcyk7CisgICAgCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgYW4gaW50IHZhbHVlIGZyb20gdGhlIHByZWZlcmVuY2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKaW5kZXggZDBiNjdjYy4uN2Y3NDliYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAoraW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIApAQCAtNTUsNiArNTcsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC0xMjYsMTQgKzEyOSwxMyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWkFUSU9OX1VOQklORF9ERUxBWV9NUyA9IDUwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0sgPSAiU3luY01hbmFnZXJTeW5jV2FrZUxvY2siOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1dBS0VfTE9DS19QUkVGSVggPSAiU3luY1dha2VMb2NrIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFX1NZTkNfQUxBUk1fV0FLRV9MT0NLID0gIlN5bmNNYW5hZ2VySGFuZGxlU3luY0FsYXJtV2FrZUxvY2siOwogCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBBY2NvdW50W10gbUFjY291bnRzID0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKIAotICAgIHZvbGF0aWxlIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CiAgICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbUhhbmRsZUFsYXJtV2FrZUxvY2s7CiAgICAgdm9sYXRpbGUgcHJpdmF0ZSBib29sZWFuIG1EYXRhQ29ubmVjdGlvbklzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgdm9sYXRpbGUgcHJpdmF0ZSBib29sZWFuIG1TdG9yYWdlSXNMb3cgPSBmYWxzZTsKQEAgLTE5NSw2ICsxOTcsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNjb3VudFtdIElOSVRJQUxfQUNDT1VOVFNfQVJSQVkgPSBuZXcgQWNjb3VudFswXTsKIAorICAgIHByaXZhdGUgZmluYWwgUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7CisKICAgICBwdWJsaWMgdm9pZCBvbkFjY291bnRzVXBkYXRlZChBY2NvdW50W10gYWNjb3VudHMpIHsKICAgICAgICAgLy8gcmVtZW1iZXIgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IHRpbWUgdGhpcyB3YXMgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZQogICAgICAgICBmaW5hbCBib29sZWFuIGp1c3RCb290ZWRVcCA9IG1BY2NvdW50cyA9PSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwpAQCAtMzU2LDE1ICszNjAsMTMgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NZ3IgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBtU3luY1dha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBTWU5DX1dBS0VfTE9DSyk7Ci0gICAgICAgIG1TeW5jV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CisgICAgICAgIG1Qb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKIAogICAgICAgICAvLyBUaGlzIFdha2VMb2NrIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgd2Ugc3RheSBhd2FrZSBiZXR3ZWVuIHRoZSB0aW1lIHRoYXQgd2UgcmVjZWl2ZQogICAgICAgICAvLyBhIHN5bmMgYWxhcm0gbm90aWZpY2F0aW9uIGFuZCB3aGVuIHdlIGZpbmlzaCBwcm9jZXNzaW5nIGl0LiBXZSBuZWVkIHRvIGRvIHRoaXMKICAgICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBkbyB0aGUgd29yayBpbiB0aGUgYWxhcm0gaGFuZGxlciwgcmF0aGVyIHdlIGRvIGl0IGluIGEgbWVzc2FnZQogICAgICAgICAvLyBoYW5kbGVyLgotICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywKKyAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2sgPSBtUG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICBIQU5ETEVfU1lOQ19BTEFSTV9XQUtFX0xPQ0spOwogICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKIApAQCAtMTMwMiw2ICsxMzA0LDkgQEAKICAgICAgICAgcHVibGljIGZpbmFsIFN5bmNOb3RpZmljYXRpb25JbmZvIG1TeW5jTm90aWZpY2F0aW9uSW5mbyA9IG5ldyBTeW5jTm90aWZpY2F0aW9uSW5mbygpOwogICAgICAgICBwcml2YXRlIExvbmcgbUFsYXJtU2NoZWR1bGVUaW1lID0gbnVsbDsKICAgICAgICAgcHVibGljIGZpbmFsIFN5bmNUaW1lVHJhY2tlciBtU3luY1RpbWVUcmFja2VyID0gbmV3IFN5bmNUaW1lVHJhY2tlcigpOworICAgICAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtU3luY1dha2VMb2NrOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sICBQb3dlck1hbmFnZXIuV2FrZUxvY2s+IG1XYWtlTG9ja3MgPQorICAgICAgICAgICAgICAgIE1hcHMubmV3SGFzaE1hcCgpOwogCiAgICAgICAgIC8vIHVzZWQgdG8gdHJhY2sgaWYgd2UgaGF2ZSBpbnN0YWxsZWQgdGhlIGVycm9yIG5vdGlmaWNhdGlvbiBzbyB0aGF0IHdlIGRvbid0IHJlaW5zdGFsbAogICAgICAgICAvLyBpdCBpZiBzeW5jIGlzIHN0aWxsIGZhaWxpbmcKQEAgLTEzMTUsNiArMTMyMCwxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgZ2V0U3luY1dha2VMb2NrKFN0cmluZyBhY2NvdW50VHlwZSwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgICAgICAgICAgZmluYWwgUGFpcjxTdHJpbmcsIFN0cmluZz4gd2FrZUxvY2tLZXkgPSBQYWlyLmNyZWF0ZShhY2NvdW50VHlwZSwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgIFBvd2VyTWFuYWdlci5XYWtlTG9jayB3YWtlTG9jayA9IG1XYWtlTG9ja3MuZ2V0KHdha2VMb2NrS2V5KTsKKyAgICAgICAgICAgIGlmICh3YWtlTG9jayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBTWU5DX1dBS0VfTE9DS19QUkVGSVggKyAiXyIgKyBhdXRob3JpdHkgKyAiXyIgKyBhY2NvdW50VHlwZTsKKyAgICAgICAgICAgICAgICB3YWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB3YWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtV2FrZUxvY2tzLnB1dCh3YWtlTG9ja0tleSwgd2FrZUxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdha2VMb2NrOworICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFJlYWR5VG9SdW4oKSB7CiAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG1SZWFkeVRvUnVuTGF0Y2g7CiAgICAgICAgICAgICBpZiAobGF0Y2ggIT0gbnVsbCkgewpAQCAtMTQ3Nyw4ICsxNDk0LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTeW5jSW5Qcm9ncmVzcyA9IG1BY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICghaXNTeW5jSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgICAgIGlmICghaXNTeW5jSW5Qcm9ncmVzcyAmJiBtU3luY1dha2VMb2NrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtYW5hZ2VTeW5jTm90aWZpY2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgbWFuYWdlRXJyb3JOb3RpZmljYXRpb24oKTsKQEAgLTE3MDQsNyArMTcyMiwyNiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSB3YWtlbG9jayBmb3IgdGhpcyBhY2NvdW50IGFuZCBhdXRob3JpdHkgYW5kIHN0b3JlIGl0IGluIG1TeW5jV2FrZUxvY2suCisgICAgICAgICAgICAvLyBCZSBzdXJlIHRvIHJlbGVhc2UgdGhlIHByZXZpb3VzIHdha2Vsb2NrIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIHdpdGggaXQgYmVpbmcKKyAgICAgICAgICAgIC8vIGhlbGQgdW50aWwgaXQgaXMgdXNlZCBhZ2Fpbi4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBhIGNvdXBsZSB0cmlja3kgdGhpbmdzIGFib3V0IHRoaXMgY29kZToKKyAgICAgICAgICAgIC8vIC0gbWFrZSBzdXJlIHRoYXQgd2UgYWNxdWlyZSB0aGUgbmV3IHdha2Vsb2NrIGJlZm9yZSByZWxlYXNpbmcgdGhlIG9sZCBvbmUsCisgICAgICAgICAgICAvLyAgIG90aGVyd2lzZSB0aGUgZGV2aWNlIG1pZ2h0IGdvIHRvIHNsZWVwIGFzIHNvb24gYXMgd2UgcmVsZWFzZSBpdC4KKyAgICAgICAgICAgIC8vIC0gc2luY2Ugd2UgdXNlIG5vbi1yZWZlcmVuY2UgY291bnRlZCB3YWtlbG9ja3Mgd2UgaGF2ZSB0byBiZSBzdXJlIG5vdCB0byBkbworICAgICAgICAgICAgLy8gICB0aGUgcmVsZWFzZSBpZiB0aGUgd2FrZWxvY2sgZGlkbid0IGNoYW5nZS4gT3RoZXdpc2Ugd2Ugd291bGQgZG8gYW4KKyAgICAgICAgICAgIC8vICAgYWNxdWlyZSBmb2xsb3dlZCBieSBhIHJlbGVhc2Ugb24gdGhlIHNhbWUgbG9jaywgcmVzdWx0aW5nIGluIG5vIGxvY2sKKyAgICAgICAgICAgIC8vICAgYmVpbmcgaGVsZC4KKyAgICAgICAgICAgIFBvd2VyTWFuYWdlci5XYWtlTG9jayBvbGRXYWtlTG9jayA9IG1TeW5jV2FrZUxvY2s7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sgPSBnZXRTeW5jV2FrZUxvY2sob3AuYWNjb3VudC50eXBlLCBvcC5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob2xkV2FrZUxvY2sgIT0gbnVsbCAmJiBvbGRXYWtlTG9jayAhPSBtU3luY1dha2VMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZFdha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2NoZWR1bGUgYW4gYWxhcm0sIGFzIHRoYXQgd2lsbCBiZSBkb25lIGJ5IG91ciBjYWxsZXIuCiAKICAgICAgICAgICAgIC8vIHRoZSBuZXh0IHN0ZXAgd2lsbCBvY2N1ciB3aGVuIHdlIGdldCBlaXRoZXIgYSB0aW1lb3V0IG9yIGEKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYWQzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIuT3BlblJlc291cmNlSWRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgcmVhZC1vbmx5IGNvbnRlbnQgcHJvdmlkZXIgd2hpY2ggZXh0cmFjdHMgZGF0YSBvdXQgb2YgYW4gWE1MIGRvY3VtZW50LgorICoKKyAqIDxwPkEgWFBhdGgtbGlrZSBzZWxlY3Rpb24gcGF0dGVybiBpcyB1c2VkIHRvIHNlbGVjdCBzb21lIG5vZGVzIGluIHRoZSBYTUwgZG9jdW1lbnQuIEVhY2ggc3VjaAorICogbm9kZSB3aWxsIGNyZWF0ZSBhIHJvdyBpbiB0aGUge0BsaW5rIEN1cnNvcn0gcmVzdWx0LjwvcD4KKyAqCisgKiBFYWNoIHJvdyBpcyB0aGVuIHBvcHVsYXRlZCB3aXRoIGNvbHVtbnMgdGhhdCBhcmUgYWxzbyBkZWZpbmVkIGFzIFhQYXRoLWxpa2UgcHJvamVjdGlvbnMuIFRoZXNlCisgKiBwcm9qZWN0aW9ucyBmZXRjaCBhdHRyaWJ1dGVzIHZhbHVlcyBvciB0ZXh0IGluIHRoZSBtYXRjaGluZyByb3cgbm9kZSBvciBpdHMgY2hpbGRyZW4uCisgKgorICogPHA+VG8gYWRkIHRoaXMgcHJvdmlkZXIgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IHNob3VsZCBhZGQgaXRzIGRlY2xhcmF0aW9uIHRvIHlvdXIgYXBwbGljYXRpb24KKyAqIG1hbmlmZXN0OgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O3Byb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlhtbERvY3VtZW50UHJvdmlkZXIiIGFuZHJvaWQ6YXV0aG9yaXRpZXM9InhtbGRvY3VtZW50IiAvJmd0OworICogPC9wcmU+CisgKiA8L3A+CisgKgorICogPGgyPk5vZGUgc2VsZWN0aW9uIHN5bnRheDwvaDI+CisgKiBUaGUgbm9kZSBzZWxlY3Rpb24gc3ludGF4IGlzIG1hZGUgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgYW4gYXJiaXRyYXJ5IG51bWJlciAoYXQgbGVhc3Qgb25lKSBvZgorICogPGNvZGU+L25vZGVfbmFtZTwvY29kZT4gbm9kZSBzZWxlY3Rpb24gcGF0dGVybnMuCisgKgorICogPHA+VGhlIDxjb2RlPi9yb290L2NoaWxkMS9jaGlsZDI8L2NvZGU+IHBhdHRlcm4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2ggYWxsIG5vZGVzIG5hbWVkCisgKiA8Y29kZT5jaGlsZDI8L2NvZGU+IHdoaWNoIGFyZSBjaGlsZHJlbiBvZiBhIG5vZGUgbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPiB3aGljaCBhcmUgdGhlbXNlbHZlcworICogY2hpbGRyZW4gb2YgYSByb290IG5vZGUgbmFtZWQgPGNvZGU+cm9vdDwvY29kZT4uPC9wPgorICoKKyAqIEFueSA8Y29kZT4vPC9jb2RlPiBzZXBhcmF0b3IgaW4gdGhlIHByZXZpb3VzIGV4cHJlc3Npb24gY2FuIGJlIHJlcGxhY2VkIGJ5IGEgPGNvZGU+Ly88L2NvZGU+CisgKiBzZXBhcmF0b3IgaW5zdGVhZCwgd2hpY2ggaW5kaWNhdGVkIGEgPGk+ZGVzY2VuZGFudDwvaT4gaW5zdGVhZCBvZiBhIGNoaWxkLgorICoKKyAqIDxwPlRoZSA8Y29kZT4vL25vZGUxLy9ub2RlMjwvY29kZT4gcGF0dGVybiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaCBhbGwgbm9kZXMgbmFtZWQKKyAqIDxjb2RlPm5vZGUyPC9jb2RlPiB3aGljaCBhcmUgZGVzY2VuZGFudCBvZiBhIG5vZGUgbmFtZWQgPGNvZGU+bm9kZTE8L2NvZGU+IGxvY2F0ZWQgYW55d2hlcmUgaW4KKyAqIHRoZSBkb2N1bWVudCBoaWVyYXJjaHkuPC9wPgorICoKKyAqIE5vZGUgbmFtZXMgY2FuIGNvbnRhaW4gbmFtZXNwYWNlcyBpbiB0aGUgZm9ybSA8Y29kZT5uYW1lc3BhY2U6bm9kZTwvY29kZT4uCisgKgorICogPGgyPlByb2plY3Rpb24gc3ludGF4PC9oMj4KKyAqIEZvciBldmVyeSBzZWxlY3RlZCBub2RlLCB0aGUgcHJvamVjdGlvbiB3aWxsIHRoZW4gZXh0cmFjdCBhY3R1YWwgZGF0YSBmcm9tIHRoaXMgbm9kZSBhbmQgaXRzCisgKiBkZXNjZW5kYW50LgorICoKKyAqIDxwPlVzZSBhIHN5bnRheCBzaW1pbGFyIHRvIHRoZSBzZWxlY3Rpb24gc3ludGF4IGRlc2NyaWJlZCBhYm92ZSB0byBzZWxlY3QgdGhlIHRleHQgYXNzb2NpYXRlZAorICogd2l0aCBhIGNoaWxkIG9mIHRoZSBzZWxlY3RlZCBub2RlLiBUaGUgaW1wbGljaXQgcm9vdCBvZiB0aGlzIHByb2plY3Rpb24gcGF0dGVybiBpcyB0aGUgc2VsZWN0ZWQKKyAqIG5vZGUuIDxjb2RlPi88L2NvZGU+IHdpbGwgaGVuY2UgcmVmZXIgdG8gdGhlIHRleHQgb2YgdGhlIHNlbGVjdGVkIG5vZGUsIHdoaWxlCisgKiA8Y29kZT4vY2hpbGQxPC9jb2RlPiB3aWxsIGZldGNoIHRoZSB0ZXh0IG9mIGl0cyBjaGlsZCBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+IGFuZAorICogPGNvZGU+Ly9jaGlsZDE8L2NvZGU+IHdpbGwgbWF0Y2ggYW55IDxpPmRlc2NlbmRhbnQ8L2k+IG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4uIElmIHNldmVyYWwKKyAqIG5vZGVzIG1hdGNoIHRoZSBwcm9qZWN0aW9uIHBhdHRlcm4sIHRoZWlyIHRleHRzIGFyZSBhcHBlbmRlZCBhcyBhIHJlc3VsdC48L3A+CisgKgorICogQSBwcm9qZWN0aW9uIGNhbiBhbHNvIGZldGNoIGFueSBub2RlIGF0dHJpYnV0ZSBieSBhcHBlbmRpbmcgYSA8Y29kZT5AYXR0cmlidXRlX25hbWU8L2NvZGU+CisgKiBwYXR0ZXJuIHRvIHRoZSBwcmV2aW91c2x5IGRlc2NyaWJlZCBzeW50YXguIDxjb2RlPi8vY2hpbGQxQHByaWNlPC9jb2RlPiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaAorICogdGhlIGF0dHJpYnV0ZSA8Y29kZT5wcmljZTwvY29kZT4gb2YgYW55IDxjb2RlPmNoaWxkMTwvY29kZT4gZGVzY2VuZGFudC4KKyAqCisgKiA8cD5JZiBhIHByb2plY3Rpb24gZG9lcyBub3QgbWF0Y2ggYW55IG5vZGUvYXR0cmlidXRlLCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSB3aWxsIGJlIGFuIGVtcHR5CisgKiBzdHJpbmcuPC9wPgorICoKKyAqIDxoMj5FeGFtcGxlPC9oMj4KKyAqIFVzaW5nIHRoZSBmb2xsb3dpbmcgWE1MIGRvY3VtZW50OgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O2xpYnJhcnkmZ3Q7CisgKiAgICZsdDtib29rIGlkPSJFSDk0IiZndDsKKyAqICAgICAmbHQ7dGl0bGUmZ3Q7VGhlIE9sZCBNYW4gYW5kIHRoZSBTZWEmbHQ7L3RpdGxlJmd0OworICogICAgICZsdDthdXRob3ImZ3Q7RXJuZXN0IEhlbWluZ3dheSZsdDsvYXV0aG9yJmd0OworICogICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDtib29rIGlkPSJYWDEwIiZndDsKKyAqICAgICAmbHQ7dGl0bGUmZ3Q7VGhlIEFyYWJpYW4gTmlnaHRzOiBUYWxlcyBvZiAxLDAwMSBOaWdodHMmbHQ7L3RpdGxlJmd0OworICogICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDtuby1pZCZndDsKKyAqICAgICAmbHQ7Ym9vayZndDsKKyAqICAgICAgICZsdDt0aXRsZSZndDtBbmltYWwgRmFybSZsdDsvdGl0bGUmZ3Q7CisgKiAgICAgICAmbHQ7YXV0aG9yJmd0O0dlb3JnZSBPcndlbGwmbHQ7L2F1dGhvciZndDsKKyAqICAgICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDsvbm8taWQmZ3Q7CisgKiAmbHQ7L2xpYnJhcnkmZ3Q7CisgKiA8L3ByZT4KKyAqIEEgc2VsZWN0aW9uIHBhdHRlcm4gb2YgPGNvZGU+L2xpYnJhcnkvL2Jvb2s8L2NvZGU+IHdpbGwgbWF0Y2ggdGhlIHRocmVlIGJvb2sgZW50cmllcyAod2hpbGUKKyAqIDxjb2RlPi9saWJyYXJ5L2Jvb2s8L2NvZGU+IHdpbGwgb25seSBtYXRjaCB0aGUgZmlyc3QgdHdvIG9uZXMpLgorICoKKyAqIDxwPkRlZmluaW5nIHRoZSBwcm9qZWN0aW9ucyBhcyA8Y29kZT4vdGl0bGU8L2NvZGU+LCA8Y29kZT4vYXV0aG9yPC9jb2RlPiBhbmQgPGNvZGU+QGlkPC9jb2RlPgorICogd2lsbCByZXRyaWV2ZSB0aGUgYXNzb2NpYXRlZCBkYXRhLiBOb3RlIHRoYXQgdGhlIGF1dGhvciBvZiB0aGUgc2Vjb25kIGJvb2sgYXMgd2VsbCBhcyB0aGUgaWQgb2YKKyAqIHRoZSB0aGlyZCBhcmUgZW1wdHkgc3RyaW5ncy4KKyAqLworcHVibGljIGNsYXNzIFhtbERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIC8qCisgICAgICogSWRlYXMgZm9yIGltcHJvdmVtZW50OgorICAgICAqIC0gRXhwYW5kIFhQYXRoLWxpa2Ugc3ludGF4IHRvIGFsbG93IGZvciBbbmJdIGNoaWxkIG51bWJlciBzZWxlY3RvcgorICAgICAqIC0gQWRkcmVzcyB0aGUgc3RhcnRpbmcgLiBidWcgaW4gQWJzdHJhY3RDdXJzb3Igd2hpY2ggcHJldmVudHMgYSB0cnVlIFhQYXRoIHN5bnRheC4KKyAgICAgKiAtIFByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgdG8gY29uY2F0ZW5hdGlvbiB3aGVuIHNldmVyYWwgbm9kZSBtYXRjaCAobGlzdC1saWtlKS4KKyAgICAgKiAtIFN1cHBvcnQgbmFtZXNwYWNlcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCisgICAgICogLSBJbmNyZW1lbnRhbCBDdXJzb3IgY3JlYXRpb24sIHBhZ2luYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJYbWxEb2N1bWVudFByb3ZpZGVyIjsKKyAgICBwcml2YXRlIEFuZHJvaWRIdHRwQ2xpZW50IG1IdHRwQ2xpZW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGRhdGEgZnJvbSB0aGUgWE1MIGRvY3VtZW50IHJlZmVyZW5jZWQgaW4gdGhlIFVSSS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBYTUwgZG9jdW1lbnQgY2FuIGJlIGEgbG9jYWwgcmVzb3VyY2Ugb3IgYSBmaWxlIHRoYXQgd2lsbCBiZSBkb3dubG9hZGVkIGZyb20gdGhlCisgICAgICogSW50ZXJuZXQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0byByZXF1ZXN0IHRoZSBJTlRFUk5FVCBwZXJtaXNzaW9uIGluCisgICAgICogaXRzIG1hbmlmZXN0LjwvcD4KKyAgICAgKgorICAgICAqIFRoZSBVUkkgd2lsbCBiZSBvZiB0aGUgZm9ybSA8Y29kZT5jb250ZW50Oi8veG1sZG9jdW1lbnQvP3Jlc291cmNlPVIueG1sLm15RmlsZTwvY29kZT4gZm9yIGEKKyAgICAgKiBsb2NhbCByZXNvdXJjZS4gPGNvZGU+eG1sZG9jdW1lbnQ8L2NvZGU+IHNob3VsZCBtYXRjaCB0aGUgYXV0aG9yaXR5IGRlY2xhcmVkIGZvciB0aGlzCisgICAgICogcHJvdmlkZXIgaW4geW91ciBtYW5pZmVzdC4gSW50ZXJuZXQgZG9jdW1lbnRzIGFyZSByZWZlcmVuY2VkIHVzaW5nCisgICAgICogPGNvZGU+Y29udGVudDovL3htbGRvY3VtZW50Lz91cmw9PC9jb2RlPiBmb2xsb3dlZCBieSBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIFVSTCBvZiB5b3VyCisgICAgICogZG9jdW1lbnQgKHNlZSB7QGxpbmsgVXJpI2VuY29kZShTdHJpbmcpfSkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHJlc3VsdGluZyBDdXJzb3IgaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHByb2plY3Rpb24KKyAgICAgKiBhcnJheSBwbHVzIG9uZSwgbmFtZWQgPGNvZGU+X2lkPC9jb2RlPiB3aGljaCB3aWxsIGNvbnRhaW4gYSB1bmlxdWUgcm93IGlkIChhbGxvd2luZyB0aGUKKyAgICAgKiBDdXJzb3IgdG8gYmUgdXNlZCB3aXRoIGEge0BsaW5rIEN1cnNvckFkYXB0ZXJ9KS4gVGhlIG90aGVyIGNvbHVtbnMnIG5hbWVzIGFyZSB0aGUgcHJvamVjdGlvbgorICAgICAqIHBhdHRlcm5zLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB5b3VyIGxvY2FsIHJlc291cmNlIG9yIEludGVybmV0IGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIEEgc2V0IG9mIHBhdHRlcm5zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGVhY2ggc2VsZWN0ZWQKKyAgICAgKiBub2RlLiBTZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgcGF0dGVybiBzeW50YXguCisgICAgICogQHBhcmFtIHNlbGVjdGlvbiBBIHNlbGVjdGlvbiBwYXR0ZXJuIHdoaWNoIHdpbGwgc2VsZWN0IHRoZSBub2RlcyB0aGF0IHdpbGwgY3JlYXRlIHRoZQorICAgICAqIEN1cnNvcidzIHJvd3MuIFNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBwYXR0ZXJuIHN5bnRheC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzb3J0T3JkZXIgVGhlIHJvdyBvcmRlciBpbiB0aGUgcmVzdWx0aW5nIGN1cnNvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIG5vZGUgb3JkZXIgaW4KKyAgICAgKiB0aGUgWE1MIGRvY3VtZW50LiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gQSBDdXJzb3Igb3IgbnVsbCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKKworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIG1IdHRwQ2xpZW50ID0gbnVsbDsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJ1cmwiKTsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRVcmlYbWxQdWxsUGFyc2VyKHVybCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2UgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoInJlc291cmNlIik7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFVyaSByZXNvdXJjZVVyaSA9IFVyaS5wYXJzZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UgKyAiOi8vIiArCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSArICIvIiArIHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIocmVzb3VyY2VVcmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSB7CisgICAgICAgICAgICBYTUxDdXJzb3IgeG1sQ3Vyc29yID0gbmV3IFhNTEN1cnNvcihzZWxlY3Rpb24sIHByb2plY3Rpb24pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB4bWxDdXJzb3IucGFyc2VXaXRoKHBhcnNlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHhtbEN1cnNvcjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSS9PIGVycm9yIHdoaWxlIHBhcnNpbmcgWE1MICIgKyB1cmksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHBhcnNpbmcgWE1MICIgKyB1cmksIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAobUh0dHBDbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSHR0cENsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sUHVsbFBhcnNlciBmb3IgdGhlIHByb3ZpZGVkIFVSTC4gQ2FuIGJlIG92ZXJsb2FkZWQgdG8gcHJvdmlkZSB5b3VyIG93biBwYXJzZXIuCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBYTUwgZG9jdW1lbnQgdGhhdCBpcyB0byBiZSBwYXJzZWQuCisgICAgICogQHJldHVybiBBbiBYbWxQdWxsUGFyc2VyIG9uIHRoaXMgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbFB1bGxQYXJzZXIgZ2V0VXJpWG1sUHVsbFBhcnNlcihTdHJpbmcgdXJsKSB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIHBhcnNlciA9IGZhY3RvcnkubmV3UHVsbFBhcnNlcigpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gY3JlYXRlIFhtbFB1bGxQYXJzZXIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldCh1cmwpOworICAgICAgICAgICAgbUh0dHBDbGllbnQgPSBBbmRyb2lkSHR0cENsaWVudC5uZXdJbnN0YW5jZSgiQW5kcm9pZCIpOworICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbUh0dHBDbGllbnQuZXhlY3V0ZShnZXQpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgeworICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSByZXRyaWV2aW5nIFhNTCBmaWxlICIgKyB1cmwsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KGlucHV0U3RyZWFtLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBYTUwgZmlsZSBmcm9tICIgKyB1cmwsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sUHVsbFBhcnNlciBmb3IgdGhlIHByb3ZpZGVkIGxvY2FsIHJlc291cmNlLiBDYW4gYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHlvdXIKKyAgICAgKiBvd24gcGFyc2VyLgorICAgICAqIEBwYXJhbSByZXNvdXJjZVVyaSBBIGZ1bGx5IHF1YWxpZmllZCByZXNvdXJjZSBuYW1lIHJlZmVyZW5jaW5nIGEgbG9jYWwgWE1MIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gQW4gWG1sUHVsbFBhcnNlciBvbiB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBYbWxQdWxsUGFyc2VyIGdldFJlc291cmNlWG1sUHVsbFBhcnNlcihVcmkgcmVzb3VyY2VVcmkpIHsKKyAgICAgICAgT3BlblJlc291cmNlSWRSZXN1bHQgcmVzb3VyY2VJZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlSWQgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuZ2V0UmVzb3VyY2VJZChyZXNvdXJjZVVyaSk7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VJZC5yLmdldFhtbChyZXNvdXJjZUlkLmlkKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJYTUwgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzb3VyY2VVcmkudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIveG1sZG9jIi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIveG1sZG9jIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhNTEN1cnNvciBleHRlbmRzIE1hdHJpeEN1cnNvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBtU2VsZWN0aW9uUGF0dGVybjsKKyAgICAgICAgcHJpdmF0ZSBQYXR0ZXJuW10gbVByb2plY3Rpb25QYXR0ZXJuczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQXR0cmlidXRlTmFtZXM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbUN1cnJlbnRWYWx1ZXM7CisgICAgICAgIHByaXZhdGUgQml0U2V0W10gbUFjdGl2ZVRleHREZXB0aE1hc2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1OdW1iZXJPZlByb2plY3Rpb25zOworCisgICAgICAgIHB1YmxpYyBYTUxDdXJzb3IoU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gcHJvamVjdGlvbnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb2plY3Rpb25zKTsKKyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjb2x1bW4gaW4gcHJvamVjdGlvbnMgaXMgdXNlZCBmb3IgdGhlIF9JRAorICAgICAgICAgICAgbU51bWJlck9mUHJvamVjdGlvbnMgPSBwcm9qZWN0aW9ucy5sZW5ndGggLSAxOworICAgICAgICAgICAgbVNlbGVjdGlvblBhdHRlcm4gPSBjcmVhdGVQYXR0ZXJuKHNlbGVjdGlvbik7CisgICAgICAgICAgICBjcmVhdGVQcm9qZWN0aW9uUGF0dGVybihwcm9qZWN0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gaW5wdXQucmVwbGFjZUFsbCgiLy8iLCAiLyguKi98KSIpLnJlcGxhY2VBbGwoIl4vIiwgIl4vIikgKyAiJCI7CisgICAgICAgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3Rpb25QYXR0ZXJuKFN0cmluZ1tdIHByb2plY3Rpb25zKSB7CisgICAgICAgICAgICBtUHJvamVjdGlvblBhdHRlcm5zID0gbmV3IFBhdHRlcm5bbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzID0gbmV3IFN0cmluZ1ttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFzayA9IG5ldyBCaXRTZXRbbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgLy8gQWRkIGEgY29sdW1uIHRvIHN0b3JlIF9JRAorICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXMgPSBuZXcgU3RyaW5nW21OdW1iZXJPZlByb2plY3Rpb25zICsgMV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0gPSBuZXcgQml0U2V0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uc1tpICsgMV07IC8vICsxIHRvIHNraXAgdGhlIF9JRCBjb2x1bW4KKyAgICAgICAgICAgICAgICBpbnQgYXRJbmRleCA9IHByb2plY3Rpb24ubGFzdEluZGV4T2YoJ0AnLCBwcm9qZWN0aW9uLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lc1tpXSA9IHByb2plY3Rpb24uc3Vic3RyaW5nKGF0SW5kZXgrMSk7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uLnN1YnN0cmluZygwLCBhdEluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENvbmZvcm1zIHRvIFhQYXRoIHN0YW5kYXJkOiByZWZlcmVuY2UgdG8gbG9jYWwgY29udGV4dCBzdGFydHMgd2l0aCBhIC4KKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbi5jaGFyQXQoMCkgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVByb2plY3Rpb25QYXR0ZXJuc1tpXSA9IGNyZWF0ZVBhdHRlcm4ocHJvamVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZVdpdGgoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgU3RhY2s8SW50ZWdlcj4gcGF0aExlbmd0aFN0YWNrID0gbmV3IFN0YWNrPEludGVnZXI+KCk7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcGFyc2luZyBtb2RlOiBpbiByb290IG1vZGUsIHJvb3RQYXRoIGlzIHVwZGF0ZWQgYW5kIG5vZGVzIG1hdGNoaW5nCisgICAgICAgICAgICAvLyBzZWxlY3Rpb25QYXR0ZXJuIGFyZSBzZWFyY2hlZCBmb3IgYW5kIGN1cnJlbnROb2RlRGVwdGggaXMgbmVnYXRpdmUuCisgICAgICAgICAgICAvLyBXaGVuIGEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb25QYXR0ZXJuIGlzIGZvdW5kLCBjdXJyZW50Tm9kZURlcHRoIGlzIHNldCB0byAwIGFuZAorICAgICAgICAgICAgLy8gdXBkYXRlZCBhcyBjaGlsZHJlbiBhcmUgcGFyc2VkIGFuZCBwcm9qZWN0aW9uUGF0dGVybnMgYXJlIHNlYXJjaGVkIGluIG5vZGVQYXRoLgorICAgICAgICAgICAgaW50IGN1cnJlbnROb2RlRGVwdGggPSAtMTsKKworICAgICAgICAgICAgLy8gSW5kZXggd2hlcmUgbG9jYWwgc2VsZWN0ZWQgbm9kZSBwYXRoIHN0YXJ0cyBmcm9tIGluIHBhdGgKKyAgICAgICAgICAgIGludCBjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4ID0gMDsKKworICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlIChldmVudFR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aFN0YWNrLnB1c2gocGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0UHJlZml4IGlzIG5vdCBzdXBwb3J0ZWQgYnkgbG9jYWwgWG1sIHJlc291cmNlIHBhcnNlcgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyc2VyLmdldFByZWZpeCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChwYXJzZXIuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGlzIGZvdW5kOiBpbml0aWFsaXplIGNoaWxkIHBhcnNpbmcgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25QYXR0ZXJuLm1hdGNoZXIocGF0aC50b1N0cmluZygpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4ID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1swXSA9IEludGVnZXIudG9TdHJpbmcoZ2V0Q291bnQoKSk7IC8vIF9JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB2YWx1ZXMgdG8gZGVmYXVsdCAoZW1wdHkgc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBvbmUgYXMgY3VycmVudE5vZGVEZXB0aCBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYmUgbW9kaWZpZWQgYWJvdmUgKHdoZW4gYSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvbiBpcyBmb3VuZCkuCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5vZGVQYXRoID0gcGF0aC5zdWJzdHJpbmcoY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByb2plY3Rpb25QYXR0ZXJuc1tpXS5tYXRjaGVyKGxvY2FsTm9kZVBhdGgpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbUF0dHJpYnV0ZU5hbWVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5zZXQoY3VycmVudE5vZGVEZXB0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykgeworICAgICAgICAgICAgICAgICAgICAvLyBQb3AgbGFzdCBub2RlIGZyb20gcGF0aAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcGF0aExlbmd0aFN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBwYXRoLnNldExlbmd0aChsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWF2aW5nIGEgc2VsZWN0aW9uIG1hdGNoaW5nIG5vZGU6IGFkZCBhIG5ldyByb3cgd2l0aCByZXN1bHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUm93KG1DdXJyZW50VmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLnNldChjdXJyZW50Tm9kZURlcHRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aC0tOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSAmJiAoIXBhcnNlci5pc1doaXRlc3BhY2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uZ2V0KGN1cnJlbnROb2RlRGVwdGgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSArPSBwYXJzZXIuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCmluZGV4IDc5MDFiMTU1Li4zNWYyMmRjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKQEAgLTI4NCw2ICsyODQsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hFQVZZX1dFSUdIVCA9IDE8PDIwOwogICAgIAogICAgIC8qKgorICAgICAqIFZhbHVlIGZvciB7QGxpbmsgI2ZsYWdzfTogdHJ1ZSB3aGVuIHRoZSBhcHBsaWNhdGlvbidzIHJlbmRlcmluZyBzaG91bGQKKyAgICAgKiBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEID0gMTw8MjE7CisgICAgCisgICAgLyoqCiAgICAgICogVmFsdWUgZm9yIHtAbGluayAjZmxhZ3N9OiB0aGlzIGlzIHRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBzZXQKICAgICAgKiBpdHMgYW5kcm9pZDpuZXZlckVuY3J5cHQgdG8gdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlLiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkKICAgICAgKiB0aGF0IHRoaXMgcGFja2FnZSBzcGVjaWZpY2FsbHkgIm9wdHMtb3V0IiBvZiBhIHNlY3VyZWQgZmlsZSBzeXN0ZW0gc29sdXRpb24sCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCmluZGV4IDVkYzQxZDIuLjYwOTg2MTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCkBAIC0xNTM2LDYgKzE1MzYsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICBhaS5mbGFncyB8PSBBcHBsaWNhdGlvbkluZm8uRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhc0NvZGUsCiAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKICAgICAgICAgICAgIGFpLmZsYWdzIHw9IEFwcGxpY2F0aW9uSW5mby5GTEFHX0hBU19DT0RFOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKaW5kZXggYTVlNWU0Ni4uODBlYjE4YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCkBAIC0xOCwxNiArMTgsMTEgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtNTYsNiArNTEsMTAgQEAKICAgICBhYnN0cmFjdCBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uKTsKICAgICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbik7CiAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKICAgICAvLyBUT0RPIGltcGxlbWVudCBnZXRCbG9iIGluIGFsbCBjdXJzb3IgdHlwZXMKICAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImdldEJsb2IgaXMgbm90IHN1cHBvcnRlZCIpOwpAQCAtODgsNyArODcsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1EYXRhU2V0T2JzZXJ2YWJsZS5ub3RpZnlJbnZhbGlkYXRlZCgpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CiAgICAgICAgIGlmIChtU2VsZk9ic2VydmVyICE9IG51bGwgJiYgbVNlbGZPYnNlcnZlclJlZ2lzdGVyZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobU5vdGlmeVVyaSwgdHJ1ZSwgbVNlbGZPYnNlcnZlcik7CkBAIC0xMDksMjIgKzEwOCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLD8gZXh0ZW5kcyBNYXA8U3RyaW5nLE9iamVjdD4+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGN1cnNvciBpcyBzdWNjZXNzZnVsbHkgc2Nyb2xsZWQKICAgICAgKiB0byBhIG5ldyBwb3NpdGlvbiwgZ2l2aW5nIHRoZSBzdWJjbGFzcyBhIGNoYW5jZSB0byB1cGRhdGUgYW55IHN0YXRlIGl0CiAgICAgICogbWF5IGhhdmUuIElmIGl0IHJldHVybnMgZmFsc2UgdGhlIG1vdmUgZnVuY3Rpb24gd2lsbCBhbHNvIGRvIHNvIGFuZCB0aGUKQEAgLTMyMCwxMzcgKzMwMyw2IEBACiAgICAgICAgIHJldHVybiBnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgU2hvcnQudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgSW50ZWdlci52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIExvbmcudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVGbG9hdChpbnQgY29sdW1uSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIEZsb2F0LnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIERvdWJsZS52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZShpbnQgY29sdW1uSW5kZXgsIE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9uZy52YWx1ZU9mKCkgcmV0dXJucyBudWxsIHNvbWV0aW1lcyEKLS8vICAgICAgICBMb25nIHJvd2lkID0gTG9uZy52YWx1ZU9mKGdldExvbmcobVJvd0lkQ29sdW1uSW5kZXgpKTsKLSAgICAgICAgTG9uZyByb3dpZCA9IG5ldyBMb25nKGdldExvbmcobVJvd0lkQ29sdW1uSW5kZXgpKTsKLSAgICAgICAgaWYgKHJvd2lkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgcm93aWQuIG1Sb3dJZENvbHVtbkluZGV4ID0gIiArIG1Sb3dJZENvbHVtbkluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gbVVwZGF0ZWRSb3dzLmdldChyb3dpZCk7Ci0gICAgICAgICAgICBpZiAocm93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0KHJvd2lkLCByb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93LnB1dChnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XSwgb2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIHJldHVybiBtVXBkYXRlZFJvd3Muc2l6ZSgpID4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb21taXRVcGRhdGVzKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtUm93SWRDb2x1bW5JbmRleCAhPSAtMTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbUNvbnRlbnRPYnNlcnZhYmxlLnJlZ2lzdGVyT2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQppbmRleCAyN2EwMmUyLi5lNDdkOWNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCkBAIC0xNDksNjMgKzE0OSwzNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNOdWxsKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0VHlwZShtUG9zLCBjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KQorICAgIHB1YmxpYyBib29sZWFuIGlzQmxvYihpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX0JMT0I7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkKICAgICB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQogICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7CiAgICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IG9iamVjdCBpbnN0YW5jZW9mIGJ5dGVbXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5nZXRUeXBlT2ZPYmplY3QoZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0Jsb2IobVBvcywgY29sdW1uSW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzU3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgKG9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIgfHwgb2JqZWN0IGluc3RhbmNlb2YgTG9uZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0xvbmcobVBvcywgY29sdW1uSW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgKG9iamVjdCBpbnN0YW5jZW9mIEZsb2F0IHx8IG9iamVjdCBpbnN0YW5jZW9mIERvdWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0Zsb2F0KG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0VHlwZShtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKaW5kZXggYmFhOTRkOC4uZmE2MmQ2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQpAQCAtMTcsMTMgKzE3LDEwIEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIE5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVsayBjdXJzb3IuIFRoaXMgaXMgb25seSBmb3IgdXNlIGluIGltcGxlbWVudGluZwpAQCAtMTIwLDI2ICsxMTcsNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9ST1dTX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHdoYXQgQ2xhc3NMb2FkZXIgc2hvdWxkIGJlIHBhc3NlZCB0byByZWFkSGFzaE1hcD8KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHN3aXRjaCB0byBCdW5kbGUKLSAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxMb25nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMgPSBkYXRhLnJlYWRIYXNoTWFwKG51bGwpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHVwZGF0ZVJvd3ModmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgocmVzdWx0ID09IHRydWUgPyAxIDogMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERFTEVURV9ST1dfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBkZWxldGVSb3cocG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KChyZXN1bHQgPT0gdHJ1ZSA/IDEgOiAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGNhc2UgT05fTU9WRV9UUkFOU0FDVElPTjogewogICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGRhdGEucmVhZEludCgpOwpAQCAtMzQzLDQ4ICszMjAsNiBAQAogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlUm93cyhNYXAgdmFsdWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwotCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLQotICAgICAgICBkYXRhLndyaXRlTWFwKHZhbHVlcyk7Ci0KLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChVUERBVEVfUk9XU19UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwotCi0gICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAocmVwbHkucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2UpOwotCi0gICAgICAgIGRhdGEucmVjeWNsZSgpOwotICAgICAgICByZXBseS5yZWN5Y2xlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwotCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50KHBvc2l0aW9uKTsKLQotICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERFTEVURV9ST1dfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKLQotICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHJlcGx5LnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCmluZGV4IDE0NjllYTIuLjJjYjJhZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKQEAgLTE2LDEyICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogLyoqCiAgKiBBZGFwdHMgYW4ge0BsaW5rIElCdWxrQ3Vyc29yfSB0byBhIHtAbGluayBDdXJzb3J9IGZvciB1c2UgaW4gdGhlIGxvY2FsCiAgKiBwcm9jZXNzLgpAQCAtMTc0LDM4ICsxNzIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUJ1bGtDdXJzb3IuZGVsZXRlUm93KG1Qb3MpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgY29udGFpbnMgdGhlIG9sZCB2YWx1ZSwgZGlzY2FyZCBpdAotICAgICAgICAgICAgICAgIG1XaW5kb3cgPSBudWxsOwotICAgIAotICAgICAgICAgICAgICAgIC8vIEZpeCB1cCB0aGUgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBtQ291bnQgPSBtQnVsa0N1cnNvci5jb3VudCgpOwotICAgICAgICAgICAgICAgIGlmIChtUG9zIDwgbUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvbGRQb3MgPSBtUG9zOwotICAgICAgICAgICAgICAgICAgICBtUG9zID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVUb1Bvc2l0aW9uKG9sZFBvcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcyA9IG1Db3VudDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBkZWxldGUgcm93IGJlY2F1c2UgdGhlIHJlbW90ZSBwcm9jZXNzIGlzIGRlYWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKICAgICAgICAgaWYgKG1Db2x1bW5zID09IG51bGwpIHsKQEAgLTIxOSw0NCArMTg1LDYgQEAKICAgICAgICAgcmV0dXJuIG1Db2x1bW5zOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZywKLSAgICAgICAgICAgID8gZXh0ZW5kcyBNYXA8U3RyaW5nLE9iamVjdD4+IGFkZGl0aW9uYWxWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY29tbWl0VXBkYXRlcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY3Vyc29yLCBkaWQgeW91IGluY2x1ZGUgdGhlIF9pZCBjb2x1bW4/Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoYWRkaXRpb25hbFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dEFsbChhZGRpdGlvbmFsVmFsdWVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1VcGRhdGVkUm93cy5zaXplKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1CdWxrQ3Vyc29yLnVwZGF0ZVJvd3MobVVwZGF0ZWRSb3dzKTsKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBjb21taXQgdXBkYXRlcyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvci5qYXZhCmluZGV4IDY1MzkxNTYuLmMwM2M1ODYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvci5qYXZhCkBAIC0zMCw2ICszMCwyNSBAQAogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBDdXJzb3IuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ3Vyc29yIHsKKyAgICAvKgorICAgICAqIFZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0uCisgICAgICogVGhlc2Ugc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyBkZWZpbmVkIGluIEN1cnNvcldpbmRvdy5oCisgICAgICovCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBudWxsICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX05VTEwgPSAwOworCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkICBjb2x1bW4gdHlwZSBpcyBpbnRlZ2VyICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX0lOVEVHRVIgPSAxOworCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGlzIGZsb2F0ICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX0ZMT0FUID0gMjsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBzdHJpbmcgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfU1RSSU5HID0gMzsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBibG9iICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX0JMT0IgPSA0OworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVycyBvZiByb3dzIGluIHRoZSBjdXJzb3IuCiAgICAgICoKQEAgLTE0NiwyMiArMTY1LDYgQEAKICAgICBib29sZWFuIGlzQWZ0ZXJMYXN0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSByb3cgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YQotICAgICAqIHN0b3JlLiBBZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjdXJzb3Igd2lsbCBiZSBwb2ludGluZyB0byB0aGUgcm93Ci0gICAgICogYWZ0ZXIgdGhlIHJvdyB0aGF0IGlzIGRlbGV0ZWQuIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBkZWNyZW1lbnRpbmcKLSAgICAgKiB0aGUgcmVzdWx0IG9mIGNvdW50KCkgYnkgb25lLgotICAgICAqIDxwPgotICAgICAqIFRoZSBxdWVyeSBtdXN0IGhhdmUgdGhlIHJvdyBJRCBjb2x1bW4gaW4gaXRzIHNlbGVjdGlvbiwgb3RoZXJ3aXNlIHRoaXMKLSAgICAgKiBjYWxsIHdpbGwgZmFpbC4KLSAgICAgKiAKLSAgICAgKiBAaGlkZQotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgcmVjb3JkIHdhcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC4KLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIENvbnRlbnRSZXNvbHZlciNkZWxldGUoVXJpLCBTdHJpbmcsIFN0cmluZ1tdKX0KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gZGVsZXRlUm93KCk7Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB6ZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG5hbWUsIG9yIC0xIGlmIHRoZSBjb2x1bW4gZG9lc24ndCBleGlzdC4KICAgICAgKiBJZiB5b3UgZXhwZWN0IHRoZSBjb2x1bW4gdG8gZXhpc3QgdXNlIHtAbGluayAjZ2V0Q29sdW1uSW5kZXhPclRocm93KFN0cmluZyl9IGluc3RlYWQsIHdoaWNoCiAgICAgICogd2lsbCBtYWtlIHRoZSBlcnJvciBtb3JlIGNsZWFyLgpAQCAtMjk1LDYgKzI5OCwyNyBAQAogICAgIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbkluZGV4KTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKiBUaGUgcHJlZmVycmVkIHR5cGUgb2YgdGhlIGNvbHVtbiBpcyByZXR1cm5lZCBidXQgdGhlIGRhdGEgbWF5IGJlIGNvbnZlcnRlZCB0byBvdGhlciB0eXBlcworICAgICAqIGFzIGRvY3VtZW50ZWQgaW4gdGhlIGdldC10eXBlIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgI2dldEludChpbnQpfSwge0BsaW5rICNnZXRGbG9hdChpbnQpfQorICAgICAqIGV0Yy4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIGNvbHVtbiB0eXBlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KKyAgICAgKiBAcmV0dXJuIGNvbHVtbiB2YWx1ZSB0eXBlCisgICAgICovCisgICAgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIGluIHRoZSBpbmRpY2F0ZWQgY29sdW1uIGlzIG51bGwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCkBAIC0zMDMsMTg4ICszMjcsNiBAQAogICAgIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJzb3Igc3VwcG9ydHMgdXBkYXRlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgY3Vyc29yIHN1cHBvcnRzIHVwZGF0ZXMuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gaGFzVXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KTsKLQotICAgIC8qKgotICAgICAqIEF0b21pY2FsbHkgY29tbWl0cyBhbGwgdXBkYXRlcyB0byB0aGUgYmFja2luZyBzdG9yZS4gQWZ0ZXIgY29tcGxldGlvbiwKLSAgICAgKiB0aGlzIG1ldGhvZCBsZWF2ZXMgdGhlIGRhdGEgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGFuZCB5b3Ugc2hvdWxkIGNhbGwKLSAgICAgKiB7QGxpbmsgI3JlcXVlcnl9IGJlZm9yZSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgY3Vyc29yIGFnYWluLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBjb21taXRVcGRhdGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGNvbW1pdHMgYWxsIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUsIGFzIHdlbGwgYXMgdGhlCi0gICAgICogdXBkYXRlcyBpbmNsdWRlZCBpbiB2YWx1ZXMuIEFmdGVyIGNvbXBsZXRpb24sCi0gICAgICogdGhpcyBtZXRob2QgbGVhdmVzIHRoZSBkYXRhIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgeW91IHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rICNyZXF1ZXJ5fSBiZWZvcmUgcmVhZGluZyBkYXRhIGZyb20gdGhlIGN1cnNvciBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBtYXAgZnJvbSByb3cgSURzIHRvIE1hcHMgYXNzb2NpYXRpbmcgY29sdW1uIG5hbWVzIHdpdGgKLSAgICAgKiAgICAgICAgICAgICAgIHVwZGF0ZWQgdmFsdWVzLiBBIG51bGwgdmFsdWUgaW5kaWNhdGVzIHRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZywKLSAgICAgICAgICAgID8gZXh0ZW5kcyBNYXA8U3RyaW5nLE9iamVjdD4+IHZhbHVlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXZlcnRzIGFsbCB1cGRhdGVzIG1hZGUgdG8gdGhlIGN1cnNvciBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCi0gICAgICogY29tbWl0VXBkYXRlcy4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHZvaWQgYWJvcnRVcGRhdGVzKCk7Ci0KLSAgICAvKioKICAgICAgKiBEZWFjdGl2YXRlcyB0aGUgQ3Vyc29yLCBtYWtpbmcgYWxsIGNhbGxzIG9uIGl0IGZhaWwgdW50aWwge0BsaW5rICNyZXF1ZXJ5fSBpcyBjYWxsZWQuCiAgICAgICogSW5hY3RpdmUgQ3Vyc29ycyB1c2UgZmV3ZXIgcmVzb3VyY2VzIHRoYW4gYWN0aXZlIEN1cnNvcnMuCiAgICAgICogQ2FsbGluZyB7QGxpbmsgI3JlcXVlcnl9IHdpbGwgbWFrZSB0aGUgY3Vyc29yIGFjdGl2ZSBhZ2Fpbi4KQEAgLTQ5Niw2ICszMzgsMTAgQEAKICAgICAgKiBjb250ZW50cy4gVGhpcyBtYXkgYmUgZG9uZSBhdCBhbnkgdGltZSwgaW5jbHVkaW5nIGFmdGVyIGEgY2FsbCB0byB7QGxpbmsKICAgICAgKiAjZGVhY3RpdmF0ZX0uCiAgICAgICoKKyAgICAgKiBTaW5jZSB0aGlzIG1ldGhvZCBjb3VsZCBleGVjdXRlIGEgcXVlcnkgb24gdGhlIGRhdGFiYXNlIGFuZCBwb3RlbnRpYWxseSB0YWtlCisgICAgICogYSB3aGlsZSwgaXQgY291bGQgY2F1c2UgQU5SIGlmIGl0IGlzIGNhbGxlZCBvbiBNYWluIChVSSkgdGhyZWFkLgorICAgICAqIEEgd2FybmluZyBpcyBwcmludGVkIGlmIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIE1haW4gdGhyZWFkLgorICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXJ5IHN1Y2NlZWRlZCwgZmFsc2UgaWYgbm90LCBpbiB3aGljaCBjYXNlIHRoZQogICAgICAqICAgICAgICAgY3Vyc29yIGJlY29tZXMgaW52YWxpZC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQppbmRleCA3NDhlYjk5Li44YmM3ZGUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCkBAIC0xNiwxNiArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlTWlzdXNlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiAKIC8qKgogICogV3JhcHMgYSBCdWxrQ3Vyc29yIGFyb3VuZCBhbiBleGlzdGluZyBDdXJzb3IgbWFraW5nIGl0IHJlbW90YWJsZS4KQEAgLTM4LDcgKzM0LDYgQEAKICAgICBwcml2YXRlIGZpbmFsIENyb3NzUHJvY2Vzc0N1cnNvciBtQ3Vyc29yOwogICAgIHByaXZhdGUgQ3Vyc29yV2luZG93IG1XaW5kb3c7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVByb3ZpZGVyTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVJlYWRPbmx5OwogICAgIHByaXZhdGUgQ29udGVudE9ic2VydmVyUHJveHkgbU9ic2VydmVyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29udGVudE9ic2VydmVyUHJveHkgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgCkBAIC05OCw3ICs5Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICJPbmx5IENyb3NzUHJvY2Vzc0N1cnNvciBjdXJzb3JzIGFyZSBzdXBwb3J0ZWQgYWNyb3NzIHByb2Nlc3MgZm9yIG5vdyIsIGUpOwogICAgICAgICB9CiAgICAgICAgIG1Qcm92aWRlck5hbWUgPSBwcm92aWRlck5hbWU7Ci0gICAgICAgIG1SZWFkT25seSA9ICFhbGxvd1dyaXRlOwogCiAgICAgICAgIGNyZWF0ZUFuZFJlZ2lzdGVyT2JzZXJ2ZXJQcm94eShvYnNlcnZlcik7CiAgICAgfQpAQCAtMTk3LDMxICsxOTEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlUm93cyhNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKG1SZWFkT25seSkgewotICAgICAgICAgICAgTG9nLncoIkNvbnRlbnRQcm92aWRlciIsICJQZXJtaXNzaW9uIERlbmlhbDogbW9kaWZ5aW5nICIKLSAgICAgICAgICAgICAgICAgICAgKyBtUHJvdmlkZXJOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHBpZD0iICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgaWYgKG1SZWFkT25seSkgewotICAgICAgICAgICAgTG9nLncoIkNvbnRlbnRQcm92aWRlciIsICJQZXJtaXNzaW9uIERlbmlhbDogbW9kaWZ5aW5nICIKLSAgICAgICAgICAgICAgICAgICAgKyBtUHJvdmlkZXJOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHBpZD0iICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJzb3IubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCiAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldEV4dHJhcygpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93LmphdmEKaW5kZXggYzc1NjgyNS4uNTk5NDMxZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93LmphdmEKQEAgLTIxNywxOCArMjE3LDEzIEBACiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc051bGxfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0VHlwZShyb3csIGNvbCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc051bGxfbmF0aXZlKGludCByb3csIGludCBjb2wpOwotICAgIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBieXRlIGFycmF5IGZvciB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgICoKQEAgLTI0OCwxOSArMjQzLDQzIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYnl0ZVtdIGdldEJsb2JfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBkYXRhIHR5cGUgb2YgdGhlIGdpdmVuIGNvbHVtbidzIHZhbHVlLgorICAgICAqPHA+CisgICAgICogUmV0dXJuZWQgY29sdW1uIHR5cGVzIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfTlVMTH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9JTlRFR0VSfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0ZMT0FUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX1NUUklOR308L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9CTE9CfTwvbGk+CisgICAgICo8L3VsPgorICAgICAqPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUeXBlX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgaWYgYSBmaWVsZCBjb250YWlucyBlaXRoZXIgYSBibG9iIG9yIGlzIG51bGwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0gb3IgYSBibG9iCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzQmxvYihpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0Jsb2JfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUocm93LCBjb2wpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9CTE9CIHx8IHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKICAgICAvKioKQEAgLTI2OSwxNCArMjg4LDExIEBACiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMgYSBsb25nCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0ludGVnZXJfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0VHlwZShyb3csIGNvbCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKICAgICB9CiAKICAgICAvKioKQEAgLTI4NSwxNCArMzAxLDExIEBACiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMgYSBmbG9hdAorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzRmxvYXRfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0VHlwZShyb3csIGNvbCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDEsMjAgKzMxNCwxNSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfSBvciBhIFN0cmluZworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmluZyhpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc1N0cmluZ19uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGludCB0eXBlID0gZ2V0VHlwZShyb3csIGNvbCk7CisgICAgICAgIHJldHVybiB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX1NUUklORyB8fCB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0Jsb2JfbmF0aXZlKGludCByb3csIGludCBjb2wpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNTdHJpbmdfbmF0aXZlKGludCByb3csIGludCBjb2wpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNJbnRlZ2VyX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzRmxvYXRfbmF0aXZlKGludCByb3csIGludCBjb2wpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBnZXRUeXBlX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBTdHJpbmcgZm9yIHRoZSBnaXZlbiBmaWVsZC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQppbmRleCBmMGFhN2Q3Li4zYzNiZDQzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCkBAIC0xNywyOCArMTcsMjYgQEAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DaGFyQXJyYXlCdWZmZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBDdXJzb3IgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNhbGxzIHRvIHRoZSBhY3R1YWwgY3Vyc29yIG9iamVjdAorICogV3JhcHBlciBjbGFzcyBmb3IgQ3Vyc29yIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyB0byB0aGUgYWN0dWFsIGN1cnNvciBvYmplY3QuICBUaGUgcHJpbWFyeQorICogdXNlIGZvciB0aGlzIGNsYXNzIGlzIHRvIGV4dGVuZCBhIGN1cnNvciB3aGlsZSBvdmVycmlkaW5nIG9ubHkgYSBzdWJzZXQgb2YgaXRzIG1ldGhvZHMuCiAgKi8KLQogcHVibGljIGNsYXNzIEN1cnNvcldyYXBwZXIgaW1wbGVtZW50cyBDdXJzb3IgewogCisgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3IgbUN1cnNvcjsKKwogICAgIHB1YmxpYyBDdXJzb3JXcmFwcGVyKEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCisgICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBjdXJzb3IKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7Ci0gICAgICAgIG1DdXJzb3IuYWJvcnRVcGRhdGVzKCk7CisgICAgcHVibGljIEN1cnNvciBnZXRXcmFwcGVkQ3Vyc29yKCkgeworICAgICAgICByZXR1cm4gbUN1cnNvcjsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKQEAgLTQ5LDIzICs0Nyw2IEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQ2xvc2VkKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygKLSAgICAgICAgICAgIE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKHZhbHVlcyk7Ci0gICAgfQotCiAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0Q291bnQoKTsKICAgICB9CkBAIC03NCwxNCArNTUsNiBAQAogICAgICAgICBtQ3Vyc29yLmRlYWN0aXZhdGUoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9GaXJzdCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IubW92ZVRvRmlyc3QoKTsKICAgICB9CkBAIC0xNDcsMTQgKzEyMCw2IEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuaGFzVXBkYXRlcygpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0FmdGVyTGFzdCgpOwogICAgIH0KQEAgLTE3MSw2ICsxMzYsMTAgQEAKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNMYXN0KCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbkluZGV4KTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW5JbmRleCk7CiAgICAgfQpAQCAtMjE5LDE0ICsxODgsNiBAQAogICAgICAgICBtQ3Vyc29yLnNldE5vdGlmaWNhdGlvblVyaShjciwgdXJpKTsgICAgICAgIAogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnN1cHBvcnRzVXBkYXRlcygpOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihvYnNlcnZlcik7ICAgICAgICAKICAgICB9CkBAIC0yMzQsNzIgKzE5NSw1IEBACiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG9ic2VydmVyKTsKICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZURvdWJsZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVGbG9hdChpbnQgY29sdW1uSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUZsb2F0KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVJbnQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlTG9uZyhjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVNob3J0KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVTdHJpbmcoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVCbG9iKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlVG9OdWxsKGNvbHVtbkluZGV4KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKLSAgICAKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKaW5kZXggOTIwMGU4MS4uNTFjNzJjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCkBAIC0yNyw4ICsyNywxMiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZChtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlciA6IG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkNoYW5nZWQoKTsKKyAgICAgICAgICAgIC8vIHNpbmNlIG9uQ2hhbmdlZCgpIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBhcHAsIGl0IGNvdWxkIGRvIGFueXRoaW5nLCBpbmNsdWRpbmcKKyAgICAgICAgICAgIC8vIHJlbW92aW5nIGl0c2VsZiBmcm9tIHtAbGluayBtT2JzZXJ2ZXJzfSAtIGFuZCB0aGF0IGNvdWxkIGNhdXNlIHByb2JsZW1zIGlmCisgICAgICAgICAgICAvLyBhbiBpdGVyYXRvciBpcyB1c2VkIG9uIHRoZSBBcnJheUxpc3Qge0BsaW5rIG1PYnNlcnZlcnN9LgorICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3VjaCBwcm9ibGVtcywganVzdCBtYXJjaCB0aHJ1IHRoZSBsaXN0IGluIHRoZSByZXZlcnNlIG9yZGVyLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1PYnNlcnZlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXJzLmdldChpKS5vbkNoYW5nZWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM5LDggKzQzLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlJbnZhbGlkYXRlZCgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlciA6IG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkludmFsaWRhdGVkKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbU9ic2VydmVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1PYnNlcnZlcnMuZ2V0KGkpLm9uSW52YWxpZGF0ZWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzU0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgdG8gbGV0IHRoZSBhcHBzIGRlZmluZSB0aGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgKiAgIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhYmFzZUVycm9ySGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBkZWZpbmVzIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZCB3aGVuIGRhdGFiYXNlIGNvcnJ1cHRpb24gaXMgZGV0ZWN0ZWQuCisgICAgICogQHBhcmFtIGRiT2JqIHRoZSB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIG9uIHdoaWNoIGNvcnJ1cHRpb24KKyAgICAgKiBpcyBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ29ycnVwdGlvbihTUUxpdGVEYXRhYmFzZSBkYk9iaik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKaW5kZXggOWJmYmI3NC4uYWY5M2VlZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQpAQCAtMTkzLDYgKzE5MywzNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBvYmplY3QncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIHZhbHVlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSB0eXBlIGlzIHRvIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiBvYmplY3QgdmFsdWUgdHlwZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZU9mT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9CTE9COworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEZsb2F0IHx8IG9iaiBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExvbmcgfHwgb2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXBwZW5kcyBhbiBTUUwgc3RyaW5nIHRvIHRoZSBnaXZlbiBTdHJpbmdCdWlsZGVyLCBpbmNsdWRpbmcgdGhlIG9wZW5pbmcKICAgICAgKiBhbmQgY2xvc2luZyBzaW5nbGUgcXVvdGVzLiBBbnkgc2luZ2xlIHF1b3RlcyBpbnRlcm5hbCB0byBzcWxTdHJpbmcgd2lsbAogICAgICAqIGJlIGVzY2FwZWQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTllNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKKy8qKgorICogRGVmYXVsdCBjbGFzcyB1c2VkIGRlZmluaW5nIHRoZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKyAqICAgZGF0YWJhc2UgY29ycnVwdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiOworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgZGVmYXVsdCBtZXRob2QgdG8gYmUgaW52b2tlZCB3aGVuIGRhdGFiYXNlIGNvcnJ1cHRpb24gaXMgZGV0ZWN0ZWQuCisgICAgICogQHBhcmFtIGRiT2JqIHRoZSB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIG9uIHdoaWNoIGNvcnJ1cHRpb24KKyAgICAgKiBpcyBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKKyAgICAgICAgTG9nLmUoVEFHLCAiQ29ycnVwdGlvbiByZXBvcnRlZCBieSBzcWxpdGUgb24gZGF0YWJhc2U6ICIgKyBkYk9iai5nZXRQYXRoKCkpOworCisgICAgICAgIC8vIGlzIHRoZSBjb3JydXB0aW9uIGRldGVjdGVkIGV2ZW4gYmVmb3JlIGRhdGFiYXNlIGNvdWxkIGJlICdvcGVuZWQnPworICAgICAgICBpZiAoIWRiT2JqLmlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBkYXRhYmFzZSBmaWxlcyBhcmUgbm90IGV2ZW4gb3BlbmFibGUuIGRlbGV0ZSB0aGlzIGRhdGFiYXNlIGZpbGUuCisgICAgICAgICAgICAvLyBOT1RFIGlmIHRoZSBkYXRhYmFzZSBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzLCB0aGVuIGFueSBvZiB0aGVtIGNvdWxkIGJlIGNvcnJ1cHQuCisgICAgICAgICAgICAvLyBhbmQgbm90IGRlbGV0aW5nIGFsbCBvZiB0aGVtIGNvdWxkIGNhdXNlIGNvcnJ1cHRlZCBkYXRhYmFzZSBmaWxlIHRvIHJlbWFpbiBhbmQgCisgICAgICAgICAgICAvLyBtYWtlIHRoZSBhcHBsaWNhdGlvbiBjcmFzaCBvbiBkYXRhYmFzZSBvcGVuIG9wZXJhdGlvbi4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtLAorICAgICAgICAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBwcm92aWRlIGl0cyBvd24ge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSBpbXBsIGNsYXNzCisgICAgICAgICAgICAvLyB0byBkZWxldGUgQUxMIGZpbGVzIG9mIHRoZSBkYXRhYmFzZSAoaW5jbHVkaW5nIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpLgorICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSwgd2hpY2ggd2lsbCBjYXVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgdG8gZmFpbC4KKyAgICAgICAgICAgIC8vIGJlZm9yZSB0aGF0LCBnZXQgdGhlIGF0dGFjaGVkIGRhdGFiYXNlIGxpc3QgZmlyc3QuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGF0dGFjaGVkRGJzID0gZGJPYmouZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRiT2JqLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCBmaWxlcyBvZiB0aGlzIGNvcnJ1cHQgZGF0YWJhc2UgYW5kL29yIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgOiBhdHRhY2hlZERicykgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUocC5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gYXR0YWNoZWREYnMgPSBudWxsIGlzIHBvc3NpYmxlIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHNvIGNvcnJ1cHQgdGhhdCBldmVuCisgICAgICAgICAgICAgICAgLy8gIlBSQUdNQSBkYXRhYmFzZV9saXN0OyIgYWxzbyBmYWlscy4gZGVsZXRlIHRoZSBtYWluIGRhdGFiYXNlIGZpbGUKKyAgICAgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUoZGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVEYXRhYmFzZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIGlmIChmaWxlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5OiIpIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUoVEFHLCAiZGVsZXRpbmcgdGhlIGRhdGFiYXNlIGZpbGU6ICIgKyBmaWxlTmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRmlsZShmaWxlTmFtZSkuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvKiBwcmludCB3YXJuaW5nIGFuZCBpZ25vcmUgZXhjZXB0aW9uICovCisgICAgICAgICAgICBMb2cudyhUQUcsICJkZWxldGUgZmFpbGVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKaW5kZXggNDY3OTBhMy4uMjQ0Yzg4ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCkBAIC0xNiwxNiArMTYsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIC8qKgogICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgd2F5IHRvIHBhc3MgYnVsayBjdXJzb3IgZGF0YSBhY3Jvc3MKLSAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRyaWVzLiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCB1c2UgdGhlIEN1cnNvcgorICogYm90aCBwcm9jZXNzIGFuZCBsYW5ndWFnZSBib3VuZGFyaWVzLiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCB1c2UgdGhlIEN1cnNvcgogICogaW50ZXJmYWNlIGRpcmVjdGx5LgogICoKICAqIHtAaGlkZX0KQEAgLTU0LDEwICs1Miw2IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwpAQCAtNzYsOCArNzAsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NVUlNPUl9XSU5ET1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT047CiAgICAgc3RhdGljIGZpbmFsIGludCBDT1VOVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBHRVRfQ09MVU1OX05BTUVTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ST1dTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFTEVURV9ST1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgREVBQ1RJVkFURV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVJZX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjsKICAgICBzdGF0aWMgZmluYWwgaW50IE9OX01PVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQppbmRleCBkNWMzYTMyLi41YzFiOTY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQpAQCAtMjcyLDYgKzI3MiwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmdldFR5cGVPZk9iamVjdChnZXQoY29sdW1uKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pIHsKICAgICAgICAgcmV0dXJuIGdldChjb2x1bW4pID09IG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKaW5kZXggNzIyZDcwNy4uMmMyNWRiNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCkBAIC05MiwzMiArOTIsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSBtQ3Vyc29ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DdXJzb3JzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yc1tpXS5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pCiAgICAgewpAQCAtMTU1LDYgKzEyOSwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhNTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgaW52b2tpbmcge0BsaW5rIEN1cnNvciNyZXF1ZXJ5KCl9IG9uIE1haW4gdGhyZWFkIGNvdWxkIGNhdXNlIEFOUi4KKyAqIFRoaXMgZXhjZXB0aW9uIHNob3VsZCBlbmNvdXJhZ2UgYXBwcyB0byBpbnZva2Uge0BsaW5rIEN1cnNvciNyZXF1ZXJ5KCl9IGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIAorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBzdXBlcigiSW4gIiArIHBhY2thZ2VOYW1lICsgIiBSZXF1ZXJ5IGlzIGV4ZWN1dGluZyBvbiBtYWluIChVSSkgdGhyZWFkLiBjb3VsZCBjYXVzZSBBTlIuICIgKworICAgICAgICAgICAgICAgICJkbyBpdCBpbiBiYWNrZ3JvdW5kIHRocmVhZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjcwMThmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIEEgY29ubmVjdGlvbiBwb29sIHRvIGJlIHVzZWQgYnkgcmVhZGVycy4KKyAqIE5vdGUgdGhhdCBlYWNoIGNvbm5lY3Rpb24gY2FuIGJlIHVzZWQgYnkgb25seSBvbmUgcmVhZGVyIGF0IGEgdGltZS4KKyAqLworLyogcGFja2FnZSAqLyBjbGFzcyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbCI7CisKKyAgICAvKiogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBwb29sIHNpemUuIEl0IGlzIHNldCBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGUgZGV2aWNlIGhhcy4KKyAgICAgKiBUT0RPOiBzZXQgdGhpcyB3aXRoICdhIHN5c3RlbSBjYWxsJyB3aGljaCByZXR1cm5zIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRoZSBkZXZpY2UgaGFzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OTkVDVElPTl9QT09MX1NJWkUgPSAxOworCisgICAgLyoqIHRoZSBwb29sIHNpemUgc2V0IGZvciB0aGlzIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBtTWF4UG9vbFNpemUgPSBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFOworCisgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgb2JqZWN0cyBhcmUgc3RvcmVkIGluIHRoaXMgbWVtYmVyLgorICAgICAqIFRPRE86IHJldmlzaXQgdGhpcyBkYXRhIHN0cnVjdCBhcyB0aGUgbnVtYmVyIG9mIHBvb2xlZCBjb25uZWN0aW9ucyBpbmNyZWFzZSBiZXlvbmQKKyAgICAgKiBzaW5nbGUtZGlnaXQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBvb2xPYmo+IG1Qb29sID0gbmV3IEFycmF5TGlzdDxQb29sT2JqPihtTWF4UG9vbFNpemUpOworCisgICAgLyoqIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gd2hpY2ggdGhpcyBjb25uZWN0aW9uIHBvb2wgaXMgYXR0YWNoZWQgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1QYXJlbnREYk9iajsKKworICAgIC8qIHBhY2thZ2UgKi8gRGF0YWJhc2VDb25uZWN0aW9uUG9vbChTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICB0aGlzLm1QYXJlbnREYk9iaiA9IGRiOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJNYXggUG9vbCBTaXplOiAiICsgbU1heFBvb2xTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb3NlIGFsbCBkYXRhYmFzZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbCAtIGV2ZW4gaWYgdGhleSBhcmUgaW4gdXNlIQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbVBvb2wuZ2V0KGkpLm1EYi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvb2wuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIGZyZWUgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3FsIGlmIG5vdCBudWxsLCB0cnkgdG8gZmluZCBhIGNvbm5lY3Rpb24gaW50aGUgcG9vbCB3aGljaCBhbHJlYWR5IGhhcyBjYWNoZWQKKyAgICAgKiB0aGUgY29tcGlsZWQgc3RhdGVtZW50IGZvciB0aGlzIHNxbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBEYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgdGhlIGNhbGxlciBjYW4gdXNlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXQoU3RyaW5nIHNxbCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaWYgKGdldEZyZWVQb29sU2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IG1Qb29sLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXhlZCBvdXQuIGNhbid0IG9wZW4gYW55IG1vcmUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgY2FsbGVyIHdhaXQgb24gb25lIG9mIHRoZSBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIChtTWF4UG9vbFNpemUtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5kb20oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpLm5leHRJbnQobU1heFBvb2xTaXplLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIHBvb2wsIHNpbmNlIHdlIGhhdmVuJ3QgcmVhY2hlZAorICAgICAgICAgICAgICAgICAgICAvLyBtYXggcG9vbCBzaXplIGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvb2xTaXplID0gZ2V0UG9vbFNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZGIgPSBtUGFyZW50RGJPYmouY3JlYXRlUG9vbENvbm5lY3Rpb24oKHNob3J0KShwb29sU2l6ZSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG5ldyBQb29sT2JqKGRiKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvb2wuYWRkKHBvb2xTaXplLCBwb29sT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZS4gcGljayBvbmUKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwb29sT2JqLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBmcmVlIC0gYnV0IGRvZXMgaXRzIGRhdGFiYXNlIG9iamVjdCBhbHJlYWR5IGhhdmUgdGhlIGdpdmVuIHNxbCBpbiBpdHMKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50LWNhY2hlPworICAgICAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgICAgICAgICBpZiAoc3FsID09IG51bGwgfHwgZGIuaXNTcWxJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgZnJlZSBjb25uZWN0aW9uIHdlIGNhbiB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGhhdmVuJ3QgZm91bmQgYSBkYXRhYmFzZSBvYmplY3Qgd2hpY2ggaGFzIHRoZSBnaXZlbiBzcWwgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudC1jYWNoZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0IHBvb2xPYmogIT0gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBwb29sT2JqLm1EYiA9PSBkYjsKKworICAgICAgICAgICAgcG9vbE9iai5hY3F1aXJlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgZ2V0LWNvbm5lY3Rpb246ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGI7CisgICAgICAgIC8vIFRPRE8gaWYgYSB0aHJlYWQgYWNxdWlyZXMgYSBjb25uZWN0aW9uIGFuZCBkaWVzIHdpdGhvdXQgcmVsZWFzaW5nIHRoZSBjb25uZWN0aW9uLCB0aGVuCisgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGEgY29ubmVjdGlvbiBsZWFrLgorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbGVhc2UgdGhlIGdpdmVuIGRhdGFiYXNlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIGNvbm5lY3Rpb24gdG8gYmUgcmVsZWFzZWQKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVsZWFzZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICBQb29sT2JqIHBvb2xPYmo7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGIubUNvbm5lY3Rpb25OdW0gPiAwOworICAgICAgICAgICAgICAgIGRvQXNzZXJ0cygpOworICAgICAgICAgICAgICAgIGFzc2VydCBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5tRGIgPT0gZGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKTsKKworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkJFR0lOIHJlbGVhc2UtY29ubjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9vbE9iai5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlbGVhc2luZyBvYmplY3QgYWxyZWFkeSBmcmVlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBkYi5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvb2xPYmoucmVsZWFzZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRU5EIHJlbGVhc2UtY29ubjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIChib3RoIGZyZWUgYW5kIGJ1c3kgY29ubmVjdGlvbnMpLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiAiYWRiIGJ1Z3JlcG9ydCIgaXMgZG9uZS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gZ2V0Q29ubmVjdGlvbkxpc3QoKSB7CisgICAgICAgIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKG1Qb29sLmdldChpKS5tRGIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFBvb2xTaXplKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvb2wuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RnJlZVBvb2xTaXplKCkgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkuaXNGcmVlKCkpIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiZGI6ICIgKyBtUGFyZW50RGJPYmouZ2V0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAiLCB0aHJlYWRpZCA9ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKworICAgICAgICAgICAgICAgICIsIHRvdGFsc2l6ZSA9ICIgKyBtUG9vbC5zaXplKCkgKyAiLCAjZnJlZSA9ICIgKyBnZXRGcmVlUG9vbFNpemUoKSArCisgICAgICAgICAgICAgICAgIiwgbWF4cG9vbHNpemUgPSAiICsgbU1heFBvb2xTaXplOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0Fzc2VydHMoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBvb2wuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1Qb29sLmdldChpKS52ZXJpZnkoKTsKKyAgICAgICAgICAgIGFzc2VydCBtUG9vbC5nZXQoaSkubURiLm1Db25uZWN0aW9uTnVtID09IChpICsgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0TWF4UG9vbFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgbU1heFBvb2xTaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldE1heFBvb2xTaXplKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gbU1heFBvb2xTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwcmVzZW50cyBvYmplY3RzIGluIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9vbE9iaiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtRGI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGUkVFID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBCVVNZID0gZmFsc2U7CisKKyAgICAgICAgLyoqIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBob2xkaW5nIHRoaXMgY29ubmVjdGlvbiAqLworICAgICAgICAvLyBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bUhvbGRlcnMgPSAwOworCisgICAgICAgIC8qKiBjb250YWlucyB0aGUgdGhyZWFkSWRzIG9mIHRoZSB0aHJlYWRzIGhvbGRpbmcgdGhpcyBjb25uZWN0aW9uLgorICAgICAgICAgKiB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAgICAgICAgICovCisgICAgICAgIC8vIEBHdWFyZGVkQnkoInRoaXMiKQorICAgICAgICBwcml2YXRlIEhhc2hTZXQ8TG9uZz4gbUhvbGRlcklkcyA9IG5ldyBIYXNoU2V0PExvbmc+KCk7CisKKyAgICAgICAgcHVibGljIFBvb2xPYmooU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIG1EYiA9IGRiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhY3F1aXJlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBpc0ZyZWUoKTsKKyAgICAgICAgICAgICAgICBsb25nIGlkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIGFzc2VydCAhbUhvbGRlcklkcy5jb250YWlucyhpZCk7CisgICAgICAgICAgICAgICAgbUhvbGRlcklkcy5hZGQoaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtSG9sZGVycysrOworICAgICAgICAgICAgbUZyZWVCdXN5RmxhZyA9IEJVU1k7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgbG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUhvbGRlcklkcy5zaXplKCkgPT0gbU51bUhvbGRlcnM7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Ib2xkZXJJZHMuY29udGFpbnMoaWQpOworICAgICAgICAgICAgICAgIG1Ib2xkZXJJZHMucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU51bUhvbGRlcnMtLTsKKyAgICAgICAgICAgIGlmIChtTnVtSG9sZGVycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUZyZWVCdXN5RmxhZyA9IEZSRUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGlzRnJlZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICB2ZXJpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAobUZyZWVCdXN5RmxhZyA9PSBGUkVFKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdmVyaWZ5KCkgeworICAgICAgICAgICAgaWYgKG1GcmVlQnVzeUZsYWcgPT0gRlJFRSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBtTnVtSG9sZGVycyA9PSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbU51bUhvbGRlcnMgPiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgY29ubiAjICIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobURiLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIG1Db3VudEhvbGRlcnMgPSAiKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobU51bUhvbGRlcnMpOworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGZyZWVCdXN5RmxhZyA9ICIpOworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1GcmVlQnVzeUZsYWcpOworICAgICAgICAgICAgICAgIGZvciAoTG9uZyBsIDogbUhvbGRlcklkcykgeworICAgICAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBpZCA9ICIgKyBsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YQppbmRleCA4YWM0YzBmLi5mMjhjNzBmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YQpAQCAtMjEsMTMgKzIxLDExIEBACiAgKiB0aGF0IGlzIG5vdCBleHBsaWNpdGx5IGNsb3NlZAogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgoteworcHVibGljIGNsYXNzIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHMgPSAiQXBwbGljYXRpb24gZGlkIG5vdCBjbG9zZSB0aGUgY3Vyc29yIG9yIGRhdGFiYXNlIG9iamVjdCAiICsKICAgICAgICAgICAgICJ0aGF0IHdhcyBvcGVuZWQgaGVyZSI7CiAKLSAgICBwdWJsaWMgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKQotICAgIHsKKyAgICBwdWJsaWMgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKHMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKaW5kZXggMjVhYTliMy4uOTg4OWEyMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKQEAgLTc4LDIwICs3OCwxMyBAQAogICAgICAqICBleGlzdGluZyBjb21waWxlZCBTUUwgcHJvZ3JhbSBhbHJlYWR5IGFyb3VuZAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjb21waWxlKFN0cmluZyBzcWwsIGJvb2xlYW4gZm9yY2VDb21waWxhdGlvbikgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeUxvY2tPd25lcigpOwogICAgICAgICAvLyBPbmx5IGNvbXBpbGUgaWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIHN0YXRlbWVudCBhbHJlYWR5IG9yIHRoZSBjYWxsZXIgaGFzCiAgICAgICAgIC8vIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGEgcmVjb21waWxlLgogICAgICAgICBpZiAoZm9yY2VDb21waWxhdGlvbikgewotICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuYXRpdmVfY29tcGlsZSgpIHRha2VzIGNhcmUgb2YgZGVzdHJveWluZyBhbnkgcHJldmlvdXNseQotICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHByb2dyYW1zIGJlZm9yZSBpdCBjb21waWxlcy4KLSAgICAgICAgICAgICAgICBuYXRpdmVfY29tcGlsZShzcWwpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5hdGl2ZV9jb21waWxlKCkgdGFrZXMgY2FyZSBvZiBkZXN0cm95aW5nIGFueSBwcmV2aW91c2x5CisgICAgICAgICAgICAvLyBleGlzdGluZyBwcm9ncmFtcyBiZWZvcmUgaXQgY29tcGlsZXMuCisgICAgICAgICAgICBuYXRpdmVfY29tcGlsZShzcWwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDIsMTMgKzk1LDggQEAKICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewogICAgICAgICAgICAgICAgIExvZy52KFRBRywgImNsb3NlZCBhbmQgZGVhbGxvY2F0ZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsiKSIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZSgpOwotICAgICAgICAgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UuZmluYWxpemVTdGF0ZW1lbnRMYXRlcihuU3RhdGVtZW50KTsKKyAgICAgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzQsNiArMTIyLDEwIEBACiAgICAgICAgIG1JblVzZSA9IGZhbHNlOwogICAgIH0KIAorICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gaXNJblVzZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JblVzZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgbmF0aXZlIHJlc291cmNlIGlzIGNsZWFuZWQgdXAuCiAgICAgICovCkBAIC0xNjIsNSArMTU0LDQgQEAKICAgICAgKiBAcGFyYW0gc3FsIFRoZSBTUUwgdG8gY29tcGlsZS4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9jb21waWxlKFN0cmluZyBzcWwpOwotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKaW5kZXggYzdlNThmYS4uZWVjZDAxZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQpAQCAtMTYsMjAgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247Ci0KK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIApAQCAtNzcsNiArNzYsMTEgQEAKICAgICBwcml2YXRlIGludCBtQ3Vyc29yU3RhdGUgPSAwOwogICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBtTG9jayA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGF0YSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlZCBieSB7QGxpbmsgI3JlcXVlcnkoKX0gdG8gcmVtZW1iZXIgZm9yIHdoaWNoIGRhdGFiYXNlIHdlJ3ZlIGFscmVhZHkgc2hvd24gdGhlIHdhcm5pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IHNBbHJlYWR5V2FybmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwogICAgIAogICAgIC8qKgogICAgICAqICBzdXBwb3J0IGZvciBhIGN1cnNvciB2YXJpYW50IHRoYXQgZG9lc24ndCBhbHdheXMgcmVhZCBhbGwgcmVzdWx0cwpAQCAtMzIxLDE2NiArMzI1LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgLy8gT25seSBhbGxvdyBkZWxldGVzIGlmIHRoZXJlIGlzIGFuIElEIGNvbHVtbiwgYW5kIHRoZSBJRCBoYXMgYmVlbiByZWFkIGZyb20gaXQKLSAgICAgICAgaWYgKG1Sb3dJZENvbHVtbkluZGV4ID09IC0xIHx8IG1DdXJyZW50Um93SUQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRlbGV0ZSByb3cgYmVjYXVzZSBlaXRoZXIgdGhlIHJvdyBJRCBjb2x1bW4gaXMgbm90IGF2YWlsYWJsZSBvciBpdCIgKwotICAgICAgICAgICAgICAgICAgICAiaGFzIG5vdCBiZWVuIHJlYWQuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHN1Y2Nlc3M7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRW5zdXJlIHdlIGRvbid0IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGRhdGFiYXNlIHdoZW4gYW5vdGhlcgotICAgICAgICAgKiB0aHJlYWQgaXMgaG9sZGluZyB0aGUgZGF0YWJhc2UgbG9jay4gcmVxdWVyeSgpIGFuZCBtb3ZlVG8oKSBhcmUgYWxzbwotICAgICAgICAgKiBzeW5jaHJvbml6ZWQgaGVyZSB0byBtYWtlIHN1cmUgdGhleSBnZXQgdGhlIHN0YXRlIG9mIHRoZSBkYXRhYmFzZQotICAgICAgICAgKiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIERFTEVURS4KLSAgICAgICAgICovCi0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kZWxldGUobUVkaXRUYWJsZSwgbUNvbHVtbnNbbVJvd0lkQ29sdW1uSW5kZXhdICsgIj0/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7bUN1cnJlbnRSb3dJRC50b1N0cmluZygpfSk7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHBvcyA9IG1Qb3M7Ci0gICAgICAgICAgICByZXF1ZXJ5KCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBFbnN1cmUgcHJvcGVyIGN1cnNvciBzdGF0ZS4gTm90ZSB0aGF0IG1DdXJyZW50Um93SUQgY2hhbmdlcwotICAgICAgICAgICAgICogaW4gdGhpcyBjYWxsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihwb3MpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuc3VwcG9ydHNVcGRhdGVzKCkgJiYgIVRleHRVdGlscy5pc0VtcHR5KG1FZGl0VGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZywKLSAgICAgICAgICAgID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSAiCi0gICAgICAgICAgICAgICAgICAgICsgImluY2x1ZGUgdGhlIF9pZCBjb2x1bW4/Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBQcmV2ZW50IG90aGVyIHRocmVhZHMgZnJvbSBjaGFuZ2luZyB0aGUgdXBkYXRlZCByb3dzIHdoaWxlIHRoZXkncmUKLSAgICAgICAgICogYmVpbmcgcHJvY2Vzc2VkIGhlcmUuCi0gICAgICAgICAqLwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGNoYW5naW5nIHRoZSBkYXRhYmFzZSBzdGF0ZSB3aGlsZQotICAgICAgICAgICAgICogd2UgcHJvY2VzcyB0aGUgdXBkYXRlZCByb3dzLCBhbmQgcHJldmVudHMgdXMgZnJvbSBjaGFuZ2luZyB0aGUKLSAgICAgICAgICAgICAqIGRhdGFiYXNlIGJlaGluZCB0aGUgYmFjayBvZiBhbm90aGVyIHRocmVhZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzcWwgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwotCi0gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggcm93IHRoYXQgaGFzIGJlZW4gdXBkYXRlZAotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd0VudHJ5IDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzID0gcm93RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9uZyByb3dJZE9iaiA9IHJvd0VudHJ5LmdldEtleSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyb3dJZE9iaiA9PSBudWxsIHx8IHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIHJvd0lkIG9yIHZhbHVlcyBmb3VuZCEgcm93SWQgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm93SWRPYmogKyAiLCB2YWx1ZXMgPSAiICsgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IHJvd0lkT2JqLmxvbmdWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IHZhbHVlc0l0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3FsLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiVVBEQVRFICIgKyBtRWRpdFRhYmxlICsgIiBTRVQgIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggY29sdW1uIHZhbHVlIHRoYXQgaGFzIGJlZW4gdXBkYXRlZAotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBiaW5kaW5ncyA9IG5ldyBPYmplY3RbdmFsdWVzLnNpemUoKV07Ci0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gdmFsdWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIj0/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nc1tpXSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIgKyBtQ29sdW1uc1ttUm93SWRDb2x1bW5JbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICc9JyArIHJvd0lkKTsKLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTChzcWwudG9TdHJpbmcoKSwgYmluZGluZ3MpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uucm93VXBkYXRlZChtRWRpdFRhYmxlLCByb3dJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGV0IGFueSBjaGFuZ2Ugb2JzZXJ2ZXJzIGtub3cgYWJvdXQgdGhlIHVwZGF0ZQotICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZUNvbW1vbigpIHsKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihUQUcsICI8PDwgUmVsZWFzaW5nIGN1cnNvciAiICsgdGhpcyk7CiAgICAgICAgIG1DdXJzb3JTdGF0ZSA9IDA7CkBAIC01MDYsMTEgKzM1NSwzMCBAQAogICAgICAgICBtRHJpdmVyLmN1cnNvckNsb3NlZCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNob3cgYSB3YXJuaW5nIGFnYWluc3QgdGhlIHVzZSBvZiByZXF1ZXJ5KCkgaWYgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKiBUaGlzIHdhcm5pbmcgaXMgc2hvd24gcGVyIGRhdGFiYXNlIHBlciBwcm9jZXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YXJuSWZVaVRocmVhZCgpIHsKKyAgICAgICAgaWYgKExvb3Blci5nZXRNYWluTG9vcGVyKCkgPT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZVBhdGggPSBtRGF0YWJhc2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgLy8gV2Ugc2hvdyB0aGUgd2FybmluZyBvbmNlIHBlciBkYXRhYmFzZSBpbiBvcmRlciBub3QgdG8gc3BhbSBsb2djYXQuCisgICAgICAgICAgICBpZiAoIXNBbHJlYWR5V2FybmVkLmNvbnRhaW5zS2V5KGRhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzQWxyZWFkeVdhcm5lZC5wdXQoZGF0YWJhc2VQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG91bGQgbm90IGF0dGVtcHQgcmVxdWVyeSBvbiBtYWluIChVSSkgdGhyZWFkOiBhcHAgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID09IG51bGwgPyAiJ3Vua25vd24nIiA6IHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uKHBhY2thZ2VOYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkgewogICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHdhcm5JZlVpVGhyZWFkKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICB0aW1lU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKaW5kZXggY2RjOWJiYi4uZWVjMDNiMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKQEAgLTE2LDE2ICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFwcEdsb2JhbHM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWcuRGJTdGF0czsKIGltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOworaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0zOCwxMSArMzksMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC0yMzMsNDggKzIzNCw4MSBAQAogICAgIC8vIGxvY2sgYWNxdWlzdGlvbnMgb2YgdGhlIGRhdGFiYXNlLgogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTE9DS19MT0dfUFJFRklYID0gIkdFVExPQ0s6IjsKIAotICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lICovCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbU5hdGl2ZUhhbmRsZSA9IDA7CisgICAgLyoqIFVzZWQgYnkgbmF0aXZlIGNvZGUsIGRvIG5vdCByZW5hbWUuIG1ha2UgaXQgdm9sYXRpbGUsIHNvIGl0IGlzIHRocmVhZC1zYWZlLiAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgaW50IG1OYXRpdmVIYW5kbGUgPSAwOwogCiAgICAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wIHRhYmxlIG5hbWVzIHVuaXF1ZSAqLwogICAgIC8qIHBhY2thZ2UgKi8gaW50IG1UZW1wVGFibGVTZXF1ZW5jZSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgYmxvY2sgb24gIi9kYXRhIi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVW5peAorICAgICAqIHN0YXRmcy5mX2JzaXplIGZpZWxkLiBub3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNCbG9ja1NpemUgPSAwOworCiAgICAgLyoqIFRoZSBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYXRoOwogCiAgICAgLyoqIFRoZSBhbm9ueW1pemVkIHBhdGggZm9yIHRoZSBkYXRhYmFzZSBmaWxlIGZvciBsb2dnaW5nIHB1cnBvc2VzICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGhGb3JMb2dzID0gbnVsbDsgIC8vIGxhemlseSBwb3B1bGF0ZWQKIAogICAgIC8qKiBUaGUgZmxhZ3MgcGFzc2VkIHRvIG9wZW4vY3JlYXRlICovCi0gICAgcHJpdmF0ZSBpbnQgbUZsYWdzOworICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKIAogICAgIC8qKiBUaGUgb3B0aW9uYWwgZmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgQ3Vyc29ycyAqLwotICAgIHByaXZhdGUgQ3Vyc29yRmFjdG9yeSBtRmFjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CiAKLSAgICBwcml2YXRlIFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IG1Qcm9ncmFtczsKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IG1Qcm9ncmFtczsKIAogICAgIC8qKgotICAgICAqIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGEgY2FjaGUgaXMgbWFpbnRhaW5lZCB0byBzdG9yZQorICAgICAqIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGEgTFJVIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKICAgICAgKiB0aGUgY29tcGlsZWQgcXVlcnkgc3RhdGVtZW50IGlkcyByZXR1cm5lZCBieSBzcWxpdGUgZGF0YWJhc2UuCi0gICAgICogICAgIGtleSA9IHNxbCBzdGF0ZW1lbnQgd2l0aCAiPyIgZm9yIGJpbmQgYXJncworICAgICAqICAgICBrZXkgPSBTUUwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKICAgICAgKiAgICAgdmFsdWUgPSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9CiAgICAgICogSWYgYW4gYXBwbGljYXRpb24gb3BlbnMgdGhlIGRhdGFiYXNlIGFuZCBrZWVwcyBpdCBvcGVuIGR1cmluZyBpdHMgZW50aXJlIGxpZmUsIHRoZW4KLSAgICAgKiB0aGVyZSB3aWxsIG5vdCBiZSBhbiBvdmVyaGVhZCBvZiBjb21waWxhdGlvbiBvZiBzcWwgc3RhdGVtZW50cyBieSBzcWxpdGUuCisgICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2YgU1FMIHN0YXRlbWVudHMgYnkgc3FsaXRlLgogICAgICAqCiAgICAgICogd2h5IGlzIHRoaXMgY2FjaGUgTk9UIHN0YXRpYz8gYmVjYXVzZSBzcWxpdGUgYXR0YWNoZXMgY29tcGlsZWRzcWwgc3RhdGVtZW50cyB0byB0aGUKICAgICAgKiBzdHJ1Y3QgY3JlYXRlZCB3aGVuIHtAbGluayBTUUxpdGVEYXRhYmFzZSNvcGVuRGF0YWJhc2UoU3RyaW5nLCBDdXJzb3JGYWN0b3J5LCBpbnQpfSBpcwogICAgICAqIGludm9rZWQuCiAgICAgICoKICAgICAgKiB0aGlzIGNhY2hlIGhhcyBhbiB1cHBlciBsaW1pdCBvZiBtTWF4U3FsQ2FjaGVTaXplIChzZXR0YWJsZSBieSBjYWxsaW5nIHRoZSBtZXRob2QKLSAgICAgKiAoQGxpbmsgc2V0TWF4Q2FjaGVTaXplKGludCl9KS4gaXRzIGRlZmF1bHQgaXMgMCAtIGkuZS4sIG5vIGNhY2hpbmcgYnkgZGVmYXVsdCBiZWNhdXNlCi0gICAgICogbW9zdCBvZiB0aGUgYXBwcyBkb24ndCB1c2UgIj8iIHN5bnRheCBpbiB0aGVpciBzcWwsIGNhY2hpbmcgaXMgbm90IHVzZWZ1bCBmb3IgdGhlbS4KKyAgICAgKiAoQGxpbmsgc2V0TWF4U3FsQ2FjaGVTaXplKGludCl9KS4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBtQ29tcGlsZWRRdWVyaWVzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgLy8gZGVmYXVsdCBzdGF0ZW1lbnQtY2FjaGUgc2l6ZSBwZXIgZGF0YWJhc2UgY29ubmVjdGlvbiAoID0gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcykKKyAgICBwcml2YXRlIGludCBtTWF4U3FsQ2FjaGVTaXplID0gMjU7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+KG1NYXhTcWxDYWNoZVNpemUgKyAxLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnk8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgLy8gZWxkZXN0ID0gbGVhc3QtcmVjZW50bHkgdXNlZCBlbnRyeQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IG5lZWRzIHRvIGJlIHJlbW92ZWQgdG8gYWNjb21tb2RhdGUgYSBuZXcgZW50cnksCisgICAgICAgICAgICAgICAgLy8gICAgIGNsb3NlIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSwgaWYgbm90IGluIHVzZQorICAgICAgICAgICAgICAgIC8vICAgICBhbmQgdGhlbiBsZXQgaXQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBNYXAuCisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIGNhbGxlciBtdXN0IGJlIHRyeWluZyB0byBhZGQgYSBqdXN0LWNvbXBpbGVkIHN0bXQKKyAgICAgICAgICAgICAgICAvLyB0byBjYWNoZTsgaS5lLiwgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgYWNxdWlyZWQgZGF0YWJhc2UgbG9jayBBTkQKKyAgICAgICAgICAgICAgICAvLyB0aGUgbG9jayBvbiBtQ29tcGlsZWRRdWVyaWVzLiBkbyBhcyBhc3NlcnQgb2YgdGhlc2UgdHdvIDIgZmFjdHMuCisgICAgICAgICAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpIDw9IG1NYXhTcWxDYWNoZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgbm90IGZ1bGwuIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIGZ1bGwuIGVsZGVzdCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICAgICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgZW50cnkgPSBlbGRlc3QuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVudHJ5LmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gaXMgbm90IGluIHVzZS4gcmVsZWFzZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVsZWFzZVNxbFN0YXRlbWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSwgc28gdGhhdCB0aGlzIGVudHJ5IGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogYWJzb2x1dGUgbWF4IHZhbHVlIHRoYXQgY2FuIGJlIHNldCBieSB7QGxpbmsgI3NldE1heFNxbENhY2hlU2l6ZShpbnQpfQorICAgICAqIHNpemUgb2YgZWFjaCBwcmVwYXJlZC1zdGF0ZW1lbnQgaXMgYmV0d2VlbiAxSyAtIDZLLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisgICAgICogU1FMIHN0YXRlbWVudCAmIHNjaGVtYS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1FMX0NBQ0hFX1NJWkUgPSAyNTA7Ci0gICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IE1BWF9TUUxfQ0FDSEVfU0laRTsgLy8gbWF4IGNhY2hlIHNpemUgcGVyIERhdGFiYXNlIGluc3RhbmNlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMTAwOwogICAgIHByaXZhdGUgaW50IG1DYWNoZUZ1bGxXYXJuaW5nczsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gPSAxOwogCkBAIC0yODIsMTcgKzMxNiwzNCBAQAogICAgIHByaXZhdGUgaW50IG1OdW1DYWNoZUhpdHM7CiAgICAgcHJpdmF0ZSBpbnQgbU51bUNhY2hlTWlzc2VzOwogCi0gICAgLyoqIHRoZSBmb2xsb3dpbmcgMiBtZW1iZXJzIG1haW50YWluIHRoZSB0aW1lIHdoZW4gYSBkYXRhYmFzZSBpcyBvcGVuZWQgYW5kIGNsb3NlZCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UaW1lT3BlbmVkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtVGltZUNsb3NlZCA9IG51bGw7Ci0KICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZCBpbiBjYXNlIGl0IG5ldmVyIGdvdCBjbG9zZWQuICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgbVN0YWNrVHJhY2UgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogCiAgICAgLy8gU3lzdGVtIHByb3BlcnR5IHRoYXQgZW5hYmxlcyBsb2dnaW5nIG9mIHNsb3cgcXVlcmllcy4gU3BlY2lmeSB0aGUgdGhyZXNob2xkIGluIG1zLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZID0gImRiLmxvZy5zbG93X3F1ZXJ5X3RocmVzaG9sZCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNsb3dRdWVyeVRocmVzaG9sZDsKIAorICAgIC8qKiBzdG9yZXMgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50IGlkcyB0aGF0IG5lZWQgdG8gYmUgZmluYWxpemVkIGJ5IHNxbGl0ZSAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DbG9zZWRTdGF0ZW1lbnRJZHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKyAgICAvKioge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gU1FMaXRlIHJldHVybnMgYW55IG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzCisgICAgICogICAgQ29ycnVwdGlvbgorICAgICAqICovCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOworCisgICAgLyoqIFRoZSBEYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wge0BsaW5rIERhdGFiYXNlQ29ubmVjdGlvblBvb2x9LgorICAgICAqIFZpc2liaWxpdHkgaXMgcGFja2FnZS1wcml2YXRlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBvdGhlcndpc2UsIHByaXZhdGUgdmlzaWJpbGl0eSBpcyBlbm91Z2guCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2xhdGlsZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisKKyAgICAvKiogRWFjaCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBpbiB0aGUgcG9vbCBpcyBhc3NpZ25lZCBhIG51bWJlciAxLi5OLCB3aGVyZSBOIGlzIHRoZQorICAgICAqIHNpemUgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgKiBUaGUgbWFpbiBjb25uZWN0aW9uIGhhbmRsZSB0byB3aGljaCB0aGUgcG9vbCBpcyBhdHRhY2hlZCBpcyBhc3NpZ25lZCBhIHZhbHVlIG9mIDAuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzaG9ydCBtQ29ubmVjdGlvbk51bTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1PUllfREJfUEFUSCA9ICI6bWVtb3J5OiI7CisKICAgICAvKioKICAgICAgKiBAcGFyYW0gY2xvc2FibGUKICAgICAgKi8KQEAgLTMxNywxMCArMzY4LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpIHsKICAgICAgICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYmNsb3NlKCk7CisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2Ugd2hpY2ggd2lsbCBjbG9zZSBhbGwgcGVuZGluZyBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhbHNvCisgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTAsMTkgKzM5OSw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NraW5nRW5hYmxlZCA9IHRydWU7CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgb25Db3JydXB0aW9uKCkgewotICAgICAgICBMb2cuZShUQUcsICJSZW1vdmluZyBjb3JydXB0IGRhdGFiYXNlOiAiICsgbVBhdGgpOwogICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIG1QYXRoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSAoaWYgd2UgY2FuKSwgd2hpY2ggd2lsbCBjYXVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgdG8gZmFpbC4KLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEZWxldGUgdGhlIGNvcnJ1cHQgZmlsZS4gIERvbid0IHJlLWNyZWF0ZSBpdCBub3cgLS0gdGhhdCB3b3VsZCBqdXN0IGNvbmZ1c2UgcGVvcGxlCi0gICAgICAgICAgICAvLyAtLSBidXQgdGhlIG5leHQgdGltZSBzb21lb25lIHRyaWVzIHRvIG9wZW4gaXQsIHRoZXkgY2FuIHNldCBpdCB1cCBmcm9tIHNjcmF0Y2guCi0gICAgICAgICAgICBpZiAoIW1QYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUobVBhdGgpLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1FcnJvckhhbmRsZXIub25Db3JydXB0aW9uKHRoaXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDYwLDExICs0OTgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIEVYQ0xVU0lWRSBtb2RlLgorICAgICAqIDxwPgorICAgICAqIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLgorICAgICAqIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgogICAgICAqIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yCiAgICAgICogcm9sbGVkIGJhY2suIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKICAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBjb21taXR0ZWQuCi0gICAgICoKKyAgICAgKiA8L3A+CiAgICAgICogPHA+SGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKICAgICAgKgogICAgICAqIDxwcmU+CkBAIC00NzgsMTUgKzUxOSw0MiBAQAogICAgICAqIDwvcHJlPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXIobnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovKTsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbihudWxsIC8qIHRyYW5zYWN0aW9uU3RhdHVzQ2FsbGJhY2sgKi8sIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gSU1NRURJQVRFIG1vZGUuIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuCisgICAgICogdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24KKyAgICAgKiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLiBUaGUKKyAgICAgKiBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKKyAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkKKyAgICAgKiB3aWxsIGJlIGNvbW1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBIZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiAgIGRiLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgKiAgIHRyeSB7CisgICAgICogICAgIC4uLgorICAgICAqICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgKiAgIH0gZmluYWxseSB7CisgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICogICB9CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbihudWxsIC8qIHRyYW5zYWN0aW9uU3RhdHVzQ2FsbGJhY2sgKi8sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDk4LDE1ICs1NjYsNDggQEAKICAgICAgKiAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgKiAgIH0KICAgICAgKiA8L3ByZT4KKyAgICAgKgogICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGJlZ2lucywKICAgICAgKiBjb21taXRzLCBvciBpcyByb2xsZWQgYmFjaywgZWl0aGVyIGV4cGxpY2l0bHkgb3IgYnkgYSBjYWxsIHRvCiAgICAgICoge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lcikgeworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uTGlzdGVuZXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKGxpc3RlbmVyKTsKKyAgICAgKiAgIHRyeSB7CisgICAgICogICAgIC4uLgorICAgICAqICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgKiAgIH0gZmluYWxseSB7CisgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICogICB9CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZQorICAgICAqICAgICAgICAgICAgdHJhbnNhY3Rpb24gYmVnaW5zLCBjb21taXRzLCBvciBpcyByb2xsZWQgYmFjaywgZWl0aGVyCisgICAgICogICAgICAgICAgICBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0byB7QGxpbmsgI3lpZWxkSWZDb250ZW5kZWRTYWZlbHl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUoCisgICAgICAgICAgICBTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luVHJhbnNhY3Rpb24oU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgYm9vbGVhbiBleGNsdXNpdmUpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgbG9ja0ZvcmNlZCgpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gb2sgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGFscmVhZHkgaGFkIHRoZSBsb2NrIHRoZW4gZ2V0IG91dApAQCAtNTI0LDcgKzYyNSwxMSBAQAogCiAgICAgICAgICAgICAvLyBUaGlzIHRocmVhZCBkaWRuJ3QgYWxyZWFkeSBoYXZlIHRoZSBsb2NrLCBzbyBiZWdpbiBhIGRhdGFiYXNlCiAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBub3cuCi0gICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBFWENMVVNJVkU7Iik7CisgICAgICAgICAgICBpZiAoZXhjbHVzaXZlKSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBJTU1FRElBVEU7Iik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVHJhbnNhY3Rpb25MaXN0ZW5lciA9IHRyYW5zYWN0aW9uTGlzdGVuZXI7CiAgICAgICAgICAgICBtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSB0cnVlOwogICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU1MSwxMiArNjU2LDcgQEAKICAgICAgKiBhcmUgY29tbWl0dGVkIGFuZCByb2xsZWQgYmFjay4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmRUcmFuc2FjdGlvbigpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyB0cmFuc2FjdGlvbiBwZW5kaW5nIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAobUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBtSW5uZXJUcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCA9IGZhbHNlOwpAQCAtNTgxLDYgKzY4MSwxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1UcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCkgewogICAgICAgICAgICAgICAgIGV4ZWNTUUwoQ09NTUlUX1NRTCk7CisgICAgICAgICAgICAgICAgLy8gaWYgd3JpdGUtYWhlYWQgbG9nZ2luZyBpcyB1c2VkLCB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBjaGVja3BvaW50LgorICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBhcHBsaWNhdGlvbnMgYmUgZ2l2ZW4gdGhlIGZsZXhpYmlsaXR5IG9mIGNob29zaW5nIHdoZW4gdG8KKyAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNoZWNrcG9pbnQ/CisgICAgICAgICAgICAgICAgLy8gZm9yIG5vdywgZG8gY2hlY2twb2ludCBhZnRlciBldmVyeSBDT01NSVQgYmVjYXVzZSB0aGF0IGlzIHRoZSBmYXN0ZXN0CisgICAgICAgICAgICAgICAgLy8gd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHJlYWRlcnMgd2lsbCBzZWUgbGF0ZXN0IGRhdGEuCisgICAgICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgdGhlIHNsb3dlc3Qgd2F5IHRvIHJ1biBzcWxpdGUgd2l0aCBpbiB3cml0ZS1haGVhZCBsb2dnaW5nIG1vZGUuCisgICAgICAgICAgICAgICAgaWYgKHRoaXMubUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY1NRTCgiUFJBR01BIHdhbF9jaGVja3BvaW50OyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlBSQUdNQSB3YWxfQ2hlY2twb2ludCBkb25lIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlJPTExCQUNLOyIpOwpAQCAtNjE0LDkgKzcyNiw3IEBACiAgICAgICogdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBtYXJrZWQgYXMgc3VjY2Vzc2Z1bC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwogICAgICAgICB9CkBAIC04MTQsMzAgKzkyNCw2OSBAQAogICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkYXRhYmFzZSBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIHtAbGluayAjT1BFTl9SRUFEV1JJVEV9CisgICAgICoge0BsaW5rICNPUEVOX1JFQURPTkxZfSB7QGxpbmsgI0NSRUFURV9JRl9ORUNFU1NBUll9IGFuZC9vciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LgorICAgICAqCisgICAgICogPHA+U2V0cyB0aGUgbG9jYWxlIG9mIHRoZSBkYXRhYmFzZSB0byB0aGUgIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGxvY2FsZS4KKyAgICAgKiBDYWxsIHtAbGluayAjc2V0TG9jYWxlfSBpZiB5b3Ugd291bGQgbGlrZSBzb21ldGhpbmcgZWxzZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0byBkYXRhYmFzZSBmaWxlIHRvIG9wZW4gYW5kL29yIGNyZWF0ZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICAgICAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIGZsYWdzIHRvIGNvbnRyb2wgZGF0YWJhc2UgYWNjZXNzIG1vZGUKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IG9iaiB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uCisgICAgICogd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgb3BlbmVkIGRhdGFiYXNlCisgICAgICogQHRocm93cyBTUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGNhbm5vdCBiZSBvcGVuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2Ugc3FsaXRlRGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAoc2hvcnQpIDAgLyogdGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgKi8pOworCisgICAgICAgIC8vIHNldCBzcWxpdGUgcGFnZXNpemUgdG8gbUJsb2NrU2l6ZQorICAgICAgICBpZiAoc0Jsb2NrU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiAiL2RhdGEiIHNob3VsZCBiZSBhIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uc3RhbnQgc29tZXdoZXJlLiBpdCBpcyBoYXJkY29kZWQKKyAgICAgICAgICAgIC8vIGluIHNldmVyYWwgcGxhY2VzIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHNCbG9ja1NpemUgPSBuZXcgU3RhdEZzKCIvZGF0YSIpLmdldEJsb2NrU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZURhdGFiYXNlLnNldFBhZ2VTaXplKHNCbG9ja1NpemUpOworICAgICAgICBzcWxpdGVEYXRhYmFzZS5zZXRKb3VybmFsTW9kZShwYXRoLCAiVFJVTkNBVEUiKTsKKworICAgICAgICAvLyBhZGQgdGhpcyBkYXRhYmFzZSB0byB0aGUgbGlzdCBvZiBkYXRhYmFzZXMgb3BlbmVkIGluIHRoaXMgcHJvY2VzcworICAgICAgICBBY3RpdmVEYXRhYmFzZXMuYWRkQWN0aXZlRGF0YWJhc2Uoc3FsaXRlRGF0YWJhc2UpOworICAgICAgICByZXR1cm4gc3FsaXRlRGF0YWJhc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIE9wZW4gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MpOworICAgICAgICAgICAgZGIuZGJvcGVuKHBhdGgsIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLnNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVNxbFRyYWNpbmcocGF0aCk7CisgICAgICAgICAgICAgICAgZGIuZW5hYmxlU3FsVHJhY2luZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfVElNRSkgewotICAgICAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxQcm9maWxpbmcocGF0aCwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGI7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVjb3ZlciBmcm9tIHRoaXMsIGlmIHdlIGNhbi4KLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkbyB0aGlzIGZvciBvdGhlciBvcGVuIGZhaWx1cmVzPwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGVsZXRpbmcgYW5kIHJlLWNyZWF0aW5nIGNvcnJ1cHQgZGF0YWJhc2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVF9EQl9DT1JSVVBULCBwYXRoKTsKLSAgICAgICAgICAgIGlmICghcGF0aC5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5IikpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgaXMgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZSBmaWxlcwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKHBhdGgpLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MpOworICAgICAgICAgICAgZGIubUVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24oZGIpOworICAgICAgICAgICAgcmV0dXJuIFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBvcGVuIHRoZSBkYXRhYmFzZS4gY2xvc2luZyBpdC4iLCBlKTsKKyAgICAgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9Ci0gICAgICAgIEFjdGl2ZURhdGFiYXNlcy5nZXRJbnN0YW5jZSgpLm1BY3RpdmVEYXRhYmFzZXMuYWRkKAotICAgICAgICAgICAgICAgIG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOwotICAgICAgICByZXR1cm4gc3FsaXRlRGF0YWJhc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NTUsNiArMTAwNCwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlksIGVycm9ySGFuZGxlcikuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Sm91cm5hbE1vZGUoZmluYWwgU3RyaW5nIGRiUGF0aCwgZmluYWwgU3RyaW5nIG1vZGUpIHsKKyAgICAgICAgLy8gam91cm5hbCBtb2RlIGNhbiBiZSBzZXQgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZXMKKyAgICAgICAgaWYgKCFkYlBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gRGF0YWJhc2VVdGlscy5zdHJpbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIGpvdXJuYWxfbW9kZT0iICsgbW9kZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoIXMuZXF1YWxzSWdub3JlQ2FzZShtb2RlKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInNldHRpbmcgam91cm5hbF9tb2RlIHRvICIgKyBtb2RlICsgIiBmYWlsZWQgZm9yIGRiOiAiICsgZGJQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKG9uIHByYWdtYSBzZXQgam91cm5hbF9tb2RlLCBzcWxpdGUgcmV0dXJuZWQ6IiArIHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbWVtb3J5IGJhY2tlZCBTUUxpdGUgZGF0YWJhc2UuICBJdHMgY29udGVudHMgd2lsbCBiZSBkZXN0cm95ZWQKICAgICAgKiB3aGVuIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQuCiAgICAgICoKQEAgLTg2Nyw3ICsxMDM1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZShDdXJzb3JGYWN0b3J5IGZhY3RvcnkpIHsKICAgICAgICAgLy8gVGhpcyBpcyBhIG1hZ2ljIHN0cmluZyB3aXRoIHNwZWNpYWwgbWVhbmluZyBmb3IgU1FMaXRlLgotICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKCI6bWVtb3J5OiIsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKE1FTU9SWV9EQl9QQVRILCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg4MCwxNSArMTA0OCwyMCBAQAogICAgICAgICBsb2NrKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7CisgICAgICAgICAgICAvLyBmaW5hbGl6ZSBBTEwgc3RhdGVtZW50cyBxdWV1ZWQgdXAgc28gZmFyCisgICAgICAgICAgICBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CiAgICAgICAgICAgICAvLyBjbG9zZSB0aGlzIGRhdGFiYXNlIGluc3RhbmNlIC0gcmVnYXJkbGVzcyBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IHZhbHVlCi0gICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgZGJjbG9zZSgpOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB1bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbG9zZUNsb3NhYmxlKCkgewotICAgICAgICAvKiBkZWFsbG9jYXRlIGFsbCBjb21waWxlZCBzcWwgc3RhdGVtZW50IG9iamVjdHMgZnJvbSBtQ29tcGlsZWRRdWVyaWVzIGNhY2hlLgorICAgICAgICAvKiBkZWFsbG9jYXRlIGFsbCBjb21waWxlZCBTUUwgc3RhdGVtZW50IG9iamVjdHMgZnJvbSBtQ29tcGlsZWRRdWVyaWVzIGNhY2hlLgogICAgICAgICAgKiB0aGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBkZS1yZWZlcmVuY2luZyBhbGwge0BsaW5rIFNRTGl0ZUNsb3NhYmxlfSBvYmplY3RzCiAgICAgICAgICAqIGZyb20gdGhpcyBkYXRhYmFzZSBvYmplY3QgYmVjYXVzZSBjYWxsaW5nCiAgICAgICAgICAqIHtAbGluayBTUUxpdGVDbG9zYWJsZSNvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKX0gY291bGQgY2F1c2UgdGhlIGRhdGFiYXNlCkBAIC05MTgsMTkgKzEwOTEsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHZlcnNpb24KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiKTsKLSAgICAgICAgICAgIGxvbmcgdmVyc2lvbiA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmVyc2lvbjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiAoKExvbmcpIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgdXNlcl92ZXJzaW9uOyIsIG51bGwpKS5pbnRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTQ4LDIwICsxMTA5LDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbWF4aW11bSBkYXRhYmFzZSBzaXplCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0TWF4aW11bVNpemUoKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIpOwotICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHBhZ2VDb3VudCAqIGdldFBhZ2VTaXplKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIHBhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQ7IiwgbnVsbCk7CisgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTcyLDI2ICsxMTIxLDE1IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNldE1heGltdW1TaXplKGxvbmcgbnVtQnl0ZXMpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7CisgICAgICAgIGxvbmcgcGFnZVNpemUgPSBnZXRQYWdlU2l6ZSgpOworICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKKyAgICAgICAgLy8gSWYgbnVtQnl0ZXMgaXNuJ3QgYSBtdWx0aXBsZSBvZiBwYWdlU2l6ZSwgYnVtcCB1cCBhIHBhZ2UKKyAgICAgICAgaWYgKChudW1CeXRlcyAlIHBhZ2VTaXplKSAhPSAwKSB7CisgICAgICAgICAgICBudW1QYWdlcysrOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKLSAgICAgICAgICAgIGxvbmcgbnVtUGFnZXMgPSBudW1CeXRlcyAvIHBhZ2VTaXplOwotICAgICAgICAgICAgLy8gSWYgbnVtQnl0ZXMgaXNuJ3QgYSBtdWx0aXBsZSBvZiBwYWdlU2l6ZSwgYnVtcCB1cCBhIHBhZ2UKLSAgICAgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIG51bVBhZ2VzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiUFJBR01BIG1heF9wYWdlX2NvdW50ID0gIiArIG51bVBhZ2VzKTsKLSAgICAgICAgICAgIGxvbmcgbmV3UGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGxvbmcgbmV3UGFnZUNvdW50ID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcywKKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgcmV0dXJuIG5ld1BhZ2VDb3VudCAqIHBhZ2VTaXplOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAwMCwyMCArMTEzOCw3IEBACiAgICAgICogQHJldHVybiB0aGUgZGF0YWJhc2UgcGFnZSBzaXplLCBpbiBieXRlcwogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldFBhZ2VTaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBwYWdlX3NpemU7Iik7Ci0gICAgICAgICAgICBsb25nIHNpemUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBwYWdlX3NpemU7IiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTAxLDcgKzEyMjYsNyBAQAogICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgICBleGVjU1FMKCJVUERBVEUgIiArIGluZm8ubWFzdGVyVGFibGUKICAgICAgICAgICAgICAgICAgICAgKyAiIFNFVCBfc3luY19kaXJ0eT0xIFdIRVJFIF9pZD0oU0VMRUNUICIgKyBpbmZvLmZvcmVpZ25LZXkKLSAgICAgICAgICAgICAgICAgICAgKyAiIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSBfaWQ9IiArIHJvd0lkICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgKyAiIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSBfaWQ9PykiLCBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKHJvd0lkKX0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTQxLDE0ICsxMjY2LDE5IEBACiAgICAgICoge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH1zIGFyZSBub3Qgc3luY2hyb25pemVkLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlU3RhdGVtZW50IGNvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IHNxbC50cmltKCkuc3Vic3RyaW5nKDAsIDYpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IHRoaXM7CisgICAgICAgIC8vIGdldCBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSB0byB1c2UsIGlmIHRoaXMgaXMgYSBxdWVyeQorICAgICAgICBpZiAocHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpKSB7CisgICAgICAgICAgICBkYiA9IGdldERiQ29ubmVjdGlvbihzcWwpOwogICAgICAgICB9CisgICAgICAgIGRiLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudChkYiwgc3FsKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgcmVsZWFzZURiQ29ubmVjdGlvbihkYik7CisgICAgICAgICAgICBkYi51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIyNiw5ICsxMzU2LDcgQEAKICAgICAgICAgICAgIGJvb2xlYW4gZGlzdGluY3QsIFN0cmluZyB0YWJsZSwgU3RyaW5nW10gY29sdW1ucywKICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBncm91cEJ5LAogICAgICAgICAgICAgU3RyaW5nIGhhdmluZywgU3RyaW5nIG9yZGVyQnksIFN0cmluZyBsaW1pdCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIFN0cmluZyBzcWwgPSBTUUxpdGVRdWVyeUJ1aWxkZXIuYnVpbGRRdWVyeVN0cmluZygKICAgICAgICAgICAgICAgICBkaXN0aW5jdCwgdGFibGUsIGNvbHVtbnMsIHNlbGVjdGlvbiwgZ3JvdXBCeSwgaGF2aW5nLCBvcmRlckJ5LCBsaW1pdCk7CiAKQEAgLTEzMzksOSArMTQ2Nyw3IEBACiAgICAgcHVibGljIEN1cnNvciByYXdRdWVyeVdpdGhGYWN0b3J5KAogICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBjdXJzb3JGYWN0b3J5LCBTdHJpbmcgc3FsLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAogICAgICAgICAgICAgU3RyaW5nIGVkaXRUYWJsZSkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSAwOwogCkBAIC0xMzQ5LDcgKzE0NzUsOCBAQAogICAgICAgICAgICAgdGltZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIH0KIAotICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcih0aGlzLCBzcWwsIGVkaXRUYWJsZSk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIgPSBuZXcgU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyKGRiLCBzcWwsIGVkaXRUYWJsZSk7CiAKICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC0xMzc1LDYgKzE1MDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjxudWxsPiIpICArICIsIGNvdW50IGlzICIgKyBjb3VudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVsZWFzZURiQ29ubmVjdGlvbihkYik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGN1cnNvcjsKICAgICB9CkBAIC0xNTAxLDEwICsxNjI5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBpbnNlcnRXaXRoT25Db25mbGljdChTdHJpbmcgdGFibGUsIFN0cmluZyBudWxsQ29sdW1uSGFjaywKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgaW5pdGlhbFZhbHVlcywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCBzcWwgbGVuZ3RocyA8PSAxNTIKICAgICAgICAgU3RyaW5nQnVpbGRlciBzcWwgPSBuZXcgU3RyaW5nQnVpbGRlcigxNTIpOwpAQCAtMTU5MywxMSArMTcxOSw5IEBACiAgICAgICogICAgICAgICB3aGVyZUNsYXVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGRlbGV0ZShTdHJpbmcgdGFibGUsIFN0cmluZyB3aGVyZUNsYXVzZSwgU3RyaW5nW10gd2hlcmVBcmdzKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwogICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KCJERUxFVEUgRlJPTSAiICsgdGFibGUKQEAgLTE2NzcsMTAgKzE4MDEsOCBAQAogICAgICAgICAgICAgc3FsLmFwcGVuZCh3aGVyZUNsYXVzZSk7CiAgICAgICAgIH0KIAorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbC50b1N0cmluZygpKTsKQEAgLTE3MjUsMjEgKzE4NDcsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2sKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QKKyAgICAgKiBvciBhbnkgb3RoZXIgU1FMIHN0YXRlbWVudCB0aGF0IHJldHVybnMgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Ugb2YgdGhpcyBtZXRob2QgaXMgZGlzY291cmFnZWQgYXMgaXQgZG9lc24ndCBwZXJmb3JtIHdlbGwgd2hlbiBpc3N1aW5nIHRoZSBzYW1lIFNRTAorICAgICAqIHN0YXRlbWVudCByZXBlYXRlZGx5IChzZWUge0BsaW5rICNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9IHRvIHByZXBhcmUgc3RhdGVtZW50cyBmb3IKKyAgICAgKiByZXBlYXRlZCB1c2UpLCBhbmQgaXQgaGFzIG5vIG1lYW5zIHRvIHJldHVybiBhbnkgZGF0YSAoc3VjaCBhcyB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIHJvd3MpLgorICAgICAqIEluc3RlYWQsIHlvdSdyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QGxpbmsgI2luc2VydChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9LAorICAgICAqIHtAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9LCBldCBhbCwgd2hlbiBwb3NzaWJsZS4KKyAgICAgKiA8L3A+CiAgICAgICoKKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIGFyZQorICAgICAqIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3Igc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjU1FMKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBzcWwgPSBzcWwudHJpbSgpOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3FsLnN1YnN0cmluZygwLCA2KTsKKyAgICAgICAgaWYgKHByZWZpeC5lcXVhbHNJZ25vcmVDYXNlKCJBVFRBQ0giKSkgeworICAgICAgICAgICAgZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBsb2dUaW1lU3RhdChtTGFzdFNxbFN0YXRlbWVudCwgdGltZVN0YXJ0LCBHRVRfTE9DS19MT0dfUFJFRklYKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKICAgICAgICAgICAgIG5hdGl2ZV9leGVjU1FMKHNxbCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKQEAgLTE3NTksMTEgKzE4OTMsMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2ssCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUL0lOU0VSVC9VUERBVEUvREVMRVRFLgorICAgICAqIDxwPgorICAgICAqIEZvciBJTlNFUlQgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0T3JUaHJvdyhTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzLCBpbnQpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgVVBEQVRFIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZShTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICN1cGRhdGVXaXRoT25Db25mbGljdChTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10sIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBERUxFVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjZGVsZXRlKFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFyZSBnb29kIGNhbmRpZGF0ZXMgZm9yIHVzaW5nIHRoaXMgbWV0aG9kOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BTFRFUiBUQUJMRTwvbGk+CisgICAgICogICA8bGk+Q1JFQVRFIG9yIERST1AgdGFibGUgLyB0cmlnZ2VyIC8gdmlldyAvIGluZGV4IC8gdmlydHVhbCB0YWJsZTwvbGk+CisgICAgICogICA8bGk+UkVJTkRFWDwvbGk+CisgICAgICogICA8bGk+UkVMRUFTRTwvbGk+CisgICAgICogICA8bGk+U0FWRVBPSU5UPC9saT4KKyAgICAgKiAgIDxsaT5QUkFHTUEgdGhhdCByZXR1cm5zIG5vIGRhdGE8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgogICAgICAqCi0gICAgICogQHBhcmFtIHNxbAorICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgYXJlCisgICAgICogbm90IHN1cHBvcnRlZC4KICAgICAgKiBAcGFyYW0gYmluZEFyZ3Mgb25seSBieXRlW10sIFN0cmluZywgTG9uZyBhbmQgRG91YmxlIGFyZSBzdXBwb3J0ZWQgaW4gYmluZEFyZ3MuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3Igc29tZSByZWFzb24KICAgICAgKi8KQEAgLTE3NzIsMTEgKzE5MzQsOSBAQAogICAgICAgICBpZiAoYmluZEFyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgYmluZEFyZ3MiKTsKICAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbCk7CkBAIC0xODEwLDE0ICsxOTcwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4gU2VlIHtAbGluayAjY3JlYXRlfSBhbmQge0BsaW5rICNvcGVuRGF0YWJhc2V9LgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQogICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGN1cnNvcnMsIG1heSBiZSBOVUxMLgogICAgICAqIEBwYXJhbSBmbGFncyAwIG9yIHtAbGluayAjTk9fTE9DQUxJWkVEX0NPTExBVE9SU30uICBJZiB0aGUgZGF0YWJhc2UgZmlsZSBhbHJlYWR5CiAgICAgICogICAgICAgICAgICAgIGV4aXN0cywgbUZsYWdzIHdpbGwgYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LgorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgVGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4gbWF5IGJlIE5VTEwuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gMCBmb3IgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZS4gMS4uTiBmb3IgcG9vbGVkIGRhdGFiYXNlCisgICAgICogY29ubmVjdGlvbiBoYW5kbGVzLgogICAgICAqLwotICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGF0aCBzaG91bGQgbm90IGJlIG51bGwiKTsKICAgICAgICAgfQpAQCAtMTgyNiwyNSArMTk5MSwxMSBAQAogICAgICAgICBtU2xvd1F1ZXJ5VGhyZXNob2xkID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoTE9HX1NMT1dfUVVFUklFU19QUk9QRVJUWSwgLTEpOwogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICBkYm9wZW4obVBhdGgsIG1GbGFncyk7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgIG1UaW1lT3BlbmVkID0gZ2V0VGltZSgpOwotICAgICAgICB9CiAgICAgICAgIG1Qcm9ncmFtcyA9IG5ldyBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSxPYmplY3Q+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHNldExvY2FsZSgpIHdoZW4gY29uc3RydWN0aW5nLCBjbG9zaW5nIHRoZSBkYXRhYmFzZSIsIGUpOwotICAgICAgICAgICAgZGJjbG9zZSgpOwotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgIG1UaW1lQ2xvc2VkID0gZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgIikuZm9ybWF0KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgLy8gU2V0IHRoZSBEYXRhYmFzZUVycm9ySGFuZGxlciB0byBiZSB1c2VkIHdoZW4gU1FMaXRlIHJlcG9ydHMgY29ycnVwdGlvbi4KKyAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzZXRzIGVycm9ySGFuZGxlciA9IG51bGwsIHRoZW4gdXNlIGRlZmF1bHQgZXJyb3JoYW5kbGVyLgorICAgICAgICBtRXJyb3JIYW5kbGVyID0gKGVycm9ySGFuZGxlciA9PSBudWxsKSA/IG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSA6IGVycm9ySGFuZGxlcjsKKyAgICAgICAgbUNvbm5lY3Rpb25OdW0gPSBjb25uZWN0aW9uTnVtOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk3MCw2ICsyMTIxLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5RGJJc09wZW4oKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBnZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5TG9ja093bmVyKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBpZiAobUxvY2tpbmdFbmFibGVkICYmICFpc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRvbid0IGhhdmUgZGF0YWJhc2UgbG9jayEiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qCiAgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAqCkBAIC0xOTc3LDIyICsyMTQxLDE0IEBACiAgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAqLwogICAgIC8qKgotICAgICAqIGFkZHMgdGhlIGdpdmVuIHNxbCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gU1FMIGFuZCBpdHMgY29tcGlsZWQtc3RhdGVtZW50LWlkLXJldHVybmVkLWJ5LXNxbGl0ZSB0byB0aGUKICAgICAgKiBjYWNoZSBvZiBjb21waWxlZFF1ZXJpZXMgYXR0YWNoZWQgdG8gJ3RoaXMnLgotICAgICAqCi0gICAgICogaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gaW4gY29tcGlsZWRRdWVyaWVzIGZvciB0aGUgZ2l2ZW4gc3FsLAorICAgICAqIDxwPgorICAgICAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIFNRTCwKICAgICAgKiB0aGUgbmV3IHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gb2JqZWN0IGlzIE5PVCBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSAoaS5lLix0aGUgY3VycmVudAogICAgICAqIG1hcHBpbmcgaXMgTk9UIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBtYXBwaW5nKS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgYWRkVG9Db21waWxlZFF1ZXJpZXMoU3RyaW5nIHNxbCwgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQpIHsKLSAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgLy8gZm9yIHRoaXMgZGF0YWJhc2UsIHRoZXJlIGlzIG5vIGNhY2hlIG9mIGNvbXBpbGVkIHNxbC4KLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Tk9UIGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFNxbCA9IG51bGw7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICAvLyBkb24ndCBpbnNlcnQgdGhlIG5ldyBtYXBwaW5nIGlmIGEgbWFwcGluZyBhbHJlYWR5IGV4aXN0cwpAQCAtMjAwMCwzNSArMjE1NiwzMCBAQAogICAgICAgICAgICAgaWYgKGNvbXBpbGVkU3FsICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGQgdGhpcyA8c3FsLCBjb21waWxlZFN0YXRlbWVudD4gdG8gdGhlIGNhY2hlCisKICAgICAgICAgICAgIGlmIChtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSA9PSBtTWF4U3FsQ2FjaGVTaXplKSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBjYWNoZSBzaXplIG9mIHtAbGluayAjbU1heFNxbENhY2hlU2l6ZX0gaXMgbm90IGVub3VnaCBmb3IgdGhpcyBhcHAuCi0gICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZyBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiB0aW1lcwotICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIHNvIGNhY2hpbmcgaXMgdXNlbGVzcy4KLSAgICAgICAgICAgICAgICAgKiBUT0RPOiBlaXRoZXIgbGV0IHRoZSBjYWxsZXJzIHNldCBtYXggY2NoZXNpemUgZm9yIHRoZWlyIGFwcCwgb3IgaW50ZWxsaWdlbnRseQotICAgICAgICAgICAgICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBzaG91bGQgYmUgY2FjaGVkIGZvciBhIGdpdmVuIGFwcC4KKyAgICAgICAgICAgICAgICAgKiBsb2cgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIG9yIGNhY2hlc2l6ZSBpcyB0b28gc21hbGwuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCsrbUNhY2hlRnVsbFdhcm5pbmdzID09IE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlYWNoZWQgTUFYIHNpemUgZm9yIGNvbXBpbGVkLXNxbCBzdGF0ZW1lbnQgY2FjaGUgZm9yIGRhdGFiYXNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICI7IGkuZS4sIE5PIHNwYWNlIGZvciB0aGlzIHNxbCBzdGF0ZW1lbnQgaW4gY2FjaGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbCArICIuIFBsZWFzZSBjaGFuZ2UgeW91ciBzcWwgc3RhdGVtZW50cyB0byB1c2UgJz8nIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluZGFyZ3MsIGluc3RlYWQgb2YgdXNpbmcgYWN0dWFsIHZhbHVlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICIuIENvbnNpZGVyIGluY3JlYXNpbmcgY2FjaGVzaXplLiIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgdGhpcyBlbnRyeSB0byBjYWNoZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBOT1QgZnVsbC4gYWRkIHRoaXMgdG8gY2FjaGUuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8YWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIC8qIGFkZCB0aGUgZ2l2ZW4gU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgdG8gY2FjaGUuCisgICAgICAgICAgICAgKiBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBjYWNoZSBzaXplIC0gYmVjYXVzZSB7QGxpbmsgI21Db21waWxlZFF1ZXJpZXN9CisgICAgICAgICAgICAgKiBzZWxmLWxpbWl0cyBpdHMgc2l6ZSB0byB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnB1dChzcWwsIGNvbXBpbGVkU3RhdGVtZW50KTsKKyAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8YWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpICsgInwiICsgc3FsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm47CiAgICAgfQogCi0KICAgICBwcml2YXRlIHZvaWQgZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgZm9yIChTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFNxbCA6IG1Db21waWxlZFF1ZXJpZXMudmFsdWVzKCkpIHsKQEAgLTIwMzksMjAgKzIxOTAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBmcm9tIHRoZSBjb21waWxlZFF1ZXJpZXMgY2FjaGUsIHJldHVybnMgdGhlIGNvbXBpbGVkLXN0YXRlbWVudC1pZCBmb3IgdGhlIGdpdmVuIHNxbC4KLSAgICAgKiByZXR1cm5zIG51bGwsIGlmIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuCisgICAgICogRnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBTUUwuCisgICAgICogUmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwgZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoU3RyaW5nIHNxbCkgewogICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFN0YXRlbWVudCA9IG51bGw7CiAgICAgICAgIGJvb2xlYW4gY2FjaGVIaXQ7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBpZiAobU1heFNxbENhY2hlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgZGF0YWJhc2UsIHRoZXJlIGlzIG5vIGNhY2hlIG9mIGNvbXBpbGVkIHNxbC4KLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInxjYWNoZSBOT1QgZm91bmR8IiArIGdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FjaGVIaXQgPSAoY29tcGlsZWRTdGF0ZW1lbnQgPSBtQ29tcGlsZWRRdWVyaWVzLmdldChzcWwpKSAhPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChjYWNoZUhpdCkgewpAQCAtMjA2NSw2MyArMjIwOSwyNCBAQAogICAgICAgICAgICAgTG9nLnYoVEFHLCAifGNhY2hlX3N0YXRzfCIgKwogICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAifCIgKyBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArCiAgICAgICAgICAgICAgICAgICAgICJ8IiArIG1OdW1DYWNoZUhpdHMgKyAifCIgKyBtTnVtQ2FjaGVNaXNzZXMgKwotICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIG1UaW1lT3BlbmVkICsgInwiICsgbVRpbWVDbG9zZWQgKyAifCIgKyBzcWwpOworICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIHNxbCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvbXBpbGVkU3RhdGVtZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3FsIGlzIGNhY2hlZCBpbiBjb21waWxlZC1zcWwgY2FjaGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHVyZ2VzIHRoZSBnaXZlbiBzcWwgZnJvbSB0aGUgY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVyZ2VGcm9tQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnJlbW92ZShzcWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY29tcGlsZWQgc3FsIGNhY2hlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbXBpbGVkU3FsQ2FjaGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGN1cnJlbnQgbWF4Q2FjaGVTcWxDYWNoZVNpemUKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1heFNxbENhY2hlU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhTcWxDYWNoZVNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBtYXggc2l6ZSBvZiB0aGUgY29tcGlsZWQgc3FsIGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlIGFmdGVyIHB1cmdpbmcgdGhlIGNhY2hlLgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcHJlcGFyZWQtc3RhdGVtZW50IGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlLgogICAgICAqIChzaXplIG9mIHRoZSBjYWNoZSA9IG51bWJlciBvZiBjb21waWxlZC1zcWwtc3RhdGVtZW50cyBzdG9yZWQgaW4gdGhlIGNhY2hlKS4KKyAgICAgKjxwPgorICAgICAqIE1heGltdW0gY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMTApLgorICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IG1heGltdW0gdmFsdWUsCisgICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCiAgICAgICoKLSAgICAgKiBtYXggY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMCkuCi0gICAgICogaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbU1heFNxbENhY2hlU2l6ZSwKLSAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKgotICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdCB0aHJlYWRzIHRvIGNoYW5nZSBjYWNoZSBzaXplIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byBNQVhfU1FMX0NBQ0hFX1NJWkUpCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIG9yIDwgMCBvcgotICAgICAqIDwgdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCi0gICAgICoKLSAgICAgKiBAaGlkZQorICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8ge0BsaW5rICNNQVhfU1FMX0NBQ0hFX1NJWkV9KQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSBvcgorICAgICAqID4gdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE1heFNxbENhY2hlU2l6ZShpbnQgY2FjaGVTaXplKSB7CiAgICAgICAgIGlmIChjYWNoZVNpemUgPiBNQVhfU1FMX0NBQ0hFX1NJWkUgfHwgY2FjaGVTaXplIDwgMCkgewpAQCAtMjEzMywxMiArMjIzOCwyMTYgQEAKICAgICAgICAgbU1heFNxbENhY2hlU2l6ZSA9IGNhY2hlU2l6ZTsKICAgICB9CiAKKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNTcWxJblN0YXRlbWVudENhY2hlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGZpbmFsaXplU3RhdGVtZW50TGF0ZXIoaW50IGlkKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIGRhdGFiYXNlIGFscmVhZHkgY2xvc2VkLiB0aGlzIHN0YXRlbWVudCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGZpbmFsaXplZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQobUNsb3NlZFN0YXRlbWVudElkcykgeworICAgICAgICAgICAgaWYgKG1DbG9zZWRTdGF0ZW1lbnRJZHMuY29udGFpbnMoaWQpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBzdGF0ZW1lbnQgaWQgaXMgYWxyZWFkeSBxdWV1ZWQgdXAgZm9yIGZpbmFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmFkZChpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwdWJsaWMgdmlzaWJpbGl0eSBvbmx5IGZvciB0ZXN0aW5nLiBvdGhlcndpc2UsIHBhY2thZ2UgdmlzaWJpbGl0eSBpcyBzdWZmaWNpZW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGRhdGFiYXNlIGlzIGFscmVhZHkgY2xvc2VkLCBubyBuZWVkIHRvIGZpbmFsaXplIGFueXRoaW5nLgorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAvKiB0byBtaW5pbWl6ZSBzeW5jaHJvbml6YXRpb24gb24gbUNsb3NlZFN0YXRlbWVudElkcywgbWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KG1DbG9zZWRTdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGxpc3QuYWRkQWxsKG1DbG9zZWRTdGF0ZW1lbnRJZHMpOworICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIC8vIGZpbmFsaXplIGFsbCB0aGUgc3RhdGVtZW50cyBmcm9tIHRoZSBjb3BpZWQgbGlzdAorICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKGxpc3QuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGZvciB0ZXN0aW5nIG9ubHkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW50ZWdlcj4gZ2V0UXVldWVkVXBTdG10TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1DbG9zZWRTdGF0ZW1lbnRJZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBwYXJhbGxlbCBleGVjdXRpb24gb2YgcXVlcmllcyBmcm9tIG11bHRpcGxlIHRocmVhZHMgb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICogSXQgZG9lcyB0aGlzIGJ5IG9wZW5pbmcgbXVsdGlwbGUgaGFuZGxlcyB0byB0aGUgZGF0YWJhc2UgYW5kIHVzaW5nIGEgZGlmZmVyZW50CisgICAgICogZGF0YWJhc2UgaGFuZGxlIGZvciBlYWNoIHF1ZXJ5LgorICAgICAqIDxwPgorICAgICAqIElmIGEgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3Mgb24gb25lIGNvbm5lY3Rpb24gaGFuZGxlIGFuZCBzYXksIGEgdGFibGUgaXMgdXBkYXRlZCBpbiB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiwgdGhlbiBxdWVyeSBvbiB0aGUgc2FtZSB0YWJsZSBvbiBhbm90aGVyIGNvbm5lY3Rpb24gaGFuZGxlIHdpbGwgYmxvY2sgZm9yIHRoZQorICAgICAqIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlLiBCdXQgdGhpcyBtZXRob2QgZW5hYmxlcyBzdWNoIHF1ZXJpZXMgdG8gZXhlY3V0ZSBieSBoYXZpbmcgdGhlbQorICAgICAqIHJldHVybiBvbGQgdmVyc2lvbiBvZiB0aGUgZGF0YSBmcm9tIHRoZSB0YWJsZS4gTW9zdCBvZnRlbiBpdCBpcyB0aGUgZGF0YSB0aGF0IGV4aXN0ZWQgaW4gdGhlCisgICAgICogdGFibGUgcHJpb3IgdG8gdGhlIGFib3ZlIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gdGhhdCB0YWJsZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgaGFuZGxlcyB1c2VkIHRvIGV4ZWN1dGUgcXVlcmllcyBpbiBwYXJhbGxlbCBpcworICAgICAqIGRlcGVuZGVudCB1cG9uIHRoZSBkZXZpY2UgbWVtb3J5IGFuZCBwb3NzaWJseSBvdGhlciBwcm9wZXJ0aWVzLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsbGVsIGlzIGVuYWJsZWQgYXMgbG9uZyBhcyB0aGlzCisgICAgICogZGF0YWJhc2UgaGFuZGxlIGlzIG9wZW4uIFRvIGRpc2FibGUgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxsZWwsIGRhdGFiYXNlIHNob3VsZAorICAgICAqIGJlIGNsb3NlZCBhbmQgcmVvcGVuZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBxdWVyeSBpcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24sIHRoZW4gaXQgaXMgZXhlY3V0ZWQgb24gdGhlIHNhbWUgZGF0YWJhc2UgaGFuZGxlIHRoZQorICAgICAqIHRyYW5zYWN0aW9uIHdhcyBiZWd1bi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZGF0YWJhc2UgaGFzIGFueSBhdHRhY2hlZCBkYXRhYmFzZXMsIHRoZW4gZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxlbCBpcyBOT1QKKyAgICAgKiBwb3NzaWJsZS4gSW4gc3VjaCBjYXNlcywgYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gbG9nY2F0IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgOm1lbW9yeTogZGF0YWJhc2VzLiBJbiBzdWNoIGNhc2VzLAorICAgICAqIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIGxvZ2NhdCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogQSB0eXBpY2FsIHdheSB0byB1c2UgdGhpcyBtZXRob2QgaXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZSgiZGJfZmlsZW5hbWUiLCBjdXJzb3JGYWN0b3J5LAorICAgICAqICAgICAgICAgICAgIENSRUFURV9JRl9ORUNFU1NBUlksIG15RGF0YWJhc2VFcnJvckhhbmRsZXIpOworICAgICAqICAgICBkYi5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwPgorICAgICAqIFdyaXRlcnMgc2hvdWxkIHVzZSB7QGxpbmsgI2JlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKX0gb3IKKyAgICAgKiB7QGxpbmsgI2JlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUoU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lcil9CisgICAgICogdG8gc3RhcnQgYSB0cnNuc2FjdGlvbi4KKyAgICAgKiBOb24tZXhjbHVzaXZlIG1vZGUgYWxsb3dzIGRhdGFiYXNlIGZpbGUgdG8gYmUgaW4gcmVhZGFibGUgYnkgdGhyZWFkcyBleGVjdXRpbmcgcXVlcmllcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd3JpdGUtYWhlYWQtbG9nZ2luZyBpcyBzZXQuIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgaWYgKG1QYXRoLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0RCX1BBVEgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjYW4ndCBlbmFibGUgV0FMIGZvciBtZW1vcnkgZGF0YWJhc2VzLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgZGF0YWJhc2UgaGFzIE5PIGF0dGFjaGVkIGRhdGFiYXNlcyBiZWNhdXNlIHNxbGl0ZSdzIHdyaXRlLWFoZWFkLWxvZ2dpbmcKKyAgICAgICAgLy8gZG9lc24ndCB3b3JrIGZvciBkYXRhYmFzZXMgd2l0aCBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgaWYgKGdldEF0dGFjaGVkRGJzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAidGhpcyBkYXRhYmFzZTogIiArIG1QYXRoICsgIiBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzLiBjYW4ndCAgZW5hYmxlIFdBTC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKHRoaXMpOworICAgICAgICAgICAgc2V0Sm91cm5hbE1vZGUobVBhdGgsICJXQUwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBzaXplIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiBEYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIGlzIGVuYWJsZWQgd2hlbiB0aGUgYXBwIGNhbGxzCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIGhhbmRsZSBwb29sIGlzIHNldCBieSB0aGUgc3lzdGVtIGJ5IHRha2luZyBpbnRvIGFjY291bnQgdmFyaW91cworICAgICAqIGFzcGVjdHMgb2YgdGhlIGRldmljZSwgc3VjaCBhcyBtZW1vcnksIG51bWJlciBvZiBjb3JlcyBldGMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQKKyAgICAgKiBhcHBsaWNhdGlvbnMgdXNlIHRoZSBkZWZhdWx0IHBvb2wgc2l6ZSBzZXQgYnkgdGhlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIHRoZSB2YWx1ZSB0aGUgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBzaXplIHNob3VsZCBiZSBzZXQgdG8uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvbm5lY3Rpb25Qb29sU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbm5lY3Rpb24gcG9vbCBub3QgZW5hYmxlZCIpOworICAgICAgICB9CisgICAgICAgIGludCBpID0gbUNvbm5lY3Rpb25Qb29sLmdldE1heFBvb2xTaXplKCk7CisgICAgICAgIGlmIChzaXplIDwgaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzZXQgbWF4IHBvb2wgc2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBtYXggdmFsdWUoPSIgKworICAgICAgICAgICAgICAgICAgICBpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBtQ29ubmVjdGlvblBvb2wuc2V0TWF4UG9vbFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBjcmVhdGVQb29sQ29ubmVjdGlvbihzaG9ydCBjb25uZWN0aW9uTnVtKSB7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UobVBhdGgsIG1GYWN0b3J5LCBtRmxhZ3MsIG1FcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Bvb2xlZENvbm5lY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1Db25uZWN0aW9uTnVtID4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGdldERiQ29ubmVjdGlvbihTdHJpbmcgc3FsKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisKKyAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gaGFuZGxlIGlmCisgICAgICAgIC8vIDEuIHRoaXMgaXMgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gMi4gT1IsIGlmIHRoaXMgdGhyZWFkIGlzIGluIGEgdHJhbnNhY3Rpb24KKyAgICAgICAgLy8gMy4gT1IsIGlmIHRoZXJlIGlzIE5PIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2V0dXAKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBpZiAoaXNQb29sZWRDb25uZWN0aW9uKCkgfHwKKyAgICAgICAgICAgICAgICAoaW5UcmFuc2FjdGlvbigpICYmIG1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB8fAorICAgICAgICAgICAgICAgICh0aGlzLm1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSkgeworICAgICAgICAgICAgZGIgPSB0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZ2V0IGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcG9vbAorICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRiID0gbUNvbm5lY3Rpb25Qb29sLmdldChzcWwpOworICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImdldERiQ29ubmVjdGlvbiB0aHJlYWRpZCA9ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKworICAgICAgICAgICAgICAgICAgICAiLCByZXF1ZXN0IG9uICMgIiArIG1Db25uZWN0aW9uTnVtICsKKyAgICAgICAgICAgICAgICAgICAgIiwgYXNzaWduZWQgIyAiICsgZGIubUNvbm5lY3Rpb25OdW0gKyAiLCAiICsgZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VEYkNvbm5lY3Rpb24oU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgLy8gaWdub3JlIHRoaXMgcmVsZWFzZSBjYWxsIGlmCisgICAgICAgIC8vIDEuIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQKKyAgICAgICAgLy8gMi4gT1IsIGlmIGRiIGlzIE5PVCBhIHBvb2xlZCBjb25uZWN0aW9uIGhhbmRsZQorICAgICAgICAvLyAzLiBPUiwgaWYgdGhlIGRhdGFiYXNlIGJlaW5nIHJlbGVhc2VkIGlzIHNhbWUgYXMgJ3RoaXMnICh0aGlzIGNvbmRpdGlvbiBtZWFucworICAgICAgICAvLyAgICAgdGhhdCB3ZSBzaG91bGQgYWx3YXlzIGJlIHJlbGVhc2luZyBhIHBvb2xlZCBjb25uZWN0aW9uIGhhbmRsZSBieSBjYWxsaW5nIHRoaXMgbWV0aG9kCisgICAgICAgIC8vICAgICBmcm9tIHRoZSAnbWFpbicgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgaWYgKCFpc09wZW4oKSB8fCAhZGIuaXNQb29sZWRDb25uZWN0aW9uKCkgfHwgKGRiID09IHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgYXNzZXJ0IGlzUG9vbGVkQ29ubmVjdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZURiQ29ubmVjdGlvbiB0aHJlYWRpZCA9ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKworICAgICAgICAgICAgICAgICAgICAiLCByZWxlYXNpbmcgIyAiICsgZGIubUNvbm5lY3Rpb25OdW0gKyAiLCAiICsgZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ29ubmVjdGlvblBvb2wucmVsZWFzZShkYik7CisgICAgfQorCiAgICAgc3RhdGljIGNsYXNzIEFjdGl2ZURhdGFiYXNlcyB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjdGl2ZURhdGFiYXNlcyBhY3RpdmVEYXRhYmFzZXMgPSBuZXcgQWN0aXZlRGF0YWJhc2VzKCk7CiAgICAgICAgIHByaXZhdGUgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gbUFjdGl2ZURhdGFiYXNlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKICAgICAgICAgcHJpdmF0ZSBBY3RpdmVEYXRhYmFzZXMoKSB7fSAvLyBkaXNhYmxlIGluc3RhbnRpYXRpb24gb2YgdGhpcyBjbGFzcwotICAgICAgICBzdGF0aWMgQWN0aXZlRGF0YWJhc2VzIGdldEluc3RhbmNlKCkge3JldHVybiBhY3RpdmVEYXRhYmFzZXM7fQorICAgICAgICBzdGF0aWMgQWN0aXZlRGF0YWJhc2VzIGdldEluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZURhdGFiYXNlczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFjdGl2ZURhdGFiYXNlKFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlKSB7CisgICAgICAgICAgICBhY3RpdmVEYXRhYmFzZXMubUFjdGl2ZURhdGFiYXNlcy5hZGQobmV3IFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+KHNxbGl0ZURhdGFiYXNlKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIxNTIsODYgKzI0NjEsMTM0IEBACiAgICAgICAgICAgICBpZiAoZGIgPT0gbnVsbCB8fCAhZGIuaXNPcGVuKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgotICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgorICAgICAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicyhkYik7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBnZXRQcmFnbWFWYWwoZGIsIHAuZmlyc3QgKyAiLnBhZ2VfY291bnQ7Iik7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYi5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CiAKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBlbnRyeSBpbiB0aGUgYXR0YWNoZWQgZGIgbGlzdCBpcyBhbHdheXMgdGhlIG1haW4gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgotICAgICAgICAgICAgICAgIFN0cmluZyBkYk5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBsb29rYXNpZGUgaXMgb25seSByZWxldmFudCBmb3IgdGhlIG1haW4gZGIKLSAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9ICIgIChhdHRhY2hlZCkgIiArIHAuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRhY2hlZCBkYiBoYXMgYSBwYXRoLCBhdHRhY2ggdGhlIGxhc3Rub2RlIGZyb20gdGhlIHBhdGggdG8gYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBwLnNlY29uZC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lICs9ICIgOiAiICsgcC5zZWNvbmQuc3Vic3RyaW5nKChpZHggIT0gLTEpID8gKytpZHggOiAwKTsKKyAgICAgICAgICAgICAgICAvLyBnZXQgbGlzdCBvZiBhdHRhY2hlZCBkYnMgYW5kIGZvciBlYWNoIGRiLCBnZXQgaXRzIHNpemUgYW5kIHBhZ2VzaXplCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgIlBSQUdNQSAiICsgcC5maXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5wYWdlX2NvdW50OyIsIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVudHJ5IGluIHRoZSBhdHRhY2hlZCBkYiBsaXN0IGlzIGFsd2F5cyB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2thc2lkZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgbWFpbiBkYgorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGF0dGFjaGVkIGRiIGhhcyBhIHBhdGgsIGF0dGFjaCB0aGUgbGFzdG5vZGUgZnJvbSB0aGUgcGF0aCB0byBhYm92ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgKz0gIiA6ICIgKyBwLnNlY29uZC5zdWJzdHJpbmcoKGlkeCAhPSAtMSkgPyArK2lkeCA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQsIGRiLm1OdW1DYWNoZUhpdHMsIGRiLm1OdW1DYWNoZU1pc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIubUNvbXBpbGVkUXVlcmllcy5zaXplKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCkpOworICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBwb29sZWQgY29ubmVjdGlvbnMsIHJldHVybiB0aGUgY2FjaGUgc3RhdHMgZm9yIHRoZW0gYWxzby4KKyAgICAgICAgICAgICAgICBpZiAoZGIubUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBwRGIgOiBkYi5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKCIocG9vbGVkICMgIiArIHBEYi5tQ29ubmVjdGlvbk51bSArICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0bm9kZSwgMCwgMCwgMCwgcERiLm1OdW1DYWNoZUhpdHMsIHBEYi5tTnVtQ2FjaGVNaXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYi5tQ29tcGlsZWRRdWVyaWVzLnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUuIHdlIGRvbid0IGNhcmUgYWJvdXQgZXhjZXB0aW9ucyB3aGVuIHdlIGFyZSB0YWtpbmcgYWRiCisgICAgICAgICAgICAgICAgLy8gYnVncmVwb3J0IQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkYlN0YXRzTGlzdDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBnZXQgdGhlIHNwZWNpZmllZCBwcmFnbWEgdmFsdWUgZnJvbSBzcWxpdGUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UuCi0gICAgICogb25seSBoYW5kbGVzIHByYWdtYSdzIHRoYXQgcmV0dXJuIGludC9sb25nLgotICAgICAqIE5PIEpBVkEgbG9ja3MgYXJlIGhlbGQgaW4gdGhpcyBtZXRob2QuCi0gICAgICogVE9ETzogdXNlIHRoaXMgdG8gZG8gYWxsIHByYWdtYSdzIGluIHRoaXMgY2xhc3MKKyAgICAgKiBSZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcyBpbmNsdWRpbmcgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiBieSBleGVjdXRpbmcgJ3ByYWdtYSBkYXRhYmFzZV9saXN0JyBvbiB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCBvZiBwYWlycyBvZiAoZGF0YWJhc2UgbmFtZSwgZGF0YWJhc2UgZmlsZSBwYXRoKSBvciBudWxsIGlmIHRoZSBkYXRhYmFzZQorICAgICAqIGlzIG5vdCBvcGVuLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0UHJhZ21hVmFsKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgcHJhZ21hKSB7Ci0gICAgICAgIGlmICghZGIuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KGRiLCAiUFJBR01BICIgKyBwcmFnbWEpOwotICAgICAgICAgICAgbG9uZyB2YWwgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgbGlzdCBvZiBmdWxsIHBhdGhuYW1lcyBvZiBhbGwgYXR0YWNoZWQgZGF0YWJhc2VzCi0gICAgICogaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICogVE9ETzogbW92ZSB0aGlzIHRvIHtAbGluayBEYXRhYmFzZVV0aWxzfQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZ2V0QXR0YWNoZWREYnMoU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKLSAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbmV3IEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgQ3Vyc29yIGMgPSBkYk9iai5yYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgIGF0dGFjaGVkRGJzLmFkZChuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oYy5nZXRTdHJpbmcoMSksIGMuZ2V0U3RyaW5nKDIpKSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSByYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7CisgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzcWxpdGUgcmV0dXJucyBhIHJvdyBmb3IgZWFjaCBkYXRhYmFzZSBpbiB0aGUgcmV0dXJuZWQgbGlzdCBvZiBkYXRhYmFzZXMuCisgICAgICAgICAgICAgICAgLy8gICBpbiBlYWNoIHJvdywKKyAgICAgICAgICAgICAgICAvLyAgICAgICAxc3QgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBuYW1lIHN1Y2ggYXMgbWFpbiwgb3IgdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHNwZWNpZmllZCBvbiB0aGUgIkFUVEFDSCIgY29tbWFuZAorICAgICAgICAgICAgICAgIC8vICAgICAgIDJuZCBjb2x1bW4gaXMgdGhlIGRhdGFiYXNlIGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjLmNsb3NlKCk7CiAgICAgICAgIHJldHVybiBhdHRhY2hlZERiczsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSdW5zICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgdGhlIGF0dGFjaGVkIGRhdGFiYXNlcykKKyAgICAgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICo8cD4KKyAgICAgKiBJZiB0aGUgcmVzdWx0IGlzIGZhbHNlLCB0aGVuIHRoaXMgbWV0aG9kIGxvZ3MgdGhlIGVycm9ycyByZXBvcnRlZCBieSB0aGUgaW50ZWdyaXR5X2NoZWNrCisgICAgICogY29tbWFuZCBleGVjdXRpb24uCisgICAgICo8cD4KKyAgICAgKiBOb3RlIHRoYXQgJ3ByYWdtYSBpbnRlZ3JpdHlfY2hlY2snIG9uIGEgZGF0YWJhc2UgY2FuIHRha2UgYSBsb25nIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIGl0cyBhdHRhY2hlZCBkYXRhYmFzZXMpIHBhc3MgaW50ZWdyaXR5X2NoZWNrLAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFiYXNlSW50ZWdyaXR5T2soKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicygpOworICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2VsaXN0IGZvcjogIiArIGdldFBhdGgoKSArICIgY291bGRuJ3QgIiArCisgICAgICAgICAgICAgICAgICAgICJiZSByZXRyaWV2ZWQuIHByb2JhYmx5IGJlY2F1c2UgdGhlIGRhdGFiYXNlIGlzIGNsb3NlZCIpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaXNEYXRhYmFzZUNvcnJ1cHQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvZyA9IGNvbXBpbGVTdGF0ZW1lbnQoIlBSQUdNQSAiICsgcC5maXJzdCArICIuaW50ZWdyaXR5X2NoZWNrKDEpOyIpOworICAgICAgICAgICAgICAgIFN0cmluZyByc2x0ID0gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOworICAgICAgICAgICAgICAgIGlmICghcnNsdC5lcXVhbHNJZ25vcmVDYXNlKCJvayIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGludGVncml0eV9jaGVja2VyIGZhaWxlZCBvbiBtYWluIG9yIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICAgICAgICAgICAgICBpc0RhdGFiYXNlQ29ycnVwdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2sgb24gIiArIHAuc2Vjb25kICsgIiByZXR1cm5lZDogIiArIHJzbHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0RhdGFiYXNlQ29ycnVwdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBvcGVuIHRoZSBkYXRhYmFzZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCkBAIC0yMjM5LDIxICsyNTk2LDI3IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYm9wZW4oU3RyaW5nIHBhdGgsIGludCBmbGFncyk7CiAKICAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBzcWwgc3RhdGVtZW50cworICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHRyYWNpbmcgb2YgYWxsIFNRTCBzdGF0ZW1lbnRzCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIGNvbm5lY3Rpb24gbnVtYmVyOiAwIC0gTiwgd2hlcmUgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG51bWJlcmVkIDAgYW5kIHRoZSBjb25uZWN0aW9uIGhhbmRsZXMgaW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHBvb2wgYXJlIG51bWJlcmVkIDEuLk4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFRyYWNpbmcoU3RyaW5nIHBhdGgsIHNob3J0IGNvbm5lY3Rpb25OdW0pOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBzcWwgc3RhdGVtZW50cy4KKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCBwcm9maWxpbmcgb2YgYWxsIFNRTCBzdGF0ZW1lbnRzLgogICAgICAqIGN1cnJlbnRseSwgc3FsaXRlJ3MgcHJvZmlsaW5nID0gcHJpbnRpbmcgb2YgZXhlY3V0aW9uLXRpbWUKLSAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBzcWwgc3RhdGVtZW50cywgYXMgdGhleQorICAgICAqICh3YWxsLWNsb2NrIHRpbWUpIG9mIGVhY2ggb2YgdGhlIFNRTCBzdGF0ZW1lbnRzLCBhcyB0aGV5CiAgICAgICogYXJlIGV4ZWN1dGVkLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCwgc2hvcnQgY29ubmVjdGlvbk51bSk7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBleGVjdXRlIGEgcmF3IFNRTCBzdGF0ZW1lbnQuIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkCkBAIC0yMjkxLDQgKzI2NTQsMTEgQEAKICAgICAgKiBAcmV0dXJuIGludCB2YWx1ZSBvZiBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldERiTG9va2FzaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBmaW5hbGl6ZXMgdGhlIGdpdmVuIHN0YXRlbWVudCBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZW1lbnRJZCBzdGF0ZW1lbnQgdG8gYmUgZmluemxpZWQgYnkgc3FsaXRlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoaW50IHN0YXRlbWVudElkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKaW5kZXggODljM2Y5Ni4uOTQ5NjA3OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCkBAIC0xMzIsMTEgKzEzMiwxNiBAQAogICAgICAgICAvKiogZG9jdW1lbnRlZCBoZXJlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jM3JlZi9jX2Ric3RhdHVzX2xvb2thc2lkZV91c2VkLmh0bWwgKi8KICAgICAgICAgcHVibGljIGludCBsb29rYXNpZGU7CiAKLSAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUpIHsKKyAgICAgICAgLyoqIHN0YXRlbWVudCBjYWNoZSBzdGF0czogaGl0cy9taXNzZXMvY2FjaGVzaXplICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FjaGU7CisKKyAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUsCisgICAgICAgICAgICBpbnQgaGl0cywgaW50IG1pc3NlcywgaW50IGNhY2hlc2l6ZSkgewogICAgICAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemUgLyAxMDI0OwogICAgICAgICAgICAgZGJTaXplID0gKHBhZ2VDb3VudCAqIHBhZ2VTaXplKSAvIDEwMjQ7CiAgICAgICAgICAgICB0aGlzLmxvb2thc2lkZSA9IGxvb2thc2lkZTsKKyAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBoaXRzICsgIi8iICsgbWlzc2VzICsgIi8iICsgY2FjaGVzaXplOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKaW5kZXggMjE0NGZjMy4uYmU0OTI1NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQpAQCAtMzksOSArMzksMTIgQEAKIAogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CiAgICAgICAgIC8vIENvbXBpbGUgdGhlIHF1ZXJ5Ci0gICAgICAgIFNRTGl0ZVF1ZXJ5IHF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KG1EYXRhYmFzZSwgbVNxbCwgMCwgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIFNRTGl0ZVF1ZXJ5IHF1ZXJ5ID0gbnVsbDsKIAogICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOwogICAgICAgICAgICAgLy8gQXJnIGJpbmRpbmcKICAgICAgICAgICAgIGludCBudW1BcmdzID0gc2VsZWN0aW9uQXJncyA9PSBudWxsID8gMCA6IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKQEAgLTYxLDYgKzY0LDcgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBpcyBjbGVhbmVkIHVwIGlmIHNvbWV0aGluZyBoYXBwZW5zCiAgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgcXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKaW5kZXggYWVmYmFiYy4uMGYyZTg3MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTQ1LDYgKzQ3LDcgQEAKIAogICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5pdGlhbGl6aW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KQEAgLTU4LDEyICs2MSwzNyBAQAogICAgICAqICAgICB7QGxpbmsgI29uVXBncmFkZX0gd2lsbCBiZSB1c2VkIHRvIHVwZ3JhZGUgdGhlIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbikgeworICAgICAgICB0aGlzKGNvbnRleHQsIG5hbWUsIGZhY3RvcnksIHZlcnNpb24sIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KKyAgICAgKiBUaGUgZGF0YWJhc2UgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQgb3Igb3BlbmVkIHVudGlsIG9uZSBvZgorICAgICAqIHtAbGluayAjZ2V0V3JpdGFibGVEYXRhYmFzZX0gb3Ige0BsaW5rICNnZXRSZWFkYWJsZURhdGFiYXNlfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0byB1c2UgdG8gb3BlbiBvciBjcmVhdGUgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGZpbGUsIG9yIG51bGwgZm9yIGFuIGluLW1lbW9yeSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IHRvIHVzZSBmb3IgY3JlYXRpbmcgY3Vyc29yIG9iamVjdHMsIG9yIG51bGwgZm9yIHRoZSBkZWZhdWx0CisgICAgICogQHBhcmFtIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSAoc3RhcnRpbmcgYXQgMSk7IGlmIHRoZSBkYXRhYmFzZSBpcyBvbGRlciwKKyAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgIGlmICh2ZXJzaW9uIDwgMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVyc2lvbiBtdXN0IGJlID49IDEsIHdhcyAiICsgdmVyc2lvbik7CisgICAgICAgIGlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0YWJhc2VFcnJvckhhbmRsZXIgcGFyYW0gdmFsdWUgY2FuJ3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbU5hbWUgPSBuYW1lOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CiAgICAgICAgIG1OZXdWZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbUVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMSwxMCArMTI5LDE0IEBACiAgICAgICAgICAgICBpZiAobU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2UuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYiA9IG1Db250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKG1OYW1lLCAwLCBtRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnksIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGRiLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID4gbU5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEYXRhYmFzZSAiICsgbU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgZG93bmdyYWRlZC4gaW5zdGVhZCwgcGxlYXNlIHVuaW5zdGFsbCBuZXcgdmVyc2lvbiBmaXJzdC4iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG1OZXdWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0xNzUsNyArMjA3LDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1Jc0luaXRpYWxpemluZyA9IHRydWU7CiAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG1Db250ZXh0LmdldERhdGFiYXNlUGF0aChtTmFtZSkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFkpOworICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFksCisgICAgICAgICAgICAgICAgICAgIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgaWYgKGRiLmdldFZlcnNpb24oKSAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxpdGVFeGNlcHRpb24oIkNhbid0IHVwZ3JhZGUgcmVhZC1vbmx5IGRhdGFiYXNlIGZyb20gdmVyc2lvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmdldFZlcnNpb24oKSArICIgdG8gIiArIG1OZXdWZXJzaW9uICsgIjogIiArIHBhdGgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKaW5kZXggNGQ5NmYxMi4uYTM1MTNlNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiAKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBjb21waWxlZCBTUUxpdGUgcHJvZ3JhbXMuCi0gKgorICo8cD4KICAqIFNRTGl0ZVByb2dyYW0gaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVQcm9ncmFtIGZyb20gbXVsdGlwbGUKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlUHJvZ3JhbS4KICAqLwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICogQHJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2dyYW0KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFVuaXF1ZUlkKCkgewotICAgICAgICByZXR1cm4gblN0YXRlbWVudDsKKyAgICAgICAgcmV0dXJuIChtQ29tcGlsZWRTcWwgIT0gbnVsbCkgPyBtQ29tcGlsZWRTcWwublN0YXRlbWVudCA6IDA7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0U3FsU3RyaW5nKCkgewpAQCAtMTc2LDkgKzE3Niw3IEBACiAgICAgICogQHBhcmFtIGluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBwYXJhbWV0ZXIgdG8gYmluZCBudWxsIHRvCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZE51bGwoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7CkBAIC0xOTUsOSArMTkzLDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kTG9uZyhpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCB2YWx1ZSk7CkBAIC0yMTQsOSArMjEwLDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCB2YWx1ZSk7CkBAIC0yMzYsOSArMjMwLDcgQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCB2YWx1ZSk7CkBAIC0yNTgsOSArMjUwLDcgQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgdmFsdWUpOwpAQCAtMjczLDkgKzI2Myw3IEBACiAgICAgICogQ2xlYXJzIGFsbCBleGlzdGluZyBiaW5kaW5ncy4gVW5zZXQgYmluZGluZ3MgYXJlIHRyZWF0ZWQgYXMgTlVMTC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckJpbmRpbmdzKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5hdGl2ZV9jbGVhcl9iaW5kaW5ncygpOwpAQCAtMjkxLDEyICsyNzksNyBAQAogICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQppbmRleCA5MDViNjZiLi5lNjAxMWVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQpAQCAtNzIsMTEgKzcyLDYgQEAKICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc2FmZSBpbiB0aGlzIHNpdHVhdGlvbi4gdGhlIG5hdGl2ZSBjb2RlIHdpbGwgaWdub3JlIG1heFJlYWQKICAgICAgICAgICAgICAgICBpbnQgbnVtUm93cyA9IG5hdGl2ZV9maWxsX3dpbmRvdyh3aW5kb3csIHdpbmRvdy5nZXRTdGFydFBvc2l0aW9uKCksIG1PZmZzZXRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlYWQsIGxhc3RQb3MpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9nZ2luZwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmaWxsV2luZG93KCk6ICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bVJvd3M7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSl7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKaW5kZXggOWU0MjVjMy4uZTFhZDMwNmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKICAqIFRoZSBzdGF0ZW1lbnQgY2Fubm90IHJldHVybiBtdWx0aXBsZSByb3dzLCBidXQgMXgxIHJlc3VsdCBzZXRzIGFyZSBhbGxvd2VkLgogICogRG9uJ3QgdXNlIFNRTGl0ZVN0YXRlbWVudCBjb25zdHJ1Y3RvciBkaXJlY3RseSwgcGxlYXNlIHVzZQogICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2NvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nKX0KLSAqCisgKjxwPgogICogU1FMaXRlU3RhdGVtZW50IGlzIG5vdCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlU3RhdGVtZW50IGZyb20gbXVsdGlwbGUKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlU3RhdGVtZW50LgogICovCkBAIC00OSwxNSArNDksMTQgQEAKICAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKIAogICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOwogICAgICAgICAgICAgbmF0aXZlX2V4ZWN1dGUoKTsKICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNzYsMTUgKzc1LDE0IEBACiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGV4ZWN1dGVJbnNlcnQoKSB7CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CiAKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKICAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgIHJldHVybiAobURhdGFiYXNlLmxhc3RDaGFuZ2VDb3VudCgpID4gMCkgPyBtRGF0YWJhc2UubGFzdEluc2VydFJvdygpIDogLTE7CkBAIC0xMDMsMTUgKzEwMSwxNCBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzaW1wbGVRdWVyeUZvckxvbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBtRGF0YWJhc2UubG9jaygpOwogCiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CiAgICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKQEAgLTEzMCwxNSArMTI3LDE0IEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgc2ltcGxlUXVlcnlGb3JTdHJpbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBtRGF0YWJhc2UubG9jaygpOwogCiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CiAgICAgICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX3N0cmluZygpOwogICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCAyODBkZWQ2Li42MzM1Mjk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTUyNCw1ICs1MjQsMjAgQEAKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBURVRIRVJfRVJST1JfU0VSVklDRV9VTkFWQUlMOwogICAgICAgICB9Ci0gICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoZSBkZXZpY2Ugc3RheXMgYXdha2UgdW50aWwgd2UgY29ubmVjdCB3aXRoIHRoZSBuZXh0IG5ldHdvcmsKKyAgICAgKiBAcGFyYW0gZm9yV2hvbWUgVGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgZ29pbmcgZG93biBmb3IgbG9nZ2luZyBwdXJwb3NlcworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soZm9yV2hvbSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQppbmRleCBmZDMzNzgxLi5kZGRlNWMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCkBAIC00MzAsMTEgKzQzMCwxMCBAQAogCiAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVyaSwgRE9XTkxPQURTX1BST0pFQ1RJT04sIG51bGwgLyogc2VsZWN0aW9uICovLCBudWxsIC8qIHNlbGVjdGlvbiBhcmdzICovLAotICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOworICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShkb3dubG9hZFVyaSwgRE9XTkxPQURTX1BST0pFQ1RJT04sIG51bGwgLyogc2VsZWN0aW9uICovLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNlbGVjdGlvbiBhcmdzICovLCBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIWMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCAhYy5tb3ZlVG9OZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKaW5kZXggYjA1YzJlZC4uNWExNGNjOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwKQEAgLTcyLDQgKzcyLDYgQEAKICAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlVXNiUmVnZXhzKCk7CiAKICAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOworCisgICAgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhpbiBTdHJpbmcgZm9yV2hvbSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAyMTQ1MTBkLi41ZmQ1MzE1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTIyLDEyICsyMiwxMyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueUludGVudHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTM5LDcgKzQwLDcgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBjbGFzcyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGV4dGVuZHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CitwdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBpbXBsZW1lbnRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2JpbGVEYXRhU3RhdGVUcmFja2VyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CkBAIC00OCwxMCArNDksMTYgQEAKICAgICBwcml2YXRlIElUZWxlcGhvbnkgbVBob25lU2VydmljZTsKIAogICAgIHByaXZhdGUgU3RyaW5nIG1BcG5UeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIG1BcG5UeXBlVG9XYXRjaEZvcjsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtU3RhdGVSZWNlaXZlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbVRhcmdldDsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUludGVyZmFjZU5hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURlZmF1bHRSb3V0ZVNldCA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIKQEAgLTYyLDI0ICs2OSwxNiBAQAogICAgICAqIEBwYXJhbSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBuZXR3b3JrCiAgICAgICovCiAgICAgcHVibGljIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCwgaW50IG5ldFR5cGUsIFN0cmluZyB0YWcpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBuZXRUeXBlLAorICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhuZXRUeXBlLAogICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlKCksIHRhZywKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZU5hbWUoKSk7CiAgICAgICAgIG1BcG5UeXBlID0gbmV0d29ya1R5cGVUb0FwblR5cGUobmV0VHlwZSk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKG1BcG5UeXBlLCBQaG9uZS5BUE5fVFlQRV9ISVBSSSkpIHsKLSAgICAgICAgICAgIG1BcG5UeXBlVG9XYXRjaEZvciA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXBuVHlwZVRvV2F0Y2hGb3IgPSBtQXBuVHlwZTsKLSAgICAgICAgfQogCiAgICAgICAgIG1QaG9uZVNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZihuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KIAotICAgICAgICBtRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMSIsCiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5ldGgwLmRuczEiLApAQCAtOTQsNiArOTMsNTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgbW9iaWxlIGRhdGEKKyAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBETlMgYWRkcmVzc2VzLCB3aXRoIG5vIGhvbGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNQcm9wTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzRG5zUHJvcE5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiBvdXIgbmV0d29yayBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiBvdXIgaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcmZhY2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbVByaXZhdGVEbnNSb3V0ZVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgeworICAgIH0KKworICAgIC8qKgogICAgICAqIEJlZ2luIG1vbml0b3JpbmcgbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKQEAgLTEwMywzOCArMTQ5LDM0IEBACiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0VSVklDRV9TVEFURV9DSEFOR0VEKTsKIAogICAgICAgICBtU3RhdGVSZWNlaXZlciA9IG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgaWYgKGludGVudCAhPSBudWxsKQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQaG9uZS5EYXRhU3RhdGUgZ2V0TW9iaWxlRGF0YVN0YXRlKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpOwotICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVkpOwotICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLCBzdHIpOwotICAgICAgICAgICAgfQorICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgcm9hbWluZyBzdGF0dXMgb2YgdGhlIGRldmljZSwgYW5kIGlmIGl0IGlzIGEgY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzCisgICAgICogc3RhdHVzLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIGlzUm9hbWluZyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRldmljZSBpcyBub3cgcm9hbWluZywge0Bjb2RlIGZhbHNlfQorICAgICAqIGlmIGl0IGlzIG5vIGxvbmdlciByb2FtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRSb2FtaW5nU3RhdHVzKGJvb2xlYW4gaXNSb2FtaW5nKSB7CisgICAgICAgIGlmIChpc1JvYW1pbmcgIT0gbU5ldHdvcmtJbmZvLmlzUm9hbWluZygpKSB7CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0Um9hbWluZyhpc1JvYW1pbmcpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfUk9BTUlOR19DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FwblR5cGVJbmNsdWRlZChTdHJpbmcgdHlwZUxpc3QpIHsKLSAgICAgICAgLyogY29tbWEgc2VwZXJhdGVkIGxpc3QgLSBzcGxpdCBhbmQgY2hlY2sgKi8KLSAgICAgICAgaWYgKHR5cGVMaXN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nW10gbGlzdCA9IHR5cGVMaXN0LnNwbGl0KCIsIik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhsaXN0W2ldLCBtQXBuVHlwZVRvV2F0Y2hGb3IpIHx8Ci0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhsaXN0W2ldLCBQaG9uZS5BUE5fVFlQRV9BTEwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcHJpdmF0ZSB2b2lkIHNldFN1YnR5cGUoaW50IHN1YnR5cGUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgeworICAgICAgICBpZiAobU5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIGludCBvbGRTdWJ0eXBlID0gbU5ldHdvcmtJbmZvLmdldFN1YnR5cGUoKTsKKyAgICAgICAgICAgIGlmIChzdWJ0eXBlICE9IG9sZFN1YnR5cGUpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0U3VidHlwZShzdWJ0eXBlLCBzdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRCwgb2xkU3VidHlwZSwgMCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CkBAIC0xNDIsNTAgKzE4NCwyOSBAQAogICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLgogICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlID0gZ2V0TW9iaWxlRGF0YVN0YXRlKGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlID0gRW51bS52YWx1ZU9mKFBob25lLkRhdGFTdGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfS0VZKSk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZUxpc3QgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgbUFwbk5hbWUgPSBhcG5OYW1lOwogCiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBhcG5UeXBlTGlzdC4gIEl0J3MgYWxsIHRoZSBzYW1lIHJhZGlvL25ldHdvcmsKLSAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXJuZWF0aAogICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoIXVuYXZhaWxhYmxlKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlSW5jbHVkZWQoYXBuVHlwZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBub3QgZW5hYmxlZCBidXQgdGhlIEFQTiBUeXBlIGlzIHN1cHBvcnRlZCBieSB0aGlzIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmVjb3JkIHRoZSBpbnRlcmZhY2UgbmFtZSBpZiBvbmUncyBwcm92aWRlZC4gIElmIHRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVybnMgb24gdGhpcyBuZXR3b3JrIHdlIHdpbGwgbmVlZCB0aGUgaW50ZXJmYWNlbmFtZSBidXQgd29uJ3QgZ2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBmcmVzaCBjb25uZWN0ZWQgbWVzc2FnZSAtIFRPRE8gZml4IHRoaXMgd2hlbiB3ZSBnZXQgcGVyLUFQTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJyZXBsYWNpbmcgb2xkIG1JbnRlcmZhY2VOYW1lICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSArICIpIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYXBuVHlwZUxpc3Q9ICIgKyBhcG5UeXBlTGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTIxOCwxMSArMjM5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS4KICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKyAiIGJyb2FkY2FzdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIG1BcG5UeXBlICsgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYnJvYWRjYXN0IiArIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOwogICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CkBAIC0zMjAsNzAgKzM0NCw4OCBAQAogICAgIC8qKgogICAgICAqIFRlYXIgZG93biBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHksIGkuZS4sIGRpc2FibGUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlCiAgICAgICogbW9iaWxlIGRhdGEgY29ubmVjdGlvbnMuCisgICAgICogVE9ETyAtIG1ha2UgYXN5bmMgYW5kIHJldHVybiBub3RoaW5nPwogICAgICAqLwotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICAvLyBzaW5jZSB3ZSB3b24ndCBnZXQgYSBub3RpZmljYXRpb24gY3VycmVudGx5IChUT0RPIC0gcGVyIEFQTiBub3RpZmljYXRpb25zKQotICAgICAgICAvLyB3ZSB3b24ndCBnZXQgYSBkaXNjb25uZWN0IG1lc3NhZ2UgdW50aWwgYWxsIEFQTidzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24ncwotICAgICAgICAvLyBBUE4gbGlzdCBhcmUgZGlzYWJsZWQuICBUaGF0IG1lYW5zIHByaXZhdGVSb3V0ZXMgZm9yIEROUyBhbmQgc3VjaCB3aWxsIHJlbWFpbiBvbiAtCi0gICAgICAgIC8vIG5vdCBhIHByb2JsZW0gc2luY2UgdGhhdCdzIGFsbCBzaGFyZWQgd2l0aCB3aGF0ZXZlciBvdGhlciBBUE4gaXMgc3RpbGwgb24sIGJ1dAotICAgICAgICAvLyB1Z2x5LgogICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIChzZXRFbmFibGVBcG4obUFwblR5cGUsIGZhbHNlKSAhPSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQorICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bworICAgICAqIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAorICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubworICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCisgICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmUtZW5hYmxlIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eSBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogVE9ETyAtIG1ha2UgYXN5bmMgYW5kIGFsd2F5cyBnZXQgYSBub3RpZmljYXRpb24/CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgeworICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7IC8vY29ubmVjdGVkIG9yIGV4cGVjdCB0byBiZT8KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwogICAgICAgICBzd2l0Y2ggKHNldEVuYWJsZUFwbihtQXBuVHlwZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOgotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSByZW1vdmUgdGhpcyB3aGVuIHdlIGdldCBwZXItYXBuIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZXQgc2VsZiB0byBDT05ORUNUSU5HIHNvIHRoZSBiZWxvdyBtZXNzYWdlIGlzIGhhbmRsZWQuCi0gICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HOwotICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCBQaG9uZS5SRUFTT05fQVBOX0NIQU5HRUQsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vc2VuZCBvdXQgYSBjb25uZWN0ZWQgbWVzc2FnZQotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfS0VZLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVELnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZLCBtQXBuVHlwZVRvV2F0Y2hGb3IpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVksIG1BcG5OYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSwgbUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGVSZWNlaXZlciAhPSBudWxsKSBtU3RhdGVSZWNlaXZlci5vblJlY2VpdmUobUNvbnRleHQsIGludGVudCk7CisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOgotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIC0gd2UncmUgYWxyZWFkeSBkdWUgc29tZSBzdGF0dXMgdXBkYXRlIGludGVudHMKKyAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVBob25lU2VydmljZSA9PSBudWxsICYmIG1BcG5UeXBlID09IFBob25lLkFQTl9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb24gc3RhcnR1cCB3ZSBtYXkgdHJ5IHRvIHRhbGsgdG8gdGhlIHBob25lIGJlZm9yZSBpdCdzIHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwaG9uZSB3aWxsIGNvbWUgdXAgZW5hYmxlZCwgZ28gd2l0aCB0aGF0LgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdGhpcyBhbHNvIGNvbWVzIHVwIG9uIHRlbGVwaG9ueSBjcmFzaDogaWYgd2UgdGhpbmsgbW9iaWxlIGRhdGEgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gb2ZmIGFuZCB0aGUgdGVsZXBob255IHN0dWZmIGNyYXNoZXMgYW5kIGhhcyB0byByZXN0YXJ0IGl0IHdpbGwgY29tZSB1cAotICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkIChtYWtpbmcgYSBkYXRhIGNvbm5lY3Rpb24pLiAgV2Ugd2lsbCB0aGVuIGJlIG91dCBvZiBzeW5jLgotICAgICAgICAgICAgICAgICAgICAvLyBBIHBvc3NpYmxlIHNvbHV0aW9uIGlzIGEgYnJvYWRjYXN0IHdoZW4gdGVsZXBob255IHJlc3RhcnRzLgotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZWxzZSBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1RZUEVfTk9UX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIGFsd2F5cyBhdmFpbGFibGUsIGJ1dCBtYXkgYmUgb2ZmIGR1ZSB0bwotICAgICAgICAgICAgICAgIC8vIEFpcnBsYW5lTW9kZSBvciBFLUNhbGwgb3Igd2hhdGV2ZXIuLgotICAgICAgICAgICAgICAgIGlmIChtQXBuVHlwZSAhPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiByZWNvbm5lY3QgLSB1bmV4cGVjdGVkIHJlc3BvbnNlLiIpOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NTcsMjMgKzQ5OSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKLSAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICogVGhpcyBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIEludGVnZXIudG9IZXhTdHJpbmcoaG9zdEFkZHJlc3MpICsKLSAgICAgICAgICAgICAgICAgICAgIiBmb3IgIiArIG1BcG5UeXBlICsgIigiICsgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIGhvc3RBZGRyZXNzICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaG9zdEFkZHJlc3MpID09IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKaW5kZXggNjQ5Y2I4Yy4uMjFmNzExYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKQEAgLTEyMSw3ICsxMjEsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUpIHt9CiAKLSAgICBOZXR3b3JrSW5mbyhpbnQgdHlwZSwgaW50IHN1YnR5cGUsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewogICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKHR5cGUpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG5ldHdvcmsgdHlwZTogIiArIHR5cGUpOwogICAgICAgICB9CkBAIC0yODEsOCArMjg0LDkgQEAKICAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBleHRyYUluZm8gYW4gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGFkZGRpdGlvbmFsIG5ldHdvcmsgc3RhdGUKICAgICAgKiBpbmZvcm1hdGlvbiBwYXNzZWQgdXAgZnJvbSB0aGUgbG93ZXIgbmV0d29ya2luZyBsYXllcnMuCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CisgICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKICAgICAgICAgdGhpcy5tRGV0YWlsZWRTdGF0ZSA9IGRldGFpbGVkU3RhdGU7CiAgICAgICAgIHRoaXMubVN0YXRlID0gc3RhdGVNYXAuZ2V0KGRldGFpbGVkU3RhdGUpOwogICAgICAgICB0aGlzLm1SZWFzb24gPSByZWFzb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAxZmIwMTQ0Li5jZDhlN2YxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDQwICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCiAvKioKLSAqIEVhY2ggc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgc3RhdGUgb2YgY29ubmVjdGl2aXR5Ci0gKiBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlLiBBbGwgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGEgbmV0d29yayBzaG91bGQKLSAqIGJlIGtlcHQgaW4gYSBUcmFja2VyIGNsYXNzLiBUaGlzIHN1cGVyY2xhc3MgbWFuYWdlcyB0aGUKLSAqIG5ldHdvcmstdHlwZS1pbmRlcGVuZGVudCBhc3BlY3RzIG9mIG5ldHdvcmsgc3RhdGUuCisgKiBJbnRlcmZhY2UgZm9yIGNvbm5lY3Rpdml0eSBzZXJ2aWNlIHRvIGFjdCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogQWxsIHN0YXRlIGluZm9ybWF0aW9uIGZvciBhIG5ldHdvcmsgc2hvdWxkIGJlIGtlcHQgaW4gYSBUcmFja2VyIGNsYXNzLgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBuZXR3b3JrLXR5cGUtaW5kZXBlbmRlbnQgZnVuY3Rpb25zIHRoYXQgc2hvdWxkCisgKiBiZSBpbXBsZW1lbnRlZCBieSB0aGUgVHJhY2tlciBjbGFzcy4KICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXR3b3JrU3RhdGVUcmFja2VyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICBwcm90ZWN0ZWQgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOwotICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbURuc1Byb3BOYW1lczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldDsKLSAgICBwcm90ZWN0ZWQgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Um91dGVTZXQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UZWFyZG93blJlcXVlc3RlZDsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5ldHdvcmtTdGF0ZVRyYWNrZXIiOworcHVibGljIGludGVyZmFjZSBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NUQVRFX0NIQU5HRUQgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUgPSAyOwpAQCAtNjMsMzA2ICszOCw5MSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCA9IDU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQgPSA2OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSyA9IDg7CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBIYW5kbGVyIHRhcmdldCwKLSAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIGludCBzdWJUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgdGhpcy5tTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0d29ya1R5cGUsIHN1YlR5cGUsIHR5cGVOYW1lLCBzdWJ0eXBlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBGZXRjaCBOZXR3b3JrSW5mbyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKICAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIG1vYmlsZSBkYXRhCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KKyAgICAgKiBSZXR1cm4gdGhlIEROUyBwcm9wZXJ0eSBuYW1lcyBmb3IgdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROYW1lU2VydmVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWVTZXJ2ZXJMaXN0KG1EbnNQcm9wTmFtZXMpOwotICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zUHJvcE5hbWVzKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGlzCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMgdGhlIG5hbWVzIG9mIHRoZSBzeXN0ZW0gcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMKLSAgICAgKiBnaXZlIHRoZSBJUCBhZGRyZXNzZXMuIFByb3BlcnRpZXMgd2l0aCBubyB2YWx1ZXMgYXJlIHNraXBwZWQuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGNvZGUgU3RyaW5nfXMgY29udGFpbmluZyB0aGUgSVAgYWRkcmVzc2VzCi0gICAgICogb2YgdGhlIEROUyBzZXJ2ZXJzLCBpbiBkb3Qtbm90YXRpb24uIFRoaXMgbWF5IGhhdmUgZmV3ZXIKLSAgICAgKiBub24tbnVsbCBlbnRyaWVzIHRoYW4gdGhlIGxpc3Qgb2YgbmFtZXMgcGFzc2VkIGluLCBzaW5jZQotICAgICAqIHNvbWUgb2YgdGhlIHBhc3NlZC1pbiBuYW1lcyBtYXkgaGF2ZSBlbXB0eSB2YWx1ZXMuCisgICAgICogRmV0Y2ggaW50ZXJmYWNlIG5hbWUgb2YgdGhlIGludGVyZmFjZQogICAgICAqLwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TmFtZVNlcnZlckxpc3QoU3RyaW5nW10gcHJvcGVydHlOYW1lcykgewotICAgICAgICBTdHJpbmdbXSBkbnNBZGRyZXNzZXMgPSBuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IGksIGo7Ci0KLSAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWVzW2ldKTsKLSAgICAgICAgICAgIC8vIFRoZSBHU00gbGF5ZXIgc29tZXRpbWVzIHNldHMgYSBib2d1cyBETlMgc2VydmVyIGFkZHJlc3Mgb2YKLSAgICAgICAgICAgIC8vIDAuMC4wLjAKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpICYmICFUZXh0VXRpbHMuZXF1YWxzKHZhbHVlLCAiMC4wLjAuMCIpKSB7Ci0gICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzW2orK10gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG5zQWRkcmVzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyB0aGlzICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgbUludGVyZmFjZU5hbWUgKyAiKSAtIG1Qcml2YXRlRG5zUm91dGVTZXQgPSAiK21Qcml2YXRlRG5zUm91dGVTZXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmICFtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyU3RyaW5nIDogZ2V0TmFtZVNlcnZlcnMoKSkgewotICAgICAgICAgICAgICAgIGludCBhZGRyID0gTmV0d29ya1V0aWxzLmxvb2t1cEhvc3QoYWRkclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHIgIT0gLTEgJiYgYWRkciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiAgYWRkaW5nICIrYWRkclN0cmluZysiICgiK2FkZHIrIikiKTsKLSAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgYWRkcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcml2YXRlRG5zUm91dGVzKCkgewotICAgICAgICAvLyBUT0RPIC0gd2Ugc2hvdWxkIGRvIHRoaXMgZXhwbGljaXRseSBidXQgdGhlIE5ldFV0aWxzIGFwaSBkb2VzbnQKLSAgICAgICAgLy8gc3VwcG9ydCB0aGlzIHlldCAtIG11c3QgcmVtb3ZlIGFsbC4gIE5vIHdvcnNlIHRoYW4gYmVmb3JlCi0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIG1Qcml2YXRlRG5zUm91dGVTZXQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVIb3N0Um91dGVzKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgaWYgKChtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSAmJiAobURlZmF1bHRHYXRld2F5QWRkciAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGVTZXQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIG1EZWZhdWx0R2F0ZXdheUFkZHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnNldERlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSwgbURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgICAgICBtRGVmYXVsdFJvdXRlU2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgbURlZmF1bHRSb3V0ZVNldCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVEZWZhdWx0Um91dGUobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG5ldHdvcmsgc3BlY2lmaWMgVENQIGJ1ZmZlciBzaXplcyBmcm9tIFN5c3RlbVByb3BlcnRpZXMKLSAgICAgKiBuZXQudGNwLmJ1ZmZlcnNpemUuW2RlZmF1bHR8d2lmaXx1bXRzfGVkZ2V8Z3Byc10gYW5kIHNldCB0aGVtIGZvciBzeXN0ZW0KLSAgICAgKiB3aWRlIHVzZQorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKICAgICAgKi8KLSAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncygpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKLQotICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCBrZXkgKyAiIG5vdCBmb3VuZCBpbiBzeXN0ZW0gcHJvcGVydGllcy4gVXNpbmcgZGVmYXVsdHMiKTsKLQotICAgICAgICAgICAgLy8gU2V0dGluZyB0byBkZWZhdWx0IHZhbHVlcyBzbyB3ZSB3b24ndCBiZSBzdHVjayB0byBwcmV2aW91cyB2YWx1ZXMKLSAgICAgICAgICAgIGtleSA9ICJuZXQudGNwLmJ1ZmZlcnNpemUuZGVmYXVsdCI7Ci0gICAgICAgICAgICBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdmFsdWVzIGluIGtlcm5lbAotICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlNldHRpbmcgVENQIHZhbHVlczogWyIgKyBidWZmZXJTaXplcwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGljaCBjb21lcyBmcm9tIFsiICsga2V5ICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZXMpOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSB3YWtlbG9jaywgaWYgYW55LCB0aGF0IG1heSBiZSBoZWxkIHdoaWxlIGhhbmRsaW5nIGEKLSAgICAgKiBkaXNjb25uZWN0IG9wZXJhdGlvbi4KKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgIH0KKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBUQ1AgYnVmZmVyIHNpemVzIHRvIC9zeXMva2VybmVsL2lwdjQvdGNwX1tyL3ddbWVtX1ttaW4vZGVmL21heF0KLSAgICAgKiB3aGljaCBtYXBzIHRvIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfcm1lbSBhbmQgdGNwd21lbQotICAgICAqIAotICAgICAqIEBwYXJhbSBidWZmZXJTaXplcyBpbiB0aGUgZm9ybWF0IG9mICJyZWFkTWluLCByZWFkSW5pdGlhbCwgcmVhZE1heCwKLSAgICAgKiAgICAgICAgd3JpdGVNaW4sIHdyaXRlSW5pdGlhbCwgd3JpdGVNYXgiCisgICAgICogRmV0Y2ggZGVmYXVsdCBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEJ1ZmZlclNpemUoU3RyaW5nIGJ1ZmZlclNpemVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBidWZmZXJTaXplcy5zcGxpdCgiLCIpOwotCi0gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7Ci0gICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3Qgc2V0IHRjcCBidWZmZXIgc2l6ZXM6IiArIGUpOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKTsKIAogICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKLSAgICB9CisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CiAKICAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKLSAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KLSAgICAgKiBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQotICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAotICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCi0gICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQorICAgICAqIEluZGljYXRlIHRlYXIgZG93biByZXF1ZXN0ZWQgZnJvbSBjb25uZWN0aXZpdHkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IittTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKyIgYW5kIG5ldyBzdGF0ZT0iK3N0YXRlKTsKLSAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KLSAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQotICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247Ci0gICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7Ci0gICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgYSAgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHJlc3VsdHMgb2YgYSBzY2FuIGZvciBuZXR3b3JrIGFjY2VzcwotICAgICAqIHBvaW50cyBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKTsKIAogICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgcm9hbWluZyBzdGF0dXMgb2YgdGhlIGRldmljZSwgYW5kIGlmIGl0IGlzIGEgY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzCi0gICAgICogc3RhdHVzLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIGlzUm9hbWluZyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRldmljZSBpcyBub3cgcm9hbWluZywge0Bjb2RlIGZhbHNlfQotICAgICAqIGlmIGl0IGlzIG5vIGxvbmdlciByb2FtaW5nLgorICAgICAqIENoZWNrIGlmIHRlYXIgZG93biB3YXMgcmVxdWVzdGVkCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Um9hbWluZ1N0YXR1cyhib29sZWFuIGlzUm9hbWluZykgewotICAgICAgICBpZiAoaXNSb2FtaW5nICE9IG1OZXR3b3JrSW5mby5pc1JvYW1pbmcoKSkgewotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFJvYW1pbmcoaXNSb2FtaW5nKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCk7CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTdWJ0eXBlKGludCBzdWJ0eXBlLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKG1OZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBpbnQgb2xkU3VidHlwZSA9IG1OZXR3b3JrSW5mby5nZXRTdWJ0eXBlKCk7Ci0gICAgICAgICAgICBpZiAoc3VidHlwZSAhPSBvbGRTdWJ0eXBlKSB7Ci0gICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFN1YnR5cGUoc3VidHlwZSwgc3VidHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQsIG9sZFN1YnR5cGUsIDAsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRNb25pdG9yaW5nKCk7CisgICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKCk7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHRlYXJkb3duIG9jY3VycmVkLCB7QGNvZGUgZmFsc2V9IGlmIHRoZQogICAgICAqIHRlYXJkb3duIGRpZCBub3Qgb2NjdXIuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdGVhcmRvd24oKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpOwogCiAgICAgLyoqCiAgICAgICogUmVlbmFibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yayBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd2UncmUgY29ubmVjdGVkIG9yIGV4cGVjdCB0byBiZSBjb25uZWN0ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWNvbm5lY3QoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKTsKIAogICAgIC8qKgogICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgogICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pOworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoaXMgbmV0d29yayBpcyBhdmFpbGFibGUgZm9yCiAgICAgICogY29ubmVjdGlvbnMuIEEgdmFsdWUgb2Yge0Bjb2RlIGZhbHNlfSBtZWFucyB0aGF0IHNvbWUgcXVhc2ktcGVybWFuZW50CiAgICAgICogY29uZGl0aW9uIHByZXZlbnRzIGNvbm5lY3Rpdml0eSB0byB0aGlzIG5ldHdvcmsuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpOwogCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCkBAIC0zNzYsNyArMTM2LDcgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKKyAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBpcyBmaW5pc2hlZApAQCAtMzkwLDIzICsxNTAsMTIgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwotCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoaXMgbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcnByZXRzIHNjYW4gcmVzdWx0cy4gVGhpcyB3aWxsIGJlIGNhbGxlZCBhdCBhIHNhZmUgdGltZSBmb3IKICAgICAgKiBwcm9jZXNzaW5nLCBhbmQgZnJvbSBhIHNhZmUgdGhyZWFkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgIH0KKyAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwogCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQppbmRleCBlMDdlZTU5Li45MTVlMzQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMU2Vzc2lvbkNhY2hlOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCkBAIC04MSw2ICs4MiwxMSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBbmRyb2lkSHR0cENsaWVudCI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXh0Q29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJ0ZXh0LyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIgorICAgIH07CiAKICAgICAvKiogSW50ZXJjZXB0b3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW5nIHRocmVhZCBpcyBibG9ja2VkICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSHR0cFJlcXVlc3RJbnRlcmNlcHRvciBzVGhyZWFkQ2hlY2tJbnRlcmNlcHRvciA9CkBAIC0zNTgsNyArMzY0LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobGV2ZWwgPCBMb2cuVkVSQk9TRSB8fCBsZXZlbCA+IExvZy5BU1NFUlQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxldmVsIGlzIG91dCBvZiByYW5nZSBbIgotICAgICAgICAgICAgICAgICsgTG9nLlZFUkJPU0UgKyAiLi4iICsgTG9nLkFTU0VSVCArICJdIik7ICAgIAorICAgICAgICAgICAgICAgICsgTG9nLlZFUkJPU0UgKyAiLi4iICsgTG9nLkFTU0VSVCArICJdIik7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJsQ29uZmlndXJhdGlvbiA9IG5ldyBMb2dnaW5nQ29uZmlndXJhdGlvbihuYW1lLCBsZXZlbCk7CkBAIC00MzEsMTIgKzQzNywxNyBAQAogICAgICAgICAgICAgICAgIGlmIChlbnRpdHkuZ2V0Q29udGVudExlbmd0aCgpIDwgMTAyNCkgewogICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICBlbnRpdHkud3JpdGVUbyhzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGhlIGNvbnRlbnQgdHlwZSwgdG9vLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlbnRpdHlTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmluYXJ5Q29udGVudChyZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2U2NCA9IEJhc2U2NC5lbmNvZGVUb1N0cmluZyhzdHJlYW0udG9CeXRlQXJyYXkoKSwgQmFzZTY0Lk5PX1dSQVApOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5pbnNlcnQoMCwgImVjaG8gJyIgKyBiYXNlNjQgKyAiJyB8IGJhc2U2NCAtZCA+IC90bXAvJCQuYmluOyAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWJpbmFyeSBAL3RtcC8kJC5iaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRpdHlTdHJpbmcgPSBzdHJlYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWFzY2lpIFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlbnRpdHlTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFtUT08gTVVDSCBEQVRBIFRPIElOQ0xVREVdIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDQ2LDYgKzQ1NywzMCBAQAogICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnlDb250ZW50KEh0dHBVcmlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgSGVhZGVyW10gaGVhZGVyczsKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhlYWRlciBoZWFkZXIgOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCJnemlwIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlci5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKEhlYWRlcnMuQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvbnRlbnRUeXBlIDogdGV4dENvbnRlbnRUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmdldFZhbHVlKCkuc3RhcnRzV2l0aChjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIG9mIHRoZSBnaXZlbiBIVFRQIGRhdGUgc3RyaW5nLiBUaGlzIG1ldGhvZCBjYW4gaWRlbnRpZnkKICAgICAgKiBhbmQgcGFyc2UgdGhlIGRhdGUgZm9ybWF0cyBlbWl0dGVkIGJ5IGNvbW1vbiBIVFRQIHNlcnZlcnMsIHN1Y2ggYXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQppbmRleCBjNTI3ZmU0Li5jMzZhZDM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCkBAIC04MCwxNCArODAsMTAgQEAKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZVtdIHNlcnZlckNlcnRpZmljYXRlcyA9IG51bGw7CiAKLSAgICAgICAgLy8gc3RhcnQgaGFuZHNoYWtlLCBjbG9zZSB0aGUgc29ja2V0IGlmIHdlIGZhaWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zZXRVc2VDbGllbnRNb2RlKHRydWUpOwotICAgICAgICAgICAgc3NsU29ja2V0LnN0YXJ0SGFuZHNoYWtlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgc3NsU29ja2V0LCBlLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFrZSIpOworICAgICAgICAvLyBnZXQgYSB2YWxpZCBTU0xTZXNzaW9uLCBjbG9zZSB0aGUgc29ja2V0IGlmIHdlIGZhaWwKKyAgICAgICAgU1NMU2Vzc2lvbiBzc2xTZXNzaW9uID0gc3NsU2Vzc2lvbiA9IHNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGlmICghc3NsU2Vzc2lvbi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oc3NsU29ja2V0LCAiZmFpbGVkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFrZSIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcmV0cmlldmUgdGhlIGNoYWluIG9mIHRoZSBzZXJ2ZXIgcGVlciBjZXJ0aWZpY2F0ZXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKaW5kZXggZDI4MTQ4Yy4uODMyY2U4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQub3M7CiAKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCkBAIC0zNiw4ICszNiw4IEBACiAgKiA8cD5BbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IGEgY29tcHV0YXRpb24gdGhhdCBydW5zIG9uIGEgYmFja2dyb3VuZCB0aHJlYWQgYW5kCiAgKiB3aG9zZSByZXN1bHQgaXMgcHVibGlzaGVkIG9uIHRoZSBVSSB0aHJlYWQuIEFuIGFzeW5jaHJvbm91cyB0YXNrIGlzIGRlZmluZWQgYnkgMyBnZW5lcmljCiAgKiB0eXBlcywgY2FsbGVkIDxjb2RlPlBhcmFtczwvY29kZT4sIDxjb2RlPlByb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+UmVzdWx0PC9jb2RlPiwKLSAqIGFuZCA0IHN0ZXBzLCBjYWxsZWQgPGNvZGU+YmVnaW48L2NvZGU+LCA8Y29kZT5kb0luQmFja2dyb3VuZDwvY29kZT4sCi0gKiA8Y29kZT5wcm9jZXNzUHJvZ3Jlc3M8L2NvZGU+IGFuZCA8Y29kZT5lbmQ8L2NvZGU+LjwvcD4KKyAqIGFuZCA0IHN0ZXBzLCBjYWxsZWQgPGNvZGU+b25QcmVFeGVjdXRlPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAorICogPGNvZGU+b25Qcm9ncmVzc1VwZGF0ZTwvY29kZT4gYW5kIDxjb2RlPm9uUG9zdEV4ZWN1dGU8L2NvZGU+LjwvcD4KICAqCiAgKiA8aDI+VXNhZ2U8L2gyPgogICogPHA+QXN5bmNUYXNrIG11c3QgYmUgc3ViY2xhc3NlZCB0byBiZSB1c2VkLiBUaGUgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSBhdCBsZWFzdApAQCAtMTg3LDYgKzE4NywxNyBAQAogICAgICAgICB9OwogCiAgICAgICAgIG1GdXR1cmUgPSBuZXcgRnV0dXJlVGFzazxSZXN1bHQ+KG1Xb3JrZXIpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXQoUmVzdWx0IHYpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXQodik7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfQ0FOQ0VMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UmVzdWx0PihBc3luY1Rhc2sudGhpcywgKFJlc3VsdFtdKSBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwpAQCAtNDAyLDE0ICs0MTMsMTkgQEAKICAgICAgKiBzdGlsbCBydW5uaW5nLiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBleGVjdXRpb24gb2YKICAgICAgKiB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgICoKKyAgICAgKiB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IHdpbGwgbm90ZSBiZSBjYWxsZWQgaWYgdGhlIHRhc2sgaGFzIGJlZW4KKyAgICAgKiBjYW5jZWxlZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHByb2dyZXNzIHZhbHVlcyB0byB1cGRhdGUgdGhlIFVJIHdpdGguCiAgICAgICoKICAgICAgKiBAc2VlICNvblByb2dyZXNzVXBkYXRlCiAgICAgICogQHNlZSAjZG9JbkJhY2tncm91bmQKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdWJsaXNoUHJvZ3Jlc3MoUHJvZ3Jlc3MuLi4gdmFsdWVzKSB7Ci0gICAgICAgIHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX1BST0dSRVNTLAotICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UHJvZ3Jlc3M+KHRoaXMsIHZhbHVlcykpLnNlbmRUb1RhcmdldCgpOworICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgIHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX1BST0dSRVNTLAorICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBmaW5pc2goUmVzdWx0IHJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCmluZGV4IDdiODgzYTcuLmQzZDM5ZDZkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIC8qKgogICogVXNlZCBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgU3RvcmFnZU1hbmFnZXIKLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9yYWdlRXZlbnRMaXN0ZW5lciB7CiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKaW5kZXggYTEyNjAzYy4uYjQ5OTc5YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpAQCAtNDUsOCArNDUsNiBAQAogICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UoamF2YS5sYW5nLlN0cmluZyl9IHdpdGggYW4gYXJndW1lbnQKICAqIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNTVE9SQUdFX1NFUlZJQ0V9LgogICoKLSAqIEBoaWRlCi0gKgogICovCiAKIHB1YmxpYyBjbGFzcyBTdG9yYWdlTWFuYWdlcgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCmluZGV4IDA3NWY0N2YuLjA3ZDk1ZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIC8qKgogICogQ2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY29uc3RhbnRzIHJldHVybmVkIGZyb20gU3RvcmFnZU1hbmFnZXIKICAqIGFuZCBsb3dlciBsZXZlbCBNb3VudFNlcnZpY2UgQVBJcy4KLSAqCi0gKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgU3RvcmFnZVJlc3VsdENvZGUKIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCmluZGV4IDYzNTMyM2UuLjI4MjQxN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQpAQCAtMTgxLDcgKzE4MSw5IEBACiAgICAgICAgIGJvb2xlYW4gaW5VdGMgPSBzdGFydC5wYXJzZShkdHN0YXJ0KTsKICAgICAgICAgYm9vbGVhbiBhbGxEYXkgPSBzdGFydC5hbGxEYXk7CiAKLSAgICAgICAgaWYgKGluVXRjKSB7CisgICAgICAgIC8vIFdlIGZvcmNlIFRpbWVab25lIHRvIFVUQyBmb3IgImFsbCBkYXkgcmVjdXJyaW5nIGV2ZW50cyIgYXMgdGhlIHNlcnZlciBpcyBzZW5kaW5nIG5vCisgICAgICAgIC8vIFRpbWVab25lIGluIERUU1RBUlQgZm9yIHRoZW0KKyAgICAgICAgaWYgKGluVXRjIHx8IGFsbERheSkgewogICAgICAgICAgICAgdHppZCA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkBAIC0yMDQsMTAgKzIwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChhbGxEYXkpIHsKLSAgICAgICAgCS8vIFRPRE86IGFsc28gY2hhbmdlIHR6aWQgdG8gYmUgVVRDPyAgdGhhdCB3b3VsZCBiZSBjb25zaXN0ZW50LCBidXQKLSAgICAgICAgCS8vIHRoYXQgd291bGQgbm90IHJlZmxlY3QgdGhlIG9yaWdpbmFsIHRpbWV6b25lIHZhbHVlIGJhY2sgdG8gdGhlCi0gICAgICAgIAkvLyBzZXJ2ZXIuCi0gICAgICAgIAlzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOworICAgICAgICAgICAgc3RhcnQudGltZXpvbmUgPSBUaW1lLlRJTUVaT05FX1VUQzsKICAgICAgICAgfQogICAgICAgICBsb25nIG1pbGxpcyA9IHN0YXJ0LnRvTWlsbGlzKGZhbHNlIC8qIHVzZSBpc0RzdCAqLyk7CiAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXIuRXZlbnRzLkRUU1RBUlQsIG1pbGxpcyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1YzI5ZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUZXh0VXRpbHMgZXNwZWNpYWxseSBmb3IgSmFwYW5lc2UuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSmFwYW5lc2VVdGlscyB7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgTWFwPENoYXJhY3RlciwgU3RyaW5nPiBzSGFsZldpZHRoTWFwID0KLSAgICAgICAgbmV3IEhhc2hNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBUaGVyZSdzIG5vIGxvZ2ljYWwgbWFwcGluZyBydWxlIGluIFVuaWNvZGUuIFNpZ2guCi0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDEnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDInLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEMnLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEQnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMUMnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQxJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDREJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDczJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdEJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlCJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlDJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEExJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFEJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQzJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEREJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY0JywgIlx1RkY3M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY1JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY2JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZCJywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZDJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAxJywgIiEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMicsICJcIiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAzJywgIiMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNCcsICIkIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDUnLCAiJSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA2JywgIiYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNycsICInIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDgnLCAiKCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA5JywgIikiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQScsICIqIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEInLCAiKyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBDJywgIiwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRCcsICItIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEUnLCAiLiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBGJywgIi8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMCcsICIwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTEnLCAiMSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEyJywgIjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMycsICIzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTQnLCAiNCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE1JywgIjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNicsICI2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTcnLCAiNyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE4JywgIjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOScsICI5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUEnLCAiOiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFCJywgIjsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQycsICI8Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUQnLCAiPSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFFJywgIj4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRicsICI/Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjAnLCAiQCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIxJywgIkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMicsICJCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjMnLCAiQyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI0JywgIkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNScsICJFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjYnLCAiRiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI3JywgIkciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyOCcsICJIIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjknLCAiSSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJBJywgIkoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQicsICJLIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkMnLCAiTCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJEJywgIk0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRScsICJOIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkYnLCAiTyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMwJywgIlAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMScsICJRIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzInLCAiUiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMzJywgIlMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNCcsICJUIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzUnLCAiVSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM2JywgIlYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNycsICJXIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzgnLCAiWCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM5JywgIlkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQScsICJaIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0InLCAiWyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNDJywgIlxcIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0QnLCAiXSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNFJywgIl4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRicsICJfIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDEnLCAiYSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQyJywgImIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MycsICJjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDQnLCAiZCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ1JywgImUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NicsICJmIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDcnLCAiZyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ4JywgImgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OScsICJpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEEnLCAiaiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRCJywgImsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QycsICJsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEQnLCAibSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRFJywgIm4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RicsICJvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTAnLCAicCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUxJywgInEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MicsICJyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTMnLCAicyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU0JywgInQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NScsICJ1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTYnLCAidiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU3JywgInciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1OCcsICJ4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTknLCAieSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVBJywgInoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QicsICJ7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUMnLCAifCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVEJywgIn0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RScsICJ+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjEnLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjInLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjMnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjQnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjUnLCAiXHVGRjY1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjYnLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjcnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjgnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjknLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkEnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkInLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkQnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkUnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkYnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzAnLCAiXHVGRjcwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzEnLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzInLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzMnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzQnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzUnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzYnLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzcnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzgnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzknLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0EnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0InLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0MnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0QnLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0UnLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0YnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODAnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODInLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODMnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODQnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODUnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODYnLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODcnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODgnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODknLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEEnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEMnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEQnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEUnLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEYnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTAnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTEnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTInLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTMnLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTUnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTYnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTcnLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTgnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTknLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUEnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUInLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUMnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUQnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUUnLCAiXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUYnLCAiXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGRTUnLCAiXHUwMDVDXHUwMDVDIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGhhbGYtd2lkdGggdmVyc2lvbiBvZiB0aGF0IGNoYXJhY3RlciBpZiBwb3NzaWJsZS4gUmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlCi0gICAgICogQHBhcmFtIGNoIGlucHV0IGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gQ2hhclNlcXVlbmNlIG9iamVjdCBpZiB0aGUgbWFwcGluZyBmb3IgY2ggZXhpc3RzLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ5R2V0SGFsZldpZHRoVGV4dChjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChzSGFsZldpZHRoTWFwLmNvbnRhaW5zS2V5KGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIHNIYWxmV2lkdGhNYXAuZ2V0KGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGE2ZDdhLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGxldHMgdXNlcnMgY3JlYXRlIHRoZWlyIG93biB2Q2FyZCBTdHJpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEJ1aWxkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQnVpbGRlciI7Ci0KLSAgICAvLyBJZiB5b3UgYWRkIHRoZSBvdGhlciBlbGVtZW50LCBwbGVhc2UgY2hlY2sgYWxsIHRoZSBjb2x1bW5zIGFyZSBhYmxlIHRvIGJlCi0gICAgLy8gY29udmVydGVkIHRvIFN0cmluZy4KLSAgICAvLwotICAgIC8vIGUuZy4gQkxPQiBpcyBub3Qgd2hhdCB3ZSBjYW4gaGFuZGxlIGhlcmUgbm93LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0ID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BIT05FX1RZUEUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1NUQUxfVFlQRSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRU1BSUxfVFlQRSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfREFUQV9WQ0FSRCA9ICJWQ0FSRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfUFVCTElDID0gIlBVQkxJQyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fU0VQQVJBVE9SID0gIjsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9FTkRfT0ZfTElORSA9ICJcclxuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfREFUQV9TRVBBUkFUT1IgPSAiOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0lURU1fU0VQQVJBVE9SID0gIjsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9XUyA9ICIgIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRVFVQUwgPSAiPSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVAgPSAiRU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YyMSA9ICJFTkNPRElORz1CQVNFNjQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjMwID0gIkVOQ09ESU5HPWIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISUZUX0pJUyA9ICJTSElGVF9KSVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1YzMDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzSmFwYW5lc2VNb2JpbGVQaG9uZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzRG9Db01vOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc0FuZHJvaWRQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNEZWZhY3RQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNVdGY4OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc1NoaWZ0SmlzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQXBwZW5kVHlwZVBhcmFtTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZzsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNoYXJzZXRTdHJpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZDYXJkQ2hhcnNldFBhcmFtZXRlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtQnVpbGRlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuZEFwcGVuZGVkOwotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0KLSAgICAgICAgbUlzVjMwID0gVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKTsKLSAgICAgICAgbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSA9IFZDYXJkQ29uZmlnLnNob3VsZFVzZVF1b3RlZFByaW50YWJsZSh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNKYXBhbmVzZU1vYmlsZVBob25lID0gVkNhcmRDb25maWcubmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyh2Y2FyZFR5cGUpOwotICAgICAgICBtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlID0gVkNhcmRDb25maWcub25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzQW5kcm9pZFByb3BlcnR5ID0gVkNhcmRDb25maWcudXNlc0FuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzRGVmYWN0UHJvcGVydHkgPSBWQ2FyZENvbmZpZy51c2VzRGVmYWN0UHJvcGVydHkodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNVdGY4ID0gVkNhcmRDb25maWcudXNlc1V0ZjgodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNTaGlmdEppcyA9IFZDYXJkQ29uZmlnLnVzZXNTaGlmdEppcyh2Y2FyZFR5cGUpOwotICAgICAgICBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgPSBWQ2FyZENvbmZpZy5zaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1BcHBlbmRUeXBlUGFyYW1OYW1lID0gVkNhcmRDb25maWcuYXBwZW5kVHlwZVBhcmFtTmFtZSh2Y2FyZFR5cGUpOwotICAgICAgICBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLQotICAgICAgICBtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtID0gIShtSXNWMzAgJiYgbVVzZXNVdGY4KTsKLQotICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUywgImRvY29tbyIpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkRvQ29Nby1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBtQ2hhcnNldFN0cmluZyBiZWxsb3cgc2luY2UgaXQgaXMgZGlmZmVyZW50IGZyb20gIlNISUZUX0pJUyIgYnV0Ci0gICAgICAgICAgICAvLyBtYXkgYmUgIkRPQ09NT19TSElGVF9KSVMiIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKGludGVybmFsIGV4cHJlc3Npb24gdXNlZCBpbgotICAgICAgICAgICAgLy8gQW5kcm9pZCwgbm90IHNob3duIHRvIHRoZSBwdWJsaWMpLgotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBTSElGVF9KSVM7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNTaGlmdEppcykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZlbmRvci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBTSElGVF9KSVM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IFVURl84OwotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBVVEZfODsKLSAgICAgICAgfQotICAgICAgICBjbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIG1FbmRBcHBlbmRlZCA9IGZhbHNlOwotICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JFR0lOLCBWQ0FSRF9EQVRBX1ZDQVJEKTsKLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc05vbkVtcHR5TmFtZShmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBSRUZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlNVRkZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0gICAgICAgIHJldHVybiAhKFRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KG1pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwcmVmaXgpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGVudFZhbHVlcyBnZXRQcmltYXJ5Q29udGVudFZhbHVlKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEludGVnZXIgaXNTdXBlclByaW1hcnkgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkTmFtZS5JU19TVVBFUl9QUklNQVJZKTsKLSAgICAgICAgICAgIGlmIChpc1N1cGVyUHJpbWFyeSAhPSBudWxsICYmIGlzU3VwZXJQcmltYXJ5ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSAic3VwZXIgcHJpbWFyeSIgQ29udGVudFZhbHVlcy4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0ICJwcmltYXJ5IiBDb250ZW50VmFsdWVzCi0gICAgICAgICAgICAgICAgLy8gaWYgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnkgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5ICE9IG51bGwgJiYgaXNQcmltYXJ5ID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNOb25FbXB0eU5hbWUoY29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYnJlYWssIHNpbmNlIHRoZXJlIG1heSBiZSBDb250ZW50VmFsdWVzIHdpdGggInN1cGVyIHByaW1hcnkiCi0gICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyd29yZC4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN1YnByaW1hcnlDb250ZW50VmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0IENvbnRlbnRWYWx1ZXMgaWYgYW55ICJwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJBbGwgQ29udGVudFZhbHVlcyBnaXZlbiBmcm9tIGRhdGFiYXNlIGlzIGVtcHR5LiIpOwotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcmltYXJ5Q29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igc2FmZXR5LCB3ZSdsbCBlbWl0IGp1c3Qgb25lIHZhbHVlIGFyb3VuZCBTdHJ1Y3R1cmVkTmFtZSwgYXMgZXh0ZXJuYWwgaW1wb3J0ZXJzCi0gICAgICogbWF5IGdldCBjb25mdXNlZCB3aXRoIG11bHRpcGxlICJOIiwgIkZOIiwgZXRjLiBwcm9wZXJ0aWVzLCB0aG91Z2ggaXQgaXMgdmFsaWQgaW4KLSAgICAgKiB2Q2FyZCBzcGVjLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmFtZVByb3BlcnRpZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCB8fCBjb250ZW50VmFsdWVzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIHJlcXVpcmVzICJOIiBhbmQgIkZOIiBwcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSB8fCAhVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGZhbWlseU5hbWUsIGdpdmVuTmFtZSwgbWlkZGxlTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUgPQotICAgICAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGdpdmVuTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG1pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwcmVmaXgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShzdWZmaXgpKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROYW1lOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlZE5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKG1WQ2FyZFR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5TmFtZSwgbWlkZGxlTmFtZSwgZ2l2ZW5OYW1lLCBwcmVmaXgsIHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOID0KLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID0KLSAgICAgICAgICAgICAgICAgICAgIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZm9ybWF0dGVkTmFtZSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRmFtaWx5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRHaXZlbjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTWlkZGxlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQcmVmaXg7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFN1ZmZpeDsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRmFtaWx5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVuY29kZVF1b3RlZFByaW50YWJsZShnaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRNaWRkbGUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUobWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFByZWZpeCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUoc3VmZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVzY2FwZUNoYXJhY3RlcnMoZmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEdpdmVuID0gZXNjYXBlQ2hhcmFjdGVycyhnaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRNaWRkbGUgPSBlc2NhcGVDaGFyYWN0ZXJzKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN1ZmZpeCA9IGVzY2FwZUNoYXJhY3RlcnMoc3VmZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGb3JtYXR0ZWRuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShmb3JtYXR0ZWROYW1lKSA6IGVzY2FwZUNoYXJhY3RlcnMoZm9ybWF0dGVkTmFtZSkpOwotCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAvLyBEb0NvTW8gcGhvbmVzIHJlcXVpcmUgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSAiZmFtaWx5IG5hbWUiIGZpZWxkLgotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRmFtaWx5KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkR2l2ZW4pOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRNaWRkbGUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQcmVmaXgpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRTdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLQotICAgICAgICAgICAgLy8gRk4gcHJvcGVydHkKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0gICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTikgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRGb3JtYXR0ZWRuYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lID0KLSAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGRpc3BsYXlOYW1lKSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZERpc3BsYXlOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGRpc3BsYXlOYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZUNoYXJhY3RlcnMoZGlzcGxheU5hbWUpOwotCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLQotICAgICAgICAgICAgLy8gTm90ZTogIkNIQVJTRVQiIHBhcmFtIGlzIG5vdCBhbGxvd2VkIGluIHZDYXJkIDMuMCwgYnV0IHdlIG1heSBhZGQgaXQKLSAgICAgICAgICAgIC8vICAgICAgIHdoZW4gaXQgd291bGQgYmUgdXNlZnVsIGZvciBleHRlcm5hbCBpbXBvcnRlcnMsIGFzc3VtaW5nIG5vIGV4dGVybmFsCi0gICAgICAgICAgICAvLyAgICAgICBpbXBvcnRlciBhbGxvd3MgdGhpcyB2aW9yYXRpb24uCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGVzZSBmaWVsZHMuCi0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgICAgICBpZiAobU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSA9IHRtcFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUgPSB0bXBQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUgPSB0bXBQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGVtaXQgdGhlIGZpZWxkKHMpIHJlbGF0ZWQgdG8gcGhvbmV0aWMgbmFtZS4KLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvcnRTdHJpbmcgPSBWQ2FyZFV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lLCBwaG9uZXRpY01pZGRsZU5hbWUsIHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORyk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHNvcnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVDaGFyYWN0ZXJzKHNvcnRTdHJpbmcpKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzSmFwYW5lc2VNb2JpbGVQaG9uZSkgewotICAgICAgICAgICAgLy8gTm90ZTogVGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgcHJvcGVydHkgZm9yIGV4cHJlc3NpbmcKLSAgICAgICAgICAgIC8vICAgICAgIHBob25ldGljIG5hbWUgaW4gdkNhcmQgMi4xLCB3aGlsZSB0aGVyZSBpcyBpbgotICAgICAgICAgICAgLy8gICAgICAgdkNhcmQgMy4wIChTT1JULVNUUklORykuCi0gICAgICAgICAgICAvLyAgICAgICBXZSBjaG9zZSB0byB1c2UgRG9Db01vJ3Mgd2F5IHdoZW4gdGhlIGRldmljZSBpcyBKYXBhbmVzZSBvbmUKLSAgICAgICAgICAgIC8vICAgICAgIHNpbmNlIGl0IGlzIHN1cHBvcnRlZCBieQotICAgICAgICAgICAgLy8gICAgICAgYSBsb3Qgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lcy4gVGhpcyBpcyAiWC0iIHByb3BlcnR5LCBzbwotICAgICAgICAgICAgLy8gICAgICAgYW55IHBhcnNlciBob3BlZnVsbHkgd291bGQgbm90IGdldCBjb25mdXNlZCB3aXRoIHRoaXMuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgQWxzbywgRG9Db01vJ3Mgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB2Q2FyZCBjb21wb3NlciB0byB1c2UganVzdCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vICAgICAgIGNvbHVtbi4KLSAgICAgICAgICAgIC8vICAgICAgIGkuZS4KLSAgICAgICAgICAgIC8vICAgICAgIG8gIFNPVU5EO1gtSVJNQy1OOk1peWFrYXdhIERhaXN1a2U7Ozs7Ci0gICAgICAgICAgICAvLyAgICAgICB4ICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YTtEYWlzdWtlOzs7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTik7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lKSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lLAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lLCBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVXNlc0RlZmFjdFByb3BlcnR5KSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNHaXZlbk5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY01pZGRsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljRmFtaWx5TmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5pY2tOYW1lcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlQW5kcm9pZFByb3BlcnR5OwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICB1c2VBbmRyb2lkUHJvcGVydHkgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGFkZCB0aGlzIGZpZWxkLgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmlja25hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5pY2tuYW1lLk5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuaWNrbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1c2VBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05JQ0tOQU1FLCBuaWNrbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvbmVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBwaG9uZUxpbmVFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHBob25lU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihQaG9uZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5OVU1CRVIpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyID0gcGhvbmVOdW1iZXIudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFBBR0VSIG51bWJlciBuZWVkcyB1bmZvcm1hdHRlZCAicGhvbmUgbnVtYmVyIi4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/IHR5cGVBc09iamVjdCA6IERFRkFVTFRfUEhPTkVfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lU2V0LmNvbnRhaW5zKHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKHBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRlbExpbmUodHlwZSwgbGFiZWwsIHBob25lTnVtYmVyLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTnVtYmVyTGlzdCA9IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhY3R1YWxQaG9uZU51bWJlciA6IHBob25lTnVtYmVyTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhhY3R1YWxQaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0ID0gVkNhcmRVdGlscy5nZXRQaG9uZU51bWJlckZvcm1hdChtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkUGhvbmVOdW1iZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYWN0dWFsUGhvbmVOdW1iZXIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKGFjdHVhbFBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBmb3JtYXR0ZWRQaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgLy8gZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBob25lTGluZUV4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZFRlbExpbmUoUGhvbmUuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBleHByZXNzaW5nIHBob25lIG51bWJlcnMgaW50byBzZXZlcmFsIHN0cmluZ3MsIGFuZCByZW1vdmUKLSAgICAgKiB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGVtLiBUaGUgc2l6ZSBvZiBhIHJldHVybmVkIGxpc3QgYmVjb21lcyAxIHdoZW4KLSAgICAgKiBubyBzcGxpdCBpcyBuZWVkZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBnaXZlbiBudW1iZXIgIm1heSIgaGF2ZSBzZXZlcmFsIHBob25lIG51bWJlcnMgd2hlbiB0aGUgY29udGFjdCBlbnRyeSBpcyBjb3JydXB0ZWQKLSAgICAgKiBiZWNhdXNlIG9mIGl0cyBvcmlnaW5hbCBzb3VyY2UuCi0gICAgICogZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTUtNjY2NiAoQnJvd2FyZDsgMzA1LTY1My02Nzk2IChNaWFtaSkiCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMga2luZCBvZiAicGhvbmUgbnVtYmVycyIgd2lsbCBub3QgYmUgY3JlYXRlZCB3aXRoIEFuZHJvaWQgdkNhcmQgaW1wbGVtZW50YXRpb24sCi0gICAgICogYnV0IHdlIG1heSBlbmNvdW50ZXIgdGhlbSBpZiB0aGUgc291cmNlIG9mIHRoZSBpbnB1dCBkYXRhIGhhcyBhbHJlYWR5IGNvcnJ1cHRlZAotICAgICAqIGltcGxlbWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUbyBoYW5kbGUgdGhpcyBjYXNlLCB0aGlzIG1ldGhvZCBmaXJzdCBzcGxpdHMgaXRzIGlucHV0IGludG8gbXVsdGlwbGUgcGFydHMKLSAgICAgKiAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiLCAiNDQ0LTU1NS02NjY2IChCcm93YXJkIiwgYW5kIDMwNTY1My02Nzk2IChNaWFtaSkiKSBhbmQKLSAgICAgKiByZW1vdmVzIHVubmVjZXNzYXJ5IHN0cmluZ3MgbGlrZSAiKE1pYW1pKSIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdHJpbW1pbmcgaXMgaW5hcHByb3ByaWF0ZSBmb3IgaXRzIHJlY2VpdmVycy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3BsaXRBbmRUcmltUGhvbmVOdW1iZXJzKGZpbmFsIFN0cmluZyBwaG9uZU51bWJlcikgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBob25lTnVtYmVyLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNoKSB8fCBjaCA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA9PSAnOycgfHwgY2ggPT0gJ1xuJykgJiYgYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kRW1haWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBlbWFpbEFkZHJlc3NFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFkZHJlc3NTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuREFUQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsQWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IGVtYWlsQWRkcmVzcy50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShlbWFpbEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEVtYWlsLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc09iamVjdCAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc09iamVjdCA6IERFRkFVTFRfRU1BSUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFbWFpbC5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3NTZXQuY29udGFpbnMoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzU2V0LmFkZChlbWFpbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUodHlwZSwgbGFiZWwsIGVtYWlsQWRkcmVzcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtYWlsQWRkcmVzc0V4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZEVtYWlsTGluZShFbWFpbC5UWVBFX0hPTUUsICIiLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQb3N0YWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yR2VuZXJpYyhjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gc1Bvc3RhbFR5cGVQcmlvcml0eU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSwgMCk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLLCAxKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSLCAyKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSwgMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gYXBwZW5kIGp1c3Qgb25lIGxpbmUuIElmIHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWRkcmVzcwotICAgICAqIGluZm9ybWF0aW9uLCBhcHBlbmQgYW4gZW1wdHkgbGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckRvQ29NbyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGludCBjdXJyZW50UHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGN1cnJlbnRUeXBlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcmlvcml0eUFzSW50ZWdlciA9IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAuZ2V0KHR5cGVBc0ludGVnZXIpOwotICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgKHByaW9yaXR5QXNJbnRlZ2VyICE9IG51bGwgPyBwcmlvcml0eUFzSW50ZWdlciA6IEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA8IGN1cnJlbnRQcmlvcml0eSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTaG91bGQgbm90IGNvbWUgaGVyZS4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwb3N0YWwgZGF0YS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGN1cnJlbnRDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwpOwotICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKGN1cnJlbnRUeXBlLCBsYWJlbCwgY3VycmVudENvbnRlbnRWYWx1ZXMsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzSW50ZWdlciA6IERFRkFVTFRfUE9TVEFMX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKHR5cGUsIGxhYmVsLCBjb250ZW50VmFsdWVzLCBpc1ByaW1hcnksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RhbFN0cnVjdCB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YTsKLSAgICAgICAgcHVibGljIFBvc3RhbFN0cnVjdChmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQsIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YSkgewotICAgICAgICAgICAgdGhpcy5yZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgICAgICB0aGlzLmFwcGVuZENoYXJzZXQgPSBhcHBlbmRDaGFyc2V0OwotICAgICAgICAgICAgdGhpcy5hZGRyZXNzRGF0YSA9IGFkZHJlc3NEYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBudWxsIHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gY29uc3RydWN0IHRoZSBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgUG9zdGFsU3RydWN0IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgLy8gYWRyLXZhbHVlICAgID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkcmVzcywgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb0JveCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdOZWlnaGJvcmhvb2QgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09EKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmVldCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdSZWdpb24gPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1Bvc3RhbENvZGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3Q291bnRyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcmF3QWRkcmVzc0FycmF5ID0gbmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgIHJhd1BvQm94LCByYXdOZWlnaGJvcmhvb2QsIHJhd1N0cmVldCwgcmF3TG9jYWxpdHksCi0gICAgICAgICAgICAgICAgcmF3UmVnaW9uLCByYXdQb3N0YWxDb2RlLCByYXdDb3VudHJ5fTsKLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0FkZHJlc3NBcnJheSkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb0JveDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkU3RyZWV0OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRMb2NhbGl0eTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUmVnaW9uOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb3N0YWxDb2RlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRDb3VudHJ5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWROZWlnaGJvcmhvb2Q7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdMb2NhbGl0eTI7Ci0gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGluZWZmaWNpZW50IHNpbmNlIHdlIGVuY29kZSByYXdMb2NhbGl0eSBhbmQgcmF3TmVpZ2hib3Job29kIHR3aWNlLAotICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgaW50ZW50aW9uYWwuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gUVAgZW5jb2RpbmcgbWF5IGFkZCBsaW5lIGZlZWRzIHdoZW4gbmVlZGVkIGFuZCB0aGUgcmVzdWx0IG9mCi0gICAgICAgICAgICAvLyAtIGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eSArICIgIiArIHJhd05laWdoYm9yaG9vZCkKLSAgICAgICAgICAgIC8vIG1heSBiZSBkaWZmZXJlbnQgZnJvbQotICAgICAgICAgICAgLy8gLSBlbmNvZGVkTG9jYWxpdHkgKyAiICIgKyBlbmNvZGVkTmVpZ2hib3Job29kLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFdlIHVzZSBzYWZlciB3YXkuCi0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TG9jYWxpdHkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdTdHJlZXQpOwotICAgICAgICAgICAgICAgIGVuY29kZWRMb2NhbGl0eSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkQ291bnRyeSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvQm94ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0xvY2FsaXR5Mik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFJlZ2lvbiA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0NvdW50cnkpOwotICAgICAgICAgICAgICAgIGVuY29kZWROZWlnaGJvcmhvb2QgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd05laWdoYm9yaG9vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYWRkcmVzc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRQb0JveCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkU3RyZWV0KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRMb2NhbGl0eSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkUmVnaW9uKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRDb3VudHJ5KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkgPT0gdHJ1ZQotICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSBGT1JNQVRURURfQUREUkVTUyBpbnN0ZWFkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd0Zvcm1hdHRlZEFkZHJlc3MgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUyk7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3Rm9ybWF0dGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3M7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBzZWNvbmQgdmFsdWUgKCJFeHRlbmRlZCBBZGRyZXNzIikganVzdCBiZWNhdXNlIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMKLSAgICAgICAgICAgIC8vIGRvIHNvLiBJZiB0aGUgb3RoZXIgaW1wb3J0ZXIgZXhwZWN0cyB0aGUgdmFsdWUgYmUgaW4gdGhlIG90aGVyIGZpZWxkLCBzb21lIGZsYWcgbWF5Ci0gICAgICAgICAgICAvLyBiZSBuZWVkZWQuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYWRkcmVzc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEltcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcm90b2NvbEFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uUFJPVE9DT0wpOwotICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEFzT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBWQ2FyZFV0aWxzLmdldFByb3BlcnR5TmFtZUZvckltKHByb3RvY29sQXNPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEltLkRBVEEpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlQXNTdHJpbmc7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlQXNJbnRlZ2VyICE9IG51bGwgPyB0eXBlQXNJbnRlZ2VyIDogSW0uVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEltLkxBQkVMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSAobGFiZWwgIT0gbnVsbCA/ICJYLSIgKyBsYWJlbCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX09USEVSOiAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHR5cGVBc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kV2Vic2l0ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJzaXRlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhXZWJzaXRlLlVSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYnNpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3ZWJzaXRlID0gd2Vic2l0ZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGFueSBwYXJhbWV0ZXIgYWRkaXRpb24gdG93YXJkICJVUkwiCi0gICAgICAgICAgICAgICAgLy8gICAgICAgcHJvcGVydHksIHdoaWxlIHRoZXJlJ3Mgbm8gZG9jdW1lbnQgaW4gdkNhcmQgMi4xLgotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkod2Vic2l0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVVJMLCB3ZWJzaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRPcmdhbml6YXRpb25zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGFueSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLkNPTVBBTlkpOwotICAgICAgICAgICAgICAgIGlmIChjb21wYW55ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGFueSA9IGNvbXBhbnkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwYXJ0bWVudCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQpOwotICAgICAgICAgICAgICAgIGlmIChkZXBhcnRtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwYXJ0bWVudCA9IGRlcGFydG1lbnQudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5USVRMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBvcmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKGNvbXBhbnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcmdCdWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChkZXBhcnRtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9yZ2xpbmUgPSBvcmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9PUkcsIG9yZ2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShvcmdsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShvcmdsaW5lKSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSwgdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkodGl0bGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkodGl0bGUpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvdG9zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNCeXRlQXJyYXkoUGhvdG8uUEhPVE8pOwotICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG90b1R5cGUgPSBWQ2FyZFV0aWxzLmd1ZXNzSW1hZ2VUeXBlKGRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChwaG90b1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiVW5rbm93biBwaG90byB0eXBlLiBJZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob3RvU3RyaW5nID0gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlQmFzZTY0KGRhdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob3RvU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRQaG90b0xpbmUocGhvdG9TdHJpbmcsIHBob3RvVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTm90ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG5vdGVCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobm90ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQobm90ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5vdGVTdHIgPSBub3RlQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2Ugc2NhbiBub3RlU3RyIGNvbXBsZXRlbHkgdHdpY2UsIHdoaWNoIGlzIHJlZHVuZGFudC4KLSAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIG5vdywgd2UgYXNzdW1lIHRoaXMgaXMgbm90IHNvIHRpbWUtY29uc3VtaW5nLi4KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvLCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5vdGVTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFLCBub3RlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEV2ZW50cyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJpbWFyeUJpcnRoZGF5ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzZWNvbmRhcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBldmVudFR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXZlbnRUeXBlOwotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGVBc0ludGVnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBldmVudFR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRXZlbnQuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudC5UWVBFX0JJUlRIREFZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiaXJ0aGRheUNhbmRpZGF0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRXZlbnQuU1RBUlRfREFURSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaXJ0aGRheUNhbmRpZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1NVUEVSX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3VwZXJQcmltYXJ5ID0gKGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBzaG91bGQgdGhlIHByZWZlcmVkIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGJyZWFrIGhlcmUgc2luY2UgInN1cGVyIHByaW1hcnkiIGJpcnRoZGF5IG1heSBleGlzdCBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUJpcnRoZGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVudHJ5IGlzIHNldCB0byB0aGUgInNlY29uZGFyeSIgY2FuZGlkYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgdHlwZXMgb3RoZXIgdGhhbiBCaXJ0aGRheSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHZDYXJkLgotICAgICAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShFdmVudC5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByaW1hcnlCaXJ0aGRheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheS50cmltKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFJlbGF0aW9uKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5ICYmIGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUG9zdGFsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnksIGZpbmFsIGJvb2xlYW4gZW1pdExpbmVFdmVyeVRpbWUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFkZHJlc3NWYWx1ZTsKLSAgICAgICAgewotICAgICAgICAgICAgUG9zdGFsU3RydWN0IHBvc3RhbFN0cnVjdCA9IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgIGlmIChwb3N0YWxTdHJ1Y3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChlbWl0TGluZUV2ZXJ5VGltZSkgewotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzVmFsdWUgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSBwb3N0YWxTdHJ1Y3QucmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBwb3N0YWxTdHJ1Y3QuYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgICAgICAgICBhZGRyZXNzVmFsdWUgPSBwb3N0YWxTdHJ1Y3QuYWRkcmVzc0RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoZXRoZXIgdGhlIGxhYmVsIGlzIHZhbGlkIGluIHRoZSBzcGVjCi0gICAgICAgICAgICAgICAgICAgIC8vICgiSUFOQS10b2tlbiIgaW4gdGhlIHZDYXJkIDMuMCBpcyB1bmNsZWFyLi4uKQotICAgICAgICAgICAgICAgICAgICAvLyBKdXN0ICBmb3Igc2FmZXR5LCB3ZSBhZGQgIlgtIiBhdCB0aGUgYmVnZ2luaW5nIG9mIGVhY2ggbGFiZWwuCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsc28gY2hlY2tzIHRoZSBsYWJlbCBvYmV5cyB3aXRoIHZDYXJkIDMuMCBzcGVjLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCgiWC0iICsgbGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gU3RydWN0dXJlZFBvc3RhbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXBwZW5kQ2hhcnNldCkgewotICAgICAgICAgICAgLy8gU3RyaWN0bHksIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBleHBvcnRlcnMgdG8gZW1pdCBjaGFyc2V0IGluZm9ybWF0aW9uLAotICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgYWRkIGl0IHNpbmNlIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgdXNlZnVsIGZvciBpbXBvcnRlcnMsCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQXNzdW1lIG5vIHBhcnNlciBkb2VzIG5vdCBlbWl0IGVycm9yIHdpdGggdGhpcyBwYXJhbWV0ZXIgaW4gdkNhcmQgMy4wLgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChhZGRyZXNzVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEVtYWlsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVkNhcmRVdGlscy5pc01vYmlsZVBob25lTGFiZWwobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gIlgtIiArIGxhYmVsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIEVtYWlsIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHR5cGVBc1N0cmluZykpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHR5cGVBc1N0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTUFJTCwgcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgICAgICByYXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVGVsTGluZShmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9URUwpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLQotICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgaWYgKHR5cGVBc0ludGVnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0ZBWF9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9QQUdFUjogewotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIHJlYXNvbiwgYnV0IHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGhhZAotICAgICAgICAgICAgICAgICAgICAvLyB1c2VkICJWT0lDRSIgaW5zdGVhZCBvZiAiUEFHRVIiCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NBUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU46IHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHJlbGV2YW50IGZpZWxkIGluIHZDYXJkIChhdCBsZWFzdCAyLjEpLgotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9JU0ROOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9PVEhFUl9GQVg6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfVEVMRVg6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1RMWCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLX1BBR0VSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICAvLyBTZWUgYWJvdmUuCi0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTU1TOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NU0cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGN1c3RvbSB0eXBlLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cHBlckxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkVXRpbHMuaXNWYWxpZEluVjIxQnV0VW5rbm93blRvQ29udGFjdHNQaG90ZVR5cGUodXBwZXJMYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHVwcGVyTGFiZWwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFN0cmljdGx5LCB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgIlgtIiBwYXJhbWV0ZXIgd2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIlRZUEU9IiBzdHJpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCgiWC0iICsgbGFiZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1JBRElPOgotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1RUWV9UREQ6Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhcHBlbmRVbmNvbW1vblBob25lVHlwZShtQnVpbGRlciwgdHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgcGhvbmUgdHlwZSBzdHJpbmcgd2hpY2ggbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRVbmNvbW1vblBob25lVHlwZShmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIEludGVnZXIgdHlwZSkgewotICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gZm9yIERvQ29NbyBoYWQgYmVlbiBjb25zZXJ2YXRpdmUKLSAgICAgICAgICAgIC8vIGFib3V0IG1pc2NlbGxhbmVvdXMgdHlwZXMuCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwaG9uZVR5cGUgPSBWQ2FyZFV0aWxzLmdldFBob25lVHlwZVN0cmluZyh0eXBlKTsKLSAgICAgICAgICAgIGlmIChwaG9uZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIocGhvbmVUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgKGJ5IHZDYXJkKSBQaG9uZSB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5jb2RlZFZhbHVlIE11c3QgYmUgZW5jb2RlZCBieSBCQVNFNjQgCi0gICAgICogQHBhcmFtIHBob3RvVHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFBob3RvTGluZShmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlLCBmaW5hbCBTdHJpbmcgcGhvdG9UeXBlKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1BIT1RPKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YzMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjIxKTsKLSAgICAgICAgfQotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHRtcEJ1aWxkZXIsIHBob3RvVHlwZSk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgdG1wU3RyID0gdG1wQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB0bXBTdHIubGVuZ3RoKCk7Ci0gICAgICAgIGZpbmFsIGludCBtYXhOdW1Gb3JGaXJzdExpbmUgPSBWQ2FyZENvbnN0YW50cy5NQVhfQ0hBUkFDVEVSX05VTVNfQkFTRTY0X1YzMAotICAgICAgICAgICAgICAgIC0gVkNBUkRfRU5EX09GX0xJTkUubGVuZ3RoKCk7Ci0gICAgICAgIGZpbmFsIGludCBtYXhOdW1JbkdlbmVyYWwgPSBtYXhOdW1Gb3JGaXJzdExpbmUgLSBWQ0FSRF9XUy5sZW5ndGgoKTsKLSAgICAgICAgaW50IG1heE51bSA9IG1heE51bUZvckZpcnN0TGluZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQodG1wU3RyLmNoYXJBdChpKSk7Ci0gICAgICAgICAgICBsaW5lQ291bnQrKzsKLSAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPiBtYXhOdW0pIHsKLSAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfV1MpOwotICAgICAgICAgICAgICAgIG1heE51bSA9IG1heE51bUluR2VuZXJhbDsKLSAgICAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZCh0bXBCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGlmICghc0FsbG93ZWRBbmRyb2lkUHJvcGVydHlTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU47IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZygiZGF0YSIgKyBpKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJhd1ZhbHVlTGlzdC5hZGQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBuZWVkQ2hhcnNldCA9Ci0gICAgICAgICAgICAobVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00pOwotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQobWltZVR5cGUpOyAgLy8gU2hvdWxkIG5vdCBiZSBlbmNvZGVkLgotICAgICAgICBmb3IgKFN0cmluZyByYXdWYWx1ZSA6IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIDMuMAotICAgICAgICAgICAgICAgIC8vICAgICAgICAod2hpY2ggc2F5cyAiV2hlbiBnZW5lcmF0aW5nIGEgY29udGVudCBsaW5lLCBsaW5lcyBsb25nZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgICAgICA3NSBjaGFyYWN0ZXJzIFNIT1VMRCBiZSBmb2xkZWQiKSwgdGhvdWdoIHNldmVyYWwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoaXMuCi0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlTGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpOwotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZSkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgICAgICByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCByYXdWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBvbmUgbGluZSB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCByYXdWYWx1ZUxpc3QsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlLCBuZWVkQ2hhcnNldCwgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCByYXdWYWx1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0ICE9IG51bGwgJiYgcGFyYW1ldGVyTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkQ2hhcnNldCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCBzcGVjLCB0aG91Z2gKLSAgICAgICAgICAgIC8vICAgICAgIHNldmVyYWwgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoaXMuCi0gICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsIGJvb2xlYW4gbmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWVMaXN0LCBuZWVkQ2hhcnNldCwgbmVlZFF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QsIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0ICE9IG51bGwgJiYgcGFyYW1ldGVyTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkQ2hhcnNldCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyByYXdWYWx1ZSA6IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgICAgIGlmIChuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgbXVzdCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVycyhmaW5hbCBMaXN0PFN0cmluZz4gdHlwZXMpIHsKLSAgICAgICAgLy8gV2UgbWF5IGhhdmUgdG8gbWFrZSB0aGlzIGNvbW1hIHNlcGFyYXRlZCBmb3JtIGxpa2UgIlRZUEU9RE9NLFdPUksiIGluIHRoZSBmdXR1cmUsCi0gICAgICAgIC8vIHdoaWNoIHdvdWxkIGJlIHJlY29tbWVuZGVkIHdheSBpbiB2Y2FyZCAzLjAgdGhvdWdoIG5vdCB2YWxpZCBpbiB2Q2FyZCAyLjEuCi0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB0eXBlVmFsdWUgOiB0eXBlcykgewotICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMy4wIHNwZWNpZmllcyB0aGUgZGlmZmVyZW50IHR5cGUgb2YgYWNjZXB0YWJsZSB0eXBlIFN0cmluZ3MsIGJ1dAotICAgICAgICAgICAgLy8gICAgICAgd2UgZG9uJ3QgZW1pdCB0aGF0IGtpbmQgb2YgdkNhcmQgMy4wIHNwZWNpZmljIHR5cGUgc2luY2UgdGhlcmUgc2hvdWxkIGJlCi0gICAgICAgICAgICAvLyAgICAgICBoaWdoIHByb2JhYmlseXR5IGluIHdoaWNoIGV4dGVybmFsIGltcG9ydGVycyBjYW5ub3QgdW5kZXJzdGFuZCB0aGVtLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIGUuZy4gVFlQRT0iXHU1NzhCXHUzMDZCXHUzMDg3IiAodkNhcmQgMy4wIGFsbG93cyBub24tQXNjaWkgY2hhcmFjdGVycyBpZiB0aGV5Ci0gICAgICAgICAgICAvLyAgICAgIGFyZSBxdW90ZWQuKQotICAgICAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmlzVjIxV29yZCh0eXBlVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIodHlwZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiBtdXN0IGJlIGFwcGVuZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihtQnVpbGRlciwgdHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBTdHJpbmcgdHlwZSkgewotICAgICAgICAvLyBSZWZyYWluIGZyb20gdXNpbmcgYXBwZW5kVHlwZSgpIHNvIHRoYXQgIlRZUEU9IiBpcyBub3QgYmUgYXBwZW5kZWQgd2hlbiB0aGUKLSAgICAgICAgLy8gZGV2aWNlIGlzIERvQ29NbydzIChqdXN0IGZvciBzYWZldHkpLgotICAgICAgICAvLwotICAgICAgICAvLyBOb3RlOiBJbiB2Q2FyZCAzLjAsIFR5cGUgc3RyaW5ncyBhbHNvIGNhbiBiZSBsaWtlIHRoaXM6ICJUWVBFPUhPTUUsUFJFRiIKLSAgICAgICAgaWYgKChtSXNWMzAgfHwgbUFwcGVuZFR5cGVQYXJhbU5hbWUpICYmICFtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpLmFwcGVuZChWQ0FSRF9QQVJBTV9FUVVBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BlcnR5IGxpbmUgc2hvdWxkIGNvbnRhaW4gY2hhcnNldCBwYXJhbWV0ZXIKLSAgICAgKiBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgbWF5IHJldHVybiB0cnVlIGV2ZW4gd2hlbiB2Q2FyZCB2ZXJzaW9uIGlzIDMuMC4KLSAgICAgKgotICAgICAqIFN0cmljdGx5LCBhZGRpbmcgY2hhcnNldCBpbmZvcm1hdGlvbiBpcyBpbnZhbGlkIGluIFZDYXJkIDMuMC4KLSAgICAgKiBIb3dldmVyIHdlJ2xsIGFkZCB0aGUgaW5mbyBvbmx5IHdoZW4gY2hhcnNldCB3ZSB1c2UgaXMgbm90IFVURi04Ci0gICAgICogaW4gdkNhcmQgMy4wIGZvcm1hdCwgc2luY2UgcGFyc2VyIHNpZGUgbWF5IGJlIGFibGUgdG8gdXNlIHRoZSBjaGFyc2V0Ci0gICAgICogdmlhIHRoaXMgZmllbGQsIHRob3VnaCB3ZSBtYXkgZW5jb3VudGVyIGFub3RoZXIgcHJvYmxlbSBieSBhZGRpbmcgaXQuCi0gICAgICoKLSAgICAgKiBlLmcuIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgdXNlIFNoaWZ0X0ppcyB3aGlsZSBSRkMgMjQyNgotICAgICAqIHJlY29tbWVuZHMgVVRGLTguIEJ5IGFkZGluZyB0aGlzIGZpZWxkLCBwYXJzZXJzIG1heSBiZSBhYmxlCi0gICAgICogdG8ga25vdyB0aGlzIHRleHQgaXMgTk9UIFVURi04IGJ1dCBTaGlmdF9KaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShTdHJpbmcuLi5wcm9wZXJ0eVZhbHVlTGlzdCkgewotICAgICAgICBpZiAoIW1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eVZhbHVlIDogcHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShwcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVRdW90ZWRQcmludGFibGUoZmluYWwgU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc3RyKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0gICAgICAgIGJ5dGVbXSBzdHJBcnJheSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0ckFycmF5ID0gc3RyLmdldEJ5dGVzKG1DaGFyc2V0U3RyaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQ2hhcnNldCAiICsgbUNoYXJzZXRTdHJpbmcgKyAiIGNhbm5vdCBiZSB1c2VkLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIlRyeSBkZWZhdWx0IGNoYXJzZXQiKTsKLSAgICAgICAgICAgIHN0ckFycmF5ID0gc3RyLmdldEJ5dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgc3RyQXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KCI9JTAyWCIsIHN0ckFycmF5W2luZGV4XSkpOwotICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgIGxpbmVDb3VudCArPSAzOwotCi0gICAgICAgICAgICBpZiAobGluZUNvdW50ID49IDY3KSB7Ci0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhdGlvbiByZXF1aXJlcyBDUkxGIG11c3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiB0aGUgbGluZQotICAgICAgICAgICAgICAgIC8vIGJlY29tZXMgbW9yZSB0aGFuIDc2LgotICAgICAgICAgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIsCi0gICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZWNvbWUKLSAgICAgICAgICAgICAgICAvLyA2IGJ5dGVzLgotICAgICAgICAgICAgICAgIC8vIDc2IC0gNiAtIDMgPSA2NwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI9XHJcbiIpOwotICAgICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZCAnXCcgdG8gdGhlIGNoYXJhY3RlcnMgd2hpY2ggc2hvdWxkIGJlIGVzY2FwZWQuIFRoZSBjaGFyYWN0ZXIgc2V0IGlzIGRpZmZlcmVudAotICAgICAqIG5vdCBvbmx5IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgYnV0IGFsc28gYW1vbmcgZWFjaCBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgUXVvdGVkLVByaW50YWJsZSBzdHJpbmcgbXVzdCBub3QgYmUgaW5wdXQgaGVyZS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZUNoYXJhY3RlcnMoZmluYWwgU3RyaW5nIHVuZXNjYXBlZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodW5lc2NhcGVkKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHVuZXNjYXBlZC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnOyc6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdccic6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaGFyID0gdW5lc2NhcGVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluIHZDYXJkIDIuMSwgdGhlcmUncyBubyBzcGVjaWZpY2F0aW9uIGFib3V0IHRoaXMsIHdoaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBleHBsaWNpdGx5IHJlcXVpcmVzIHRoaXMgc2hvdWxkIGJlIGVuY29kZWQgdG8gIlxuIi4KLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGNhc2UgJz4nOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICcsJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFwsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoIW1FbmRBcHBlbmRlZCkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9DTEFTUywgVkNBUkRfREFUQV9QVUJMSUMpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9SRURVQ1RJT04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTk8sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfRENNX0hNTl9NT0RFLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VORCwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgICAgICBtRW5kQXBwZW5kZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZThiNjY1Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eS5OYW1lZENvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNFbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBmb3IgY29tcG9zaW5nIFZDYXJkIGZyb20gQ29udGFjdHMgaW5mb3JtYXRpb24uIE5vdGUgdGhhdCB0aGlzIGlzCi0gKiBjb21wbGV0ZWx5IGRpZmZlcm50IGltcGxlbWVudGF0aW9uIGZyb20KLSAqIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyLCB3aGljaCBpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlLgotICogPC9wPgotICoKLSAqIDxwPgotICogVXN1YWxseSwgdGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBsaWtlIHRoaXMuCi0gKiA8L3A+Ci0gKgotICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPlZDYXJkQ29tcG9zZXIgY29tcG9zZXIgPSBudWxsOwotICogdHJ5IHsKLSAqICAgICBjb21wb3NlciA9IG5ldyBWQ2FyZENvbXBvc2VyKGNvbnRleHQpOwotICogICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIoCi0gKiAgICAgICAgICAgICBjb21wb3Nlci5uZXcgSGFuZGxlckZvck91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLSAqICAgICBpZiAoIWNvbXBvc2VyLmluaXQoKSkgewotICogICAgICAgICAvLyBEbyBzb21ldGhpbmcgaGFuZGxpbmcgdGhlIHNpdHVhdGlvbi4KLSAqICAgICAgICAgcmV0dXJuOwotICogICAgIH0KLSAqICAgICB3aGlsZSAoIWNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpIHsKLSAqICAgICAgICAgaWYgKG1DYW5jZWxlZCkgewotICogICAgICAgICAgICAgLy8gQXNzdW1lIGEgdXNlciBtYXkgY2FuY2VsIHRoaXMgb3BlcmF0aW9uIGR1cmluZyB0aGUgZXhwb3J0LgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgICAgIGlmICghY29tcG9zZXIuY3JlYXRlT25lRW50cnkoKSkgewotICogICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBlcnJvciBzaXR1YXRpb24uCi0gKiAgICAgICAgICAgICByZXR1cm47Ci0gKiAgICAgICAgIH0KLSAqICAgICB9Ci0gKiB9IGZpbmFsbHkgewotICogICAgIGlmIChjb21wb3NlciAhPSBudWxsKSB7Ci0gKiAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICogICAgIH0KLSAqIH0gPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbXBvc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbXBvc2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEhPTkVfVFlQRSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPU1RBTF9UWVBFID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FTUFJTF9UWVBFID0gRW1haWwuVFlQRV9PVEhFUjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTyA9Ci0gICAgICAgICJGYWlsZWQgdG8gZ2V0IGRhdGFiYXNlIGluZm9ybWF0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PX0VOVFJZID0KLSAgICAgICAgIlRoZXJlJ3Mgbm8gZXhwb3J0YWJsZSBpbiB0aGUgZGF0YWJhc2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEID0KLSAgICAgICAgIlRoZSB2Q2FyZCBjb21wb3NlciBvYmplY3QgaXMgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCI7Ci0KLSAgICAvKiogU2hvdWxkIGJlIHZpc2libGUgb25seSBmcm9tIGRldmVsb3BlcnMuLi4gKG5vIG5lZWQgdG8gdHJhbnNsYXRlLCBob3BlZnVsbHkpICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJID0KLSAgICAgICAgIlRoZSBVcmkgdkNhcmQgY29tcG9zZXIgcmVjZWl2ZWQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9zZXIuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0VSUk9SID0gIk5vIGVycm9yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfU1RSSU5HX0RPQ09NTyA9ICJkb2NvbW8iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISUZUX0pJUyA9ICJTSElGVF9KSVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWFsIFVSSSBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9URVNUX0FVVEhPUklUWSA9ICJjb20uYW5kcm9pZC51bml0X3Rlc3RzLnZjYXJkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBWQ0FSRF9URVNUX0FVVEhPUklUWV9VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgVkNBUkRfVEVTVF9BVVRIT1JJVFkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkgPQotICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChWQ0FSRF9URVNUX0FVVEhPUklUWV9VUkksICJjb250YWN0cyIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0ltTWFwOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX0FJTSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX01TTiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX1lBSE9PLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9TS1lQRSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSk7Ci0gICAgICAgIC8vIEdvb2dsZSB0YWxrIGlzIGEgc3BlY2lhbCBjYXNlLgotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpOwotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIHVzZWZ1bCBleGFtcGxlIGhhbmRsZXIsIHdoaWNoIGVtaXRzIFZDYXJkIFN0cmluZyB0byBvdXRwdXRzdHJlYW0gb25lIGJ5IG9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGlucHV0IE91dHB1dFN0cmVhbSBvYmplY3QgaXMgY2xvc2VkKCkgb24ge0BsaW5rICNvblRlcm1pbmF0ZSgpfS4KLSAgICAgKiBNdXN0IG5vdCBjbG9zZSB0aGUgc3RyZWFtIG91dHNpZGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgT25lRW50cnlIYW5kbGVyIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gInZjYXJkLlZDYXJkQ29tcG9zZXIuSGFuZGxlckZvck91dHB1dFN0cmVhbSI7Ci0KLSAgICAgICAgZmluYWwgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbU91dHB1dFN0cmVhbTsgLy8gbVdyaXRlciB3aWxsIGNsb3NlIHRoaXMuCi0gICAgICAgIHByaXZhdGUgV3JpdGVyIG1Xcml0ZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PblRlcm1pbmF0ZUlzQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBvbiB0aGUgZGV0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0sIG1DaGFyc2V0U3RyaW5nKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuc3VwcG9ydGVkIGNoYXJzZXQ6ICIgKyBtQ2hhcnNldFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIkVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgKHVzdWFsbHkgdGhpcyBkb2VzIG5vdCBoYXBwZW4hKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ2hhcnNldFN0cmluZzsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb25lIGVtcHR5IGVudHJ5LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLndyaXRlKGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwoIi0xIiwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZDYXJkRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBkdXJpbmcgb24gSW5pdCgpOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleHBvcnRPbmVDb250YWN0RGF0YTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZSh2Y2FyZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIklPRXhjZXB0aW9uIG9jY3VycmVkOiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICAgICAgICAgIG1PblRlcm1pbmF0ZUlzQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtV3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBhbmQgc3luYyB0aGUgZGF0YSBzbyB0aGF0IGEgdXNlciBpcyBhYmxlIHRvIHB1bGwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNEQ2FyZCBqdXN0IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHBvcnQuCi0gICAgICAgICAgICAgICAgICAgIG1Xcml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW0gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1PdXRwdXRTdHJlYW0gaW5zdGFuY2VvZiBGaWxlT3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGaWxlT3V0cHV0U3RyZWFtKSBtT3V0cHV0U3RyZWFtKS5nZXRGRCgpLnN5bmMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gZHVyaW5nIGNsb3NpbmcgdGhlIG91dHB1dCBzdHJlYW06ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgICAgIGlmICghbU9uVGVybWluYXRlSXNDYWxsZWQpIHsKLSAgICAgICAgICAgICAgICBvblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1DYXJlSGFuZGxlckVycm9yczsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNTaGlmdEppczsKLSAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwotICAgIHByaXZhdGUgaW50IG1JZENvbHVtbjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DaGFyc2V0U3RyaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVybWluYXRlSXNDYWxsZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gbUhhbmRsZXJMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUVycm9yUmVhc29uID0gTk9fRVJST1I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ29udGFjdHNQcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQ29udGFjdHMuX0lELAotICAgIH07Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RFRkFVTFQsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdmNhcmRUeXBlU3RyLCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuZ2V0VkNhcmRUeXBlRnJvbVN0cmluZyh2Y2FyZFR5cGVTdHIpLCBjYXJlSGFuZGxlckVycm9ycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGZvciBzdXBwb3J0aW5nIGNhbGwgbG9nIGVudHJ5IHZDYXJkIGNvbXBvc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUNhcmVIYW5kbGVyRXJyb3JzID0gY2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzU2hpZnRKaXMgPSBWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKTsKLSAgICAgICAgbUhhbmRsZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KCk7Ci0KLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJEb0NvTW8tc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuIFVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gY2hhcnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc1NoaWZ0SmlzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUykubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVmVuZG9yLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IFVURl84OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHtAbGluayAjaW5pdCgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5hZGQoaGFuZGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIGluaXRpYWxpemF0aW9uIGlzIHN1Y2Nlc3NmdWwgYW5kIGFsbCB0aGUgb3RoZXIKLSAgICAgKiAgICAgICAgICBtZXRob2RzIGFyZSBhdmFpbGFibGUuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoKSB7Ci0gICAgICAgIHJldHVybiBpbml0KG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICByZXR1cm4gaW5pdChDb250YWN0cy5DT05URU5UX1VSSSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB1bnN0YWJsZSBpbnRlcmZhY2UsIG1heSBiZSBkZWxldGVkIGluIHRoZSBmdXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdChmaW5hbCBVcmkgY29udGVudFVyaSwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICAgICAgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IGZpbmlzaGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXJMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLm9uSW5pdChtQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgZmluaXNoZWQgOiBmaW5pc2hlZExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkLm9uVGVybWluYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBmYWxzZSByZXR1cm5lZCBmcm9tIG9uSW5pdCgpLgotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGhhbmRsZXIub25Jbml0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHByb2plY3Rpb247Ci0gICAgICAgIGlmIChDb250YWN0cy5DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkgfHwKLSAgICAgICAgICAgICAgICBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLmVxdWFscyhjb250ZW50VXJpKSkgewotICAgICAgICAgICAgcHJvamVjdGlvbiA9IHNDb250YWN0c1Byb2plY3Rpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9VTlNVUFBPUlRFRF9VUkk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnNvciA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCi0gICAgICAgICAgICAgICAgY29udGVudFVyaSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwotCi0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTzsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRDb3VudCgpID09IDAgfHwgIW1DdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PX0VOVFJZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUlkQ29sdW1uID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleChDb250YWN0cy5fSUQpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZU9uZUVudHJ5KCkgewotICAgICAgICByZXR1cm4gY3JlYXRlT25lRW50cnkobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kIEZvciBEZXBlbmRlbmN5IEluamVjdGlvbi4KLSAgICAgKiBAaGlkZSBqdXN0IGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZU9uZUVudHJ5KE1ldGhvZCBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkgewotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsIHx8IG1DdXJzb3IuaXNBZnRlckxhc3QoKSkgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB2Y2FyZDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtSWRDb2x1bW4gPj0gMCkgewotICAgICAgICAgICAgICAgIHZjYXJkID0gY3JlYXRlT25lRW50cnlJbnRlcm5hbChtQ3Vyc29yLmdldFN0cmluZyhtSWRDb2x1bW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW5jb3JyZWN0IG1JZENvbHVtbjogIiArIG1JZENvbHVtbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgIC8vIE1heWJlIHNvbWUgZGF0YSAoZS5nLiBwaG90bykgaXMgdG9vIGJpZyB0byBoYXZlIGluIG1lbW9yeS4gQnV0IGl0Ci0gICAgICAgICAgICAvLyBzaG91bGQgYmUgcmFyZS4KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJPdXRPZk1lbW9yeUVycm9yIG9jY3VyZWQuIElnbm9yZSB0aGUgZW50cnkuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB0ZWxsIHVzZXJzIHdoYXQgaGFwcGVuZWQ/Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1DdXJzb3IubW92ZVRvTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjYXJlIHRoZSBPdXRPZk1lbW9yeUVycm9yIG9uIHRoZSBoYW5kbGVyIHNpZGUKLSAgICAgICAgLy8gOi1QCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uRW50cnlDcmVhdGVkKHZjYXJkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwoZmluYWwgU3RyaW5nIGNvbnRhY3RJZCwKLSAgICAgICAgICAgIE1ldGhvZCBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4gY29udGVudFZhbHVlc0xpc3RNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4oKTsKLSAgICAgICAgLy8gVGhlIHJlc29sdmVyIG1heSByZXR1cm4gdGhlIGVudGl0eSBpdGVyYXRvciB3aXRoIG5vIGRhdGEuIEl0IGlzIHBvc3NpYmxlLgotICAgICAgICAvLyBlLmcuIElmIGFsbCB0aGUgZGF0YSBpbiB0aGUgY29udGFjdCBvZiB0aGUgZ2l2ZW4gY29udGFjdCBpZCBhcmUgbm90IGV4cG9ydGFibGUgb25lcywKLSAgICAgICAgLy8gICAgICB0aGV5IGFyZSBoaWRkZW4gZnJvbSB0aGUgdmlldyBvZiB0aGlzIG1ldGhvZCwgdGhvdWdoIGNvbnRhY3QgaWQgaXRzZWxmIGV4aXN0cy4KLSAgICAgICAgRW50aXR5SXRlcmF0b3IgZW50aXR5SXRlcmF0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFJhd0NvbnRhY3RzRW50aXR5LkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcihEYXRhLkZPUl9FWFBPUlRfT05MWSwgIjEiKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24gPSBEYXRhLkNPTlRBQ1RfSUQgKyAiPT8iOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7Y29udGFjdElkfTsKLSAgICAgICAgICAgIGlmIChnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGJyYW5jaCBpcyBleGVjdXRlZCBieSBzb21lIHRlc3RzIG9ubHkKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvciA9IChFbnRpdHlJdGVyYXRvcilnZXRFbnRpdHlJdGVyYXRvck1ldGhvZC5pbnZva2UobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLCB1cmksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZUVsZW1lbnRzID0gZS5nZXRDYXVzZSgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50IDogc3RhY2tUcmFjZUVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiICAgIGF0ICIgKyBlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSBSYXdDb250YWN0cy5uZXdFbnRpdHlJdGVyYXRvcihtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBudWxsLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVudGl0eUl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRW50aXR5SXRlcmF0b3IgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFlbnRpdHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRGF0YSBkb2VzIG5vdCBleGlzdC4gY29udGFjdElkOiAiICsgY29udGFjdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChlbnRpdHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gZW50aXR5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoTmFtZWRDb250ZW50VmFsdWVzIG5hbWVkQ29udGVudFZhbHVlcyA6IGVudGl0eS5nZXRTdWJWYWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuYW1lZENvbnRlbnRWYWx1ZXMudmFsdWVzOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLnB1dChrZXksIGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0LmFkZChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFZDYXJkQnVpbGRlciBidWlsZGVyID0gbmV3IFZDYXJkQnVpbGRlcihtVkNhcmRUeXBlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmROYW1lUHJvcGVydGllcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmROaWNrTmFtZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUGhvbmVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZEVtYWlscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRQb3N0YWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kT3JnYW5pemF0aW9ucyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kV2Vic2l0ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLSAgICAgICAgaWYgKChtVkNhcmRUeXBlICYgVkNhcmRDb25maWcuRkxBR19SRUZSQUlOX0lNQUdFX0VYUE9SVCkgPT0gMCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRQaG90b3MoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmROb3Rlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRJbXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEltLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUmVsYXRpb24oY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgewotICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICBoYW5kbGVyLm9uVGVybWluYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNRTGl0ZUV4Y2VwdGlvbiBvbiBDdXJzb3IjY2xvc2UoKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlcm1pbmF0ZUlzQ2FsbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKCFtVGVybWluYXRlSXNDYWxsZWQpIHsKLSAgICAgICAgICAgIHRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm4gdGhlIGVycm9yIHJlYXNvbiBpZiBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yUmVhc29uKCkgewotICAgICAgICByZXR1cm4gbUVycm9yUmVhc29uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTk4NDAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgVkNhcmQgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gVXNlZnVsIHN0YXRpYyBtZXRob2RzIGFyZSBub3QgaW4gdGhpcyBjbGFzcwotICogYnV0IGluIFZDYXJkVXRpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbmZpZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb25maWciOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9OT05FID0gMDsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UID0gMHgxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HID0gMHgyOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfVkVSQk9TRSA9Ci0gICAgICAgIExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCB8IExPR19MRVZFTF9TSE9XX1dBUk5JTkc7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMID0gTE9HX0xFVkVMX05PTkU7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9VTktOT1dOID0gMDsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9BUFBMRSA9IDE7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQID0gMjsgIC8vIEZvciBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzLgotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX0ZPTUEgPSAzOyAgLy8gRm9yIEphcGFuZXNlIEZPTUEgbW9iaWxlIHBob25lcy4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUCA9IDQ7Ci0KLSAgICAvLyBBc3N1bWVzIHRoYXQgImlzby04ODU5LTEiIGlzIGFibGUgdG8gbWFwICJhbGwiIDhiaXQgY2hhcmFjdGVycyB0byBzb21lIHVuaWNvZGUgYW5kCi0gICAgLy8gZGVjb2RlIHRoZSB1bmljb2RlIHRvIHRoZSBvcmlnaW5hbCBjaGFyc2V0LiBJZiBub3QsIHRoaXMgc2V0dGluZyB3aWxsIGNhdXNlIHNvbWUgYnVnLiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NIQVJTRVQgPSAiaXNvLTg4NTktMSI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19WMjEgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVjMwID0gMTsKLQotICAgIC8vIDB4MiBpcyByZXNlcnZlZCBmb3IgdGhlIGZ1dHVyZSB1c2UgLi4uCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0RFRkFVTFQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfRVVST1BFID0gMHg0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfSkFQQU5FU0UgPSAweDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfTUFTSyA9IDB4QzsKLQotICAgIC8vIDB4MTAgaXMgcmVzZXJ2ZWQgZm9yIHNhZmV0eQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NIQVJTRVRfVVRGOCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgPSAweDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DSEFSU0VUX01BU0sgPSAweEYwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIHdpbGwgYWRkIHNvbWUgIlgtIiBwcm9wZXJ0aWVzIHVzZWQgb25seSBpbiBBbmRyb2lkCi0gICAgICogd2hlbiB0aGUgZm9ybWFsIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZHMgZm9yIHRoYXQgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBGb3IgZXhhbXBsZSwgQW5kcm9pZCBhY2NlcHRzIG5pY2tuYW1lIGluZm9ybWF0aW9uIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBvbiwgdkNhcmQgY29tcG9zZXIgZW1pdHMgYWx0ZXJuYXRpdmUgIlgtIiBwcm9wZXJ0eSAobGlrZSAiWC1OSUNLTkFNRSIpCi0gICAgICogaW5zdGVhZCBvZiBqdXN0IGRyb3BwaW5nIGl0LgotICAgICAqIAotICAgICAqIHZDYXJkIHBhcnNlciBjb2RlIGF1dG9tYXRpY2FsbHkgcGFyc2VzIHRoZSBmaWVsZCBlbWl0dGVkIGV2ZW4gd2hlbiB0aGlzIGZsYWcgaXMgb2ZmLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIGZsYWcgZG9lcyBub3QgYXNzdXJlIGFsbCB0aGUgaW5mb3JtYXRpb24gbXVzdCBiZSBob2xkIGluIHRoZSBlbWl0dGVkIHZDYXJkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZID0gMHg4MDAwMDAwMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyBzZWVuIGluIHRoZQotICAgICAqIHZDYXJkIGRhdGEgZW1pdHRlZCBieSB0aGUgb3RoZXIgc29mdHdhcmVzL2RldmljZXMgd2hlbiB0aGUgZm9ybWFsIHZDYXJkIHNwZWNpZmljYXRpb24KLSAgICAgKiBkb2VzIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGZpZWxkKHMpIGZvciB0aGF0IGRhdGEuIAotICAgICAqIAotICAgICAqIE9uZSBleGFtcGxlIGlzIFgtUEhPTkVUSUMtRklSU1QtTkFNRS9YLVBIT05FVElDLU1JRERMRS1OQU1FL1gtUEhPTkVUSUMtTEFTVC1OQU1FLCB3aGljaCBhcmUKLSAgICAgKiBmb3IgcGhvbmV0aWMgbmFtZSAoaG93IHRoZSBuYW1lIGlzIHByb25vdW5jZWQpLCBzZWVuIGluIHRoZSB2Q2FyZCBlbWl0dGVkIGJ5IHNvbWUgb3RoZXIKLSAgICAgKiBub24tQW5kcm9pZCBkZXZpY2VzL3NvZnR3YXJlcy4gV2UgY2hvc2UgdG8gZW5hYmxlIHRoZSB2Q2FyZCBjb21wb3NlciB0byB1c2UgdGhvc2UKLSAgICAgKiBkZWZhY3QgcHJvcGVydGllcyBzaW5jZSB0aGV5IGFyZSBhbHNvIHVzZWZ1bCBmb3IgQW5kcm9pZCBkZXZpY2VzLgotICAgICAqIAotICAgICAqIE5vdGUgZm9yIGRldmVsb3BlcnM6IG9ubHkgIlgtIiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBhZGRlZCB3aXRoIHRoaXMgZmxhZy4gdkNhcmQgMi4xLzMuMAotICAgICAqIGFsbG93cyBhbnkga2luZCBvZiAiWC0iIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFsbG93IG5vbi0iWC0iIHByb3BlcnRpZXMgKGV4Y2VwdCBJQU5BIHRva2VucwotICAgICAqIGluIHZDYXJkIDMuMCkuIFNvbWUgZXh0ZXJuYWwgcGFyc2VycyBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggbm9uLXZhbGlkLCBub24tIlgtIiBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgPSAweDQwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyBzb21lIHNwZWNpZmljIGRpYWxlY3Qgc2VlbiBpbiB2Y2FyZCBvZiBEb0NvTW8gKG9uZSBvZiBKYXBhbmVzZQotICAgICAqIG1vYmlsZSBjYXJlZXJzKSBzaG91bGQgYmUgdXNlZC4gVGhpcyBmbGFnIGRvZXMgbm90IGluY2x1ZGUgYW55IG90aGVyIGluZm9ybWF0aW9uIGxpa2UKLSAgICAgKiB0aGF0ICJ0aGUgdkNhcmQgaXMgZm9yIEphcGFuZXNlIi4gU28gaXQgaXMgInBvc3NpYmxlIiB0aGF0ICJ0aGUgdkNhcmQgc2hvdWxkIGhhdmUgRG9Db01vJ3MKLSAgICAgKiBkaWFsZWN0IGJ1dCB0aGUgbmFtZSBvcmRlciBzaG91bGQgYmUgRXVyb3BlYW4iLCBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPQ09NTyA9IDB4MjAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciBkb2VzICJOT1QiIHVzZSBRdW90ZWQtUHJpbnRhYmxlIHRvd2FyZCAicHJpbWFyeSIKLSAgICAgKiBwcm9wZXJ0aWVzIGV2ZW4gdGhvdWdoIGl0IGlzIHJlcXVpcmVkIGJ5IHZDYXJkIDIuMSAoUVAgaXMgcHJvaGliaXRlZCBpbiB2Q2FyZCAzLjApLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBXZSBhY3R1YWxseSBjYW5ub3QgZGVmaW5lIHdoYXQgaXMgdGhlICJwcmltYXJ5IiBwcm9wZXJ0eS4gTm90ZSB0aGF0IHRoaXMgaXMgTk9UIGRlZmluZWQKLSAgICAgKiBpbiB2Q2FyZCBzcGVjaWZpY2F0aW9uIGVpdGhlci4gQWxzbyBiZSBhd2FyZSB0aGF0IGl0IGlzIE5PVCByZWxhdGVkIHRvICJwcmltYXJ5IiBub3Rpb24KLSAgICAgKiB1c2VkIGluIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3R9LgotICAgICAqIFRoaXMgbm90aW9uIGlzIGp1c3QgZm9yIHZDYXJkIGNvbXBvc2l0aW9uIGluIEFuZHJvaWQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFdlIGFkZGVkIHRoaXMgQW5kcm9pZC1zcGVjaWZpYyBub3Rpb24gc2luY2Ugc29tZSAoaW5jb21wbGV0ZSkgdkNhcmQgZXhwb3J0ZXJzIGZvciB2Q2FyZCAyLjEKLSAgICAgKiBkbyBOT1QgdXNlIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmcgdG93YXJkIHNvbWUgcHJvcGVydGllcyByZWxhdGVkIG5hbWVzIGxpa2UgIk4iLCAiRk4iLCBldGMuCi0gICAgICogZXZlbiB3aGVuIHRoZWlyIHZhbHVlcyBjb250YWluIG5vbi1hc2NpaSBvci9hbmQgQ1IvTEYsIHdoaWxlIHRoZXkgdXNlIHRoZSBlbmNvZGluZyBpbiB0aGUKLSAgICAgKiBvdGhlciBwcm9wZXJ0aWVzIGxpa2UgIkFEUiIsICJPUkciLCBldGMuCi0gICAgICogPFA+Ci0gICAgICogV2UgYXJlIGFmcmFpZCBvZiB0aGUgY2FzZSB3aGVyZSBzb21lIHZDYXJkIGltcG9ydGVyIGFsc28gZm9yZ2V0IGhhbmRsaW5nIFFQIHByZXN1bWluZyBRUCBpcwotICAgICAqIG5vdCB1c2VkIGluIHN1Y2ggZmllbGRzLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZnVsIHdoZW4gc29tZSB0YXJnZXQgaW1wb3J0ZXIgeW91IGFyZSBnb2luZyB0byBmb2N1cyBvbiBkb2VzIG5vdCBhY2NlcHQKLSAgICAgKiBzdWNoIHByb3BlcnRpZXMgd2l0aCBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBBZ2Fpbiwgd2Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmbGFnIGF0IGFsbCBmb3IgY29tcGx5aW5nIHZDYXJkIDIuMSBzcGVjLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJbiB2Q2FyZCAzLjAsIFF1b3RlZC1QcmludGFibGUgaXMgZXhwbGljaXRseSAicHJvaGliaXR0ZWQiLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUgdGhpcwotICAgICAqIGtpbmQgb2YgcHJvYmxlbSAoaG9wZWZ1bGx5KS4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUyA9IDB4MTAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcGhvbmV0aWMgbmFtZSByZWxhdGVkIGZpZWxkcyBtdXN0IGJlIGNvbnZlcnRlZCB0bwotICAgICAqIGFwcHJvcHJpYXRlIGZvcm0uIE5vdGUgdGhhdCAiYXBwcm9wcmlhdGUiIGlzIG5vdCBkZWZpbmVkIGluIGFueSB2Q2FyZCBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRoaXMgaXMgQW5kcm9pZC1zcGVjaWZpYy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogT25lIHR5cGljYWwgKGFuZCBjdXJyZW50bHkgc29sZSkgZXhhbXBsZSB3aGVyZSB3ZSBuZWVkIHRoaXMgZmxhZyBpcyB0aGUgdGltZSB3aGVuCi0gICAgICogd2UgbmVlZCB0byBlbWl0IEphcGFuZXNlIHBob25ldGljIG5hbWVzIGludG8gdkNhcmQgZW50cmllcy4gVGhlIHByb3BlcnR5IHZhbHVlcwotICAgICAqIHNob3VsZCBiZSBlbmNvZGVkIGludG8gaGFsZi13aWR0aCBrYXRha2FuYSB3aGVuIHRoZSB0YXJnZXQgaW1wb3J0ZXIgaXMgSmFwYW5lc2UgbW9iaWxlCi0gICAgICogcGhvbmVzJywgd2hpY2ggYXJlIHByb2JhYmx5IG5vdCBhYmxlIHRvIHBhcnNlIGZ1bGwtd2lkdGggaGlyYWdhbmEva2F0YWthbmEgZm9yCi0gICAgICogaGlzdG9yaWNhbCByZWFzb25zLCB3aGlsZSB0aGUgdkNhcmQgaW1wb3J0ZXJzIGVtYmVkZGVkIHRvIHNvZnR3YXJlcyBmb3IgUEMgc2hvdWxkIGJlCi0gICAgICogYWJsZSB0byBwYXJzZSB0aGVtIGFzIHdlIGV4cGVjdC4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT05WRVJUX1BIT05FVElDX05BTUVfU1RSSU5HUyA9IDB4MDgwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyICJmb3IgMi4xIiBlbWl0cyAiVFlQRT0iIHN0cmluZyB0b3dhcmQgVFlQRSBwYXJhbXMKLSAgICAgKiBldmVyeSB0aW1lIHBvc3NpYmxlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBkb2VzIG5vdCBlbWl0IGl0IGFuZCBpcyB2YWxpZCBpbiB0aGUgc3BlYy4KLSAgICAgKiBJbiB2Q3JhZCAzLjAsIHRoaXMgZmxhZyBpcyB1bm5lY2Vzc2FyeSwgc2luY2UgIlRZUEU9IiBpcyBNVVNUIGluIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBEZXRhaWw6Ci0gICAgICogSG93IG1vcmUgdGhhbiBvbmUgVFlQRSBmaWVsZHMgYXJlIGV4cHJlc3NlZCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMC4KLSAgICAgKiA8L3A+Ci0gICAgICogPFA+Ci0gICAgICogZS5nLjxCUiAvPgotICAgICAqIDEpIFByb2JhYmx5IHZhbGlkIGluIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjA6ICJBRFI7VFlQRT1ET007VFlQRT1IT01FOi4uLiI8QlIgLz4KLSAgICAgKiAyKSBWYWxpZCBpbiB2Q2FyZCAyLjEgYnV0IG5vdCBpbiB2Q2FyZCAzLjA6ICJBRFI7RE9NO0hPTUU6Li4uIjxCUiAvPgotICAgICAqIDMpIFZhbGlkIGluIHZDYXJkIDMuMCBidXQgbm90IGluIHZDYXJkIDIuMTogIkFEUjtUWVBFPURPTSxIT01FOi4uLiI8QlIgLz4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogMikgaGFkIGJlZW4gdGhlIGRlZmF1bHQgb2YgVkNhcmQgZXhwb3J0ZXIvaW1wb3J0ZXIgaW4gQW5kcm9pZCwgYnV0IGl0IGlzIGZvdW5kIHRoYXQKLSAgICAgKiBzb21lIGV4dGVybmFsIGV4cG9ydGVyIGlzIG5vdCBhYmxlIHRvIHBhcnNlIHRoZSB0eXBlIGZvcm1hdCBsaWtlIDIpIGJ1dCBvbmx5IDMpLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJZiB5b3UgYXJlIHRhcmdldGluZyB0byB0aGUgaW1wb3J0ZXIgd2hpY2ggY2Fubm90IGFjY2VwdCBUWVBFIHBhcmFtcyB3aXRob3V0ICJUWVBFPSIKLSAgICAgKiBzdHJpbmdzICh3aGljaCBzaG91bGQgYmUgcmFyZSB0aG91Z2gpLCBwbGVhc2UgdXNlIHRoaXMgZmxhZy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogRXhhbXBsZSB1c2FnZTogaW50IHZjYXJkVHlwZSA9IChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDIHwgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSk7Ci0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0gPSAweDA0MDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgYXNraW5nIGV4cG9ydGVyIHRvIHJlZnJhaW4gaW1hZ2UgZXhwb3J0LgotICAgICAqIDwvUD4KLSAgICAgKiBAaGlkZSB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQgPSAweDAyMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyB0b3VjaCBub3RoaW5nIHRvd2FyZCBwaG9uZSBudW1iZXIgU3RyaW5ncwotICAgICAqIGJ1dCBsZWF2ZSBpdCBhcyBpcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIHNwZWNpZmljYXRpb25zIG1lbnRpb24gbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVycywgd2hpbGUgc29tZSBkZXZpY2VzCi0gICAgICogZG8gKHdyb25nbHksIGJ1dCB3aXRoIGlubmV2aXRhYmxlIHJlYXNvbnMpLgotICAgICAqIEZvciBleGFtcGxlLCB0aGVyZSdzIGEgcG9zc2liaWxpdHkgSmFwYW5lc2UgbW9iaWxlIHBob25lcyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZQotICAgICAqIGp1c3QgbnVtYmVycywgaHlwZW5zLCBwbHVzLCBldGMuIGJ1dCBub3QgdXN1YWwgYWxwaGFiZXRzLCB3aGlsZSBVUyBtb2JpbGUgcGhvbmVzCi0gICAgICogc2hvdWxkIGdldCBzdWNoIGNoYXJhY3RlcnMuIFRvIG1ha2UgZXhwb3J0ZWQgdkNhcmQgc2ltcGxlIGZvciBleHRlcm5hbCBwYXJzZXJzLAotICAgICAqIHdlIGhhdmUgdXNlZCB7QGxpbmsgUGhvbmVOdW1iZXJVdGlscyNmb3JtYXROdW1iZXIoU3RyaW5nKX0gZHVyaW5nIGV4cG9ydCwgYW5kCi0gICAgICogcmVtb3ZlZCB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgbnVtYmVyIChlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKSIKLSAgICAgKiBiZWNvbWVzICIxMTEtMjIyLTMzMzMiKS4KLSAgICAgKiBVbmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0aGF0IHVzZSB3YXMgc29tZSBjb250cm9sIGNoYXJhY3RlcnMgdXNlZCBpbiB0aGUgb3RoZXIKLSAgICAgKiBhcmVhcyBtYXkgYmUgYmFkbHkgYWZmZWN0ZWQgYnkgdGhlIGZvcm1hdHRpbmcuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGF0IGZvcm1hdHRpbmcsIGFmZmVjdGluZyBib3RoIGltcG9ydGVyIGFuZCBleHBvcnRlci4KLSAgICAgKiBJZiB0aGUgdXNlciBpcyBhd2FyZSBvZiBzb21lIHNpZGUgZWZmZWN0cyBkdWUgdG8gdGhlIGltcGxpY2l0IGZvcm1hdHRpbmcsIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyA9IDB4MDIwMDAwMDA7Ci0KLSAgICAvLy8vIFRoZSBmb2xsb3dpbmdzIGFyZSBWQ2FyZCB0eXBlcyBhdmFpbGFibGUgZnJvbSBpbXBvcnRlci9leHBvcnRlci4gLy8vLwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJpYyB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdkNhcmQgMi4xLiBVc2VzIFVURi04IGZvciB0aGUgY2hhcnNldC4KLSAgICAgKiBXaGVuIGNvbXBvc2luZyBhIHZDYXJkIGVudHJ5LCB0aGUgVVMgY29udmVuc2lvbiB3aWxsIGJlIHVzZWQgdG93YXJkIGZvcm1hdHRpbmcKLSAgICAgKiBzb21lIHZhbHVlcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogZS5nLiBUaGUgb3JkZXIgb2YgdGhlIGRpc3BsYXkgbmFtZSB3b3VsZCBiZSAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IiwKLSAgICAgKiB3aGlsZSBpdCBzaG91bGQgYmUgIlByZWZpeCBGYW1pbHkgTWlkZGxlIEdpdmVuIFN1ZmZpeCIgaW4gSmFwYW4gZm9yIGV4YW1wbGUuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjhfU1RSID0gInYyMV9nZW5lcmljIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMC4gVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCBmdWxseSByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjhfU1RSID0gInYzMF9nZW5lcmljIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCBmb3IgdGhlIHZDYXJkIDIuMSB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVXRmLTguCi0gICAgICogQ3VycmVudGx5LCBvbmx5IG5hbWUgb3JkZXIgaXMgY29uc2lkZXJlZCAoIlByZWZpeCBNaWRkbGUgR2l2ZW4gRmFtaWx5IFN1ZmZpeCIpCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4X1NUUiA9ICJ2MjFfZXVyb3BlIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMCB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVVRGLTguCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9TVFIgPSAidjMwX2V1cm9wZSI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGZvcm1hdCBmb3IgbWlzY2VsbGFuZW91cyBKYXBhbmVzZSBkZXZpY2VzLCB1c2luZyBVVEYtOCBhcyBkZWZhdWx0IGNoYXJzZXQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjggPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjhfU1RSID0gInYyMV9qYXBhbmVzZV91dGY4IjsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIHZDYXJkIDIuMSBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcy4gU2hpZnRfSmlzIGlzIHVzZWQgZm9yCi0gICAgICogcGFyc2luZy9jb21wb3NpbmcgdGhlIHZDYXJkIGRhdGEuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19DSEFSU0VUX1NISUZUX0pJUyB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJU19TVFIgPSAidjIxX2phcGFuZXNlX3NqaXMiOwotICAgIAotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIHZDYXJkIGZvcm1hdCBmb3IgbWlzY2VsbGFuZW91cyBKYXBhbmVzZSBkZXZpY2VzLCB1c2luZyBTaGlmdF9KaXMgZm9yCi0gICAgICogcGFyc2luZy9jb21wb3NpbmcgdGhlIHZDYXJkIGRhdGEuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMgPQotICAgICAgICAoRkxBR19WMzAgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19DSEFSU0VUX1NISUZUX0pJUyB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTX1NUUiA9ICJ2MzBfamFwYW5lc2Vfc2ppcyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDMuMCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4X1NUUiA9ICJ2MzBfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGJhc2VkIGZvcm1hdCB3aGljaCAocGFydGlhbGx5KSBjb25zaWRlcnMgdGhlIGNvbnZlbnRpb24gaW4gSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgcGhvbmVzLCB3aGVyZSBwaG9uZXRpYyBuYW1lcyBhcmUgdHJhbnNsYXRlZCB0byBoYWxmLXdpZHRoIGthdGFrYW5hIGlmCi0gICAgICogcG9zc2libGUsIGV0Yy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgfAotICAgICAgICAgICAgICAgIEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIgPSAidjIxX2phcGFuZXNlX21vYmlsZSI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBWQ2FyZCBmb3JtYXQgdXNlZCBpbiBEb0NvTW8sIHdoaWNoIGlzIG9uZSBvZiBKYXBhbmVzZSBtb2JpbGUgcGhvbmUgY2FyZWVycy4KLSAgICAgKiA8L3A+Ci0gICAgICogPFA+Ci0gICAgICogQmFzZSB2ZXJzaW9uIGlzIHZDYXJkIDIuMSwgYnV0IHRoZSBkYXRhIGhhcyBzZXZlcmFsIERvQ29Nby1zcGVjaWZpYyBjb252ZW5zaW9ucy4KLSAgICAgKiBObyBBbmRyb2lkLXNwZWNpZmljIHByb3BlcnR5IG5vciBkZWZhY3QgcHJvcGVydHkgaXMgaW5jbHVkZWQuIFRoZSAiUHJpbWFyeSIgcHJvcGVydGllcwotICAgICAqIGFyZSBOT1QgZW5jb2RlZCB0byBRdW90ZWQtUHJpbnRhYmxlLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX0RPQ09NTyA9Ci0gICAgICAgIChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUgfCBGTEFHX0RPQ09NTyk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9ET0NPTU9fU1RSID0gImRvY29tbyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBWQ0FSRF9UWVBFX0RFRkFVTFQgPSBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzVkNhcmRUeXBlTWFwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxJbnRlZ2VyPiBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0OwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4X1NUUiwgVkNBUkRfVFlQRV9WMjFfRVVST1BFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSLCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVNfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTX1NUUiwgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9ET0NPTU9fU1RSLCBWQ0FSRF9UWVBFX0RPQ09NTyk7Ci0KLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZDYXJkVHlwZUZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZjYXJkVHlwZVN0cmluZykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbG93ZXJlZEtleSA9IHZjYXJkVHlwZVN0cmluZy50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAoc1ZDYXJkVHlwZU1hcC5jb250YWluc0tleShsb3dlcmVkS2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIHNWQ2FyZFR5cGVNYXAuZ2V0KGxvd2VyZWRLZXkpOwotICAgICAgICB9IGVsc2UgaWYgKCJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHZjYXJkVHlwZVN0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBWQ0FSRF9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biB2Q2FyZCB0eXBlIFN0cmluZzogXCIiICsgdmNhcmRUeXBlU3RyaW5nICsgIlwiIik7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVjMwKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19WMzApICE9IDApOyAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVF1b3RlZFByaW50YWJsZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAhaXNWMzAodmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1V0ZjgoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NIQVJTRVRfTUFTSykgPT0gRkxBR19DSEFSU0VUX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzU2hpZnRKaXMoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NIQVJTRVRfTUFTSykgPT0gRkxBR19DSEFSU0VUX1NISUZUX0pJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TmFtZU9yZGVyVHlwZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiB2Y2FyZFR5cGUgJiBOQU1FX09SREVSX01BU0s7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzRGVmYWN0UHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93UGVyZm9ybWFuY2VMb2coKSB7Ci0gICAgICAgIHJldHVybiAoVkNhcmRDb25maWcuTE9HX0xFVkVMICYgVkNhcmRDb25maWcuTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UKSAhPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICByZXR1cm4gKCFzaG91bGRVc2VRdW90ZWRQcmludGFibGUodmNhcmRUeXBlKSB8fAotICAgICAgICAgICAgICAgKCh2Y2FyZFR5cGUgJiBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKSAhPSAwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFwcGVuZFR5cGVQYXJhbU5hbWUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKGlzVjMwKHZjYXJkVHlwZSkgfHwgKCh2Y2FyZFR5cGUgJiBGTEFHX0FQUEVORF9UWVBFX1BBUkFNKSAhPSAwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2UgYW5kIHNvbWUgSmFwYW5lc2UgY29udmVuc2lvbiBpcwotICAgICAqIGFwcGxpZWQgdG8gY3JlYXRpbmcgImZvcm1hdHRlZCIgc29tZXRoaW5nIGxpa2UgRk9STUFUVEVEX0FERFJFU1MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmFwYW5lc2VEZXZpY2UoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAvLyBUT0RPOiBTb21lIG1hc2sgd2lsbCBiZSByZXF1aXJlZCBzbyB0aGF0IHRoaXMgbWV0aG9kIHdyb25nbHkgaW50ZXJwcmV0Ci0gICAgICAgIC8vICAgICAgICBKYXBhbmVzZSItbGlrZSIgdkNhcmQgdHlwZS4KLSAgICAgICAgLy8gICAgICAgIGUuZy4gVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU1TCi0gICAgICAgIHJldHVybiBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmNvbnRhaW5zKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiByZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlID09IFZDQVJEX1RZUEVfRE9DT01POwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvQ29NbyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfRE9DT01PKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uZmlnKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDcxMjYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGJvdGggZXhwb3J0ZXIgYW5kIGltcG9ydGVyIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMjEgPSAiMi4xIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1YzMCA9ICIzLjAiOwotCi0gICAgLy8gVGhlIHByb3BlcnR5IG5hbWVzIHZhbGlkIGJvdGggaW4gdkNhcmQgMi4xIGFuZCAzLjAuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkVHSU4gPSAiQkVHSU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZFUlNJT04gPSAiVkVSU0lPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTiA9ICJOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GTiA9ICJGTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQURSID0gIkFEUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU1BSUwgPSAiRU1BSUwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05PVEUgPSAiTk9URSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfT1JHID0gIk9SRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09VTkQgPSAiU09VTkQiOyAgLy8gTm90IGZ1bGx5IHN1cHBvcnRlZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9URUwgPSAiVEVMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9USVRMRSA9ICJUSVRMRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUk9MRSA9ICJST0xFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9QSE9UTyA9ICJQSE9UTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTE9HTyA9ICJMT0dPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VUkwgPSAiVVJMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CREFZID0gIkJEQVkiOyAgLy8gQmlydGhkYXkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTkQgPSAiRU5EIjsKLQotICAgIC8vIFZhbGlkIHByb3BlcnR5IG5hbWVzIG5vdCBzdXBwb3J0ZWQgKG5vdCBhcHByb3ByaWF0ZWx5IGhhbmRsZWQpIGJ5IG91ciB2Q2FyZCBpbXBvcnRlciBub3cuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUkVWID0gIlJFViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUdFTlQgPSAiQUdFTlQiOwotCi0gICAgLy8gQXZhaWxhYmxlIGluIHZDYXJkIDMuMC4gU2hvdWQgbm90IHVzZSB3aGVuIGNvbXBvc2luZyB2Q2FyZCAyLjEgZmlsZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gIk5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05JQ0tOQU1FID0gIk5JQ0tOQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TT1JUX1NUUklORyA9ICJTT1JULVNUUklORyI7Ci0gICAgCi0gICAgLy8gRGUtZmFjdCBwcm9wZXJ0eSB2YWx1ZXMgZXhwcmVzc2luZyBwaG9uZXRpYyBuYW1lcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUgPSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FID0gIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FID0gIlgtUEhPTkVUSUMtTEFTVC1OQU1FIjsKLQotICAgIC8vIFByb3BlcnRpZXMgYm90aCBDb250YWN0c1N0cnVjdCBpbiBFY2xhaXIgYW5kIGRlLWZhY3QgdkNhcmQgZXh0ZW5zaW9ucwotICAgIC8vIHNob3duIGluIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVkNhcmQgc3VwcG9ydCBhcmUgZGVmaW5lZCBoZXJlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQUlNID0gIlgtQUlNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX01TTiA9ICJYLU1TTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ZQUhPTyA9ICJYLVlBSE9PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0lDUSA9ICJYLUlDUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9KQUJCRVIgPSAiWC1KQUJCRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEsgPSAiWC1HT09HTEUtVEFMSyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSA9ICJYLVNLWVBFLVVTRVJOQU1FIjsKLSAgICAvLyBQcm9wZXJ0aWVzIG9ubHkgQ29udGFjdHNTdHJ1Y3QgaGFzLiBXZSBhbHNlIHVzZSB0aGlzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUVEgPSAiWC1RUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ORVRNRUVUSU5HID0gIlgtTkVUTUVFVElORyI7Ci0KLSAgICAvLyBQaG9uZSBudW1iZXIgZm9yIFNreXBlLCBhdmFpbGFibGUgYXMgdXN1YWwgcGhvbmUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9QU1ROTlVNQkVSID0gIlgtU0tZUEUtUFNUTk5VTUJFUiI7Ci0KLSAgICAvLyBQcm9wZXJ0eSBmb3IgQW5kcm9pZC1zcGVjaWZpYyBmaWVsZHMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSA9ICJYLUFORFJPSUQtQ1VTVE9NIjsKLQotICAgIC8vIFByb3BlcnRpZXMgZm9yIERvQ29NbyB2Q2FyZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0NMQVNTID0gIlgtQ0xBU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUkVEVUNUSU9OID0gIlgtUkVEVUNUSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05PID0gIlgtTk8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfRENNX0hNTl9NT0RFID0gIlgtRENNLUhNTi1NT0RFIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEUgPSAiVFlQRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0hPTUUgPSAiSE9NRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9XT1JLID0gIldPUksiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfRkFYID0gIkZBWCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9DRUxMID0gIkNFTEwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVk9JQ0UgPSAiVk9JQ0UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSU5URVJORVQgPSAiSU5URVJORVQiOwotCi0gICAgLy8gQWJicmV2aWF0aW9uIG9mICJwcmVmZXJlZCIgYWNjb3JkaW5nIHRvIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uLgotICAgIC8vIFdlIGludGVycHJldCB0aGlzIHZhbHVlIGFzICJwcmltYXJ5IiBwcm9wZXJ0eSBkdXJpbmcgaW1wb3J0L2V4cG9ydC4KLSAgICAvLwotICAgIC8vIE5vdGU6IEJvdGggdkNhcmQgc3BlY3MgZG9lcyBub3QgbWVudGlvbiBhbnl0aGluZyBhYm91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoaXMgcGFyYW1ldGVyLAotICAgIC8vICAgICAgIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB2Q2FyZCBpbXBvcnRlciB3aGljaCB3aWxsIGdldCBjb25mdXNlZCB3aXRoIG1vcmUgdGhhbgotICAgIC8vICAgICAgIG9uZSAiUFJFRiJzIGluIG9uZSBwcm9wZXJ0eSBuYW1lLCB3aGlsZSBBbmRyb2lkIGFjY2VwdHMgdGhlbS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BSRUYgPSAiUFJFRiI7Ci0KLSAgICAvLyBQaG9uZSB0eXBlIHBhcmFtZXRlcnMgdmFsaWQgaW4gdkNhcmQgYW5kIGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QsIGJ1dCBub3Qgc28gY29tbW9uLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0FSID0gIkNBUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9JU0ROID0gIklTRE4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfUEFHRVIgPSAiUEFHRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVExYID0gIlRMWCI7ICAvLyBUZWxleAotCi0gICAgLy8gUGhvbmUgdHlwZXMgZXhpc3RpbmcgaW4gdkNhcmQgMi4xIGJ1dCBub3Qga25vd24gdG8gQ29udGFjdHNDb250cmFjdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX01PREVNID0gIk1PREVNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX01TRyA9ICJNU0ciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQkJTID0gIkJCUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9WSURFTyA9ICJWSURFTyI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIFBob25lcywgd2hpY2ggYXJlIG5vdCBmb3JtYWxseSB2YWxpZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAvLyBUaGVzZSB0eXBlcyBhcmUgYmFzaWNhbGx5IGVuY29kZWQgdG8gIlgtIiBwYXJhbWV0ZXJzIHdoZW4gY29tcG9zaW5nIHZDYXJkLgotICAgIC8vIFBhcnNlciBwYXNzZXMgdGhlc2Ugd2hlbiAiWC0iIGlzIGFkZGVkIHRvIHRoZSBwYXJhbWV0ZXIgb3Igbm90LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ0FMTEJBQ0sgPSAiQ0FMTEJBQ0siOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8gPSAiUkFESU8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfVFRZX1RERCA9ICJUVFktVEREIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCA9ICJBU1NJU1RBTlQiOwotICAgIC8vIHZDYXJkIGNvbXBvc2VyIHRyYW5zbGF0ZXMgdGhpcyB0eXBlIHRvICJXT1JLIiArICJQUkVGIi4gSnVzdCBmb3IgcGFyc2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NPTVBBTllfTUFJTiA9ICJDT01QQU5ZLU1BSU4iOwotICAgIC8vIHZDYXJkIGNvbXBvc2VyIHRyYW5zbGF0ZXMgdGhpcyB0eXBlIHRvICJWT0lDRSIgSnVzdCBmb3IgcGFyc2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX09USEVSID0gIk9USEVSIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBmb3IgcG9zdGFsIGFkZHJlc3Nlcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9QQVJDRUwgPSAiUEFSQ0VMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9ET00gPSAiRE9NIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9JTlRMID0gIklOVEwiOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIG5vdCBvZmZpY2lhbGx5IHZhbGlkIGJ1dCB1c2VkIGluIHNvbWUgdkNhcmQgZXhwb3J0ZXIuCi0gICAgLy8gRG8gbm90IHVzZSBpbiBjb21wb3NlciBzaWRlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VYVFJBX1RZUEVfQ09NUEFOWSA9ICJDT01QQU5ZIjsKLQotICAgIC8vIERvQ29NbyBzcGVjaWZpYyB0eXBlIHBhcmFtZXRlci4gVXNlZCB3aXRoICJTT1VORCIgcHJvcGVydHksIHdoaWNoIGlzIGFsdGVybmF0ZSBvZiBTT1JULVNUUklORyBpbgotICAgIC8vIHZDYXJkIDMuMC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1hfSVJNQ19OID0gIlgtSVJNQy1OIjsKLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0T25seSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTklDS05BTUUgPSAiWC1OSUNLTkFNRSI7Ci0gICAgICAgIC8vIFNvbWUgZGV2aWNlIGVtaXRzIHRoaXMgIlgtIiBwYXJhbWV0ZXIgZm9yIGV4cHJlc3NpbmcgR29vZ2xlIFRhbGssCi0gICAgICAgIC8vIHdoaWNoIGlzIHNwZWNpZmljYWxseSBpbnZhbGlkIGJ1dCBzaG91bGQgYmUgYWx3YXlzIHByb3Blcmx5IGFjY2VwdGVkLCBhbmQgZW1pdHRlZAotICAgICAgICAvLyBpbiBzb21lIHNwZWNpYWwgY2FzZSAoZm9yIHRoYXQgZGV2aWNlL2FwcGxpY2F0aW9uKS4KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFID0gIlgtR09PR0xFIFRBTEsiOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBNQVhfREFUQV9DT0xVTU4gPSAxNTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfUVAgPSA3NjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwID0gNzU7Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uc3RhbnRzKCkgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3ZTliOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50Lk9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Hcm91cHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdCBhcHAgYW5kIFZDYXJkIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEVfR09PR0xFID0gImNvbS5nb29nbGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09HTEVfTVlfQ09OVEFDVFNfR1JPVVAgPSAiU3lzdGVtIEdyb3VwOiBNeSBDb250YWN0cyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzSW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNLCBJbS5QUk9UT0NPTF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOLCBJbS5QUk9UT0NPTF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08sIEltLlBST1RPQ09MX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSwgSW0uUFJPVE9DT0xfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUiwgSW0uUFJPVE9DT0xfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FLCBJbS5QUk9UT0NPTF9TS1lQRSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9HT09HTEVfVEFMSywgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFLAotICAgICAgICAgICAgICAgIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIFBob25lRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAvLyBpc1ByaW1hcnkgaXMgY2hhbmdhYmxlIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIG9uZSBleGlzdGluZyBpbgotICAgICAgICAvLyB0aGUgb3JpZ2luYWwgVkNhcmQuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIFBob25lRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob25lRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG9uZURhdGEgcGhvbmVEYXRhID0gKFBob25lRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvbmVEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMocGhvbmVEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhwaG9uZURhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBwaG9uZURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIEVtYWlsRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICAvLyBVc2VkIG9ubHkgd2hlbiBUWVBFIGlzIFRZUEVfQ1VTVE9NLgotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAvLyBpc1ByaW1hcnkgaXMgY2hhbmdhYmxlIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIG9uZSBleGlzdGluZyBpbgotICAgICAgICAvLyB0aGUgb3JpZ2luYWwgVkNhcmQuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIEVtYWlsRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEVtYWlsRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbWFpbERhdGEgZW1haWxEYXRhID0gKEVtYWlsRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gZW1haWxEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMoZW1haWxEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhlbWFpbERhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBlbWFpbERhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIFBvc3RhbERhdGEgewotICAgICAgICAvLyBEZXRlcm1pbmVkIGJ5IHZDYXJkIHNwZWMuCi0gICAgICAgIC8vIFBPIEJveCwgRXh0ZW5kZWQgQWRkciwgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERFJfTUFYX0RBVEFfU0laRSA9IDc7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gZGF0YUFycmF5OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvYm94OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzdHJlZXQ7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbG9jYWx0eTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyByZWdpb247Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG9zdGFsQ29kZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb3VudHJ5OwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUG9zdGFsRGF0YShmaW5hbCBpbnQgdHlwZSwgZmluYWwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIGRhdGFBcnJheSA9IG5ldyBTdHJpbmdbQUREUl9NQVhfREFUQV9TSVpFXTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSBwcm9wVmFsdWVMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gQUREUl9NQVhfREFUQV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IEFERFJfTUFYX0RBVEFfU0laRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRyLXZhbHVlID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgICAgICAvLyAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsCi0gICAgICAgICAgICAvLyAgICAgICAgICAgOyBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBVc2UgSXRlcmF0b3IgYXNzdW1pbmcgTGlzdCBtYXkgYmUgTGlua2VkTGlzdCwgdGhvdWdoIGFjdHVhbGx5IGl0IGlzCi0gICAgICAgICAgICAvLyBhbHdheXMgQXJyYXlMaXN0IGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkcmVzc0VsZW1lbnQgOiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZGF0YUFycmF5W2ldID0gYWRkcmVzc0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKCsraSA+PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgQUREUl9NQVhfREFUQV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUFycmF5W2krK10gPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnBvYm94ID0gZGF0YUFycmF5WzBdOwotICAgICAgICAgICAgdGhpcy5leHRlbmRlZEFkZHJlc3MgPSBkYXRhQXJyYXlbMV07Ci0gICAgICAgICAgICB0aGlzLnN0cmVldCA9IGRhdGFBcnJheVsyXTsKLSAgICAgICAgICAgIHRoaXMubG9jYWx0eSA9IGRhdGFBcnJheVszXTsKLSAgICAgICAgICAgIHRoaXMucmVnaW9uID0gZGF0YUFycmF5WzRdOwotICAgICAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gZGF0YUFycmF5WzVdOwotICAgICAgICAgICAgdGhpcy5jb3VudHJ5ID0gZGF0YUFycmF5WzZdOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBvc3RhbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUG9zdGFsRGF0YSBwb3N0YWxEYXRhID0gKFBvc3RhbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuIChBcnJheXMuZXF1YWxzKGRhdGFBcnJheSwgcG9zdGFsRGF0YS5kYXRhQXJyYXkpICYmCi0gICAgICAgICAgICAgICAgICAgICh0eXBlID09IHBvc3RhbERhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsID09IHBvc3RhbERhdGEubGFiZWwpIDogdHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcG9zdGFsRGF0YS5pc1ByaW1hcnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkQWRkcmVzcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYm9vbGVhbiBlbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNKYXBhbmVzZURldmljZSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW4gSmFwYW4sIHRoZSBvcmRlciBpcyByZXZlcnNlZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gQUREUl9NQVhfREFUQV9TSVpFIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NQYXJ0ID0gZGF0YUFycmF5W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGFkZHJlc3NQYXJ0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhZGRyZXNzUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQUREUl9NQVhfREFUQV9TSVpFOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NQYXJ0ID0gZGF0YUFycmF5W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGFkZHJlc3NQYXJ0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhZGRyZXNzUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBPcmdhbml6YXRpb25EYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICAvLyBub24tZmluYWwgaXMgSW50ZW50aW9uYWw6IHdlIG1heSBjaGFuZ2UgdGhlIHZhbHVlcyBzaW5jZSB0aGlzIGluZm8gaXMgc2VwYXJhdGVkIGludG8KLSAgICAgICAgLy8gdHdvIHBhcnRzIGluIHZDYXJkOiAiT1JHIiArICJUSVRMRSIuCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFueU5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdGl0bGVOYW1lOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIE9yZ2FuaXphdGlvbkRhdGEoaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgICAgIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGVOYW1lLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5jb21wYW55TmFtZSA9IGNvbXBhbnlOYW1lOwotICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TmFtZSA9IGRlcGFydG1lbnROYW1lOwotICAgICAgICAgICAgdGhpcy50aXRsZU5hbWUgPSB0aXRsZU5hbWU7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbiA9IChPcmdhbml6YXRpb25EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBvcmdhbml6YXRpb24udHlwZSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGNvbXBhbnlOYW1lLCBvcmdhbml6YXRpb24uY29tcGFueU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMoZGVwYXJ0bWVudE5hbWUsIG9yZ2FuaXphdGlvbi5kZXBhcnRtZW50TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyh0aXRsZU5hbWUsIG9yZ2FuaXphdGlvbi50aXRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9PSBvcmdhbml6YXRpb24uaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY29tcGFueU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29tcGFueU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRpdGxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIGNvbXBhbnk6ICVzLCBkZXBhcnRtZW50OiAlcywgdGl0bGU6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCB0aXRsZU5hbWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIEltRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgcHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIEltRGF0YShmaW5hbCBpbnQgcHJvdG9jb2wsIGZpbmFsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgZmluYWwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEsIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLmN1c3RvbVByb3RvY29sID0gY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1EYXRhIGltRGF0YSA9IChJbURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGltRGF0YS50eXBlICYmIHByb3RvY29sID09IGltRGF0YS5wcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAmJiAoY3VzdG9tUHJvdG9jb2wgIT0gbnVsbCA/IGN1c3RvbVByb3RvY29sLmVxdWFscyhpbURhdGEuY3VzdG9tUHJvdG9jb2wpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbURhdGEuY3VzdG9tUHJvdG9jb2wgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIChkYXRhICE9IG51bGwgPyBkYXRhLmVxdWFscyhpbURhdGEuZGF0YSkgOiAoaW1EYXRhLmRhdGEgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzUHJpbWFyeSA9PSBpbURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJ0eXBlOiAlZCwgcHJvdG9jb2w6ICVkLCBjdXN0b21fcHJvdGNvbDogJXMsIGRhdGE6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgcHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCBkYXRhLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQaG90b0RhdGEgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfRkxBU0ggPSAiU1dGIjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdE5hbWU7ICAvLyB1c2VkIHdoZW4gdHlwZSBpcyBub3QgZGVmaW5lZCBpbiBDb250YWN0c0NvbnRyYWN0LgotICAgICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIHBob3RvQnl0ZXM7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUGhvdG9EYXRhKGludCB0eXBlLCBTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5mb3JtYXROYW1lID0gZm9ybWF0TmFtZTsKLSAgICAgICAgICAgIHRoaXMucGhvdG9CeXRlcyA9IHBob3RvQnl0ZXM7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGhvdG9EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBob3RvRGF0YSBwaG90b0RhdGEgPSAoUGhvdG9EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBwaG90b0RhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAoZm9ybWF0TmFtZSA9PSBudWxsID8gKHBob3RvRGF0YS5mb3JtYXROYW1lID09IG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXROYW1lLmVxdWFscyhwaG90b0RhdGEuZm9ybWF0TmFtZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChBcnJheXMuZXF1YWxzKHBob3RvQnl0ZXMsIHBob3RvRGF0YS5waG90b0J5dGVzKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeSA9PSBwaG90b0RhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZm9ybWF0OiAlczogc2l6ZTogJWQsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBmb3JtYXROYW1lLCBwaG90b0J5dGVzLmxlbmd0aCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFByb3BlcnR5IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IG1QYXJhbWV0ZXJNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1Qcm9wZXJ0eVZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBtUHJvcGVydHlCeXRlczsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgcGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlczsKLSAgICAgICAgICAgIGlmICghbVBhcmFtZXRlck1hcC5jb250YWluc0tleShwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIlRZUEUiKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJNYXAucHV0KHBhcmFtTmFtZSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbVBhcmFtZXRlck1hcC5nZXQocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlcy5hZGQocGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUb1Byb3BlcnR5VmFsdWVMaXN0KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuYWRkKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlCeXRlcyhmaW5hbCBieXRlW10gcHJvcGVydHlCeXRlcykgewotICAgICAgICAgICAgbVByb3BlcnR5Qnl0ZXMgPSBwcm9wZXJ0eUJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYXJhbWV0ZXJzKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhcmFtZXRlck1hcC5nZXQodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFByb3BlcnR5VmFsdWVMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eVZhbHVlTGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBtUGFyYW1ldGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1GYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1HaXZlbk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1pZGRsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZWZpeDsKLSAgICBwcml2YXRlIFN0cmluZyBtU3VmZml4OwotCi0gICAgLy8gVXNlZCBvbmx5IHdoZW4gbm8gZmFtaWx5IG5vciBnaXZlbiBuYW1lIGlzIGZvdW5kLgotICAgIHByaXZhdGUgU3RyaW5nIG1GdWxsTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGdWxsTmFtZTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1OaWNrTmFtZUxpc3Q7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtQmlydGhkYXk7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTm90ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob25lRGF0YT4gbVBob25lTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RW1haWxEYXRhPiBtRW1haWxMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQb3N0YWxEYXRhPiBtUG9zdGFsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8T3JnYW5pemF0aW9uRGF0YT4gbU9yZ2FuaXphdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEltRGF0YT4gbUltTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UGhvdG9EYXRhPiBtUGhvdG9MaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1XZWJzaXRlTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8TGlzdDxTdHJpbmc+PiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50IG1BY2NvdW50OwotCi0gICAgcHVibGljIFZDYXJkRW50cnkoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeShpbnQgdmNhcmRUeXBlLCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUFjY291bnQgPSBhY2NvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQaG9uZShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1QaG9uZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVBob25lTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGhvbmVEYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0cmltZWQgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZE51bWJlcjsKLSAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fCBWQ2FyZENvbmZpZy5yZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXIgPSB0cmltZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdHJpbWVkLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0cmltZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwgKGkgPT0gMCAmJiBjaCA9PSAnKycpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVzZSBOQU5QIGluIGRlZmF1bHQgd2hlbiB0aGVyZSdzIG5vIGluZm9ybWF0aW9uIGFib3V0IGxvY2FsZS4KLSAgICAgICAgICAgIGZpbmFsIGludCBmb3JtYXR0aW5nVHlwZSA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVOdW1iZXJGb3JtYXQobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXIgPSBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihidWlsZGVyLnRvU3RyaW5nKCksIGZvcm1hdHRpbmdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBQaG9uZURhdGEgcGhvbmVEYXRhID0gbmV3IFBob25lRGF0YSh0eXBlLCBmb3JtYXR0ZWROdW1iZXIsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICBtUGhvbmVMaXN0LmFkZChwaG9uZURhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROaWNrTmFtZShmaW5hbCBTdHJpbmcgbmlja05hbWUpIHsKLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5pY2tOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIG1OaWNrTmFtZUxpc3QuYWRkKG5pY2tOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW1haWwoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KXsKLSAgICAgICAgaWYgKG1FbWFpbExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUVtYWlsTGlzdCA9IG5ldyBBcnJheUxpc3Q8RW1haWxEYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1FbWFpbExpc3QuYWRkKG5ldyBFbWFpbERhdGEodHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQb3N0YWwoaW50IHR5cGUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KXsKLSAgICAgICAgaWYgKG1Qb3N0YWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Qb3N0YWxMaXN0ID0gbmV3IEFycmF5TGlzdDxQb3N0YWxEYXRhPigwKTsKLSAgICAgICAgfQotICAgICAgICBtUG9zdGFsTGlzdC5hZGQobmV3IFBvc3RhbERhdGEodHlwZSwgcHJvcFZhbHVlTGlzdCwgbGFiZWwsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgdmlhIHtAbGluayAjaGFuZGxlT3JnVmFsdWUoaW50LCBMaXN0LCBib29sZWFuKX0gb3IKLSAgICAgKiB7QGxpbmsgI2hhbmRsZVRpdGxlVmFsdWUoU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5ld09yZ2FuaXphdGlvbihpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlTmFtZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Pcmdhbml6YXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPcmdhbml6YXRpb25EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1Pcmdhbml6YXRpb25MaXN0LmFkZChuZXcgT3JnYW5pemF0aW9uRGF0YSh0eXBlLCBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gc0VtcHR5TGlzdCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigwKSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgIk9SRyIgcmVsYXRlZCB2YWx1ZXMgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3RzLCB0aGlzIGlucHV0IGRhdGEgYXJlIGF0dGFjaGVkIHRvIHRoZSBsYXN0IG9uZSB3aGljaAotICAgICAqIGRvZXMgbm90IGhhdmUgdmFsaWQgdmFsdWVzIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICoge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IG9iamVjdCwgYSBuZXcge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IGlzIGNyZWF0ZWQsCi0gICAgICogd2hvc2UgdGl0bGUgaXMgc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU9yZ1ZhbHVlKGZpbmFsIGludCB0eXBlLCBMaXN0PFN0cmluZz4gb3JnTGlzdCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG9yZ0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgb3JnTGlzdCA9IHNFbXB0eUxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3JnTGlzdC5zaXplKCk7Ci0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSAiIjsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsgIC8vIE1vcmUgdGhhbiAxLgotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gb3JnTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IHN1cmUgd2hpY2ggaXMgdGhlIGNvcnJlY3Qgc3RyaW5nIGZvciBkZXBhcnRtZW50LgotICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGtlZXAgYWxsIHRoZSBkYXRhLCBjb25jYXRpbmF0ZSB0aGUgcmVzdCBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChvcmdMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgdGl0bGUgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICAgICAgYWRkTmV3T3JnYW5pemF0aW9uKHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgbnVsbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAvLyBOb3QgdXNlIFRleHRVdGlscy5pc0VtcHR5KCkgc2luY2UgT1JHIHdhcyBzZXQgYnV0IHRoZSBlbGVtZW50cyBtaWdodCBiZSBlbXB0eS4KLSAgICAgICAgICAgIC8vIGUuZy4gIk9SRztQUkVGOjsiIC0+IEJvdGggY29tcGFueU5hbWUgYW5kIGRlcGFydG1lbnROYW1lIGJlY29tZSBlbXB0eSBidXQgbm90IG51bGwuCi0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHRoZSAiVElUTEUiIHByb3BlcnR5IGNvbWVzIGJlZm9yZSB0aGUgIk9SRyIgcHJvcGVydHkgdmlhCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVMaW5lKCkuCi0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSA9IGNvbXBhbnlOYW1lOwotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9EYXRhIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiB0aXRsZSwgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVUaXRsZVZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIGlzUHJpbWFyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0ICJ0aXRsZSIgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0cywgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2ggZG9lcyBub3QKLSAgICAgKiBoYXZlIHZhbGlkIHRpdGxlIHZhbHVlIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICogT3JnYW5pemF0aW9uRGF0YSBvYmplY3QsIGEgbmV3IE9yZ2FuaXphdGlvbkRhdGEgaXMgY3JlYXRlZCwgd2hvc2UgY29tcGFueSBuYW1lIGlzCi0gICAgICogc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRpdGxlVmFsdWUoZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlT3JnVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9uIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiBvdGhlciBpbmZvLCB3aGljaCBtYXkgYmUKLSAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJbShpbnQgcHJvdG9jb2wsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgaW50IHR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobUltTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtSW1MaXN0ID0gbmV3IEFycmF5TGlzdDxJbURhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUltTGlzdC5hZGQobmV3IEltRGF0YShwcm90b2NvbCwgY3VzdG9tUHJvdG9jb2wsIHR5cGUsIHByb3BWYWx1ZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5vdGUoZmluYWwgU3RyaW5nIG5vdGUpIHsKLSAgICAgICAgaWYgKG1Ob3RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTm90ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGVMaXN0LmFkZChub3RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvdG9CeXRlcyhTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvdG9MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG90b0xpc3QgPSBuZXcgQXJyYXlMaXN0PFBob3RvRGF0YT4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUGhvdG9EYXRhIHBob3RvRGF0YSA9IG5ldyBQaG90b0RhdGEoMCwgbnVsbCwgcGhvdG9CeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob3RvTGlzdC5hZGQocGhvdG9EYXRhKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOUHJvcGVydHkoTGlzdDxTdHJpbmc+IGVsZW1zKSB7Ci0gICAgICAgIC8vIEZhbWlseSwgR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguICgxIC0gNSkKLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IChzaXplID0gZWxlbXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA+IDUpIHsKLSAgICAgICAgICAgIHNpemUgPSA1OwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgY2FzZSA1OiBtU3VmZml4ID0gZWxlbXMuZ2V0KDQpOwotICAgICAgICAgICAgY2FzZSA0OiBtUHJlZml4ID0gZWxlbXMuZ2V0KDMpOwotICAgICAgICAgICAgY2FzZSAzOiBtTWlkZGxlTmFtZSA9IGVsZW1zLmdldCgyKTsKLSAgICAgICAgICAgIGNhc2UgMjogbUdpdmVuTmFtZSA9IGVsZW1zLmdldCgxKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1GYW1pbHlOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZTogU29tZSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSB0aGlzIGZpZWxkIGZvciBwaG9uZXRpYyBuYW1lLAotICAgICAqICAgICAgIHNpbmNlIHZDYXJkIDIuMSBkb2VzIG5vdCBoYXZlICJTT1JULVNUUklORyIgdHlwZS4KLSAgICAgKiAgICAgICBBbHNvLCBpbiBzb21lIGNhc2VzLCB0aGUgZmllbGQgaGFzIHNvbWUgJzsncyBpbiBpdC4KLSAgICAgKiAgICAgICBBc3N1bWUgdGhlICc7JyBtZWFucyB0aGUgc2FtZSBtZWFuaW5nIGluIE4gcHJvcGVydHkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQoTGlzdDxTdHJpbmc+IGVsZW1zKSB7Ci0gICAgICAgIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljTWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgb3RoZXIgcHJvcGVydGllcyBsaWtlICJYLVBIT05FVElDLUZJUlNULU5BTUUiIHdhcyBhbHJlYWR5IGZvdW5kLgotICAgICAgICAgICAgLy8gSWdub3JlICJTT1VORDtYLUlSTUMtTiIuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgaWYgKGVsZW1zID09IG51bGwgfHwgKHNpemUgPSBlbGVtcy5zaXplKCkpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIG9yZGVyIGlzICJGYW1pbHksIEdpdmVuLCBNaWRkbGUiLgotICAgICAgICAvLyBUaGlzIGlzIG5vdCBmcm9tIHNwZWNpZmljYXRpb24gYnV0IG1lcmUgYXNzdW1wdGlvbi4gU29tZSBKYXBhbmVzZSBwaG9uZXMgdXNlIHRoaXMgb3JkZXIuCi0gICAgICAgIGlmIChzaXplID4gMykgewotICAgICAgICAgICAgc2l6ZSA9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbXMuZ2V0KDApLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChlbGVtcy5nZXQoaSkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzQXJyYXkgPSBlbGVtcy5nZXQoMCkuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmFtZUFycmF5TGVuZ3RoID0gbmFtZXNBcnJheS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgTWlkZGxlIEdpdmVuIi4KLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IG5hbWVzQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBuYW1lc0FycmF5WzFdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBuYW1lc0FycmF5WzJdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZUFycmF5TGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBzdHJpbmcgaXMgIkZhbWlseSBHaXZlbiIgYmFzZWQgb24gdGhlIEphcGFuZXNlIG1vYmlsZQotICAgICAgICAgICAgICAgICAgICAvLyBwaG9uZXMnIHByZWZlcmVuY2UuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBuYW1lc0FycmF5WzFdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICBjYXNlIDM6IG1QaG9uZXRpY01pZGRsZU5hbWUgPSBlbGVtcy5nZXQoMik7Ci0gICAgICAgICAgICBjYXNlIDI6IG1QaG9uZXRpY0dpdmVuTmFtZSA9IGVsZW1zLmdldCgxKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBlbGVtcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5tUHJvcGVydHlOYW1lOwotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwID0gcHJvcGVydHkubVBhcmFtZXRlck1hcDsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QgPSBwcm9wZXJ0eS5tUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIGJ5dGVbXSBwcm9wQnl0ZXMgPSBwcm9wZXJ0eS5tUHJvcGVydHlCeXRlczsKLQotICAgICAgICBpZiAocHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcocHJvcFZhbHVlTGlzdCkudHJpbSgpOwotCi0gICAgICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTikpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIHZlcnNpb24uIElnbm9yZSB0aGlzLgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTikpIHsKLSAgICAgICAgICAgIG1GdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTkFNRSkgJiYgbUZ1bGxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgaW4gdkNhcmQgMy4wLiBVc2UgdGhpcyBpZiBGTiwgd2hpY2ggbXVzdCBleGlzdCBpbiB2Q2FyZCAzLjAgYnV0IG1heSBub3QKLSAgICAgICAgICAgIC8vIGFjdHVhbGx5IGV4aXN0IGluIHRoZSByZWFsIHZDYXJkIGRhdGEsIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgbUZ1bGxOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKSkgewotICAgICAgICAgICAgaGFuZGxlTlByb3BlcnR5KHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORykpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuSW1wb3J0T25seS5QUk9QRVJUWV9YX05JQ0tOQU1FKSkgewotICAgICAgICAgICAgYWRkTmlja05hbWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKSkgewotICAgICAgICAgICAgICAgIC8vIEFzIG9mIDIwMDktMTAtMDgsIFBhcnNlciBzaWRlIGRvZXMgbm90IHNwbGl0IGEgcHJvcGVydHkgdmFsdWUgaW50byBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgdXNpbmcgJzsnIChpbiBvdGhlciB3b3JkcywgcHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMSksCi0gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvciBmcm9tIHRoZSB2aWV3IG9mIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCBpdCB0byBiZSBzZXBhcmF0ZWQsIHNvIGRvIHRoZSBzZXBhcmF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25ldGljTmFtZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuaXNWMzAobVZDYXJkVHlwZSkpOwotICAgICAgICAgICAgICAgIGhhbmRsZVBob25ldGljTmFtZUZyb21Tb3VuZChwaG9uZXRpY05hbWVMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoaXMgZmllbGQgc2luY2UgQW5kcm9pZCBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGl0IGlzLgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHZhbHVlc0FyZUFsbEVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzQXJlQWxsRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlc0FyZUFsbEVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VYVFJBX1RZUEVfQ09NUEFOWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJDT01QQU5ZIiBzZWVtcyBlbWl0dGVkIGJ5IFdpbmRvd3MgTW9iaWxlLCB3aGljaCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljYWxseSBzdXBwb3J0ZWQgYnkgdkNhcmQgMi4xLiBXZSBhc3N1bWUgdGhpcyBpcyBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyAiV09SSyIuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX1BBUkNFTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9ET00pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfSU5UTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIGFueSBhcHByb3ByaWF0ZSB3YXkgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4uIEFsc28gc29tZSB2Q2FyZCAyLjEgZXhwb3J0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IG5vbi1zdGFuZGFyZCB0eXBlcy4gV2UgZG8gbm90IGhhbmRsZSB0aGVpciB2YWx1ZXMgbm93LgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSB1c2UgIkhPTUUiIGFzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUG9zdGFsKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTUFJTCkpIHsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9NT0JJTEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgSU5URVJORVQgKHNwZWNpZmllZCBpbiB2Q2FyZCBzcGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDSE9PTCwgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRFbWFpbCh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9PUkcpKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgb3RoZXIgdHlwZXMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IE9yZ2FuaXphdGlvbi5UWVBFX1dPUks7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVPcmdWYWx1ZSh0eXBlLCBwcm9wVmFsdWVMaXN0LCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSkpIHsKLSAgICAgICAgICAgIGhhbmRsZVRpdGxlVmFsdWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUk9MRSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29uZmxpY3RzIHdpdGggVElUTEUuIElnbm9yZSBmb3Igbm93Li4uCi0gICAgICAgICAgICAvLyBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1BIT1RPKSB8fAotICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9MT0dPKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHBhcmFtTWFwVmFsdWUgPSBwYXJhbU1hcC5nZXQoIlZBTFVFIik7Ci0gICAgICAgICAgICBpZiAocGFyYW1NYXBWYWx1ZSAhPSBudWxsICYmIHBhcmFtTWFwVmFsdWUuY29udGFpbnMoIlVSTCIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IHdlIGRvIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGV4YW1wbGUgZm9yIHRlc3RpbmcgdGhpcyBjYXNlLgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoIlRZUEUiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlVmFsdWUgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRi5lcXVhbHModHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdE5hbWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZSA9IHR5cGVWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRQaG90b0J5dGVzKGZvcm1hdE5hbWUsIHByb3BCeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKSkgewotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHR5cGVPYmplY3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3ModHlwZUNvbGxlY3Rpb24sIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgICAgIGlmICh0eXBlT2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHR5cGUgPSAoSW50ZWdlcil0eXBlT2JqZWN0OwotICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZU9iamVjdC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUikpIHsKLSAgICAgICAgICAgIC8vIFRoZSBwaG9uZSBudW1iZXIgYXZhaWxhYmxlIHZpYSBTa3lwZS4KLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkUGhvbmUodHlwZSwgcHJvcFZhbHVlLCBudWxsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHNJbU1hcC5jb250YWluc0tleShwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcm90b2NvbCA9IHNJbU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gSW0uVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEltKHByb3RvY29sLCBudWxsLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUpKSB7Ci0gICAgICAgICAgICBhZGROb3RlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCkpIHsKLSAgICAgICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1XZWJzaXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XZWJzaXRlTGlzdC5hZGQocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSkpIHsKLSAgICAgICAgICAgIG1CaXJ0aGRheSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljTWlkZGxlTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKSkgewotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGN1c3RvbVByb3BlcnR5TGlzdCA9Ci0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmlzVjMwKG1WQ2FyZFR5cGUpKTsKLSAgICAgICAgICAgIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgICAgICAvKn0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJSRVYiKSkgewotICAgICAgICAgICAgLy8gUmV2aXNpb24gb2YgdGhpcyBWQ2FyZCBlbnRyeS4gSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJVSUQiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiS0VZIikpIHsKLSAgICAgICAgICAgIC8vIFR5cGUgaXMgWDUwOSBvciBQR1A/IEkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMuLi4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIk1BSUxFUiIpKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJUWiIpKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJHRU8iKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiQ0xBU1MiKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIG9ubHkuCi0gICAgICAgICAgICAvLyBlLmcuIENMQVNTOkNPTkZJREVOVElBTAotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUFJPRklMRSIpKSB7Ci0gICAgICAgICAgICAvLyBWQ2FyZCAzLjAgb25seS4gTXVzdCBiZSAiVkNBUkQiLiBJIHRoaW5rIHdlIGNhbiBpZ25vcmUgdGhpcy4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIkNBVEVHT1JJRVMiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuCi0gICAgICAgICAgICAvLyBlLmcuIENBVEVHT1JJRVM6SU5URVJORVQsSUVURixJTkRVU1RSWSxJTkZPUk1BVElPTiBURUNITk9MT0dZCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJTT1VSQ0UiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJQUk9ESUQiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuCi0gICAgICAgICAgICAvLyBUbyBzcGVjaWZ5IHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcHJvZHVjdCB0aGF0IGNyZWF0ZWQKLSAgICAgICAgICAgIC8vIHRoZSB2Q2FyZCBvYmplY3QuKi8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVua25vd24gWC0gd29yZHMgYW5kIElBTkEgdG9rZW4uCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5kcm9pZEN1c3RvbVByb3BlcnR5KGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgaWYgKG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QuYWRkKGN1c3RvbVByb3BlcnR5TGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSBkaXNwbGF5IG5hbWUuIFRoZSBjb25zdHJ1Y3RlZCBkYXRhIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnN0cnVjdERpc3BsYXlOYW1lKCkgewotICAgICAgICAvLyBGdWxsTmFtZSAoY3JlYXRlZCB2aWEgIkZOIiBvciAiTkFNRSIgZmllbGQpIGlzIHByZWZlcmVkLgotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1GdWxsTmFtZSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1GdWxsTmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1GYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtRmFtaWx5TmFtZSwgbU1pZGRsZU5hbWUsIG1HaXZlbk5hbWUsIG1QcmVmaXgsIG1TdWZmaXgpOwotICAgICAgICB9IGVsc2UgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUsIG1QaG9uZXRpY01pZGRsZU5hbWUsIG1QaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUVtYWlsTGlzdCAhPSBudWxsICYmIG1FbWFpbExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbUVtYWlsTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUGhvbmVMaXN0ICE9IG51bGwgJiYgbVBob25lTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtUGhvbmVMaXN0LmdldCgwKS5kYXRhOwotICAgICAgICB9IGVsc2UgaWYgKG1Qb3N0YWxMaXN0ICE9IG51bGwgJiYgbVBvc3RhbExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBvc3RhbExpc3QuZ2V0KDApLmdldEZvcm1hdHRlZEFkZHJlc3MobVZDYXJkVHlwZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU9yZ2FuaXphdGlvbkxpc3QgIT0gbnVsbCAmJiBtT3JnYW5pemF0aW9uTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtT3JnYW5pemF0aW9uTGlzdC5nZXQoMCkuZ2V0Rm9ybWF0dGVkU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc29saWRhdGUgc2V2ZXJhbCBmaWVsc2RzIChsaWtlIG1OYW1lKSB1c2luZyBuYW1lIGNhbmRpZGF0ZXMsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uc29saWRhdGVGaWVsZHMoKSB7Ci0gICAgICAgIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk7Ci0KLSAgICAgICAgaWYgKG1QaG9uZXRpY0Z1bGxOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gbVBob25ldGljRnVsbE5hbWUudHJpbSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVyaSBwdXNoSW50b0NvbnRlbnRSZXNvbHZlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9uTGlzdCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4oKTsKLSAgICAgICAgLy8gQWZ0ZXIgYXBwbHlpbmcgdGhlIGJhdGNoIHRoZSBmaXJzdCByZXN1bHQncyBVcmkgaXMgcmV0dXJuZWQgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQKLSAgICAgICAgLy8gdGhlIFJhd0NvbnRhY3QgaXMgdGhlIGZpcnN0IG9wZXJhdGlvbiB0aGF0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdAotICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpOwotICAgICAgICBTdHJpbmcgbXlHcm91cHNJZCA9IG51bGw7Ci0gICAgICAgIGlmIChtQWNjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUsIG1BY2NvdW50Lm5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBtQWNjb3VudC50eXBlKTsKLQotICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgY2FsbGVyIHNpZGUgY3JlYXRlcyB0aGlzIGdyb3VwIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgaWYgKEFDQ09VTlRfVFlQRV9HT09HTEUuZXF1YWxzKG1BY2NvdW50LnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IHJlc29sdmVyLnF1ZXJ5KEdyb3Vwcy5DT05URU5UX1VSSSwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyb3Vwcy5TT1VSQ0VfSUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyb3Vwcy5USVRMRSArICI9PyIsIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfTVlfQ09OVEFDVFNfR1JPVVAgfSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUdyb3Vwc0lkID0gY3Vyc29yLmdldFN0cmluZygwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUsIG51bGwpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIGlmICghbmFtZUZpZWxkc0FyZUVtcHR5KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFN0cnVjdHVyZWROYW1lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLQotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgbUdpdmVuTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgbUZhbWlseU5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsIG1NaWRkbGVOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgbVByZWZpeCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsIG1TdWZmaXgpOwotCi0gICAgICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsIG1QaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsIG1QaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCBtUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsIG1QaG9uZXRpY0Z1bGxOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCBnZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5pY2tOYW1lTGlzdCAhPSBudWxsICYmIG1OaWNrTmFtZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmlja05hbWUgOiBtTmlja05hbWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE5pY2tuYW1lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuVFlQRSwgTmlja25hbWUuVFlQRV9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOaWNrbmFtZS5OQU1FLCBuaWNrTmFtZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUGhvbmVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUGhvbmVEYXRhIHBob25lRGF0YSA6IG1QaG9uZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoUGhvbmUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLQotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLlRZUEUsIHBob25lRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLnR5cGUgPT0gUGhvbmUuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvbmUuTEFCRUwsIHBob25lRGF0YS5sYWJlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLk5VTUJFUiwgcGhvbmVEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZURhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoT3JnYW5pemF0aW9uLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5UWVBFLCBvcmdhbml6YXRpb25EYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLkNPTVBBTlksIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLlRJVExFLCBvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVtYWlsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVtYWlsRGF0YSBlbWFpbERhdGEgOiBtRW1haWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEVtYWlsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBFbWFpbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5UWVBFLCBlbWFpbERhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsRGF0YS50eXBlID09IEVtYWlsLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEVtYWlsLkxBQkVMLCBlbWFpbERhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5EQVRBLCBlbWFpbERhdGEuZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBvc3RhbERhdGEgcG9zdGFsRGF0YSA6IG1Qb3N0YWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy5pbnNlcnRTdHJ1Y3R1cmVkUG9zdGFsRGF0YVVzaW5nQ29udGFjdHNTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtVkNhcmRUeXBlLCBidWlsZGVyLCBwb3N0YWxEYXRhKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJbURhdGEgaW1EYXRhIDogbUltTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShJbS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgSW0uQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLlRZUEUsIGltRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5QUk9UT0NPTCwgaW1EYXRhLnByb3RvY29sKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1EYXRhLnByb3RvY29sID09IEltLlBST1RPQ09MX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5DVVNUT01fUFJPVE9DT0wsIGltRGF0YS5jdXN0b21Qcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbURhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ob3RlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBub3RlIDogbU5vdGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE5vdGUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5vdGUuTk9URSwgbm90ZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUGhvdG9MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUGhvdG9EYXRhIHBob3RvRGF0YSA6IG1QaG90b0xpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoUGhvdG8uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5QSE9UTywgcGhvdG9EYXRhLnBob3RvQnl0ZXMpOwotICAgICAgICAgICAgICAgIGlmIChwaG90b0RhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob3RvLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XZWJzaXRlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB3ZWJzaXRlIDogbVdlYnNpdGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFdlYnNpdGUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFdlYnNpdGUuVVJMLCB3ZWJzaXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIFVSTCBpbiB2Q2FyZC4KLSAgICAgICAgICAgICAgICAvLyBXZSB1c2UgVFlQRV9IT01FUEFHRSBmb3Igc2FmZXR5LgotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0hPTUVQQUdFKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtQmlydGhkYXkpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFdmVudC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFdmVudC5TVEFSVF9EQVRFLCBtQmlydGhkYXkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IGN1c3RvbVByb3BlcnR5TGlzdCA6IG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBjdXN0b21Qcm9wZXJ0eUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMiB8fCBUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eUxpc3QuZ2V0KDApKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU4gKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU4gKyAxOwotICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0LnN1Ykxpc3QoMCwgVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGN1c3RvbVByb3BlcnR5VmFsdWUgOiBjdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gY3VzdG9tUHJvcGVydHlWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEdyb3VwTWVtYmVyc2hpcC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyAxIDw9IGkgJiYgaSA8PSBNQVhfREFUQV9DT0xVTU5TCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGN1c3RvbVByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoImRhdGEiICsgaSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXlHcm91cHNJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgR3JvdXBNZW1iZXJzaGlwLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEdyb3VwTWVtYmVyc2hpcC5HUk9VUF9TT1VSQ0VfSUQsIG15R3JvdXBzSWQpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSByZXN1bHRzID0gcmVzb2x2ZXIuYXBwbHlCYXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQVVUSE9SSVRZLCBvcGVyYXRpb25MaXN0KTsKLSAgICAgICAgICAgIC8vIHRoZSBmaXJzdCByZXN1bHQgaXMgYWx3YXlzIHRoZSByYXdfY29udGFjdC4gcmV0dXJuIGl0J3MgdXJpIHNvCi0gICAgICAgICAgICAvLyB0aGF0IGl0IGNhbiBiZSBmb3VuZCBsYXRlci4gZG8gbnVsbCBjaGVja2luZyBmb3IgYmFkbHkgYmVoYXZpbmcKLSAgICAgICAgICAgIC8vIENvbnRlbnRSZXNvbHZlcnMKLSAgICAgICAgICAgIHJldHVybiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoID09IDAgfHwgcmVzdWx0c1swXSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgIDogcmVzdWx0c1swXS51cmk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogJXMiLCBlLnRvU3RyaW5nKCksIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIHJldHVybiBidWlsZEZyb21SZXNvbHZlcihyZXNvbHZlciwgQ29udGFjdHMuQ09OVEVOVF9VUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVkNhcmRFbnRyeSBidWlsZEZyb21SZXNvbHZlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIFVyaSB1cmkpIHsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmFtZUZpZWxkc0FyZUVtcHR5KCkgewotICAgICAgICByZXR1cm4gKFRleHRVdGlscy5pc0VtcHR5KG1GYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1NaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1HaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVByZWZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtU3VmZml4KQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1GdWxsTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdFRvU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KXsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBnZXR0ZXIgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHksIHNpbmNlIHRoZXkgbWF5IGNoYW5nZQotICAgIC8vIGluIHRoZSBmdXR1cmUgYXMgb2YgMjAwOS0xMC0wNSwgb24gd2hpY2ggSSBjYW5ub3QgYmUgc3VyZSB0aGlzIHN0cnVjdHVyZQotICAgIC8vIGlzIGNvbXBsZXRlbHkgY29uc29saWRhdGVkLgotICAgIC8vCi0gICAgLy8gQWxzbyBub3RlIHRoYXQgdGhlc2UgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlcgotICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGJlaW5nIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LiBJZiBub3QsIGluY29ycmVjdAotICAgIC8vIHZhbHVlIHdpbGwgImJlIHN0b3JlZCBpbiB0aGUgbG9jYWwgY2FjaGUgYW5kIiBiZSByZXR1cm5lZCB0byB5b3UuCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1HaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbU1pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotICAgICAgICByZXR1cm4gbVN1ZmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZ1bGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljR2l2ZW5OYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljTWlkZGxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljRnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNGdWxsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldE5pY2tOYW1lTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1OaWNrTmFtZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaXJ0aGRheSgpIHsKLSAgICAgICAgcmV0dXJuIG1CaXJ0aGRheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldE5vdGVzKCkgewotICAgICAgICByZXR1cm4gbU5vdGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBob25lRGF0YT4gZ2V0UGhvbmVMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBob25lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxFbWFpbERhdGE+IGdldEVtYWlsTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1FbWFpbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UG9zdGFsRGF0YT4gZ2V0UG9zdGFsTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3N0YWxMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IGdldE9yZ2FuaXphdGlvbkxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtT3JnYW5pemF0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxJbURhdGE+IGdldEltTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UGhvdG9EYXRhPiBnZXRQaG90b0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvdG9MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0V2Vic2l0ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtV2Vic2l0ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTJiYWYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIDxQPgotICoge0BsaW5rIFZDYXJkRW50cnlIYW5kbGVyfSBpbXBsZW1lbnRhdGlvbiB3aGljaCBjb21taXRzIHRoZSBlbnRyeSB0byBDb250ZW50UmVzb2x2ZXIuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIE5vdGU6PEJSIC8+Ci0gKiBFYWNoIHZDYXJkIG1heSBjb250YWluIGJpZyBwaG90byBpbWFnZXMgZW5jb2RlZCBieSBCQVNFNjQsCi0gKiBJZiB3ZSBzdG9yZSBhbGwgdkNhcmQgZW50cmllcyBpbiBtZW1vcnksIE91dE9mTWVtb3J5RXJyb3IgbWF5IGJlIHRocm93bi4KLSAqIFRodXMsIHRoaXMgY2xhc3MgcHVzaCBlYWNoIFZDYXJkIGVudHJ5IGludG8gQ29udGVudFJlc29sdmVyIGltbWVkaWF0ZWx5LgotICogPC9QPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvbW1pdHRlciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb21pdHRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVRvQ29tbWl0OwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFVyaT4gbUNyZWF0ZWRVcmlzID0gbmV3IEFycmF5TGlzdDxVcmk+KCk7Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbW1pdHRlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbmQoKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgidGltZSB0byBjb21taXQgZW50cmllczogJWQgbXMiLCBtVGltZVRvQ29tbWl0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IGNvbnRhY3RTdHJ1Y3QpIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtQ3JlYXRlZFVyaXMuYWRkKGNvbnRhY3RTdHJ1Y3QucHVzaEludG9Db250ZW50UmVzb2x2ZXIobUNvbnRlbnRSZXNvbHZlcikpOwotICAgICAgICBtVGltZVRvQ29tbWl0ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjcmVhdGVkIFVyaXMuIFRoaXMgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBjYWxsZXIgYXMgaXQgaXMKLSAgICAgKiBub3QgYSBjbG9uZS4KLSAgICAgKi8KLSAgIHB1YmxpYyBBcnJheUxpc3Q8VXJpPiBnZXRDcmVhdGVkVXJpcygpIHsKLSAgICAgICAgcmV0dXJuIG1DcmVhdGVkVXJpczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTBjYTJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RdW90ZWRQcmludGFibGVDb2RlYzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeUNvbnN0cnVjdG9yIjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZXJlJ3Mgbm8gb3RoZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlLCB0aGlzIGNsYXNzIHVzZXMgdGhpcyBjaGFyc2V0IGZvciBlbmNvZGluZwotICAgICAqIGJ5dGUgYXJyYXlzIHRvIFN0cmluZy4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DSEFSU0VUX0ZPUl9ERUNPREVEX0JZVEVTID0gIlVURi04IjsKLQotICAgIHByaXZhdGUgVkNhcmRFbnRyeS5Qcm9wZXJ0eSBtQ3VycmVudFByb3BlcnR5ID0gbmV3IFZDYXJkRW50cnkuUHJvcGVydHkoKTsKLSAgICBwcml2YXRlIFZDYXJkRW50cnkgbUN1cnJlbnRDb250YWN0U3RydWN0OwotICAgIHByaXZhdGUgU3RyaW5nIG1QYXJhbVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2gge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IHBhcnNlcyB0aGUgdGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtSW5wdXRDaGFyc2V0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIGZpbmFsIHByaXZhdGUgU3RyaW5nIG1DaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzOwotICAgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICBmaW5hbCBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIGZpbmFsIHByaXZhdGUgQWNjb3VudCBtQWNjb3VudDsKLSAgICAKLSAgICAvKiogRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4gKi8KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlcjsKLQotICAgIGZpbmFsIHByaXZhdGUgTGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4gbUVudHJ5SGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFZDYXJkRW50cnlIYW5kbGVyPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsLCBmYWxzZSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsLCBmYWxzZSwgdmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIFN0cmluZyBjaGFyc2V0LCBmaW5hbCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcsCi0gICAgICAgICAgICBmaW5hbCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgdGhpcyhudWxsLCBjaGFyc2V0LCBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLCB2Y2FyZFR5cGUsIGFjY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoZmluYWwgU3RyaW5nIGlucHV0Q2hhcnNldCwgZmluYWwgU3RyaW5nIGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXMsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcsIGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgaWYgKGlucHV0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSW5wdXRDaGFyc2V0ID0gaW5wdXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlucHV0Q2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2hhcnNldEZvckRldG9kZWRCeXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hhcnNldEZvckRlY29kZWRCeXRlcyA9IGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldEZvckRlY29kZWRCeXRlcyA9IERFRkFVTFRfQ0hBUlNFVF9GT1JfREVDT0RFRF9CWVRFUzsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeUhhbmRsZXIoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyKSB7Ci0gICAgICAgIG1FbnRyeUhhbmRsZXJzLmFkZChlbnRyeUhhbmRsZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2UgZmFpbGVkIGJldHdlZW4ge0BsaW5rICNzdGFydEVudHJ5KCl9IGFuZCB7QGxpbmsgI2VuZEVudHJ5KCl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QgPSBudWxsOwotICAgICAgICBtQ3VycmVudFByb3BlcnR5ID0gbmV3IFZDYXJkRW50cnkuUHJvcGVydHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3N1bWUgdGhhdCBWQ2FyZCBpcyBub3QgbmVzdGVkLiBJbiBvdGhlciB3b3JkcywgdGhpcyBjb2RlIGRvZXMgbm90IGFjY2VwdCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBpZiAobUN1cnJlbnRDb250YWN0U3RydWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJOZXN0ZWQgVkNhcmQgY29kZSBpcyBub3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QgPSBuZXcgVkNhcmRFbnRyeShtVkNhcmRUeXBlLCBtQWNjb3VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIG1DdXJyZW50Q29udGFjdFN0cnVjdC5jb25zb2xpZGF0ZUZpZWxkcygpOwotICAgICAgICBmb3IgKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlciA6IG1FbnRyeUhhbmRsZXJzKSB7Ci0gICAgICAgICAgICBlbnRyeUhhbmRsZXIub25FbnRyeUNyZWF0ZWQobUN1cnJlbnRDb250YWN0U3RydWN0KTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0LmFkZFByb3BlcnR5KG1DdXJyZW50UHJvcGVydHkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5zZXRQcm9wZXJ0eU5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBpZiAobVBhcmFtVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicHJvcGVydHlQYXJhbVR5cGUoKSBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgIiArCi0gICAgICAgICAgICAgICAgICAgICJiZWZvcmUgcHJvcGVydHlQYXJhbVZhbHVlKCkgaXMgY2FsbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobVBhcmFtVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGcm9tIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uLiB2Q2FyZCAzLjAgZm9ybWFsbHkgZG9lcyBub3QgYWxsb3cgdGhpcyBjYXNlLgotICAgICAgICAgICAgbVBhcmFtVHlwZSA9ICJUWVBFIjsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFBhcmFtZXRlcihtUGFyYW1UeXBlLCB2YWx1ZSk7Ci0gICAgICAgIG1QYXJhbVR5cGUgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVN0cmluZyhTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKSB7Ci0gICAgICAgIGlmIChtSW5wdXRDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldEZvckRlY29kZWRCeXRlcykpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUobUlucHV0Q2hhcnNldCk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IGNoYXJzZXQuZW5jb2RlKG9yaWdpbmFsU3RyaW5nKTsKLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5hcnJheSgpICJtYXkiIHJldHVybiBieXRlIGFycmF5IHdoaWNoIGlzIGxhcmdlciB0aGFuCi0gICAgICAgIC8vIGJ5dGVCdWZmZXIucmVtYWluaW5nKCkuIEhlcmUsIHdlIGtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKV07Ci0gICAgICAgIGJ5dGVCdWZmZXIuZ2V0KGJ5dGVzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZU9uZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LnNldFByb3BlcnR5Qnl0ZXMoQmFzZTY0LmRlY29kZUJhc2U2NCh2YWx1ZS5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHMoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgICAgIC8vICI9ICIgLT4gIiAiLCAiPVx0IiAtPiAiXHQiLgotICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIGNvZGUgaGFkIGRvbmUgdGhpcyByZXBsYWNlbWVudC4gS2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc9JyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaCA9PSAnICcgfHwgbmV4dENoID09ICdcdCcpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHF1b3RlZFByaW50YWJsZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBsaW5lczsKLSAgICAgICAgICAgICAgICBpZiAobVN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBxdW90ZWRQcmludGFibGUuc3BsaXQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcXVvdGVkUHJpbnRhYmxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBxdW90ZWRQcmludGFibGUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSBxdW90ZWRQcmludGFibGUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmluYWxMaW5lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxMaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZmluYWxMaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IGxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlczsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcyhtSW5wdXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyBtSW5wdXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBRdW90ZWRQcmludGFibGVDb2RlYy5kZWNvZGVRdW90ZWRQcmludGFibGUoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERlY29kZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZSBxdW90ZWQtcHJpbnRhYmxlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcodmFsdWUsIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gY2hhcnNldENvbGxlY3Rpb24gPSBtQ3VycmVudFByb3BlcnR5LmdldFBhcmFtZXRlcnMoIkNIQVJTRVQiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJzZXQgPQotICAgICAgICAgICAgKChjaGFyc2V0Q29sbGVjdGlvbiAhPSBudWxsKSA/IGNoYXJzZXRDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpIDogbnVsbCk7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBlbmNvZGluZ0NvbGxlY3Rpb24gPSBtQ3VycmVudFByb3BlcnR5LmdldFBhcmFtZXRlcnMoIkVOQ09ESU5HIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGluZyA9Ci0gICAgICAgICAgICAoKGVuY29kaW5nQ29sbGVjdGlvbiAhPSBudWxsKSA/IGVuY29kaW5nQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpOwotCi0gICAgICAgIFN0cmluZyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKGNoYXJzZXQpOwotICAgICAgICBpZiAoY2hhcnNldEZvckRlY29kZWRCeXRlcyA9PSBudWxsIHx8IGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY2hhcnNldEZvckRlY29kZWRCeXRlcyA9IG1DaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuYWRkVG9Qcm9wZXJ0eVZhbHVlTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25lVmFsdWUodmFsdWUsIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93UGVyZm9ybWFuY2VJbmZvKCkgewotICAgICAgICBMb2cuZChMT0dfVEFHLCAidGltZSBmb3IgaW5zZXJ0IENvbnRhY3RTdHJ1Y3QgdG8gZGF0YWJhc2U6ICIgKyAKLSAgICAgICAgICAgICAgICBtVGltZVB1c2hJbnRvQ29udGVudFJlc29sdmVyICsgIiBtcyIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWI1MGQuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgY2xhc3Mgd2hpY2gganVzdCBjb3VudHMgdGhlIG51bWJlciBvZiB2Q2FyZCBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQgaW5wdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5Q291bnRlciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgaW50IG1Db3VudDsKLQotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIG1Db3VudCsrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTY3ZmUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBjYWxsZWQgYnkge0BsaW5rIFZDYXJkRW50cnlDb25zdHJ1Y3Rvcn0uIFVzZWZ1bCB3aGVuIHlvdSBkb24ndCB3YW50IHRvCi0gKiBoYW5kbGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYXMgd2hhdCB7QGxpbmsgVkNhcmRQYXJzZXJ9IHByb3ZpZGVzIHZpYSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBjYWxsZWQgd2hlbiBvbmUgVkNhcmQgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IGVudHJ5KTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIGVuZGVkLgotICAgICAqIEFibGUgdG8gYmUgdXNlIHRoaXMgbWV0aG9kIGZvciBzaG93aW5nIHBlcmZvcm1hbmNlIGxvZywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyMzdjMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxQPgotICogVGhlIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzZXMgd2hpY2ggaGF2ZSB0byBhbmFseXplIGVhY2gKLSAqIHZDYXJkIGVudHJ5IG1vcmUgbWludXRlbHkgdGhhbiB7QGxpbmsgVkNhcmRFbnRyeX0gY2xhc3MgYW5hbHlzaXMuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIEhlcmUsIHRoZXJlIGFyZSBzZXZlcmFsIHRlcm1zIHNwZWNpZmljIHRvIHZDYXJkIChhbmQgdGhpcyBsaWJyYXJ5KS4KLSAqIDwvUD4KLSAqIDxQPgotICogVGhlIHRlcm0gImVudHJ5IiBpcyBvbmUgdkNhcmQgcmVwcmVzZW50YXRpb24gaW4gdGhlIGlucHV0LCB3aGljaCBzaG91bGQgc3RhcnQgd2l0aCAiQkVHSU46VkNBUkQiCi0gKiBhbmQgZW5kIHdpdGggIkVORDpWQ0FSRCIuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJwcm9wZXJ0eSIgaXMgb25lIGxpbmUgaW4gdkNhcmQgZW50cnksIHdoaWNoIGNvbnNpc3RzIG9mICJncm91cCIsICJwcm9wZXJ0eSBuYW1lIiwKLSAqICJwYXJhbWV0ZXIocGFyYW0pIG5hbWVzIGFuZCB2YWx1ZXMiLCBhbmQgInByb3BlcnR5IHZhbHVlcyIuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIGUuZy4gZ3JvdXAxLnByb3BOYW1lO3BhcmFtTmFtZTE9cGFyYW1WYWx1ZTE7cGFyYW1OYW1lMj1wYXJhbVZhbHVlMjtwcm9wZXJ0eVZhbHVlMTtwcm9wZXJ0eVZhbHVlMi4uLgotICogPC9QPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydCgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdkNhcmQgaW50ZXJwcmV0YXRpb24gZmluaXNoZWQuCi0gICAgICovCi0gICAgdm9pZCBlbmQoKTsKLQotICAgIC8qKiAKLSAgICAgKiBDYWxsZWQgd2hlbiBwYXJzaW5nIG9uZSB2Q2FyZCBlbnRyeSBzdGFydGVkLgotICAgICAqIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiAiQkVHSU46VkNBUkQiIGlzIHJlYWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydEVudHJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBwYXJzaW5nIG9uZSB2Q2FyZCBlbnRyeSBlbmRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkVORDpWQ0FSRCIgaXMgcmVhZC4KLSAgICAgKiBOb3RlIHRoYXQge0BsaW5rICNzdGFydEVudHJ5KCl9IG1heSBiZSBjYWxsZWQgc2luY2UKLSAgICAgKiB2Q2FyZCAoZXNwZWNpYWxseSAyLjEpIGFsbG93cyBuZXN0ZWQgdkNhcmQuCi0gICAgICovCi0gICAgdm9pZCBlbmRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcmVhZGluZyBvbmUgcHJvcGVydHkgc3RhcnRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0UHJvcGVydHkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IGVuZGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kUHJvcGVydHkoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBncm91cCBBIGdyb3VwIG5hbWUuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb3IgbWF5IG5vdCBiZQotICAgICAqIGNhbGxlZCBhdCBhbGwsIGRlcGVuZGluZyBvbiBob3cgbWFueSBncnVvdXBzIGFyZSBhcHBlbmRlZCB0byB0aGUgcHJvcGVydHkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSBBIHByb3BlcnR5IG5hbWUgbGlrZSAiTiIsICJGTiIsICJBRFIiLCBldGMuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR5cGUgQSBwYXJhbWV0ZXIgbmFtZSBsaWtlICJFTkNPRElORyIsICJDSEFSU0VUIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZhbHVlIEEgcGFyYW1ldGVyIHZhbHVlLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHdpdGhvdXQKLSAgICAgKiB7QGxpbmsgI3Byb3BlcnR5UGFyYW1UeXBlKFN0cmluZyl9IGJlaW5nIGNhbGxlZCAod2hlbiB0aGUgdkNhcmQgaXMgdkNhcmQgMi4xKS4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZhbHVlcyBMaXN0IG9mIHByb3BlcnR5IHZhbHVlcy4gVGhlIHNpemUgb2YgdmFsdWVzIHdvdWxkIGJlIDEgdW5sZXNzCi0gICAgICogY29yZXNzcG9uZGluZyBwcm9wZXJ0eSBuYW1lIGlzICJOIiwgIkFEUiIsIG9yICJPUkciLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY4MWY3Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggYWdncmVnYXRlcyBtb3JlIHRoYW4gb25lCi0gKiB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gb2JqZWN0cyBhbmQgbWFrZSBhIHVzZXIgb2JqZWN0IHRyZWF0IHRoZW0gYXMgb25lCi0gKiB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24gaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gbUludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24oQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBpbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgbUludGVycHJldGVyQ29sbGVjdGlvbiA9IGludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBnZXRDb2xsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5R3JvdXAoZ3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eU5hbWUobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUodHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzUyYTYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVkNhcmRQYXJzZXIgewotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbVBhcnNlVHlwZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuY2VsZWQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXIoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuUEFSU0VfVFlQRV9VTktOT1dOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXIoaW50IHBhcnNlVHlwZSkgewotICAgICAgICBtUGFyc2VUeXBlID0gcGFyc2VUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyZWFtIGFuZCBzZW5kIHRoZSBWQ2FyZCBkYXRhIGludG8gVkNhcmRCdWlsZGVyQmFzZSBvYmplY3QuCi0gICAgICogPC9QLgotICAgICAqIDxQPgotICAgICAqIE5vdGUgdGhhdCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgIkNIQVJTRVQiIHBhcmFtZXRlciwgYW5kIHNvbWUgY2FyZWVyIHNldHMKLSAgICAgKiBsb2NhbCBlbmNvZGluZyB0byBpdC4gRm9yIGV4YW1wbGUsIEphcGFuZXNlIHBob25lIGNhcmVlciB1c2VzIFNoaWZ0X0pJUywgd2hpY2ggaXMKLSAgICAgKiBmb3JtYWxseSBhbGxvd2VkIGluIFZDYXJkIDIuMSwgYnV0IG5vdCByZWNvbW1lbmRlZCBpbiBWQ2FyZCAzLjAuIEluIFZDYXJkIDIuMSwKLSAgICAgKiBJbiBzb21lIGV4cmVtZSBjYXNlLCBzb21lIFZDYXJkIG1heSBoYXZlIGRpZmZlcmVudCBjaGFyc2V0cyBpbiBvbmUgVkNhcmQgKHRob3VnaAotICAgICAqIHdlIGRvIG5vdCBzZWUgYW55IGRldmljZSB3aGljaCBlbWl0cyBzdWNoIGtpbmQgb2YgbWFsaWNpb3VzIGRhdGEpCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIEluIG9yZGVyIHRvIGF2b2lkICJtaXN1bmRlcnN0YW5kaW5nIiBjaGFyc2V0IGFzIG11Y2ggYXMgcG9zc2libGUsIHRoaXMgbWV0aG9kCi0gICAgICogdXNlICJJU08tODg1OS0xIiBmb3IgcmVhZGluZyB0aGUgc3RyZWFtLiBXaGVuIGNoYXJzZXQgaXMgc3BlY2lmaWVkIGluIHNvbWUgcHJvcGVydHkKLSAgICAgKiAod2l0aCAiQ0hBUlNFVD0uLi4iIHBhcmFtZXRlciksIHRoZSBzdHJpbmcgaXMgZGVjb2RlZCB0byByYXcgYnl0ZXMgYW5kIGVuY29kZWQgdG8KLSAgICAgKiB0aGUgY2hhcnNldC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0ICJJU08tODg1OS0xIiBoYXMgMSB0byAxIG1hcHBpbmcgaW4gYWxsIDhiaXQKLSAgICAgKiBjaGFyYWN0ZXJzLCB3aGljaCBpcyBub3QgY29tcGxldGVseSBzdXJlLiBJbiBzb21lIGNhc2VzLCB0aGlzICJkZWNvZGluZy1lbmNvZGluZyIKLSAgICAgKiBzY2hlbWUgbWF5IGZhaWwuIFRvIGF2b2lkIHRoZSBjYXNlLAotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBXZSByZWNvbW1lbmQgeW91IHRvIHVzZSB7QGxpbmsgVkNhcmRTb3VyY2VEZXRlY3Rvcn0gYW5kIGRldGVjdCB3aGljaCBraW5kIG9mIHNvdXJjZSB0aGUKLSAgICAgKiBWQ2FyZCBjb21lcyBmcm9tIGFuZCBleHBsaWNpdGx5IHNwZWNpZnkgYSBjaGFyc2V0IHVzaW5nIHRoZSByZXN1bHQuCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIGlzIFRoZSBzb3VyY2UgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGludGVyZXByZXRlciBBIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBvYmplY3Qgd2hpY2ggdXNlZCB0byBjb25zdHJ1Y3QgZGF0YS4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBmb3Igc3VjY2Vzcy4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwYXJzZShJbnB1dFN0cmVhbSBpcywgVkNhcmRJbnRlcnByZXRlciBpbnRlcmVwcmV0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBtZXRob2QgdmFyaWFudHMgd2hpY2ggYWNjZXB0IGNoYXJzZXQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFJGQyAyNDI2ICJyZWNvbW1lbmRzIiAobm90IGZvcmNlcykgdG8gdXNlIFVURi04LCBzbyBpdCBtYXkgYmUgT0sgdG8gdXNlCi0gICAgICogVVRGLTggYXMgYW4gZW5jb2Rpbmcgd2hlbiBwYXJzaW5nIHZDYXJkIDMuMC4gQnV0IG5vdGUgdGhhdCBzb21lIEphcGFuZXNlCi0gICAgICogcGhvbmUgdXNlcyBTaGlmdF9KSVMgYXMgYSBjaGFyc2V0IChlLmcuIFc2MVNIKSwgYW5kIGFub3RoZXIgdXNlcwotICAgICAqICJDSEFSU0VUPVNISUZUX0pJUyIsIHdoaWNoIGlzIGV4cGxpY2l0bHkgcHJvaGliaXRlZCBpbiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiAoZS5nLiBXNTNLKS4KLSAgICAgKiA8L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgVGhlIHNvdXJjZSB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gY2hhcnNldCBDaGFyc2V0IHRvIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGJ1aWxkZXIgVGhlIFZDYXJkQnVpbGRlckJhc2Ugb2JqZWN0LgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIHdoZW4gc3VjY2Vzc2Z1bC4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwYXJzZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNoYXJzZXQsIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCB2YXJpYW50cyB3aGljaCB0ZWxscyB0aGlzIG9iamVjdCB0aGUgb3BlcmF0aW9uIGlzIGFscmVhZHkgY2FuY2VsZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LAotICAgICAgICAgICAgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyLCBib29sZWFuIGNhbmNlbGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENhbmNlbCBwYXJzaW5nLgotICAgICAqIEFjdHVhbCBjYW5jZWwgaXMgZG9uZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG9uZSB2Y2FyZCBlbnRyeSBwYXJzaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbUNhbmNlbGVkID0gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOGNmYjAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkSW52YWxpZExpbmVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkTmVzdGVkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZFZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHBhcnNlIHZDYXJkLiBQbGVhc2UgcmVmZXIgdG8gdkNhcmQgU3BlY2lmaWNhdGlvbiAyLjEgZm9yIG1vcmUgZGV0YWlsLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjIxIGV4dGVuZHMgVkNhcmRQYXJzZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VyX1YyMSI7Ci0KLSAgICAvKiogU3RvcmUgdGhlIGtub3duLXR5cGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0tub3duVHlwZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJET00iLCAiSU5UTCIsICJQT1NUQUwiLCAiUEFSQ0VMIiwgIkhPTUUiLCAiV09SSyIsCi0gICAgICAgICAgICAgICAgICAgICJQUkVGIiwgIlZPSUNFIiwgIkZBWCIsICJNU0ciLCAiQ0VMTCIsICJQQUdFUiIsICJCQlMiLAotICAgICAgICAgICAgICAgICAgICAiTU9ERU0iLCAiQ0FSIiwgIklTRE4iLCAiVklERU8iLCAiQU9MIiwgIkFQUExFTElOSyIsCi0gICAgICAgICAgICAgICAgICAgICJBVFRNQUlMIiwgIkNJUyIsICJFV09STEQiLCAiSU5URVJORVQiLCAiSUJNTUFJTCIsCi0gICAgICAgICAgICAgICAgICAgICJNQ0lNQUlMIiwgIlBPV0VSU0hBUkUiLCAiUFJPRElHWSIsICJUTFgiLCAiWDQwMCIsICJHSUYiLAotICAgICAgICAgICAgICAgICAgICAiQ0dNIiwgIldNRiIsICJCTVAiLCAiTUVUIiwgIlBNQiIsICJESUIiLCAiUElDVCIsICJUSUZGIiwKLSAgICAgICAgICAgICAgICAgICAgIlBERiIsICJQUyIsICJKUEVHIiwgIlFUSU1FIiwgIk1QRUciLCAiTVBFRzIiLCAiQVZJIiwKLSAgICAgICAgICAgICAgICAgICAgIldBVkUiLCAiQUlGRiIsICJQQ00iLCAiWDUwOSIsICJQR1AiKSk7Ci0KLSAgICAvKiogU3RvcmUgdGhlIGtub3duLXZhbHVlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNLbm93blZhbHVlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIklOTElORSIsICJVUkwiLCAiQ09OVEVOVC1JRCIsICJDSUQiKSk7Ci0KLSAgICAvKiogU3RvcmUgdGhlIHByb3BlcnR5IG5hbWVzIGF2YWlsYWJsZSBpbiB2Q2FyZCAyLjEgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0F2YWlsYWJsZVByb3BlcnR5TmFtZVNldFYyMSA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAiQkVHSU4iLCAiTE9HTyIsICJQSE9UTyIsICJMQUJFTCIsICJGTiIsICJUSVRMRSIsICJTT1VORCIsCi0gICAgICAgICAgICAgICAgIlZFUlNJT04iLCAiVEVMIiwgIkVNQUlMIiwgIlRaIiwgIkdFTyIsICJOT1RFIiwgIlVSTCIsCi0gICAgICAgICAgICAgICAgIkJEQVkiLCAiUk9MRSIsICJSRVYiLCAiVUlEIiwgIktFWSIsICJNQUlMRVIiKSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaG91Z2ggdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgIkIiIGVuY29kaW5nLCBzb21lIGRhdGEgbWF5IGhhdmUgaXQuCi0gICAgICogV2UgYWxsb3cgaXQgZm9yIHNhZmV0eS4uLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzQXZhaWxhYmxlRW5jb2RpbmdWMjEgPQotICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIjdCSVQiLCAiOEJJVCIsICJRVU9URUQtUFJJTlRBQkxFIiwgIkJBU0U2NCIsICJCIikpOwotICAgIAotICAgIC8vIFVzZWQgb25seSBmb3IgcGFyc2luZyBFTkQ6VkNBUkQuCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZXZpb3VzTGluZTsKLSAgICAKLSAgICAvKiogVGhlIGJ1aWxkZXIgdG8gYnVpbGQgcGFyc2VkIGRhdGEgKi8KLSAgICBwcm90ZWN0ZWQgVkNhcmRJbnRlcnByZXRlciBtQnVpbGRlciA9IG51bGw7Ci0KLSAgICAvKiogCi0gICAgICogVGhlIGVuY29kaW5nIHR5cGUuICJFbmNvZGluZyIgaW4gdkNhcmQgaXMgZGlmZmVyZW50IGZyb20gIkNoYXJzZXQiLgotICAgICAqIGUuZy4gN0JJVCwgOEJJVCwgUVVPVEVELVBSSU5UQUJMRS4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtRW5jb2RpbmcgPSBudWxsOwotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgc0RlZmF1bHRFbmNvZGluZyA9ICI4QklUIjsKLSAgICAKLSAgICAvLyBTaG91bGQgbm90IGRpcmVjdGx5IHJlYWQgYSBsaW5lIGZyb20gdGhpcyBvYmplY3QuIFVzZSBnZXRMaW5lKCkgaW5zdGVhZC4KLSAgICBwcm90ZWN0ZWQgQnVmZmVyZWRSZWFkZXIgbVJlYWRlcjsKLSAgICAKLSAgICAvLyBJbiBzb21lIGNhc2VzLCB2Q2FyZCBpcyBuZXN0ZWQuIEN1cnJlbnRseSwgd2Ugb25seSBjb25zaWRlciB0aGUgbW9zdCBpbnRlcmlvciB2Q2FyZCBkYXRhLgotICAgIC8vIFNlZSB2MjFfZm9tYV8xLnZjZiBpbiB0ZXN0IGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICBwcml2YXRlIGludCBtTmVzdENvdW50OwotICAgIAotICAgIC8vIEluIG9yZGVyIHRvIHJlZHVjZSB3YXJuaW5nIG1lc3NhZ2UgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2UgaG9sZCB0aGUgdmFsdWUgd2hpY2ggbWFkZSBMb2dnZXIKLSAgICAvLyBlbWl0IGEgd2FybmluZyBtZXNzYWdlLgotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBtVW5rbm93blR5cGVNYXAgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG1Vbmtub3duVmFsdWVNYXAgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAvLyBGb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlLgotICAgIHByaXZhdGUgbG9uZyBtVGltZVRvdGFsOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVJlYWRTdGFydFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkRW5kUmVjb3JkOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVN0YXJ0UHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lRW5kUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VJdGVtczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUxpbmVBbmRIYW5kbGVHcm91cDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlQWRyT3JnTjsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVIYW5kbGVNaXNjUHJvcGVydHlWYWx1ZTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlQmFzZTY0OwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMSgpIHsKLSAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKFZDYXJkU291cmNlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgdGhpcyhkZXRlY3RvciAhPSBudWxsID8gZGV0ZWN0b3IuZ2V0RXN0aW1hdGVkVHlwZSgpIDogVkNhcmRDb25maWcuUEFSU0VfVFlQRV9VTktOT1dOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKGludCBwYXJzZVR5cGUpIHsKLSAgICAgICAgc3VwZXIocGFyc2VUeXBlKTsKLSAgICAgICAgaWYgKHBhcnNlVHlwZSA9PSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX0ZPTUEpIHsKLSAgICAgICAgICAgIG1OZXN0Q291bnQgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIHZjYXJkX2ZpbGUgPSBbd3Nsc10gdmNhcmQgW3dzbHNdCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VWQ2FyZEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBmaXJzdFJlYWRpbmcgPSB0cnVlOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKG1DYW5jZWxlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwYXJzZU9uZVZDYXJkKGZpcnN0UmVhZGluZykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcnN0UmVhZGluZyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBib29sZWFuIHVzZUNhY2hlID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5lc3RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVhZEVuZFZDYXJkKHVzZUNhY2hlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB1c2VDYWNoZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuRkxBR19WMjE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIHByb3BlcnR5TmFtZSBpcyBhIHZhbGlkIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGlmICghKHNBdmFpbGFibGVQcm9wZXJ0eU5hbWVTZXRWMjEuY29udGFpbnMocHJvcGVydHlOYW1lLnRvVXBwZXJDYXNlKCkpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIlgtIikpICYmIAotICAgICAgICAgICAgICAgICFtVW5rbm93blR5cGVNYXAuY29udGFpbnMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgbVVua25vd25UeXBlTWFwLmFkZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlByb3BlcnR5IG5hbWUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMi4xOiAiICsgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgZW5jb2RpbmcgaXMgYSB2YWxpZCBlbmNvZGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHJldHVybiBzQXZhaWxhYmxlRW5jb2RpbmdWMjEuY29udGFpbnMoZW5jb2RpbmcudG9VcHBlckNhc2UoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nLiBJdCBtYXkgYmUgbnVsbCwgb3IgaXRzIGxlbmd0aCBtYXkgYmUgMAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB3aXRoIGl0J3MgbGVuZ3RoID4gMAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHdoZW4gdGhlIHN0cmVhbSByZWFjaGVkIGVuZCBvZiBsaW5lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCBlbmQgb2YgYnVmZmVyLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Y2FyZCA9ICJCRUdJTiIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiIFt3c10gMSpDUkxGCi0gICAgICogICAgICAgICBpdGVtcyAqQ1JMRgotICAgICAqICAgICAgICAgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlT25lVkNhcmQoYm9vbGVhbiBmaXJzdFJlYWRpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGFsbG93R2FyYmFnZSA9IGZhbHNlOwotICAgICAgICBpZiAoZmlyc3RSZWFkaW5nKSB7Ci0gICAgICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhbGxvd0dhcmJhZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVhZEJlZ2luVkNhcmQoYWxsb3dHYXJiYWdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgc3RhcnQ7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICAgICAgbVRpbWVSZWFkU3RhcnRSZWNvcmQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBwYXJzZUl0ZW1zKCk7Ci0gICAgICAgIG1UaW1lUGFyc2VJdGVtcyArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICByZWFkRW5kVkNhcmQodHJ1ZSwgZmFsc2UpOwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgICAgICBtVGltZVJlYWRFbmRSZWNvcmQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUcnVlIHdoZW4gc3VjY2Vzc2Z1bC4gRmFsc2Ugd2hlbiByZWFjaGluZyB0aGUgZW5kIG9mIGxpbmUgIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEJlZ2luVkNhcmQoYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHN0ckFycmF5Lmxlbmd0aDsKLQotICAgICAgICAgICAgLy8gVGhvdWdoIHZDYXJkIDIuMS8zLjAgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBsb3dlciBjYXNlcywKLSAgICAgICAgICAgIC8vIHZDYXJkIGZpbGUgZW1pdHRlZCBieSBzb21lIGV4dGVybmFsIHZDYXJkIGV4cG90ZXIgaGF2ZSBzdWNoIGludmFsaWQgU3RyaW5ncy4KLSAgICAgICAgICAgIC8vIFNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgLy8gZS5nLiBCRUdJTjp2Q2FyZAotICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAyICYmCi0gICAgICAgICAgICAgICAgICAgIHN0ckFycmF5WzBdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJCRUdJTiIpICYmCi0gICAgICAgICAgICAgICAgICAgIHN0ckFycmF5WzFdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0dhcmJhZ2UpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIFN0cmluZyBcIkJFR0lOOlZDQVJEXCIgZGlkIG5vdCBjb21lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoSW5zdGVhZCwgXCIiICsgbGluZSArICJcIiBjYW1lKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZShhbGxvd0dhcmJhZ2UpOwotCi0gICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCB3aGVyZSBtdXN0IG5vdCBiZSByZWFjaGVkLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBhcmd1bWVudHMgdXNlQ2FjaGUgYW5kIGFsbG93R2FyYmFzZSBhcmUgdXN1YWxseSB0cnVlIGFuZCBmYWxzZSBhY2NvcmRpbmdseSB3aGVuCi0gICAgICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb3V0c2lkZSB0aGlzIGZ1bmN0aW9uIGl0c2VsZi4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUgV2hlbiB0cnVlLCBsaW5lIGlzIG9idGFpbmVkIGZyb20gbVByZXZpb3VzbGluZS4gT3RoZXJ3aXNlLCBnZXRMaW5lKCkKLSAgICAgKiBpcyB1c2VkLgotICAgICAqIEBwYXJhbSBhbGxvd0dhcmJhZ2UgV2hlbiB0cnVlLCBpZ25vcmUgbm9uICJFTkQ6VkNBUkQiIGxpbmUuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRW5kVkNhcmQoYm9vbGVhbiB1c2VDYWNoZSwgYm9vbGVhbiBhbGxvd0dhcmJhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh1c2VDYWNoZSkgewotICAgICAgICAgICAgICAgIC8vIFRob3VnaCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGxvd2VyIGNhc2VzLAotICAgICAgICAgICAgICAgIC8vIHNvbWUgZGF0YSBtYXkgaGF2ZSB0aGVtLCBzbyB3ZSBhbGxvdyBpdC4KLSAgICAgICAgICAgICAgICBsaW5lID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFeHBlY3RlZCBFTkQ6VkNBUkQgd2FzIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxpbmUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggPT0gMiAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiRU5EIikgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyQXJyYXlbMV0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0dhcmJhZ2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkVORDpWQ0FSRCAhPSBcIiIgKyBtUHJldmlvdXNMaW5lICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c2VDYWNoZSA9IGZhbHNlOwotICAgICAgICB9IHdoaWxlIChhbGxvd0dhcmJhZ2UpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBpdGVtcyA9ICpDUkxGIGl0ZW0gCi0gICAgICogICAgICAgLyBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VJdGVtcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVTdGFydFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kZWQgPSBwYXJzZUl0ZW0oKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwgJiYgIWVuZGVkKSB7Ci0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVFbmRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFlbmRlZCkgewotICAgICAgICAgICAgLy8gZm9sbG93IFZDQVJEICxpdCB3b250IHJlYWNoIGVuZFByb3BlcnR5Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5zdGFydFByb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgbVRpbWVTdGFydFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkludmFsaWQgbGluZSB3aGljaCBsb29rcyBsaWtlIHNvbWUgY29tbWVudCB3YXMgZm91bmQuIElnbm9yZWQuIik7Ci0gICAgICAgICAgICAgICAgZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsICYmICFlbmRlZCkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBpdGVtID0gW2dyb3VwcyAiLiJdIG5hbWUgICAgW3BhcmFtc10gIjoiIHZhbHVlIENSTEYKLSAgICAgKiAgICAgIC8gW2dyb3VwcyAiLiJdICJBRFIiICAgW3BhcmFtc10gIjoiIGFkZHJlc3NwYXJ0cyBDUkxGCi0gICAgICogICAgICAvIFtncm91cHMgIi4iXSAiT1JHIiAgIFtwYXJhbXNdICI6IiBvcmdwYXJ0cyBDUkxGCi0gICAgICogICAgICAvIFtncm91cHMgIi4iXSAiTiIgICAgIFtwYXJhbXNdICI6IiBuYW1lcGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIkFHRU5UIiBbcGFyYW1zXSAiOiIgdmNhcmQgQ1JMRgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlSXRlbSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtRW5jb2RpbmcgPSBzRGVmYXVsdEVuY29kaW5nOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZ2V0Tm9uRW1wdHlMaW5lKCk7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IHNlcGFyYXRlTGluZUFuZEhhbmRsZUdyb3VwKGxpbmUpOwotICAgICAgICBpZiAocHJvcGVydHlOYW1lQW5kVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZUFuZFZhbHVlLmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigiSW52YWxpZCBsaW5lIFwiIiArIGxpbmUgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0udG9VcHBlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXTsKLQotICAgICAgICBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkFEUiIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoIk9SRyIpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLmVxdWFscygiTiIpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlTXVsdGlwbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlQWRyT3JnTiArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkFHRU5UIikpIHsKLSAgICAgICAgICAgIGhhbmRsZUFnZW50KHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkJFR0lOIikpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZS5lcXVhbHMoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkTmVzdGVkRXhjZXB0aW9uKCJUaGlzIHZDYXJkIGhhcyBuZXN0ZWQgdkNhcmQgZGF0YSBpbiBpdC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gQkVHSU4gdHlwZTogIiArIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiVkVSU0lPTiIpICYmCi0gICAgICAgICAgICAgICAgICAgICFwcm9wZXJ0eVZhbHVlLmVxdWFscyhnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkVmVyc2lvbkV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIHZlcnNpb246ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgKyAiICE9ICIgKyBnZXRWZXJzaW9uU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGhhbmRsZVByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlcyArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgbmFtZTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIik7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0dST1VQX09SX1BST1BOQU1FID0gMDsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfUEFSQU1TID0gMTsKLSAgICAvLyB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiBhbGxvd3MgZG91YmxlLXF1b3RlZCBwYXJhbS12YWx1ZSwgd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgIC8vIFRoaXMgaXMganVzdCBmb3Igc2FmZXR5LgotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9QQVJBTVNfSU5fRFFVT1RFID0gMjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChTdHJpbmcgbGluZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHN0YXRlID0gU1RBVEVfR1JPVVBfT1JfUFJPUE5BTUU7Ci0gICAgICAgIGludCBuYW1lSW5kZXggPSAwOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5TmFtZUFuZFZhbHVlID0gbmV3IFN0cmluZ1syXTsKLQotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgbGluZS5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBsaW5lLmNoYXJBdChpKTsgCi0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9HUk9VUF9PUl9QUk9QTkFNRTogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gbGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRU5EIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5R3JvdXAoZ3JvdXBOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0gPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lSW5kZXggPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNUzogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNU19JTl9EUVVPVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJhbXMobGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lSW5kZXggPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNU19JTl9EUVVPVEU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigiSW52YWxpZCBsaW5lOiBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFyYW1zICAgICA9ICI7IiBbd3NdIHBhcmFtbGlzdAotICAgICAqIHBhcmFtbGlzdCAgPSBwYXJhbWxpc3QgW3dzXSAiOyIgW3dzXSBwYXJhbQotICAgICAqICAgICAgICAgICAgLyBwYXJhbQotICAgICAqIHBhcmFtICAgICAgPSAiVFlQRSIgW3dzXSAiPSIgW3dzXSBwdHlwZXZhbAotICAgICAqICAgICAgICAgICAgLyAiVkFMVUUiIFt3c10gIj0iIFt3c10gcHZhbHVldmFsCi0gICAgICogICAgICAgICAgICAvICJFTkNPRElORyIgW3dzXSAiPSIgW3dzXSBwZW5jb2Rpbmd2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIkNIQVJTRVQiIFt3c10gIj0iIFt3c10gY2hhcnNldHZhbAotICAgICAqICAgICAgICAgICAgLyAiTEFOR1VBR0UiIFt3c10gIj0iIFt3c10gbGFuZ3ZhbAotICAgICAqICAgICAgICAgICAgLyAiWC0iIHdvcmQgW3dzXSAiPSIgW3dzXSB3b3JkCi0gICAgICogICAgICAgICAgICAvIGtub3dudHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBhcmFtcyhTdHJpbmcgcGFyYW1zKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IHBhcmFtcy5zcGxpdCgiPSIsIDIpOwotICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXJhbU5hbWUgPSBzdHJBcnJheVswXS50cmltKCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gc3RyQXJyYXlbMV0udHJpbSgpOwotICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIlRZUEUiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIlZBTFVFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVWYWx1ZShwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiRU5DT0RJTkciKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVuY29kaW5nKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJDSEFSU0VUIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDaGFyc2V0KHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJMQU5HVUFHRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlTGFuZ3VhZ2UocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQW55UGFyYW0ocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIHR5cGUgXCIiICsgcGFyYW1OYW1lICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVQYXJhbVdpdGhvdXROYW1lKHN0ckFycmF5WzBdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgcGFyc2VyIG1heSB0aHJvdyBWQ2FyZEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbVdpdGhvdXROYW1lKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHB0eXBldmFsID0ga25vd250eXBlIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZShmaW5hbCBTdHJpbmcgcHR5cGV2YWwpIHsKLSAgICAgICAgU3RyaW5nIHVwcGVyVHlwZVZhbHVlID0gcHR5cGV2YWw7Ci0gICAgICAgIGlmICghKHNLbm93blR5cGVTZXQuY29udGFpbnModXBwZXJUeXBlVmFsdWUpIHx8IHVwcGVyVHlwZVZhbHVlLnN0YXJ0c1dpdGgoIlgtIikpICYmIAotICAgICAgICAgICAgICAgICFtVW5rbm93blR5cGVNYXAuY29udGFpbnMocHR5cGV2YWwpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVNYXAuYWRkKHB0eXBldmFsKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUWVBFIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMTogIiArIHB0eXBldmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIlRZUEUiKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZSh1cHBlclR5cGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcHZhbHVldmFsID0gIklOTElORSIgLyAiVVJMIiAvICJDT05URU5ULUlEIiAvICJDSUQiIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVmFsdWUoZmluYWwgU3RyaW5nIHB2YWx1ZXZhbCkgewotICAgICAgICBpZiAoIXNLbm93blZhbHVlU2V0LmNvbnRhaW5zKHB2YWx1ZXZhbC50b1VwcGVyQ2FzZSgpKSAmJgotICAgICAgICAgICAgICAgIHB2YWx1ZXZhbC5zdGFydHNXaXRoKCJYLSIpICYmCi0gICAgICAgICAgICAgICAgIW1Vbmtub3duVmFsdWVNYXAuY29udGFpbnMocHZhbHVldmFsKSkgewotICAgICAgICAgICAgbVVua25vd25WYWx1ZU1hcC5hZGQocHZhbHVldmFsKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJWQUxVRSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwdmFsdWV2YWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVkFMVUUiKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwdmFsdWV2YWwpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHBlbmNvZGluZ3ZhbCA9ICI3QklUIiAvICI4QklUIiAvICJRVU9URUQtUFJJTlRBQkxFIiAvICJCQVNFNjQiIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRW5jb2RpbmcoU3RyaW5nIHBlbmNvZGluZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzVmFsaWRFbmNvZGluZyhwZW5jb2Rpbmd2YWwpIHx8Ci0gICAgICAgICAgICAgICAgcGVuY29kaW5ndmFsLnN0YXJ0c1dpdGgoIlgtIikpIHsKLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIkVOQ09ESU5HIik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHBlbmNvZGluZ3ZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRW5jb2RpbmcgPSBwZW5jb2Rpbmd2YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gZW5jb2RpbmcgXCIiICsgcGVuY29kaW5ndmFsICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gb25seSBhbGxvd3MgdXMtYXNjaWkgYW5kIGlzby04ODU5LXh4eCAoU2VlIFJGQyAxNTIxKSwKLSAgICAgKiBidXQgdG9kYXkncyB2Q2FyZCBvZnRlbiBjb250YWlucyBvdGhlciBjaGFyc2V0LCBzbyB3ZSBhbGxvdyB0aGVtLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYXJzZXQoU3RyaW5nIGNoYXJzZXR2YWwpIHsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJDSEFSU0VUIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoY2hhcnNldHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgYWxzbyBTZWN0aW9uIDcuMSBvZiBSRkMgMTUyMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxhbmd1YWdlKFN0cmluZyBsYW5ndmFsKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxhbmd2YWwuc3BsaXQoIi0iKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG1wID0gc3RyQXJyYXlbMF07Ci0gICAgICAgIGludCBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNMZXR0ZXIodG1wLmNoYXJBdChpKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0bXAgPSBzdHJBcnJheVsxXTsKLSAgICAgICAgbGVuZ3RoID0gdG1wLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzTGV0dGVyKHRtcC5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJMQU5HVUFHRSIpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKGxhbmd2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFpbmx5IGZvciAiWC0iIHR5cGUuIFRoaXMgYWNjZXB0cyBhbnkga2luZCBvZiB0eXBlIHdpdGhvdXQgY2hlY2suCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQW55UGFyYW0oU3RyaW5nIHBhcmFtTmFtZSwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gZ2V0UXVvdGVkUHJpbnRhYmxlKHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgdi5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIkJBU0U2NCIpIHx8Ci0gICAgICAgICAgICAgICAgbUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIkIiKSkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgLy8gSXQgaXMgdmVyeSByYXJlLCBidXQgc29tZSBCQVNFNjQgZGF0YSBtYXkgYmUgc28gYmlnIHRoYXQKLSAgICAgICAgICAgIC8vIE91dE9mTWVtb3J5RXJyb3Igb2NjdXJzLiBUbyBpZ25vcmUgc3VjaCBjYXNlcywgdXNlIHRyeS1jYXRjaC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGdldEJhc2U2NChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5VmFsdWVzKHYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBoYXBwZW5lZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgZGF0YSEiKTsKLSAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyhudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZUJhc2U2NCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCEobUVuY29kaW5nID09IG51bGwgfHwgbUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIjdCSVQiKQotICAgICAgICAgICAgICAgICAgICB8fCBtRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiOEJJVCIpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1FbmNvZGluZy50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIlgtIikpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRoZSBlbmNvZGluZyB1bnN1cHBvcnRlZCBieSB2Q2FyZCBzcGVjOiBcIiIgKyBtRW5jb2RpbmcgKyAiXCIuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHYuYWRkKG1heWJlVW5lc2NhcGVUZXh0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFF1b3RlZFByaW50YWJsZShTdHJpbmcgZmlyc3RTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyBTcGVjaWZpY2FsbHksIHRoZXJlIG1heSBiZSBzb21lIHBhZGRpbmcgYmV0d2VlbiA9IGFuZCBDUkxGLgotICAgICAgICAvLyBTZWUgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gcXAtbGluZSA6PSAqKHFwLXNlZ21lbnQgdHJhbnNwb3J0LXBhZGRpbmcgQ1JMRikKLSAgICAgICAgLy8gICAgICAgICAgICBxcC1wYXJ0IHRyYW5zcG9ydC1wYWRkaW5nCi0gICAgICAgIC8vIHFwLXNlZ21lbnQgOj0gcXAtc2VjdGlvbiAqKFNQQUNFIC8gVEFCKSAiPSIKLSAgICAgICAgLy8gICAgICAgICAgICAgOyBNYXhpbXVtIGxlbmd0aCBvZiA3NiBjaGFyYWN0ZXJzCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGUuZy4gKGZyb20gUkZDIDIwNDUpCi0gICAgICAgIC8vIE5vdydzIHRoZSB0aW1lID0KLSAgICAgICAgLy8gZm9yIGFsbCBmb2xrIHRvIGNvbWU9Ci0gICAgICAgIC8vICB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuCi0gICAgICAgIGlmIChmaXJzdFN0cmluZy50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlICJ0cmFuc3BvcnQtcGFkZGluZyIKLSAgICAgICAgICAgIGludCBwb3MgPSBmaXJzdFN0cmluZy5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICB3aGlsZShmaXJzdFN0cmluZy5jaGFyQXQocG9zKSAhPSAnPScpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmaXJzdFN0cmluZy5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIHF1b3RlZC1wcmludGFibGUgU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICAgICAgICAgIHBvcyA9IGxpbmUubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgICAgICAgICB3aGlsZShsaW5lLmNoYXJBdChwb3MpICE9ICc9JykgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDAsIHBvcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlyc3RTdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBiaW5hcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNYWlubHkgZm9yICJBRFIiLCAiT1JHIiwgYW5kICJOIgotICAgICAqIFdlIGRvIG5vdCBjYXJlIHRoZSBudW1iZXIgb2Ygc3Rybm9zZW1pIGhlcmUuCi0gICAgICogCi0gICAgICogYWRkcmVzc3BhcnRzID0gMCo2KHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaQotICAgICAqICAgICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkciwgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLAotICAgICAqICAgICAgICAgICAgICAgIFBvc3RhbCBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgKiBvcmdwYXJ0cyAgICAgPSAqKHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaQotICAgICAqICAgICAgICAgICAgICA7IEZpcnN0IGlzIE9yZ2FuaXphdGlvbiBOYW1lLAotICAgICAqICAgICAgICAgICAgICAgIHJlbWFpbmRlciBhcmUgT3JnYW5pemF0aW9uIFVuaXRzLgotICAgICAqIG5hbWVwYXJ0cyAgICA9IDAqNChzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBGYW1pbHksIEdpdmVuLCBNaWRkbGUsIFByZWZpeCwgU3VmZml4LgotICAgICAqICAgICAgICAgICAgICA7IEV4YW1wbGU6UHVibGljO0pvaG47US47UmV2ZXJlbmQgRHIuO0lJSSwgRXNxLgotICAgICAqIHN0cm5vc2VtaSAgICA9ICooKm5vbnNlbWkgKCJcOyIgLyAiXCIgQ1JMRikpICpub25zZW1pCi0gICAgICogICAgICAgICAgICAgIDsgVG8gaW5jbHVkZSBhIHNlbWljb2xvbiBpbiB0aGlzIHN0cmluZywgaXQgbXVzdCBiZSBlc2NhcGVkCi0gICAgICogICAgICAgICAgICAgIDsgd2l0aCBhICJcIiBjaGFyYWN0ZXIuCi0gICAgICogICAgICAgICAgICAgIAotICAgICAqIFdlIGFyZSBub3Qgc3VyZSB3aGV0aGVyIHdlIHNob3VsZCBhZGQgIlwiIENSTEYgdG8gZWFjaCB2YWx1ZS4KLSAgICAgKiBGb3Igbm93LCB3ZSBleGNsdWRlIHRoZW0uICAgICAgICAgICAgICAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTXVsdGlwbGVQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHZDYXJkIDIuMSBkb2VzIG5vdCBhbGxvdyBRVU9URUQtUFJJTlRBQkxFIGhlcmUsCi0gICAgICAgIC8vIGJ1dCBzb21lIHNvZnR3YXJlcy9kZXZpY2VzIGVtaXQgc3VjaCBkYXRhLgotICAgICAgICBpZiAobUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGdldFF1b3RlZFByaW50YWJsZShwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyhWQ2FyZFV0aWxzLmNvbnN0cnVjdExpc3RGcm9tVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUsIChnZXRWZXJzaW9uKCkgPT0gVkNhcmRDb25maWcuRkxBR19WMzApKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAyLjEgc3BlY2lmaWVzIEFHRU5UIGFsbG93cyBvbmUgdmNhcmQgZW50cnkuIEl0IGlzIG5vdCBlbmNvZGVkIGF0IGFsbC4KLSAgICAgKgotICAgICAqIGl0ZW0gID0gLi4uCi0gICAgICogICAgICAgLyBbZ3JvdXBzICIuIl0gIkFHRU5UIgotICAgICAqICAgICAgICAgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKiB2Y2FyZCA9ICJCRUdJTiIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiIFt3c10gMSpDUkxGCi0gICAgICogICAgICAgICBpdGVtcyAqQ1JMRiAiRU5EIiBbd3NdICI6IiBbd3NdICJWQ0FSRCIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZ2VudChmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbHVlLnRvVXBwZXJDYXNlKCkuY29udGFpbnMoIkJFR0lOOlZDQVJEIikpIHsKLSAgICAgICAgICAgIC8vIEFwcGFyZW50bHkgaW52YWxpZCBsaW5lIHNlZW4gaW4gV2luZG93cyBNb2JpbGUgNi41LiBJZ25vcmUgdGhlbS4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKCJBR0VOVCBQcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IEFHRU5UIHByb3BlcnR5LgotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3IgdkNhcmQgMy4wLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB1bmVzY2FwZWQgU3RyaW5nIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHVuZXNjYXBlZC4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotICAgICAqIGUuZy4gSW4gdkNhcmQgMi4xLCAiXDsiIHNob3VsZCBiZSB1bmVzY2FwZWQgaW50byAiOyIgd2hpbGUgIlx4IiBzaG91bGQgbm90IGJlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZUNoYXJhY3RlcihmaW5hbCBjaGFyIGNoKSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZUNoYXJhY3RlcihjaCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICAvLyBPcmlnaW5hbCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyB0cmFuc2Zvcm1hdGlvbgotICAgICAgICAvLyAiXDoiIC0+ICI6IiwgIlwsIiAtPiAiLCIsIGFuZCAiXFwiIC0+ICJcIiwgYnV0IHByZXZpb3VzIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICAgIC8vIHRoaXMgY2xhc3MgYWxsb3dlZCB0aGVtLCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgICBpZiAoY2ggPT0gJ1xcJyB8fCBjaCA9PSAnOycgfHwgY2ggPT0gJzonIHx8IGNoID09ICcsJykgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlKGlzLCBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQsIGJ1aWxkZXIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNoYXJzZXQsIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2hhcnNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9DSEFSU0VUOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtUmVhZGVyIHRtcFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgY2hhcnNldCk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgbVJlYWRlciA9IG5ldyBDdXN0b21CdWZmZXJlZFJlYWRlcih0bXBSZWFkZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcih0bXBSZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtQnVpbGRlciA9IGJ1aWxkZXI7Ci0KLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICBwYXJzZVZDYXJkRmlsZSgpOwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVUb3RhbCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLnNob3dQZXJmb3JtYW5jZUxvZygpKSB7Ci0gICAgICAgICAgICBzaG93UGVyZm9ybWFuY2VJbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNoYXJzZXQsIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciwgYm9vbGVhbiBjYW5jZWxlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtQ2FuY2VsZWQgPSBjYW5jZWxlZDsKLSAgICAgICAgcGFyc2UoaXMsIGNoYXJzZXQsIGJ1aWxkZXIpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dQZXJmb3JtYW5jZUluZm8oKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCBwYXJzaW5nIHRpbWU6ICAiICsgbVRpbWVUb3RhbCArICIgbXMiKTsKLSAgICAgICAgaWYgKG1SZWFkZXIgaW5zdGFuY2VvZiBDdXN0b21CdWZmZXJlZFJlYWRlcikgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRvdGFsIHJlYWRMaW5lIHRpbWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAoKEN1c3RvbUJ1ZmZlcmVkUmVhZGVyKW1SZWFkZXIpLmdldFRvdGFsbWlsbGlzZWNvbmQoKSArICIgbXMiKTsKLSAgICAgICAgfQotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgdGhlIGJlZ2dpbmluZyBvZiB0aGUgcmVjb3JkOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZVJlYWRTdGFydFJlY29yZCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBlbmQgb2YgdGhlIHJlY29yZDogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVSZWFkRW5kUmVjb3JkICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBsaW5lLCBhbmQgaGFuZGxpbmcgZ3JvdXA6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIEFEUiwgT1JHLCBhbmQgTiBmaWVsZHM6IiArIG1UaW1lUGFyc2VBZHJPcmdOICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBwcm9wZXJ0eSB2YWx1ZXM6ICIgKyBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXMgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBub3JtYWwgcHJvcGVydHkgdmFsdWVzOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgUXVvdGVkLVByaW50YWJsZTogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBCYXNlNjQ6ICIgKyBtVGltZUhhbmRsZUJhc2U2NCArICIgbXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMZXR0ZXIoY2hhciBjaCkgewotICAgICAgICBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotY2xhc3MgQ3VzdG9tQnVmZmVyZWRSZWFkZXIgZXh0ZW5kcyBCdWZmZXJlZFJlYWRlciB7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lOwotICAgIAotICAgIHB1YmxpYyBDdXN0b21CdWZmZXJlZFJlYWRlcihSZWFkZXIgaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBTdHJpbmcgcmV0ID0gc3VwZXIucmVhZExpbmUoKTsKLSAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVRpbWUgKz0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBsb25nIGdldFRvdGFsbWlsbGlzZWNvbmQoKSB7Ci0gICAgICAgIHJldHVybiBtVGltZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlY2ZlOTcuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyB1c2VkIHRvIHBhcnNlIHZDYXJkIDMuMC4KLSAqIFBsZWFzZSByZWZlciB0byB2Q2FyZCBTcGVjaWZpY2F0aW9uIDMuMCAoaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjQyNikuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFBhcnNlcl9WMzAgZXh0ZW5kcyBWQ2FyZFBhcnNlcl9WMjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VyX1YzMCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0FjY2VwdGFibGVQcm9wc1dpdGhQYXJhbSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAiQkVHSU4iLCAiTE9HTyIsICJQSE9UTyIsICJMQUJFTCIsICJGTiIsICJUSVRMRSIsICJTT1VORCIsIAotICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTiIsICJURUwiLCAiRU1BSUwiLCAiVFoiLCAiR0VPIiwgIk5PVEUiLCAiVVJMIiwKLSAgICAgICAgICAgICAgICAgICAgIkJEQVkiLCAiUk9MRSIsICJSRVYiLCAiVUlEIiwgIktFWSIsICJNQUlMRVIiLCAvLyAyLjEKLSAgICAgICAgICAgICAgICAgICAgIk5BTUUiLCAiUFJPRklMRSIsICJTT1VSQ0UiLCAiTklDS05BTUUiLCAiQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAiU09SVC1TVFJJTkciLCAiQ0FURUdPUklFUyIsICJQUk9ESUQiKSk7IC8vIDMuMAotICAgIAotICAgIC8vIEFsdGhvdWdoICI3Yml0IiBhbmQgIkJBU0U2NCIgaXMgbm90IGFsbG93ZWQgaW4gdkNhcmQgMy4wLCB3ZSBhbGxvdyBpdCBmb3Igc2FmZXR5LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzQWNjZXB0YWJsZUVuY29kaW5nVjMwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjdCSVQiLCAiOEJJVCIsICJCQVNFNjQiLCAiQiIpKTsKLSAgICAKLSAgICAvLyBBbHRob3VnaCBSRkMgMjQyNiBzcGVjaWZpZXMgc29tZSBwcm9wZXJ0eSBtdXN0IG5vdCBoYXZlIHBhcmFtZXRlcnMsIHdlIGFsbG93IGl0LCAKLSAgICAvLyBzaW5jZSB0aGVyZSBtYXkgYmUgc29tZSBjYXJlZXJzIHdoaWNoIHZpb2xhdGVzIHRoZSBSRkMuLi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gYWNjZXB0YWJsZVByb3BzV2l0aG91dFBhcmFtID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZXZpb3VzTGluZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRW1pdHRlZEFnZW50V2FybmluZyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSB3aGVuIHRoZSBjYWxsZXIgd2FudHMgdGhlIHBhcnNlciB0byBiZSBzdHJpY3QgYWJvdXQgdGhlIGlucHV0LgotICAgICAqIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TdHJpY3RQYXJzaW5nOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbVN0cmljdFBhcnNpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3RyaWN0UGFyc2luZyB3aGVuIHRydWUsIHRoaXMgb2JqZWN0IHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB3aGVuIHRoZSB2Y2FyZCBpcyBub3QKLSAgICAgKiB2YWxpZCBmcm9tIHRoZSB2aWV3IG9mIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIChkZWZpbmVkIGluIFJGQyAyNDI2KS4gTm90ZSB0aGF0IHRoaXMgY2xhc3MKLSAgICAgKiBpcyBub3QgZnVsbHkgeWV0IGZvciBiZWluZyB1c2VkIHdpdGggdGhpcyBmbGFnIGFuZCBtYXkgbm90IG5vdGljZSBpbnZhbGlkIGxpbmUocykuCi0gICAgICoKLSAgICAgKiBAaGlkZSBjdXJyZW50bHkgb25seSBmb3IgdGVzdGluZyEgCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMChib29sZWFuIHN0cmljdFBhcnNpbmcpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbVN0cmljdFBhcnNpbmcgPSBzdHJpY3RQYXJzaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoaW50IHBhcnNlTW9kZSkgewotICAgICAgICBzdXBlcihwYXJzZU1vZGUpOwotICAgICAgICBtU3RyaWN0UGFyc2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLkZMQUdfVjMwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjMwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAoIShzQWNjZXB0YWJsZVByb3BzV2l0aFBhcmFtLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkgfHwKLSAgICAgICAgICAgICAgICBhY2NlcHRhYmxlUHJvcHNXaXRob3V0UGFyYW0uY29udGFpbnMocHJvcGVydHlOYW1lKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJYLSIpKSAmJgotICAgICAgICAgICAgICAgICFtVW5rbm93blR5cGVNYXAuY29udGFpbnMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgbVVua25vd25UeXBlTWFwLmFkZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlByb3BlcnR5IG5hbWUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMy4wOiAiICsgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIHJldHVybiBzQWNjZXB0YWJsZUVuY29kaW5nVjMwLmNvbnRhaW5zKGVuY29kaW5nLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgcmVxdWlyZXMgdGhhdCB0aGUgbGluZSB3aXRoIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUKLSAgICAgKiBtdXN0IGJlIGNvbWJpbmVkIHdpdGggcHJldmlvdXMgbGluZS4gCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCBlbmQgb2YgYnVmZmVyLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5jaGFyQXQoMCkgPT0gJyAnIHx8IGxpbmUuY2hhckF0KDApID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBTZWN0aW9uIDUuOC4xIG9mIFJGQyAyNDI1IChNSU1FLURJUiBkb2N1bWVudCkuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBpcyB0aGUgZXhjZXJwdHMgZnJvbSBpdC4gIAotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBERVNDUklQVElPTjpUaGlzIGlzIGEgbG9uZyBkZXNjcmlwdGlvbiB0aGF0IGV4aXN0cyBvbiBhIGxvbmcgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAgICAgICAgIC8vIENhbiBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gIHRoYXQgZXhpc3RzIG9uIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJdCBjb3VsZCBhbHNvIGJlIHJlcHJlc2VudGVkIGFzOgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBERVNDUklQVElPTjpUaGlzIGlzIGEgbG9uZyBkZXNjcmlwCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aW9uIHRoYXQgZXhpc3RzIG8KLSAgICAgICAgICAgICAgICAgICAgLy8gIG4gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobVByZXZpb3VzTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJTcGFjZSBleGlzdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogdmNhcmQgPSBbZ3JvdXAgIi4iXSAiQkVHSU4iICI6IiAiVkNBUkQiIDEgKiBDUkxGCi0gICAgICogICAgICAgICAxICogKGNvbnRlbnRsaW5lKQotICAgICAqICAgICAgICAgO0EgdkNhcmQgb2JqZWN0IE1VU1QgaW5jbHVkZSB0aGUgVkVSU0lPTiwgRk4gYW5kIE4gdHlwZXMuCi0gICAgICogICAgICAgICBbZ3JvdXAgIi4iXSAiRU5EIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRCZWdpblZDYXJkKGJvb2xlYW4gYWxsb3dHYXJiYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETzogdkNhcmQgMy4wIHN1cHBvcnRzIGdyb3VwLgotICAgICAgICByZXR1cm4gc3VwZXIucmVhZEJlZ2luVkNhcmQoYWxsb3dHYXJiYWdlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRW5kVkNhcmQoYm9vbGVhbiB1c2VDYWNoZSwgYm9vbGVhbiBhbGxvd0dhcmJhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETzogdkNhcmQgMy4wIHN1cHBvcnRzIGdyb3VwLgotICAgICAgICBzdXBlci5yZWFkRW5kVkNhcmQodXNlQ2FjaGUsIGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuIGFzIHBhcmFtVHlwZSwgd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBhcmFtcyhTdHJpbmcgcGFyYW1zKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIuaGFuZGxlUGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG1heWJlIElBTkEgdHlwZQotICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHN0ckFycmF5WzBdLCBzdHJBcnJheVsxXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE11c3Qgbm90IGNvbWUgaGVyZSBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwYXJhbXMgdmFsdWU6ICIgKyBwYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQW55UGFyYW0oU3RyaW5nIHBhcmFtTmFtZSwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgc3VwZXIuaGFuZGxlQW55UGFyYW0ocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbVdpdGhvdXROYW1lKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobVN0cmljdFBhcnNpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUGFyYW1ldGVyIHdpdGhvdXQgbmFtZSBpcyBub3QgYWNjZXB0YWJsZSBpbiB2Q2FyZCAzLjAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtV2l0aG91dE5hbWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgdkNhcmQgMy4wIGRlZmluZXMKLSAgICAgKiAgCi0gICAgICogIHBhcmFtICAgICAgICAgPSBwYXJhbS1uYW1lICI9IiBwYXJhbS12YWx1ZSAqKCIsIiBwYXJhbS12YWx1ZSkKLSAgICAgKiAgcGFyYW0tbmFtZSAgICA9IGlhbmEtdG9rZW4gLyB4LW5hbWUKLSAgICAgKiAgcGFyYW0tdmFsdWUgICA9IHB0ZXh0IC8gcXVvdGVkLXN0cmluZwotICAgICAqICBxdW90ZWQtc3RyaW5nID0gRFFVT1RFIFFTQUZFLUNIQVIgRFFVT1RFCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZShTdHJpbmcgcHR5cGV2YWx1ZXMpIHsKLSAgICAgICAgU3RyaW5nW10gcHR5cGVBcnJheSA9IHB0eXBldmFsdWVzLnNwbGl0KCIsIik7Ci0gICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJUWVBFIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcHR5cGVBcnJheSkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAyICYmIHZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgJiYgdmFsdWUuZW5kc1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpIC0gMSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLSAgICAgICAgLy8gVGhlIHdheSBob3cgdkNhcmQgMy4wIHN1cHBvcnRzICJBR0VOVCIgaXMgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB2Q2FyZCAyLjEuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGUuZy4KLSAgICAgICAgLy8gQUdFTlQ6QkVHSU46VkNBUkRcbkZOOkpvZSBGcmlkYXlcblRFTDorMS05MTktNTU1LTc4NzhcbgotICAgICAgICAvLyAgVElUTEU6QXJlYSBBZG1pbmlzdHJhdG9yXCwgQXNzaXN0YW50XG4gRU1BSUxcO1RZUEU9SU5URVJOXG4KLSAgICAgICAgLy8gIEVUOmpmcmlkYXlAaG9zdC5jb21cbkVORDpWQ0FSRFxuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRPRE86IGZpeCB0aGlzLgotICAgICAgICAvLwotICAgICAgICAvLyBpc3N1ZToKLSAgICAgICAgLy8gIHZDYXJkIDMuMCBhbHNvIGFsbG93cyB0aGlzIGFzIGFuIGV4YW1wbGUuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFHRU5UO1ZBTFVFPXVyaToKLSAgICAgICAgLy8gIENJRDpKUVBVQkxJQy5wYXJ0My45NjAxMjlUMDgzMDIwLnh5ek1haWxAaG9zdDMuY29tCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoaXMgaXMgbm90IHZDYXJkLiBTaG91bGQgd2Ugc3VwcG9ydCB0aGlzPwotICAgICAgICAvLwotICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgbGluZSBmb3Igbm93LCBzaW5jZSB3ZSBjYW5ub3Qga25vdyBob3cgdG8gaGFuZGxlIGl0Li4uCi0gICAgICAgIGlmICghbUVtaXR0ZWRBZ2VudFdhcm5pbmcpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJBR0VOVCBpbiB2Q2FyZCAzLjAgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIElnbm9yZSBpdCIpOwotICAgICAgICAgICAgbUVtaXR0ZWRBZ2VudFdhcm5pbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBkb2VzIG5vdCByZXF1aXJlIHR3byBDUkxGIGF0IHRoZSBsYXN0IG9mIEJBU0U2NCBkYXRhLgotICAgICAqIEl0IG9ubHkgcmVxdWlyZXMgdGhhdCBkYXRhIHNob3VsZCBiZSBNSU1FLWVuY29kZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgYmluYXJ5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIiAiKSAmJiAhbGluZS5zdGFydHNXaXRoKCJcdCIpKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRVNDQVBFRC1DSEFSID0gIlxcIiAvICJcOyIgLyAiXCwiIC8gIlxuIiAvICJcTiIpCi0gICAgICogICAgICAgICAgICAgIDsgXFwgZW5jb2RlcyBcLCBcbiBvciBcTiBlbmNvZGVzIG5ld2xpbmUKLSAgICAgKiAgICAgICAgICAgICAgOyBcOyBlbmNvZGVzIDssIFwsIGVuY29kZXMgLAotICAgICAqICAgICAgICAgICAgICAKLSAgICAgKiBOb3RlOiBBcHBsZSBlc2NhcGVzICc6JyBpbnRvICdcOicgd2hpbGUgZG9lcyBub3QgZXNjYXBlICdcJwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0X2NoID0gdGV4dC5jaGFyQXQoKytpKTsgCi0gICAgICAgICAgICAgICAgaWYgKG5leHRfY2ggPT0gJ24nIHx8IG5leHRfY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5leHRfY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTdjNTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ2xhc3Mgd2hpY2ggdHJpZXMgdG8gZGV0ZWN0cyB0aGUgc291cmNlIG9mIHRoZSB2Q2FyZCBmcm9tIGl0cyBwcm9wZXJ0aWVzLgotICogQ3VycmVudGx5IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBwcmVtYXR1cmUuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRTb3VyY2VEZXRlY3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEFQUExFX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIlgtUEhPTkVUSUMtTEFTVC1OQU1FIiwKLSAgICAgICAgICAgICJYLUFCQURSIiwgIlgtQUJVSUQiKSk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gSkFQQU5FU0VfTU9CSUxFX1BIT05FX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtR05PIiwgIlgtR04iLCAiWC1SRURVQ1RJT04iKSk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1NSUNST1NPRlQtQVNTVF9URUwiLCAiWC1NSUNST1NPRlQtQVNTSVNUQU5UIiwgIlgtTUlDUk9TT0ZULU9GRklDRUxPQyIpKTsKLSAgICAKLSAgICAvLyBOb3RlOiB0aGVzZSBzaWduZXMgYXBwZWFycyBiZWZvcmUgdGhlIHNpZ25zIG9mIHRoZSBvdGhlciB0eXBlIChlLmcuICJYLUdOIikuCi0gICAgLy8gSW4gb3RoZXIgd29yZHMsIEphcGFuZXNlIEZPTUEgbW9iaWxlIHBob25lcyBhcmUgZGV0ZWN0ZWQgYXMgRk9NQSwgbm90IEpBUEFORVNFX01PQklMRV9QSE9ORVMuCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gRk9NQV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLVNELVZFUk4iLCAiWC1TRC1GT1JNQVRfVkVSIiwgIlgtU0QtQ0FURUdPUklFUyIsICJYLVNELUNMQVNTIiwgIlgtU0QtRENSRUFURUQiLAotICAgICAgICAgICAgIlgtU0QtREVTQ1JJUFRJT04iKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRZUEVfRk9NQV9DSEFSU0VUX1NJR04gPSAiWC1TRC1DSEFSX0NPREUiOwotICAgIAotICAgIHByaXZhdGUgaW50IG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9VTktOT1dOOwotICAgIC8vIFNvbWUgbW9iaWxlIHBob25lcyAobGlrZSBGT01BKSB0ZWxscyB1cyB0aGUgY2hhcnNldCBvZiB0aGUgZGF0YS4KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVNwZWNpZmllZENoYXJzZXQ7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtTmVlZFBhcnNlU3BlY2lmaWVkQ2hhcnNldCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShUWVBFX0ZPTUFfQ0hBUlNFVF9TSUdOKSkgewotICAgICAgICAgICAgbVR5cGUgPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX0ZPTUE7Ci0gICAgICAgICAgICBtTmVlZFBhcnNlU3BlY2lmaWVkQ2hhcnNldCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UeXBlICE9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChXSU5ET1dTX01PQklMRV9QSE9ORV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVR5cGUgPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX0pQOwotICAgICAgICB9IGVsc2UgaWYgKEZPTUFfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOwotICAgICAgICB9IGVsc2UgaWYgKEpBUEFORVNFX01PQklMRV9QSE9ORV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVR5cGUgPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChBUFBMRV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVR5cGUgPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX0FQUExFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAobU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgJiYgdmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TcGVjaWZpZWRDaGFyc2V0ID0gdmFsdWVzLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldEVzdGltYXRlZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGNoYXJzZXQgU3RyaW5nIGd1ZXNzZWQgZnJvbSB0aGUgc291cmNlJ3MgcHJvcGVydGllcy4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBwYXJzaW5nIHRhcmdldCBmaWxlKHMpLgotICAgICAqIEByZXR1cm4gQ2hhcnNldCBTdHJpbmcuIE51bGwgaXMgcmV0dXJuZWQgaWYgZ3Vlc3NpbmcgdGhlIHNvdXJjZSBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVzdGltYXRlZENoYXJzZXQoKSB7Ci0gICAgICAgIGlmIChtU3BlY2lmaWVkQ2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNwZWNpZmllZENoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChtVHlwZSkgewotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX0pQOgotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX0ZPTUE6Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQOgotICAgICAgICAgICAgICAgIHJldHVybiAiU0hJRlRfSklTIjsKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9BUFBMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVURi04IjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMTEyYi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgVkNhcmQgaGFuZGxpbmcgY29kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFV0aWxzIHsKLSAgICAvLyBOb3RlIHRoYXQgbm90IGFsbCB0eXBlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBtYXAvc2V0LCBzaW5jZSwgZm9yIGV4YW1wbGUsIFRZUEVfSE9NRV9GQVggaXMKLSAgICAvLyBjb252ZXJ0ZWQgdG8gdHdvIHBhcmFtZXRlciBTdHJpbmdzLiBUaGVzZSBvbmx5IGNvbnRhaW4gc29tZSBtaW5vciBmaWVsZHMgdmFsaWQgaW4gYm90aAotICAgIC8vIHZDYXJkIGFuZCBjdXJyZW50IChhcyBvZiAyMDA5LTA4LTA3KSBDb250YWN0cyBzdHJ1Y3R1cmUuIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNLbm93blBob25lVHlwZXNNYXBfSXRvUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHNLbm93blBob25lVHlwZU1hcF9TdG9JOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzTW9iaWxlUGhvbmVMYWJlbFNldDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX0NBUiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DQVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DQVIsIFBob25lLlRZUEVfQ0FSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX1BBR0VSLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIsIFBob25lLlRZUEVfUEFHRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfSVNETiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETiwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgCi0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFBob25lLlRZUEVfV09SSyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfT1RIRVIsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DQUxMQkFDSywKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX0NBTExCQUNLKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KAotICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ09NUEFOWV9NQUlOLCBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPLCBQaG9uZS5UWVBFX1JBRElPKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfVFRZX1RERCwKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX1RUWV9UREQpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQsCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9BU1NJU1RBTlQpOwotCi0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTU9ERU0pOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01TRyk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQkJTKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WSURFTyk7Ci0KLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0FJTSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BSU0pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX01TTiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9NU04pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1lBSE9PLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9TS1lQRSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfR09PR0xFX1RBTEssCi0gICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9HT09HTEVfVEFMSyk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfUVEsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUVEpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX05FVE1FRVRJTkcsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTkVUTUVFVElORyk7Ci0KLSAgICAgICAgLy8gXHU2NDNBXHU1RTJGXHU5NkZCXHU4QTcxID0gRnVsbC13aWR0aCBIaXJhZ2FuYSAiS2VpdGFpLURlbndhIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdTY0M0FcdTVFMkYgPSBGdWxsLXdpZHRoIEhpcmFnYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1MzBCMVx1MzBBNFx1MzBCRlx1MzBBNCA9IEZ1bGwtd2lkdGggS2F0YWthbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHVGRjc5XHVGRjcyXHVGRjgwXHVGRjcyID0gSGFsZi13aWR0aCBLYXRha2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICBzTW9iaWxlUGhvbmVMYWJlbFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAiTU9CSUxFIiwgIlx1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MSIsICJcdTY0M0FcdTVFMkYiLCAiXHUzMEIxXHUzMEE0XHUzMEJGXHUzMEE0IiwKLSAgICAgICAgICAgICAgICAiXHVGRjc5XHVGRjcyXHVGRjgwXHVGRjcyIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBob25lVHlwZVN0cmluZyhJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5nZXQodHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBJbnRlcmdlciB3aGVuIHRoZSBnaXZlbiB0eXBlcyBjYW4gYmUgcGFyc2VkIGFzIGtub3duIHR5cGUuIFJldHVybnMgU3RyaW5nIG9iamVjdAotICAgICAqIHdoZW4gbm90LCB3aGljaCBzaG91bGQgYmUgc2V0IHRvIGxhYmVsLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQaG9uZVR5cGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9uPFN0cmluZz4gdHlwZXMsCi0gICAgICAgICAgICBTdHJpbmcgbnVtYmVyKSB7Ci0gICAgICAgIGlmIChudW1iZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbnVtYmVyID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpc0ZheCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGhhc1ByZWYgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1ByZWYgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmF4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0bXAgPSBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5nZXQodHlwZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGVDYW5kaWRhdGUgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUWVBFX1BBR0VSIGlzIHByZWZlcmVkIHdoZW4gdGhlIG51bWJlciBjb250YWlucyBAIHN1cnJvbmRlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBwYWdlciBudW1iZXIgYW5kIGEgZG9tYWluIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvIDExMTFAZG9tYWluLmNvbQotICAgICAgICAgICAgICAgICAgICAgICAgLy8geCBAZG9tYWluLmNvbQotICAgICAgICAgICAgICAgICAgICAgICAgLy8geCAxMTExQAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4T2ZBdCA9IG51bWJlci5pbmRleE9mKCJAIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVDYW5kaWRhdGUgPT0gUGhvbmUuVFlQRV9QQUdFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAwIDwgaW5kZXhPZkF0ICYmIGluZGV4T2ZBdCA8IG51bWJlci5sZW5ndGgoKSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gUGhvbmUuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoaGFzUHJlZikgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX01BSU47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gVFlQRV9IT01FCi0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNGYXgpIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfSE9NRSkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0ZBWF9IT01FOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFBob25lLlRZUEVfV09SSykgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0ZBWF9XT1JLOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFBob25lLlRZUEVfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUl9GQVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIHJldHVybiBsYWJlbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb2JpbGVQaG9uZUxhYmVsKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgLy8gRGV0YWlsOiBVbnRpbCBEb251dCwgdGhlcmUgaXNuJ3QgVFlQRV9NT0JJTEUgZm9yIGVtYWlsIHdoaWxlIHRoZXJlIGlzIG5vdy4KLSAgICAgICAgLy8gICAgICAgICBUbyBzdXBwb3J0IG1vYmlsZSB0eXBlIGF0IHRoYXQgdGltZSwgdGhpcyBjdXN0b20gbGFiZWwgaGFkIGJlZW4gdXNlZC4KLSAgICAgICAgcmV0dXJuIChhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLkNvbnRhY3RNZXRob2RzQ29sdW1ucy5NT0JJTEVfRU1BSUxfVFlQRV9OQU1FLmVxdWFscyhsYWJlbCkKLSAgICAgICAgICAgICAgICB8fCBzTW9iaWxlUGhvbmVMYWJlbFNldC5jb250YWlucyhsYWJlbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSW5WMjFCdXRVbmtub3duVG9Db250YWN0c1Bob3RlVHlwZShmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuY29udGFpbnMobGFiZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZUZvckltKGZpbmFsIGludCBwcm90b2NvbCkgewotICAgICAgICByZXR1cm4gc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLmdldChwcm90b2NvbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzb3J0TmFtZUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbGlzdCA9IG5ldyBTdHJpbmdbM107Ci0gICAgICAgIGZpbmFsIGludCBuYW1lT3JkZXJUeXBlID0gVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZSh2Y2FyZFR5cGUpOwotICAgICAgICBzd2l0Y2ggKG5hbWVPcmRlclR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuTkFNRV9PUkRFUl9KQVBBTkVTRTogewotICAgICAgICAgICAgICAgIGlmIChjb250YWluc09ubHlQcmludGFibGVBc2NpaShmYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZ2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0WzBdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFswXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzJdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuTkFNRV9PUkRFUl9FVVJPUEU6IHsKLSAgICAgICAgICAgICAgICBsaXN0WzBdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzFdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UGhvbmVOdW1iZXJGb3JtYXQoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNKYXBhbmVzZURldmljZSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgcG9zdGFsIGRhdGEgaW50byB0aGUgYnVpbGRlciBvYmplY3QuCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBDb250YWN0c0NvbnRyYWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgZGVmaW5lZCBpbiB2Q2FyZC4KLSAgICAgKiBTbyBzb21lIGNvbnZlcnNpb24gbWF5IGJlIHBlcmZvcm1lZCBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgZmluYWwgVkNhcmRFbnRyeS5Qb3N0YWxEYXRhIHBvc3RhbERhdGEpIHsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFN0cnVjdHVyZWRQb3N0YWwuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKTsKLQotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIHBvc3RhbERhdGEudHlwZSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLnR5cGUgPT0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgcG9zdGFsRGF0YS5sYWJlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgc3RyZWV0U3RyaW5nOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocG9zdGFsRGF0YS5zdHJlZXQpKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocG9zdGFsRGF0YS5leHRlbmRlZEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWV0U3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWV0U3RyaW5nID0gcG9zdGFsRGF0YS5leHRlbmRlZEFkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocG9zdGFsRGF0YS5leHRlbmRlZEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWV0U3RyaW5nID0gcG9zdGFsRGF0YS5zdHJlZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0ICsgIiAiICsgcG9zdGFsRGF0YS5leHRlbmRlZEFkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgcG9zdGFsRGF0YS5wb2JveCk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCBzdHJlZXRTdHJpbmcpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksIHBvc3RhbERhdGEubG9jYWx0eSk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCBwb3N0YWxEYXRhLnJlZ2lvbik7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsIHBvc3RhbERhdGEucG9zdGFsQ29kZSk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgcG9zdGFsRGF0YS5jb3VudHJ5KTsKLQotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgIHBvc3RhbERhdGEuZ2V0Rm9ybWF0dGVkQWRkcmVzcyh2Y2FyZFR5cGUpKTsKLSAgICAgICAgaWYgKHBvc3RhbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLklTX1BSSU1BUlksIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUsIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lLCBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lKSB7Ci0gICAgICAgIHJldHVybiBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKHZjYXJkVHlwZSwgZmFtaWx5TmFtZSwgbWlkZGxlTmFtZSwgZ2l2ZW5OYW1lLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZUxpc3QgPSBzb3J0TmFtZUVsZW1lbnRzKHZjYXJkVHlwZSwgZmFtaWx5TmFtZSwgbWlkZGxlTmFtZSwgZ2l2ZW5OYW1lKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KSkgewotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbmFtZVBhcnQgOiBuYW1lTGlzdCkgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShuYW1lUGFydCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuYW1lUGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdWZmaXgpKSB7Ci0gICAgICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHN1ZmZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBjb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWMzApIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHZhbHVlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVuZXNjYXBlZFN0cmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIChpc1YzMCA/IFZDYXJkUGFyc2VyX1YzMC51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkUGFyc2VyX1YyMS51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpKTsKLSAgICAgICAgICAgICAgICBpZiAodW5lc2NhcGVkU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodW5lc2NhcGVkU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNQcmludGFibGVBc2NpaU9ubHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gY2hlY2tpbmcgdGhlIHN0cmluZyBzaG91bGQgYmUgZW5jb2RlZCBpbnRvIHF1b3RlZC1wcmludGFibGUKLSAgICAgKiBvciBub3QsIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IHZDYXJkIDIuMS4KLSAgICAgKiBTZWUgdGhlIGRlZmluaXRpb24gb2YgIjdiaXQiIGluIHZDYXJkIDIuMSBzcGVjIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKGFzY2lpRmlyc3QgPD0gYyAmJiBjIDw9IGFzY2lpTGFzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q2hhcmFjdGVyPiBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQgPQotICAgICAgICBuZXcgSGFzaFNldDxDaGFyYWN0ZXI+KEFycmF5cy5hc0xpc3QoJ1snLCAnXScsICc9JywgJzonLCAnLicsICcsJywgJyAnKSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCBzaW5jZSB2Q2FyZCAzLjAgb2Z0ZW4gcmVxdWlyZXMgdGhlICgiWC0iKSBwcm9wZXJ0aWVzIGFuZCBncm91cHMKLSAgICAgKiBzaG91bGQgY29udGFpbiBvbmx5IGFscGhhYmV0cywgZGlnaXRzLCBhbmQgaHlwaGVuLgotICAgICAqIAotICAgICAqIE5vdGU6IEl0IGlzIGFscmVhZHkga25vd24gc29tZSBkZXZpY2VzICh3cm9uZ2x5KSBvdXRwdXRzIHByb3BlcnRpZXMgd2l0aCBjaGFyYWN0ZXJzCi0gICAgICogICAgICAgd2hpY2ggc2hvdWxkIG5vdCBiZSBpbiB0aGUgZmllbGQuIE9uZSBleGFtcGxlIGlzICJYLUdPT0dMRSBUQUxLIi4gV2UgYWNjZXB0Ci0gICAgICogICAgICAgc3VjaCBraW5kIG9mIGlucHV0IGJ1dCBtdXN0IG5ldmVyIG91dHB1dCBpdCB1bmxlc3MgdGhlIHRhcmdldCBpcyB2ZXJ5IHNwZWNpZmljCi0gICAgICogICAgICAgdG8gdGhlIGRldmljZSB3aGljaCBpcyBhYmxlIHRvIHBhcnNlIHRoZSBtYWxmb3JtZWQgaW5wdXQuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCB1cHBlckFscGhhYmV0Rmlyc3QgPSAweDQxOyAgLy8gQQotICAgICAgICBmaW5hbCBpbnQgdXBwZXJBbHBoYWJldEFmdGVyTGFzdCA9IDB4NWI7ICAvLyBbCi0gICAgICAgIGZpbmFsIGludCBsb3dlckFscGhhYmV0Rmlyc3QgPSAweDYxOyAgLy8gYQotICAgICAgICBmaW5hbCBpbnQgbG93ZXJBbHBoYWJldEFmdGVyTGFzdCA9IDB4N2I7ICAvLyB7Ci0gICAgICAgIGZpbmFsIGludCBkaWdpdEZpcnN0ID0gMHgzMDsgIC8vIDAKLSAgICAgICAgZmluYWwgaW50IGRpZ2l0QWZ0ZXJMYXN0ID0gMHgzQTsgIC8vIDoKLSAgICAgICAgZmluYWwgaW50IGh5cGhlbiA9ICctJzsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgc3RyIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc3RyKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gc3RyLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgICAgIGludCBjb2RlcG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEoKGxvd2VyQWxwaGFiZXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgbG93ZXJBbHBoYWJldEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHVwcGVyQWxwaGFiZXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgdXBwZXJBbHBoYWJldEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRpZ2l0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IGRpZ2l0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAoY29kZXBvaW50ID09IGh5cGhlbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGdpdmVuIFN0cmluZyBpcyBjYXRlZ29yaXplZCBhcyAid29yZCIgc3BlY2lmaWVkIGluIHZDYXJkIHNwZWMgMi4xLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCAyLjEgc3BlY2lmaWVzOjxCUiAvPgotICAgICAqIHdvcmQgPSAmbHQ7YW55IHByaW50YWJsZSA3Yml0IHVzLWFzY2lpIGV4Y2VwdCBbXT06LiwgJmd0OwotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWMjFXb3JkKGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHZhbHVlLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGMgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgIGlmICghKGFzY2lpRmlyc3QgPD0gYyAmJiBjIDw9IGFzY2lpTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgc1VuQWNjZXB0YWJsZUFzY2lpSW5WMjFXb3JkU2V0LmNvbnRhaW5zKChjaGFyKWMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSGFsZldpZHRoU3RyaW5nKGZpbmFsIFN0cmluZyBvcmdTdHJpbmcpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG9yZ1N0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBvcmdTdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gb3JnU3RyaW5nLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgLy8gQWxsIEphcGFuZXNlIGNoYXJhY3RlciBpcyBhYmxlIHRvIGJlIGV4cHJlc3NlZCBieSBjaGFyLgotICAgICAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gdXNlIFN0cmluZyNjb2RlcFBvaW50QXQoKS4KLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBvcmdTdHJpbmcuY2hhckF0KGkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhhbGZXaWR0aFRleHQgPSBKYXBhbmVzZVV0aWxzLnRyeUdldEhhbGZXaWR0aFRleHQoY2gpOwotICAgICAgICAgICAgaWYgKGhhbGZXaWR0aFRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGhhbGZXaWR0aFRleHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHdWVzc2VzIHRoZSBmb3JtYXQgb2YgaW5wdXQgaW1hZ2UuIEN1cnJlbnRseSBqdXN0IHRoZSBmaXJzdCBmZXcgYnl0ZXMgYXJlIHVzZWQuCi0gICAgICogVGhlIHR5cGUgIkdJRiIsICJQTkciLCBvciAiSlBFRyIgaXMgcmV0dXJuZWQgd2hlbiBwb3NzaWJsZS4gUmV0dXJucyBudWxsIHdoZW4KLSAgICAgKiB0aGUgZ3Vlc3MgZmFpbGVkLgotICAgICAqIEBwYXJhbSBpbnB1dCBJbWFnZSBhcyBieXRlIGFycmF5LgotICAgICAqIEByZXR1cm4gVGhlIGltYWdlIHR5cGUgb3IgbnVsbCB3aGVuIHRoZSB0eXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1ZXNzSW1hZ2VUeXBlKGZpbmFsIGJ5dGVbXSBpbnB1dCkgewotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+PSAzICYmIGlucHV0WzBdID09ICdHJyAmJiBpbnB1dFsxXSA9PSAnSScgJiYgaW5wdXRbMl0gPT0gJ0YnKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkdJRiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubGVuZ3RoID49IDQgJiYgaW5wdXRbMF0gPT0gKGJ5dGUpIDB4ODkKLSAgICAgICAgICAgICAgICAmJiBpbnB1dFsxXSA9PSAnUCcgJiYgaW5wdXRbMl0gPT0gJ04nICYmIGlucHV0WzNdID09ICdHJykgewotICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMi4xIG9mZmljaWFsbHkgZG9lcyBub3Qgc3VwcG9ydCBQTkcsIGJ1dCB3ZSBtYXkgaGF2ZSBpdCBhbmQKLSAgICAgICAgICAgIC8vICAgICAgIHVzaW5nIFgtIHdvcmQgbGlrZSAiWC1QTkciIG1heSBub3QgbGV0IGltcG9ydGVycyBrbm93IGl0IGlzIFBORy4KLSAgICAgICAgICAgIC8vICAgICAgIFNvIHdlIHVzZSB0aGUgU3RyaW5nICJQTkciIGFzIGlzLi4uCi0gICAgICAgICAgICByZXR1cm4gIlBORyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubGVuZ3RoID49IDIgJiYgaW5wdXRbMF0gPT0gKGJ5dGUpIDB4ZmYKLSAgICAgICAgICAgICAgICAmJiBpbnB1dFsxXSA9PSAoYnl0ZSkgMHhkOCkgewotICAgICAgICAgICAgcmV0dXJuICJKUEVHIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUcnVlIHdoZW4gYWxsIHRoZSBnaXZlbiB2YWx1ZXMgYXJlIG51bGwgb3IgZW1wdHkgU3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlQWxsRW1wdHkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZFV0aWxzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmM3ZGYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTcyMTkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFZDYXJkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFZDYXJkRXhjZXB0aW9uIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkYjYyYy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDE1M2UuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2MyZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHRocm93biB3aGVuIFZDYXJkIGlzIG5lc3RlZCB3aXRob3V0IFZDYXJkUGFyc2VyJ3MgYmVpbmcgbm90aWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmFhNzc2My4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhhdCB0aGUgaW5wdXQgVkNhcmQgaXMgcHJvYmFibHkgdmFsaWQgZnJvbSB0aGUgdmlldyBvZgotICogc3BlY2lmaWNhdGlvbiBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBmcmFtZXdvcmsgZm9yIG5vdy4KLSAqIAotICogVGhpcyBpcyBhIGtpbmQgb2YgYSBnb29kIG5ld3MgZnJvbSB0aGUgdmlldyBvZiBkZXZlbG9wbWVudC4KLSAqIEl0IG1heSBiZSBnb29kIHRvIGFzayB1c2VycyB0byBzZW5kIGEgcmVwb3J0IHdpdGggdGhlIFZDYXJkIGV4YW1wbGUKLSAqIGZvciB0aGUgZnV0dXJlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU4YjdmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVkNhcmRFeGNlcHRpb24gdXNlZCBvbmx5IHdoZW4gdGhlIHZlcnNpb24gb2YgdGhlIHZDYXJkIGlzIGRpZmZlcmVudC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkVmVyc2lvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgcHVibGljIFZDYXJkVmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI4YTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI4YTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxIVE1MPgotPEJPRFk+Ci17QGhpZGV9Ci08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ1NTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHtAbGluayBQcmVmZXJlbmNlfSB0aGF0IGRpc3BsYXlzIGEgbGlzdCBvZiBlbnRyaWVzIGFzCisgKiBhIGRpYWxvZy4KKyAqIDxwPgorICogVGhpcyBwcmVmZXJlbmNlIHdpbGwgc3RvcmUgYSBzZXQgb2Ygc3RyaW5ncyBpbnRvIHRoZSBTaGFyZWRQcmVmZXJlbmNlcy4KKyAqIFRoaXMgc2V0IHdpbGwgY29udGFpbiBvbmUgb3IgbW9yZSB2YWx1ZXMgZnJvbSB0aGUKKyAqIHtAbGluayAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pfSBhcnJheS4KKyAqIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyaWVzCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIGV4dGVuZHMgRGlhbG9nUHJlZmVyZW5jZSB7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cmllczsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZVtdIG1FbnRyeVZhbHVlczsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1WYWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtTmV3VmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJlZmVyZW5jZUNoYW5nZWQ7CisgICAgCisgICAgcHVibGljIE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UsIDAsIDApOworICAgICAgICBtRW50cmllcyA9IGEuZ2V0VGV4dEFycmF5KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcyk7CisgICAgICAgIG1FbnRyeVZhbHVlcyA9IGEuZ2V0VGV4dEFycmF5KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cnlWYWx1ZXMpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGh1bWFuLXJlYWRhYmxlIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QuIFRoaXMgd2lsbCBiZQorICAgICAqIHNob3duIGluIHN1YnNlcXVlbnQgZGlhbG9ncy4KKyAgICAgKiA8cD4KKyAgICAgKiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4KKyAgICAgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJpZXMgVGhlIGVudHJpZXMuCisgICAgICogQHNlZSAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cmllcyhDaGFyU2VxdWVuY2VbXSBlbnRyaWVzKSB7CisgICAgICAgIG1FbnRyaWVzID0gZW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0RW50cmllcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cmllc1Jlc0lkIFRoZSBlbnRyaWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cmllcyhpbnQgZW50cmllc1Jlc0lkKSB7CisgICAgICAgIHNldEVudHJpZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyaWVzUmVzSWQpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgZW50cmllcyB0byBiZSBzaG93biBpbiB0aGUgbGlzdCBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgbGlzdCBhcyBhbiBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlW10gZ2V0RW50cmllcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyaWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgdG8gZmluZCB0aGUgdmFsdWUgdG8gc2F2ZSBmb3IgYSBwcmVmZXJlbmNlIHdoZW4gYW4gZW50cnkgZnJvbQorICAgICAqIGVudHJpZXMgaXMgc2VsZWN0ZWQuIElmIGEgdXNlciBjbGlja3Mgb24gdGhlIHNlY29uZCBpdGVtIGluIGVudHJpZXMsIHRoZQorICAgICAqIHNlY29uZCBpdGVtIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBzYXZlZCB0byB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXMgVGhlIGFycmF5IHRvIGJlIHVzZWQgYXMgdmFsdWVzIHRvIHNhdmUgZm9yIHRoZSBwcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdIGVudHJ5VmFsdWVzKSB7CisgICAgICAgIG1FbnRyeVZhbHVlcyA9IGVudHJ5VmFsdWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqIEBwYXJhbSBlbnRyeVZhbHVlc1Jlc0lkIFRoZSBlbnRyeSB2YWx1ZXMgYXJyYXkgYXMgYSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhpbnQgZW50cnlWYWx1ZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyeVZhbHVlcyhnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dEFycmF5KGVudHJ5VmFsdWVzUmVzSWQpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgdmFsdWVzIHRvIGJlIHNhdmVkIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJ5VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gbUVudHJ5VmFsdWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUga2V5LiBUaGlzIHNob3VsZCBjb250YWluIGVudHJpZXMgaW4KKyAgICAgKiB7QGxpbmsgI2dldEVudHJ5VmFsdWVzKCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBzZXQgZm9yIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICBtVmFsdWVzID0gdmFsdWVzOworICAgICAgICAKKyAgICAgICAgcGVyc2lzdFN0cmluZ1NldCh2YWx1ZXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gbVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHZhbHVlIChpbiB0aGUgZW50cnkgdmFsdWVzIGFycmF5KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHdob3NlIGluZGV4IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgdmFsdWUsIG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZpbmRJbmRleE9mVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG1FbnRyeVZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbUVudHJ5VmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbnRyeVZhbHVlc1tpXS5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZ0J1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHN1cGVyLm9uUHJlcGFyZURpYWxvZ0J1aWxkZXIoYnVpbGRlcik7CisgICAgICAgIAorICAgICAgICBpZiAobUVudHJpZXMgPT0gbnVsbCB8fCBtRW50cnlWYWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UgcmVxdWlyZXMgYW4gZW50cmllcyBhcnJheSBhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICJhbiBlbnRyeVZhbHVlcyBhcnJheS4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbltdIGNoZWNrZWRJdGVtcyA9IGdldFNlbGVjdGVkSXRlbXMoKTsKKyAgICAgICAgYnVpbGRlci5zZXRNdWx0aUNob2ljZUl0ZW1zKG1FbnRyaWVzLCBjaGVja2VkSXRlbXMsCisgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5Pbk11bHRpQ2hvaWNlQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZWZlcmVuY2VDaGFuZ2VkIHw9IG1OZXdWYWx1ZXMuYWRkKG1FbnRyaWVzW3doaWNoXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZWZlcmVuY2VDaGFuZ2VkIHw9IG1OZXdWYWx1ZXMucmVtb3ZlKG1FbnRyaWVzW3doaWNoXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBtTmV3VmFsdWVzLmNsZWFyKCk7CisgICAgICAgIG1OZXdWYWx1ZXMuYWRkQWxsKG1WYWx1ZXMpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW5bXSBnZXRTZWxlY3RlZEl0ZW1zKCkgeworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBlbnRyaWVzID0gbUVudHJpZXM7CisgICAgICAgIGZpbmFsIGludCBlbnRyeUNvdW50ID0gZW50cmllcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHZhbHVlcyA9IG1WYWx1ZXM7CisgICAgICAgIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltlbnRyeUNvdW50XTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSB2YWx1ZXMuY29udGFpbnMoZW50cmllc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EaWFsb2dDbG9zZWQoYm9vbGVhbiBwb3NpdGl2ZVJlc3VsdCkgeworICAgICAgICBzdXBlci5vbkRpYWxvZ0Nsb3NlZChwb3NpdGl2ZVJlc3VsdCk7CisgICAgICAgIAorICAgICAgICBpZiAocG9zaXRpdmVSZXN1bHQgJiYgbVByZWZlcmVuY2VDaGFuZ2VkKSB7CisgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtTmV3VmFsdWVzOworICAgICAgICAgICAgaWYgKGNhbGxDaGFuZ2VMaXN0ZW5lcih2YWx1ZXMpKSB7CisgICAgICAgICAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVByZWZlcmVuY2VDaGFuZ2VkID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3Qgb25HZXREZWZhdWx0VmFsdWUoVHlwZWRBcnJheSBhLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZGVmYXVsdFZhbHVlcyA9IGEuZ2V0VGV4dEFycmF5KGluZGV4KTsKKyAgICAgICAgZmluYWwgaW50IHZhbHVlQ291bnQgPSBkZWZhdWx0VmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoZGVmYXVsdFZhbHVlc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TZXRJbml0aWFsVmFsdWUoYm9vbGVhbiByZXN0b3JlVmFsdWUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc2V0VmFsdWVzKHJlc3RvcmVWYWx1ZSA/IGdldFBlcnNpc3RlZFN0cmluZ1NldChtVmFsdWVzKSA6IChTZXQ8U3RyaW5nPikgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgZmluYWwgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICBpZiAoaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2F2ZSBpbnN0YW5jZSBzdGF0ZQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyU3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUpOworICAgICAgICBteVN0YXRlLnZhbHVlcyA9IGdldFZhbHVlcygpOworICAgICAgICByZXR1cm4gbXlTdGF0ZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2F2ZWRTdGF0ZSBleHRlbmRzIEJhc2VTYXZlZFN0YXRlIHsKKyAgICAgICAgU2V0PFN0cmluZz4gdmFsdWVzOworICAgICAgICAKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBzb3VyY2UucmVhZFN0cmluZ0FycmF5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIGludCBzdHJpbmdDb3VudCA9IHN0cmluZ3MubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChzdHJpbmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nQXJyYXkodmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPiBDUkVBVE9SID0KKyAgICAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+KCkgeworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEKaW5kZXggMTk3ZDk3Ni4uMzgxZjc5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEKQEAgLTE2LDggKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQ2hhclNlcXVlbmNlczsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yOCw3ICsyNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkFic1NhdmVkU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzYsNiArMzQsMTAgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogLyoqCiAgKiBSZXByZXNlbnRzIHRoZSBiYXNpYyBQcmVmZXJlbmNlIFVJIGJ1aWxkaW5nCiAgKiBibG9jayBkaXNwbGF5ZWQgYnkgYSB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5fSBpbiB0aGUgZm9ybSBvZiBhCkBAIC0xMjUwLDYgKzEyNTIsNjEgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gcGVyc2lzdCBhIHNldCBvZiBTdHJpbmdzIHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgaWYgdGhpcyBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQsIGdldCBhbiBlZGl0b3IgZnJvbQorICAgICAqIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LCBwdXQgaW4gdGhlIHN0cmluZ3MsIGFuZCBjaGVjayBpZiB3ZSBzaG91bGQgY29tbWl0IChhbmQKKyAgICAgKiBjb21taXQgaWYgc28pLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBwZXJzaXN0LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LiAoVGhpcyBpcyBub3Qgd2hldGhlciB0aGUKKyAgICAgKiAgICAgICAgIHZhbHVlIHdhcyBwZXJzaXN0ZWQsIHNpbmNlIHdlIG1heSBub3QgbmVjZXNzYXJpbHkgY29tbWl0IGlmIHRoZXJlCisgICAgICogICAgICAgICB3aWxsIGJlIGEgYmF0Y2ggY29tbWl0IGxhdGVyLikKKyAgICAgKiBAc2VlICNnZXRQZXJzaXN0ZWRTdHJpbmcoU2V0KQorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdFN0cmluZ1NldChTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHNob3VsZFBlcnNpc3QoKSkgeworICAgICAgICAgICAgLy8gU2hvdWxkbid0IHN0b3JlIG51bGwKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuZXF1YWxzKGdldFBlcnNpc3RlZFN0cmluZ1NldChudWxsKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIGFscmVhZHkgdGhlcmUsIHNvIHRoZSBzYW1lIGFzIHBlcnNpc3RpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IG1QcmVmZXJlbmNlTWFuYWdlci5nZXRFZGl0b3IoKTsKKyAgICAgICAgICAgIGVkaXRvci5wdXRTdHJpbmdTZXQobUtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgIHRyeUNvbW1pdChlZGl0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGdldCBhIHBlcnNpc3RlZCBzZXQgb2YgU3RyaW5ncyBmcm9tIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IHRoZSBTaGFyZWRQcmVmZXJlbmNlcworICAgICAqIGZyb20gdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIGFuZCBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWZhdWx0UmV0dXJuVmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIGVpdGhlciB0aGUKKyAgICAgKiAgICAgICAgICAgIFByZWZlcmVuY2UgaXMgbm90IHBlcnNpc3RlbnQgb3IgdGhlIFByZWZlcmVuY2UgaXMgbm90IGluIHRoZQorICAgICAqICAgICAgICAgICAgc2hhcmVkIHByZWZlcmVuY2VzLgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGZyb20gdGhlIFNoYXJlZFByZWZlcmVuY2VzIG9yIHRoZSBkZWZhdWx0IHJldHVybgorICAgICAqICAgICAgICAgdmFsdWUuCisgICAgICogQHNlZSAjcGVyc2lzdFN0cmluZ1NldChTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KFNldDxTdHJpbmc+IGRlZmF1bHRSZXR1cm5WYWx1ZSkgeworICAgICAgICBpZiAoIXNob3VsZFBlcnNpc3QoKSkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRSZXR1cm5WYWx1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRTaGFyZWRQcmVmZXJlbmNlcygpLmdldFN0cmluZ1NldChtS2V5LCBkZWZhdWx0UmV0dXJuVmFsdWUpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGFuIGludCB0byB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBwZXJzaXN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKaW5kZXggNzI2NzkzZC4uNDY4Njk3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCkBAIC0yMyw3ICsyMywxMCBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogCiAvKioKICAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCkBAIC02OSwzMCArNzIsNDMgQEAKICAqIEFzIGEgY29udmVuaWVuY2UsIHRoaXMgYWN0aXZpdHkgaW1wbGVtZW50cyBhIGNsaWNrIGxpc3RlbmVyIGZvciBhbnkKICAqIHByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgaGllcmFyY2h5LCBzZWUKICAqIHtAbGluayAjb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UpfS4KLSAqIAorICoKICAqIEBzZWUgUHJlZmVyZW5jZQogICogQHNlZSBQcmVmZXJlbmNlU2NyZWVuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlQWN0aXZpdHkgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgaW1wbGVtZW50cwogICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gImFuZHJvaWQ6cHJlZmVyZW5jZXMiOwotICAgIAorCisgICAgLy8gZXh0cmFzIHRoYXQgYWxsb3cgYW55IHByZWZlcmVuY2UgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgYXMgcGFydCBvZiBhIHdpemFyZAorCisgICAgLy8gc2hvdyBCYWNrIGFuZCBOZXh0IGJ1dHRvbnM/IHRha2VzIGJvb2xlYW4gcGFyYW1ldGVyCisgICAgLy8gQmFjayB3aWxsIHRoZW4gcmV0dXJuIFJFU1VMVF9DQU5DRUxFRCBhbmQgTmV4dCBSRVNVTFRfT0sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0hPV19CVVRUT05fQkFSID0gImV4dHJhX3ByZWZzX3Nob3dfYnV0dG9uX2JhciI7CisKKyAgICAvLyBzcGVjaWZ5IGN1c3RvbSB0ZXh0IGZvciB0aGUgQmFjayBvciBOZXh0IGJ1dHRvbnMsIG9yIGNhdXNlIGEgYnV0dG9uIHRvIG5vdCBhcHBlYXIKKyAgICAvLyBhdCBhbGwgYnkgc2V0dGluZyBpdCB0byBudWxsCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQgPSAiZXh0cmFfcHJlZnNfc2V0X25leHRfdGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQgPSAiZXh0cmFfcHJlZnNfc2V0X2JhY2tfdGV4dCI7CisKKyAgICBwcml2YXRlIEJ1dHRvbiBtTmV4dEJ1dHRvbjsKKwogICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgbVByZWZlcmVuY2VNYW5hZ2VyOwotICAgIAorCiAgICAgcHJpdmF0ZSBCdW5kbGUgbVNhdmVkSW5zdGFuY2VTdGF0ZTsKIAogICAgIC8qKgogICAgICAqIFRoZSBzdGFydGluZyByZXF1ZXN0IGNvZGUgZ2l2ZW4gb3V0IHRvIHByZWZlcmVuY2UgZnJhbWV3b3JrLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9SRVFVRVNUX0NPREUgPSAxMDA7Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfUFJFRkVSRU5DRVMgPSAwOwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfQklORF9QUkVGRVJFTkNFUzoKICAgICAgICAgICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA1LDcgKzEyMSw0OSBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgCisKKyAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCBzaG93IEJhY2svTmV4dCBidXR0b25zCisgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfUFJFRlNfU0hPV19CVVRUT05fQkFSLCBmYWxzZSkpIHsKKworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYnV0dG9uX2Jhcikuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBCdXR0b24gYmFja0J1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYmFja19idXR0b24pOworICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubmV4dF9idXR0b24pOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBzZXQgb3VyIHZhcmlvdXMgYnV0dG9uIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYnV0dG9uVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRUZXh0KGJ1dHRvblRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKTsKICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRTY3JvbGxCYXJTdHlsZShWaWV3LlNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkpOwogICAgIH0KQEAgLTExMywxNCArMTcxLDEzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgICAgCisKICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgewogICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKLSAgICAgICAgCiAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOwogICAgIH0KIApAQCAtMTU2LDcgKzIxMyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgICAgICBzdXBlci5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKLSAgICAgICAgCisKICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwogICAgIH0KIApAQCAtMTc2LDcgKzIzMyw3IEBACiAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CkBAIC0xODcsMTAgKzI0NCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgogICAgICAqLwogICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgb25DcmVhdGVQcmVmZXJlbmNlTWFuYWdlcigpIHsKQEAgLTE5OCw3ICsyNTUsNyBAQAogICAgICAgICBwcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCkBAIC0yMDYsNyArMjYzLDcgQEAKICAgICBwdWJsaWMgUHJlZmVyZW5jZU1hbmFnZXIgZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpIHsKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOwpAQCAtMjE1LDcgKzI3Miw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgc2hvd2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlU2NyZWVuIFRoZSByb290IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4pIHsKQEAgLTIyOCwzNyArMjg1LDM3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgc2hvd2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB0aGF0IGlzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlCiAgICAgICogICAgICAgICBoaWVyYXJjaHkuCiAgICAgICovCiAgICAgcHVibGljIFByZWZlcmVuY2VTY3JlZW4gZ2V0UHJlZmVyZW5jZVNjcmVlbigpIHsKICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWRkcyBwcmVmZXJlbmNlcyBmcm9tIGFjdGl2aXRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4ge0BsaW5rIEludGVudH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSBhY3Rpdml0aWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbUludGVudChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CiAgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKICAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tUmVzb3VyY2UodGhpcywgcHJlZmVyZW5jZXNSZXNJZCwKICAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKICAgICB9CkBAIC0yNjksMjAgKzMyNiwyMCBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgogICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKICAgICAgKi8KICAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOwogICAgIH0KIApAQCAtMjkyLDUgKzM0OSwxNCBAQAogICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoTmV3SW50ZW50KGludGVudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvLyBnaXZlIHN1YmNsYXNzZXMgYWNjZXNzIHRvIHRoZSBOZXh0IGJ1dHRvbgorICAgIC8qKiBAaGlkZSAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRCdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtTmV4dEJ1dHRvbiAhPSBudWxsOworICAgIH0KKyAgICAvKiogQGhpZGUgKi8KKyAgICBwcm90ZWN0ZWQgQnV0dG9uIGdldE5leHRCdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtTmV4dEJ1dHRvbjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQppbmRleCA5YTA5ODA1Li43NGFjYjk4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKQEAgLTc2LDExICs3Niw4NyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOwogCisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZvciBTeW5jIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVCA9ICJfc3luY19hY2NvdW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVF9UWVBFID0gIl9zeW5jX2FjY291bnRfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIHVzZSBieSBzeW5jIGFkYXB0ZXIgYXQgaXRzIGRpc2NyZXRpb247IG5vdCBtb2RpZmllZCBieSBDYWxlbmRhclByb3ZpZGVyCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbHVtbiB3YXMgZm9ybWVybHkgbmFtZWQgX1NZTkNfTE9DQUxfSUQuICBXZSBhcmUgdXNpbmcgaXQgdG8gYXZvaWQgYQorICAgICAgICAgKiBzY2hlbWEgY2hhbmdlLgorICAgICAgICAgKiBUT0RPIFJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19EQVRBID0gIl9zeW5jX2xvY2FsX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RJUlRZID0gIl9zeW5jX2RpcnR5IjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQWNjb3VudCBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIENhbGVuZGFycyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyc0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoY29sb3IgdmFsdWUpPC9QPgpAQCAtMTM1LDc1ICsyMTEsMTA0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfU1RBVEUgPSAic3luY19zdGF0ZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQuICBBIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgotICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKLSAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KLSAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFRCA9ICJkZWxldGVkIjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBDYWxlbmRhciBFbnRpdHkuIFRoZXJlIGlzIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9jYWxlbmRhcl9lbnRpdGllcyIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHJlc29sdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwKKyAgICAgICAgICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5SXRlcmF0b3JJbXBsIGV4dGVuZHMgQ3Vyc29yRW50aXR5SXRlcmF0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UHJvdmlkZXJDbGllbnQgbVByb3ZpZGVyOworCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEVudGl0eSBnZXRFbnRpdHlBbmRJbmNyZW1lbnRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IHRoZSBjdXJzb3IgaXMgYWxyZWFkeSBhdCB0aGUgcm93IHdlIG5lZWQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBjYWxlbmRhcklkID0gY3Vyc29yLmdldExvbmcoY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhfSUQpKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGVudCB2YWx1ZQorICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIGN2LnB1dChfSUQsIGNhbGVuZGFySWQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVF9UWVBFKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19USU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19NQVJLKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TRUxGX1VSTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5FRElUX1VSTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5FVkVOVFNfVVJMKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5OQU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkRJU1BMQVlfTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkhJRERFTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkNPTE9SKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBQ0NFU1NfTEVWRUwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNFTEVDVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTWU5DX0VWRU5UUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBUSU1FWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PV05FUl9BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9SR0FOSVpFUl9DQU5fUkVTUE9ORCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgRW50aXR5IGZyb20gdGhlIENvbnRlbnRWYWx1ZQorICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKKworICAgICAgICAgICAgICAgIC8vIFNldCBjdXJzb3IgdG8gbmV4dCByb3cKKyAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvTmV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIEVudGl0eQorICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCiAgICAgICogQ29udGFpbnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjYWxlbmRhcnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIENhbGVuZGFyc0NvbHVtbnMKICAgICB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ERUxFVEVfRk9SX0FDQ09VTlQgPSBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVCArICI9PyIKICAgICAgICAgICAgICAgICArICIgQU5EICIgKyBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVF9UWVBFICsgIj0/IjsKQEAgLTI1OCw2ICszNjMsMjQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBpdHNlbGYKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfVVJMID0gInNlbGZVcmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgdG8gYmUgZWRpdGVkCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1VSTCA9ICJlZGl0VXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGV2ZW50cworICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRTX1VSTCA9ICJldmVudHNVcmwiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCkBAIC0yOTYsNiArNDE5LDkgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHQU5JWkVSX0NBTl9SRVNQT05EID0gIm9yZ2FuaXplckNhblJlc3BvbmQiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQXR0ZW5kZWVzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgQXR0ZW5kZWVzQ29sdW1ucyB7CiAKICAgICAgICAgLyoqCkBAIC0zNjEsOCArNDg3LDcgQEAKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50cyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjYWxlbmRhciB0aGUgZXZlbnQgYmVsb25ncyB0bwogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChmb3JlaWduIGtleSB0byB0aGUgQ2FsZW5kYXJzIHRhYmxlKTwvUD4KQEAgLTQzOCw2ICs1NjMsMTggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQgPSAiZHRlbmQiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgc3RhcnRzIHdpdGggYWxsRGF5IGV2ZW50cyBpbiBhIGxvY2FsIHR6CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUMiA9ICJkdHN0YXJ0MiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBlbmRzIHdpdGggYWxsRGF5IGV2ZW50cyBpbiBhIGxvY2FsIHR6CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORDIgPSAiZHRlbmQyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChkdXJhdGlvbiBpbiBSRkMyNDQ1IGZvcm1hdCk8L1A+CiAgICAgICAgICAqLwpAQCAtNDUwLDYgKzU4NywxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORSA9ICJldmVudFRpbWV6b25lIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWV6b25lIGZvciB0aGUgZXZlbnQsIGFsbERheSBldmVudHMgd2lsbCBoYXZlIGEgbG9jYWwgdHogaW5zdGVhZCBvZiBVVEMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUyID0gImV2ZW50VGltZXpvbmUyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgbGFzdHMgYWxsIGRheSBvciBub3QKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwpAQCAtNTk4LDcgKzc0MSw4IEBACiAgICAgLyoqCiAgICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCiAgICAgICAgICAqLwpAQCAtNzAzLDggKzg0Nyw5IEBACiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RJUlRZKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuVVJMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFdmVudHNDb2x1bW5zLkRFTEVURUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuRVZFTlRTX1VSTCk7CiAKICAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7CiAgICAgICAgICAgICAgICAgQ3Vyc29yIHN1YkN1cnNvcjsKQEAgLTc5NSw3ICs5NDAsOCBAQAogICAgIC8qKgogICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBFdmVudHNDb2x1bW5zIHsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGRVRDSF9FTlRSWV9DT0xVTU5TID0KICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBFdmVudHMuX1NZTkNfQUNDT1VOVCwgRXZlbnRzLl9TWU5DX0lEIH07CkBAIC05ODEsNyArMTEyNyw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9FVkVOVERBWVMgPSAibWF4RXZlbnREYXlzIjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMsIEJhc2VDb2x1bW5zIHsKICAgICB9CiAKICAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50RGF5c0NvbHVtbnMgewpAQCAtMTM3OSw0ICsxNTI1LDQzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KICAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChDYWxlbmRhci5DT05URU5UX1VSSSwgQ09OVEVOVF9ESVJFQ1RPUlkpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzUmF3VGltZXMgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29ycmVzcG9uZGluZyBldmVudCBpZAorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IHN0YXJ0cworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVF8yNDQ1ID0gImR0c3RhcnQyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IGVuZHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EXzI0NDUgPSAiZHRlbmQyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IG9yaWdpbmFsIGluc3RhbmNlIHRpbWUgb2YgdGhlIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcworICAgICAgICAgKiBldmVudCBpcyBhbiBleGNlcHRpb24uCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JTlNUQU5DRV9USU1FXzI0NDUgPSAib3JpZ2luYWxJbnN0YW5jZVRpbWUyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IGxhc3QgZGF0ZSB0aGlzIGV2ZW50IHJlcGVhdHMgb24sIG9yIE5VTEwgaWYgaXQgbmV2ZXIgZW5kcworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9EQVRFXzI0NDUgPSAibGFzdERhdGUyNDQ1IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c1Jhd1RpbWVzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCmluZGV4IDQwYTQwOGEuLjIxOGYyMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKQEAgLTEzMCw2ICsxMzAsMTcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUSU5HX1BBQ0tBR0VfUEFSQU1fS0VZID0gInJlcXVlc3RpbmdfcGFja2FnZSI7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgY2xpZW50IHRvIGFjY2VzcyBhIHNwZWNpZmljCisgICAgICoge0BsaW5rIERpcmVjdG9yeX0uIFRoZSBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIGJlIHRoZSBfSUQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBkaXJlY3RvcnksIGUuZy4KKyAgICAgKiB7QGNvZGUgY29udGVudDovL2NvbS5hbmRyb2lkLmNvbnRhY3RzL2RhdGEvZW1haWxzL2ZpbHRlci9hY21lP2RpcmVjdG9yeT0zfQorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfUEFSQU1fS0VZID0gImRpcmVjdG9yeSI7CisKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmVmZXJlbmNlcyB7CkBAIC0xODEsNiArMTkyLDIyNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEEgRGlyZWN0b3J5IHJlcHJlc2VudHMgYSBjb250YWN0cyBjb3JwdXMsIGUuZy4gTG9jYWwgY29udGFjdHMsCisgICAgICogR29vZ2xlIEFwcHMgR2xvYmFsIEFkZHJlc3MgTGlzdCBvciBDb3Jwb3JhdGUgR2xvYmFsIEFkZHJlc3MgTGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIERpcmVjdG9yeSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBpdHMgdW5pcXVlIGF1dGhvcml0eSBhbmQKKyAgICAgKiB0aGUgc2FtZSBBUEkgYXMgdGhlIG1haW4gQ29udGFjdHMgUHJvdmlkZXIuICBIb3dldmVyLCB0aGVyZSBpcyBubyBleHBlY3RhdGlvbiB0aGF0CisgICAgICogZXZlcnkgZGlyZWN0b3J5IHByb3ZpZGVyIHdpbGwgaW1wbGVtZW50IHRoaXMgQ29udHJhY3QgaW4gaXRzIGVudGlyZXR5LiAgSWYgYQorICAgICAqIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGZvciBhIHNwZWNpZmljIHJlcXVlc3QsIGl0CisgICAgICogc2hvdWxkIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9zdCBpbXBvcnRhbnQgdXNlIGNhc2UgZm9yIERpcmVjdG9yaWVzIGlzIHNlYXJjaC4gIEEgRGlyZWN0b3J5IHByb3ZpZGVyIGlzCisgICAgICogZXhwZWN0ZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCB7QGxpbmsgQ29udGFjdHMjQ09OVEVOVF9GSUxURVJfVVJJCisgICAgICogQ29udGFjdHMjQ09OVEVOVF9GSUxURVJfVVJJfS4gIElmIGEgRGlyZWN0b3J5IHByb3ZpZGVyIHdhbnRzIHRvIHBhcnRpY2lwYXRlCisgICAgICogaW4gZW1haWwgYW5kIHBob25lIGxvb2t1cCBmdW5jdGlvbmFsaXRpZXMsIGl0IHNob3VsZCBhbHNvIGltcGxlbWVudAorICAgICAqIHtAbGluayBDb21tb25EYXRhS2luZHMuRW1haWwjQ09OVEVOVF9GSUxURVJfVVJJIENvbW1vbkRhdGFLaW5kcy5FbWFpbC5DT05URU5UX0ZJTFRFUl9VUkl9CisgICAgICogYW5kCisgICAgICoge0BsaW5rIENvbW1vbkRhdGFLaW5kcy5QaG9uZSNDT05URU5UX0ZJTFRFUl9VUkkgQ29tbW9uRGF0YUtpbmRzLlBob25lLkNPTlRFTlRfRklMVEVSX1VSSX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgZGlyZWN0b3J5IHByb3ZpZGVyIHNob3VsZCByZXR1cm4gTlVMTCBmb3IgZXZlcnkgcHJvamVjdGlvbiBmaWVsZCBpdCBkb2VzIG5vdAorICAgICAqIHJlY29nbml6ZSwgcmF0aGVyIHRoYW4gdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgVGhpcyB3YXkgaXQgd2lsbCBub3QgYmUgYnJva2VuCisgICAgICogaWYgQ29udGFjdHNDb250cmFjdCBpcyBleHRlbmRlZCB3aXRoIG5ldyBmaWVsZHMgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGNsaWVudCBpbnRlcmFjdHMgd2l0aCBhIGRpcmVjdG9yeSB2aWEgQ29udGFjdHMgUHJvdmlkZXIgYnkgc3VwcGx5aW5nIGFuCisgICAgICogb3B0aW9uYWwge0Bjb2RlIGRpcmVjdG9yeT19IHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoZSBDb250YWN0cyBQcm92aWRlciByZWNlaXZlcyB0aGUgcmVxdWVzdCwgaXQgdHJhbnNmb3JtcyB0aGUgVVJJIGFuZCBmb3J3YXJkcworICAgICAqIHRoZSByZXF1ZXN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIFRoZSBVUkkgaXMgdHJhbnNmb3JtZWQgaW4gdGhlIGZvbGxvd2luZyBmYXNoaW9uOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+VGhlIFVSSSBhdXRob3JpdHkgaXMgcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgI0RJUkVDVE9SWV9BVVRIT1JJVFl9LjwvbGk+CisgICAgICogPGxpPlRoZSB7QGNvZGUgYWNjb3VudE5hbWU9fSBhbmQge0Bjb2RlIGFjY291bnRUeXBlPX0gcGFyYW1ldGVycyBhcmUgYWRkZWQgb3IKKyAgICAgKiByZXBsYWNlZCB1c2luZyB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gYW5kIHtAbGluayAjQUNDT1VOVF9OQU1FfSB2YWx1ZXMuPC9saT4KKyAgICAgKiA8bGk+SWYgdGhlIFVSSSBpcyBtaXNzaW5nIGEge0BsaW5rIENvbnRhY3RzQ29udHJhY3QjUkVRVUVTVElOR19QQUNLQUdFX1BBUkFNX0tFWX0KKyAgICAgKiBwYXJhbWV0ZXIsIHRoaXMgcGFyYW1ldGVyIGlzIGFkZGVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2xpZW50cyBzaG91bGQgc2VuZCBkaXJlY3RvcnkgcmVxdWVzdHMgdG8gQ29udGFjdHMgUHJvdmlkZXIgYW5kIGxldCBpdAorICAgICAqIGZvcndhcmQgdGhlbSB0byB0aGUgcmVzcGVjdGl2ZSBwcm92aWRlcnMgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIGRpcmVjdG9yeSBwcm92aWRlcgorICAgICAqIFVSSXMgYnkgdGhlbXNlbHZlcy4gIFRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYWxsb3dzIENvbnRhY3RzIFByb3ZpZGVyIHRvCisgICAgICogaW1wbGVtZW50IGFkZGl0aW9uYWwgc3lzdGVtLWxldmVsIGZlYXR1cmVzIGFuZCBvcHRpbWl6YXRpb25zLgorICAgICAqIEFsc28sIGRpcmVjdG9yeSBwcm92aWRlcnMgbWF5IHJlamVjdCByZXF1ZXN0cyBjb21pbmcgZnJvbSBvdGhlcgorICAgICAqIGNsaWVudHMgdGhhbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgaXRzZWxmLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgRGlyZWN0b3J5IHRhYmxlIGFsd2F5cyBoYXMgYXQgbGVhc3QgdGhlc2UgdHdvIHJvd3M6CisgICAgICogPHVsPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGUgbG9jYWwgZGlyZWN0b3J5LiBJdCBoYXMge0BsaW5rIERpcmVjdG9yeSNfSUQgRGlyZWN0b3J5Ll9JRH0gPQorICAgICAqIHtAbGluayBEaXJlY3RvcnkjREVGQVVMVCBEaXJlY3RvcnkuREVGQVVMVH0uIFRoaXMgZGlyZWN0b3J5IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBsb2NhbGx5CisgICAgICogc3RvcmVkIGNvbnRhY3RzLiBUaGUgc2FtZSBjYW4gYmUgYWNoaWV2ZWQgYnkgb21pdHRpbmcgdGhlIHtAY29kZSBkaXJlY3Rvcnk9fQorICAgICAqIHBhcmFtZXRlciBhbHRvZ2V0aGVyLgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIFRoZSBsb2NhbCBpbnZpc2libGUgY29udGFjdHMuIFRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSBJRCBpcworICAgICAqIHtAbGluayBEaXJlY3RvcnkjTE9DQUxfSU5WSVNJQkxFIERpcmVjdG9yeS5MT0NBTF9JTlZJU0lCTEV9LgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogT3RoZXIgZGlyZWN0b3JpZXMgc2hvdWxkIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgYnkgZXhwbGljaXRseSBhZGRpbmcgcm93cyB0byB0aGlzIHRhYmxlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgcm93IGlzIGluc2VydGVkIGluIHRoaXMgdGFibGUsIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlCisgICAgICogKGFwaykgdGhhdCBtYWRlIHRoZSByZXF1ZXN0LiAgSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIGFsbCBkaXJlY3Rvcnkgcm93cworICAgICAqIGl0IGluc2VydGVkIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgZGlyZWN0b3J5IHJvdyBjYW4gYmUgb3B0aW9uYWxseSBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudC4KKyAgICAgKiBJZiB0aGUgYWNjb3VudCBpcyBsYXRlciByZW1vdmVkLCB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgcm93cyBhcmUKKyAgICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERpcmVjdG9yeSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogTm90IGluc3RhbnRpYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgRGlyZWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZS4gIFJlcXVlc3RzIHRvIHRoaXMgVVJJIGNhbiBiZQorICAgICAgICAgKiBwZXJmb3JtZWQgb24gdGhlIFVJIHRocmVhZCBiZWNhdXNlIHRoZXkgYXJlIGFsd2F5cyB1bmJsb2NraW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJkaXJlY3RvcmllcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRS10eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZgorICAgICAgICAgKiBjb250YWN0IGRpcmVjdG9yaWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0KKyAgICAgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9jb250YWN0X2RpcmVjdG9yaWVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRSA9CisgICAgICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2NvbnRhY3RfZGlyZWN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBvd25zIHRoaXMgZGlyZWN0b3J5LiBUaGlzIGZpZWxkIGlzCisgICAgICAgICAqIHJlcXVpcmVkIGluIGFuIGluc2VydCByZXF1ZXN0IGFuZCBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCisgICAgICAgICAqIG1ha2luZyB0aGUgcmVxdWVzdC4gSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIHRoZQorICAgICAgICAgKiBkaXJlY3RvcmllcyBpdCBvd25zIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLiBPbmx5CisgICAgICAgICAqIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBpcyBhbGxvd2VkIHRvIG1vZGlmeSBvciBkZWxldGUgdGhpcyByb3cgbGF0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IFRFWFQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBkaXJlY3RvcnkgY2FwdHVyZWQgYXMgYSByZXNvdXJjZSBJRCBpbiB0aGUgY29udGV4dCBvZiB0aGUKKyAgICAgICAgICogcGFja2FnZSB7QGxpbmsgI1BBQ0tBR0VfTkFNRX0sIGUuZy4gIkNvcnBvcmF0ZSBEaXJlY3RvcnkiCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IElOVEVHRVI8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1JFU09VUkNFX0lEID0gInR5cGVSZXNvdXJjZUlkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBVSSB0byByZXByZXNlbnQgdGhpcyBkaXJlY3RvcnksCisgICAgICAgICAqIGUuZy4gIkFjbWUgQ29ycCIKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5TmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhdXRob3JpdHkgdG8gd2hpY2ggdGhlIHJlcXVlc3Qgc2hvdWxkIGZvcndhcmRlZCBpbiBvcmRlciB0byBhY2Nlc3MKKyAgICAgICAgICogdGhpcyBkaXJlY3RvcnkuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfQVVUSE9SSVRZID0gImF1dGhvcml0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHR5cGUgd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50VHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHdpdGggd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4gSWYgdGhlIGFjY291bnQgaXMgbGF0ZXIKKyAgICAgICAgICogcmVtb3ZlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudE5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmUgb2Yge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVH0sCisgICAgICAgICAqIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFl9LiBUaGlzIGlzIHRoZSBleHBlY3RhdGlvbiB0aGUKKyAgICAgICAgICogZGlyZWN0b3J5IGhhcyBmb3IgZGF0YSBleHBvcnRlZCBmcm9tIGl0LiAgQ2xpZW50cyBtdXN0IG9iZXkgdGhpcyBzZXR0aW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1NVUFBPUlQgPSAiZXhwb3J0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGRvZXMgbm90IGFsbG93IGFueSBkYXRhIHRvIGJlIGNvcGllZCBvdXQgb2YgaXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9OT05FID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNFWFBPUlRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgaXRzIGRhdGEgY29waWVkIG9ubHkgdG8gdGhlIGFjY291bnQgc3BlY2lmaWVkIGJ5CisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfS97QGxpbmsgI0FDQ09VTlRfTkFNRX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCB0byBhbnkgY29udGFjdHMgYWNjb3VudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogX0lEIG9mIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSwgd2hpY2ggcmVwcmVzZW50cyBsb2NhbGx5IHN0b3JlZCBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogX0lEIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCByZXByZXNlbnRzIGxvY2FsbHkgc3RvcmVkIGludmlzaWJsZSBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBMT0NBTF9JTlZJU0lCTEUgPSAxOworICAgIH0KKworICAgIC8qKgogICAgICAqIEBoaWRlIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gdXNlcnMgYXJlIHVwZGF0ZWQgdG8gcmVmZXIgdG8gU3luY1N0YXRlCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIFN5bmNTdGF0ZSBpbnN0ZWFkCiAgICAgICovCkBAIC00OTAyLDYgKzUxMzQsMjMgQEAKICAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9TWU5DID0gInNob3VsZF9zeW5jIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW55IG5ld2x5IGNyZWF0ZWQgY29udGFjdHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGdyb3VwcyB0aGF0IGhhdmUgdGhpcworICAgICAgICAgKiBmbGFnIHNldCB0byB0cnVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fQUREID0gImF1dG9fYWRkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBhIGNvbnRhY3RzIGlzIG1hcmtlZCBhcyBhIGZhdm9yaXRlcyBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQKKyAgICAgICAgICogdG8gdGhlIGdyb3VwcyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldCwgYW5kIHdoZW4gaXQgaXMgcmVtb3ZlZCBmcm9tIGZhdm9yaXRlcworICAgICAgICAgKiBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVzZSBncm91cHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWT1JJVEVTID0gImZhdm9yaXRlcyI7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MDQyLDYgKzUyOTEsOCBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgREVMRVRFRCk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIE5PVEVTKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgU0hPVUxEX1NZTkMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBGQVZPUklURVMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBBVVRPX0FERCk7CiAgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eSh2YWx1ZXMpOwogICAgICAgICAgICAgfQpAQCAtNTU1OCw2ICs1ODA5LDI4IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5TSE9XX09SX0NSRUFURV9DT05UQUNUIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnRzIGFuIEFjdGl2aXR5IHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3QgdGhlIG11bHRpcGxlIHBob25lcyBmcm9tIGEKKyAgICAgICAgICogbGlzdCBvZiBwaG9uZSBudW1iZXJzIHdoaWNoIGNvbWUgZnJvbSB0aGUgY29udGFjdHMgb3IKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIGJlaW5nIHBhc3NlZCBpbiB0aHJvdWdoIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30KKyAgICAgICAgICogY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QsIGFuZCB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgdXNlcidzIHNlbGVjdGlvbiB3aWxsIGJlIHJldHVybmVkIGZyb20KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQWN0aXZpdHlSZXN1bHQoaW50LCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQorICAgICAgICAgKiBpZiB0aGUgcmVzdWx0Q29kZSBpcworICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX09LfSwgdGhlIGFycmF5IG9mIHBpY2tlZCBwaG9uZQorICAgICAgICAgKiBudW1iZXJzIGFyZSBpbiB0aGUgSW50ZW50J3MKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfTsgb3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9DQU5DRUxFRH0gaXMgcmV0dXJuZWQgaWYgdGhlIHVzZXIKKyAgICAgICAgICogbGVmdCB0aGUgQWN0aXZpdHkgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVMgPQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uR0VUX01VTFRJUExFX1BIT05FUyI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI1NIT1dfT1JfQ1JFQVRFX0NPTlRBQ1R9IHRvIGZvcmNlIGNyZWF0aW5nIGEgbmV3CiAgICAgICAgICAqIGNvbnRhY3QgaWYgbm8gbWF0Y2hpbmcgY29udGFjdCBmb3VuZC4gT3RoZXJ3aXNlLCBkZWZhdWx0IGJlaGF2aW9yIGlzCiAgICAgICAgICAqIHRvIHByb21wdCB1c2VyIHdpdGggZGlhbG9nIGJlZm9yZSBjcmVhdGluZy4KQEAgLTU1NzgsNiArNTg1MSwyMyBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5DUkVBVEVfREVTQ1JJUFRJT04iOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fR0VUX01VTFRJUExFX1BIT05FU30gYXMgdGhlIGlucHV0IG9yIG91dHB1dCB2YWx1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdhbnQgdG8gYmUgcGlja2VkIGJ5IGRlZmF1bHQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcworICAgICAgICAgKiBpbnB1dCB2YWx1ZS4gVGhlc2UgcGhvbmUgbnVtYmVycyBjb3VsZCBiZWxvbmcgdG8gdGhlIGNvbnRhY3RzIG9yIG5vdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdoaWNoIHdlcmUgcGlja2VkIGJ5IHRoZSB1c2VyIGFyZSByZXR1cm5lZCBhcyBvdXRwdXQKKyAgICAgICAgICogdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBhcnJheSBvZiBVUklzLCB0aGUgdGVsIFVSSSBpcyB1c2VkIGZvciB0aGUgcGhvbmUgbnVtYmVycyB3aGljaCBkb24ndAorICAgICAgICAgKiBiZWxvbmcgdG8gYW55IGNvbnRhY3QsIHRoZSBjb250ZW50IFVSSSBpcyB1c2VkIGZvciBwaG9uZSBpZCBpbiBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BIT05FX1VSSVMgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmV4dHJhLlBIT05FX1VSSVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBPcHRpb25hbCBleHRyYSB1c2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBzcGVjaWZ5IGEKICAgICAgICAgICogZGlhbG9nIGxvY2F0aW9uIHVzaW5nIHNjcmVlbiBjb29yZGluYXRlcy4gV2hlbiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICogZGlhbG9nIHdpbGwgYmUgY2VudGVyZWQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKaW5kZXggNDBlZDk4MC4uOWEzYzYxOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQpAQCAtMzE3LDIyICszMTcsMjMgQEAKICAgICAgICAgICAgIC8vIExvZy52KFRBRywgImdldFRodW1ibmFpbDogb3JpZ0lkPSIrb3JpZ0lkKyIsIGtpbmQ9IitraW5kKyIsIGlzVmlkZW89Iitpc1ZpZGVvKTsKICAgICAgICAgICAgIC8vIElmIHRoZSBtYWdpYyBpcyBub24temVybywgd2Ugc2ltcGx5IHJldHVybiB0aHVtYm5haWwgaWYgaXQgZG9lcyBleGlzdC4KICAgICAgICAgICAgIC8vIHF1ZXJ5aW5nIE1lZGlhUHJvdmlkZXIgYW5kIHNpbXBseSByZXR1cm4gdGh1bWJuYWlsLgotICAgICAgICAgICAgTWluaVRodW1iRmlsZSB0aHVtYkZpbGUgPSBNaW5pVGh1bWJGaWxlLmluc3RhbmNlKGJhc2VVcmkpOwotICAgICAgICAgICAgbG9uZyBtYWdpYyA9IHRodW1iRmlsZS5nZXRNYWdpYyhvcmlnSWQpOwotICAgICAgICAgICAgaWYgKG1hZ2ljICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOwotICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgZGF0YSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IG5ldyBNaW5pVGh1bWJGaWxlKGlzVmlkZW8gPyBWaWRlby5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSQorICAgICAgICAgICAgICAgICAgICA6IEltYWdlcy5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSSk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW01pbmlUaHVtYkZpbGUuQllURVNfUEVSX01JTlRIVU1CXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHVtYkZpbGUuZ2V0TWluaVRodW1iRnJvbUZpbGUob3JpZ0lkLCBkYXRhKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjb3VsZG4ndCBkZWNvZGUgYnl0ZSBhcnJheS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTUlOSV9LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IGlzVmlkZW8gPyAidmlkZW9faWQ9IiA6ICJpbWFnZV9pZD0iOwogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJhc2VVcmksIFBST0pFQ1RJT04sIGNvbHVtbiArIG9yaWdJZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IGdldE1pbmlUaHVtYkZyb21GaWxlKGMsIGJhc2VVcmksIGNyLCBvcHRpb25zKTsKQEAgLTM0MCwxNyArMzQxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFVyaSBibG9ja2luZ1VyaSA9IGJhc2VVcmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImJsb2NraW5nIiwgIjEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJvcmlnX2lkIiwgU3RyaW5nLnZhbHVlT2Yob3JpZ0lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZ3JvdXBfaWQiLCBTdHJpbmcudmFsdWVPZihncm91cElkKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJsb2NraW5nVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBvcmlnaW5hbCBpbWFnZS92aWRlbyBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBudWxsOwpAQCAtMzk3LDYgKzM5NCw5IEBACiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBleCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgICAgIHRodW1iRmlsZS5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgdGh1bWJGaWxlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTXRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmODY2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogVGhlIE1UUCBwcm92aWRlciBzdXBwb3J0cyBhY2Nlc3NpbmcgY29udGVudCBvbiBNVFAgYW5kIFBUUCBkZXZpY2VzLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTXRwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJtdHAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggPSAiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RldmljZS8iOworCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBhbGwgTVRQL1BUUCBkZXZpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXZpY2UgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyAiZGV2aWNlIik7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYW51ZmFjdHVyZXIgb2YgdGhlIGRldmljZQorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOVUZBQ1RVUkVSID0gIm1hbnVmYWN0dXJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMID0gIm1vZGVsIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBsaXN0IG9mIHN0b3JhZ2UgdW5pdHMgZm9yIGFuIE1UUC9QVFAgZGV2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTdG9yYWdlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEICsgIi9zdG9yYWdlIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZS8iICsgc3RvcmFnZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yYWdlIHVuaXQgaWRlbnRpZmllcgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUiA9ICJpZGVudGlmaWVyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGRlc2NyaXB0aW9uCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBvYmplY3RzIG9uIGFuIE1UUC9QVFAgZGV2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBPYmplY3QgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRAorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBvYmplY3RJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4oaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQgKyAiL2NoaWxkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpRm9yU3RvcmFnZUNoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRAorICAgICAgICAgICAgICAgICAgICArICIvc3RvcmFnZS8iICsgc3RvcmFnZUlEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgY29sdW1ucyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZHMgaW4gdGhlIE9iamVjdEluZm8gZGF0YXNldAorICAgICAgICAgKiBhcyBkZXNjcmliZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIElEIG9mIHRoZSBzdG9yYWdlIHVuaXQgY29udGFpbmluZyB0aGUgb2JqZWN0LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkFHRV9JRCA9ICJzdG9yYWdlX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwcm90ZWN0aW9uIHN0YXR1cyBvZiB0aGUgb2JqZWN0LiAgU2VlIHRoZSBQUk9URUNUSU9OX1NUQVRVU18qc3ltYm9scyBiZWxvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RJT05fU1RBVFVTID0gInByb3RlY3Rpb25fc3RhdHVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNpemUgb2YgdGhlIG9iamVjdCBpbiBieXRlcy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkUgPSAic2l6ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyB0aHVtYm5haWwgZm9ybWF0LiAgQ2FuIGJlIG9uZSBvZiB0aGUgRk9STUFUXyogc3ltYm9scyBiZWxvdywKKyAgICAgICAgICogb3IgYW55IG9mIHRoZSB2YWxpZCBNVFAgb2JqZWN0IGZvcm1hdHMgYXMgZGVmaW5lZCBpbiB0aGUgTVRQIHNwZWNpZmljYXRpb24uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9GT1JNQVQgPSAiZm9ybWF0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNpemUgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBieXRlcy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CX1NJWkUgPSAidGh1bWJfc2l6ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgb2JqZWN0J3MgdGh1bWJuYWlsIGluIHBpeGVscy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CX1dJRFRIID0gInRodW1iX3dpZHRoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgb2JqZWN0J3MgdGh1bWJuYWlsIGluIHBpeGVscy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CX0hFSUdIVCA9ICJ0aHVtYl9oZWlnaHQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsLgorICAgICAgICAgKiA8UD5UeXBlOiBCTE9CPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUIgPSAidGh1bWIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9XSURUSCA9ICJpbWFnZV93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9IRUlHSFQgPSAiaW1hZ2VfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlcHRoIG9mIHRoZSBvYmplY3QgaW4gYml0cyBwZXIgcGl4ZWwuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9ERVBUSCA9ICJpbWFnZV9kZXB0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgb2JqZWN0J3MgcGFyZW50LCBvciB6ZXJvIGlmIHRoZSBvYmplY3QKKyAgICAgICAgICogaXMgaW4gdGhlIHJvb3Qgb2YgaXRzIHN0b3JhZ2UgdW5pdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXNzb2NpYXRpb24gdHlwZSBmb3IgYSBjb250YWluZXIgb2JqZWN0LgorICAgICAgICAgKiBGb3IgZm9sZGVycyB0aGlzIGlzIHR5cGljYWxseSB7QGxpbmsgI0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVJ9CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9UWVBFID0gImFzc29jaWF0aW9uX3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGNvbnRhaW5lciBvYmplY3RzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fREVTQyA9ICJhc3NvY2lhdGlvbl9kZXNjIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgb2JqZWN0LCB0eXBpY2FsbHkgdXNlZCBmb3IgYW4gYXNzb2NpYXRpb24KKyAgICAgICAgICogY29udGFpbmluZyBpbWFnZXMgdGFrZW4gaW4gc2VxdWVuY2UuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DRV9OVU1CRVIgPSAic2VxdWVuY2VfbnVtYmVyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQsIGluIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9DUkVBVEVEID0gImRhdGVfY3JlYXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBvYmplY3Qgd2FzIGxhc3QgbW9kaWZpZWQsIGluIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9NT0RJRklFRCA9ICJkYXRlX21vZGlmaWVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBsaXN0IG9mIGtleXdvcmRzIGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3QsIHNlcGFyYXRlZCBieSBzcGFjZXMuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlXT1JEUyA9ICJrZXl3b3JkcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRhbnRzIGZvciB7QGxpbmsgI0ZPUk1BVH0gYW5kIHtAbGluayAjVEhVTUJfRk9STUFUfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRCA9IDB4MzAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTU09DSUFUSU9OID0gMHgzMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0NSSVBUID0gMHgzMDAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRVhFQ1VUQUJMRSA9IDB4MzAwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RFWFQgPSAweDMwMDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9IVE1MID0gMHgzMDA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRFBPRiA9IDB4MzAwNjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FJRkYgPSAweDMwMDc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XQVYgPSAweDMwMDg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUDMgPSAweDMwMDk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVkkgPSAweDMwMEE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUEVHID0gMHgzMDBCOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVNGID0gMHgzMDBDOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfREVGSU5FRCA9IDB4MzgwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYSUZfSlBFRyA9IDB4MzgwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkZfRVAgPSAweDM4MDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFTSFBJWCA9IDB4MzgwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0JNUCA9IDB4MzgwNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NJRkYgPSAweDM4MDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9HSUYgPSAweDM4MDc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KRklGID0gMHgzODA4OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0QgPSAweDM4MDk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QSUNUID0gMHgzODBBOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUE5HID0gMHgzODBCOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVElGRiA9IDB4MzgwRDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkZfSVQgPSAweDM4MEU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KUDIgPSAweDM4MEY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KUFggPSAweDM4MTA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRklSTVdBUkUgPSAweEI4MDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCA9IDB4Qjg4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9BVURJTyA9IDB4QjkwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNQSA9IDB4QjkwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX09HRyA9IDB4QjkwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FBQyA9IDB4QjkwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FVRElCTEUgPSAweEI5MDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFDID0gMHhCOTA2OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX1ZJREVPID0gMHhCOTgwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV01WID0gMHhCOTgxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVA0X0NPTlRBSU5FUiA9IDB4Qjk4MjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QMiA9IDB4Qjk4MzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUXzNHUF9DT05UQUlORVIgPSAweEI5ODQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiA9IDB4QkEwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU0gPSAweEJBMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSA9IDB4QkEwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNID0gMHhCQTAzOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfVklERU9fQUxCVU0gPSAweEJBMDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCA9IDB4QkEwNTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgPSAweEJBMDY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUiA9IDB4QkEwNzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OID0gMHhCQTA4OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgPSAweEJBMDk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVCA9IDB4QkEwQTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVCA9IDB4QkEwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dQTF9QTEFZTElTVCA9IDB4QkExMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX00zVV9QTEFZTElTVCA9IDB4QkExMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QTF9QTEFZTElTVCA9IDB4QkExMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTWF9QTEFZTElTVCA9IDB4QkExMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1BMU19QTEFZTElTVCA9IDB4QkExNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCA9IDB4QkE4MDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UID0gMHhCQTgxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfWE1MX0RPQ1VNRU5UID0gMHhCQTgyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfV09SRF9ET0NVTUVOVCA9IDB4QkE4MzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UID0gMHhCQTg0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQgPSAweEJBODU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTiA9IDB4QkE4NjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFID0gMHhCQjAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0UgPSAweEJCMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09OVEFDVCA9IDB4QkI4MDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgPSAweEJCODE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9WQ0FSRF8yID0gMHhCQjgyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYmplY3QgaXMgbm90IHByb3RlY3RlZC4gSXQgbWF5IGJlIG1vZGlmaWVkIGFuZCBkZWxldGVkLCBhbmQgaXRzIHByb3BlcnRpZXMKKyAgICAgICAgICogbWF5IGJlIG1vZGlmaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIGNhbiBub3QgYmUgbW9kaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFkgPSAweDgwMDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYnV0IGl0cyBwcm9wZXJ0aWVzIGFyZSBtb2RpZmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZX0RBVEEgPSAweDgwMDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCdzIGNvbnRlbnRzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCBmcm9tIHRoZSBkZXZpY2UsIGJ1dCB0aGUgb2JqZWN0CisgICAgICAgICAqIG1heSBiZSBtb3ZlZCBvciBkZWxldGVkIGFuZCBpdHMgcHJvcGVydGllcyBtYXkgYmUgbW9kaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05fVFJBTlNGRVJBQkxFX0RBVEEgPSAweDgwMDM7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA9IDB4MDAwMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCBlYTQ3MzhmLi40ZWM1MzYzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTE2LDE0ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zOCwxOSArMzUsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy4qOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAKIC8qKgpAQCAtMTAwOSw3ICsxMDAxLDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0ludGVyZXN0aW5nQ29uZmlndXJhdGlvbkNoYW5nZXMoaW50IGNoYW5nZXMpIHsKICAgICAgICAgICAgIHJldHVybiAoY2hhbmdlcyZBY3Rpdml0eUluZm8uQ09ORklHX0ZPTlRfU0NBTEUpICE9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dHVGFsa1NlcnZpY2VTdGF0dXMoQ29udGVudFJlc29sdmVyIGNyKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KGNyLCBTSE9XX0dUQUxLX1NFUlZJQ0VfU1RBVFVTLCAwKSAhPSAwOwogICAgICAgICB9CkBAIC0xMjE2LDcgKzEyMDgsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1BBVFRFUk5fVklTSUJMRSA9ICJsb2NrX3BhdHRlcm5fdmlzaWJsZV9wYXR0ZXJuIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIAorICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UKICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI0xPQ0tfUEFUVEVSTl9UQUNUSUxFX0ZFRURCQUNLX0VOQUJMRUR9CiAgICAgICAgICAqIGluc3RlYWQKICAgICAgICAgICovCkBAIC0yMjkwLDYgKzIyODIsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGtleSB0aGF0IHJldHJpZXZlcyBhIGJsdWV0b290aCBJbnB1dCBEZXZpY2UncyBwcmlvcml0eS4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoImJsdWV0b290aF9pbnB1dF9kZXZpY2VfcHJpb3JpdHlfIiArIGFkZHJlc3MudG9VcHBlckNhc2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciBvciBub3QgZGF0YSByb2FtaW5nIGlzIGVuYWJsZWQuICgwID0gZmFsc2UsIDEgPSB0cnVlKQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9ST0FNSU5HID0gImRhdGFfcm9hbWluZyI7CkBAIC0yNDE2LDYgKzI0MTYsMTQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UQUxfQ09OVFJPTF9SRURJUkVDVF9VUkwgPSAicGFyZW50YWxfY29udHJvbF9yZWRpcmVjdF91cmwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBBIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGUgZnJlcXVlbmN5IG9mIFNhbXBsaW5nUHJvZmlsZXIKKyAgICAgICAgICogdGFraW5nIHNuYXBzaG90cyBpbiBoZXJ0ei4gWmVybyB2YWx1ZSBtZWFucyBTYW1wbGluZ1Byb2ZpbGVyIGlzIGRpc2FibGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUExJTkdfUFJPRklMRVJfSFogPSAic2FtcGxpbmdfcHJvZmlsZXJfaHoiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBTZXR0aW5ncyBjbGFzc25hbWUgdG8gbGF1bmNoIHdoZW4gU2V0dGluZ3MgaXMgY2xpY2tlZCBmcm9tIEFsbAogICAgICAgICAgKiBBcHBsaWNhdGlvbnMuICBOZWVkZWQgYmVjYXVzZSBvZiB1c2VyIHRlc3RpbmcgYmV0d2VlbiB0aGUgb2xkCiAgICAgICAgICAqIGFuZCBuZXcgU2V0dGluZ3MgYXBwcy4KQEAgLTM1NzMsMjAgKzM1ODEsOCBAQAogICAgICAgICAgICAgLy8gSWYgYSBzaG9ydGN1dCBpcyBzdXBwbGllZCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IKICAgICAgICAgICAgIC8vIGFub3RoZXIgYm9va21hcmssIHRoZW4gcmVtb3ZlIHRoZSBvbGQgZGVmaW5pdGlvbi4KICAgICAgICAgICAgIGlmIChzaG9ydGN1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShDT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNTaG9ydGN1dFByb2plY3Rpb24sIHNTaG9ydGN1dFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9LCBudWxsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5kZWxldGVSb3coKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZGVsZXRlIGV4aXN0aW5nIHNob3J0Y3V0IHJvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzU2hvcnRjdXRTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQppbmRleCAzNWE1ODJkLi45YjdhNzNkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtNDI3LDYgKzQyOCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvZygiIElucHV0IERldmljZSA6IE5hbWUgb2YgUHJvcGVydHkgaXM6IiArIHByb3BWYWx1ZXNbMF0pOworICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShhZGRyZXNzLCBzdGF0ZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tQYWlyaW5nUmVxdWVzdEFuZEdldEFkZHJlc3MoU3RyaW5nIG9iamVjdFBhdGgsIGludCBuYXRpdmVEYXRhKSB7CiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKG9iamVjdFBhdGgpOwogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CkBAIC01NzMsNiArNTg4LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gb25BZ2VudEF1dGhvcml6ZShTdHJpbmcgb2JqZWN0UGF0aCwgU3RyaW5nIGRldmljZVV1aWQpIHsKKyAgICAgICAgaWYgKCFtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSkgcmV0dXJuIGZhbHNlOworCiAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKG9iamVjdFBhdGgpOwogICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZ2V0IGRldmljZSBhZGRyZXNzIGluIG9uQXV0aEFnZW50QXV0aG9yaXplIik7CkBAIC01ODEsMTUgKzU5OCwxNSBAQAogCiAgICAgICAgIGJvb2xlYW4gYXV0aG9yaXplZCA9IGZhbHNlOwogICAgICAgICBQYXJjZWxVdWlkIHV1aWQgPSBQYXJjZWxVdWlkLmZyb21TdHJpbmcoZGV2aWNlVXVpZCk7Ci0gICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKIAogICAgICAgICAvLyBCbHVleiBzZW5kcyB0aGUgVVVJRCBvZiB0aGUgbG9jYWwgc2VydmljZSBiZWluZyBhY2Nlc3NlZCwgX25vdF8gdGhlCiAgICAgICAgIC8vIHJlbW90ZSBzZXJ2aWNlCi0gICAgICAgIGlmIChtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIChCbHVldG9vdGhVdWlkLmlzQXVkaW9Tb3VyY2UodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc0F2cmNwVGFyZ2V0KHV1aWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBCbHVldG9vdGhVdWlkLmlzQWR2QXVkaW9EaXN0KHV1aWQpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoYWRkcmVzcykpIHsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGlmICgoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQorICAgICAgICAgICAgICB8fCBCbHVldG9vdGhVdWlkLmlzQWR2QXVkaW9EaXN0KHV1aWQpKSAmJgorICAgICAgICAgICAgICAhaXNPdGhlclNpbmtJbk5vbkRpc2Nvbm5lY3RpbmdTdGF0ZShhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOworCiAgICAgICAgICAgICBhdXRob3JpemVkID0gYTJkcC5nZXRTaW5rUHJpb3JpdHkoZGV2aWNlKSA+IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGOwogICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQpIHsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBbGxvd2luZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKQEAgLTU5Nyw2ICs2MTQsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVqZWN0aW5nIGluY29taW5nIEEyRFAgLyBBVlJDUCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aFV1aWQuaXNJbnB1dERldmljZSh1dWlkKSAmJiAhaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKGFkZHJlc3MpKSB7CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZSBpbnB1dERldmljZSA9IG5ldyBCbHVldG9vdGhJbnB1dERldmljZShtQ29udGV4dCk7CisgICAgICAgICAgICBhdXRob3JpemVkID0gaW5wdXREZXZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID4KKyAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkY7CisgICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQpIHsKKyAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWxsb3dpbmcgaW5jb21pbmcgSElEIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVqZWN0aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyAiICsgZGV2aWNlVXVpZCArICIgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgfQpAQCAtNjA0LDcgKzYzMCwxOSBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKICAgICB9CiAKLSAgICBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UubG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwogICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gYTJkcC5nZXROb25EaXNjb25uZWN0ZWRTaW5rcygpOwogICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKaW5kZXggMzFlNWE3Yi4uZWM5OWIwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCkBAIC0yNCwxNiArMjQsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnNlcnZlcjsKIAoraW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZVN0YXRlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aElucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFNvY2tldDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGg7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNzAsOCArNzMsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIEJsdWV0b290aFNlcnZpY2UgZXh0ZW5kcyBJQmx1ZXRvb3RoLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoU2VydmljZSI7CkBAIC0xMjksNiArMTM0LDggQEAKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGZwUHJvZmlsZVN0YXRlOwogCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwU2VydmljZSBtQTJkcFNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4gbUlucHV0RGV2aWNlczsKKwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtRG9ja0FkZHJlc3M7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbURvY2tQaW47CiAKQEAgLTE5OCw2ICsyMDUsNyBAQAogCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9ET0NLX0VWRU5UKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1JbnB1dERldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+KCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHJlYWREb2NrQmx1ZXRvb3RoQWRkcmVzcygpIHsKQEAgLTEyMjAsNiArMTIyOCwxMjcgQEAKICAgICAgICAgcmV0dXJuIHNwLmNvbnRhaW5zKFNIQVJFRF9QUkVGRVJFTkNFX0RPQ0tfQUREUkVTUyArIGFkZHJlc3MpOwogICAgIH0KIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworCisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAob2JqZWN0UGF0aCA9PSBudWxsIHx8IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpLmxlbmd0aCAhPSAwIHx8CisgICAgICAgICAgICBnZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYoY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwgZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZihkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dERldmljZXMuZ2V0KGRldmljZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKAorICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKyAgICAgICAgcmV0dXJuIGRldmljZXMudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKyAgICAgICAgaWYgKCFCbHVldG9vdGhBZGFwdGVyLmNoZWNrQmx1ZXRvb3RoQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KGRldmljZS5nZXRBZGRyZXNzKCkpLAorICAgICAgICAgICAgICAgIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqL3N5bmNocm9uaXplZCBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBsb29rdXBJbnB1dERldmljZXNNYXRjaGluZ1N0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gaW5wdXREZXZpY2VzID0gbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigpOworICAgICAgICBpZiAobUlucHV0RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERldmljZXM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlOiBtSW5wdXREZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgaW5wdXREZXZpY2VTdGF0ZSA9IGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGZvciAoaW50IHN0YXRlIDogc3RhdGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IGlucHV0RGV2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKSB7CisgICAgICAgIGludCBwcmV2U3RhdGU7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IG1JbnB1dERldmljZXMuZ2V0KGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZTdGF0ZSA9PSBzdGF0ZSkgcmV0dXJuOworCisgICAgICAgIG1JbnB1dERldmljZXMucHV0KGRldmljZSwgc3RhdGUpOworCisgICAgICAgIGlmIChnZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPgorICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYgJiYKKyAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcgfHwKKyAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25uZWN0ZWQgb3IgYXR0ZW1wdGluZyB0byBjb25uZWN0LgorICAgICAgICAgICAgLy8gQnVtcCBwcmlvcml0eQorICAgICAgICAgICAgc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCk7CisgICAgICAgIH0KKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSwgcHJldlN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgc3RhdGUpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX1BFUk0pOworCisgICAgICAgIGlmIChEQkcpIGxvZygiSW5wdXREZXZpY2Ugc3RhdGUgOiBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIFN0YXRlOiIgKyBwcmV2U3RhdGUgKyAiLT4iICsgc3RhdGUpOworCisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBoYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwYXRoLCBib29sZWFuIGNvbm5lY3RlZCkgeworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBpbnQgc3RhdGUgPSBjb25uZWN0ZWQgPyBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgOgorICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUpOworICAgIH0KKwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNSZW1vdGVEZXZpY2VJbkNhY2hlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIHJldHVybiAobURldmljZVByb3BlcnRpZXMuZ2V0KGFkZHJlc3MpICE9IG51bGwpOwogICAgIH0KQEAgLTIxMDMsNCArMjIzMiw2IEBACiAgICAgICAgICAgICBzaG9ydCBjaGFubmVsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRMaW5rVGltZW91dE5hdGl2ZShTdHJpbmcgcGF0aCwgaW50IG51bV9zbG90cyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQppbmRleCBlNGY5MzRlLi5lYWNkNDBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworCiAvKioKICAqIEFjY2VzcyB0aGUgSUNVIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKiBAaGlkZQpAQCAtNDQsNSArNDYsMTMyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBydW4gZGlyZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhIGxpbmUgd2l0aGluIGEgcGFyYWdyYXBoLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBiYXNlIGxpbmUgZGlyZWN0aW9uLCBlaXRoZXIgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUIG9yCisgICAgICogICAgIExheW91dC5ESVJfUklHSFRfVE9fTEVGVAorICAgICAqIEBwYXJhbSBsZXZlbHMgbGV2ZWxzIGFzIHJldHVybmVkIGZyb20ge0BsaW5rICNiaWRpfQorICAgICAqIEBwYXJhbSBsc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGxldmVscyBhcnJheQorICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5ICh1c2VkIHRvIGRldGVybWluZSB3aGl0ZXNwYWNlKQorICAgICAqIEBwYXJhbSBjc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBjaGFycyBhcnJheQorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgbGluZQorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpcmVjdGlvbnMgZGlyZWN0aW9ucyhpbnQgZGlyLCBieXRlW10gbGV2ZWxzLCBpbnQgbHN0YXJ0LAorICAgICAgICAgICAgY2hhcltdIGNoYXJzLCBpbnQgY3N0YXJ0LCBpbnQgbGVuKSB7CisKKyAgICAgICAgaW50IGJhc2VMZXZlbCA9IGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgPyAwIDogMTsKKyAgICAgICAgaW50IGN1ckxldmVsID0gbGV2ZWxzW2xzdGFydF07CisgICAgICAgIGludCBtaW5MZXZlbCA9IGN1ckxldmVsOworICAgICAgICBpbnQgcnVuQ291bnQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0ICsgMSwgZSA9IGxzdGFydCArIGxlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGZpbmFsIHJ1biBmb3IgdHJhaWxpbmcgY291bnRlci1kaXJlY3Rpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgIGludCB2aXNMZW4gPSBsZW47CisgICAgICAgIGlmICgoY3VyTGV2ZWwgJiAxKSAhPSAoYmFzZUxldmVsICYgMSkpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHZpc2libGUgZW5kCisgICAgICAgICAgICB3aGlsZSAoLS12aXNMZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjaGFyc1tjc3RhcnQgKyB2aXNMZW5dOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgLS12aXNMZW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Zpc0xlbjsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW5Db3VudCA9PSAxICYmIG1pbkxldmVsID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgLy8gd2UncmUgZG9uZSwgb25seSBvbmUgcnVuIG9uIHRoaXMgbGluZQorICAgICAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBsZCA9IG5ldyBpbnRbcnVuQ291bnQgKiAyXTsKKyAgICAgICAgaW50IG1heExldmVsID0gbWluTGV2ZWw7CisgICAgICAgIGludCBsZXZlbEJpdHMgPSBtaW5MZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICB7CisgICAgICAgICAgICAvLyBTdGFydCBvZiBmaXJzdCBwYWlyIGlzIGFsd2F5cyAwLCB3ZSB3cml0ZQorICAgICAgICAgICAgLy8gbGVuZ3RoIHRoZW4gc3RhcnQgYXQgZWFjaCBuZXcgcnVuLCBhbmQgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJ1biBsZW5ndGggYWZ0ZXIgd2UncmUgZG9uZS4KKyAgICAgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbHN0YXJ0OworICAgICAgICAgICAgY3VyTGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQsIGUgPSBsc3RhcnQgKyB2aXNMZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgbWluTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGlnbm9yZSBydW4gbGVuZ3RoIGxpbWl0IG9mIDJeUlVOX0xFVkVMX1NISUZUCisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSAoaSAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gaSAtIGxzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCaXRzID0gY3VyTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGRbbl0gPSAobHN0YXJ0ICsgdmlzTGVuIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICBpZiAodmlzTGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IHZpc0xlbjsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gKGxlbiAtIHZpc0xlbikgfCAoYmFzZUxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc3dhcCBhbnkgcnVucy4KKyAgICAgICAgLy8gSWYgdGhlIG1pbiBsZXZlbCBydW4gZGlyZWN0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIGJhc2UKKyAgICAgICAgLy8gZGlyZWN0aW9uLCB3ZSBhbHdheXMgbmVlZCB0byBzd2FwIChhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBydW4pLgorICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IG5lZWQgdG8gc3dhcCB0aGUgbG93ZXN0IGxldmVsLgorICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gbG9naWNhbGx5IGFkamFjZW50IHJ1bnMgYXQgdGhlIHNhbWUKKyAgICAgICAgLy8gbGV2ZWwsIGlmIHRoZSBtYXggbGV2ZWwgaXMgdGhlIHNhbWUgYXMgdGhlIChuZXcpIG1pbgorICAgICAgICAvLyBsZXZlbCwgd2UgaGF2ZSBhIHNlcmllcyBvZiBhbHRlcm5hdGluZyBsZXZlbHMgdGhhdAorICAgICAgICAvLyBpcyBhbHJlYWR5IGluIG9yZGVyLCBzbyB0aGVyZSdzIG5vIG1vcmUgdG8gZG8uCisgICAgICAgIC8vCisgICAgICAgIGJvb2xlYW4gc3dhcDsKKyAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgbWluTGV2ZWwgKz0gMTsKKyAgICAgICAgICAgIHN3YXAgPSBtYXhMZXZlbCA+IG1pbkxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dhcCA9IHJ1bkNvdW50ID4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3dhcCkgeworICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSBtYXhMZXZlbCAtIDE7IGxldmVsID49IG1pbkxldmVsOyAtLWxldmVsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZC5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxzW2xkW2ldXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGUgPSBpICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlIDwgbGQubGVuZ3RoICYmIGxldmVsc1tsZFtlXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsb3cgPSBpLCBoaSA9IGUgLSAyOyBsb3cgPCBoaTsgbG93ICs9IDIsIGhpIC09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGxkW2xvd107IGxkW2xvd10gPSBsZFtoaV07IGxkW2hpXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxkW2xvdysxXTsgbGRbbG93KzFdID0gbGRbaGkrMV07IGxkW2hpKzFdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMobGQpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBpbnQgcnVuQmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgYm9vbGVhbiBoYXZlSW5mbyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKaW5kZXggOTQ0ZjczNS4uOTMwOWIwNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCkBAIC0yMDgsMTEgKzIwOCwxMSBAQAogICAgICAgICAgICAgICogd2lkdGggYmVjYXVzZSB0aGUgd2lkdGggdGhhdCB3YXMgcGFzc2VkIGluIHdhcyBmb3IgdGhlCiAgICAgICAgICAgICAgKiBmdWxsIHRleHQsIG5vdCB0aGUgZWxsaXBzaXplZCBmb3JtLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgbU1heCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBtTWF4ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKG51bGwpKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5jbHVkZXBhZCkgewpAQCAtMjc2LDE0ICsyNzYsMTMgQEAKICAgICAgICAgICAgIGlmIChmbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm0gPSBuZXcgTWV0cmljcygpOwogICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW50IHdpZDsKIAotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIHdpZCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgZm0pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbS53aWR0aCA9IHdpZDsKKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBmbS53aWR0aCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhmbSkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKKwogICAgICAgICAgICAgcmV0dXJuIGZtOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zODksNyArMzg4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0cmljcyBleHRlbmRzIFBhaW50LkZvbnRNZXRyaWNzSW50IHsKICAgICAgICAgcHVibGljIGludCB3aWR0aDsKLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgd2lkdGg9IiArIHdpZHRoOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhCmluZGV4IDE0ZTU2NTUuLmI2YWEwM2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhCkBAIC0zMTAsNyArMzEwLDYgQEAKIAogICAgICAgICBEaXJlY3Rpb25zW10gb2JqZWN0cyA9IG5ldyBEaXJlY3Rpb25zWzFdOwogCi0KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgIGludHNbU1RBUlRdID0gcmVmbG93ZWQuZ2V0TGluZVN0YXJ0KGkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmxvd2VkLmdldFBhcmFncmFwaERpcmVjdGlvbihpKSA8PCBESVJfU0hJRlQpIHwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCmluZGV4IGMzYmQwYWUuLmQ0MjZkMTI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKQEAgLTM0LDEzICszNCwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHApOwogCiAgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBDYW52YXMjZHJhd1RleHRSdW59LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBQYWludCBwKTsKKworICAgLyoqCiAgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNtZWFzdXJlVGV4dH0uCiAgICAgICovCiAgICAgZmxvYXQgbWVhc3VyZVRleHQoaW50IHN0YXJ0LCBpbnQgZW5kLCBQYWludCBwKTsKIAotCiAgICAgLyoqCiAgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0V2lkdGhzfS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRleHRXaWR0aHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocywgUGFpbnQgcCk7CisKKyAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRSdW5BZHZhbmNlc30uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsIFBhaW50IHBhaW50KTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFJ1bkN1cnNvcn0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGN1cnNvck9wdCwgUGFpbnQgcCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQppbmRleCAzOGFjOWI3Li5mNTMzOTQ0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKQEAgLTE2LDI5ICsxNiwzMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuZW1vamkuRW1vamlGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLio7CitpbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUJhY2tncm91bmRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgotICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24gCi0gKiB0aGUgc2NyZWVuLiAKLSAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwgCi0gKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4gIAorICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24KKyAqIHRoZSBzY3JlZW4uCisgKiA8cD5Gb3IgdGV4dCB0aGF0IHdpbGwgYmUgZWRpdGVkLCB1c2UgYSB7QGxpbmsgRHluYW1pY0xheW91dH0sCisgKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4KICAqIEZvciB0ZXh0IHRoYXQgd2lsbCBub3QgY2hhbmdlLCB1c2UgYSB7QGxpbmsgU3RhdGljTGF5b3V0fS4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcmFncmFwaFN0eWxlW10gTk9fUEFSQV9TUEFOUyA9CiAgICAgICAgIEFycmF5VXRpbHMuZW1wdHlBcnJheShQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7CiAKQEAgLTU0LDkgKzU4LDcgQEAKICAgICAgICAgICAgIE1JTl9FTU9KSSA9IC0xOwogICAgICAgICAgICAgTUFYX0VNT0pJID0gLTE7CiAgICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBSZWN0RiBtRW1vamlSZWN0OworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCkBAIC02Niw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIHJldHVybiBnZXREZXNpcmVkV2lkdGgoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIHBhaW50KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gaG93IHdpZGUgYSBsYXlvdXQgbXVzdCBiZSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZQogICAgICAqIHNwZWNpZmllZCB0ZXh0IHNsaWNlIHdpdGggb25lIGxpbmUgcGVyIHBhcmFncmFwaC4KQEAgLTg1LDggKzg3LDcgQEAKICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwogCiAgICAgICAgICAgICAvLyBub3RlLCBvbWl0cyB0cmFpbGluZyBwYXJhZ3JhcGggY2hhcgotICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBpLCBuZXh0LCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUGFyYShwYWludCwgd29ya1BhaW50LCBzb3VyY2UsIGksIG5leHQpOwogCiAgICAgICAgICAgICBpZiAodyA+IG5lZWQpCiAgICAgICAgICAgICAgICAgbmVlZCA9IHc7CkBAIC0xMTYsNiArMTE3LDE1IEBACiAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMYXlvdXQ6ICIgKyB3aWR0aCArICIgPCAwIik7CiAKKyAgICAgICAgLy8gRW5zdXJlIHBhaW50IGRvZXNuJ3QgaGF2ZSBiYXNlbGluZVNoaWZ0IHNldC4KKyAgICAgICAgLy8gV2hpbGUgbm9ybWFsbHkgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBwYWludCB0aGUgdXNlciBwYXNzZWQgaW4sCisgICAgICAgIC8vIHdlIHdlcmUgYWxyZWFkeSBkb2luZyB0aGlzIGluIFN0eWxlZC5kcmF3VW5pZm9ybVJ1biB3aXRoIGJvdGgKKyAgICAgICAgLy8gYmFzZWxpbmVTaGlmdCBhbmQgYmdDb2xvci4gIFdlIHByb2JhYmx5IHNob3VsZCByZWV2YWx1YXRlIGJnQ29sb3IuCisgICAgICAgIGlmIChwYWludCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKKyAgICAgICAgICAgIHBhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICB9CisKICAgICAgICAgbVRleHQgPSB0ZXh0OwogICAgICAgICBtUGFpbnQgPSBwYWludDsKICAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKQEAgLTE3NSw3ICsxODUsNiBAQAogICAgICAgICAgICAgZGJvdHRvbSA9IHNUZW1wUmVjdC5ib3R0b207CiAgICAgICAgIH0KIAotCiAgICAgICAgIGludCB0b3AgPSAwOwogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChnZXRMaW5lQ291bnQoKSk7CiAKQEAgLTE4NSwyNiArMTk0LDI4IEBACiAgICAgICAgIGlmIChkYm90dG9tIDwgYm90dG9tKSB7CiAgICAgICAgICAgICBib3R0b20gPSBkYm90dG9tOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsgCisKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKHRvcCk7CiAgICAgICAgIGludCBsYXN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKGJvdHRvbSk7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7Ci0gICAgICAgIAorCiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG1QYWludDsKICAgICAgICAgQ2hhclNlcXVlbmNlIGJ1ZiA9IG1UZXh0OwogICAgICAgICBpbnQgd2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGJvb2xlYW4gc3Bhbm5lZFRleHQgPSBtU3Bhbm5lZFRleHQ7CiAKICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIGludCBzcGFuZW5kID0gMDsKKyAgICAgICAgaW50IHNwYW5FbmQgPSAwOwogICAgICAgICBpbnQgdGV4dExlbmd0aCA9IDA7CiAKICAgICAgICAgLy8gRmlyc3QsIGRyYXcgTGluZUJhY2tncm91bmRTcGFucy4KLSAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCBvciBkaXJlY3Rpb24gb2YKLSAgICAgICAgLy8gdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCwgbWFyZ2lucywgb3IKKyAgICAgICAgLy8gZGlyZWN0aW9uIG9mIHRoZSBsYXlvdXQgb3IgbGluZS4gIFhYWDogU2hvdWxkIHRoZXk/CisgICAgICAgIC8vIFRoZXkgYXJlIGV2YWx1YXRlZCBhdCBlYWNoIGxpbmUuCiAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7CiAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKQEAgLTIxNiwxMiArMjI3LDE0IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQm90dG9tID0gbGJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBMaW5lQmFja2dyb3VuZFNwYW5zIG9uIGEgbGluZSBjb250cmlidXRlIHRvIGl0cworICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgICAgICAgIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNwYW5zLmxlbmd0aDsgbisrKSB7CkBAIC0yMzQsMTEgKzI0NywxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlc2V0IHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICAgICAgc3BhbmVuZCA9IDA7CisgICAgICAgICAgICBzcGFuRW5kID0gMDsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICAgICAgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKICAgICAgICAgICAgIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgfSAKKyAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhIGhpZ2hsaWdodCBldmVuIHdpdGhvdXQgc3BhbnMgaWYgd2UgYXJlIGRyYXdpbmcKICAgICAgICAgLy8gYSBub24tc3Bhbm5lZCB0cmFuc2Zvcm1hdGlvbiBvZiBhIHNwYW5uZWQgZWRpdGluZyBidWZmZXIuCkBAIC0yNTUsNyArMjY4LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBtQWxpZ25tZW50OwotICAgICAgICAKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBib29sZWFuIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisKICAgICAgICAgLy8gTmV4dCBkcmF3IHRoZSBsaW5lcywgb25lIGF0IGEgdGltZS4KICAgICAgICAgLy8gdGhlIGJhc2VsaW5lIGlzIHRoZSB0b3Agb2YgdGhlIGZvbGxvd2luZyBsaW5lIG1pbnVzIHRoZSBjdXJyZW50CiAgICAgICAgIC8vIGxpbmUncyBkZXNjZW50LgpAQCAtMjcwLDE5ICsyODcsMzAgQEAKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CiAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7IAotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwIHx8IGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmlyc3RQYXJhTGluZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb21wdXRlIHRoZSBhbGlnbm1lbnQuCi0gICAgICAgICAgICAgICAgLy8gTGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgdGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7CisgICAgICAgICAgICBpbnQgbGVmdCA9IDA7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CisKKyAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaXJzdFBhcmFMaW5lID0gKHN0YXJ0ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKTsKKworICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb2xsZWN0IGludG8gc3BhbnMgYXJyYXkuCisgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYWxpZ25tZW50LCBsYXN0IGFsaWdubWVudCBzdHlsZSB3aW5zLgorICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRhYlN0b3BzLCB3ZSdsbCByZWJ1aWxkIGlmIHdlIGVuY291bnRlciBhIGxpbmUgd2l0aAorICAgICAgICAgICAgICAgIC8vIHRhYnMuCisgICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHBhcmFncmFwaCBzcGFucyB0byBiZSByZWxhdGl2ZWx5IGluZnJlcXVlbnQsIHVzZQorICAgICAgICAgICAgICAgIC8vIHNwYW5FbmQgc28gdGhhdCB3ZSBjYW4gY2hlY2sgbGVzcyBmcmVxdWVudGx5LiAgU2luY2UKKyAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggc3R5bGVzIG91Z2h0IHRvIGFwcGx5IHRvIGVudGlyZSBwYXJhZ3JhcGhzLCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAvLyBqdXN0IGNvbGxlY3QgdGhlIG9uZXMgcHJlc2VudCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAvLyBJZiBzcGFuRW5kIGlzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGgsIHRoYXQncyBub3QKKyAgICAgICAgICAgICAgICAvLyBvdXIgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCAmJiAoaSA9PSBmaXJzdCB8fCBpc0ZpcnN0UGFyYUxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuRW5kLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7CisKICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBtQWxpZ25tZW50OwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gc3BhbnMubGVuZ3RoLTE7IG4gPj0gMDsgbi0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNbbl0gaW5zdGFuY2VvZiBBbGlnbm1lbnRTcGFuKSB7CkBAIC0yOTAsNDUgKzMxOCw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpOwotICAgICAgICAgICAgaW50IGxlZnQgPSAwOwotICAgICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOwogCi0gICAgICAgICAgICAvLyBEcmF3IGFsbCBsZWFkaW5nIG1hcmdpbiBzcGFucy4gIEFkanVzdCBsZWZ0IG9yIHJpZ2h0IGFjY29yZGluZwotICAgICAgICAgICAgLy8gdG8gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24gb2YgdGhlIGxpbmUuCi0gICAgICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHNJc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRHJhdyBhbGwgbGVhZGluZyBtYXJnaW4gc3BhbnMuICBBZGp1c3QgbGVmdCBvciByaWdodCBhY2NvcmRpbmcKKyAgICAgICAgICAgICAgICAvLyB0byB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGUgbGluZS4KICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3BhbnMubGVuZ3RoOwogICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zW25dIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIG1hcmdpbiA9IChMZWFkaW5nTWFyZ2luU3Bhbikgc3BhbnNbbl07CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUZpcnN0TGluZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuMikgbWFyZ2luKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0TGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3AuZ2V0U3BhblN0YXJ0KG1hcmdpbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZpcnN0TGluZU1hcmdpbiA9IGkgPCBzdGFydExpbmUgKyBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi5kcmF3TGVhZGluZ01hcmdpbihjLCBwYWludCwgcmlnaHQsIGRpciwgbHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGJhc2VsaW5lLCBsYm90dG9tLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGlzRmlyc3RQYXJhTGluZSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKGlzRmlyc3RQYXJhTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLmRyYXdMZWFkaW5nTWFyZ2luKGMsIHBhaW50LCBsZWZ0LCBkaXIsIGx0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiYXNlbGluZSwgbGJvdHRvbSwgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBpc0ZpcnN0UGFyYUxpbmUsIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VNYXJnaW4gPSBpc0ZpcnN0UGFyYUxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMiltYXJnaW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTWFyZ2luID0gY291bnQgPiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZU1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbmRlcmluZyBkZXBlbmRpbmcgb24gdGhlCi0gICAgICAgICAgICAvLyBhbGlnbm1lbnQgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihpKTsKKyAgICAgICAgICAgIC8vIENhbid0IHRlbGwgaWYgd2UgaGF2ZSB0YWJzIGZvciBzdXJlLCBjdXJyZW50bHkKKyAgICAgICAgICAgIGlmIChoYXNUYWJPckVtb2ppICYmICF0YWJTdG9wc0lzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFiU3RvcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMucmVzZXQoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewpAQCAtMzM3LDQxICszNjksODAgQEAKICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IG1heCA9IChpbnQpZ2V0TGluZU1heChpLCBzcGFucywgZmFsc2UpOworICAgICAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVFeHRlbnQoaSwgdGFiU3RvcHMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0ICsgbWF4OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBtYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCi0gICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOwotICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZiA9IChyaWdodCAtIGxlZnQgLSBtYXgpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIGhhbGY7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCArIGhhbGY7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCAtIG1heDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIEFsaWdubWVudC5BTElHTl9DRU5URVIKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7CisgICAgICAgICAgICAgICAgICAgIHggPSAocmlnaHQgKyBsZWZ0IC0gbWF4KSA+PiAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMoaSk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1RhYiA9IGdldExpbmVDb250YWluc1RhYihpKTsKICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zID09IERJUlNfQUxMX0xFRlRfVE9fUklHSFQgJiYKLSAgICAgICAgICAgICAgICAgICAgIXNwYW5uZWRUZXh0ICYmICFoYXNUYWIpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoYyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAhc3Bhbm5lZFRleHQgJiYgIWhhc1RhYk9yRW1vamkpIHsKICAgICAgICAgICAgICAgICAvLyBYWFg6IGFzc3VtZXMgdGhlcmUncyBub3RoaW5nIGFkZGl0aW9uYWwgdG8gYmUgZG9uZQogICAgICAgICAgICAgICAgIGMuZHJhd1RleHQoYnVmLCBzdGFydCwgZW5kLCB4LCBsYmFzZWxpbmUsIHBhaW50KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHJhd1RleHQoYywgYnVmLCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIHgsIGx0b3AsIGxiYXNlbGluZSwgbGJvdHRvbSwgcGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgIGhhc1RhYiwgc3BhbnMpOworICAgICAgICAgICAgICAgIHRsLnNldChwYWludCwgYnVmLCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYk9yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgICAgICAgICB0bC5kcmF3KGMsIHgsIGx0b3AsIGxiYXNlbGluZSwgbGJvdHRvbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBsaW5lLCBnaXZlbiB0aGUgbGVmdCBhbmQgcmlnaHQgYm91bmRzCisgICAgICogb2YgdGhlIG1hcmdpbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBpbmRleAorICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IGJvdW5kcyAoMCwgb3IgbGVhZGluZyBtYXJnaW4gaWYgbHRyIHBhcmEpCisgICAgICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBib3VuZHMgKHdpZHRoLCBtaW51cyBsZWFkaW5nIG1hcmdpbiBpZiBydGwgcGFyYSkKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGluZSAodG8gcmlnaHQgb2YgbGluZSBpZiBydGwgcGFyYSkKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRMaW5lU3RhcnRQb3MoaW50IGxpbmUsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKyAgICAgICAgLy8gQWRqdXN0IHRoZSBwb2ludCBhdCB3aGljaCB0byBzdGFydCByZW5kZXJpbmcgZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICAvLyBhbGlnbm1lbnQgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgICAgQWxpZ25tZW50IGFsaWduID0gZ2V0UGFyYWdyYXBoQWxpZ25tZW50KGxpbmUpOworICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworCisgICAgICAgIGludCB4OworICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX05PUk1BTCkgeworICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHggPSBsZWZ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4ID0gcmlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0ICYmIGdldExpbmVDb250YWluc1RhYihsaW5lKSkgeworICAgICAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSBtVGV4dDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgICAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgc3Bhbm5lZC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYlNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgc3BhbkVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh0YWJTcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHRhYlNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGxpbmUsIHRhYlN0b3BzLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBtYXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgIHggPSAobGVmdCArIHJpZ2h0IC0gbWF4KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB4OwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE3LDcgKzQ4OCw3IEBACiAKICAgICAgICAgbVdpZHRoID0gd2lkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoaXMgbGF5b3V0LgogICAgICAqLwpAQCAtNDUwLDcgKzUyMSw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGlzIGxheW91dC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVDb3VudCgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBiYXNlbGluZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICgwJmhlbGxpcDtnZXRMaW5lQ291bnQoKSAtIDEpCiAgICAgICogSWYgYm91bmRzIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBleHRlbnRzCkBAIC01MjQsMTMgKzU5NSw5NSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Qm90dG9tUGFkZGluZygpOwogCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgYW5kIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVyCisgICAgICogYXJlIGF0IGRpZmZlcmVudCBydW4gbGV2ZWxzIChhbmQgdGh1cyB0aGVyZSdzIGEgc3BsaXQgY2FyZXQpLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBhIGxldmVsIGJvdW5kYXJ5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTGV2ZWxCb3VuZGFyeShpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaWYgKGRpcnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCB8fCBkaXJzID09IERJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIHJ1bnMgPSBkaXJzLm1EaXJlY3Rpb25zOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gbGluZVN0YXJ0IHx8IG9mZnNldCA9PSBsaW5lRW5kKSB7CisgICAgICAgICAgICBpbnQgcGFyYUxldmVsID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBydW5JbmRleCA9IG9mZnNldCA9PSBsaW5lU3RhcnQgPyAwIDogcnVucy5sZW5ndGggLSAyOworICAgICAgICAgICAgcmV0dXJuICgocnVuc1tydW5JbmRleCArIDFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0spICE9IHBhcmFMZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCAtPSBsaW5lU3RhcnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBydW5zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50W10gcnVucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBsZXZlbEF0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAobGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzdGFydCAmJiBvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgYXQgc2FtZSBsZXZlbCwgc28gZG9uJ3QgdXNlIHRyYWlsaW5nLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldmVsQXQgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsQXQgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB3YXMgbGltaXQgb2YgbGluZS4KKyAgICAgICAgICAgIGxldmVsQXQgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgbGV2ZWwgYm91bmRhcnksIGNoZWNrIHByZXZpb3VzIGxldmVsLgorICAgICAgICBpbnQgbGV2ZWxCZWZvcmUgPSAtMTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIGxldmVsQmVmb3JlID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSBzdGFydCArIChydW5zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQmVmb3JlID0gKHJ1bnNbaSsxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGV2ZWxCZWZvcmUgPCBsZXZlbEF0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgcHJpbWFyeSBob3Jpem9udGFsIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRleHQgb2Zmc2V0LgogICAgICAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbmV3IGNoYXJhY3RlciB3b3VsZCBiZSBpbnNlcnRlZCBpbgogICAgICAqIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpbWFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMob2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzksNjYgKzY5Miw0MiBAQAogICAgICAqIHRoZSBkaXJlY3Rpb24gb3RoZXIgdGhhbiB0aGUgcGFyYWdyYXBoJ3MgcHJpbWFyeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNlY29uZGFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRydWUsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsICF0cmFpbGluZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0KSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcpIHsKICAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgYWx0LCBsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgbGluZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBpbnQgbGluZSkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7CiAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CiAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9IG51bGw7Ci0gICAgICAgIGlmICh0YWIgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgaWYgKHRhYnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHRhYnMpOyAvLyBYWFggc2hvdWxkIHJldXNlCisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmbG9hdCB3aWQgPSBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsIG1UZXh0LCBzdGFydCwgb2Zmc2V0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgZGlyZWN0aW9ucywgdHJhaWxpbmcsIGFsdCwgdGFiLCB0YWJzKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFiT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICBmbG9hdCB3aWQgPSB0bC5tZWFzdXJlKG9mZnNldCAtIHN0YXJ0LCB0cmFpbGluZywgbnVsbCk7CisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOwogCi0gICAgICAgIGlmIChvZmZzZXQgPiBlbmQpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgd2lkIC09IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIGVuZCwgb2Zmc2V0LCBudWxsLCB0YWIsIHRhYnMpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdpZCArPSBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0LCBlbmQsIG9mZnNldCwgbnVsbCwgdGFiLCB0YWJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFsaWdubWVudCBhbGlnbiA9IGdldFBhcmFncmFwaEFsaWdubWVudChsaW5lKTsKICAgICAgICAgaW50IGxlZnQgPSBnZXRQYXJhZ3JhcGhMZWZ0KGxpbmUpOwogICAgICAgICBpbnQgcmlnaHQgPSBnZXRQYXJhZ3JhcGhSaWdodChsaW5lKTsKIAotICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX05PUk1BTCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgKyB3aWQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyB3aWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBtYXggPSBnZXRMaW5lTWF4KGxpbmUpOwotCi0gICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyBtYXggKyB3aWQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0IC0gbWF4ICsgd2lkOwotICAgICAgICB9IGVsc2UgeyAvKiBhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSICovCi0gICAgICAgICAgICBpbnQgaW1heCA9ICgoaW50KSBtYXgpICYgfjE7Ci0KLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0IC0gKCgocmlnaHQgLSBsZWZ0KSAtIGltYXgpIC8gMikgKyB3aWQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyAoKHJpZ2h0IC0gbGVmdCkgLSBpbWF4KSAvIDIgKyB3aWQ7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldExpbmVTdGFydFBvcyhsaW5lLCBsZWZ0LCByaWdodCkgKyB3aWQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTYsMzggKzc4NSw3NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgZXhjbHVkaW5nCi0gICAgICogdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBHZXRzIHRoZSB1bnNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luIGluZGVudCwgYnV0IGV4Y2x1ZGluZyB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRMaW5lTWF4KGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5lTWF4KGxpbmUsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgZmxvYXQgbWFyZ2luID0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKKyAgICAgICAgZmxvYXQgc2lnbmVkRXh0ZW50ID0gZ2V0TGluZUV4dGVudChsaW5lLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBtYXJnaW4gKyBzaWduZWRFeHRlbnQgPj0gMCA/IHNpZ25lZEV4dGVudCA6IC1zaWduZWRFeHRlbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKLSAgICAgKiB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqIEdldHMgdGhlIHVuc2lnbmVkIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCisgICAgICogbGVhZGluZyBtYXJnaW4gaW5kZW50IGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRMaW5lV2lkdGgoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmVNYXgobGluZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIGZsb2F0IG1hcmdpbiA9IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CisgICAgICAgIGZsb2F0IHNpZ25lZEV4dGVudCA9IGdldExpbmVFeHRlbnQobGluZSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtYXJnaW4gKyBzaWduZWRFeHRlbnQgPj0gMCA/IHNpZ25lZEV4dGVudCA6IC1zaWduZWRFeHRlbnQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRMaW5lTWF4KGludCBsaW5lLCBPYmplY3RbXSB0YWJzLCBib29sZWFuIGZ1bGwpIHsKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjZ2V0TGluZUV4dGVudChpbnQsVGFiU3RvcHMsYm9vbGVhbil9IGJ1dCBkZXRlcm1pbmVzIHRoZQorICAgICAqIHRhYiBzdG9wcyBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBvbmVzIHBhc3NlZCBpbi4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgaW5kZXggb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZnVsbCB3aGV0aGVyIHRvIGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGV4dGVudCBvZiB0aGUgbGluZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZUV4dGVudChpbnQgbGluZSwgYm9vbGVhbiBmdWxsKSB7CiAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZDsKKyAgICAgICAgaW50IGVuZCA9IGZ1bGwgPyBnZXRMaW5lRW5kKGxpbmUpIDogZ2V0TGluZVZpc2libGVFbmQobGluZSk7CiAKLSAgICAgICAgaWYgKGZ1bGwpIHsKLSAgICAgICAgICAgIGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbmQgPSBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKLSAgICAgICAgfSAKLSAgICAgICAgYm9vbGVhbiB0YWIgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7Ci0KLSAgICAgICAgaWYgKHRhYnMgPT0gbnVsbCAmJiB0YWIgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICBib29sZWFuIGhhc1RhYnNPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgIGlmIChoYXNUYWJzT3JFbW9qaSAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIC8vIEp1c3QgY2hlY2tpbmcgdGhpcyBsaW5lIHNob3VsZCBiZSBnb29kIGVub3VnaCwgdGFicyBzaG91bGQgYmUKKyAgICAgICAgICAgIC8vIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBsaW5lcyBpbiBhIHBhcmFncmFwaC4KKyAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIHJldHVybiBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgc3RhcnQsIGVuZCwgbnVsbCwgdGFiLCB0YWJzKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luLiAgSWYgZnVsbCBpcyBmYWxzZSwgZXhjbHVkZXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgaW5kZXggb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gdGFiU3RvcHMgdGhlIHRhYiBzdG9wcywgY2FuIGJlIG51bGwgaWYgd2Uga25vdyB0aGV5J3JlIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSB0ZXh0IG9uIHRoaXMgbGluZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZUV4dGVudChpbnQgbGluZSwgVGFiU3RvcHMgdGFiU3RvcHMsIGJvb2xlYW4gZnVsbCkgeworICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYnNPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICBmbG9hdCB3aWR0aCA9IHRsLm1ldHJpY3MobnVsbCk7CisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICByZXR1cm4gd2lkdGg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzgsNyArOTA1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNmaWVkIGxpbmUgd2hvc2UgcG9zaXRpb24gaXMKKyAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNpZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCiAgICAgICogY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkIGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGludCBsaW5lLCBmbG9hdCBob3JpeikgewpAQCAtNzUyLDE0ICs5MTksMTMgQEAKICAgICAgICAgaW50IGJlc3QgPSBtaW47CiAgICAgICAgIGZsb2F0IGJlc3RkaXN0ID0gTWF0aC5hYnMoZ2V0UHJpbWFyeUhvcml6b250YWwoYmVzdCkgLSBob3Jpeik7CiAKLSAgICAgICAgaW50IGhlcmUgPSBtaW47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpbnQgc3dhcCA9ICgoaSAmIDEpID09IDApID8gMSA6IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbWluICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGludCBzd2FwID0gKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9SVExfRkxBRykgIT0gMCA/IC0xIDogMTsKIAogICAgICAgICAgICAgaWYgKHRoZXJlID4gbWF4KQogICAgICAgICAgICAgICAgIHRoZXJlID0gbWF4OwotCiAgICAgICAgICAgICBpbnQgaGlnaCA9IHRoZXJlIC0gMSArIDEsIGxvdyA9IGhlcmUgKyAxIC0gMSwgZ3Vlc3M7CiAKICAgICAgICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewpAQCAtNzkyLDcgKzk1OCw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IGJlc3RkaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsgICAKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTgwMiw4ICs5NjgsNiBAQAogICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKICAgICAgICAgZmxvYXQgZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKG1heCkgLSBob3Jpeik7CkBAIC04MjMsMTkgKzk4NywxNSBAQAogICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0KGxpbmUgKyAxKTsKICAgICB9CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mZnNldCBhZnRlciB0aGUgbGFzdCB2aXNpYmxlIGNoYXJhY3RlciAoc28gd2hpdGVzcGFjZQogICAgICAqIGlzIG5vdCBjb3VudGVkKSBvbiB0aGUgc3BlY2lmaWVkIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSkgewogICAgICAgICByZXR1cm4gZ2V0TGluZVZpc2libGVFbmQobGluZSwgZ2V0TGluZVN0YXJ0KGxpbmUpLCBnZXRMaW5lU3RhcnQobGluZSsxKSk7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShnZXRMaW5lU3RhcnQobGluZSkgPT0gc3RhcnQgJiYgZ2V0TGluZVN0YXJ0KGxpbmUrMSkgPT0gZW5kKTsKLSAgICAgICAgfQogCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1UZXh0OwogICAgICAgICBjaGFyIGNoOwogICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpIHsKQEAgLTg4MiwyMDcgKzEwNDIsNjIgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVUb3AobGluZSkgLSAoZ2V0TGluZVRvcChsaW5lKzEpIC0gZ2V0TGluZURlc2NlbnQobGluZSkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgdGhhdCB3b3VsZCBiZSByZWFjaGVkIGJ5IG1vdmluZyBsZWZ0Ci0gICAgICogKHBvc3NpYmx5IG9udG8gYW5vdGhlciBsaW5lKSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9MZWZ0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7Ci0KLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kLS07Ci0KLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotCi0gICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAxMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCB0cnVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgcmlnaHQKLSAgICAgKiAocG9zc2libHkgb250byBhbm90aGVyIGxpbmUpIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRUb1JpZ2h0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgZmFsc2UpOworICAgIH0KIAotICAgICAgICBpZiAobGluZSAhPSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBlbmQtLTsKKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKGludCBjYXJldCwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KGNhcmV0KTsKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICBpbnQgbGluZURpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICBmbG9hdCBob3JpeiA9IGdldFByaW1hcnlIb3Jpem9udGFsKG9mZnNldCk7Ci0KLSAgICAgICAgaW50IGJlc3QgPSBvZmZzZXQ7Ci0gICAgICAgIGZsb2F0IGJlc3RoID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCBjYW5kaWRhdGU7Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gc3RhcnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQ7Ci0KLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChoZXJlKTsKLQotICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgaGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKKyAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IChsaW5lRGlyID09IERJUl9SSUdIVF9UT19MRUZUKTsKKyAgICAgICAgaWYgKGNhcmV0ID09IChhZHZhbmNlID8gbGluZUVuZCA6IGxpbmVTdGFydCkpIHsKKyAgICAgICAgICAgIC8vIHdhbGtpbmcgb2ZmIGxpbmUsIHNvIGxvb2sgYXQgdGhlIGxpbmUgd2UncmUgaGVhZGVkIHRvCisgICAgICAgICAgICBpZiAoY2FyZXQgPT0gbGluZVN0YXJ0KSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC0tbGluZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FyZXQ7IC8vIGF0IHZlcnkgc3RhcnQsIGRvbid0IG1vdmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsaW5lIDwgZ2V0TGluZUNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGluZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FyZXQ7IC8vIGF0IHZlcnkgZW5kLCBkb24ndCBtb3ZlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgICAgICBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgICAgIGludCBuZXdEaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisgICAgICAgICAgICBpZiAobmV3RGlyICE9IGxpbmVEaXIpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnVzdWFsIGNhc2UuICB3ZSB3YW50IHRvIHdhbGsgb250byB0aGUgbGluZSwgYnV0IGl0IHJ1bnMKKyAgICAgICAgICAgICAgICAvLyBpbiBhIGRpZmZlcmVudCBkaXJlY3Rpb24gdGhhbiB0aGlzIG9uZSwgc28gd2UgZmFrZSBtb3ZlbWVudAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgdG9MZWZ0ID0gIXRvTGVmdDsKKyAgICAgICAgICAgICAgICBsaW5lRGlyID0gbmV3RGlyOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7CiAgICAgICAgIH0KIAotICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKLSAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgIGJlc3QgPSBlbmQ7Ci0gICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVzdCAhPSBvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gYmVzdDsKLQotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCi0gICAgICAgIGlmIChkaXIgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSArIDEsIC0xMDAwMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgLSAxLCAtMTAwMDApOwotICAgICAgICB9CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIC8vIFhYWDogd2UgZG9uJ3QgY2FyZSBhYm91dCB0YWJzCisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBsaW5lU3RhcnQsIGxpbmVFbmQsIGxpbmVEaXIsIGRpcmVjdGlvbnMsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgY2FyZXQgPSBsaW5lU3RhcnQgKyB0bC5nZXRPZmZzZXRUb0xlZnRSaWdodE9mKGNhcmV0IC0gbGluZVN0YXJ0LCB0b0xlZnQpOworICAgICAgICB0bCA9IFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICByZXR1cm4gY2FyZXQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0QXRTdGFydE9mKGludCBvZmZzZXQpIHsKKyAgICAgICAgLy8gWFhYIHRoaXMgcHJvYmFibHkgc2hvdWxkIHNraXAgbG9jYWwgcmVvcmRlcmluZ3MgYW5kCisgICAgICAgIC8vIHplcm8td2lkdGggY2hhcmFjdGVycywgbG9vayBhdCBjYWxsZXJzCiAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkKICAgICAgICAgICAgIHJldHVybiAwOwogCkBAIC0xMTE1LDcgKzExMzAsNyBAQAogICAgIC8qKgogICAgICAqIEZpbGxzIGluIHRoZSBzcGVjaWZpZWQgUGF0aCB3aXRoIGEgcmVwcmVzZW50YXRpb24gb2YgYSBjdXJzb3IKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gIFRoaXMgd2lsbCBvZnRlbiBiZSBhIHZlcnRpY2FsIGxpbmUKLSAgICAgKiBidXQgY2FuIGJlIG11bHRpcGxlIGRpc2NvbnRpbm91cyBsaW5lcyBpbiB0ZXh0IHdpdGggbXVsdGlwbGUKKyAgICAgKiBidXQgY2FuIGJlIG11bHRpcGxlIGRpc2NvbnRpbnVvdXMgbGluZXMgaW4gdGV4dCB3aXRoIG11bHRpcGxlCiAgICAgICogZGlyZWN0aW9uYWxpdGllcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRDdXJzb3JQYXRoKGludCBwb2ludCwgUGF0aCBkZXN0LApAQCAtMTEyNyw3ICsxMTQyLDggQEAKICAgICAgICAgaW50IGJvdHRvbSA9IGdldExpbmVUb3AobGluZSsxKTsKIAogICAgICAgICBmbG9hdCBoMSA9IGdldFByaW1hcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWY7Ci0gICAgICAgIGZsb2F0IGgyID0gZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmOworICAgICAgICBmbG9hdCBoMiA9IGlzTGV2ZWxCb3VuZGFyeShwb2ludCkgPworICAgICAgICAgICAgICAgICAgICBnZXRTZWNvbmRhcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWYgOiBoMTsKIAogICAgICAgICBpbnQgY2FwcyA9IFRleHRLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoZWRpdGluZ0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pIHwKQEAgLTEyMDQsOSArMTIyMCwxMCBAQAogICAgICAgICBpZiAobGluZWVuZCA+IGxpbmVzdGFydCAmJiBtVGV4dC5jaGFyQXQobGluZWVuZCAtIDEpID09ICdcbicpCiAgICAgICAgICAgICBsaW5lZW5kLS07CiAKLSAgICAgICAgaW50IGhlcmUgPSBsaW5lc3RhcnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IGhlcmUgPSBsaW5lc3RhcnQgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOworICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworCiAgICAgICAgICAgICBpZiAodGhlcmUgPiBsaW5lZW5kKQogICAgICAgICAgICAgICAgIHRoZXJlID0gbGluZWVuZDsKIApAQCAtMTIxNSwxNCArMTIzMiwxMiBAQAogICAgICAgICAgICAgICAgIGludCBlbiA9IE1hdGgubWluKGVuZCwgdGhlcmUpOwogCiAgICAgICAgICAgICAgICAgaWYgKHN0ICE9IGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGgxID0gZ2V0SG9yaXpvbnRhbChzdCwgZmFsc2UsIGZhbHNlLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIgPSBnZXRIb3Jpem9udGFsKGVuLCB0cnVlLCBmYWxzZSwgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgxID0gZ2V0SG9yaXpvbnRhbChzdCwgZmFsc2UsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMiA9IGdldEhvcml6b250YWwoZW4sIHRydWUsIGxpbmUpOwogCiAgICAgICAgICAgICAgICAgICAgIGRlc3QuYWRkUmVjdChoMSwgdG9wLCBoMiwgYm90dG9tLCBQYXRoLkRpcmVjdGlvbi5DVyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNTcsNyArMTI3Miw3IEBACiAKICAgICAgICAgICAgIGFkZFNlbGVjdGlvbihzdGFydGxpbmUsIHN0YXJ0LCBnZXRMaW5lRW5kKHN0YXJ0bGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCBnZXRMaW5lQm90dG9tKHN0YXJ0bGluZSksIGRlc3QpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oc3RhcnRsaW5lKSA9PSBESVJfUklHSFRfVE9fTEVGVCkKICAgICAgICAgICAgICAgICBkZXN0LmFkZFJlY3QoZ2V0TGluZUxlZnQoc3RhcnRsaW5lKSwgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZ2V0TGluZUJvdHRvbShzdGFydGxpbmUpLCBQYXRoLkRpcmVjdGlvbi5DVyk7CkBAIC0xMzEwLDQyMiArMTMyNSwxNzMgQEAKICAgICAgKiBHZXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFncmFwaCwgaW5zZXQgYnkgbGVmdCBtYXJnaW5zLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyYWdyYXBoTGVmdChpbnQgbGluZSkgewotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCiAgICAgICAgIGludCBsZWZ0ID0gMDsKLQotICAgICAgICBib29sZWFuIHBhciA9IGZhbHNlOwotICAgICAgICBpbnQgb2ZmID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpZiAob2ZmID09IDAgfHwgbVRleHQuY2hhckF0KG9mZiAtIDEpID09ICdcbicpCi0gICAgICAgICAgICBwYXIgPSB0cnVlOwotCi0gICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhnZXRMaW5lU3RhcnQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXJnaW4gPSBwYXI7Ci0gICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIHNwYW4gPSBzcGFuc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKXNwYW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IGNvdW50ID49IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBzcGFuLmdldExlYWRpbmdNYXJnaW4obWFyZ2luKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQgfHwgIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQ7IC8vIGxlYWRpbmcgbWFyZ2luIGhhcyBubyBpbXBhY3QsIG9yIG5vIHN0eWxlcwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgICAgIHJldHVybiBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFncmFwaCwgaW5zZXQgYnkgcmlnaHQgbWFyZ2lucy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaFJpZ2h0KGludCBsaW5lKSB7Ci0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOwotCi0gICAgICAgIGJvb2xlYW4gcGFyID0gZmFsc2U7Ci0gICAgICAgIGludCBvZmYgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGlmIChvZmYgPT0gMCB8fCBtVGV4dC5jaGFyQXQob2ZmIC0gMSkgPT0gJ1xuJykKLSAgICAgICAgICAgIHBhciA9IHRydWU7Ci0KLQotICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IHNwYW5zW2ldLmdldExlYWRpbmdNYXJnaW4ocGFyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgfHwgIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHJpZ2h0OyAvLyBsZWFkaW5nIG1hcmdpbiBoYXMgbm8gaW1wYWN0LCBvciBubyBzdHlsZXMKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByaWdodDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZHJhd1RleHQoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMsIE9iamVjdFtdIHBhcnNwYW5zKSB7Ci0gICAgICAgIGNoYXJbXSBidWY7Ci0gICAgICAgIGlmICghaGFzVGFicykgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShESVJfTEVGVF9UT19SSUdIVCA9PSBkaXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZiA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IDA7Ci0KLSAgICAgICAgaW50IGhlcmUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kIC0gc3RhcnQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gaGVyZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBoYXNUYWJzID8gaGVyZSA6IHRoZXJlOyBqIDw9IHRoZXJlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSB0aGVyZSB8fCBidWZbal0gPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCAoaSAmIDEpICE9IDAsIHggKyBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqICE9IGVuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYnVmW2pdID09ICdcdCcpCi0gICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCBwYXJzcGFucyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhc1RhYnMgJiYgYnVmW2pdID49IDB4RDgwMCAmJiBidWZbal0gPD0gMHhERkZGICYmIGogKyAxIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVtb2ppID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1Ziwgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEVNT0pJX0ZBQ1RPUlkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoZW1vamkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCAoaSAmIDEpICE9IDAsIHggKyBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiAhPSBlbmQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbW9qaVJlY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW1vamlSZWN0ID0gbmV3IFJlY3RGKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiwgc3RhcnQgKyBqICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdGV4dEhlaWdodCA9IC13b3JrUGFpbnQuYXNjZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSB0ZXh0SGVpZ2h0IC8gYml0bWFwSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtb2ppUmVjdC5zZXQoeCArIGgsIHkgLSB0ZXh0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBoICsgd2lkdGgsIHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoYm0sIG51bGwsIG1FbW9qaVJlY3QsIHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBvZmZzZXQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLQotICAgICAgICBpZiAoaGFzVGFicykgewotICAgICAgICAgICAgYnVmID0gVGV4dFV0aWxzLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSAwOwotCi0gICAgICAgIGlmIChhbHQpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aW9ucy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGFsdCkKLSAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKLQotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcmVjdGlvbnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQgLSBzdGFydCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBoZXJlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGhhc1RhYnMgPyBoZXJlIDogdGhlcmU7IGogPD0gdGhlcmU7IGorKykgewotICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOwotICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFzVGFicyAmJiBqIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gYnVmW2pdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhEODAwICYmIGNvZGVwdCA8PSAweERGRkYgJiYgaiArIDEgPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmLCBqKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IE1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibSA9IEVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChqID09IHRoZXJlIHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2VndzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgc3RhcnQgKyBqIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICh0cmFpbGluZyAmJiBvZmZzZXQgPD0gc3RhcnQgKyBqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCAmJiAoaSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCAmJiAoaSAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC09IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNlZ3cgPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0ICsgaiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWlsaW5nICYmIG9mZnNldCA8PSBzdGFydCArIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBzZWd3IC0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC09IHNlZ3cgLSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICBoIC09IHNlZ3c7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gc2VndzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBidWZbal0gPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBzdGFydCArIGopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXIgKiBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIGggKiBkaXIsIHRhYnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaiArIDIsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiBoOworICAgICAgICByZXR1cm4gcmlnaHQgLSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1lYXN1cmUgd2lkdGggb2YgYSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lIHRoYXQgaXMga25vd24gdG8gYWxsIGJlCi0gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoZSBwYXJhZ3JhcGggYmFzZSBkaXJlY3Rpb24uIFJldHVybnMgdGhlIHdpZHRoLAotICAgICAqIGFuZCB0aGUgbGluZSBtZXRyaWNzIGluIGZtIGlmIGZtIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludCBmb3IgdGhlIHRleHQ7IHdpbGwgbm90IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBwYWludCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbgotICAgICAqIEBwYXJhbSB0ZXh0IHRleHQKLSAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUKLSAgICAgKiBAcGFyYW0gZW5kIGxpbWl0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGZtIG9iamVjdCB0byByZXR1cm4gaW50ZWdlciBtZXRyaWNzIGluLCBjYW4gYmUgbnVsbAotICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgaXQgaXMga25vd24gdGhhdCB0aGUgbGluZSBoYXMgdGFicwotICAgICAqIEBwYXJhbSB0YWJzIHRhYiBwb3NpdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGZyb20gc3RhcnQgdG8gZW5kCisgICAgICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIGxlYWRpbmcgbWFyZ2luICh1bnNpZ25lZCkgZm9yIHRoaXMgbGluZSwKKyAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IExlYWRpbmdNYXJnaW5TcGFuIGFuZCBMZWFkaW5nTWFyZ2luU3BhbjIuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBsZWFkaW5nIG1hcmdpbiBvZiB0aGlzIGxpbmUKICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotICAKLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgcHJpdmF0ZSBpbnQgZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihpbnQgbGluZSkgeworICAgICAgICBpZiAoIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworCisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihsaW5lU3RhcnQsIGxpbmVFbmQsCisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhsaW5lU3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CisgICAgICAgIGlmIChzcGFucy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7IC8vIG5vIGxlYWRpbmcgbWFyZ2luIHNwYW47CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGludCBtYXJnaW4gPSAwOwogCi0gICAgICAgIGludCBsYXN0UG9zID0gMDsKLSAgICAgICAgZmxvYXQgd2lkdGggPSAwOwotICAgICAgICBpbnQgYXNjZW50ID0gMCwgZGVzY2VudCA9IDAsIHRvcCA9IDAsIGJvdHRvbSA9IDA7CisgICAgICAgIGJvb2xlYW4gaXNGaXJzdFBhcmFMaW5lID0gbGluZVN0YXJ0ID09IDAgfHwKKyAgICAgICAgICAgIHNwYW5uZWQuY2hhckF0KGxpbmVTdGFydCAtIDEpID09ICdcbic7CiAKLSAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZtLmFzY2VudCA9IDA7Ci0gICAgICAgICAgICBmbS5kZXNjZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IHBvcyA9IGhhc1RhYnMgPyAwIDogbGVuOyBwb3MgPD0gbGVuOyBwb3MrKykgewotICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7Ci0gICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoaGFzVGFicyAmJiBwb3MgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICBjb2RlcHQgPSBidWZbcG9zXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gc3BhbiA9IHNwYW5zW2ldOworICAgICAgICAgICAgYm9vbGVhbiB1c2VGaXJzdExpbmVNYXJnaW4gPSBpc0ZpcnN0UGFyYUxpbmU7CisgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgIGludCBzcFN0YXJ0ID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoc3Bhbik7CisgICAgICAgICAgICAgICAgaW50IHNwYW5MaW5lID0gZ2V0TGluZUZvck9mZnNldChzcFN0YXJ0KTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuMilzcGFuKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7CisgICAgICAgICAgICAgICAgdXNlRmlyc3RMaW5lTWFyZ2luID0gbGluZSA8IHNwYW5MaW5lICsgY291bnQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXJnaW4gKz0gc3Bhbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweEQ4MDAgJiYgY29kZXB0IDw9IDB4REZGRiAmJiBwb3MgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmLCBwb3MpOworICAgICAgICByZXR1cm4gbWFyZ2luOworICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTUlOX0VNT0pJICYmIGNvZGVwdCA8PSBNQVhfRU1PSkkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm0gPSBFTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7CisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBmbG9hdCBtZWFzdXJlUGFyYShUZXh0UGFpbnQgcGFpbnQsIFRleHRQYWludCB3b3JrUGFpbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXQuc2V0UGFyYSh0ZXh0LCBzdGFydCwgZW5kLCBESVJfUkVRVUVTVF9MVFIpOworICAgICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zOworICAgICAgICAgICAgaW50IGRpcjsKKyAgICAgICAgICAgIGlmIChtdC5tRWFzeSkgeworICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgICAgIGRpciA9IExheW91dC5ESVJfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IEFuZHJvaWRCaWRpLmRpcmVjdGlvbnMobXQubURpciwgbXQubUxldmVscywKKyAgICAgICAgICAgICAgICAgICAgMCwgbXQubUNoYXJzLCAwLCBtdC5tTGVuKTsKKyAgICAgICAgICAgICAgICBkaXIgPSBtdC5tRGlyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbXQubUNoYXJzOworICAgICAgICAgICAgaW50IGxlbiA9IG10Lm1MZW47CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMgPSBmYWxzZTsKKyAgICAgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICBoYXNUYWJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSBzcGFucyA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsLnNldChwYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzLCB0YWJTdG9wcyk7CisgICAgICAgICAgICByZXR1cm4gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpZiAocG9zID09IGxlbiB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgVGFiU3RvcHMgeworICAgICAgICBwcml2YXRlIGludFtdIG1TdG9wczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtSW5jcmVtZW50OwogCi0gICAgICAgICAgICAgICAgd2lkdGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBsYXN0UG9zLCBzdGFydCArIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSk7CisgICAgICAgIFRhYlN0b3BzKGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICByZXNldChpbmNyZW1lbnQsIHNwYW5zKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgdm9pZCByZXNldChpbnQgaW5jcmVtZW50LCBPYmplY3RbXSBzcGFucykgeworICAgICAgICAgICAgdGhpcy5tSW5jcmVtZW50ID0gaW5jcmVtZW50OworCisgICAgICAgICAgICBpbnQgbnMgPSAwOworICAgICAgICAgICAgaWYgKHNwYW5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBzcGFucykgeworICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYlN0b3BTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbmV3IGludFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zID09IHN0b3BzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIG5zdG9wcyA9IG5ldyBpbnRbbnMgKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0b3BzW2ldID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbnN0b3BzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHNbbnMrK10gPSAoKFRhYlN0b3BTcGFuKSBvKS5nZXRUYWJTdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9zICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZW1vamksIG11c3QgaGF2ZSBoaXQgYSB0YWIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aCwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNldHMgdXAgd29ya1BhaW50IHdpdGggdGhlIGZvbnQgb24gdGhlIGVtb2ppCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0LCBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRoZSBhc2NlbnQgYW5kIHNjYWxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQgYmVjYXVzZSB0aGUgZW1vamkgbWlnaHQgaGF2ZSBpdHMgb3duIHN0eWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBpbml0aWFsaXplIHdvcmtQYWludCBoZXJlIGJlY2F1c2UgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGlzIHVuc3R5bGVkIG1lYXN1cmVUZXh0IG1pZ2h0IG5vdCB1c2Ugd29ya1BhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBhbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgcG9zLCBzdGFydCArIHBvcyArIDEsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYWQgYW4gZW1vamksIHdlIGJ1bXAgcGFzdCB0aGUgc2Vjb25kIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5zID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChzdG9wcywgMCwgbnMpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5hc2NlbnQgPCBhc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGZtLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uZGVzY2VudCA+IGRlc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbnQgPSBmbS5kZXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLnRvcCA8IHRvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gZm0udG9wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5ib3R0b20gPiBib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IGZtLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBiaXRtYXAgaGVpZ2h0IGludG8gYWNjb3VudCBoZXJlLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBzY2FsZWQgdG8gbWF0Y2ggdGhlIHRleHQgaGVpZ2h0LgorICAgICAgICAgICAgICAgIGlmIChzdG9wcyAhPSB0aGlzLm1TdG9wcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1TdG9wcyA9IHN0b3BzOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tTnVtU3RvcHMgPSBuczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSBhc2NlbnQ7Ci0gICAgICAgICAgICBmbS5kZXNjZW50ID0gZGVzY2VudDsKLSAgICAgICAgICAgIGZtLnRvcCA9IHRvcDsKLSAgICAgICAgICAgIGZtLmJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgICAgICBpbnQgbnMgPSB0aGlzLm1OdW1TdG9wczsKKyAgICAgICAgICAgIGlmIChucyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcCA9IHN0b3BzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA+IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHREZWZhdWx0U3RvcChoLCBtSW5jcmVtZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbmV4dERlZmF1bHRTdG9wKGZsb2F0IGgsIGludCBpbmMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGludCkgKChoICsgaW5jKSAvIGluYykpICogaW5jOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODA0LDIzICsxNTcwLDIyIEBACiAKICAgICAvKioKICAgICAgKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYmlkaXJlY3Rpb25hbCAobGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KQotICAgICAqIHRleHQgd2l0aGluIHRoZSBsYXlvdXQgb2YgYSBsaW5lLiAgVE9ETzogVGhpcyB3b3JrIGlzIG5vdCBjb21wbGV0ZQotICAgICAqIG9yIGNvcnJlY3QgYW5kIHdpbGwgYmUgZmxlc2hlZCBvdXQgaW4gYSBsYXRlciByZXZpc2lvbi4KKyAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpcmVjdGlvbnMgewotICAgICAgICBwcml2YXRlIHNob3J0W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8vIERpcmVjdGlvbnMgcmVwcmVzZW50cyBkaXJlY3Rpb25hbCBydW5zIHdpdGhpbiBhIGxpbmUgb2YgdGV4dC4KKyAgICAgICAgLy8gUnVucyBhcmUgcGFpcnMgb2YgaW50cyBsaXN0ZWQgaW4gdmlzdWFsIG9yZGVyLCBzdGFydGluZyBmcm9tIHRoZQorICAgICAgICAvLyBsZWFkaW5nIG1hcmdpbi4gIFRoZSBmaXJzdCBpbnQgb2YgZWFjaCBwYWlyIGlzIHRoZSBvZmZzZXQgZnJvbQorICAgICAgICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgcnVuLiAgVGhlCisgICAgICAgIC8vIHNlY29uZCBpbnQgcmVwcmVzZW50cyBib3RoIHRoZSBsZW5ndGggYW5kIGxldmVsIG9mIHRoZSBydW4uCisgICAgICAgIC8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIGxvd2VyIGJpdHMsIGFjY2Vzc2VkIGJ5IG1hc2tpbmcgd2l0aAorICAgICAgICAvLyBESVJfTEVOR1RIX01BU0suICBUaGUgbGV2ZWwgaXMgaW4gdGhlIGhpZ2hlciBiaXRzLCBhY2Nlc3NlZAorICAgICAgICAvLyBieSBzaGlmdGluZyBieSBESVJfTEVWRUxfU0hJRlQgYW5kIG1hc2tpbmcgYnkgRElSX0xFVkVMX01BU0suCisgICAgICAgIC8vIFRvIHNpbXBseSB0ZXN0IGZvciBhbiBSVEwgZGlyZWN0aW9uLCB0ZXN0IHRoZSBiaXQgdXNpbmcKKyAgICAgICAgLy8gRElSX1JUTF9GTEFHLCBpZiBzZXQgdGhlbiB0aGUgZGlyZWN0aW9uIGlzIHJ0bC4KIAotICAgICAgICAvLyBUaGUgdmFsdWVzIGluIG1EaXJlY3Rpb25zIGFyZSB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgICAgLy8gaW4gdGhlIGxpbmUgdG8gdGhlIG5leHQgZmxpcCBpbiBkaXJlY3Rpb24uICBSdW5zIGF0IGV2ZW4gaW5kaWNlcwotICAgICAgICAvLyBhcmUgbGVmdC10by1yaWdodCwgdGhlIG90aGVycyBhcmUgcmlnaHQtdG8tbGVmdC4gIFNvLCBmb3IgZXhhbXBsZSwKLSAgICAgICAgLy8gYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggYSByaWdodC10by1sZWZ0IHJ1biBoYXMgMCBhdCBtRGlyZWN0aW9uc1swXSwKLSAgICAgICAgLy8gc2luY2UgdGhlICdmaXJzdCcgKGx0cikgcnVuIGlzIHplcm8gbGVuZ3RoLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgY29kZSBjdXJyZW50bHkgYXNzdW1lcyB0aGF0IGVhY2ggcnVuIGlzIGFkamFjZW50IHRvIHRoZSBwcmV2aW91cwotICAgICAgICAvLyBvbmUsIHByb2dyZXNzaW5nIGluIHRoZSBiYXNlIGxpbmUgZGlyZWN0aW9uLiAgVGhpcyBpc24ndCBzdWZmaWNpZW50Ci0gICAgICAgIC8vIHRvIGhhbmRsZSBuZXN0ZWQgcnVucywgZm9yIGV4YW1wbGUgbnVtZXJpYyB0ZXh0IGluIGFuIHJ0bCBjb250ZXh0Ci0gICAgICAgIC8vIGluIGFuIGx0ciBwYXJhZ3JhcGguCi0gICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhzaG9ydFtdIGRpcnMpIHsKKyAgICAgICAgLyogcGFja2FnZSAqLyBpbnRbXSBtRGlyZWN0aW9uczsKKyAgICAgICAgLyogcGFja2FnZSAqLyBEaXJlY3Rpb25zKGludFtdIGRpcnMpIHsKICAgICAgICAgICAgIG1EaXJlY3Rpb25zID0gZGlyczsKICAgICAgICAgfQogICAgIH0KQEAgLTE4MzEsNiArMTU5Niw3IEBACiAgICAgICogbGluZSBpcyBlbGxpcHNpemVkLCBub3QgZ2V0TGluZVN0YXJ0KCkuKQogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RWxsaXBzaXNTdGFydChpbnQgbGluZSk7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlbGxpcHNpemVkIGF3YXksIG9yIDAgaWYKICAgICAgKiBubyBlbGxpcHNpcyBpcyB0byB0YWtlIHBsYWNlLgpAQCAtMTg3MCw3ICsxNjM2LDcgQEAKICAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVRleHQubGVuZ3RoKCk7CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICAgICAgY2hhcltdIHMgPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CiAgICAgICAgICAgICBnZXRDaGFycyhzdGFydCwgZW5kLCBzLCAwKTsKQEAgLTE5MzYsMTIgKzE3MDIsMTcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9MRUZUX1RPX1JJR0hUID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfUklHSFRfVE9fTEVGVCA9IC0xOwotICAgIAorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0xUUiA9IDE7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX1JUTCA9IC0xOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiA9IDI7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0RFRkFVTFRfUlRMID0gLTI7CiAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKICAgICBwdWJsaWMgZW51bSBBbGlnbm1lbnQgewogICAgICAgICBBTElHTl9OT1JNQUwsCiAgICAgICAgIEFMSUdOX09QUE9TSVRFLApAQCAtMTk1Myw5ICsxNzI0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOwogCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMzI3NjcgfSk7CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IHNob3J0W10geyAwLCAzMjc2NyB9KTsKLQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Njk5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRleHQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBAaGlkZQorICovCitjbGFzcyBNZWFzdXJlZFRleHQgeworICAgIC8qIHBhY2thZ2UgKi8gQ2hhclNlcXVlbmNlIG1UZXh0OworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1UZXh0U3RhcnQ7CisgICAgLyogcGFja2FnZSAqLyBmbG9hdFtdIG1XaWR0aHM7CisgICAgLyogcGFja2FnZSAqLyBjaGFyW10gbUNoYXJzOworICAgIC8qIHBhY2thZ2UgKi8gYnl0ZVtdIG1MZXZlbHM7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbURpcjsKKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gbUVhc3k7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtUG9zOworICAgIHByaXZhdGUgVGV4dFBhaW50IG1Xb3JrUGFpbnQ7CisKKyAgICBwcml2YXRlIE1lYXN1cmVkVGV4dCgpIHsKKyAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZWFzdXJlZFRleHRbXSBjYWNoZWQgPSBuZXcgTWVhc3VyZWRUZXh0WzNdOworCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBNZWFzdXJlZFRleHQgb2J0YWluKCkgeworICAgICAgICBNZWFzdXJlZFRleHQgbXQ7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG10ID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG10ID0gbmV3IE1lYXN1cmVkVGV4dCgpOworICAgICAgICBMb2cuZSgiTUVBUyIsICJuZXc6ICIgKyBtdCk7CisgICAgICAgIHJldHVybiBtdDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIE1lYXN1cmVkVGV4dCByZWN5Y2xlKE1lYXN1cmVkVGV4dCBtdCkgeworICAgICAgICBtdC5tVGV4dCA9IG51bGw7CisgICAgICAgIGlmIChtdC5tTGVuIDwgMTAwMCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmFseXplcyB0ZXh0IGZvciBiaWRpcmVjdGlvbmFsIHJ1bnMuICBBbGxvY2F0ZXMgd29ya2luZyBidWZmZXJzLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8KKyAgICB2b2lkIHNldFBhcmEoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGJpZGlSZXF1ZXN0KSB7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVRleHRTdGFydCA9IHN0YXJ0OworCisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgbUxlbiA9IGxlbjsKKyAgICAgICAgbVBvcyA9IDA7CisKKyAgICAgICAgaWYgKG1XaWR0aHMgPT0gbnVsbCB8fCBtV2lkdGhzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgbVdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsRmxvYXRBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DaGFycyA9PSBudWxsIHx8IG1DaGFycy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGxlbildOworICAgICAgICB9CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBtQ2hhcnMsIDApOworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW5bXSBzcGFucyA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBzdGFydEluUGFyYSA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KHNwYW5zW2ldKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGludCBlbmRJblBhcmEgPSBzcGFubmVkLmdldFNwYW5FbmQoc3BhbnNbaV0pIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0SW5QYXJhOyBqIDwgZW5kSW5QYXJhOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoYXJzW2pdID0gJ1x1RkZGQyc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFRleHRVdGlscy5kb2VzTm90TmVlZEJpZGkobUNoYXJzLCAwLCBsZW4pKSB7CisgICAgICAgICAgICBtRGlyID0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgbUVhc3kgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1MZXZlbHMgPT0gbnVsbCB8fCBtTGV2ZWxzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgICAgIG1MZXZlbHMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaXIgPSBBbmRyb2lkQmlkaS5iaWRpKGJpZGlSZXF1ZXN0LCBtQ2hhcnMsIG1MZXZlbHMsIGxlbiwgZmFsc2UpOworICAgICAgICAgICAgbUVhc3kgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IGFkZFN0eWxlUnVuKFRleHRQYWludCBwYWludCwgaW50IGxlbiwgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0pIHsKKyAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwID0gbVBvczsKKyAgICAgICAgbVBvcyA9IHAgKyBsZW47CisKKyAgICAgICAgaWYgKG1FYXN5KSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBtRGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAorICAgICAgICAgICAgICAgID8gQ2FudmFzLkRJUkVDVElPTl9MVFIgOiBDYW52YXMuRElSRUNUSU9OX1JUTDsKKyAgICAgICAgICAgIHJldHVybiBwYWludC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBwLCBsZW4sIHAsIGxlbiwgZmxhZ3MsIG1XaWR0aHMsIHApOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gMDsKKyAgICAgICAgaW50IGxldmVsID0gbUxldmVsc1twXTsKKyAgICAgICAgZm9yIChpbnQgcSA9IHAsIGkgPSBwICsgMSwgZSA9IHAgKyBsZW47OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID09IGUgfHwgbUxldmVsc1tpXSAhPSBsZXZlbCkgeworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IChsZXZlbCAmIDB4MSkgPT0gMCA/IENhbnZhcy5ESVJFQ1RJT05fTFRSIDogQ2FudmFzLkRJUkVDVElPTl9SVEw7CisgICAgICAgICAgICAgICAgdG90YWxBZHZhbmNlICs9CisgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBxLCBpIC0gcSwgcSwgaSAtIHEsIGZsYWdzLCBtV2lkdGhzLCBxKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBlKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxID0gaTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IG1MZXZlbHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKKyAgICB9CisKKyAgICBmbG9hdCBhZGRTdHlsZVJ1bihUZXh0UGFpbnQgcGFpbnQsIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucywgaW50IGxlbiwKKyAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtKSB7CisKKyAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOworICAgICAgICAvLyBYWFggcGFpbnQgc2hvdWxkIG5vdCBoYXZlIGEgYmFzZWxpbmUgc2hpZnQsIGJ1dC4uLgorICAgICAgICB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisKKyAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbaV07CisgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgeworICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgd2lkOworICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgd2lkID0gYWRkU3R5bGVSdW4od29ya1BhaW50LCBsZW4sIGZtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFVzZSBvcmlnaW5hbCB0ZXh0LiAgU2hvdWxkbid0IG1hdHRlci4KKyAgICAgICAgICAgIHdpZCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCBtVGV4dCwgbVRleHRTdGFydCArIG1Qb3MsCisgICAgICAgICAgICAgICAgICAgIG1UZXh0U3RhcnQgKyBtUG9zICsgbGVuLCBmbSk7CisgICAgICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICAgICAgd1ttUG9zXSA9IHdpZDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9zICsgMSwgZSA9IG1Qb3MgKyBsZW47IGkgPCBlOyBpKyspCisgICAgICAgICAgICAgICAgd1tpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm0gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgeworICAgICAgICAgICAgICAgIGZtLmFzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICBmbS50b3AgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdpZDsKKyAgICB9CisKKyAgICBpbnQgYnJlYWtUZXh0KGludCBzdGFydCwgaW50IGxpbWl0LCBib29sZWFuIGZvcndhcmRzLCBmbG9hdCB3aWR0aCkgeworICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICBpZiAoZm9yd2FyZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdpZHRoIC09IHdbaV0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaW1pdDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgICAgIGlmICgod2lkdGggLT0gd1tpXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdCAtIGkgLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbWl0IC0gc3RhcnQ7CisgICAgfQorCisgICAgZmxvYXQgbWVhc3VyZShpbnQgc3RhcnQsIGludCBsaW1pdCkgeworICAgICAgICBmbG9hdCB3aWR0aCA9IDA7CisgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgIHdpZHRoICs9IHdbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhCmluZGV4IGNhYWFmYTEuLjU2ZjEzMDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhCkBAIC0xNyw4ICsxNyw5IEBACiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogCkBAIC03ODAsNyArNzgxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gMSkgewogICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKQEAgLTEwNTQsNyArMTA1NSwzMiBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBDYW52YXMgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICBjaGVja1JhbmdlKCJkcmF3VGV4dFJ1biIsIHN0YXJ0LCBlbmQpOworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0LCBsZW4sIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLCBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4oYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLCAwLCBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKICAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCkBAIC0xMTAzLDYgKzExMjksNTggQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNQb3MsIFBhaW50IHApIHsKKworICAgICAgICBmbG9hdCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisKKyAgICAgICAgaWYgKGVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNQb3MpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IG1HYXBTdGFydCkgeworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMobVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMoYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworCisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCArIG1HYXBMZW5ndGgsIGN1cnNvck9wdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihidWYsIDAsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgLSBjb250ZXh0U3RhcnQsIGN1cnNvck9wdCkgKyBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKICAgICAvLyBEb2N1bWVudGF0aW9uIGZyb20gaW50ZXJmYWNlCiAgICAgcHVibGljIHZvaWQgc2V0RmlsdGVycyhJbnB1dEZpbHRlcltdIGZpbHRlcnMpIHsKICAgICAgICAgaWYgKGZpbHRlcnMgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uZWQuamF2YQppbmRleCAxNTQ0OTdkLi5kMTRmY2JjNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUgPSBTUEFOX1BPSU5UX01BUks7CiAKICAgICAvKioKLSAgICAgKiBOb24tMC1sZW5ndGggc3BhbnMgb2YgdHlwZSBTUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUgZXhwYW5kCisgICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9FWENMVVNJVkVfSU5DTFVTSVZFIGV4cGFuZAogICAgICAqIHRvIGluY2x1ZGUgdGV4dCBpbnNlcnRlZCBhdCB0aGVpciBlbmRpbmcgcG9pbnQgYnV0IG5vdCBhdCB0aGVpcgogICAgICAqIHN0YXJ0aW5nIHBvaW50LiAgV2hlbiAwLWxlbmd0aCwgdGhleSBiZWhhdmUgbGlrZSBwb2ludHMuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQppbmRleCBmMDJhZDJhLi40NDE1N2RlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lSGVpZ2h0U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogCiAvKioKICAqIFN0YXRpY0xheW91dCBpcyBhIExheW91dCBmb3IgdGV4dCB0aGF0IHdpbGwgbm90IGJlIGVkaXRlZCBhZnRlciBpdApAQCAtMzEsOCArMzIsOSBAQAogICogPHA+VGhpcyBpcyB1c2VkIGJ5IHdpZGdldHMgdG8gY29udHJvbCB0ZXh0IGxheW91dC4gWW91IHNob3VsZCBub3QgbmVlZAogICogdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkgdW5sZXNzIHlvdSBhcmUgaW1wbGVtZW50aW5nIHlvdXIgb3duIHdpZGdldAogICogb3IgY3VzdG9tIGRpc3BsYXkgb2JqZWN0LCBvciB3b3VsZCBiZSB0ZW1wdGVkIHRvIGNhbGwKLSAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQsIGludCwgZmxvYXQsIGZsb2F0LCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotICogIENhbnZhcy5kcmF3VGV4dCgpfSBkaXJlY3RseS48L3A+CisgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgaW50LCBpbnQsCisgKiBmbG9hdCwgZmxvYXQsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCisgKiBDYW52YXMuZHJhd1RleHQoKX0gZGlyZWN0bHkuPC9wPgogICovCiBwdWJsaWMgY2xhc3MKIFN0YXRpY0xheW91dApAQCAtNjIsNyArNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlcGFkLAogICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLlRydW5jYXRlQXQgZWxsaXBzaXplLCBpbnQgZWxsaXBzaXplZFdpZHRoKSB7CiAgICAgICAgIHN1cGVyKChlbGxpcHNpemUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IHNvdXJjZSAKKyAgICAgICAgICAgICAgICA/IHNvdXJjZQogICAgICAgICAgICAgICAgIDogKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpCiAgICAgICAgICAgICAgICAgICAgID8gbmV3IFNwYW5uZWRFbGxpcHNpemVyKHNvdXJjZSkKICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRWxsaXBzaXplcihzb3VyY2UpLApAQCAtNzIsNyArNzQsNyBAQAogICAgICAgICAgKiBUaGlzIGlzIGFubm95aW5nLCBidXQgd2UgY2FuJ3QgcmVmZXIgdG8gdGhlIGxheW91dCB1bnRpbAogICAgICAgICAgKiBzdXBlcmNsYXNzIGNvbnN0cnVjdGlvbiBpcyBmaW5pc2hlZCwgYW5kIHRoZSBzdXBlcmNsYXNzCiAgICAgICAgICAqIGNvbnN0cnVjdG9yIHdhbnRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGRpc3BsYXkgdGV4dC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIFRoaXMgd2lsbCBicmVhayBpZiB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBldmVyIGFjdHVhbGx5CiAgICAgICAgICAqIGNhcmVzIGFib3V0IHRoZSBjb250ZW50IGluc3RlYWQgb2YganVzdCBob2xkaW5nIHRoZSByZWZlcmVuY2UuCiAgICAgICAgICAqLwpAQCAtOTQsMTMgKzk2LDEzIEBACiAgICAgICAgIG1MaW5lRGlyZWN0aW9ucyA9IG5ldyBEaXJlY3Rpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOwogCisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKwogICAgICAgICBnZW5lcmF0ZShzb3VyY2UsIGJ1ZnN0YXJ0LCBidWZlbmQsIHBhaW50LCBvdXRlcndpZHRoLCBhbGlnbiwKICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGluY2x1ZGVwYWQsIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgIGVsbGlwc2l6ZSAhPSBudWxsLCBlbGxpcHNpemVkV2lkdGgsIGVsbGlwc2l6ZSk7CiAKLSAgICAgICAgbUNoZGlycyA9IG51bGw7Ci0gICAgICAgIG1DaHMgPSBudWxsOwotICAgICAgICBtV2lkdGhzID0gbnVsbDsKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0LnJlY3ljbGUobU1lYXN1cmVkKTsKICAgICAgICAgbUZvbnRNZXRyaWNzSW50ID0gbnVsbDsKICAgICB9CiAKQEAgLTExMSw2ICsxMTMsNyBAQAogICAgICAgICBtTGluZXMgPSBuZXcgaW50W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CiAgICAgICAgIG1MaW5lRGlyZWN0aW9ucyA9IG5ldyBEaXJlY3Rpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOworICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGdlbmVyYXRlKENoYXJTZXF1ZW5jZSBzb3VyY2UsIGludCBidWZzdGFydCwgaW50IGJ1ZmVuZCwKQEAgLTEyOCw1OSArMTMxLDUwIEBACiAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtID0gbUZvbnRNZXRyaWNzSW50OwogICAgICAgICBpbnRbXSBjaG9vc2VodHYgPSBudWxsOwogCi0gICAgICAgIGludCBlbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIGJ1ZnN0YXJ0LCBidWZlbmQpOwotICAgICAgICBpbnQgYnVmc2l6ID0gZW5kID49IDAgPyBlbmQgLSBidWZzdGFydCA6IGJ1ZmVuZCAtIGJ1ZnN0YXJ0OwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG1lYXN1cmVkID0gbU1lYXN1cmVkOwogCi0gICAgICAgIGlmIChtQ2hkaXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShidWZzaXogKyAxKV07Ci0gICAgICAgICAgICBtQ2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoYnVmc2l6ICsgMSldOwotICAgICAgICAgICAgbVdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChidWZzaXogKyAxKSAqIDIpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBjaGRpcnMgPSBtQ2hkaXJzOwotICAgICAgICBjaGFyW10gY2hzID0gbUNoczsKLSAgICAgICAgZmxvYXRbXSB3aWR0aHMgPSBtV2lkdGhzOwotCi0gICAgICAgIEFsdGVyZWRDaGFyU2VxdWVuY2UgYWx0ZXIgPSBudWxsOwogICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSBudWxsOwotCiAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKQogICAgICAgICAgICAgc3Bhbm5lZCA9IChTcGFubmVkKSBzb3VyY2U7CiAKICAgICAgICAgaW50IERFRkFVTFRfRElSID0gRElSX0xFRlRfVE9fUklHSFQ7IC8vIFhYWAogCi0gICAgICAgIGZvciAoaW50IHN0YXJ0ID0gYnVmc3RhcnQ7IHN0YXJ0IDw9IGJ1ZmVuZDsgc3RhcnQgPSBlbmQpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbnQgcGFyYUVuZDsKKyAgICAgICAgZm9yIChpbnQgcGFyYVN0YXJ0ID0gYnVmc3RhcnQ7IHBhcmFTdGFydCA8PSBidWZlbmQ7IHBhcmFTdGFydCA9IHBhcmFFbmQpIHsKKyAgICAgICAgICAgIHBhcmFFbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIHBhcmFTdGFydCwgYnVmZW5kKTsKKyAgICAgICAgICAgIGlmIChwYXJhRW5kIDwgMCkKKyAgICAgICAgICAgICAgICBwYXJhRW5kID0gYnVmZW5kOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgc3RhcnQsIGJ1ZmVuZCk7CisgICAgICAgICAgICAgICAgcGFyYUVuZCsrOworICAgICAgICAgICAgaW50IHBhcmFMZW4gPSBwYXJhRW5kIC0gcGFyYVN0YXJ0OwogCi0gICAgICAgICAgICBpZiAoZW5kIDwgMCkKLSAgICAgICAgICAgICAgICBlbmQgPSBidWZlbmQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kKys7Ci0KLSAgICAgICAgICAgIGludCBmaXJzdFdpZHRoTGluZUNvdW50ID0gMTsKKyAgICAgICAgICAgIGludCBmaXJzdFdpZHRoTGluZUxpbWl0ID0gbUxpbmVDb3VudCArIDE7CiAgICAgICAgICAgICBpbnQgZmlyc3R3aWR0aCA9IG91dGVyd2lkdGg7CiAgICAgICAgICAgICBpbnQgcmVzdHdpZHRoID0gb3V0ZXJ3aWR0aDsKIAogICAgICAgICAgICAgTGluZUhlaWdodFNwYW5bXSBjaG9vc2VodCA9IG51bGw7CiAKICAgICAgICAgICAgIGlmIChzcGFubmVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwOwotCi0gICAgICAgICAgICAgICAgc3AgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwID0gc3Bhbm5lZC5nZXRTcGFucyhwYXJhU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBsbXMgPSBzcFtpXTsKICAgICAgICAgICAgICAgICAgICAgZmlyc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKHRydWUpOwogICAgICAgICAgICAgICAgICAgICByZXN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lQ291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilsbXMpLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIExlYWRpbmdNYXJnaW5TcGFuMiBpcyBvZGQuICBUaGUgY291bnQgYWZmZWN0cyBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4gc3BhbnMsIG5vdCBqdXN0IHRoaXMgcGFydGljdWxhciBvbmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNwYW4sIG5vdCB0aGUgdG9wIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuMiBsbXMyID0gKExlYWRpbmdNYXJnaW5TcGFuMikgbG1zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxtc0ZpcnN0TGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3Bhbm5lZC5nZXRTcGFuU3RhcnQobG1zMikpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVMaW1pdCA9IGxtc0ZpcnN0TGluZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtczIuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExpbmVIZWlnaHRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjaG9vc2VodCA9IHNwYW5uZWQuZ2V0U3BhbnMocGFyYVN0YXJ0LCBwYXJhRW5kLCBMaW5lSGVpZ2h0U3Bhbi5jbGFzcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoY2hvb3NlaHQubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0diA9PSBudWxsIHx8CkBAIC0xOTIsMTEgKzE4NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob29zZWh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KGNob29zZWh0W2ldKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCBwYXJhU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgaW4gdGhpcyBsYXlvdXQsIGJlZm9yZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBhcmFncmFwaAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2W2ldID0gZ2V0TGluZVRvcChnZXRMaW5lRm9yT2Zmc2V0KG8pKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2W2ldID0gZ2V0TGluZVRvcChnZXRMaW5lRm9yT2Zmc2V0KG8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgcGFyYWdyYXBoCiAKQEAgLTIwNiwxNjIgKzIwMCw4NyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gY2hkaXJzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGVuZCAtIHN0YXJ0KV07Ci0gICAgICAgICAgICAgICAgbUNoZGlycyA9IGNoZGlyczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNocy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaHMgPSBjaHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0KSAqIDIgPiB3aWR0aHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGVuZCAtIHN0YXJ0KSAqIDIpXTsKLSAgICAgICAgICAgICAgICBtV2lkdGhzID0gd2lkdGhzOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVhc3VyZWQuc2V0UGFyYShzb3VyY2UsIHBhcmFTdGFydCwgcGFyYUVuZCwgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOworICAgICAgICAgICAgY2hhcltdIGNocyA9IG1lYXN1cmVkLm1DaGFyczsKKyAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzID0gbWVhc3VyZWQubVdpZHRoczsKKyAgICAgICAgICAgIGJ5dGVbXSBjaGRpcnMgPSBtZWFzdXJlZC5tTGV2ZWxzOworICAgICAgICAgICAgaW50IGRpciA9IG1lYXN1cmVkLm1EaXI7CisgICAgICAgICAgICBib29sZWFuIGVhc3kgPSBtZWFzdXJlZC5tRWFzeTsKIAotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHNvdXJjZSwgc3RhcnQsIGVuZCwgY2hzLCAwKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBuID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZWFzeSA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGFsdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBkaXIgPSBERUZBVUxUX0RJUjsgLy8gWFhYCi0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoc1tpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVhc3kgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBub25lIG9mIHRoZSB1bmRlcmx5aW5nIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQKLSAgICAgICAgICAgIC8vIGFzIHZpYWJsZSBicmVha3BvaW50cywgYW5kIHRoYXQgdGhlIGVudGlyZSBydW4gZ2V0cyB0aGUKLSAgICAgICAgICAgIC8vIHNhbWUgYmlkaSBkaXJlY3Rpb24uCi0KLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgZW5kLCBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzcGFucy5sZW5ndGg7IHkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IHNwLmdldFNwYW5TdGFydChzcGFuc1t5XSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gc3AuZ2V0U3BhbkVuZChzcGFuc1t5XSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IGE7IHggPCBiOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoc1t4IC0gc3RhcnRdID0gJ1x1RkZGQyc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZWFzeSkgewotICAgICAgICAgICAgICAgIC8vIFhYWCBwdXQgb3ZlcnJpZGUgZmxhZ3MsIGV0Yy4gaW50byBjaGRpcnMKLSAgICAgICAgICAgICAgICBkaXIgPSBiaWRpKGRpciwgY2hzLCBjaGRpcnMsIG4sIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIERvIG1pcnJvcmluZyBmb3IgcmlnaHQtdG8tbGVmdCBzZWdtZW50cwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tpXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2pdICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFuZHJvaWRDaGFyYWN0ZXIubWlycm9yKGNocywgaSwgaiAtIGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWI7Ci0KLSAgICAgICAgICAgIGlmIChhbHRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFsdGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFsdGVyID0gQWx0ZXJlZENoYXJTZXF1ZW5jZS5tYWtlKHNvdXJjZSwgY2hzLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGFsdGVyLnVwZGF0ZShjaHMsIHN0YXJ0LCBlbmQpOwotCi0gICAgICAgICAgICAgICAgc3ViID0gYWx0ZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1YiA9IHNvdXJjZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWIgPSBzb3VyY2U7CiAKICAgICAgICAgICAgIGludCB3aWR0aCA9IGZpcnN0d2lkdGg7CiAKICAgICAgICAgICAgIGZsb2F0IHcgPSAwOwotICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBoZXJlID0gcGFyYVN0YXJ0OwogCi0gICAgICAgICAgICBpbnQgb2sgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBvayA9IHBhcmFTdGFydDsKICAgICAgICAgICAgIGZsb2F0IG9rd2lkdGggPSB3OwogICAgICAgICAgICAgaW50IG9rYXNjZW50ID0gMCwgb2tkZXNjZW50ID0gMCwgb2t0b3AgPSAwLCBva2JvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgIGludCBmaXQgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBmaXQgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBmaXR3aWR0aCA9IHc7CiAgICAgICAgICAgICBpbnQgZml0YXNjZW50ID0gMCwgZml0ZGVzY2VudCA9IDAsIGZpdHRvcCA9IDAsIGZpdGJvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgIGJvb2xlYW4gdGFiID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CiAKLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzKTsKKyAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydCA9IHBhcmFTdGFydCwgc3BhbkVuZCA9IHNwYW5TdGFydCwgbmV4dFNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0IDwgcGFyYUVuZDsgc3BhblN0YXJ0ID0gbmV4dFNwYW5TdGFydCkgewogCi0gICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRUZXh0V2lkdGhzKHN1YiwgaSwgbmV4dCwgd2lkdGhzKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWR0aHMsIDAsIHdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCArIChpIC0gc3RhcnQpLCBuZXh0IC0gaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICAgICAgICAgIGlmIChzcGFuU3RhcnQgPT0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHBhcmFFbmQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzcGFuU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwogCi0gICAgICAgICAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFubmVkLCBpLCBuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIGZtKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWR0aHMsIDAsIHdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCArIChpIC0gc3RhcnQpLCBuZXh0IC0gaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmFzY2VudCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbkxlbiA9IHNwYW5FbmQgLSBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkLmFkZFN0eWxlUnVuKHBhaW50LCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQuZ2V0U3BhbnMoc3BhblN0YXJ0LCBzcGFuRW5kLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkLmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkxlbiwgZm0pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgbmV4dFNwYW5TdGFydCA9IHNwYW5FbmQ7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5QYXJhID0gc3BhblN0YXJ0IC0gcGFyYVN0YXJ0OworICAgICAgICAgICAgICAgIGludCBlbmRJblBhcmEgPSBzcGFuRW5kIC0gcGFyYVN0YXJ0OworCiAgICAgICAgICAgICAgICAgaW50IGZtdG9wID0gZm0udG9wOwogICAgICAgICAgICAgICAgIGludCBmbWJvdHRvbSA9IGZtLmJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgZm1hc2NlbnQgPSBmbS5hc2NlbnQ7CiAgICAgICAgICAgICAgICAgaW50IGZtZGVzY2VudCA9IGZtLmRlc2NlbnQ7CiAKLSAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQod2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoInRleHQiLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IG5leHQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjaHNbaiAtIHN0YXJ0XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3BhblN0YXJ0OyBqIDwgc3BhbkVuZDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmVmb3JlID0gdzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gTGF5b3V0Lm5leHRUYWIoc3ViLCBzdGFydCwgZW5kLCB3LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1RhYiA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiT3JFbW9qaSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCB0YWIgdGhpcyBwYXJhLCBjaGVjayBmb3IgdGFic3RvcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSBzcGFucyA9IHNwYW5uZWQuZ2V0U3BhbnMocGFyYVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRhYlN0b3BzLm5leHRUYWIodyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AodywgVEFCX0lOQ1JFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gcGFyYVN0YXJ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgpAQCAtMzc2LDIxICsyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFpbnQgPSBtV29ya1BhaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aGljaFBhaW50LmFzY2VudCgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAid2FzICIgKyBiZWZvcmUgKyAiIG5vdyAiICsgdyArICIgYWZ0ZXIgIiArIGMgKyAiIHdpdGhpbiAiICsgd2lkdGgpOwpAQCAtNDExLDcgKzMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICogRnJvbSB0aGUgVW5pY29kZSBMaW5lIEJyZWFraW5nIEFsZ29yaXRobToKICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdCBsZWFzdCBhcHByb3hpbWF0ZWx5KQotICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC4sOjsgYXJlIGNsYXNzIElTOiBicmVha3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBleGNlcHQgd2hlbiBhZGphY2VudCB0byBkaWdpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC8gICAgaXMgY2xhc3MgU1k6IGEgYnJlYWtwb2ludApAQCAtNDI2LDEyICszNDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLicgIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBzdGFydF0pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHBhcmFTdGFydF0pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLycgfHwgYyA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSBGSVJTVF9DSksgJiYgaXNJZGVvZ3JhcGhpYyhjLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IG5leHQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBzdGFydF0sIGZhbHNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBzcGFuRW5kICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSwgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rd2lkdGggPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaiArIDE7CiAKQEAgLTQ0OCw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ1NywxMCArMzc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC00ODQsNyArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00OTMsMTAgKzQxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNTA5LDE5ICs0MjgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIGZpdHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGZpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9uZSAiICsgaGVyZSArICIgdG8gIiArKGhlcmUgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbm90IHN1cmUgd2h5IHRoZSBleGlzdGluZyBmbSB3YXNuJ3Qgb2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudWxsKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgaGVyZSsxLApAQCAtNTI5LDE5ICs0NDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCwgZm0uYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKyAxID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHN0YXJ0XSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBwYXJhU3RhcnRdLCBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gaGVyZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0ID0gaGVyZTsgLy8gbXVzdCByZW1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgc3BhblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IG91dHB1dCBhbGwgdGhlIHRleHQgZm9yIHRoaXMgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIG1lYXN1cmVkIHRoZSByYXcgd2lkdGhzLCB0aG91Z2gsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCB0aGUgc3RhcnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dFNwYW5TdGFydCA9IGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBoZXJlIC0gMTsgICAgLy8gY29udGludWUgbG9vcGluZwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTUxLDE0ICs0NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdGFzY2VudCA9IGZpdGRlc2NlbnQgPSBmaXR0b3AgPSBmaXRib3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQgPSBva2Rlc2NlbnQgPSBva3RvcCA9IG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJlc3R3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAhPSBoZXJlKSB7CisgICAgICAgICAgICBpZiAocGFyYUVuZCAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgaWYgKChmaXR0b3AgfCBmaXRib3R0b20gfCBmaXRkZXNjZW50IHwgZml0YXNjZW50KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKIApAQCAtNTcxLDIwICs0OTQsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgcmVzdCAiICsgaGVyZSArICIgdG8gIiArIGVuZCk7CiAKICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgcGFyYUVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgdywgcGFpbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgICAgIHBhcmFTdGFydCA9IHBhcmFFbmQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPT0gYnVmZW5kKQorICAgICAgICAgICAgaWYgKHBhcmFFbmQgPT0gYnVmZW5kKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTU5OSwyNDYgKzUyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZm0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgY2hkaXJzLCBERUZBVUxUX0RJUiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIG51bGwsIERFRkFVTFRfRElSLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBidWZzdGFydCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgYnVmc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIDAsIHBhaW50KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHVuaWNvZGUgYmlkaSBhbGdvcml0aG0gb24gdGhlIGZpcnN0IG4gY2hhcnMgaW4gY2hzLCByZXR1cm5pbmcKLSAgICAgKiB0aGUgY2hhciBkaXJzIGluIGNoSW5mbyBhbmQgdGhlIGJhc2UgbGluZSBkaXJlY3Rpb24gb2YgdGhlIGZpcnN0Ci0gICAgICogcGFyYWdyYXBoLgotICAgICAqIAotICAgICAqIFhYWCBjaGFuZ2UgcmVzdWx0IGZyb20gZGlycyB0byBsZXZlbHMKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0aW9uIGZsYWcsIGVpdGhlciBESVJfUkVRVUVTVF9MVFIsCi0gICAgICogRElSX1JFUVVFU1RfUlRMLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiwgb3IgRElSX1JFUVVFU1RfREVGQVVMVF9SVEwuCi0gICAgICogQHBhcmFtIGNocyB0aGUgdGV4dCB0byBleGFtaW5lCi0gICAgICogQHBhcmFtIGNoSW5mbyBvbiBpbnB1dCwgaWYgaGFzSW5mbyBpcyB0cnVlLCBvdmVycmlkZSBhbmQgb3RoZXIgZmxhZ3MgCi0gICAgICogcmVwcmVzZW50aW5nIG91dC1vZi1iYW5kIGVtYmVkZGluZyBpbmZvcm1hdGlvbi4gT24gb3V0cHV0LCB0aGUgZ2VuZXJhdGVkIAotICAgICAqIGRpcnMgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIG4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC9pbmZvcm1hdGlvbiBpbiBjaHMgYW5kIGNoSW5mbwotICAgICAqIEBwYXJhbSBoYXNJbmZvIHRydWUgaWYgY2hJbmZvIGhhcyBpbnB1dCBpbmZvcm1hdGlvbiwgb3RoZXJ3aXNlIHRoZQotICAgICAqIGlucHV0IGRhdGEgaW4gY2hJbmZvIGlzIGlnbm9yZWQuCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZGlyZWN0aW9uIGxldmVsIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIGVpdGhlcgotICAgICAqIERJUl9MRUZUX1RPX1JJR0hUIG9yIERJUl9SSUdIVF9UT19MRUZULgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBiaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5mbykgewotICAgICAgICAKLSAgICAgICAgQW5kcm9pZENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0aWVzKGNocywgY2hJbmZvLCBuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEZXRlcm1pbmUgcHJpbWFyeSBwYXJhZ3JhcGggZGlyZWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkaXIgIT0gRElSX1JFUVVFU1RfTFRSICYmIGRpciAhPSBESVJfUkVRVUVTVF9SVEwpIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0Ci0gICAgICAgICAgICBkaXIgPSBkaXIgPj0gMCA/IERJUl9MRUZUX1RPX1JJR0hUIDogRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgIGludCBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYnl0ZSBTT1IgPSBkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgPwotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBYWFggRXhwbGljaXQgb3ZlcnJpZGVzIHNob3VsZCBnbyBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlYWsgdHlwZSByZXNvbHV0aW9uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiaW5pdGlhbCIpOwotCi0gICAgICAgIC8vIFcxIG5vbiBzcGFjaW5nIG1hcmtzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzEiKTsKLQotICAgICAgICAvLyBXMiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGJ5dGUgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgIGlmIChjdXIgPT0KLSAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzIiKTsKLQotICAgICAgICAvLyBXMyBhcmFiaWMgbGV0dGVycwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlczIik7Ci0KLSAgICAgICAgLy8gVzQgc2luZ2xlIHNlcGFyYXRvciBiZXR3ZWVuIG51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBuIC0gMTsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0gICAgICAgICAgICBieXRlIHByZXYgPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgYnl0ZSBuZXh0ID0gY2hJbmZvW2ogKyAxXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzQiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMKLSAgICAgICAgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SICYmIGFkamFjZW50KQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZHVtcChjaGRpcnMsIG4sICJXNSIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycyBwYXJ0IDIsCi0gICAgICAgIC8vIFc2IHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzCi0gICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9QQVJBR1JBUEhfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1NFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc2Iik7Ci0KLSAgICAgICAgLy8gVzcgc3Ryb25nIGRpcmVjdGlvbiBvZiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gU09SIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc3Iik7Ci0KLSAgICAgICAgLy8gTjEsIE4yIG5ldXRyYWxzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBkZCA9IFNPUjsKLSAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgbjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRkID0gY2hJbmZvW2tdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IGo7IHkgPCBrOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IGN1cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gU09SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGogPSBrIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiZmluYWwiKTsKLQotICAgICAgICAvLyBleHRyYTogZW5mb3JjZSB0aGF0IGFsbCB0YWJzIGFuZCBzdXJyb2dhdGUgY2hhcmFjdGVycyBnbyB0aGUKLSAgICAgICAgLy8gcHJpbWFyeSBkaXJlY3Rpb24KLSAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgZG8gZGlyZWN0aW9ucyByaWdodCBmb3Igc3Vycm9nYXRlcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBjaHNbal07Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkgewotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX0NKSyA9ICdcdTJFODAnOwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhvc2Ugc3BlY2lmaWVkCkBAIC05NDQsMzcgKzYzNCwxNSBAQAogICAgIH0KICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rml0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCkgewotICAgICAgICBpbnQgaGlnaCA9IGVuZCArIDEsIGxvdyA9IHN0YXJ0IC0gMSwgZ3Vlc3M7Ci0KLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBndWVzcyA9IChoaWdoICsgbG93KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN0YXJ0LCBndWVzcywgbnVsbCwgdHJ1ZSwgbnVsbCkgPiB3aWQpCi0gICAgICAgICAgICAgICAgaGlnaCA9IGd1ZXNzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvdyA9IGd1ZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvdyA8IHN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG93OwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IG91dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhYm92ZSwgaW50IGJlbG93LCBpbnQgdG9wLCBpbnQgYm90dG9tLCBpbnQgdiwKICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGFjaW5nbXVsdCwgZmxvYXQgc3BhY2luZ2FkZCwKICAgICAgICAgICAgICAgICAgICAgICBMaW5lSGVpZ2h0U3BhbltdIGNob29zZWh0LCBpbnRbXSBjaG9vc2VodHYsCi0gICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sIGJvb2xlYW4gdGFiLAorICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLCBib29sZWFuIGhhc1RhYk9yRW1vamksCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkTXVsdGlwbHksIGludCBwc3RhcnQsIGJ5dGVbXSBjaGRpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBlYXN5LCBib29sZWFuIGxhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlcGFkLCBib29sZWFuIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsIGludCB3aWRvZmYsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGNocywgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuVHJ1bmNhdGVBdCBlbGxpcHNpemUsIGZsb2F0IGVsbGlwc2lzd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdGV4dHdpZHRoLCBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgaW50IGogPSBtTGluZUNvdW50OwpAQCAtOTgyLDggKzY1MCw2IEBACiAgICAgICAgIGludCB3YW50ID0gb2ZmICsgbUNvbHVtbnMgKyBUT1A7CiAgICAgICAgIGludFtdIGxpbmVzID0gbUxpbmVzOwogCi0gICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgImxpbmUgIiArIHN0YXJ0ICsgIiB0byAiICsgZW5kICsgKGxhc3QgPyAiPT09IiA6ICIiKSk7Ci0KICAgICAgICAgaWYgKHdhbnQgPj0gbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICBpbnQgbmxlbiA9IEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUod2FudCArIDEpOwogICAgICAgICAgICAgaW50W10gZ3JvdyA9IG5ldyBpbnRbbmxlbl07CkBAIC0xMDU5LDU5ICs3MjUsMjMgQEAKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBTVEFSVF0gPSBlbmQ7CiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgVE9QXSA9IHY7CiAKLSAgICAgICAgaWYgKHRhYikKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkpCiAgICAgICAgICAgICBsaW5lc1tvZmYgKyBUQUJdIHw9IFRBQl9NQVNLOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKLQotICAgICAgICAgICAgaW50IGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnM7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFtdIGxkID0gbmV3IHNob3J0W2NvdW50ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3ZlcmZsb3cgc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkW2NvdW50KytdID0gKHNob3J0KSAoayAtIGhlcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZFtjb3VudF0gPSAoc2hvcnQpIChlbmQgLSBoZXJlKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGxkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gbmV3IERpcmVjdGlvbnMobGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7CisgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAvLyBlYXN5IG1lYW5zIGFsbCBjaGFycyA8IHRoZSBmaXJzdCBSVEwsIHNvIG5vIGVtb2ppLCBubyBub3RoaW5nCisgICAgICAgIC8vIFhYWCBhIHJ1biB3aXRoIG5vIHRleHQgb3IgYWxsIHNwYWNlcyBpcyBlYXN5IGJ1dCBtaWdodCBiZSBhbiBlbXB0eQorICAgICAgICAvLyBSVEwgcGFyYWdyYXBoLiAgTWFrZSBzdXJlIGVhc3kgaXMgZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgICAgaWYgKGVhc3kpIHsKICAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IGxpbmVkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhkaXIsIGNoZGlycywgd2lkc3RhcnQsIGNocywKKyAgICAgICAgICAgICAgICAgICAgd2lkc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIAogICAgICAgICAgICAgLy8gSWYgZWxsaXBzaXplIGlzIGluIG1hcnF1ZWUgbW9kZSwgZG8gbm90IGFwcGx5IGVsbGlwc2lzIG9uIHRoZSBmaXJzdCBsaW5lCiAgICAgICAgICAgICBpZiAoZWxsaXBzaXplICE9IG51bGwgJiYgKGVsbGlwc2l6ZSAhPSBUZXh0VXRpbHMuVHJ1bmNhdGVBdC5NQVJRVUVFIHx8IGogIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LCB3aWRvZmYsCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc3dpZHRoLCBlbGxpcHNpemUsIGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHdpZHRoLCBwYWludCk7CiAgICAgICAgICAgICB9CkBAIC0xMTIyLDcgKzc1Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVsbGlwc2lzKGludCBsaW5lc3RhcnQsIGludCBsaW5lZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVGV4dFV0aWxzLlRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgbGVuID0gbGluZWVuZCAtIGxpbmVzdGFydDsKQEAgLTExNDIsNyArNzcyLDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE1OCw3ICs3ODgsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTc1LDcgKzgwNSw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7CiAgICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTg2LDcgKzgxNiw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwogICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIwMyw3ICs4MzMsNyBAQAogICAgICAgICBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgRUxMSVBTSVNfQ09VTlRdID0gZWxsaXBzaXNDb3VudDsKICAgICB9CiAKLSAgICAvLyBPdmVycmlkZSB0aGUgYmFzZWNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCisgICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKICAgICAvLyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgLy8gVGhlIGxvZ2ljIG1pcnJvcnMgdGhhdCBvZiBMYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsCiAgICAgLy8gRklYTUU6IEl0IG1heSBiZSBmYXN0ZXIgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBsYXlvdXRzIHdpdGhvdXQgbWFueSBsaW5lcy4KQEAgLTEyMzIsMTEgKzg2MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVRvcChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07ICAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lRGVzY2VudChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOyAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBsaW5lKSB7CkBAIC0xMzA5LDEzICs5MzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUICA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfTUFTSyAgID0gMHgyMDAwMDAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7IC8vIHNhbWUgYXMgTGF5b3V0LCBidXQgdGhhdCdzIHByaXZhdGUKIAogICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQorICAgICAqIFRoaXMgaXMgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCiAgICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUNoZGlyczsKLSAgICBwcml2YXRlIGNoYXJbXSBtQ2hzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtV2lkdGhzOworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0IG1NZWFzdXJlZDsKICAgICBwcml2YXRlIFBhaW50LkZvbnRNZXRyaWNzSW50IG1Gb250TWV0cmljc0ludCA9IG5ldyBQYWludC5Gb250TWV0cmljc0ludCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxM2IyY2QuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBkcmF3aW5nIGFuZCBtZWFzdXJpbmcgc3R5bGVkIHRleHQsCi0gKiBsaWtlIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0gb2JqZWN0IHdpdGgKLSAqIHtAbGluayBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFufS4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkCi17Ci0gICAgLyoqCi0gICAgICogRHJhd3MgYW5kL29yIG1lYXN1cmVzIGEgdW5pZm9ybSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLiBObyBzcGFuIG9mCi0gICAgICogaW50ZXJlc3Qgc2hvdWxkIHN0YXJ0IG9yIGVuZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgcnVuIChpZiBub3QKLSAgICAgKiBkcmF3aW5nLCBjaGFyYWN0ZXIgc3BhbnMgdGhhdCBkb24ndCBhZmZlY3QgbWV0cmljcyBjYW4gYmUgaWdub3JlZCkuCi0gICAgICogTmVpdGhlciBzaG91bGQgdGhlIHJ1biBkaXJlY3Rpb24gY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5PbiByZXR1cm4sIHdvcmtQYWludCB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHBhaW50IHBsdXMgYW55Ci0gICAgICogbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IGNoYXJhY3RlciBzdHlsZXMgb24gdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCB3aWR0aCBpcyBzaWduZWQgYW5kIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3VW5pZm9ybVJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICBib29sZWFuIGhhdmVXaWR0aCA9IGZhbHNlOwotICAgICAgICBmbG9hdCByZXQgPSAwOwotICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7Ci0KLSAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBYWFg6IFRoaXMgc2hvdWxkbid0IGJlIG1vZGlmeWluZyBwYWludCwgb25seSB3b3JrUGFpbnQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtZW1iZXJzIGJlbG9uZ2luZyB0byBUZXh0UGFpbnQgc2hvdWxkIGhhdmUgZGVmYXVsdAotICAgICAgICAvLyB2YWx1ZXMgYW55d2F5LiAgQmV0dGVyIHRvIGVuc3VyZSB0aGlzIGluIHRoZSBMYXlvdXQgY29uc3RydWN0b3IuCi0gICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOwotICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0KLQkJaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNbaV07Ci0KLQkJCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYW4udXBkYXRlRHJhd1N0YXRlKHdvcmtQYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXA7Ci0gICAgICAgICAgICBpbnQgdG1wc3RhcnQsIHRtcGVuZDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmdDb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gd29ya1BhaW50LmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3b3JrUGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKHdvcmtQYWludC5iZ0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4IC0gcmV0LCB0b3AsIHgsIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3b3JrUGFpbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShzKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKGMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoICYmICFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICByZXR1cm4gLXJldDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRocyBmb3IgYSB1bmlmb3JtIGxlZnQtdG8tcmlnaHQgcnVuIG9mIHRleHQgd2l0aAotICAgICAqIG5vIHN0eWxlIGNoYW5nZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLiBJZiBhbnkgc3R5bGUgaXMgcmVwbGFjZW1lbnQKLSAgICAgKiB0ZXh0LCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgYW5kIHRoZQotICAgICAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IGEgd2lkdGggb2YgMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50LCB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgYSBwYWludCB0byBtb2RpZnk7IG9uIHJldHVybiB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgIHBhaW50IHBsdXMgdGhlIGVmZmVjdCBvZiBhbGwgc3BhbnMgb24gdGhlIHJ1bgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgbGltaXQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSB3aWR0aHMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZSB3aWR0aHMgb2YgdGhlIGNoYXJhY3RlcnMuIE11c3QKLSAgICAgKiAgICAgICAgYmUgYXQgbGVhc3QgYSBsYXJnZSBhcyAoZW5kIC0gc3RhcnQpLgotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWR0aHMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0V2lkdGhzKFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgIHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLQkJUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKLQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOwotCQkJfQotCQl9Ci0JCi0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IHdpZDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5kIC0gc3RhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbmQvb3IgbWVhc3VyZXMgYSBkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2RyYXdVbmlmb3JtUnVufSwgdGhpcyBjYW4gcmVuZGVyIHJ1bnMgdGhhdCBjcm9zcyBzdHlsZQotICAgICAqIGJvdW5kYXJpZXMuICBSZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZSB3aWR0aCwgaWYgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgb3B0aW1pemVzIGZvciB1bnN0eWxlZCB0ZXh0IGFuZCBzbyB3b3JrUGFpbnQgbWlnaHQgbm90IGJlCi0gICAgICogbW9kaWZpZWQgYnkgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIGFkdmFuY2Ugd2lkdGggd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdEaXJlY3Rpb25hbFJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIC8vIFhYWDogSXQgbG9va3MgbGlrZSBhbGwgY2FsbHMgdG8gdGhpcyBBUEkgbWF0Y2ggZGlyIGFuZCBydW5Jc1J0bCwgc28KLSAgICAgICAgLy8gaGF2aW5nIGJvdGggcGFyYW1ldGVycyBpcyByZWR1bmRhbnQgYW5kIGNvbmZ1c2luZy4KLQotICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc3R5bGVkIHRleHQKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiB0aGlzIGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IHR3ZWFrIHRoZSBsZW5ndGggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dAotICAgICAgICAgICAgICAgIGludCB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCB8fCBuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRtcCwgMCwgdG1wZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgMCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldCAqIGRpcjsgICAvLyBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmxvYXQgb3ggPSB4OwotICAgICAgICBpbnQgbWluQXNjZW50ID0gMCwgbWF4RGVzY2VudCA9IDAsIG1pblRvcCA9IDAsIG1heEJvdHRvbSA9IDA7Ci0KLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICBDbGFzczw/PiBkaXZpc2lvbjsKLQotICAgICAgICBpZiAoY2FudmFzID09IG51bGwpCi0gICAgICAgICAgICBkaXZpc2lvbiA9IE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlzaW9uID0gQ2hhcmFjdGVyU3R5bGUuY2xhc3M7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLCBkaXZpc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIFhYWDogaWYgZGlyIGFuZCBydW5Jc1J0bCB3ZXJlIG5vdCB0aGUgc2FtZSwgdGhpcyB3b3VsZCBkcmF3Ci0gICAgICAgICAgICAvLyBzcGFucyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGJ1dCBubyBvbmUgYXBwZWFycyB0byBjYWxsIGl0IHRoaXMKLSAgICAgICAgICAgIC8vIHdheS4KLSAgICAgICAgICAgIHggKz0gZHJhd1VuaWZvcm1SdW4oY2FudmFzLCBzcCwgaSwgbmV4dCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbmV4dCAhPSBlbmQpOwotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmFzY2VudCA8IG1pbkFzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWluQXNjZW50ID0gZm1pLmFzY2VudDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmRlc2NlbnQgPiBtYXhEZXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtYXhEZXNjZW50ID0gZm1pLmRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm1pLnRvcCA8IG1pblRvcCkKLSAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gZm1pLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmJvdHRvbSA+IG1heEJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gZm1pLmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZtaS5hc2NlbnQgPSBtaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLmRlc2NlbnQgPSBtYXhEZXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS50b3AgPSBtaW5Ub3A7Ci0gICAgICAgICAgICAgICAgZm1pLmJvdHRvbSA9IG1heEJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4IC0gb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb3B0aW9uYWxseQotICAgICAqIHJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlLiAgVW5saWtlIGRyYXdEaXJlY3Rpb25hbFJ1biwgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBhbmQgcnVuIGRpcmVjdGlvbiBjYW4gYmUgZGlmZmVyZW50LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIFhYWCB0aGlzIGxvZ2ljIGlzIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsCi0gICAgICAgIGlmICgoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCAmJiAhcnVuSXNSdGwpIHx8Ci0gICAgICAgICAgICAocnVuSXNSdGwgJiYgZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdGhlIHJlYWwgZGlyZWN0aW9uCi0gICAgICAgICAgICBmbG9hdCBjaCA9IGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLCAwLCAwLCAwLCAwLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgY2ggKj0gZGlyOyAgLy8gRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgICAgIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIC1kaXIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCB4ICsgY2gsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHdpdGggaXRzCi0gICAgICogb3JpZ2luIGF0ICh4LHkpLCBpbiB0aGUgc3BlY2lmaWVkIFBhaW50LiBUaGUgb3JpZ2luIGlzIGludGVycHJldGVkIGJhc2VkCi0gICAgICogb24gdGhlIEFsaWduIHNldHRpbmcgaW4gdGhlIFBhaW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0Ci0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5Ci0gICAgICogZHJhd3MgdGhlIHRleHQpLiBTZWUgYWxzbwotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChDaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwKLSAgICAgKiBmbG9hdCwgUGFpbnQpfSBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1JlY3QoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsCi0gICAgICogUGFpbnQpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSB0YXJnZXQgY2FudmFzCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGVuZCAoZW5kIC0gMSkgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRleHQuIFRoaXMgbXVzdCBiZQotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfTEVGVF9UT19SSUdIVH0gb3IKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX1JJR0hUX1RPX0xFRlR9LgotICAgICAqIEBwYXJhbSB4IFRoZSB4LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSB5IFRoZSB5LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBwYWludCBUaGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QuCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBUaGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IHVzZWQgZm9yIHRlbXBvcmFsCi0gICAgICogICAgICAgIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIElmIHRydWUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpZHRoIG9mIGRyYXduIHRleHQKLSAgICAgKiBAcmV0dXJuIFdpZHRoIG9mIHRoZSBkcmF3biB0ZXh0IGlmIG5lZWRXaWR0aCBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBGb3Igc2FmZXR5LgotICAgICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gPj0gMCA/IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAotICAgICAgICAgICAgICAgIDogTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8vIEhpZGUgcnVuSXNSdGwgcGFyYW1ldGVyIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlcm5hbAotICAgICAgICAvLyBkZXZlbG9wZXJzLgotICAgICAgICAvLyBYWFg6IHRoZSBydW5Jc1J0bCBwcm9iYWJseSBvdWdodCB0byBiZSB0aGUgc2FtZSBhcyBkaXJlY3Rpb24sIHRoZW4KLSAgICAgICAgLy8gdGhpcyBjb3VsZCBkcmF3IHJ0bCB0ZXh0LgotICAgICAgICByZXR1cm4gZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXJlY3Rpb24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgcnVuIG9mIGxlZnQtdG8tcmlnaHQgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLAotICAgICAqIGNvbnNpZGVyaW5nIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0IGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5IG1lYXN1cmVzCi0gICAgICogdGhlIHdpZHRoIG9mIHRoZSB0ZXh0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgdGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbjsKLSAgICAgKiAgICAgICAgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc3RhcnQgbWVhc3VyaW5nCi0gICAgICogQHBhcmFtIGVuZCAxIGJleW9uZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgcGFpbnQsIHdvcmtQYWludCwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzk1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkZvbnRNZXRyaWNzSW50OworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpbmUgb2Ygc3R5bGVkIHRleHQsIGZvciBtZWFzdXJpbmcgaW4gdmlzdWFsIG9yZGVyIGFuZAorICogZm9yIHJlbmRlcmluZy4KKyAqCisgKiA8cD5HZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgb2J0YWluKCksIGFuZCB3aGVuIGZpbmlzaGVkIHdpdGggaXQsIHJldHVybiBpdAorICogdG8gdGhlIHBvb2wgdXNpbmcgcmVjeWNsZSgpLgorICoKKyAqIDxwPkNhbGwgc2V0IHRvIHByZXBhcmUgdGhlIGluc3RhbmNlIGZvciB1c2UsIHRoZW4gZWl0aGVyIGRyYXcsIG1lYXN1cmUsCisgKiBtZXRyaWNzLCBvciBjYXJldFRvTGVmdFJpZ2h0T2YuCisgKgorICogQGhpZGUKKyAqLworY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICBwcml2YXRlIGludCBtU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtRGlyOworICAgIHByaXZhdGUgRGlyZWN0aW9ucyBtRGlyZWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1RhYnM7CisgICAgcHJpdmF0ZSBUYWJTdG9wcyBtVGFiczsKKyAgICBwcml2YXRlIGNoYXJbXSBtQ2hhcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFyc1ZhbGlkOworICAgIHByaXZhdGUgU3Bhbm5lZCBtU3Bhbm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGV4dExpbmVbXSBjYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB1bmluaXRpYWxpemVkIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKKyAgICAgICAgVGV4dExpbmUgdGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7CisgICAgICAgIExvZy5lKCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIHJldHVybiB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgVGV4dExpbmUgYmFjayBpbnRvIHRoZSBzaGFyZWQgcG9vbC4gRG8gbm90IHVzZSB0aGlzIFRleHRMaW5lIG9uY2UKKyAgICAgKiBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdGwgdGhlIHRleHRMaW5lCisgICAgICogQHJldHVybiBudWxsLCBhcyBhIGNvbnZlbmllbmNlIGZyb20gY2xlYXJpbmcgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQKKyAgICAgKiBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSByZWN5Y2xlKFRleHRMaW5lIHRsKSB7CisgICAgICAgIHRsLm1UZXh0ID0gbnVsbDsKKyAgICAgICAgdGwubVBhaW50ID0gbnVsbDsKKyAgICAgICAgdGwubURpcmVjdGlvbnMgPSBudWxsOworICAgICAgICBpZiAodGwubUxlbiA8IDI1MCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gdGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRleHRMaW5lIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBiYXNlIHBhaW50IGZvciB0aGUgbGluZQorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LCBjYW4gYmUgU3R5bGVkCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb25zIHRoZSBkaXJlY3Rpb25zIGluZm9ybWF0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgdGhlIGxpbmUgbWlnaHQgY29udGFpbiB0YWJzIG9yIGVtb2ppCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWJTdG9wcy4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXQoVGV4dFBhaW50IHBhaW50LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBkaXIsCisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsIGJvb2xlYW4gaGFzVGFicywgVGFiU3RvcHMgdGFiU3RvcHMpIHsKKyAgICAgICAgbVBhaW50ID0gcGFpbnQ7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsaW1pdCAtIHN0YXJ0OworICAgICAgICBtRGlyID0gZGlyOworICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcmVjdGlvbnM7CisgICAgICAgIG1IYXNUYWJzID0gaGFzVGFiczsKKyAgICAgICAgbVNwYW5uZWQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBtU3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgaGFzUmVwbGFjZW1lbnQgPSBtU3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1DaGFyc1ZhbGlkID0gaGFzUmVwbGFjZW1lbnQgfHwgaGFzVGFicyB8fAorICAgICAgICAgICAgZGlyZWN0aW9ucyAhPSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbUxlbikgeworICAgICAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKG1MZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgbGltaXQsIG1DaGFycywgMCk7CisgICAgICAgICAgICBpZiAoaGFzUmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlc2UgYWxsIGF0IG9uY2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhcyB3ZSBnby4KKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCByZXBsYWNlbWVudCBydW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QtcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluZGVyIHdpdGggemVybyB3aWR0aAorICAgICAgICAgICAgICAgIC8vIG5vbi1icmVhayBzcGFjZSBha2EgQk9NLiAgQ3Vyc29yIG1vdmVtZW50IGNvZGUgc2tpcHMgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBsaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3Bhbm5lZC5nZXRTcGFucyhpLCBpbmV4dCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPiAwKSB7IC8vIHRyYW5zaXRpb24gaW50byBhIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2kgLSBzdGFydF0gPSAnXHVmZmZjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gc3RhcnQgKyAxLCBlID0gaW5leHQgLSBzdGFydDsgaiA8IGU7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gJ1x1ZmVmZic7IC8vIHVzZWQgYXMgWldOQlMsIG1hcmtzIHBvc2l0aW9ucyB0byBza2lwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRhYnMgPSB0YWJTdG9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBUZXh0TGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gcmVuZGVyIG9uCisgICAgICogQHBhcmFtIHggdGhlIGxlYWRpbmcgbWFyZ2luIHBvc2l0aW9uCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBSZWN0RiBlbW9qaVJlY3QgPSBudWxsOworCisgICAgICAgIGludCBsYXN0UnVuSW5kZXggPSBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBtQ2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQobUNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoICs9IGRyYXdSdW4oYywgaSwgc2Vnc3RhcnQsIGosIHJ1bklzUnRsLCB4K2gsIHRvcCwgeSwgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gbGFzdFJ1bkluZGV4IHx8IGogIT0gbUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IC1ibUFzY2VudCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamlSZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdC5zZXQoeCArIGgsIHkgKyBibUFzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIGVtb2ppUmVjdCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgZm9udCBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgbGluZQorICAgICAqLworICAgIGZsb2F0IG1ldHJpY3MoRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBtZWFzdXJlKG1MZW4sIGZhbHNlLCBmbWkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGxpbmUtcmVsYXRpdmUgY2hhcmFjdGVyIG9mZnNldCwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsaW5lIGxlbmd0aCwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRyYWlsaW5nIHRydWUgdG8gbWVhc3VyZSB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYmVmb3JlIG9mZnNldCwgZmFsc2UgdG8gbWVhc3VyZSB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4gdG8gdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciBlZGdlLgorICAgICAqLworICAgIGZsb2F0IG1lYXN1cmUoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIGludCB0YXJnZXQgPSB0cmFpbGluZyA/IG9mZnNldCAtIDEgOiBvZmZzZXQ7CisgICAgICAgIGlmICh0YXJnZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworCisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2VnbWVudCA9IHRhcmdldCA+PSBzZWdzdGFydCAmJiB0YXJnZXQgPCBqOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IChtRGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQgJiYgYWR2YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBhZHZhbmNlID8gdyA6IC13OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKiAtYm1Bc2NlbnQgLyBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gbURpciAqIHdpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIGRyYXcgb24KKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uYWwgcnVuCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHBvc2l0aW9uIG9mIHRoZSBydW4gdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7CisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIHJ1biwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIGxlYWRpbmcgZWRnZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0LCBiYXNlZCBvbiB0aGUgcnVuIChub3QgcGFyYWdyYXBoKSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1lYXN1cmVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgb2Zmc2V0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGlzIGxpbmUsIHNraXBwaW5nIGNvbmp1bmN0cyBhbmQKKyAgICAgKiB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSB3YWxrIHRoZSBjdXJzb3Igb2ZmIHRoZSBlbmRzIG9mIHRoZSBsaW5lCisgICAgICogc2luY2UgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbnkgc2hhcGluZyBvbiB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUKKyAgICAgKiB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBDYWxsZXJzIG11c3QgZWl0aGVyIGF2b2lkIHRoZXNlCisgICAgICogc2l0dWF0aW9ucyBvciBoYW5kbGUgdGhlIHJlc3VsdCBzcGVjaWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgbGluZSwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRvTGVmdCB0cnVlIGlmIHRoZSBjYXJldCBpcyBtb3ZpbmcgdG8gdGhlIGxlZnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldC4gIElmIGl0IGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIGxpbmUsIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgZXhhbWluZWQgdG8gZ2V0IHRoZQorICAgICAqIGFjdHVhbCBvZmZzZXQuCisgICAgICovCisgICAgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGN1cnNvciwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgLy8gMSkgVGhlIGNhcmV0IG1hcmtzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgYSBjaGFyYWN0ZXIuIFRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gbG9naWNhbGx5IGJlZm9yZSBpdCBtaWdodCBiZSBvbiBhIGRpZmZlcmVudCBsZXZlbCwgYW5kIHRoZSBhY3RpdmUgY2FyZXQKKyAgICAgICAgLy8gcG9zaXRpb24gaXMgb24gdGhlIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuIElmIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIC8vIHdhcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB0aGUgY2FyZXQgaXMgb24gaXRzIHRyYWlsaW5nIGVkZ2UuCisgICAgICAgIC8vIDIpIFRha2UgdGhpcyBjaGFyYWN0ZXIvZWRnZSBhbmQgbW92ZSBpdCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbi4KKyAgICAgICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBuZXcgY2hhcmFjdGVyIGFuZCBhIG5ldyBlZGdlLgorICAgICAgICAvLyAzKSBUaGlzIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHZpc3VhbGx5IGFkamFjZW50IGNoYXJhY3RlcnMuICBPbmUgb2YKKyAgICAgICAgLy8gdGhlc2UgbWlnaHQgYmUgYXQgYSBsb3dlciBsZXZlbC4gIFRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlCisgICAgICAgIC8vIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuCisgICAgICAgIC8vIDQpIElmIHRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciwKKyAgICAgICAgLy8gdGhlIG5ldyBjYXJldCBwb3NpdGlvbiBpcyB0aGUgZm9sbG93aW5nIGxvZ2ljYWwgY2hhcmFjdGVyLCBlbHNlIGl0CisgICAgICAgIC8vIGlzIHRoZSBjaGFyYWN0ZXIuCisKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgICAgIGludCBsaW5lRW5kID0gbUxlbjsKKyAgICAgICAgYm9vbGVhbiBwYXJhSXNSdGwgPSBtRGlyID09IC0xOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IHJ1bkluZGV4LCBydW5MZXZlbCA9IDAsIHJ1blN0YXJ0ID0gbGluZVN0YXJ0LCBydW5MaW1pdCA9IGxpbmVFbmQsIG5ld0NhcmV0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSAtMjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSBydW5zLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGaXJzdCwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHdpdGgKKyAgICAgICAgICAvLyB0aGUgYWN0aXZlIGNhcmV0LgorICAgICAgICAgIGZvciAocnVuSW5kZXggPSAwOyBydW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBydW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICBydW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcnVuSW5kZXhdOworICAgICAgICAgICAgaWYgKGN1cnNvciA+PSBydW5TdGFydCkgeworICAgICAgICAgICAgICBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbcnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gKHJ1bnNbcnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJldCBpcyBvbiBhIHJ1biBib3VuZGFyeSwgc2VlIGlmIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgY2hhcmFjdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICBpbnQgcHJldlJ1bkluZGV4LCBwcmV2UnVuTGV2ZWwsIHByZXZSdW5TdGFydCwgcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGN1cnNvciAtIDE7CisgICAgICAgICAgICAgICAgICBmb3IgKHByZXZSdW5JbmRleCA9IDA7IHByZXZSdW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBwcmV2UnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmV2UnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3ByZXZSdW5JbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcHJldlJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gcHJldlJ1blN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bnNbcHJldlJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IHByZXZSdW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxldmVsID0gKHJ1bnNbcHJldlJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gbG9naWNhbGx5IHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBwcmV2UnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gcHJldlJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydCA9IHByZXZSdW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2FyZXQgbWlnaHQgYmUgPT0gbGluZUVuZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc3BhY2Ugb3IgcGFyYWdyYXBoCisgICAgICAgICAgLy8gc2VwYXJhdG9yIGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBydW4sIGJ1dCBtaWdodCBiZSB0aGUgZW5kIG9mCisgICAgICAgICAgLy8gdGV4dCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0LiAgSWYgdGhhdCBoYXBwZW5zLCB3ZSByYW4gb2ZmIHRoZQorICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcnVuIGxpc3QsIGFuZCBydW5JbmRleCA9PSBydW5zLmxlbmd0aC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAvLyB3ZSBhcmUgYXQgYSBydW4gYm91bmRhcnkgc28gd2Ugc2tpcCB0aGUgYmVsb3cgdGVzdC4KKyAgICAgICAgICBpZiAocnVuSW5kZXggIT0gcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5MZXZlbCAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHJ1bklzUnRsOworICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkgfHwgYWR2YW5jZSAhPSB0cmFpbGluZykgeworICAgICAgICAgICAgICAgICAgLy8gTW92aW5nIHdpdGhpbiBvciBpbnRvIHRoZSBydW4sIHNvIHdlIGNhbiBtb3ZlIGxvZ2ljYWxseS4KKyAgICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIocnVuSW5kZXgsIHJ1blN0YXJ0LCBydW5MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIGN1cnNvciwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludGVybmFsIHRvIHRoZSBydW4sIHdlJ3JlIGF0IHRoZSBzdHJvbmcKKyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFscmVhZHkgc28gd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5ld0NhcmV0IGlzIC0xLCB3ZSdyZSBzdGFydGluZyBhdCBhIHJ1biBib3VuZGFyeSBhbmQgY3Jvc3NpbmcKKyAgICAgICAgLy8gaW50byBhbm90aGVyIHJ1bi4gT3RoZXJ3aXNlIHdlJ3ZlIGFycml2ZWQgYXQgYSBydW4gYm91bmRhcnksIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhcmFjdGVyIHRvIGF0dGFjaCB0by4gIE5vdGUgd2UgbWlnaHQKKyAgICAgICAgLy8gbmVlZCB0byBydW4gdGhpcyB0d2ljZSwgaWYgd2UgY3Jvc3MgYSBydW4gYm91bmRhcnkgYW5kIGVuZCB1cCBhdAorICAgICAgICAvLyBhbm90aGVyIHJ1biBib3VuZGFyeS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcGFyYUlzUnRsOworICAgICAgICAgIGludCBvdGhlclJ1bkluZGV4ID0gcnVuSW5kZXggKyAoYWR2YW5jZSA/IDIgOiAtMik7CisgICAgICAgICAgaWYgKG90aGVyUnVuSW5kZXggPj0gMCAmJiBvdGhlclJ1bkluZGV4IDwgcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvdGhlclJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tvdGhlclJ1bkluZGV4XTsKKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxpbWl0ID0gb3RoZXJSdW5TdGFydCArCisgICAgICAgICAgICAocnVuc1tvdGhlclJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAob3RoZXJSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxldmVsID0gKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJSdW5Jc1J0bCA9IChvdGhlclJ1bkxldmVsICYgMSkgIT0gMDsKKworICAgICAgICAgICAgYWR2YW5jZSA9IHRvTGVmdCA9PSBvdGhlclJ1bklzUnRsOworICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihvdGhlclJ1bkluZGV4LCBvdGhlclJ1blN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCwgb3RoZXJSdW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdCwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IChhZHZhbmNlID8gb3RoZXJSdW5MaW1pdCA6IG90aGVyUnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyb3NzZWQgYW5kIGVuZGVkIHVwIGF0IGEgbmV3IGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgYSBzZWNvbmQgYW5kIGZpbmFsIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gb3RoZXJSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBvdGhlclJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXcgY2FyZXQgaXMgYXQgYSBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHN0cm9uZyBjaGFyYWN0ZXIgaXMgaW4gdGhlIG90aGVyIHJ1bi4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UncmUgd2Fsa2luZyBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgLy8gbGV2ZWwgaXMgYWx3YXlzIGVxdWFsIHRvIG9yIGxvd2VyIHRoYW4gYW55IGludGVybmFsIGxldmVsLCBzbworICAgICAgICAgICAgICAvLyB0aGUgYm91bmRhcmllcyBnZXQgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbUxlbiArIDEgOiAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRWxzZSB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGF0J3MgYSBzdHJvbmcgcG9zaXRpb24uCisgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhcnJpdmVkIGhlcmUgYnkgY3Jvc3Npbmcgb3ZlciBhIHJ1biB3aXRoIG5vIGludGVybmFsCisgICAgICAgICAgLy8gYnJlYWtzIGFuZCBkcm9wcGluZyBvdXQgb2YgdGhlIGFib3ZlIGxvb3AgYmVmb3JlIGFkdmFuY2luZyBvbmUgZmluYWwKKyAgICAgICAgICAvLyB0aW1lLCBzbyByZXNldCB0aGUgY2FyZXQuCisgICAgICAgICAgLy8gTm90ZSwgd2UgdXNlICc8PScgYmVsb3cgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJ1bgorICAgICAgICAgIC8vIG9uIHRoZSBsaW5lIGlzIGEgY291bnRlci1kaXJlY3Rpb25hbCBydW4uICBJZiB3ZSdyZSBub3QgYWR2YW5jaW5nLAorICAgICAgICAgIC8vIHdlIGNhbiBlbmQgdXAgYXQgdGhlICdsaW5lRW5kJyBwb3NpdGlvbiBidXQgdGhlIGNhcmV0IHdlIHdhbnQgaXMgYXQKKyAgICAgICAgICAvLyB0aGUgbGluZVN0YXJ0LgorICAgICAgICAgIGlmIChuZXdDYXJldCA8PSBsaW5lRW5kKSB7CisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKKyAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsaworICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgdGhlIHJldHVybmVkIHZhbHVlcyBtaWdodCBub3QgYmUgdmFsaWQKKyAgICAgKiBvbiBuZWlnaGJvcmluZyBsaW5lcy4gIElmIHRoZSByZXR1cm5lZCBvZmZzZXQgaXMgbGVzcyB0aGFuIHplcm8gb3IKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhlIGxpbmUgbGVuZ3RoLCB0aGUgb2Zmc2V0IHNob3VsZCBiZSByZWNvbXB1dGVkIG9uIHRoZQorICAgICAqIHByZWNlZGluZyBvciBmb2xsb3dpbmcgbGluZSwgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gcnVuU3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuTGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gYWZ0ZXIgdHJ1ZSBpZiB0aGUgbmV3IG9mZnNldCBzaG91bGQgbG9naWNhbGx5IGZvbGxvdyB0aGUgcHJvdmlkZWQKKyAgICAgKiBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgb2Zmc2V0CisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIoaW50IHJ1bkluZGV4LCBpbnQgcnVuU3RhcnQsIGludCBydW5MaW1pdCwKKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwsIGludCBvZmZzZXQsIGJvb2xlYW4gYWZ0ZXIpIHsKKworICAgICAgICBpZiAocnVuSW5kZXggPCAwIHx8IG9mZnNldCA9PSAoYWZ0ZXIgPyBtTGVuIDogMCkpIHsKKyAgICAgICAgICAgIC8vIFdhbGtpbmcgb2ZmIGVuZCBvZiBsaW5lLiAgU2luY2Ugd2UgZG9uJ3Qga25vdworICAgICAgICAgICAgLy8gd2hhdCBjdXJzb3IgcG9zaXRpb25zIGFyZSBhdmFpbGFibGUgb24gb3RoZXIgbGluZXMsIHdlIGNhbid0CisgICAgICAgICAgICAvLyByZXR1cm4gYWNjdXJhdGUgdmFsdWVzLiAgVGhlc2UgYXJlIGEgZ3Vlc3MuCisgICAgICAgICAgICBpZiAoYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQgKyBtU3RhcnQpIC0gbVN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICBUZXh0UGFpbnQgd3AgPSBtV29ya1BhaW50OworICAgICAgICB3cC5zZXQobVBhaW50KTsKKworICAgICAgICBpbnQgc3BhblN0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgIGludCBzcGFuTGltaXQ7CisgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzcGFuTGltaXQgPSBydW5MaW1pdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0YXJnZXQgPSBhZnRlciA/IG9mZnNldCArIDEgOiBvZmZzZXQ7CisgICAgICAgICAgICBpbnQgbGltaXQgPSBtU3RhcnQgKyBydW5MaW1pdDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgc3BhbkxpbWl0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIHNwYW5TdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKyAgICAgICAgICAgICAgICBpZiAoc3BhbkxpbWl0ID49IHRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3BhblN0YXJ0ID0gc3BhbkxpbWl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhtU3RhcnQgKyBzcGFuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIHNwYW5MaW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVwbGFjZW1lbnQgc3Bhbiwgd2UncmUgbW92aW5nIGVpdGhlciB0bworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoaXMgc3Bhbi4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyID8gc3BhbkxpbWl0IDogc3BhblN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBmbGFncyA9IHJ1bklzUnRsID8gUGFpbnQuRElSRUNUSU9OX1JUTCA6IFBhaW50LkRJUkVDVElPTl9MVFI7CisgICAgICAgIGludCBjdXJzb3JPcHQgPSBhZnRlciA/IFBhaW50LkNVUlNPUl9BRlRFUiA6IFBhaW50LkNVUlNPUl9CRUZPUkU7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobUNoYXJzLCBzcGFuU3RhcnQsIHNwYW5MaW1pdCAtIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB3cC5nZXRUZXh0UnVuQ3Vyc29yKG1UZXh0LCBtU3RhcnQgKyBzcGFuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIHNwYW5MaW1pdCwgZmxhZ3MsIG1TdGFydCArIG9mZnNldCwgY3Vyc29yT3B0KSAtIG1TdGFydDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIHRleHQuICBUaGUgdGV4dCBtdXN0CisgICAgICogbm90IGluY2x1ZGUgYSB0YWIgb3IgZW1vamkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3AgdGhlIHdvcmtpbmcgcGFpbnQKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcywgY2FuIGJlIG51bGwgaWYgcmVuZGVyaW5nIGlzIG5vdCBuZWVkZWQKKyAgICAgKiBAcGFyYW0geCB0aGUgZWRnZSBvZiB0aGUgcnVuIGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJ1biBpcyBuZWVkZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biBiYXNlZCBvbiB0aGUgcnVuIGRpcmVjdGlvbjsgb25seQorICAgICAqIHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBoYW5kbGVUZXh0KFRleHRQYWludCB3cCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGJvb2xlYW4gcnVuSXNSdGwsCisgICAgICAgICAgICBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgZmxvYXQgcmV0ID0gMDsKKworICAgICAgICBpbnQgcnVuTGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKG5lZWRXaWR0aCB8fCAoYyAhPSBudWxsICYmICh3cC5iZ0NvbG9yICE9IDAgfHwgcnVuSXNSdGwpKSkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgICAgIHJldCA9IHdwLmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHN0YXJ0LCBydW5MZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIGZsYWdzLCBudWxsLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgICAgIHJldCA9IHdwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgZGVsdGEgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgZW5kLCBkZWx0YSArIGNvbnRleHRTdGFydCwgZGVsdGEgKyBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cC5nZXRGb250TWV0cmljc0ludChmbWkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7CisgICAgICAgICAgICAgICAgeCAtPSByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3cC5iZ0NvbG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSB3cC5nZXRDb2xvcigpOworICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3cC5nZXRTdHlsZSgpOworICAgICAgICAgICAgICAgIHdwLnNldENvbG9yKHdwLmJnQ29sb3IpOworICAgICAgICAgICAgICAgIHdwLnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICAgICAgYy5kcmF3UmVjdCh4LCB0b3AsIHggKyByZXQsIGJvdHRvbSwgd3ApOworCisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUocyk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3IoY29sb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcmF3VGV4dFJ1bihjLCB3cCwgc3RhcnQsIGVuZCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBydW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgeCwgeSArIHdwLmJhc2VsaW5lU2hpZnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ1bklzUnRsID8gLXJldCA6IHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBtZWFzdXJpbmcgYW5kIHJlbmRlcmluZyBhIHJlcGxhY2VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcGxhY2VtZW50IHRoZSByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSB3cCB0aGUgd29yayBwYWludAorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcywgY2FuIGJlIG51bGwgaWYgbm90IHJlbmRlcmluZworICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSByZXBsYWNlbWVudCBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIG9mIHRoZSByZXBsYWNlbWVudCBpcyBuZWVkZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biBiYXNlZCBvbiB0aGUgcnVuIGRpcmVjdGlvbjsgb25seQorICAgICAqIHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBoYW5kbGVSZXBsYWNlbWVudChSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQsIFRleHRQYWludCB3cCwKKyAgICAgICAgICAgIGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIENhbnZhcyBjLAorICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sIEZvbnRNZXRyaWNzSW50IGZtaSwKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgZmxvYXQgcmV0ID0gMDsKKworICAgICAgICBpbnQgdGV4dFN0YXJ0ID0gbVN0YXJ0ICsgc3RhcnQ7CisgICAgICAgIGludCB0ZXh0TGltaXQgPSBtU3RhcnQgKyBsaW1pdDsKKworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgcnVuSXNSdGwpKSB7CisgICAgICAgICAgICByZXQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdwLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsIGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoYywgbVRleHQsIHRleHRTdGFydCwgdGV4dExpbWl0LAorICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgd3ApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ1bklzUnRsID8gLXJldCA6IHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBoYW5kbGluZyBhIHVuaWRpcmVjdGlvbmFsIHJ1bi4gIFRoZSBydW4gbXVzdCBub3QKKyAgICAgKiBjb250YWluIHRhYnMgb3IgZW1vamkgYnV0IGNhbiBjb250YWluIHN0eWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbWVhc3VyZUxpbWl0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcywgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0geCB0aGUgZW5kIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBpcyByZXF1aXJlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJ1bihpbnQgcnVuSW5kZXgsIGludCBzdGFydCwgaW50IG1lYXN1cmVMaW1pdCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LAorICAgICAgICAgICAgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLCBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIC8vIFNoYXBpbmcgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgY29udGV4dCB1cCB0byBtZXRyaWMgYm91bmRhcmllcywKKyAgICAgICAgLy8gYnV0IHJlbmRlcmluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjaGFyYWN0ZXIgc3R5bGUgYm91bmRhcmllcy4KKyAgICAgICAgLy8gU28gd2UgaXRlcmF0ZSB0aHJvdWdoIG1ldHJpYyBydW5zIHRvIGdldCBtZXRyaWMgYm91bmRzLAorICAgICAgICAvLyB0aGVuIHdpdGhpbiBlYWNoIG1ldHJpYyBydW4gaXRlcmF0ZSB0aHJvdWdoIGNoYXJhY3RlciBzdHlsZSBydW5zCisgICAgICAgIC8vIGZvciB0aGUgcnVuIGJvdW5kcy4KKyAgICAgICAgZmxvYXQgb3ggPSB4OworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGluZXh0OyBpIDwgbWVhc3VyZUxpbWl0OyBpID0gaW5leHQpIHsKKyAgICAgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKworICAgICAgICAgICAgaW50IG1saW1pdDsKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICBtbGltaXQgPSBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGksIG1TdGFydCArIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICBtbGltaXQgPSBpbmV4dCA8IG1lYXN1cmVMaW1pdCA/IGluZXh0IDogbWVhc3VyZUxpbWl0OworICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGksCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBtbGltaXQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworCisgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBoYXZlIGEgcmVwbGFjZW1lbnQgdGhhdCB1c2VzIHRoZSBkcmF3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUsIG90aGVyd2lzZSBtZWFzdXJlIHN0YXRlIHdvdWxkIHN1ZmZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gaGFuZGxlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQsIHdwLCBydW5JbmRleCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLCB5LCBib3R0b20sIGZtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwgfHwgYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBpLCBtbGltaXQsIGksIGluZXh0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBtbGltaXQgPCBtZWFzdXJlTGltaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSwgam5leHQ7IGogPCBtbGltaXQ7IGogPSBqbmV4dCkgeworICAgICAgICAgICAgICAgICAgICBqbmV4dCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihtU3RhcnQgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpIC0gbVN0YXJ0OworCisgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlclN0eWxlW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhtU3RhcnQgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIGpuZXh0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc3BhbnMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlclN0eWxlIHNwYW4gPSBzcGFuc1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlRHJhd1N0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHggKz0gaGFuZGxlVGV4dCh3cCwgaiwgam5leHQsIGksIGluZXh0LCBydW5Jc1J0bCwgYywgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgZm1pLCBuZWVkV2lkdGggfHwgam5leHQgPCBtZWFzdXJlTGltaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB4IC0gb3g7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgdGV4dCBydW4gd2l0aCB0aGUgc2V0LXVwIHBhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcworICAgICAqIEBwYXJhbSB3cCB0aGUgcGFpbnQgdXNlZCB0byByZW5kZXIgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lIG9mIHRoZSBydW4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIFRleHRQYWludCB3cCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGJvb2xlYW4gcnVuSXNSdGwsIGZsb2F0IHgsIGludCB5KSB7CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBDYW52YXMuRElSRUNUSU9OX1JUTCA6IENhbnZhcy5ESVJFQ1RJT05fTFRSOworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1DaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgeCwgeSwgZmxhZ3MsIHdwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkZWx0YSA9IG1TdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIGRlbHRhICsgc3RhcnQsIGRlbHRhICsgZW5kLAorICAgICAgICAgICAgICAgICAgICBkZWx0YSArIGNvbnRleHRTdGFydCwgZGVsdGEgKyBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXNjZW50IG9mIHRoZSB0ZXh0IGF0IHN0YXJ0LiAgVGhpcyBpcyB1c2VkIGZvciBzY2FsaW5nCisgICAgICogZW1vamkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBsaW5lLXJlbGF0aXZlIHBvc2l0aW9uCisgICAgICogQHJldHVybiB0aGUgYXNjZW50IG9mIHRoZSB0ZXh0IGF0IHN0YXJ0CisgICAgICovCisgICAgZmxvYXQgYXNjZW50KGludCBwb3MpIHsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFpbnQuYXNjZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwb3MgKz0gbVN0YXJ0OworICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhwb3MsIHBvcyArIDEsCisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgIGlmIChzcGFucy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworICAgICAgICBmb3IgKE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA6IHNwYW5zKSB7CisgICAgICAgICAgICBzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3cCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdwLmFzY2VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdGFiIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGggdGhlICh1bnNpZ25lZCkgb2Zmc2V0IGZyb20gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHJldHVybiB0aGUgKHVuc2lnbmVkKSB0YWIgcG9zaXRpb24gYWZ0ZXIgdGhpcyBvZmZzZXQKKyAgICAgKi8KKyAgICBmbG9hdCBuZXh0VGFiKGZsb2F0IGgpIHsKKyAgICAgICAgaWYgKG1UYWJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFicy5uZXh0VGFiKGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AoaCwgVEFCX0lOQ1JFTUVOVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCmluZGV4IDk1ODliZjMuLjJkNmM3YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQpAQCAtMTcsMTIgKzE3LDExIEBACiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQmFja2dyb3VuZENvbG9yU3BhbjsKQEAgLTQ1LDEwICs0NCw4IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVuZGVybGluZVNwYW47CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIHB1YmxpYyBjbGFzcyBUZXh0VXRpbHMgewogICAgIHByaXZhdGUgVGV4dFV0aWxzKCkgeyAvKiBjYW5ub3QgYmUgaW5zdGFudGlhdGVkICovIH0KQEAgLTk4Myw3ICs5ODAsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHRleHQgaWYgaXQgZml0cyBpbiB0aGUgc3BlY2lmaWVkIHdpZHRoCiAgICAgICogZ2l2ZW4gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBQYWludCwKLSAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQgCisgICAgICogb3IsIGlmIGl0IGRvZXMgbm90IGZpdCwgYSBjb3B5IHdpdGggZWxsaXBzaXMgY2hhcmFjdGVyIGFkZGVkCiAgICAgICogYXQgdGhlIHNwZWNpZmllZCBlZGdlIG9yIGNlbnRlci4KICAgICAgKiBJZiA8Y29kZT5wcmVzZXJ2ZUxlbmd0aDwvY29kZT4gaXMgc3BlY2lmaWVkLCB0aGUgcmV0dXJuZWQgY29weQogICAgICAqIHdpbGwgYmUgcGFkZGVkIHdpdGggemVyby13aWR0aCBzcGFjZXMgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsCkBAIC05OTIsNyArOTg5LDcgQEAKICAgICAgKiByZXBvcnQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGVsbGlwc2l6ZWQgcmFuZ2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZWxsaXBzaXplKENoYXJTZXF1ZW5jZSB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVHJ1bmNhdGVBdCB3aGVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzaXplQ2FsbGJhY2sgY2FsbGJhY2spIHsKQEAgLTEwMDMsMTMgKzEwMDAsMTIgQEAKIAogICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKIAotICAgICAgICAvLyBVc2UgUGFpbnQuYnJlYWtUZXh0KCkgZm9yIHRoZSBub24tU3Bhbm5lZCBjYXNlIHRvIGF2b2lkIGhhdmluZwotICAgICAgICAvLyB0byBhbGxvY2F0ZSBtZW1vcnkgYW5kIGFjY3VtdWxhdGUgdGhlIGNoYXJhY3RlciB3aWR0aHMgb3Vyc2VsdmVzLgorICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IHNldFBhcmEobXQsIHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOwogCi0gICAgICAgIGlmICghKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSkgewotICAgICAgICAgICAgZmxvYXQgd2lkID0gcC5tZWFzdXJlVGV4dCh0ZXh0LCAwLCBsZW4pOwotCi0gICAgICAgICAgICBpZiAod2lkIDw9IGF2YWlsKSB7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMTcsMjUwICsxMDEzLDY5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgLy8gWFhYIGFzc3VtZXMgZWxsaXBzaXMgc3RyaW5nIGRvZXMgbm90IHJlcXVpcmUgc2hhcGluZyBhbmQKKyAgICAgICAgICAgIC8vIGlzIHVuYWZmZWN0ZWQgYnkgc3R5bGUKKyAgICAgICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcGFpbnQubWVhc3VyZVRleHQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgIGF2YWlsIC09IGVsbGlwc2lzd2lkOwogCi0gICAgICAgICAgICBpZiAoZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgICAgIGludCBmaXQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbCAtIGVsbGlwc2lzd2lkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIDAsIGxlbiAtIGZpdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNFbGxpcHNpcyArIHRleHQudG9TdHJpbmcoKS5zdWJzdHJpbmcobGVuIC0gZml0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKKyAgICAgICAgICAgIGludCByaWdodCA9IGxlbjsKKyAgICAgICAgICAgIGlmIChhdmFpbCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpdCBhbGwgZ29lcworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7CisgICAgICAgICAgICAgICAgcmlnaHQgPSBsZW4gLSBtdC5icmVha1RleHQoMCwgbGVuLCBmYWxzZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LkVORCkgewotICAgICAgICAgICAgICAgIGludCBmaXQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBibGFuayh0ZXh0LCBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgZml0KSArIHNFbGxpcHNpczsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSBlbHNlIC8qIHdoZXJlID09IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDIsIG51bGwpOwotICAgICAgICAgICAgICAgIGZsb2F0IHVzZWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIGxlbiAtIHJpZ2h0LCBsZW4pOwotICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuIC0gcmlnaHQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbCAtIGVsbGlwc2lzd2lkIC0gdXNlZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGxlZnQsIGxlbiAtIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGxlZnQsIGxlbiAtIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIGxlZnQpICsgc0VsbGlwc2lzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGxlbiAtIHJpZ2h0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJ1dCBkbyB0aGUgU3Bhbm5lZCBjYXNlcyBieSBoYW5kLCBiZWNhdXNlIGl0J3Mgc3VjaCBhIHBhaW4KLSAgICAgICAgLy8gdG8gaXRlcmF0ZSB0aGUgc3BhbiB0cmFuc2l0aW9ucyBiYWNrd2FyZHMgYW5kIGdldFRleHRXaWR0aHMoKQotICAgICAgICAvLyB3aWxsIGdpdmUgdXMgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQuCi0KLSAgICAgICAgLy8gZ2V0VGV4dFdpZHRocygpIGFsd2F5cyB3cml0ZXMgaW50byB0aGUgc3RhcnQgb2YgdGhlIGFycmF5LAotICAgICAgICAvLyBzbyBtZWFzdXJlIGVhY2ggc3BhbiBpbnRvIHRoZSBmaXJzdCBoYWxmIGFuZCB0aGVuIGNvcHkgdGhlCi0gICAgICAgIC8vIHJlc3VsdHMgaW50byB0aGUgc2Vjb25kIGhhbGYgdG8gdXNlIGxhdGVyLgotCi0gICAgICAgIGZsb2F0W10gd2lkID0gbmV3IGZsb2F0W2xlbiAqIDJdOwotICAgICAgICBUZXh0UGFpbnQgdGVtcHBhaW50ID0gbmV3IFRleHRQYWludCgpOwotICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIHRleHQ7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpID0gbmV4dCkgewotICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwLCB0ZW1wcGFpbnQsIHNwLCBpLCBuZXh0LCB3aWQsIG51bGwpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIDAsIHdpZCwgbGVuICsgaSwgbmV4dCAtIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgc3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgc3VtICs9IHdpZFtsZW4gKyBpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdW0gPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBlbGxpcHNpc3dpZCA9IHAubWVhc3VyZVRleHQoc0VsbGlwc2lzKTsKLQotICAgICAgICBpZiAoZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGxlbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBvYnRhaW4obGVuKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pKTsKLSAgICAgICAgICAgICAgICByZWN5Y2xlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7CisgICAgICAgICAgICAgICAgbGVmdCA9IG10LmJyZWFrVGV4dCgwLCBsZW4sIHRydWUsIGF2YWlsKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKLSAgICAgICAgICAgIHN1bSA9IDA7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gbGVuOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaSAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN1bSArPSB3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgMCwgaSkpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgxLCB0ZXh0LCBpLCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LkVORCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIGldOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN1bSArPSB3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoaSwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCBpLCBsZW4pKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgaSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgLyogd2hlcmUgPSBUcnVuY2F0ZUF0Lk1JRERMRSAqLyB7Ci0gICAgICAgICAgICBmbG9hdCBsc3VtID0gMCwgcnN1bSA9IDA7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IDAsIHJpZ2h0ID0gbGVuOwotCi0gICAgICAgICAgICBmbG9hdCByYXZhaWwgPSAoYXZhaWwgLSBlbGxpcHNpc3dpZCkgLyAyOwotICAgICAgICAgICAgZm9yIChyaWdodCA9IGxlbjsgcmlnaHQgPj0gMDsgcmlnaHQtLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgcmlnaHQgLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgcnN1bSA+IHJhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwotICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIGxlZnRdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxzdW0gKz0gdzsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCAvIDIpOworICAgICAgICAgICAgICAgIGF2YWlsIC09IG10Lm1lYXN1cmUocmlnaHQsIGxlbik7CisgICAgICAgICAgICAgICAgbGVmdCA9IG10LmJyZWFrVGV4dCgwLCByaWdodCwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgcmlnaHQpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworCisgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gbGVuIC0gKHJpZ2h0IC0gbGVmdCk7CiAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsgLy8gZWxzZSBlbGltaW5hdGUgdGhlIGVsbGlwc2lzIHRvbworICAgICAgICAgICAgICAgICAgICBidWZbbGVmdCsrXSA9ICdcdTIwMjYnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbGVmdDsgaSA8IHJpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKHNwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcocyk7CiAgICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDAsIHRleHQsIDAsIGxlZnQpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQob3V0Lmxlbmd0aCgpLCB0ZXh0LCByaWdodCwgbGVuKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmxhbmsoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGludCBsZW4gPSBzb3VyY2UubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBvYnRhaW4obGVuKTsKLQotICAgICAgICBpZiAoc3RhcnQgIT0gMCkgewotICAgICAgICAgICAgZ2V0Q2hhcnMoc291cmNlLCAwLCBzdGFydCwgYnVmLCAwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5kICE9IGxlbikgewotICAgICAgICAgICAgZ2V0Q2hhcnMoc291cmNlLCBlbmQsIGxlbiwgYnVmLCBlbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXJ0ICE9IGVuZCkgewotICAgICAgICAgICAgYnVmW3N0YXJ0XSA9ICdcdTIwMjYnOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBTdHJpbmcgcmV0ID0gbmV3IFN0cmluZyhidWYsIDAsIGxlbik7Ci0gICAgICAgIHJlY3ljbGUoYnVmKTsKIAotICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKHNwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocmVtYWluaW5nICsgc0VsbGlwc2lzLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYnVmLCAwLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYnVmLCByaWdodCwgbGVuIC0gcmlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIDAsIGxlZnQpOworICAgICAgICAgICAgc3NiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgc3NiLmFwcGVuZCh0ZXh0LCByaWdodCwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBzc2I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEyNzgsODAgKzEwOTMsMTIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHAsIGZsb2F0IGF2YWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbmVNb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb3JlKSB7Ci0gICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKLSAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIDAsIGxlbiwgYnVmLCAwKTsKIAotICAgICAgICBpbnQgY29tbWFDb3VudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY29tbWFDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXRbXSB3aWQ7Ci0KLSAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIHRleHQ7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGVtcHBhaW50ID0gbmV3IFRleHRQYWludCgpOwotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbiAqIDJdOwotCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGVuLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIDAsIHdpZCwgbGVuICsgaSwgbmV4dCAtIGkpOworICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcCwgdGV4dCwgMCwgbGVuLCBMYXlvdXQuRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOworICAgICAgICAgICAgaWYgKHdpZHRoIDw9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkLCBsZW4sIHdpZCwgMCwgbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdpZCA9IG5ldyBmbG9hdFtsZW5dOwotICAgICAgICAgICAgcC5nZXRUZXh0V2lkdGhzKHRleHQsIDAsIGxlbiwgd2lkKTsKLSAgICAgICAgfQorICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG10Lm1DaGFyczsKIAotICAgICAgICBpbnQgb2sgPSAwOwotICAgICAgICBpbnQgb2tSZW1haW5pbmcgPSBjb21tYUNvdW50ICsgMTsKLSAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7Ci0KLSAgICAgICAgaW50IHcgPSAwOwotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIHcgKz0gd2lkW2ldOwotCi0gICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gY29tbWFDb3VudCAtIGNvdW50ICsgMTsKLSAgICAgICAgICAgICAgICBmbG9hdCBtb3JlV2lkOwotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgb25lTW9yZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbW9yZVdpZCA9IHAubWVhc3VyZVRleHQoZm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBvayA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICBva1JlbWFpbmluZyA9IHJlbWFpbmluZzsKLSAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICBpbnQgY29tbWFDb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFDb3VudCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfQogCi0gICAgICAgIGlmICh3IDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50ICsgMTsKKworICAgICAgICAgICAgaW50IG9rID0gMDsKKyAgICAgICAgICAgIGludCBva1JlbWFpbmluZyA9IHJlbWFpbmluZzsKKyAgICAgICAgICAgIFN0cmluZyBva0Zvcm1hdCA9ICIiOworCisgICAgICAgICAgICBpbnQgdyA9IDA7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMgPSBtdC5tV2lkdGhzOworCisgICAgICAgICAgICBpbnQgcmVxdWVzdCA9IG10Lm1EaXIgPT0gMSA/IExheW91dC5ESVJfUkVRVUVTVF9MVFIgOgorICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9SVEw7CisKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dCB0ZW1wTXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgbm90IGluc2VydCBzcGFjZXMsIHNob3VsZCBiZSBwYXJ0IG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgICAvLyBYWFggc2hvdWxkIHVzZSBwbHVyYWwgcnVsZXMgYW5kIG5vdCBhc3N1bWUgRW5nbGlzaCBwbHVyYWxzCisgICAgICAgICAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgU3RyaW5nLmZvcm1hdChtb3JlLCByZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHRoaXMgaXMgcHJvYmFibHkgb2ssIGJ1dCBuZWVkIHRvIGxvb2sgYXQgaXQgbW9yZQorICAgICAgICAgICAgICAgICAgICB0ZW1wTXQuc2V0UGFyYShmb3JtYXQsIDAsIGZvcm1hdC5sZW5ndGgoKSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQgPSBtdC5hZGRTdHlsZVJ1bihwLCBtdC5tTGVuLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodyArIG1vcmVXaWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBva1JlbWFpbmluZyA9IHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUodGVtcE10KTsKKwogICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihva0Zvcm1hdCk7CiAgICAgICAgICAgICBvdXQuaW5zZXJ0KDAsIHRleHQsIDAsIG9rKTsKICAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBzZXRQYXJhKE1lYXN1cmVkVGV4dCBtdCwgVGV4dFBhaW50IHBhaW50LAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGJpZGlSZXF1ZXN0KSB7CisKKyAgICAgICAgbXQuc2V0UGFyYSh0ZXh0LCBzdGFydCwgZW5kLCBiaWRpUmVxdWVzdCk7CisKKyAgICAgICAgZmxvYXQgd2lkdGg7CisgICAgICAgIFNwYW5uZWQgc3AgPSB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCA/IChTcGFubmVkKSB0ZXh0IDogbnVsbDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgd2lkdGggPSBtdC5hZGRTdHlsZVJ1bihwYWludCwgbGVuLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICAgIGludCBzcGFuRW5kOworICAgICAgICAgICAgZm9yIChpbnQgc3BhblN0YXJ0ID0gMDsgc3BhblN0YXJ0IDwgbGVuOyBzcGFuU3RhcnQgPSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzcGFuU3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0LCBzcGFuRW5kLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB3aWR0aCArPSBtdC5hZGRTdHlsZVJ1bihwYWludCwgc3BhbnMsIHNwYW5FbmQgLSBzcGFuU3RhcnQsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBib29sZWFuIGRvZXNOb3ROZWVkQmlkaShDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKGNoYXJbXSB0ZXh0LCBpbnQgc3RhcnQsIGludCBsZW4pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbjsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgaWYgKHRleHRbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjaGFyW10gb2J0YWluKGludCBsZW4pIHsKICAgICAgICAgY2hhcltdIGJ1ZjsKIApAQCAtMTUyOSw3ICsxMzg1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfTU9ERV9DSEFSQUNURVJTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfQ0hBUkFDVEVSUzsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENhcGl0YWxpemF0aW9uIG1vZGUgZm9yIHtAbGluayAjZ2V0Q2Fwc01vZGV9OiBjYXBpdGFsaXplIHRoZSBmaXJzdAogICAgICAqIGNoYXJhY3RlciBvZiBhbGwgd29yZHMuICBUaGlzIHZhbHVlIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcwpAQCAtMTUzNyw3ICsxMzkzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfTU9ERV9XT1JEUwogICAgICAgICAgICAgPSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX1dPUkRTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGVhY2ggc2VudGVuY2UuICBUaGlzIHZhbHVlIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcwpAQCAtMTU0NSwxMyArMTQwMSwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1NFTlRFTkNFUwogICAgICAgICAgICAgPSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX1NFTlRFTkNFUzsKLSAgICAKKwogICAgIC8qKgogICAgICAqIERldGVybWluZSB3aGF0IGNhcHMgbW9kZSBzaG91bGQgYmUgaW4gZWZmZWN0IGF0IHRoZSBjdXJyZW50IG9mZnNldCBpbgogICAgICAqIHRoZSB0ZXh0LiAgT25seSB0aGUgbW9kZSBiaXRzIHNldCBpbiA8dmFyPnJlcU1vZGVzPC92YXI+IHdpbGwgYmUKICAgICAgKiBjaGVja2VkLiAgTm90ZSB0aGF0IHRoZSBjYXBzIG1vZGUgZmxhZ3MgaGVyZSBhcmUgZXhwbGljaXRseSBkZWZpbmVkCiAgICAgICogdG8gbWF0Y2ggdGhvc2UgaW4ge0BsaW5rIElucHV0VHlwZX0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY3MgVGhlIHRleHQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgY2FwcyBtb2Rlcy4KICAgICAgKiBAcGFyYW0gb2ZmIExvY2F0aW9uIGluIHRoZSB0ZXh0IGF0IHdoaWNoIHRvIGNoZWNrLgogICAgICAqIEBwYXJhbSByZXFNb2RlcyBUaGUgbW9kZXMgdG8gYmUgY2hlY2tlZDogbWF5IGJlIGFueSBjb21iaW5hdGlvbiBvZgpAQCAtMTY1MSw3ICsxNTA3LDcgQEAKIAogICAgICAgICByZXR1cm4gbW9kZTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHNUZW1wID0gbnVsbDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCmluZGV4IDQyYWQxMGUuLmMzMGRiMjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQpAQCAtMTgsMTMgKzE4LDEyIEBACiAKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5Ob0NvcHlTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiAKIHB1YmxpYyBjbGFzcyBUb3VjaCB7CiAgICAgcHJpdmF0ZSBUb3VjaCgpIHsgfQpAQCAtNDUsNiArNDQsNyBAQAogICAgICAgICBpbnQgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgICBpbnQgcmlnaHQgPSAwOwogICAgICAgICBBbGlnbm1lbnQgYSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gbHRyID0gdHJ1ZTsKIAogICAgICAgICBmb3IgKGludCBpID0gdG9wOyBpIDw9IGJvdHRvbTsgaSsrKSB7CiAgICAgICAgICAgICBsZWZ0ID0gKGludCkgTWF0aC5taW4obGVmdCwgbGF5b3V0LmdldExpbmVMZWZ0KGkpKTsKQEAgLTUyLDYgKzUyLDcgQEAKIAogICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGEgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoQWxpZ25tZW50KGkpOworICAgICAgICAgICAgICAgIGx0ciA9IGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSkgPiAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTU5LDEwICs2MCwxMiBAQAogICAgICAgICBpbnQgd2lkdGggPSB3aWRnZXQuZ2V0V2lkdGgoKTsKICAgICAgICAgaW50IGRpZmYgPSAwOwogCisgICAgICAgIC8vIGFsaWduX29wcG9zaXRlIGRvZXMgTk9UIG1lYW4gYWxpZ25fcmlnaHQsIHdlIG5lZWQgdGhlIHBhcmFncmFwaAorICAgICAgICAvLyBkaXJlY3Rpb24gdG8gcmVzb2x2ZSBpdCB0byBsZWZ0IG9yIHJpZ2h0CiAgICAgICAgIGlmIChyaWdodCAtIGxlZnQgPCB3aWR0aCAtIHBhZGRpbmcpIHsKICAgICAgICAgICAgIGlmIChhID09IEFsaWdubWVudC5BTElHTl9DRU5URVIpIHsKICAgICAgICAgICAgICAgICBkaWZmID0gKHdpZHRoIC0gcGFkZGluZyAtIChyaWdodCAtIGxlZnQpKSAvIDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGx0ciA9PSAoYSA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9IHdpZHRoIC0gcGFkZGluZyAtIChyaWdodCAtIGxlZnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQppbmRleCA5ZDkxYWNhLi5hNzYzYTY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKQEAgLTE3LDM2ICsxNyw1OCBAQAogcGFja2FnZSBhbmRyb2lkLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCisgKiA8cD4KICAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byBjaGFyYWN0ZXIgc2V0cy4gVGhpcwogICogY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdpc2hlcyB0byBiZSB2ZW5kb3ItYXdhcmUKLSAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBlbmNvZGluZyBuYW1lcy4KLSAqIAotICogPHA+QXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSB2ZW5kb3IgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoaXMKLSAqIGNsYXNzIGlzIERvY29tbyAoaWRlbnRpZmllZCBjYXNlLWluc2Vuc2l0aXZlbHkgYXMge0Bjb2RlICJkb2NvbW8ifSkuPC9wPgotICogCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBpcyBoaWRkZW4gaW4gQ3VwY2FrZSwgd2l0aCBhIHBsYW4gdG8KLSAqIHVuLWhpZGUgaW4gRG9udXQuIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVwbG95bWVudCB0byB1c2UKLSAqIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBDdXBjYWtlLCBidXQgdGhlIEFQSSBoYWQgdG8gYmUgaW50cm9kdWNlZAotICogYWZ0ZXIgdGhlIHB1YmxpYyBBUEkgZnJlZXplIGZvciB0aGF0IHJlbGVhc2UuIFRoZSB1cHNob3QgaXMgdGhhdAotICogb25seSBzeXN0ZW0gYXBwbGljYXRpb25zIGNhbiBzYWZlbHkgdXNlIHRoaXMgY2xhc3MgdW50aWwgRG9udXQgaXMKLSAqIGF2YWlsYWJsZS4KLSAqIAorICogaW4gaXRzIGludGVycHJldGF0aW9uIG9mIEphcGFuZXNlIGNoYXJzZXQgbmFtZXMgKHVzZWQgaW4gRG9Db01vLAorICogS0RESSwgYW5kIFNvZnRCYW5rKS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBEZXZlbG9wZXJzIHdpbGwgbmVlZCB0byBhZGQgYW4gYXBwcm9wcmlhdGUgbWFwcGluZyBmb3IKKyAqIGVhY2ggdmVuZG9yLXNwZWNpZmljIGNoYXJzZXQuIFlvdSBtYXkgbmVlZCB0byBtb2RpZnkgdGhlIEMgbGlicmFyaWVzCisgKiBsaWtlIGljdTRjIGluIG9yZGVyIHRvIGxldCBBbmRyb2lkIHN1cHBvcnQgYW4gYWRkaXRpb25hbCBjaGFyc2V0LgorICogPC9wPgorICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyc2V0VXRpbHMgewogICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHZlbmRvciAiRG9jb21vIi4gPGI+Tm90ZTo8L2I+IFRoaXMgaXNuJ3QgYSBwdWJsaWMKKyAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvQ29NbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCiAgICAgICogY29uc3RhbnQsIGluIG9yZGVyIHRvIGtlZXAgdGhpcyBjbGFzcyBmcm9tIGJlY29taW5nIGEgZGUgZmFjdG8KICAgICAgKiByZWZlcmVuY2UgbGlzdCBvZiB2ZW5kb3IgbmFtZXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9ET0NPTU8gPSAiZG9jb21vIjsKLSAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIktEREkiLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfS0RESSA9ICJrZGRpIjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIlNvZnRCYW5rIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX1NPRlRCQU5LID0gInNvZnRiYW5rIjsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgb25lLXRvLW9uZSBtYXBwaW5nIGZyb20gYSB2ZW5kb3IgbmFtZSB0byBhIGNoYXJzZXQgc3BlY2lmaWMgdG8gdGhlIHZlbmRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNWZW5kb3JTaGlmdEppc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gVGhlc2UgdmFyaWFudHMgb2YgU2hpZnRfSklTIGNvbWUgZnJvbSBpY3UncyBtYXBwaW5nIGRhdGEgKGNvbnZydHJzLnR4dCkKKyAgICAgICAgc1ZlbmRvclNoaWZ0SmlzTWFwLnB1dChWRU5ET1JfRE9DT01PLCAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0tEREksICJrZGRpLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX1NPRlRCQU5LLCAic29mdGJhbmstc2hpZnRfamlzLTIwMDciKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVuaW5zdGFudGlhYmxlLgogICAgICAqLwpAQCAtNTgsMjAgKzgwLDIyIEBACiAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQKICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0IG5hbWUgYW5kCiAgICAgICogdmVuZG9yLiBJZiB0aGVyZSBpcyBubyB2ZW5kb3Itc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbmFtZS92ZW5kb3IgcGFpciwgdGhpcyByZXR1cm5zIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0Ci0gICAgICogbmFtZS4gVGhlIHZlbmRvciBuYW1lIGlzIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgotICAgICAqIAorICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lLgorICAgICAqCiAgICAgICogQHBhcmFtIGNoYXJzZXROYW1lIHRoZSBiYXNlIGNoYXJhY3RlciBzZXQgbmFtZQotICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvcgorICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvci4gQWxsIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGxvd2VyLWNhc2VkLgogICAgICAqIEByZXR1cm4gdGhlIHNwZWNpYWxpemVkIGNoYXJhY3RlciBzZXQgbmFtZSwgb3Ige0Bjb2RlIGNoYXJzZXROYW1lfSBpZgogICAgICAqIHRoZXJlIGlzIG5vIHNwZWNpYWxpemVkIG5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lRm9yVmVuZG9yKFN0cmluZyBjaGFyc2V0TmFtZSwgU3RyaW5nIHZlbmRvcikgewotICAgICAgICAvLyBUT0RPOiBFdmVudHVhbGx5LCB0aGlzIG1heSB3YW50IHRvIGJlIHRhYmxlLWRyaXZlbi4KLQotICAgICAgICBpZiAodmVuZG9yLmVxdWFsc0lnbm9yZUNhc2UoVkVORE9SX0RPQ09NTykKLSAgICAgICAgICAgICAgICAmJiBpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuICJkb2NvbW8tc2hpZnRfamlzLTIwMDciOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXROYW1lKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkodmVuZG9yKSkgeworICAgICAgICAgICAgLy8gWW91IGNhbiBhZGQgeW91ciBvd24gbWFwcGluZyBoZXJlLgorICAgICAgICAgICAgaWYgKGlzU2hpZnRKaXMoY2hhcnNldE5hbWUpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlbmRvclNoaWZ0SmlzID0gc1ZlbmRvclNoaWZ0SmlzTWFwLmdldCh2ZW5kb3IpOworICAgICAgICAgICAgICAgIGlmICh2ZW5kb3JTaGlmdEppcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZW5kb3JTaGlmdEppczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY2hhcnNldE5hbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKaW5kZXggNWNiZmQyOS4uM2JjZDI2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogcHVibGljIGNsYXNzIFBhdHRlcm5zIHsKICAgICAvKioKICAgICAgKiAgUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFsbCBJQU5BIHRvcC1sZXZlbCBkb21haW5zLgotICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDIvMDUuICBMaXN0IHRha2VuIGZyb206CisgICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wNS8wNi4gIExpc3QgdGFrZW4gZnJvbToKICAgICAgKiAgaHR0cDovL2RhdGEuaWFuYS5vcmcvVExEL3RsZHMtYWxwaGEtYnktZG9tYWluLnR4dAogICAgICAqICBUaGlzIHBhdHRlcm4gaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9iYXNlL2NvbW1vbi90b29scy9tYWtlLWlhbmEtdGxkLXBhdHRlcm4ucHkKICAgICAgKi8KQEAgLTUzLDggKzUzLDggQEAKICAgICAgICAgKyAifHVbYWdrc3l6XSIKICAgICAgICAgKyAifHZbYWNlZ2ludV0iCiAgICAgICAgICsgInx3W2ZzXSIKLSAgICAgICAgKyAifCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpIgotICAgICAgICArICJ8eVtldHVdIgorICAgICAgICArICJ8KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKSIKKyAgICAgICAgKyAifHlbZXRdIgogICAgICAgICArICJ8elthbXddKSI7CiAKICAgICAvKioKQEAgLTY1LDcgKzY1LDcgQEAKIAogICAgIC8qKgogICAgICAqICBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWxsIElBTkEgdG9wLWxldmVsIGRvbWFpbnMgZm9yIFdFQl9VUkwuCi0gICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wMi8wNS4gIExpc3QgdGFrZW4gZnJvbToKKyAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzA1LzA2LiAgTGlzdCB0YWtlbiBmcm9tOgogICAgICAqICBodHRwOi8vZGF0YS5pYW5hLm9yZy9UTEQvdGxkcy1hbHBoYS1ieS1kb21haW4udHh0CiAgICAgICogIFRoaXMgcGF0dGVybiBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL2Jhc2UvY29tbW9uL3Rvb2xzL21ha2UtaWFuYS10bGQtcGF0dGVybi5weQogICAgICAqLwpAQCAtOTQsOCArOTQsOCBAQAogICAgICAgICArICJ8dVthZ2tzeXpdIgogICAgICAgICArICJ8dlthY2VnaW51XSIKICAgICAgICAgKyAifHdbZnNdIgotICAgICAgICArICJ8KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKSIKLSAgICAgICAgKyAifHlbZXR1XSIKKyAgICAgICAgKyAifCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKSIKKyAgICAgICAgKyAifHlbZXRdIgogICAgICAgICArICJ8elthbXddKSkiOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbkJhclZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQWN0aW9uQmFyVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDJjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW07CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXIuQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyVmlldyBleHRlbmRzIFZpZXdHcm91cCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25CYXJWaWV3IjsKKyAgICAKKyAgICAvLyBUT0RPOiBUaGlzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCB0aGVtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0hFSUdIVF9ESVAgPSA1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9QQURESU5HX0RJUCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfU1BBQ0lOR19ESVAgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCA9IDEyOworICAgIAorICAgIC8qKgorICAgICAqIERpc3BsYXkgb3B0aW9ucyBhcHBsaWVkIGJ5IGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0RFRkFVTFQgPSAwOworCisgICAgLyoqCisgICAgICogRGlzcGxheSBvcHRpb25zIHRoYXQgcmVxdWlyZSByZS1sYXlvdXQgYXMgb3Bwb3NlZCB0byBhIHNpbXBsZSBpbnZhbGlkYXRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfUkVMQVlPVVRfTUFTSyA9CisgICAgICAgICAgICBBY3Rpb25CYXIuRElTUExBWV9ISURFX0hPTUUgfAorICAgICAgICAgICAgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR087CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRlbnRIZWlnaHQ7CisKKyAgICBwcml2YXRlIGludCBtTmF2aWdhdGlvbk1vZGU7CisgICAgcHJpdmF0ZSBpbnQgbURpc3BsYXlPcHRpb25zOworICAgIHByaXZhdGUgaW50IG1TcGFjaW5nOworICAgIHByaXZhdGUgaW50IG1BY3Rpb25TcGFjaW5nOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1Mb2dvOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUljb25WaWV3OworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1Mb2dvVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbU5hdlZpZXc7CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93TWVudTsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU9wdGlvbnNNZW51OworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uTWVudUl0ZW0gbUxvZ29OYXZJdGVtOworICAgIAorICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8QWN0aW9uTWVudT4gbUNvbnRleHRNZW51czsKKyAgICAKKyAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIHByaXZhdGUgZmluYWwgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQocG9zaXRpb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldyBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtSG9tZUNsaWNrTGlzdGVuZXIgPSBudWxsOworCisgICAgcHVibGljIEFjdGlvbkJhclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gKGludCkgKENPTlRFTlRfSEVJR0hUX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuQWN0aW9uQmFyKTsKKworICAgICAgICBmaW5hbCBpbnQgY29sb3JGaWx0ZXIgPSBhLmdldENvbG9yKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9jb2xvckZpbHRlciwgMCk7CisKKyAgICAgICAgaWYgKGNvbG9yRmlsdGVyICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGQgPSBnZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICBkLnNldERpdGhlcih0cnVlKTsKKyAgICAgICAgICAgIGQuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihjb2xvckZpbHRlciwgUG9ydGVyRHVmZi5Nb2RlLk9WRVJMQVkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBpbmZvID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKTsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IGEuZ2V0SW50KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9uYXZpZ2F0aW9uTW9kZSwgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1UaXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlKTsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2Rpc3BsYXlPcHRpb25zLCBESVNQTEFZX0RFRkFVTFQpOworICAgICAgICAKKyAgICAgICAgbUxvZ28gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9sb2dvKTsKKyAgICAgICAgaWYgKG1Mb2dvID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvID0gaW5mby5sb2FkTG9nbyhwbSk7CisgICAgICAgIH0KKyAgICAgICAgbUljb24gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9pY29uKTsKKyAgICAgICAgaWYgKG1JY29uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9iYWNrZ3JvdW5kKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2SWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2N1c3RvbU5hdmlnYXRpb25MYXlvdXQsIDApOworICAgICAgICBpZiAoY3VzdG9tTmF2SWQgIT0gMCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcgPSAoVmlldykgaW5mbGF0ZXIuaW5mbGF0ZShjdXN0b21OYXZJZCwgbnVsbCk7CisgICAgICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTTsKKyAgICAgICAgfQorCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIFRPRE86IFNldCB0aGlzIGluIHRoZSB0aGVtZQorICAgICAgICBpbnQgcGFkZGluZyA9IChpbnQpIChDT05URU5UX1BBRERJTkdfRElQICogbWV0cmljcy5kZW5zaXR5ICsgMC41Zik7CisgICAgICAgIHNldFBhZGRpbmcocGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZyk7CisKKyAgICAgICAgbVNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IChpbnQpIChDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICAKKyAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgfHwgbUljb24gIT0gbnVsbCB8fCBtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ29OYXZJdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5pZC5ob21lLCAwLCAwLCBtVGl0bGUpOworICAgICAgICAgICAgbUhvbWVDbGlja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkub25PcHRpb25zSXRlbVNlbGVjdGVkKG1Mb2dvTmF2SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtQ29udGV4dE1lbnVzID0gbmV3IFNwYXJzZUFycmF5PEFjdGlvbk1lbnU+KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51QnVpbGRlciBidWlsZGVyID0gKE1lbnVCdWlsZGVyKSBtZW51OworICAgICAgICBtT3B0aW9uc01lbnUgPSBidWlsZGVyOworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobU1lbnVWaWV3KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBY3Rpb25NZW51VmlldyBtZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgYnVpbGRlci5nZXRNZW51VmlldygKKyAgICAgICAgICAgICAgICBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIG51bGwpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IG1lbnVWaWV3LmdldEl0ZW1NYXJnaW4oKTsKKyAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgbWVudVZpZXcuc2V0TGF5b3V0UGFyYW1zKGxheW91dFBhcmFtcyk7CisgICAgICAgIGFkZFZpZXcobWVudVZpZXcpOworICAgICAgICBtTWVudVZpZXcgPSBtZW51VmlldzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT00pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvZ29OYXZJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvTmF2SXRlbS5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICBpZiAobVN1YnRpdGxlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIGZpbmFsIGludCBmbGFnc0NoYW5nZWQgPSBvcHRpb25zIF4gbURpc3BsYXlPcHRpb25zOworICAgICAgICBtRGlzcGxheU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICBpZiAoKGZsYWdzQ2hhbmdlZCAmIERJU1BMQVlfUkVMQVlPVVRfTUFTSykgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IHZpcyA9IChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FKSAhPSAwID8gR09ORSA6IFZJU0lCTEU7CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0VmlzaWJpbGl0eSh2aXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmF2aWdhdGlvbk1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgZmluYWwgaW50IG9sZE1vZGUgPSBtTmF2aWdhdGlvbk1vZGU7CisgICAgICAgIGlmIChtb2RlICE9IG9sZE1vZGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob2xkTW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbmV3IFNwaW5uZXIobUNvbnRleHQsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuZHJvcERvd25TcGlubmVyU3R5bGUpOworICAgICAgICAgICAgICAgIG1TcGlubmVyLnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobU5hdkl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bkFkYXB0ZXIoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBtU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1DdXN0b21OYXZWaWV3OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gbU5hdmlnYXRpb25Nb2RlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXlPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbURpc3BsYXlPcHRpb25zOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG1DYWxsYmFjazsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gc2V0IEFjdGlvbkJhciBjb250ZXh0IG1vZGUgd2l0aCBubyBjYWxsYmFjayIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBBY3Rpb25NZW51IG1lbnUgPSBtQ29udGV4dE1lbnVzLmdldChtb2RlKTsKKyAgICAgICAgaWYgKG1lbnUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbmV3IG1vZGUKKyAgICAgICAgICAgIG1lbnUgPSBuZXcgQWN0aW9uTWVudShnZXRDb250ZXh0KCkpOworCisgICAgICAgICAgICBpZiAoIWNhbGxiYWNrLm9uQ3JlYXRlQ29udGV4dE1vZGUobW9kZSwgbWVudSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbkJhciBjYWxsYmFjayBkb2VzIG5vdCBrbm93IGhvdyB0byBjcmVhdGUgY29udGV4dCBtb2RlICIgKyBtb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db250ZXh0TWVudXMucHV0KG1vZGUsIG1lbnUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2FsbGJhY2sub25QcmVwYXJlQ29udGV4dE1vZGUobW9kZSwgbWVudSkpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gU2V0IG1vZGUsIGFuaW1hdGUsIGV0Yy4KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBleGl0Q29udGV4dE1vZGUoKSB7CisgICAgICAgIC8vIFRPRE8gVHVybiBvZmYgY29udGV4dCBtb2RlOyBnbyBiYWNrIHRvIG5vcm1hbC4KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKworICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRBZGp1c3RWaWV3Qm91bmRzKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRJbWFnZURyYXdhYmxlKG1Mb2dvKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtSG9tZUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUxvZ29WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtSWNvbik7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1JY29uVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIGRyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVGFiIG5hdmlnYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbml0VGl0bGUoKSB7CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpOworICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmFjdGlvbl9iYXJfdGl0bGVfaXRlbSwgbnVsbCk7CisgICAgICAgIG1UaXRsZVZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CisgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkVmlldyhtVGl0bGVWaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF93aWR0aD1cIm1hdGNoX3BhcmVudFwiIChvciBmaWxsX3BhcmVudCkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZW50V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICAKKyAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY29udGVudFdpZHRoIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbUNvbnRlbnRIZWlnaHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFNwZWNIZWlnaHQgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKworICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwgJiYgbUxvZ29WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUxvZ29WaWV3LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1JY29uVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtTWVudVZpZXcsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIDApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobVRpdGxlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVWaWV3LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TcGlubmVyLm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ2hpbGRWaWV3KFZpZXcgY2hpbGQsIGludCBhdmFpbGFibGVXaWR0aCwgaW50IGNoaWxkU3BlY0hlaWdodCwgaW50IHNwYWNpbmcpIHsKKyAgICAgICAgY2hpbGQubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAorICAgICAgICAgICAgICAgIGNoaWxkU3BlY0hlaWdodCk7CisKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBzcGFjaW5nOworCisgICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCB4ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisKKyAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsICYmIG1Mb2dvVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1Mb2dvVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICBpZiAobUljb25WaWV3ICE9IG51bGwgJiYgbUljb25WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUljb25WaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobVRpdGxlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZVZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtU3Bpbm5lciwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUN1c3RvbU5hdlZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWZkM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBDYW52YXMgb24gdG9wIG9mIE9wZW5HTCBFUyAyLjAuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24ifSkKK2NsYXNzIEdMRVMyMENhbnZhcyBleHRlbmRzIENhbnZhcyB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBwcml2YXRlIGZpbmFsIEdMIG1HbDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU9wYXF1ZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUmVuZGVyZXI7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAKKyAgICBHTEVTMjBDYW52YXMoR0wgZ2wsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgbUdsID0gZ2w7CisgICAgICAgIG1PcGFxdWUgPSAhdHJhbnNsdWNlbnQ7CisKKyAgICAgICAgbVJlbmRlcmVyID0gbkNyZWF0ZVJlbmRlcmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5DcmVhdGVSZW5kZXJlcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBuRGVzdHJveVJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRGVzdHJveVJlbmRlcmVyKGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDYW52YXMgbWFuYWdlbWVudAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdMIGdldEdMKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCaXRtYXAoQml0bWFwIGJpdG1hcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1PcGFxdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2V0dXAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICBuU2V0Vmlld3BvcnQobVJlbmRlcmVyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0Vmlld3BvcnQoaW50IHJlbmRlcmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIG5QcmVwYXJlKG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblByZXBhcmUoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENsaXBwaW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUGF0aChQYXRoIHBhdGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFBhdGgoUGF0aCBwYXRoLCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0IHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIGNsaXBSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsgICAgICAgIAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIGNsaXBSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlZ2lvbihSZWdpb24gcmVnaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbiwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldENsaXBCb3VuZHMoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRDbGlwQm91bmRzKG1SZW5kZXJlciwgYm91bmRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5HZXRDbGlwQm91bmRzKGludCByZW5kZXJlciwgUmVjdCBib3VuZHMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBuUXVpY2tSZWplY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHR5cGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuUXVpY2tSZWplY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgZWRnZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBxdWlja1JlamVjdChQYXRoIHBhdGgsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUmVjdEYgcmVjdCwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gcXVpY2tSZWplY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIHR5cGUpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRyYW5zZm9ybWF0aW9ucworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBuVHJhbnNsYXRlKG1SZW5kZXJlciwgZHgsIGR5KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuVHJhbnNsYXRlKGludCByZW5kZXJlciwgZmxvYXQgZHgsIGZsb2F0IGR5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNrZXcoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKSB7CisgICAgICAgIG5Sb3RhdGUobVJlbmRlcmVyLCBkZWdyZWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUm90YXRlKGludCByZW5kZXJlciwgZmxvYXQgZGVncmVlcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICAgICAgblNjYWxlKG1SZW5kZXJlciwgc3gsIHN5KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2NhbGUoaW50IHJlbmRlcmVyLCBmbG9hdCBzeCwgZmxvYXQgc3kpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWF0cml4KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgblNldE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5HZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuR2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25jYXQoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuQ29uY2F0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkNvbmNhdE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworICAgIAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFN0YXRlIG1hbmFnZW1lbnQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlKG1SZW5kZXJlciwgMCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZShpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIHJldHVybiBuU2F2ZShtUmVuZGVyZXIsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlKGludCByZW5kZXJlciwgaW50IGZsYWdzKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllcihSZWN0RiBib3VuZHMsIFBhaW50IHBhaW50LCBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIHJldHVybiBzYXZlTGF5ZXIoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSwgcGFpbnQsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBQYWludCBwYWludCwKKyAgICAgICAgICAgIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIHJldHVybiBuU2F2ZUxheWVyKG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBuYXRpdmVQYWludCwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmVMYXllcihpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBwYWludCwgaW50IHNhdmVGbGFncyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllckFscGhhKFJlY3RGIGJvdW5kcywgaW50IGFscGhhLCBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIHJldHVybiBzYXZlTGF5ZXJBbHBoYShib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tLAorICAgICAgICAgICAgICAgIGFscGhhLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgYWxwaGEsCisgICAgICAgICAgICBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIHJldHVybiBuU2F2ZUxheWVyQWxwaGEobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGFscGhhLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZUxheWVyQWxwaGEoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgZmxvYXQgYm90dG9tLCBpbnQgYWxwaGEsIGludCBzYXZlRmxhZ3MpOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7CisgICAgICAgIG5SZXN0b3JlKG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlc3RvcmUoaW50IHJlbmRlcmVyKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpIHsKKyAgICAgICAgblJlc3RvcmVUb0NvdW50KG1SZW5kZXJlciwgc2F2ZUNvdW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZXN0b3JlVG9Db3VudChpbnQgcmVuZGVyZXIsIGludCBzYXZlQ291bnQpOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0U2F2ZUNvdW50KCkgeworICAgICAgICByZXR1cm4gbkdldFNhdmVDb3VudChtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbkdldFNhdmVDb3VudChpbnQgcmVuZGVyZXIpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRmlsdGVyaW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREcmF3RmlsdGVyKERyYXdGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIERyYXdpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdBcmMoUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwgYm9vbGVhbiB1c2VDZW50ZXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QVJHQihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoKGEgJiAweEZGKSA8PCAyNCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBNYXRyaXggbWF0cml4LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0IGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKGludFtdIGNvbG9ycywgaW50IG9mZnNldCwgaW50IHN0cmlkZSwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKGludFtdIGNvbG9ycywgaW50IG9mZnNldCwgaW50IHN0cmlkZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGhhc0FscGhhLCBQYWludCBwYWludCkgeworCisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXBNZXNoKEJpdG1hcCBiaXRtYXAsIGludCBtZXNoV2lkdGgsIGludCBtZXNoSGVpZ2h0LCBmbG9hdFtdIHZlcnRzLAorICAgICAgICAgICAgaW50IHZlcnRPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBQYWludCBwYWludCkgeworCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdDaXJjbGUoZmxvYXQgY3gsIGZsb2F0IGN5LCBmbG9hdCByYWRpdXMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IpIHsKKyAgICAgICAgZHJhd0NvbG9yKGNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX09WRVIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgIG5EcmF3Q29sb3IobVJlbmRlcmVyLCBjb2xvciwgbW9kZS5uYXRpdmVJbnQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Q29sb3IoaW50IHJlbmRlcmVyLCBpbnQgY29sb3IsIGludCBtb2RlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lKGZsb2F0IHN0YXJ0WCwgZmxvYXQgc3RhcnRZLCBmbG9hdCBzdG9wWCwgZmxvYXQgc3RvcFksIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lcyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdPdmFsKFJlY3RGIG92YWwsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYWludChQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0aChQYXRoIHBhdGgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQaWN0dXJlKFBpY3R1cmUgcGljdHVyZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUsIFJlY3QgZHN0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQaWN0dXJlKFBpY3R1cmUgcGljdHVyZSwgUmVjdEYgZHN0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb2ludChmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb2ludHMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdFtdIHBvcywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBQYWludCBwYWludCkgeworICAgICAgICBuRHJhd1JlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1JlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoUmVjdCByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3RGIHIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdSZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JHQihpbnQgciwgaW50IGcsIGludCBiKSB7CisgICAgICAgIGRyYXdDb2xvcigweEZGMDAwMDAwIHwgKHIgJiAweEZGKSA8PCAxNiB8IChnICYgMHhGRikgPDwgOCB8IChiICYgMHhGRikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSb3VuZFJlY3QoUmVjdEYgcmVjdCwgZmxvYXQgcngsIGZsb2F0IHJ5LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFBhdGggcGF0aCwgZmxvYXQgaE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRPblBhdGgoU3RyaW5nIHRleHQsIFBhdGggcGF0aCwgZmxvYXQgaE9mZnNldCwgZmxvYXQgdk9mZnNldCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGRpciwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGRpciwgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VmVydGljZXMoVmVydGV4TW9kZSBtb2RlLCBpbnQgdmVydGV4Q291bnQsIGZsb2F0W10gdmVydHMsIGludCB2ZXJ0T2Zmc2V0LAorICAgICAgICAgICAgZmxvYXRbXSB0ZXhzLCBpbnQgdGV4T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgc2hvcnRbXSBpbmRpY2VzLAorICAgICAgICAgICAgaW50IGluZGV4T2Zmc2V0LCBpbnQgaW5kZXhDb3VudCwgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmUzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDExOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2U7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKKworaW1wb3J0IHN0YXRpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwLkdMX0NPTE9SX0JVRkZFUl9CSVQ7CitpbXBvcnQgc3RhdGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAuR0xfU0NJU1NPUl9URVNUOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgcmVuZGVyaW5nIGEgVmlld1Jvb3QgdXNpbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICogCisgKiBAaGlkZQorICovCithYnN0cmFjdCBjbGFzcyBIYXJkd2FyZVJlbmRlcmVyIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1ZXN0ZWQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkhhcmR3YXJlUmVuZGVyZXIiOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGhhcmR3YXJlIHJlbmRlcmluZyBjb250ZXh0LgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGhvbGRlciBUaGUgaG9sZGVyIGZvciB0aGUgc3VyZmFjZSB0byBoYXJkd2FyZSBhY2NlbGVyYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBib29sZWFuIGluaXRpYWxpemUoU3VyZmFjZUhvbGRlciBob2xkZXIpOworCisgICAgLyoqCisgICAgICogU2V0dXAgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciBkcmF3aW5nLiBUaGlzIGlzIGNhbGxlZCBmb3IgZXZlcnkKKyAgICAgKiBmcmFtZSB0byBkcmF3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gVGhlIEF0dGFjaEluZm8gdXNlZCB0byByZW5kZXIgdGhlIFZpZXdSb290LiAKKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIHNldHVwKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8pOworCisgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGRyYXcuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gQXR0YWNoSW5mbyB0aWVkIHRvIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKiBAcGFyYW0gdHJhbnNsYXRvciBUcmFuc2xhdG9yIHVzZWQgdG8gZHJhdyBhcHBsaWNhdGlvbnMgaW4gY29tcGF0aWJpbGl0eSBtb2RlLgorICAgICAqIEBwYXJhbSB5b2ZmIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgZm9yIHRoZSBkcmF3aW5nLgorICAgICAqIEBwYXJhbSBzY2FsaW5nUmVxdWlyZWQgV2hldGhlciBkcmF3aW5nIHNob3VsZCBiZSBzY2FsZWQuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBkcmF3KFZpZXcgdmlldywgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mby5UcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCB5b2ZmLCBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3VyZmFjZSBhbmQgc2V0dXAgdGhlCisgICAgICogcmVuZGVyZXIgZm9yIGRyYXdpbmcsIGlmIG5lZWRlZC4gVGhpcyBpcyBpbnZva2VkIHdoZW4gdGhlIFZpZXdSb290IGhhcworICAgICAqIHBvdGVudGlhbGx5IGxvc3QgdGhlIGhhcmR3YXJlIHJlbmRlcmVyLiBUaGUgaGFyZHdhcmUgcmVuZGVyZXIgc2hvdWxkIGJlCisgICAgICogcmVpbml0aWFsaXplZCBhbmQgc2V0dXAgd2hlbiB0aGUgcmVuZGVyIHtAbGluayAjaXNSZXF1ZXN0ZWQoKX0gYW5kCisgICAgICoge0BsaW5rICNpc0VuYWJsZWQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIFRoZSAKKyAgICAgKiBAcGFyYW0gaG9sZGVyCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKKyAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisKKyAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplKGhvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXAod2lkdGgsIGhlaWdodCwgYXR0YWNoSW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgT3BlbkdMIHRvIHVzZSAoMSBmb3IgT3BlbkdMIDEsIDExIGZvciBPcGVuR0wgMS4xLCBldGMuKQorICAgICAqIEBwYXJhbSB0cmFuc2x1Y2VudCBUcnVlIGlmIHRoZSBzdXJmYWNlIGlzIHRyYW5zbHVjZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgaGFyZHdhcmUgcmVuZGVyZXIgYmFja2VkIGJ5IE9wZW5HTC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSGFyZHdhcmVSZW5kZXJlciBjcmVhdGVHbFJlbmRlcmVyKGludCBnbFZlcnNpb24sIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgc3dpdGNoIChnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdsMTBSZW5kZXJlcih0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHbDIwUmVuZGVyZXIodHJhbnNsdWNlbnQpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gR0wgdmVyc2lvbjogIiArIGdsVmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgaW4gdXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSBpZiB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgaXMgaW4gdXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSByZXF1ZXN0IGJ1dCBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBlbmFibGVkIHlldC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgcmVxdWVzdGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc1JlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSByZXF1ZXN0IGJ1dCBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBlbmFibGVkIHlldC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgdG8gcmVxdWVzdCBoYXJkd2FyZSBhY2NlbGVyYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJlcXVlc3RlZChib29sZWFuIHJlcXVlc3RlZCkgeworICAgICAgICBtUmVxdWVzdGVkID0gcmVxdWVzdGVkOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24ifSkKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgR2xSZW5kZXJlciBleHRlbmRzIEhhcmR3YXJlUmVuZGVyZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7CisKKyAgICAgICAgRUdMMTAgbUVnbDsKKyAgICAgICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKKyAgICAgICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKKyAgICAgICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKKyAgICAgICAgRUdMQ29uZmlnIG1FZ2xDb25maWc7CisKKyAgICAgICAgR0wgbUdsOworICAgICAgICBDYW52YXMgbUNhbnZhczsKKworICAgICAgICBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVHJhbnNsdWNlbnQ7CisKKyAgICAgICAgR2xSZW5kZXJlcihpbnQgZ2xWZXJzaW9uLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgbVRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGZvciBPcGVuR0wgZXJyb3JzLiBJZiBhbiBlcnJvciBoYXMgb2NjdXJlZCwge0BsaW5rICNkZXN0cm95KCl9CisgICAgICAgICAqIGlzIGludm9rZWQgYW5kIHRoZSByZXF1ZXN0ZWQgZmxhZyBpcyB0dXJuZWQgb2ZmLiBUaGUgZXJyb3IgY29kZSBpcworICAgICAgICAgKiBhbHNvIGxvZ2dlZCBhcyBhIHdhcm5pbmcuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrRXJyb3JzKCkgeworICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gbUVnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZCByZXZlcnQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIHJlbmRlcmluZy4KKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTEuRUdMX0NPTlRFWFRfTE9TVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgdHJ5IGFnYWluIGlmIGl0IHdhcyBjb250ZXh0IGxvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIk9wZW5HTCBlcnJvcjogIiArIGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGluaXRpYWxpemUoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpICYmICFpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxpemVFZ2woKTsKKyAgICAgICAgICAgICAgICBtR2wgPSBjcmVhdGVFZ2xTdXJmYWNlKGhvbGRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAobUdsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW52YXMgPSBjcmVhdGVDYW52YXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FudmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSGFyZHdhcmUgYWNjZWxlcmF0ZWQgQ2FudmFzIGNvdWxkIG5vdCBiZSBjcmVhdGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNhbnZhcyAhPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IENhbnZhcyBjcmVhdGVDYW52YXMoKTsKKworICAgICAgICB2b2lkIGluaXRpYWxpemVFZ2woKSB7CisgICAgICAgICAgICBtRWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgICAgICAgIG1FZ2xEaXNwbGF5ID0gbUVnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobUVnbERpc3BsYXkgPT0gRUdMMTAuRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsR2V0RGlzcGxheSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2UgY2FuIG5vdyBpbml0aWFsaXplIEVHTCBmb3IgdGhhdCBkaXNwbGF5CisgICAgICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIGlmICghbUVnbC5lZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCB2ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xJbml0aWFsaXplIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUVnbENvbmZpZyA9IGdldENvbmZpZ0Nob29zZXIobUdsVmVyc2lvbikuY2hvb3NlQ29uZmlnKG1FZ2wsIG1FZ2xEaXNwbGF5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogQ3JlYXRlIGFuIEVHTCBjb250ZXh0LiBXZSB3YW50IHRvIGRvIHRoaXMgYXMgcmFyZWx5IGFzIHdlIGNhbiwgYmVjYXVzZSBhbgorICAgICAgICAgICAgKiBFR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBtRWdsQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQobUVnbCwgbUVnbERpc3BsYXksIG1FZ2xDb25maWcpOworICAgICAgICB9CisKKyAgICAgICAgR0wgY3JlYXRlRWdsU3VyZmFjZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgLy8gQ2hlY2sgcHJlY29uZGl0aW9ucy4KKyAgICAgICAgICAgIGlmIChtRWdsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FZ2xEaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsRGlzcGxheSBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRWdsQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibUVnbENvbmZpZyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICBUaGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3CisgICAgICAgICAgICAgKiAgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IG51bGwgJiYgbUVnbFN1cmZhY2UgIT0gRUdMMTAuRUdMX05PX1NVUkZBQ0UpIHsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVW5iaW5kIGFuZCBkZXN0cm95IHRoZSBvbGQgRUdMIHN1cmZhY2UsIGlmCisgICAgICAgICAgICAgICAgICogdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1FZ2wuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX1NVUkZBQ0UsIEVHTDEwLkVHTF9OT19DT05URVhUKTsKKyAgICAgICAgICAgICAgICBtRWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBFR0wgc3VyZmFjZSB3ZSBjYW4gcmVuZGVyIGludG8uCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG1FZ2wuZWdsQ3JlYXRlV2luZG93U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbENvbmZpZywgaG9sZGVyLCBudWxsKTsKKworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlID09IG51bGwgfHwgbUVnbFN1cmZhY2UgPT0gRUdMMTAuRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBtRWdsLmVnbEdldEVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yID09IEVHTDEwLkVHTF9CQURfTkFUSVZFX1dJTkRPVykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZSgiRWdsSGVscGVyIiwgImNyZWF0ZVdpbmRvd1N1cmZhY2UgcmV0dXJuZWQgRUdMX0JBRF9OQVRJVkVfV0lORE9XLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCZWZvcmUgd2UgY2FuIGlzc3VlIEdMIGNvbW1hbmRzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorICAgICAgICAgICAgICogdGhlIGNvbnRleHQgaXMgY3VycmVudCBhbmQgYm91bmQgdG8gYSBzdXJmYWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW1FZ2wuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwgbUVnbENvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbE1ha2VDdXJyZW50IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbUVnbENvbnRleHQuZ2V0R0woKTsKKyAgICAgICAgfQorCisgICAgICAgIEVHTENvbnRleHQgY3JlYXRlQ29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZWdsRGlzcGxheSwgRUdMQ29uZmlnIGVnbENvbmZpZykgeworICAgICAgICAgICAgaW50W10gYXR0cmliX2xpc3QgPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCBtR2xWZXJzaW9uLCBFR0wxMC5FR0xfTk9ORSB9OworCisgICAgICAgICAgICByZXR1cm4gZWdsLmVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgZWdsQ29uZmlnLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgbUdsVmVyc2lvbiAhPSAwID8gYXR0cmliX2xpc3QgOiBudWxsKTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGluaXRpYWxpemVJZk5lZWRlZChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLAorICAgICAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplSWZOZWVkZWQod2lkdGgsIGhlaWdodCwgYXR0YWNoSW5mbywgaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkpIHJldHVybjsKKworICAgICAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7CisgICAgICAgICAgICBtRWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICBtRWdsLmVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7CisKKyAgICAgICAgICAgIG1FZ2xDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKKyAgICAgICAgICAgIG1FZ2xEaXNwbGF5ID0gbnVsbDsKKyAgICAgICAgICAgIG1FZ2wgPSBudWxsOworICAgICAgICAgICAgbUdsID0gbnVsbDsKKyAgICAgICAgICAgIG1DYW52YXMgPSBudWxsOworCisgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IGF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7CisgICAgICAgICAgICBtQ2FudmFzLnNldFZpZXdwb3J0KChpbnQpICh3aWR0aCAqIHNjYWxlICsgMC41ZiksIChpbnQpIChoZWlnaHQgKiBzY2FsZSArIDAuNWYpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjYW5EcmF3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1HbCAhPSBudWxsICYmIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmVzIHRoZSBFR0wgY29uZmlndXJhdGlvbiBmb3IgdGhpcyByZW5kZXJlci4gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpcyBSR0JYLCBubyBkZXB0aCwgbm8gc3RlbmNpbC4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIGFuZHJvaWQudmlldy5IYXJkd2FyZVJlbmRlcmVyLkdsUmVuZGVyZXIuRWdsQ29uZmlnQ2hvb3Nlcn0uCisgICAgICAgICAqIEBwYXJhbSBnbFZlcnNpb24KKyAgICAgICAgICovCisgICAgICAgIEVnbENvbmZpZ0Nob29zZXIgZ2V0Q29uZmlnQ2hvb3NlcihpbnQgZ2xWZXJzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNpemVDaG9vc2VyKGdsVmVyc2lvbiwgOCwgOCwgOCwgbVRyYW5zbHVjZW50ID8gOCA6IDAsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZHJhdyhWaWV3IHZpZXcsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLCBDb21wYXRpYmlsaXR5SW5mby5UcmFuc2xhdG9yIHRyYW5zbGF0b3IsCisgICAgICAgICAgICAgICAgaW50IHlvZmYsIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkKSB7CisKKyAgICAgICAgICAgIGlmIChjYW5EcmF3KCkpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOworCisgICAgICAgICAgICAgICAgb25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUNhbnZhczsKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlvZmYpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdG9yLnRyYW5zbGF0ZUNhbnZhcyhjYW52YXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRTY3JlZW5EZW5zaXR5KHNjYWxpbmdSZXF1aXJlZCA/IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFIDogMCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIG1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgZmluYWwgaW50W10gbUNvbmZpZ1NwZWM7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtR2xWZXJzaW9uOworCisgICAgICAgICAgICBFZ2xDb25maWdDaG9vc2VyKGludCBnbFZlcnNpb24sIGludFtdIGNvbmZpZ1NwZWMpIHsKKyAgICAgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgICAgIG1Db25maWdTcGVjID0gZmlsdGVyQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgeworICAgICAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgbnVsbCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb25maWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IG51bV9jb25maWdbMF07CisKKyAgICAgICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgY29uZmlncywgbnVtQ29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb25maWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyMyIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnID0gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWJzdHJhY3QgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyk7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50W10gZmlsdGVyQ29uZmlnU3BlYyhpbnRbXSBjb25maWdTcGVjKSB7CisgICAgICAgICAgICAgICAgaWYgKG1HbFZlcnNpb24gIT0gMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnU3BlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogV2Uga25vdyBub25lIG9mIHRoZSBzdWJjbGFzc2VzIGRlZmluZSBFR0xfUkVOREVSQUJMRV9UWVBFLgorICAgICAgICAgICAgICAgICAqIEFuZCB3ZSBrbm93IHRoZSBjb25maWdTcGVjIGlzIHdlbGwgZm9ybWVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCBsZW4gPSBjb25maWdTcGVjLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnRbXSBuZXdDb25maWdTcGVjID0gbmV3IGludFtsZW4gKyAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ1NwZWMsIDAsIG5ld0NvbmZpZ1NwZWMsIDAsIGxlbi0xKTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbi0xXSA9IEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW5dID0gNDsgLyogRUdMX09QRU5HTF9FUzJfQklUICovCisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW4rMV0gPSBFR0wxMC5FR0xfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29uZmlnU3BlYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaG9vc2UgYSBjb25maWd1cmF0aW9uIHdpdGggZXhhY3RseSB0aGUgc3BlY2lmaWVkIHIsZyxiLGEgc2l6ZXMsCisgICAgICAgICAqIGFuZCBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGRlcHRoIGFuZCBzdGVuY2lsIHNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGNsYXNzIENvbXBvbmVudFNpemVDaG9vc2VyIGV4dGVuZHMgRWdsQ29uZmlnQ2hvb3NlciB7CisgICAgICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZTsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVJlZFNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtR3JlZW5TaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUJsdWVTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUFscGhhU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1EZXB0aFNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtU3RlbmNpbFNpemU7CisKKyAgICAgICAgICAgIENvbXBvbmVudFNpemVDaG9vc2VyKGludCBnbFZlcnNpb24sIGludCByZWRTaXplLCBpbnQgZ3JlZW5TaXplLCBpbnQgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYVNpemUsIGludCBkZXB0aFNpemUsIGludCBzdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgIHN1cGVyKGdsVmVyc2lvbiwgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgcmVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCBncmVlblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCBibHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCBhbHBoYVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgZGVwdGhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgc3RlbmNpbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORSB9KTsKKyAgICAgICAgICAgICAgICBtVmFsdWUgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIG1SZWRTaXplID0gcmVkU2l6ZTsKKyAgICAgICAgICAgICAgICBtR3JlZW5TaXplID0gZ3JlZW5TaXplOworICAgICAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGJsdWVTaXplOworICAgICAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhbHBoYVNpemU7CisgICAgICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoU2l6ZTsKKyAgICAgICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsU2l6ZTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoKGQgPj0gbURlcHRoU2l6ZSkgJiYgKHMgPj0gbVN0ZW5jaWxTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgPT0gbVJlZFNpemUpICYmIChnID09IG1HcmVlblNpemUpICYmIChiID09IG1CbHVlU2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPT0gbUFscGhhU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wgRVMgMi4wLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBHbDIwUmVuZGVyZXIgZXh0ZW5kcyBHbFJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBHTEVTMjBDYW52YXMgbUdsQ2FudmFzOworCisgICAgICAgIEdsMjBSZW5kZXJlcihib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBzdXBlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQ2FudmFzIGNyZWF0ZUNhbnZhcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2xDYW52YXMgPSBuZXcgR0xFUzIwQ2FudmFzKG1HbCwgbVRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgICAgIG1HbENhbnZhcy5vblByZURyYXcoKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogSGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMIEVTIDEuMC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgICAgc3RhdGljIGNsYXNzIEdsMTBSZW5kZXJlciBleHRlbmRzIEdsUmVuZGVyZXIgeworICAgICAgICBHbDEwUmVuZGVyZXIoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgc3VwZXIoMSwgdHJhbnNsdWNlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIENhbnZhcyBjcmVhdGVDYW52YXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhbnZhcyhtR2wpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZUFiYW5kb25HbENhY2hlcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXBlci5kZXN0cm95KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgICAgICBHTDExIGdsID0gKEdMMTEpIG1HbDsKKyAgICAgICAgICAgIGdsLmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgICAgICAgICAgZ2wuZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOworICAgICAgICAgICAgZ2wuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgICAgIGdsLmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbmZvcm0gU2tpYSB0byBqdXN0IGFiYW5kb24gaXRzIHRleHR1cmUgY2FjaGUgSURzIGRvZXNuJ3QgY2FsbCBnbERlbGV0ZVRleHR1cmVzCisgICAgLy8gVXNlZCBvbmx5IGJ5IHRoZSBuYXRpdmUgU2tpYSBPcGVuR0wgRVMgMS54IGltcGxlbWVudGF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKaW5kZXggZTU5ODVjMS4uNDc5ZTc1NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQpAQCAtMTYsMTUgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTcxLDExICs3MSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBtQ29uc3RydWN0b3JBcmdzID0gbmV3IE9iamVjdFsyXTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gbUNvbnN0cnVjdG9yU2lnbmF0dXJlID0gbmV3IENsYXNzW10geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gbUNvbnN0cnVjdG9yU2lnbmF0dXJlID0gbmV3IENsYXNzW10gewogICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQXR0cmlidXRlU2V0LmNsYXNzfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcj4gc0NvbnN0cnVjdG9yTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4gc0NvbnN0cnVjdG9yTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+PigpOwogICAgIAogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1GaWx0ZXJNYXA7CiAKQEAgLTk3LDYgKzk3LDcgQEAKICAgICAgICAgICogCiAgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQsIG9yIGZhbHNlIG90aGVyd2lzZQogICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgIGJvb2xlYW4gb25Mb2FkQ2xhc3MoQ2xhc3MgY2xhenopOwogICAgIH0KICAgICAKQEAgLTM3OSw3ICszODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJWaWV3R3JvdXAgcm9vdCBhbmQgYXR0YWNoVG9Sb290PXRydWUiKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGVtcCBpcyB0aGUgcm9vdCB2aWV3IHRoYXQgd2FzIGZvdW5kIGluIHRoZSB4bWwKICAgICAgICAgICAgICAgICAgICAgVmlldyB0ZW1wID0gY3JlYXRlVmlld0Zyb21UYWcobmFtZSwgYXR0cnMpOwpAQCAtNDA0LDcgKzQwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBzdGFydCBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbiB1bmRlciB0ZW1wCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdGVtcCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBkb25lIGluZmxhdGluZyBjaGlsZHJlbiIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTMsMTggKzQ1NCwxOCBAQAogICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZC4KICAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIFhNTCBhdHRyaWJ1dGVzIHN1cHBsaWVkIGZvciB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGllZCB2aWV3LCBvciBudWxsLgorICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGlhdGVkIHZpZXcsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFZpZXcgY3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluZmxhdGVFeGNlcHRpb24gewotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+IGNvbnN0cnVjdG9yID0gc0NvbnN0cnVjdG9yTWFwLmdldChuYW1lKTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IGNsYXp6ID0gbnVsbDsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAogICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKS5hc1N1YmNsYXNzKFZpZXcuY2xhc3MpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwgJiYgY2xhenogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKQEAgLTQ4Miw3ICs0ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFN0YXRlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBjbGFzcyAtLSByZW1lbWJlciB3aGV0aGVyIGl0IGlzIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gY2xhenogIT0gbnVsbCAmJiBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJNYXAucHV0KG5hbWUsIGFsbG93ZWQpOwpAQCAtNDk3LDcgKzQ5OCw3IEBACiAKICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBtQ29uc3RydWN0b3JBcmdzOwogICAgICAgICAgICAgYXJnc1sxXSA9IGF0dHJzOwotICAgICAgICAgICAgcmV0dXJuIChWaWV3KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKIAogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQpAQCAtNTA2LDYgKzUwNywxMyBAQAogICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOwogICAgICAgICAgICAgdGhyb3cgaWU7CiAKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIGxvYWRlZCBjbGFzcyBpcyBub3QgYSBWaWV3IHN1YmNsYXNzCisgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogQ2xhc3MgaXMgbm90IGEgVmlldyAiCisgICAgICAgICAgICAgICAgICAgICsgKHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSWYgbG9hZENsYXNzIGZhaWxzLCB3ZSBzaG91bGQgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24uCiAgICAgICAgICAgICB0aHJvdyBlOwpAQCAtNTE5LDcgKzUyNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhyb3cgYW4gZXhjcGV0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBmYWlsTm90QWxsb3dlZChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTU5MCw4ICs1OTgsOCBAQAogICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdXNlZCB0byBkZXNjZW5kIGRvd24gdGhlIHhtbCBoaWVyYXJjaHkgYW5kIGluc3RhbnRpYXRlCiAgICAgICogdmlld3MsIGluc3RhbnRpYXRlIHRoZWlyIGNoaWxkcmVuLCBhbmQgdGhlbiBjYWxsIG9uRmluaXNoSW5mbGF0ZSgpLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykKLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJJbmZsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hJbmZsYXRlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwogICAgICAgICBpbnQgdHlwZTsKQEAgLTYxOCwxMiArNjI2LDEyIEBACiAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcobmFtZSwgYXR0cnMpOwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCB2aWV3R3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSB2aWV3R3JvdXAuZ2VuZXJhdGVMYXlvdXRQYXJhbXMoYXR0cnMpOwotICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdmlldywgYXR0cnMpOworICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdmlldywgYXR0cnMsIHRydWUpOwogICAgICAgICAgICAgICAgIHZpZXdHcm91cC5hZGRWaWV3KHZpZXcsIHBhcmFtcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwYXJlbnQub25GaW5pc2hJbmZsYXRlKCk7CisgICAgICAgIGlmIChmaW5pc2hJbmZsYXRlKSBwYXJlbnQub25GaW5pc2hJbmZsYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVxdWVzdEZvY3VzKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCkKQEAgLTY3NCw3ICs2ODIsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTUVSR0UuZXF1YWxzKGNoaWxkTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgcGFyZW50LCBjaGlsZEF0dHJzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhjaGlsZE5hbWUsIGNoaWxkQXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIGdyb3VwID0gKFZpZXdHcm91cCkgcGFyZW50OwpAQCAtNjk5LDcgKzcwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMsIHRydWUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIG92ZXJyaWRlIHRoZSBpbmNsdWRlZCBsYXlvdXQncyBhbmRyb2lkOmlkIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgc2V0IG9uIHRoZSA8aW5jbHVkZSAvPiB0YWcgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKaW5kZXggNDZjODA1Yy4uMzMzNWU4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCkBAIC0xNiw5ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwpAQCAtMzAsNiArMjksOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGw7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIG1lbnUgWE1MIGZpbGVzIGludG8gTWVudSBvYmplY3RzLgogICogPHA+CkBAIC0xNjYsNiArMTY3LDQxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgaW1wbGVtZW50cyBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gUEFSQU1fVFlQRVMgPSBuZXcgQ2xhc3NbXSB7IE1lbnVJdGVtLmNsYXNzIH07CisgICAgICAgIAorICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIG1NZXRob2Q7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBDbGFzcyBjID0gY29udGV4dC5nZXRDbGFzcygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtTWV0aG9kID0gYy5nZXRNZXRob2QobWV0aG9kTmFtZSwgUEFSQU1fVFlQRVMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGV4ID0gbmV3IEluZmxhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVzb2x2ZSBtZW51IGl0ZW0gb25DbGljayBoYW5kbGVyICIgKyBtZXRob2ROYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gY2xhc3MgIiArIGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChtTWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGhvZC5pbnZva2UobUNvbnRleHQsIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFN0YXRlIGZvciB0aGUgY3VycmVudCBtZW51LgogICAgICAqIDxwPgpAQCAtMjA1LDYgKzI0MSwxNiBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXRlbVZpc2libGU7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtRW5hYmxlZDsKICAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTeW5jIHRvIGF0dHJzLnhtbCBlbnVtOgorICAgICAgICAgKiAtIDA6IG5ldmVyCisgICAgICAgICAqIC0gMTogaWZSb29tCisgICAgICAgICAqIC0gMjogYWx3YXlzCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBpdGVtU2hvd0FzQWN0aW9uOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZTsKKyAgICAgICAgCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0R3JvdXBJZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1JZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1DYXRlZ29yeSA9IDA7CkBAIC0yNzYsNiArMzIyLDggQEAKICAgICAgICAgICAgIGl0ZW1DaGVja2VkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2NoZWNrZWQsIGRlZmF1bHRJdGVtQ2hlY2tlZCk7CiAgICAgICAgICAgICBpdGVtVmlzaWJsZSA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV92aXNpYmxlLCBncm91cFZpc2libGUpOwogICAgICAgICAgICAgaXRlbUVuYWJsZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fZW5hYmxlZCwgZ3JvdXBFbmFibGVkKTsKKyAgICAgICAgICAgIGl0ZW1TaG93QXNBY3Rpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9zaG93QXNBY3Rpb24sIDApOworICAgICAgICAgICAgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX29uQ2xpY2spOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIApAQCAtMjk5LDkgKzM0NywxOCBAQAogICAgICAgICAgICAgICAgIC5zZXRJY29uKGl0ZW1JY29uUmVzSWQpCiAgICAgICAgICAgICAgICAgLnNldEFscGhhYmV0aWNTaG9ydGN1dChpdGVtQWxwaGFiZXRpY1Nob3J0Y3V0KQogICAgICAgICAgICAgICAgIC5zZXROdW1lcmljU2hvcnRjdXQoaXRlbU51bWVyaWNTaG9ydGN1dCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpdGVtTGlzdGVuZXJNZXRob2ROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIobUNvbnRleHQsIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgewotICAgICAgICAgICAgICAgICgoTWVudUl0ZW1JbXBsKSBpdGVtKS5zZXRFeGNsdXNpdmVDaGVja2FibGUodHJ1ZSk7CisgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnVJdGVtSW1wbCkgeworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpbXBsID0gKE1lbnVJdGVtSW1wbCkgaXRlbTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUNoZWNrYWJsZSA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbXBsLnNldFNob3dBc0FjdGlvbihpdGVtU2hvd0FzQWN0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKaW5kZXggMTFlNWFkMS4uMzQ2MWNiZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKQEAgLTg4Nyw2ICs4ODcsMjAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVBUSUNfRkVFREJBQ0tfRU5BQkxFRCA9IDB4MTAwMDAwMDA7CiAKICAgICAvKioKKyAgICAgKiA8cD5JbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBoaWVyYXJjaHkgc2hvdWxkIHN0b3Agc2F2aW5nIHN0YXRlIHdoZW4KKyAgICAgKiBpdCByZWFjaGVzIHRoaXMgdmlldy4gIElmIHN0YXRlIHNhdmluZyBpcyBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgYXQKKyAgICAgKiB0aGUgdmlldywgaXQgd2lsbCBiZSBhbGxvd2VkLgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOVF9TQVZFX0RJU0FCTEVEID0gMHgyMDAwMDAwMDsKKworICAgIC8qKgorICAgICAqIDxwPk1hc2sgZm9yIHVzZSB3aXRoIHNldEZsYWdzIGluZGljYXRpbmcgYml0cyB1c2VkIGZvciBQQVJFTlRfU0FWRV9ESVNBQkxFRC48L3A+CisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSyA9IDB4MjAwMDAwMDA7CisKKyAgICAvKioKICAgICAgKiBWaWV3IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHtAbGluayAjYWRkRm9jdXNhYmxlcyhBcnJheUxpc3QsIGludCwgaW50KX0KICAgICAgKiBzaG91bGQgYWRkIGFsbCBmb2N1c2FibGUgVmlld3MgcmVnYXJkbGVzcyBpZiB0aGV5IGFyZSBmb2N1c2FibGUgaW4gdG91Y2ggbW9kZS4KICAgICAgKi8KQEAgLTMzNDIsNiArMzM1NiwzOCBAQAogCiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmlldyBzdGF0ZSBzYXZpbmcgZnJvbSBwYXJlbnQgaXMgZW5hYmxlZCwgZWxzZSBmYWxzZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNhdmVGcm9tUGFyZW50RW5hYmxlZChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUZyb21QYXJlbnRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBlbnRpcmUgaGllcmFyY2h5IHVuZGVyIHRoaXMgdmlldyB3aWxsIHNhdmUgaXRzCisgICAgICogc3RhdGUgd2hlbiBhIHN0YXRlIHNhdmluZyB0cmF2ZXJzYWwgb2NjdXJzIGZyb20gaXRzIHBhcmVudC4gIFRoZSBkZWZhdWx0CisgICAgICogaXMgdHJ1ZTsgaWYgZmFsc2UsIHRoZXNlIHZpZXdzIHdpbGwgbm90IGJlIHNhdmVkIHVubGVzcworICAgICAqIHtAbGluayAjc2F2ZUhpZXJhcmNoeVN0YXRlKFNwYXJzZUFycmF5KX0gaXMgY2FsbGVkIGRpcmVjdGx5IG9uIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIFNldCB0byBmYWxzZSB0byA8ZW0+ZGlzYWJsZTwvZW0+IHN0YXRlIHNhdmluZywgb3IgdHJ1ZQorICAgICAqICh0aGUgZGVmYXVsdCkgdG8gYWxsb3cgaXQuCisgICAgICoKKyAgICAgKiBAc2VlICNpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpCisgICAgICogQHNlZSAjc2V0SWQoaW50KQorICAgICAqIEBzZWUgI29uU2F2ZUluc3RhbmNlU3RhdGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgc2V0RmxhZ3MoZW5hYmxlZCA/IDAgOiBQQVJFTlRfU0FWRV9ESVNBQkxFRCwgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSyk7CisgICAgfQorCisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBWaWV3IGlzIGFibGUgdG8gdGFrZSBmb2N1cy4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHZpZXcgY2FuIHRha2UgZm9jdXMsIG9yIGZhbHNlIG90aGVyd2lzZS4KQEAgLTg1NDgsMTMgKzg1OTQsMTIgQEAKICAgICAgICAgaWYgKG1BdHRhY2hJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAorICAgICAgICBpZiAoKGZsYWdzICYgSGFwdGljRmVlZGJhY2tDb25zdGFudHMuRkxBR19JR05PUkVfVklFV19TRVRUSU5HKSA9PSAwCiAgICAgICAgICAgICAgICAgJiYgIWlzSGFwdGljRmVlZGJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUF0dGFjaEluZm8ubVJvb3RDYWxsYmFja3MucGVyZm9ybUhhcHRpY0ZlZWRiYWNrKAotICAgICAgICAgICAgICAgIGZlZWRiYWNrQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjayhmZWVkYmFja0NvbnN0YW50LAorICAgICAgICAgICAgICAgIChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg2MjUsOCArODY3MCw3IEBACiAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpIC0gZGVsYXlPZmZzZXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gc3RhdGVTZXQyKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc3RhdGVTZXRVbmlvbihmaW5hbCBpbnRbXSBzdGF0ZVNldDEsIGZpbmFsIGludFtdIHN0YXRlU2V0MikgewogICAgICAgICBmaW5hbCBpbnQgc3RhdGVTZXQxTGVuZ3RoID0gc3RhdGVTZXQxLmxlbmd0aDsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0Mkxlbmd0aCA9IHN0YXRlU2V0Mi5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludFtdIG5ld1NldCA9IG5ldyBpbnRbc3RhdGVTZXQxTGVuZ3RoICsgc3RhdGVTZXQyTGVuZ3RoXTsKQEAgLTg2NjQsNyArODcwOCw3IEBACiAgICAgICAgIExheW91dEluZmxhdGVyIGZhY3RvcnkgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOwogICAgICAgICByZXR1cm4gZmFjdG9yeS5pbmZsYXRlKHJlc291cmNlLCByb290KTsKICAgICB9Ci0KKyAgICAKICAgICAvKioKICAgICAgKiBBIE1lYXN1cmVTcGVjIGVuY2Fwc3VsYXRlcyB0aGUgbGF5b3V0IHJlcXVpcmVtZW50cyBwYXNzZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuCiAgICAgICogRWFjaCBNZWFzdXJlU3BlYyByZXByZXNlbnRzIGEgcmVxdWlyZW1lbnQgZm9yIGVpdGhlciB0aGUgd2lkdGggb3IgdGhlIGhlaWdodC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCmluZGV4IGU3YjZjNTAuLjM0Nzc3Y2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQpAQCAtODYsMTAgKzg2LDIzIEBACiAgICAgLy8gVGhlIHZpZXcgY29udGFpbmVkIHdpdGhpbiB0aGlzIFZpZXdHcm91cCB0aGF0IGhhcyBvciBjb250YWlucyBmb2N1cy4KICAgICBwcml2YXRlIFZpZXcgbUZvY3VzZWQ7CiAKLSAgICAvLyBUaGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBvbiB0aGUgY2hpbGQgYmVpbmcgZHJhd24KLSAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uOworICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB3aGVuIGRyYXdpbmcgY2hpbGRyZW4sIHRvCisgICAgICogYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtYXRpb24gbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgaW52YWxpZGF0aW9uIHJlZ2lvbi4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlY3RGIG1JbnZhbGlkYXRlUmVnaW9uOwogCisgICAgLyoqCisgICAgICogQSBUcmFuc2Zvcm1hdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBhIGNvcnJlY3QKKyAgICAgKiBpbnZhbGlkYXRpb24gYXJlYSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRvc2NhbGVkLgorICAgICAqLworICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb24gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworCiAgICAgLy8gVGFyZ2V0IG9mIE1vdGlvbiBldmVudHMKICAgICBwcml2YXRlIFZpZXcgbU1vdGlvblRhcmdldDsKICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKQEAgLTExODIsNyArMTE5NSwxMCBAQAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuW2ldLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIFZpZXcgYyA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKChjLm1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGMuZGlzcGF0Y2hTYXZlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjA3LDcgKzEyMjMsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoUmVzdG9yZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ3NywyMSArMTQ5NiwyNSBAQAogICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBtR3JvdXBGbGFnczsKIAogICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgPT0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgewotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5jbGVhcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKICAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOwogICAgICAgICB9CiAKICAgICAgICAgVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtVG9BcHBseSA9IG51bGw7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uIGludmFsaWRhdGlvblRyYW5zZm9ybTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIGEgPSBjaGlsZC5nZXRBbmltYXRpb24oKTsKICAgICAgICAgYm9vbGVhbiBjb25jYXRNYXRyaXggPSBmYWxzZTsKIAorICAgICAgICBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGNhY2hpbmcgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSB8fAorICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpIHsKKyAgICAgICAgICAgIGNhY2hpbmcgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvICE9IG51bGwpIHNjYWxpbmdSZXF1aXJlZCA9IG1BdHRhY2hJbmZvLm1TY2FsaW5nUmVxdWlyZWQ7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gbmV3IFJlY3RGKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplZCA9IGEuaXNJbml0aWFsaXplZCgpOwogICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgewpAQCAtMTUwMCwxMCArMTUyMywxNyBAQAogICAgICAgICAgICAgICAgIGNoaWxkLm9uQW5pbWF0aW9uU3RhcnQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzY2FsaW5nUmVxdWlyZWQgPyBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSA6IDFmKTsKKyAgICAgICAgICAgIGlmIChzY2FsaW5nUmVxdWlyZWQgJiYgbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgIT0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgICAgICAgICBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0sIDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgdHJhbnNmb3JtVG9BcHBseSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogCiAgICAgICAgICAgICBjb25jYXRNYXRyaXggPSBhLndpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOwpAQCAtMTUyMCw3ICsxNTUwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGNsLCBjdCwgY3IsIGNiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIHRyYW5zZm9ybVRvQXBwbHkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb24gPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgaW52YWxpZGF0aW9uVHJhbnNmb3JtKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hpbGQgbmVlZCB0byBkcmF3IGFuIGFuaW1hdGlvbiwgcG90ZW50aWFsbHkgb2Zmc2NyZWVuLCBzbwogICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG8gbm90IGNhbmNlbCBpbnZhbGlkYXRlIHJlcXVlc3RzCkBAIC0xNTMzLDkgKzE1NjcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSA9PQogICAgICAgICAgICAgICAgIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSB7Ci0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1RyYW5zZm9ybSA9IGdldENoaWxkU3RhdGljVHJhbnNmb3JtYXRpb24oY2hpbGQsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIGlmIChoYXNUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHJhbnNmb3JtVHlwZSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uLmdldFRyYW5zZm9ybWF0aW9uVHlwZSgpOwpAQCAtMTU1OSwxMiArMTU5MCw5IEBACiAgICAgICAgIGZpbmFsIGludCBzeCA9IGNoaWxkLm1TY3JvbGxYOwogICAgICAgICBmaW5hbCBpbnQgc3kgPSBjaGlsZC5tU2Nyb2xsWTsKIAotICAgICAgICBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICBCaXRtYXAgY2FjaGUgPSBudWxsOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgIGlmIChjYWNoaW5nKSB7CiAgICAgICAgICAgICBjYWNoZSA9IGNoaWxkLmdldERyYXdpbmdDYWNoZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNOb0NhY2hlID0gY2FjaGUgPT0gbnVsbDsKQEAgLTI4NzAsNyArMjg5OCw3IEBACiAgICAgICovCiAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KG1hcHBpbmcgPSB7CiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfTk9fQ0FDSEUsICAgICAgICB0byA9ICJOT05FIiksCi0gICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTklNQVRJT04iKSwKKyAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTklNQVRJT05fQ0FDSEUsIHRvID0gIkFOSU1BVElPTiIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX1NDUk9MTElOR19DQUNIRSwgdG8gPSAiU0NST0xMSU5HIiksCiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTEwiKQogICAgIH0pCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKaW5kZXggNDg1NDE5MC4uNzAwNDllZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5CYXNlU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZENhbGxiYWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kU2Vzc2lvbjsKQEAgLTMzLDcgKzM0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKQEAgLTUyLDE1ICs1MiwxMCBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLio7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuKjsKLWltcG9ydCBzdGF0aWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMC4qOwotCiAvKioKICAqIFRoZSB0b3Agb2YgYSB2aWV3IGhpZXJhcmNoeSwgaW1wbGVtZW50aW5nIHRoZSBuZWVkZWQgcHJvdG9jb2wgYmV0d2VlbiBWaWV3CiAgKiBhbmQgdGhlIFdpbmRvd01hbmFnZXIuICBUaGlzIGlzIGZvciB0aGUgbW9zdCBwYXJ0IGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uCkBAIC02OCwxNCArNjMsMTIgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsiRW1wdHlDYXRjaEJsb2NrIn0pCi1wdWJsaWMgZmluYWwgY2xhc3MgVmlld1Jvb3QgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgVmlld1BhcmVudCwKLSAgICAgICAgVmlldy5BdHRhY2hJbmZvLkNhbGxiYWNrcyB7CitAU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayIsICJQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbiJ9KQorcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlld1Jvb3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX0ZQUyA9IGZhbHNlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnRDb25kaXRpb25hbEV4cHJlc3Npb24ifSkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZSA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CiAgICAgLyoqIEBub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24qLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBVyA9IGZhbHNlIHx8IExPQ0FMX0xPR1Y7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MQVlPVVQgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwpAQCAtMjA1LDE0ICsxOTgsNyBAQAogICAgIGludCBtQ3VyU2Nyb2xsWTsKICAgICBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKLSAgICBFR0wxMCBtRWdsOwotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOwotICAgIEdMMTEgbUdMOwotICAgIENhbnZhcyBtR2xDYW52YXM7Ci0gICAgYm9vbGVhbiBtVXNlR0w7Ci0gICAgYm9vbGVhbiBtR2xXYW50ZWQ7CisgICAgSGFyZHdhcmVSZW5kZXJlciBtSHdSZW5kZXJlcjsKIAogICAgIGZpbmFsIFZpZXdDb25maWd1cmF0aW9uIG1WaWV3Q29uZmlndXJhdGlvbjsKIApAQCAtMjQyLDggKzIyOCwxMCBAQAogICAgIHB1YmxpYyBWaWV3Um9vdChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoKTsKIAotICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZICYmIGx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7CisgICAgICAgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gRm9yIGRlYnVnIG9ubHkKQEAgLTMzMSwxMjIgKzMxOSwxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTCgpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUdMSW5uZXIoKTsKLSAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgLy8gZ2l2ZS11cCBvbiB1c2luZyBHTAotICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0xJbm5lcigpIHsKLSAgICAgICAgZmluYWwgRUdMMTAgZWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOwotICAgICAgICBtRWdsID0gZWdsOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0byB0aGUgZGVmYXVsdCBkaXNwbGF5LgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5ID0gZWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gZWdsRGlzcGxheTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKLSAgICAgICAgICovCi0gICAgICAgIGludFtdIHZlcnNpb24gPSBuZXcgaW50WzJdOwotICAgICAgICBlZ2wuZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCB2ZXJzaW9uKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmb3Igb3VyIG9wZW5nbCBzZXNzaW9uCi0gICAgICAgICAqIGFuZCBncmFiIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2hlcyBpcwotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgaW50W10gY29uZmlnU3BlYyA9IHsKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsICAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgICAgNiwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgICAgMCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQotICAgICAgICB9OwotICAgICAgICBmaW5hbCBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKLSAgICAgICAgZmluYWwgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZWdsRGlzcGxheSwgY29uZmlnU3BlYywgY29uZmlncywgMSwgbnVtX2NvbmZpZyk7Ci0gICAgICAgIGZpbmFsIEVHTENvbmZpZyBjb25maWcgPSBjb25maWdzWzBdOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSBhbiBPcGVuR0wgRVMgY29udGV4dC4gVGhpcyBtdXN0IGJlIGRvbmUgb25seSBvbmNlLCBhbgotICAgICAgICAgKiBPcGVuR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgbnVsbCk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgY29uZmlnLCBtSG9sZGVyLCBudWxsKTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBzdXJmYWNlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0gICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KLSAgICAgICAgICovCi0gICAgICAgIGVnbC5lZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGFwcHJvcHJpYXRlIEdMIGludGVyZmFjZS4KLSAgICAgICAgICogVGhpcyBpcyBzaW1wbHkgZG9uZSBieSBjYXN0aW5nIHRoZSBHTCBjb250ZXh0IHRvIGVpdGhlcgotICAgICAgICAgKiBHTDEwIG9yIEdMMTEuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBHTDExIGdsID0gKEdMMTEpIGNvbnRleHQuZ2V0R0woKTsKLSAgICAgICAgbUdMID0gZ2w7Ci0gICAgICAgIG1HbENhbnZhcyA9IG5ldyBDYW52YXMoZ2wpOwotICAgICAgICBtVXNlR0wgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95R0woKSB7Ci0gICAgICAgIC8vIGluZm9ybSBza2lhIHRoYXQgdGhlIGNvbnRleHQgaXMgZ29uZQotICAgICAgICBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKLQotICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgbUVnbC5lZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBudWxsOwotICAgICAgICBtRWdsID0gbnVsbDsKLSAgICAgICAgbUdsQ2FudmFzID0gbnVsbDsKLSAgICAgICAgbUdMID0gbnVsbDsKLSAgICAgICAgbVVzZUdMID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWdsRXJyb3JzKCkgewotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gbUVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkIHJldmVydCB0bwotICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFdlIGhhdmUgb25lIGNoaWxkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLAotICAgICAgICAgICAgVmlldyBwYW5lbFBhcmVudFZpZXcpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmlldyA9IHZpZXc7CiAgICAgICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXMuY29weUZyb20oYXR0cnMpOwogICAgICAgICAgICAgICAgIGF0dHJzID0gbVdpbmRvd0F0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRpb24odmlldywgYXR0cnMpOworCiAgICAgICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBSb290Vmlld1N1cmZhY2VUYWtlcikgewogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlckNhbGxiYWNrID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJvb3RWaWV3U3VyZmFjZVRha2VyKXZpZXcpLndpbGxZb3VUYWtlVGhlU3VyZmFjZSgpOwpAQCAtNTc3LDYgKzQ2MSwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMpIHsKKyAgICAgICAgLy8gT25seSBlbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIHdlIGFyZSBub3QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzCisgICAgICAgIC8vIFRoZSB3aW5kb3cgbWFuYWdlciBjcmVhdGVzIFZpZXdSb290cyB0byBkaXNwbGF5IGFuaW1hdGVkIHByZXZpZXcgd2luZG93cworICAgICAgICAvLyBvZiBsYXVuY2hpbmcgYXBwcyBhbmQgd2UgZG9uJ3Qgd2FudCB0aG9zZSB0byBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZAorICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgeworICAgICAgICAgICAgLy8gVHJ5IHRvIGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaWYgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoKHZpZXcuZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uSW5mbygpLmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYW5zbHVjZW50ID0gYXR0cnMuZm9ybWF0ICE9IFBpeGVsRm9ybWF0Lk9QQVFVRTsKKyAgICAgICAgICAgICAgICBtSHdSZW5kZXJlciA9IEhhcmR3YXJlUmVuZGVyZXIuY3JlYXRlR2xSZW5kZXJlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KCkgewogICAgICAgICByZXR1cm4gbVZpZXc7CiAgICAgfQpAQCAtNzMzLDggKzYzMSw2IEBACiAgICAgICAgIGJvb2xlYW4gdmlld1Zpc2liaWxpdHlDaGFuZ2VkID0gbVZpZXdWaXNpYmlsaXR5ICE9IHZpZXdWaXNpYmlsaXR5CiAgICAgICAgICAgICAgICAgfHwgbU5ld1N1cmZhY2VOZWVkZWQ7CiAKLSAgICAgICAgZmxvYXQgYXBwU2NhbGUgPSBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZTsKLQogICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBudWxsOwogICAgICAgICBpZiAobVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkKSB7CiAgICAgICAgICAgICBtV2luZG93QXR0cmlidXRlc0NoYW5nZWQgPSBmYWxzZTsKQEAgLTc4Miw4ICs2NzgsOCBAQAogICAgICAgICAgICAgYXR0YWNoSW5mby5tV2luZG93VmlzaWJpbGl0eSA9IHZpZXdWaXNpYmlsaXR5OwogICAgICAgICAgICAgaG9zdC5kaXNwYXRjaFdpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKHZpZXdWaXNpYmlsaXR5KTsKICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgfHwgbU5ld1N1cmZhY2VOZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lHTCgpOworICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5HT05FKSB7CkBAIC04OTksMTAgKzc5NSwxMiBAQAogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gY29tcHV0ZXNJbnRlcm5hbEluc2V0cyA9CiAgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tVHJlZU9ic2VydmVyLmhhc0NvbXB1dGVJbnRlcm5hbEluc2V0c0xpc3RlbmVycygpOworCiAgICAgICAgIGJvb2xlYW4gaW5zZXRzUGVuZGluZyA9IGZhbHNlOwogICAgICAgICBpbnQgcmVsYXlvdXRSZXN1bHQgPSAwOwotICAgICAgICBpZiAobUZpcnN0IHx8IHdpbmRvd1Nob3VsZFJlc2l6ZSB8fCBpbnNldHNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkIHx8IHBhcmFtcyAhPSBudWxsKSB7CisKKyAgICAgICAgaWYgKG1GaXJzdCB8fCB3aW5kb3dTaG91bGRSZXNpemUgfHwgaW5zZXRzQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCB8fCBwYXJhbXMgIT0gbnVsbCkgewogCiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5WSVNJQkxFKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3aW5kb3cgaXMgZ2l2aW5nIGludGVybmFsIGluc2V0cyB0byB0aGUgd2luZG93CkBAIC05MTQsMTUgKzgxMiw3IEBACiAgICAgICAgICAgICAgICAgLy8gd2luZG93LCB3YWl0aW5nIHVudGlsIHdlIGNhbiBmaW5pc2ggbGF5aW5nIG91dCB0aGlzIHdpbmRvdwogICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgYmFjayB0byB0aGUgd2luZG93IG1hbmFnZXIgd2l0aCB0aGUgdWx0aW1hdGVseQogICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIGluc2V0cy4KLSAgICAgICAgICAgICAgICBpbnNldHNQZW5kaW5nID0gY29tcHV0ZXNJbnRlcm5hbEluc2V0cwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzLm1lbW9yeVR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUVNT1JZX1RZUEVfR1BVKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gbVdpbmRvd0F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUdsV2FudGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCkgewpAQCAtOTMxLDExICs4MjEsMTIgQEAKICAgICAgICAgICAgICAgICBscC5mb3JtYXQgPSBtU3VyZmFjZUhvbGRlci5nZXRSZXF1ZXN0ZWRGb3JtYXQoKTsKICAgICAgICAgICAgICAgICBscC50eXBlID0gbVN1cmZhY2VIb2xkZXIuZ2V0UmVxdWVzdGVkVHlwZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaHdJbnRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIGNvbnRlbnRJbnNldHNDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIHZpc2libGVJbnNldHNDaGFuZ2VkOwogICAgICAgICAgICAgYm9vbGVhbiBoYWRTdXJmYWNlID0gbVN1cmZhY2UuaXNWYWxpZCgpOworCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludCBmbCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CkBAIC05OTUsOSArODg2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhbnNwYXJlbnRSZWdpb24uc2V0RW1wdHkoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSBtR2xDYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdJbnRpYWxpemVkID0gbUh3UmVuZGVyZXIuaW5pdGlhbGl6ZShtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1TdXJmYWNlLmlzVmFsaWQoKSkgewpAQCAtMTA3NSw5ICs5NjUsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgbUdsQ2FudmFzLnNldFZpZXdwb3J0KChpbnQpIChtV2lkdGggKiBhcHBTY2FsZSArIDAuNWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKKyAgICAgICAgICAgIGlmIChod0ludGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5zZXR1cChtV2lkdGgsIG1IZWlnaHQsIG1BdHRhY2hJbmZvKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbGVhbiBmb2N1c0NoYW5nZWREdWVUb1RvdWNoTW9kZSA9IGVuc3VyZVRvdWNoTW9kZUxvY2FsbHkoCkBAIC0xMzM4LDcgKzEyMjcsOCBAQAogICAgICAgICBpZiAoIXNGaXJzdERyYXdDb21wbGV0ZSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChzRmlyc3REcmF3SGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICBzRmlyc3REcmF3Q29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzRmlyc3REcmF3SGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBzRmlyc3REcmF3SGFuZGxlcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHBvc3Qoc0ZpcnN0RHJhd0hhbmRsZXJzLmdldChpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTM3Miw1MyArMTI2MiwxNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAobVVzZUdMKSB7CisgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsICYmIG1Id1JlbmRlcmVyLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBpZiAoIWRpcnR5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBtR2xDYW52YXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1HTCAhPSBudWxsICYmIGNhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWV3Lm1Qcml2YXRlRmxhZ3MgfD0gVmlldy5EUkFXTjsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAteW9mZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2xhdG9yLnRyYW5zbGF0ZUNhbnZhcyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldFNjcmVlbkRlbnNpdHkoc2NhbGluZ1JlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0UgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLmNvbnNpc3RlbmN5Q2hlY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hDb25zaXN0ZW5jeUNoZWNrKFZpZXdEZWJ1Zy5DT05TSVNURU5DWV9EUkFXSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBtRWdsLmVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrRWdsRXJyb3JzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfRlBTIHx8IENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuc2hvd0ZwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdyA9IChpbnQpU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0RyYXdUaW1lICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTaG93RlBTKGNhbnZhcywgbm93IC0gc0RyYXdUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNEcmF3VGltZSA9IG5vdzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5kcmF3KG1WaWV3LCBtQXR0YWNoSW5mbywgbVRyYW5zbGF0b3IsIHlvZmYsIHNjYWxpbmdSZXF1aXJlZCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzY3JvbGxpbmcpIHsKICAgICAgICAgICAgICAgICBtRnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgc2NoZWR1bGVUcmF2ZXJzYWxzKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xNzMwLDggKzE1ODMsNiBAQAogICAgIH0KIAogICAgIHZvaWQgZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoIlZpZXdSb290IiwgIkRldGFjaGluZyBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKLQogICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICAgICAgfQpAQCAtMTc0MCw4ICsxNTkxLDggQEAKICAgICAgICAgbUF0dGFjaEluZm8ubVJvb3RWaWV3ID0gbnVsbDsKICAgICAgICAgbUF0dGFjaEluZm8ubVN1cmZhY2UgPSBudWxsOwogCi0gICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgIGRlc3Ryb3lHTCgpOworICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUh3UmVuZGVyZXIuZGVzdHJveSgpOwogICAgICAgICB9CiAgICAgICAgIG1TdXJmYWNlLnJlbGVhc2UoKTsKIApAQCAtMTg3Miw4ICsxNzIzLDEwIEBACiAgICAgICAgICAgICAgICAgZXZlbnQgPSBnZXRQZW5kaW5nUG9pbnRlck1vdGlvbkV2ZW50KCk7CiAKICAgICAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZICYmIGV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCI5IENsaWVudCBnb3QgZXZlbnRzICAgICAgIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwotICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIjggQ2xpZW50IGdldHRpbmcgZXZlbnRzICAiLCB0aW1lQmVmb3JlR2V0dGluZ0V2ZW50cyAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7CisgICAgICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiOSBDbGllbnQgZ290IGV2ZW50cyAgICAgICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOworICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIjggQ2xpZW50IGdldHRpbmcgZXZlbnRzICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVCZWZvcmVHZXR0aW5nRXZlbnRzIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FsbFdoZW5Eb25lID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xODk2LDExICsxNzQ5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5vZmZzZXRMb2NhdGlvbigwLCBtQ3VyU2Nyb2xsWSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJBIERpc3BhdGNoaW5nIFRvdWNoRXZlbnRzIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJBIERpc3BhdGNoaW5nIFRvdWNoRXZlbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBtVmlldy5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIkIgRGlzcGF0Y2hlZCBUb3VjaEV2ZW50cyAiLCBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIkIgRGlzcGF0Y2hlZCBUb3VjaEV2ZW50cyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVkICYmIGlzRG93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVkZ2VTbG9wID0gbVZpZXdDb25maWd1cmF0aW9uLmdldFNjYWxlZEVkZ2VTbG9wKCk7CkBAIC0yMDA1LDE4ICsxODYwLDggQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblRvdWNoTW9kZSA9IG1zZy5hcmcyICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZVRvdWNoTW9kZUxvY2FsbHkoaW5Ub3VjaE1vZGUpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRWdsRXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb3N0IHRoZSBnbCBjb250ZXh0LCBzbyByZWNyZWF0ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xDYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhcHBTY2FsZSA9IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR2xDYW52YXMuc2V0Vmlld3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1XaWR0aCAqIGFwcFNjYWxlICsgMC41ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5pbml0aWFsaXplSWZOZWVkZWQobVdpZHRoLCBtSGVpZ2h0LCBtQXR0YWNoSW5mbywgbUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTIwNjYsOCArMTkxMSw3IEBACiAgICAgICAgICAgICBpZiAoKGV2ZW50LmdldEZsYWdzKCkmS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSkgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIFRoZSBJTUUgaXMgdHJ5aW5nIHRvIHNheSB0aGlzIGV2ZW50IGlzIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgLy8gc3lzdGVtISAgQmFkIGJhZCBiYWQhCi0gICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZsYWdzKCkmfktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pOworICAgICAgICAgICAgICAgIGV2ZW50ID0gS2V5RXZlbnQuY2hhbmdlRmxhZ3MoZXZlbnQsIGV2ZW50LmdldEZsYWdzKCkgJiB+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnRUb1ZpZXdIaWVyYXJjaHkoKEtleUV2ZW50KW1zZy5vYmosIGZhbHNlKTsKICAgICAgICAgfSBicmVhazsKQEAgLTI1NTUsOCArMjM5OSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGRlbGl2ZXJLZXlFdmVudChLZXlFdmVudCBldmVudCwgYm9vbGVhbiBzZW5kRG9uZSkgewogICAgICAgICAvLyBJZiBtVmlldyBpcyBudWxsLCB3ZSBqdXN0IGNvbnN1bWUgdGhlIGtleSBldmVudCBiZWNhdXNlIGl0IGRvZXNuJ3QKICAgICAgICAgLy8gbWFrZSBzZW5zZSB0byBkbyBhbnl0aGluZyBlbHNlIHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IG1WaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpIDogdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgPT0gbnVsbCB8fCBtVmlldy5kaXNwYXRjaEtleUV2ZW50UHJlSW1lKGV2ZW50KTsKICAgICAgICAgaWYgKGhhbmRsZWQpIHsKICAgICAgICAgICAgIGlmIChzZW5kRG9uZSkgewogICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudigKQEAgLTI1OTAsNyArMjQzMyw2IEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNlbmREb25lID0gc2VxID49IDA7CiAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHsKICAgICAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnRUb1ZpZXdIaWVyYXJjaHkoZXZlbnQsIHNlbmREb25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KAogICAgICAgICAgICAgICAgICAgICAgICAgIlZpZXdSb290IiwgIlRlbGxpbmcgd2luZG93IG1hbmFnZXIga2V5IGlzIGZpbmlzaGVkIik7CkBAIC0yNzkxLDcgKzI2MzMsNyBAQAogCiAgICAgdm9pZCBkb0RpZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudigiVmlld1Jvb3QiLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOworICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoIlZpZXdSb290IiwgIkRJRSBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobUFkZGVkICYmICFtRmlyc3QpIHsKICAgICAgICAgICAgICAgICBpbnQgdmlld1Zpc2liaWxpdHkgPSBtVmlldy5nZXRWaXNpYmlsaXR5KCk7CkBAIC0yODk5LDEzICsyNzQxLDEyIEBACiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCiAgICAgICAgICAgICBpZiAoZmFsc2UgJiYgZXZlbnQuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LktFWUNPREVfQ0FNRVJBKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsICJGb2N1c2VkIHZpZXcgSGllcmFyY2h5IGlzOiIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIkZvY3VzZWQgdmlldyBIaWVyYXJjaHkgaXM6Iik7CisKICAgICAgICAgICAgICAgICBkZWJ1ZygpOwogCi0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzU1OCw4ICszMzk5LDQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTaG93RlBTKENhbnZhcyBjYW52YXMsIGludCBkdXJhdGlvbk1pbGxpcyk7Ci0KLSAgICAvLyBpbmZvcm0gc2tpYSB0byBqdXN0IGFiYW5kb24gaXRzIHRleHR1cmUgY2FjaGUgSURzCi0gICAgLy8gZG9lc24ndCBjYWxsIGdsRGVsZXRlVGV4dHVyZXMKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCmluZGV4IGY0MDczNGIuLjliMzFiOWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQpAQCAtNjEsNiArNjEsMTMgQEAKICAgICAgICAgQGhpZGUKICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfT1BFTkdMID0gODsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBlbmFibGluZyB0aGUgQWN0aW9uIEJhci4KKyAgICAgKiBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3Igc29tZSBkZXZpY2VzLiBUaGUgQWN0aW9uIEJhcgorICAgICAqIHJlcGxhY2VzIHRoZSB0aXRsZSBiYXIgYW5kIHByb3ZpZGVzIGFuIGFsdGVybmF0ZSBsb2NhdGlvbgorICAgICAqIGZvciBhbiBvbi1zY3JlZW4gbWVudSBidXR0b24gb24gc29tZSBkZXZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX0JBUiA9IDk7CiAgICAgLyoqIEZsYWcgZm9yIHNldHRpbmcgdGhlIHByb2dyZXNzIGJhcidzIHZpc2liaWxpdHkgdG8gVklTSUJMRSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX1ZJU0lCSUxJVFlfT04gPSAtMTsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBHT05FICovCkBAIC04MTcsNiArODI0LDggQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRvZ2dsZVBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCk7CisgICAgCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybVBhbmVsU2hvcnRjdXQoaW50IGZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudCBldmVudCwKQEAgLTk5Niw2ICsxMDA1LDE2IEBACiAgICAgewogICAgICAgICByZXR1cm4gbUZlYXR1cmVzOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGNlcnRhaW4gZmVhdHVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSBJRCB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShpbnQgZmVhdHVyZSkgeworICAgICAgICByZXR1cm4gKGdldEZlYXR1cmVzKCkgJiAoMSA8PCBmZWF0dXJlKSkgIT0gMDsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGZlYXR1cmUgYml0cyB0aGF0IGFyZSBiZWluZyBpbXBsZW1lbnRlZCBieSB0aGlzIFdpbmRvdy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YQppbmRleCBjMjJmOTkxLi5mYzYxNzAwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlFdmVudC5qYXZhCkBAIC02MjIsNiArNjIyLDcgQEAKICAgICAgICAgbVBhY2thZ2VOYW1lID0gbnVsbDsKICAgICAgICAgbUNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgIG1CZWZvcmVUZXh0ID0gbnVsbDsKKyAgICAgICAgbVBhcmNlbGFibGVEYXRhID0gbnVsbDsKICAgICAgICAgbVRleHQuY2xlYXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEKaW5kZXggMDE4NjI3MC4uZjQwNmRhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEKQEAgLTk0LDcgKzk0LDkgQEAKICAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIGdldEluc3RhbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNJbnN0YW5jZVN5bmMpIHsKICAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgc2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihjb250ZXh0LCBzZXJ2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc0luc3RhbmNlOwpAQCAtMTA0LDEzICsxMDYsMTYgQEAKICAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBIHtAbGluayBDb250ZXh0fS4KKyAgICAgKiBAcGFyYW0gc2VydmljZSBBbiBpbnRlcmZhY2UgdG8gdGhlIGJhY2tpbmcgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgc2VydmljZSkgewogICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoY29udGV4dC5nZXRNYWluTG9vcGVyKCkpOwotICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKLSAgICAgICAgbVNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2VydmljZS5hZGRDbGllbnQobUNsaWVudCk7CisgICAgICAgICAgICBtSXNFbmFibGVkID0gbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UgaXMgZGVhZCIsIHJlKTsKICAgICAgICAgfQpAQCAtMTI4LDYgKzEzMywxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsaWVudCBpbnRlcmZhY2UgdGhpcyBpbnN0YW5jZSByZWdpc3RlcnMgaW4KKyAgICAgKiB0aGUgY2VudHJhbGl6ZWQgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgICAgIHJldHVybiAoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KSBtQ2xpZW50LmFzQmluZGVyKCk7IAorICAgIH0KKworICAgIC8qKgogICAgICAqIFNlbmRzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9LiBJZiB0aGlzIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0gaXMgbm90CiAgICAgICogZW5hYmxlZCB0aGUgY2FsbCBpcyBhIE5PT1AuCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbAppbmRleCAzMjc4OGJlLi43NjMzNTY5ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbApAQCAtMjksNyArMjksNyBAQAogICovCiBpbnRlcmZhY2UgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHsKIAotICAgIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOworICAgIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOwogCiAgICAgYm9vbGVhbiBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGluIEFjY2Vzc2liaWxpdHlFdmVudCB1aUV2ZW50KTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQppbmRleCAzNDliN2U1Li5mMzM5MmQ5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQpAQCAtMTc0LDcgKzE3NCwxMyBAQAogICAgICAqIERlc2lyZWQgWiBvcmRlciBtb2RlIGR1cmluZyBhbmltYXRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbVpBZGp1c3RtZW50OwotICAgIAorCisgICAgLyoqCisgICAgICogc2NhbGVmYWN0b3IgdG8gYXBwbHkgdG8gcGl2b3QgcG9pbnRzLCBldGMuIGR1cmluZyBhbmltYXRpb24uIFN1YmNsYXNzZXMgcmV0cmlldmUgdGhlCisgICAgICogdmFsdWUgdmlhIGdldFNjYWxlRmFjdG9yKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVGYWN0b3IgPSAxZjsKKwogICAgIC8qKgogICAgICAqIERvbid0IGFuaW1hdGUgdGhlIHdhbGxwYXBlci4KICAgICAgKi8KQEAgLTU1Myw2ICs1NTksMTkgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogVGhlIHNjYWxlIGZhY3RvciBpcyBzZXQgYnkgdGhlIGNhbGwgdG8gPGNvZGU+Z2V0VHJhbnNmb3JtYXRpb248L2NvZGU+LiBPdmVycmlkZXMgb2YgCisgICAgICoge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbihsb25nLCBUcmFuc2Zvcm1hdGlvbiwgZmxvYXQpfSB3aWxsIGdldCB0aGlzIHZhbHVlCisgICAgICogZGlyZWN0bHkuIE92ZXJyaWRlcyBvZiB7QGxpbmsgI2FwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQsIFRyYW5zZm9ybWF0aW9uKX0gY2FuCisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gZmxvYXQgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHByZS1zY2FsZWQgdmFsdWVzIGluCisgICAgICogYW4gQW5pbWF0aW9uIHN1Y2ggYXMgdGhlIHBpdm90IHBvaW50cyBpbiB7QGxpbmsgU2NhbGVBbmltYXRpb259IGFuZCB7QGxpbmsgUm90YXRlQW5pbWF0aW9ufS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmxvYXQgZ2V0U2NhbGVGYWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVGYWN0b3I7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSWYgZGV0YWNoV2FsbHBhcGVyIGlzIHRydWUsIGFuZCB0aGlzIGlzIGEgd2luZG93IGFuaW1hdGlvbiBvZiBhIHdpbmRvdwogICAgICAqIHRoYXQgaGFzIGEgd2FsbHBhcGVyIGJhY2tncm91bmQsIHRoZW4gdGhlIHdpbmRvdyB3aWxsIGJlIGRldGFjaGVkIGZyb20KICAgICAgKiB0aGUgd2FsbHBhcGVyIHdoaWxlIGl0IHJ1bnMuICBUaGF0IGlzLCB0aGUgYW5pbWF0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkCkBAIC03MzUsNiArNzU0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBpcyBzdGlsbCBydW5uaW5nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmb3JtYXRpb24obG9uZyBjdXJyZW50VGltZSwgVHJhbnNmb3JtYXRpb24gb3V0VHJhbnNmb3JtYXRpb24pIHsKKwogICAgICAgICBpZiAobVN0YXJ0VGltZSA9PSAtMSkgewogICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOwogICAgICAgICB9CkBAIC04MDYsNiArODI2LDI0IEBACiAKICAgICAgICAgcmV0dXJuIG1Nb3JlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBhdCBhIHNwZWNpZmllZCBwb2ludCBpbiB0aW1lLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcworICAgICAqIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBUcmFuc2Zvcm1hdGlvbiBvciBkb2N1bWVudCB0aGV5IGFyZSBkb2luZworICAgICAqIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBXaGVyZSB3ZSBhcmUgaW4gdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyB3YWxsIGNsb2NrIHRpbWUuCisgICAgICogQHBhcmFtIG91dFRyYW5zZm9ybWF0aW9uIEEgdHJhbmZvcm1hdGlvbiBvYmplY3QgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgY2FsbGVyIGFuZCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgYW5pbWF0aW9uLgorICAgICAqIEBwYXJhbSBzY2FsZSBTY2FsaW5nIGZhY3RvciB0byBhcHBseSB0byBhbnkgaW5wdXRzIHRvIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLCBzdWNoCisgICAgICogICAgICAgIHBpdm90IHBvaW50cyBiZWluZyByb3RhdGVkIG9yIHNjYWxlZCBhcm91bmQuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgbVNjYWxlRmFjdG9yID0gc2NhbGU7CisgICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgb3V0VHJhbnNmb3JtYXRpb24pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIHRoaXMgYW5pbWF0aW9uIGhhcyBzdGFydGVkIG9yIG5vdC48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCmluZGV4IDE1NDZkY2QuLjg3M2NlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCkBAIC0zMTIsNyArMzEyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gYW5pbWF0aW9ucy5nZXQoaSk7CiAKICAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wKSB8fCBtb3JlOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIHRlbXAsIGdldFNjYWxlRmFjdG9yKCkpIHx8IG1vcmU7CiAgICAgICAgICAgICB0LmNvbXBvc2UodGVtcCk7CiAKICAgICAgICAgICAgIHN0YXJ0ZWQgPSBzdGFydGVkIHx8IGEuaGFzU3RhcnRlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQppbmRleCAyODRjY2NlLi41OGJmMDg0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9Sb3RhdGVBbmltYXRpb24uamF2YQpAQCAtMTQ4LDExICsxNDgsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKICAgICAgICAgZmxvYXQgZGVncmVlcyA9IG1Gcm9tRGVncmVlcyArICgobVRvRGVncmVlcyAtIG1Gcm9tRGVncmVlcykgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLQorICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CisgICAgICAgIAogICAgICAgICBpZiAobVBpdm90WCA9PSAwLjBmICYmIG1QaXZvdFkgPT0gMC4wZikgewogICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMsIG1QaXZvdFggKiBzY2FsZSwgbVBpdm90WSAqIHNjYWxlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKaW5kZXggMWE1NmM4Yi4uODUzN2Q0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCkBAIC0xNjEsNiArMTYxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKICAgICAgICAgZmxvYXQgc3ggPSAxLjBmOwogICAgICAgICBmbG9hdCBzeSA9IDEuMGY7CisgICAgICAgIGZsb2F0IHNjYWxlID0gZ2V0U2NhbGVGYWN0b3IoKTsKIAogICAgICAgICBpZiAobUZyb21YICE9IDEuMGYgfHwgbVRvWCAhPSAxLjBmKSB7CiAgICAgICAgICAgICBzeCA9IG1Gcm9tWCArICgobVRvWCAtIG1Gcm9tWCkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKQEAgLTE3Miw3ICsxNzMsNyBAQAogICAgICAgICBpZiAobVBpdm90WCA9PSAwICYmIG1QaXZvdFkgPT0gMCkgewogICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3kpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3ksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRTY2FsZShzeCwgc3ksIHNjYWxlICogbVBpdm90WCwgc2NhbGUgKiBtUGl2b3RZKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGludG8gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZCBKYXZhU2NyaXB0IG9yCisgKiBXZWJWaWV3cyB3aXRoIGVuYWJsZWQgSmF2YVNjcmlwdCBidXQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gYWNjZXNzaWJpbGl0eQorICogc2NyaXB0IHRvIGluamVjdC4KKyAqLworY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yIHsKKworICAgIC8vIEhhbmRsZSB0byB0aGUgV2ViVmlldyB0aGlzIGluamVjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIFZ3ZWJWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIGFzc29jaWF0ZWQgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUluamVjdG9yKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGEga2V5IGRvd24gPGNvZGU+ZXZlbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBhcyBhIHByb29mIG9mIGNvbmNlcHQgbGV0IHVzIGRvIHRoZSBzaW1wbGVzdCBleGFtcGxlCisKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisKKyAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTjoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJmb3J3YXJkIiwgInNlbnRlbmNlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfUDoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJiYWNrd2FyZCIsICJzZW50ZW5jZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSA8Y29kZT5zZWxlY3Rpb25TdHJpbmc8L2NvZGU+IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKFN0cmluZyBzZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgLy8gcHV0IHRoZSBzZWxlY3Rpb24gc3RyaW5nIGluIGFuIEFjY2Vzc2liaWxpdHlFdmVudCBhbmQgc2VuZCBpdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRCk7CisgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgbVdlYlZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudFVuY2hlY2tlZChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb2RpZnlTZWxlY3Rpb24oU3RyaW5nIGFsdGVyLCBTdHJpbmcgZGlyZWN0aW9uLCBTdHJpbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgV2ViVmlld0NvcmUgd2ViVmlld0NvcmUgPSBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpOworCisgICAgICAgIGlmICh3ZWJWaWV3Q29yZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBXZWJWaWV3Q29yZS5Nb2RpZnlTZWxlY3Rpb25EYXRhIGRhdGEgPSBuZXcgV2ViVmlld0NvcmUuTW9kaWZ5U2VsZWN0aW9uRGF0YSgpOworICAgICAgICBkYXRhLm1BbHRlciA9IGFsdGVyOworICAgICAgICBkYXRhLm1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIGRhdGEubUdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CisgICAgICAgIHdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLk1PRElGWV9TRUxFQ1RJT04sIGRhdGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCAyMTlhNDY5Li43YjFhYWIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC03Miw2ICs3Miw4IEBACiAgICAgLy8gcXVldWUgaGFzIGJlZW4gY2xlYXJlZCx0aGV5IGFyZSBpZ25vcmVkLgogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tNZXNzYWdlcyA9IGZhbHNlOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNEYXRhRGlyZWN0b3J5ID0gIiI7CisKICAgICAvLyBJcyB0aGlzIGZyYW1lIHRoZSBtYWluIGZyYW1lPwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNYWluRnJhbWU7CiAKQEAgLTIyNCw2ICsyMjYsMTEgQEAKICAgICAgICAgQXNzZXRNYW5hZ2VyIGFtID0gY29udGV4dC5nZXRBc3NldHMoKTsKICAgICAgICAgbmF0aXZlQ3JlYXRlRnJhbWUodywgYW0sIHByb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpKTsKIAorICAgICAgICBpZiAoc0RhdGFEaXJlY3RvcnkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgU3RyaW5nIGRpciA9IGFwcENvbnRleHQuZ2V0RmlsZXNEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIHNEYXRhRGlyZWN0b3J5ID0gIGRpci5zdWJzdHJpbmcoMCwgZGlyLmxhc3RJbmRleE9mKCcvJykpOworICAgICAgICB9CisKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuQlJPV1NFUl9GUkFNRSkgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiQnJvd3NlckZyYW1lIGNvbnN0cnVjdG9yOiB0aGlzPSIgKyB0aGlzKTsKICAgICAgICAgfQpAQCAtNTEwLDEyICs1MTcsMjEgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZXh0ZXJuYWxSZXByZXNlbnRhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB2aXN1YWwgdGV4dCBvZiB0aGUgY3VycmVudCBmcmFtZSwgcHV0cyBpdCBhcyB0aGUgb2JqZWN0IGZvcgorICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGZyYW1lcywgcHV0cyBpdCBhcyB0aGUgb2JqZWN0IGZvcgogICAgICAqIHRoZSBtZXNzYWdlIGFuZCBzZW5kcyB0aGUgbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIG1lc3NhZ2UgdG8gdXNlIHRvIHNlbmQgdGhlIHZpc3VhbCB0ZXh0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZG9jdW1lbnRBc1RleHQoTWVzc2FnZSBjYWxsYmFjaykgewotICAgICAgICBjYWxsYmFjay5vYmogPSBkb2N1bWVudEFzVGV4dCgpOzsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLmFyZzEgIT0gMCkgeworICAgICAgICAgICAgLy8gRHVtcCB0b3AgZnJhbWUgYXMgdGV4dC4KKyAgICAgICAgICAgIHRleHQuYXBwZW5kKGRvY3VtZW50QXNUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcyICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgY2hpbGQgZnJhbWVzIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChjaGlsZEZyYW1lc0FzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjay5vYmogPSB0ZXh0LnRvU3RyaW5nKCk7CiAgICAgICAgIGNhbGxiYWNrLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIApAQCAtNTI0LDYgKzU0MCwxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBkb2N1bWVudEFzVGV4dCgpOwogCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0ZXh0IGRyYXduIG9uIHRoZSBjaGlsZCBmcmFtZXMgYXMgYSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgY2hpbGRGcmFtZXNBc1RleHQoKTsKKwogICAgIC8qCiAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYkNvcmUgdG8gaW5mb3JtIHRoZSBmcmFtZSB0aGF0CiAgICAgICogdGhlIEphdmFzY3JpcHQgd2luZG93IG9iamVjdCBoYXMgYmVlbiBjbGVhcmVkLgpAQCAtNjE3LDYgKzYzOCwxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBKTkkuIEdldHMgdGhlIGFwcGxpY2F0aW9ucyBkYXRhIGRpcmVjdG9yeQorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSBhcHBsaWNhdGlvbnMgZGF0YSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YURpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHNEYXRhRGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgogICAgICAqIFN0YXJ0IGxvYWRpbmcgYSByZXNvdXJjZS4KICAgICAgKiBAcGFyYW0gbG9hZGVySGFuZGxlIFRoZSBuYXRpdmUgUmVzb3VyY2VMb2FkZXIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZGF0YS4KQEAgLTc4NSwxMSArODE0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBCcm93c2VyRnJhbWUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgbmV3IFdlYlZpZXcuCiAgICAgICovCiAgICAgcHJpdmF0ZSBCcm93c2VyRnJhbWUgY3JlYXRlV2luZG93KGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlKSB7Ci0gICAgICAgIFdlYlZpZXcgdyA9IG1DYWxsYmFja1Byb3h5LmNyZWF0ZVdpbmRvdyhkaWFsb2csIHVzZXJHZXN0dXJlKTsKLSAgICAgICAgaWYgKHcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHcuZ2V0V2ViVmlld0NvcmUoKS5nZXRCcm93c2VyRnJhbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFja1Byb3h5LmNyZWF0ZVdpbmRvdyhkaWFsb2csIHVzZXJHZXN0dXJlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg0Niw2ICs4NzEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1VQTE9BRF9MQUJFTCA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU0VUX0xBQkVMID0gNTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCTUlUX0xBQkVMID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTk9fRklMRV9DSE9TRU4gPSA3OwogCiAgICAgU3RyaW5nIGdldFJhd1Jlc0ZpbGVuYW1lKGludCBpZCkgewogICAgICAgICBpbnQgcmVzaWQ7CkBAIC04NzUsNiArOTAxLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnN1Ym1pdCk7CiAKKyAgICAgICAgICAgIGNhc2UgRklMRV9VUExPQURfTk9fRklMRV9DSE9TRU46CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm5vX2ZpbGVfY2hvc2VuKTsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJnZXRSYXdSZXNGaWxlbmFtZSBnb3QgaW5jb21wYXRpYmxlIHJlc291cmNlIElEIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKaW5kZXggMGUwZTAzMi4uNDI3M2JjMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTQxLDYgKzQyLDcgQEAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyBhIHByb3h5IGNsYXNzIGZvciBoYW5kbGluZyBXZWJDb3JlIC0+IFVJIHRocmVhZCBtZXNzYWdpbmcuIEFsbApAQCAtNTAwLDE4ICs1MDIsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNBbGVydChtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0SnNEaWFsb2dUaXRsZSh1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcub2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGljaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNvbmZpcm0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDYW5jZWxhYmxlKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T25DYW5jZWxMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CkBAIC01MjUsNiArNTQxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQ29uZmlybShtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0SnNEaWFsb2dUaXRsZSh1cmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShtZXNzYWdlKQpAQCAtNTY1LDYgKzU4OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc1Byb21wdChtV2ViVmlldywgdXJsLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsLCByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMYXlvdXRJbmZsYXRlciBmYWN0b3J5ID0gTGF5b3V0SW5mbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20obUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gZmFjdG9yeS5pbmZsYXRlKFIubGF5b3V0LmpzX3Byb21wdCwKQEAgLTYxNiw2ICs2NDgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNCZWZvcmVVbmxvYWQobVdlYlZpZXcsIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbSA9IG1Db250ZXh0LmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuanNfZGlhbG9nX2JlZm9yZV91bmxvYWQsIG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCkBAIC03MjUsNyArNzY1LDggQEAKIAogICAgICAgICAgICAgY2FzZSBPUEVOX0ZJTEVfQ0hPT1NFUjoKICAgICAgICAgICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub3BlbkZpbGVDaG9vc2VyKChVcGxvYWRGaWxlKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIGRhdGEgPSAoVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub3BlbkZpbGVDaG9vc2VyKGRhdGEuZ2V0VXBsb2FkRmlsZSgpLCBkYXRhLmdldEFjY2VwdFR5cGUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMDg3LDEwICsxMTI4LDE1IEBACiAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoaW50IG5ld1Byb2dyZXNzKSB7CiAgICAgICAgIC8vIFN5bmNocm9uaXplIHNvIHRoYXQgbUxhdGVzdFByb2dyZXNzIGlzIHVwLXRvLWRhdGUuCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCB8fCBtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBtTGF0ZXN0UHJvZ3Jlc3MgZXZlbiBtV2ViQ2hyb21lQ2xpZW50IGlzIG51bGwgYXMKKyAgICAgICAgICAgIC8vIFdlYlZpZXcuZ2V0UHJvZ3Jlc3MoKSBuZWVkcyBpdAorICAgICAgICAgICAgaWYgKG1MYXRlc3RQcm9ncmVzcyA9PSBuZXdQcm9ncmVzcykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXRlc3RQcm9ncmVzcyA9IG5ld1Byb2dyZXNzOworICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbVByb2dyZXNzVXBkYXRlUGVuZGluZykgewogICAgICAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoUFJPR1JFU1MpOwogICAgICAgICAgICAgICAgIG1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcgPSB0cnVlOwpAQCAtMTA5OCw3ICsxMTQ0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBXZWJWaWV3IGNyZWF0ZVdpbmRvdyhib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSkgeworICAgIHB1YmxpYyBCcm93c2VyRnJhbWUgY3JlYXRlV2luZG93KGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlKSB7CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgogICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCA9PSBudWxsKSB7CkBAIC0xMTIyLDkgKzExNjgsMTUgQEAKIAogICAgICAgICBXZWJWaWV3IHcgPSB0cmFuc3BvcnQuZ2V0V2ViVmlldygpOwogICAgICAgICBpZiAodyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3LmdldFdlYlZpZXdDb3JlKCkuaW5pdGlhbGl6ZVN1YndpbmRvdygpOworICAgICAgICAgICAgV2ViVmlld0NvcmUgY29yZSA9IHcuZ2V0V2ViVmlld0NvcmUoKTsKKyAgICAgICAgICAgIC8vIElmIFdlYlZpZXcuZGVzdHJveSgpIGhhcyBiZWVuIGNhbGxlZCwgY29yZSBtYXkgYmUgbnVsbC4gIFNraXAKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGluIHRoYXQgY2FzZSBhbmQgcmV0dXJuIG51bGwuCisgICAgICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29yZS5pbml0aWFsaXplU3Vid2luZG93KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcmUuZ2V0QnJvd3NlckZyYW1lKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdEZvY3VzKCkgewpAQCAtMTQyNiw2ICsxNDc4LDI0IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIHsKKyAgICAgICAgcHJpdmF0ZSBVcGxvYWRGaWxlIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2VwdFR5cGU7CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGVNZXNzYWdlRGF0YShVcGxvYWRGaWxlIHVwbG9hZEZpbGUsIFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSB1cGxvYWRGaWxlOworICAgICAgICAgICAgbUFjY2VwdFR5cGUgPSBhY2NlcHRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjY2VwdFR5cGU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIFVwbG9hZEZpbGUgaW1wbGVtZW50cyBWYWx1ZUNhbGxiYWNrPFVyaT4gewogICAgICAgICBwcml2YXRlIFVyaSBtVmFsdWU7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZVZhbHVlKFVyaSB2YWx1ZSkgewpAQCAtMTQ0MiwxMyArMTUxMiwxNCBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJWaWV3Q29yZSB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgTWVzc2FnZSBteU1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9QRU5fRklMRV9DSE9PU0VSKTsKICAgICAgICAgVXBsb2FkRmlsZSB1cGxvYWRGaWxlID0gbmV3IFVwbG9hZEZpbGUoKTsKLSAgICAgICAgbXlNZXNzYWdlLm9iaiA9IHVwbG9hZEZpbGU7CisgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gbmV3IFVwbG9hZEZpbGVNZXNzYWdlRGF0YSh1cGxvYWRGaWxlLCBhY2NlcHRUeXBlKTsKKyAgICAgICAgbXlNZXNzYWdlLm9iaiA9IGRhdGE7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXlNZXNzYWdlKTsKICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKaW5kZXggMjQzMDZmNC4uMTgzYjNjMCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQpAQCAtNjIsOSArNjIsMTAgQEAKICAgICAvKioKICAgICAgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CiAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CiAgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICByZXR1cm4gbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlIHx8IG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlOwogICAgIH0KIAogICAgIC8qKgpAQCAtODcsNiArODgsOCBAQAogICAgICAgICAgICAgICAgIC8vIG9ubHkgdW5yZWdpc3RlciBmcm9tIGFsbCwgdGhlbiByZXJlZ2lzdGVyIHdpdGggYWxsIGJ1dCB0aGUgR1BTLgogICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCk7CiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwcm92aWRlcnMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhZnRlciB3ZSByZS1yZWdpc3Rlci4KKyAgICAgICAgICAgICAgICBtYXliZVJlcG9ydEVycm9yKCJUaGUgbGFzdCBsb2NhdGlvbiBwcm92aWRlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTYsMTEgKzE1OSwxNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIG1heSBmYWlsIGlmIHByb3ZpZGVycyBhcmUgbm90IHByZXNlbnQgb24gdGhlIGRldmljZS4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CiAgICAgICAgICAgICBpZiAobUlzR3BzRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsIDAsIDAsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2F1Z2h0IHNlY3VyaXR5IGV4Y2VwdGlvbiByZWdpc3RlcmluZyBmb3IgbG9jYXRpb24gdXBkYXRlcyBmcm9tIHN5c3RlbS4gIiArCkBAIC0xNzMsNiArMTgxLDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckZyb21Mb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVtb3ZlVXBkYXRlcyh0aGlzKTsKKyAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjkyODgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCisvKioKKyAqIDxwPkhUTUw1IHN1cHBvcnQgY2xhc3MgZm9yIEF1ZGlvLgorICovCitjbGFzcyBIVE1MNUF1ZGlvIGV4dGVuZHMgSGFuZGxlcgorICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyIHsKKyAgICAvLyBMb2dnaW5nIHRhZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIkhUTUw1QXVkaW8iOworCisgICAgcHJpdmF0ZSBNZWRpYVBsYXllciBtTWVkaWFQbGF5ZXI7CisKKyAgICAvLyBUaGUgQysrIE1lZGlhUGxheWVyUHJpdmF0ZUFuZHJvaWQgb2JqZWN0LgorICAgIHByaXZhdGUgaW50IG1OYXRpdmVQb2ludGVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElETEUgICAgICAgID0gIDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElOSVRJQUxJWkVEID0gIDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBSRVBBUkVEICAgID0gIDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVJURUQgICAgID0gIDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IENPTVBMRVRFICAgID0gIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBBVVNFRCAgICAgID0gIDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUT1BQRUQgICAgID0gLTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUk9SICAgICAgID0gLTE7CisKKyAgICBwcml2YXRlIGludCBtU3RhdGUgPSBJRExFOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVVybDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFza1RvUGxheSA9IGZhbHNlOworCisgICAgLy8gVGltZXIgdGhyZWFkIC0+IFVJIHRocmVhZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFID0gMTAwOworCisgICAgLy8gVGhlIHNwZWMgc2F5cyB0aGUgdGltZXIgc2hvdWxkIGZpcmUgZXZlcnkgMjUwIG1zIG9yIGxlc3MuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVVUERBVEVfUEVSSU9EID0gMjUwOyAgLy8gbXMKKyAgICAvLyBUaGUgdGltZXIgZm9yIHRpbWV1cGF0ZSBldmVudHMuCisgICAgLy8gU2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2V2ZW50LW1lZGlhLXRpbWV1cGRhdGUKKyAgICBwcml2YXRlIFRpbWVyIG1UaW1lcjsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFRpbWV1cGRhdGVUYXNrIGV4dGVuZHMgVGltZXJUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgSFRNTDVBdWRpby50aGlzLm9idGFpbk1lc3NhZ2UoVElNRVVQREFURSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgVElNRVVQREFURTogeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gRVJST1IgJiYgbU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVPblRpbWV1cGRhdGUocG9zaXRpb24sIG1OYXRpdmVQb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGV2ZW50IGxpc3RlbmVycyBmb3IgTWVkaWFQbGF5ZXIKKyAgICAvLyBUaG9zZSBhcmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgdGhyZWFkIHdlIGNyZWF0ZWQgdGhlIE1lZGlhUGxheWVyCisgICAgLy8gKGkuZS4gdGhlIHdlYnZpZXdjb3JlIHRocmVhZCBoZXJlKQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyIG1wLCBpbnQgcGVyY2VudCkgeworICAgICAgICBuYXRpdmVPbkJ1ZmZlcmluZyhwZXJjZW50LCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXI7CisgICAgcHVibGljIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgbmF0aXZlT25FbmRlZChtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyCisgICAgcHVibGljIGJvb2xlYW4gb25FcnJvcihNZWRpYVBsYXllciBtcCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllciBtcCkgeworICAgICAgICBtU3RhdGUgPSBQUkVQQVJFRDsKKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuc2NoZWR1bGUobmV3IFRpbWV1cGRhdGVUYXNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVVQREFURV9QRVJJT0QsIFRJTUVVUERBVEVfUEVSSU9EKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVPblByZXBhcmVkKG1wLmdldER1cmF0aW9uKCksIDAsIDAsIG1OYXRpdmVQb2ludGVyKTsKKyAgICAgICAgaWYgKG1Bc2tUb1BsYXkpIHsKKyAgICAgICAgICAgIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKyAgICAgICAgICAgIHBsYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvblNlZWtDb21wbGV0ZShNZWRpYVBsYXllciBtcCkgeworICAgICAgICBuYXRpdmVPblRpbWV1cGRhdGUobXAuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYXRpdmVQdHIgaXMgdGhlIEMrKyBwb2ludGVyIHRvIHRoZSBNZWRpYVBsYXllclByaXZhdGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBIVE1MNUF1ZGlvKGludCBuYXRpdmVQdHIpIHsKKyAgICAgICAgLy8gU2F2ZSB0aGUgbmF0aXZlIHB0cgorICAgICAgICBtTmF0aXZlUG9pbnRlciA9IG5hdGl2ZVB0cjsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldE1lZGlhUGxheWVyKCkgeworICAgICAgICBpZiAobU1lZGlhUGxheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkNvbXBsZXRpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uRXJyb3JMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uUHJlcGFyZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU2Vla0NvbXBsZXRlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVyID0gbmV3IFRpbWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERhdGFTb3VyY2UoU3RyaW5nIHVybCkgeworICAgICAgICBtVXJsID0gdXJsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJRExFKSB7CisgICAgICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UodXJsKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmVBc3luYygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJjb3VsZG4ndCBsb2FkIHRoZSByZXNvdXJjZTogIiArIHVybCArICIgZXhjOiAiICsgZSk7CisgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGxheSgpIHsKKyAgICAgICAgaWYgKChtU3RhdGUgPT0gRVJST1IgfHwgbVN0YXRlID09IElETEUpICYmIG1VcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShtVXJsKTsKKyAgICAgICAgICAgIG1Bc2tUb1BsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFSVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhdXNlKCkgeworICAgICAgICBpZiAobVN0YXRlID09IFNUQVJURUQpIHsKKyAgICAgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBQQVVTRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VlayhpbnQgbXNlYykgeworICAgICAgICBpZiAobVN0YXRlID49IFBSRVBBUkVEKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKG1zZWMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlYXJkb3duKCkgeworICAgICAgICBtTWVkaWFQbGF5ZXIucmVsZWFzZSgpOworICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSAwOworICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZ2V0TWF4VGltZVNlZWthYmxlKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkgLyAxMDAwLjBmOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25CdWZmZXJpbmcoaW50IHBlcmNlbnQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uRW5kZWQoaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25QcmVwYXJlZChpbnQgZHVyYXRpb24sIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25UaW1ldXBkYXRlKGludCBwb3NpdGlvbiwgaW50IG5hdGl2ZVBvaW50ZXIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCmluZGV4IGU3NjY2OTMuLmVjYWQyNjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKQEAgLTE2LDEwICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGZpbmFsIGNsYXNzIEpXZWJDb3JlSmF2YUJyaWRnZSBleHRlbmRzIEhhbmRsZXIgewpAQCAtNDksMTIgKzUxLDE1IEBACiAgICAgLyogcGFja2FnZSAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9QTFVHSU5TID0gMTAwOwogCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXA7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSldlYkNvcmVKYXZhQnJpZGdlIHRvIGludGVyZmFjZSB3aXRoCiAgICAgICogV2ViQ29yZSB0aW1lcnMgYW5kIGNvb2tpZXMuCiAgICAgICovCiAgICAgcHVibGljIEpXZWJDb3JlSmF2YUJyaWRnZSgpIHsKICAgICAgICAgbmF0aXZlQ29uc3RydWN0b3IoKTsKKwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjY3LDYgKzI3MiwyOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gQ2FsbGVkIG9uIHRoZSBXZWJDb3JlIHRocmVhZCB0aHJvdWdoIEpOSS4KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlRmlsZVBhdGhGb3JDb250ZW50VXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZhaWxzYWZlIGZhbGxiYWNrIHRvIGp1c3QgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudC4KKyAgICAgICAgLy8gKFNlZSBPcGVuYWJsZUNvbHVtbnMgZG9jdW1lbnRhdGlvbiBpbiB0aGUgU0RLKQorICAgICAgICBVcmkgalVyaSA9IFVyaS5wYXJzZSh1cmkpOworICAgICAgICByZXR1cm4galVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnRVcmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAucHV0KGNvbnRlbnRVcmksIHBhdGgpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ29uc3RydWN0b3IoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZpbmFsaXplKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzaGFyZWRUaW1lckZpcmVkKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQppbmRleCA1OThmMjBkLi4wZjAzMjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC4qOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNzYsNiArODEsMTkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEh0dHBBdXRoSGFuZGxlciBtSHR0cEF1dGhIYW5kbGVyOwogCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudGx5IHVzZWQgbmV0d29yayBjb25uZWN0aW9uIGlzIGEgcm9hbWluZyBwaG9uZQorICAgICAqIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb2FtaW5nOworCisgICAgLyoqCisgICAgICogVHJhY2tzIGlmIHdlIGFyZSByb2FtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgUm9hbWluZ01vbml0b3IgbVJvYW1pbmdNb25pdG9yOworCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBuZXR3b3JrLgogICAgICAqLwpAQCAtMTA3LDYgKzEyNSw3IEBACiAgICAgICAgIGlmICgrK3NQbGF0Zm9ybU5vdGlmaWNhdGlvbkVuYWJsZVJlZkNvdW50ID09IDEpIHsKICAgICAgICAgICAgIGlmIChzTmV0d29yayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc05ldHdvcmsubVJlcXVlc3RRdWV1ZS5lbmFibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5tb25pdG9yUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTEyMSw2ICsxNDAsNyBAQAogICAgICAgICBpZiAoLS1zUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgICAgIHNOZXR3b3JrLnN0b3BNb25pdG9yaW5nUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xMzYsMTIgKzE1NiwzOSBAQAogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLmVxdWFscyhXZWJWaWV3Q29yZS5USFJFQURfTkFNRSkpOwogICAgICAgICB9CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVNzbEVycm9ySGFuZGxlciA9IG5ldyBTc2xFcnJvckhhbmRsZXIoKTsKICAgICAgICAgbUh0dHBBdXRoSGFuZGxlciA9IG5ldyBIdHRwQXV0aEhhbmRsZXIodGhpcyk7CiAKICAgICAgICAgbVJlcXVlc3RRdWV1ZSA9IG5ldyBSZXF1ZXN0UXVldWUoY29udGV4dCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBSb2FtaW5nTW9uaXRvciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmICghQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IChOZXR3b3JrSW5mbylpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpCisgICAgICAgICAgICAgICAgbVJvYW1pbmcgPSBpbmZvLmlzUm9hbWluZygpOworICAgICAgICB9OworICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbW9uaXRvclJvYW1pbmcoKSB7CisgICAgICAgIG1Sb2FtaW5nTW9uaXRvciA9IG5ldyBSb2FtaW5nTW9uaXRvcigpOworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKENvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTik7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoc05ldHdvcmsubVJvYW1pbmdNb25pdG9yLCBmaWx0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wTW9uaXRvcmluZ1JvYW1pbmcoKSB7CisgICAgICAgIGlmIChtUm9hbWluZ01vbml0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Sb2FtaW5nTW9uaXRvcik7CisgICAgICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCBhIHVybCBmcm9tIGVpdGhlciB0aGUgbmV0d29yayBvciB0aGUgZmlsZSBzeXN0ZW0uCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCkBAIC0xNzAsNiArMjE3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlZmV0Y2gsIGFib3J0IGl0IGlmIHdlJ3JlIHJvYW1pbmcuCisgICAgICAgIGlmIChtUm9hbWluZyAmJiBoZWFkZXJzLmNvbnRhaW5zS2V5KCJYLU1veiIpICYmICJwcmVmZXRjaCIuZXF1YWxzKGhlYWRlcnMuZ2V0KCJYLU1veiIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgbGFtZS4gIFBhc3MgYW4gSW5wdXRTdHJlYW0gaW4sIHJhdGhlciB0aGFuCiAgICAgICAgICAgIG1ha2luZyB0aGlzIGxhbWUgb25lIGhlcmUgKi8KICAgICAgICAgSW5wdXRTdHJlYW0gYm9keVByb3ZpZGVyID0gbnVsbDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQppbmRleCAxZDVhYWM3Li5lZDA2YTNhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCkBAIC0zMTQsMTAgKzMxNCwyNyBAQAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIGNsaWVudCB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqIEBwYXJhbSB1cGxvYWRGaWxlIEEgVmFsdWVDYWxsYmFjayB0byBzZXQgdGhlIFVSSSBvZiB0aGUgZmlsZSB0byB1cGxvYWQuCi0gICAgICogICAgICBvblJlY2VpdmVWYWx1ZSBtdXN0IGJlIGNhbGxlZCB0byB3YWtlIHVwIHRoZSB0aHJlYWQuCisgICAgICogICAgICBvblJlY2VpdmVWYWx1ZSBtdXN0IGJlIGNhbGxlZCB0byB3YWtlIHVwIHRoZSB0aHJlYWQuYQorICAgICAqIEBwYXJhbSBhY2NlcHRUeXBlIFRoZSB2YWx1ZSBvZiB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZSBpbnB1dCB0YWcKKyAgICAgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgcGlja2VyLgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlbkZpbGVDaG9vc2VyKFZhbHVlQ2FsbGJhY2s8VXJpPiB1cGxvYWRGaWxlKSB7CisgICAgcHVibGljIHZvaWQgb3BlbkZpbGVDaG9vc2VyKFZhbHVlQ2FsbGJhY2s8VXJpPiB1cGxvYWRGaWxlLCBTdHJpbmcgYWNjZXB0VHlwZSkgewogICAgICAgICB1cGxvYWRGaWxlLm9uUmVjZWl2ZVZhbHVlKG51bGwpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFRlbGwgdGhlIGNsaWVudCB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZWxlY3Rpb25TdGFydCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGNvcGllZCBvciBjYW5jZWxlZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uRG9uZSgpIHsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKaW5kZXggYjc2N2YxMS4uZmFiZGEwOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKQEAgLTE4NCw2ICsxODQsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Eb21TdG9yYWdlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Xb3JrZXJzRW5hYmxlZCA9IGZhbHNlOyAgLy8gb25seSBhZmZlY3RzIFY4LgogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1HZW9sb2NhdGlvbkVuYWJsZWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1YU1NBdWRpdG9yRW5hYmxlZCA9IGZhbHNlOwogICAgIC8vIEhUTUw1IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgIHByaXZhdGUgbG9uZyAgICAgICAgICAgIG1BcHBDYWNoZU1heFNpemUgPSBMb25nLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICBtQXBwQ2FjaGVQYXRoID0gIiI7CkBAIC0yMDcsNiArMjA4LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQnVpbHRJblpvb21Db250cm9scyA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1BbGxvd0ZpbGVBY2Nlc3MgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Mb2FkV2l0aE92ZXJ2aWV3TW9kZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZmFsc2U7CiAKICAgICAvLyBwcml2YXRlIFdlYlNldHRpbmdzLCBub3QgYWNjZXNzaWJsZSBieSB0aGUgaG9zdCBhY3Rpdml0eQogICAgIHN0YXRpYyBwcml2YXRlIGludCAgICAgIG1Eb3VibGVUYXBUb2FzdENvdW50ID0gMzsKQEAgLTI5NiwxMyArMjk4LDEzIEBACiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgSW50ZWwgTWFjIE9TIFggMTBfNV83OyBlbi11cykiCiAgICAgICAgICAgICArICIgQXBwbGVXZWJLaXQvNTMwLjE3IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAiCiAgICAgICAgICAgICArICIgU2FmYXJpLzUzMC4xNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBIT05FX1VTRVJBR0VOVCA9CiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIGlQaG9uZSBPUyAzXzAgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUyOC4xOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIE1vYmlsZS83QTM0MSBTYWZhcmkvNTI4LjE2IjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgc0xvY2FsZTsKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2tGb3JMb2NhbGVTZXR0aW5nczsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFBhY2thZ2UgY29uc3RydWN0b3IgdG8gcHJldmVudCBjbGllbnRzIGZyb20gY3JlYXRpbmcgYSBuZXcgc2V0dGluZ3MKICAgICAgKiBpbnN0YW5jZS4KQEAgLTMyNyw2ICszMjksOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUgPSAiZW4tVVMiOworCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgcmV0dXJucyBjdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgQWNjZXB0TGFuZ3VhZ2UgU3RyaW5nLgpAQCAtMzM2LDMyICszNDAsNTMgQEAKICAgICAgICAgc3luY2hyb25pemVkKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MpIHsKICAgICAgICAgICAgIGxvY2FsZSA9IHNMb2NhbGU7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShidWZmZXIsIGxvY2FsZSk7CisKKyAgICAgICAgaWYgKCFMb2NhbGUuVVMuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5Mb2NhbGUgdXMgPSBMb2NhbGUuVVM7Ci0gICAgICAgICAgICBpZiAodXMuZ2V0TGFuZ3VhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh1cy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IHVzLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb2Jzb2xldGUgbGFuZ3VhZ2UgY29kZXMsIGluY2x1ZGluZyBIZWJyZXcvSW5kb25lc2lhbi9ZaWRkaXNoLAorICAgICAqIHRvIG5ldyBzdGFuZGFyZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcoU3RyaW5nIGxhbmdDb2RlKSB7CisgICAgICAgIGlmIChsYW5nQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIml3Ii5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBIZWJyZXcKKyAgICAgICAgICAgIHJldHVybiAiaGUiOworICAgICAgICB9IGVsc2UgaWYgKCJpbiIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSW5kb25lc2lhbgorICAgICAgICAgICAgcmV0dXJuICJpZCI7CisgICAgICAgIH0gZWxzZSBpZiAoImppIi5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBZaWRkaXNoCisgICAgICAgICAgICByZXR1cm4gInlpIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFuZ0NvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxhbmd1YWdlKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvdW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgbUNvbnRleHQgYW5kIHJldHVybnMgY3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgogICAgICAqIEByZXR1cm4gQ3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgpAQCAtMzc5LDExICs0MDQsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gIjEuMCIKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjEuMCIpOwotICAgICAgICB9ICAKKyAgICAgICAgfQogICAgICAgICBidWZmZXIuYXBwZW5kKCI7ICIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxhbmd1YWdlKSk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CiAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwpAQCAtNDI2LDYgKzQ1MSwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIElmIFdlYlZpZXcgb25seSBzdXBwb3J0cyB0b3VjaCwgYSBkaWZmZXJlbnQgbmF2aWdhdGlvbiBtb2RlbCB3aWxsIGJlCisgICAgICogYXBwbGllZC4gT3RoZXJ3aXNlLCB0aGUgbmF2aWdhdGlvbiB0byBzdXBwb3J0IGJvdGggdG91Y2ggYW5kIGtleWJvYXJkCisgICAgICogd2lsbCBiZSB1c2VkLgorICAgICAqIEBoaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydFRvdWNoT25seShib29sZWFuIHRvdWNoT25seSkgeworICAgICAgICBtU3VwcG9ydFRvdW5jaE9ubHkgPSB0b3VjaE9ubHk7CisgICAgfQorICAgICAqLworCisgICAgYm9vbGVhbiBzdXBwb3J0VG91Y2hPbmx5KCkgeworICAgICAgICAvLyBmb3IgZGVidWcgb25seSwgdXNlIG1MaWdodFRvdWNoRW5hYmxlZCBmb3IgbVN1cHBvcnRUb3VuY2hPbmx5CisgICAgICAgIHJldHVybiBtTGlnaHRUb3VjaEVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgc3VwcG9ydHMgem9vbQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRab29tKGJvb2xlYW4gc3VwcG9ydCkgewpAQCAtNDg1LDYgKzUyNSwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHdpbGwgZW5hYmxlIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLiBJZiBpdCBpcyB0cnVlLCBXZWJWaWV3IHdpbGwgY2hvb3NlIGEgc29sdXRpb24gdG8gbWF4aW1pemUgdGhlCisgICAgICogcGVyZm9ybWFuY2UuIGUuZy4gdGhlIFdlYlZpZXcncyBjb250ZW50IG1heSBub3QgYmUgdXBkYXRlZCBkdXJpbmcgdGhlCisgICAgICogdHJhbnNpdGlvbi4gSWYgaXQgaXMgZmFsc2UsIFdlYlZpZXcgd2lsbCBrZWVwIGl0cyBmaWRlbGl0eS4gVGhlIGRlZmF1bHQKKyAgICAgKiB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVTbW9vdGhUcmFuc2l0aW9uKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViVmlldyBlbmFibGVzIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVNtb290aFRyYW5zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRW5hYmxlU21vb3RoVHJhbnNpdGlvbjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdG9yZSB3aGV0aGVyIHRoZSBXZWJWaWV3IGlzIHNhdmluZyBmb3JtIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2F2ZUZvcm1EYXRhKGJvb2xlYW4gc2F2ZSkgewpAQCAtMTE3Niw2ICsxMjM1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIFhTUyBBdWRpdG9yIGlzIGVuYWJsZWQuCisgICAgICogQHBhcmFtIGZsYWcgV2hldGhlciBYU1MgQXVkaXRvciBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgTGF5b3V0VGVzdENvbnRyb2xsZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVhTU0F1ZGl0b3JFbmFibGVkICE9IGZsYWcpIHsKKyAgICAgICAgICAgIG1YU1NBdWRpdG9yRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgamF2YXNjcmlwdCBpcyBlbmFibGVkLiA8Yj5Ob3RlOiBUaGUgZGVmYXVsdCBpcyBmYWxzZS48L2I+CiAgICAgICogQHJldHVybiBUcnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKaW5kZXggMTlhYmVjMS4uZWIzNmI1ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKQEAgLTMwMCw2ICszMDEsMzMgQEAKICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW4gZ2VuZXJhbCwgVGV4dFZpZXcgbWFrZXMgYSBjYWxsIHRvIElucHV0TWV0aG9kTWFuYWdlci51cGRhdGVTZWxlY3Rpb24KKyAgICAgKiBpbiBvbkRyYXcuICBIb3dldmVyLCBpbiB0aGUgZ2VuZXJhbCBjYXNlIG9mIFdlYlRleHRWaWV3LCB3ZSBkbyBub3QgZHJhdy4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgV2ViVmlldy5vbkRyYXcgdG8gdGFrZSBjYXJlIG9mIHRoZSBwYXJ0IHRoYXQKKyAgICAgKiBuZWVkcyB0byBiZSBjYWxsZWQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIG9uRHJhd1N1YnN0aXR1dGUoKSB7CisgICAgICAgIGlmICghd2lsbE5vdERyYXcoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIFdlYlRleHRWaWV3IGlzIHNldCB0byBkcmF3LCBzdWNoIGFzIGluIHRoZSBjYXNlIG9mIGEKKyAgICAgICAgICAgIC8vIHBhc3N3b3JkLCBvbkRyYXcgY2FsbHMgdXBkYXRlU2VsZWN0aW9uKCksIHNvIHRoaXMgY29kZSBwYXRoIGlzCisgICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gVGV4dFZpZXcub25EcmF3KCkuICBUaGF0IGNvZGUgZG9lcyBub3QgZ2V0CisgICAgICAgIC8vIGV4ZWN1dGVkLCBob3dldmVyLCBiZWNhdXNlIHRoZSBXZWJUZXh0VmlldyBkb2VzIG5vdCBkcmF3LCBhbGxvd2luZworICAgICAgICAvLyB3ZWJraXQncyBkcmF3aW5nIHRvIHNob3cgdGhyb3VnaC4KKyAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKGltbSAhPSBudWxsICYmIGltbS5pc0FjdGl2ZSh0aGlzKSkgeworICAgICAgICAgICAgU3Bhbm5hYmxlIHNwID0gKFNwYW5uYWJsZSkgZ2V0VGV4dCgpOworICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHNwKTsKKyAgICAgICAgICAgIGludCBzZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHNwKTsKKyAgICAgICAgICAgIGludCBjYW5kU3RhcnQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuU3RhcnQoc3ApOworICAgICAgICAgICAgaW50IGNhbmRFbmQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuRW5kKHNwKTsKKyAgICAgICAgICAgIGltbS51cGRhdGVTZWxlY3Rpb24odGhpcywgc2VsU3RhcnQsIHNlbEVuZCwgY2FuZFN0YXJ0LCBjYW5kRW5kKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CiAgICAgICAgIC8vIG9uRHJhdyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIHBhc3N3b3JkIGZpZWxkcy4gIElmIFdlYlRleHRWaWV3IGlzCkBAIC0zNjAsMTkgKzM4OCw4IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNlbGVjdGlvbkNoYW5nZWQoaW50IHNlbFN0YXJ0LCBpbnQgc2VsRW5kKSB7Ci0gICAgICAgIGlmIChtSW5TZXRUZXh0QW5kS2VlcFNlbGVjdGlvbikgcmV0dXJuOwotICAgICAgICAvLyBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gVGV4dFZpZXcub25EcmF3KCkuICBUaGF0IGNvZGUgZG9lcyBub3QgZ2V0Ci0gICAgICAgIC8vIGV4ZWN1dGVkLCBob3dldmVyLCBiZWNhdXNlIHRoZSBXZWJUZXh0VmlldyBkb2VzIG5vdCBkcmF3LCBhbGxvd2luZwotICAgICAgICAvLyB3ZWJraXQncyBkcmF3aW5nIHRvIHNob3cgdGhyb3VnaC4KLSAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKGltbSAhPSBudWxsICYmIGltbS5pc0FjdGl2ZSh0aGlzKSkgewotICAgICAgICAgICAgU3Bhbm5hYmxlIHNwID0gKFNwYW5uYWJsZSkgZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGNhbmRTdGFydCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5TdGFydChzcCk7Ci0gICAgICAgICAgICBpbnQgY2FuZEVuZCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5FbmQoc3ApOwotICAgICAgICAgICAgaW1tLnVwZGF0ZVNlbGVjdGlvbih0aGlzLCBzZWxTdGFydCwgc2VsRW5kLCBjYW5kU3RhcnQsIGNhbmRFbmQpOwotICAgICAgICB9CiAgICAgICAgIGlmICghbUZyb21XZWJLaXQgJiYgIW1Gcm9tRm9jdXNDaGFuZ2UgJiYgIW1Gcm9tU2V0SW5wdXRUeXBlCi0gICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICYmIG1XZWJWaWV3ICE9IG51bGwgJiYgIW1JblNldFRleHRBbmRLZWVwU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVEVYVF9WSUVXKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAib25TZWxlY3Rpb25DaGFuZ2VkIHNlbFN0YXJ0PSIgKyBzZWxTdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlbEVuZD0iICsgc2VsRW5kKTsKQEAgLTQ4MSw5ICs0OTgsMTAgQEAKICAgICAgICAgICAgIC8vIHRvIGJpZyBmb3IgdGhlIGNhc2Ugb2YgYSBzbWFsbCB0ZXh0ZmllbGQuCiAgICAgICAgICAgICBpbnQgc21hbGxlclNsb3AgPSBzbG9wLzI7CiAgICAgICAgICAgICBpZiAoZHggPiBzbWFsbGVyU2xvcCB8fCBkeSA+IHNtYWxsZXJTbG9wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2Nyb2xsWCA9IChmbG9hdCkgVG91Y2guZ2V0TWF4U2Nyb2xsWCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXlvdXQoKSwgbVNjcm9sbFkpOworICAgICAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiBsYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhTY3JvbGxYID0gKGZsb2F0KSBUb3VjaC5nZXRNYXhTY3JvbGxYKHRoaXMsIGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9URVhUX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm9uVG91Y2hFdmVudCB4PSIgKyBtU2Nyb2xsWCArICIgeT0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVNjcm9sbFkgKyAiIG1heFg9IiArIG1heFNjcm9sbFgpOwpAQCAtNjY3LDYgKzY4NSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHRleHQsIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKICAgICAgICAgfQorICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgbVdlYlZpZXcuaW5jcmVtZW50VGV4dEdlbmVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTkxOSwxNCArOTM4LDQgQEAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKCkgewogICAgICAgICBtV2ViVmlldy51cGRhdGVDYWNoZWRUZXh0ZmllbGQoZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihSZWN0IHJlY3RhbmdsZSkgewotICAgICAgICAvLyBkb24ndCBzY3JvbGwgd2hpbGUgaW4gem9vbSBhbmltYXRpb24uIFdoZW4gaXQgaXMgZG9uZSwgd2Ugd2lsbCBhZGp1c3QKLSAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IGlmIGl0IGlzIGluIGVkaXRpbmcgbW9kZS4KLSAgICAgICAgaWYgKCFtV2ViVmlldy5pbkFuaW1hdGVab29tKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0UmVjdGFuZ2xlT25TY3JlZW4ocmVjdGFuZ2xlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKaW5kZXggNGNhMjEwZi4uODQyZjEzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCkBAIC0yNSwxOSArMjUsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db3JuZXJQYXRoRWZmZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZTsKQEAgLTQ2LDYgKzQzLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2g7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklDbGlwYm9hcmQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwpAQCAtNjQsMzIgKzYyLDI5IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVGV4dFZpZXcuQXV0b0NvbXBsZXRlQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5FdmVudEh1YjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5Ub3VjaEV2ZW50RGF0YTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5Ub3VjaEhpZ2hsaWdodERhdGE7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzb2x1dGVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tlZFRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMzEwLDQ5ICszMDUsNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAid2VidmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHRlbmRlZFpvb21Db250cm9scyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKLSAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOwotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOwotICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20sIGJvb2xlYW4gY2FuWm9vbU91dCkgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KAotICAgICAgICAgICAgICAgICAgICBzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKLSAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKLSAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOwotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWm9vbUNvbnRyb2xzICAgIG1QbHVzTWludXNab29tQ29udHJvbHM7Ci0gICAgfQorICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOwogCiAgICAgLyoqCiAgICAgICogIFRyYW5zcG9ydGF0aW9uIG9iamVjdCBmb3IgcmV0dXJuaW5nIFdlYlZpZXcgYWNyb3NzIHRocmVhZCBib3VuZGFyaWVzLgpAQCAtMzk4LDYgKzM1MSw4IEBACiAgICAgLy8gbW9yZSBrZXkgZXZlbnRzLgogICAgIHByaXZhdGUgaW50IG1UZXh0R2VuZXJhdGlvbjsKIAorICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBpbmNyZW1lbnRUZXh0R2VuZXJhdGlvbigpIHsgbVRleHRHZW5lcmF0aW9uKys7IH0KKwogICAgIC8vIFVzZWQgYnkgV2ViVmlld0NvcmUgdG8gY3JlYXRlIGNoaWxkIHZpZXdzLgogICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVmlld01hbmFnZXIgbVZpZXdNYW5hZ2VyOwogCkBAIC00NDUsNiArNDAwLDEwIEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtTGFzdFZlbFg7CiAgICAgcHJpdmF0ZSBmbG9hdCBtTGFzdFZlbFk7CiAKKyAgICAvLyBvbmx5IHRyaWdnZXIgYWNjZWxlcmF0ZWQgZmxpbmcgaWYgdGhlIG5ldyB2ZWxvY2l0eSBpcyBhdCBsZWFzdAorICAgIC8vIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiB0aW1lcyBvZiB0aGUgcHJldmlvdXMgdmVsb2NpdHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gPSAwLjJmOworCiAgICAgLyoqCiAgICAgICogVG91Y2ggbW9kZQogICAgICAqLwpAQCAtNDU2LDggKzQxNSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1NIT1JUUFJFU1NfTU9ERSA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPVUJMRV9UQVBfTU9ERSA9IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPTkVfTU9ERSA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1NFTEVDVF9NT0RFID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfUElOQ0hfRFJBRyA9IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1BJTkNIX0RSQUcgPSA4OwogCiAgICAgLy8gV2hldGhlciB0byBmb3J3YXJkIHRoZSB0b3VjaCBldmVudHMgdG8gV2ViQ29yZQogICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yd2FyZFRvdWNoRXZlbnRzID0gZmFsc2U7CkBAIC01MjEsOSArNDc5LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0ZMSU5HX1RJTUUgPSAyNTA7CiAgICAgLy8gZHJhdyB1bmZpbHRlcmVkIGFmdGVyIGRyYWcgaXMgaGVsZCB3aXRob3V0IG1vdmVtZW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVElPTkxFU1NfVElNRSA9IDEwMDsKLSAgICAvLyBUaGUgdGltZSB0aGF0IHRoZSBab29tIENvbnRyb2xzIGFyZSB2aXNpYmxlIGJlZm9yZSBmYWRpbmcgYXdheQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgWk9PTV9DT05UUk9MU19USU1FT1VUID0KLSAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFpvb21Db250cm9sc1RpbWVvdXQoKTsKICAgICAvLyBUaGUgYW1vdW50IG9mIGNvbnRlbnQgdG8gb3ZlcmxhcCBiZXR3ZWVuIHR3byBzY3JlZW5zIHdoZW4gZ29pbmcgdGhyb3VnaAogICAgIC8vIHBhZ2VzIHdpdGggdGhlIHNwYWNlIGJhciwgaW4gcGl4ZWxzLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX1NDUk9MTF9PVkVSTEFQID0gMjQ7CkBAIC01NjQsMTUgKzUxOSwyNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX0lHTk9SRSAgICAgICAgICA9IDM7CiAgICAgcHJpdmF0ZSBpbnQgbUhlbGRNb3Rpb25sZXNzOwogCi0gICAgLy8gd2hldGhlciBzdXBwb3J0IG11bHRpLXRvdWNoCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdXBwb3J0TXVsdGlUb3VjaDsKLSAgICAvLyB1c2UgdGhlIGZyYW1ld29yaydzIFNjYWxlR2VzdHVyZURldGVjdG9yIHRvIGhhbmRsZSBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CisgICAgLy8gQW4gaW5zdGFuY2UgZm9yIGluamVjdGluZyBhY2Nlc3NpYmlsaXR5IGluIFdlYlZpZXdzIHdpdGggZGlzYWJsZWQKKyAgICAvLyBKYXZhU2NyaXB0IG9yIG9uZXMgZm9yIHdoaWNoIG5vIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGV4aXN0cworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUluamVjdG9yIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3I7CiAKLSAgICAvLyB0aGUgYW5jaG9yIHBvaW50IGluIHRoZSBkb2N1bWVudCBzcGFjZSB3aGVyZSBWSUVXX1NJWkVfQ0hBTkdFRCBzaG91bGQKLSAgICAvLyBhcHBseSB0bwotICAgIHByaXZhdGUgaW50IG1BbmNob3JYOwotICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworICAgIC8vIHRoZSBjb2xvciB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgdG91Y2ggcmVjdGFuZ2xlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtSGlnaHRsaWdodENvbG9yID0gMHgzMzAwMDAwMDsKKyAgICAvLyB0aGUgcm91bmQgY29ybmVyIGZvciB0aGUgaGlnaGxpZ2h0IHBhdGgKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBUT1VDSF9ISUdITElHSFRfQVJDID0gNS4wZjsKKyAgICAvLyB0aGUgcmVnaW9uIGluZGljYXRpbmcgd2hlcmUgdGhlIHVzZXIgdG91Y2hlZCBvbiB0aGUgc2NyZWVuCisgICAgcHJpdmF0ZSBSZWdpb24gbVRvdWNoSGlnaGxpZ2h0UmVnaW9uID0gbmV3IFJlZ2lvbigpOworICAgIC8vIHRoZSBwYWludCBmb3IgdGhlIHRvdWNoIGhpZ2hsaWdodAorICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoSGlnaHRsaWdodFBhaW50OworICAgIC8vIGRlYnVnIG9ubHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RPVUNIX0hJR0hMSUdIVCA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0hJR0hMSUdIVF9FTEFQU0VfVElNRSA9IDIwMDA7CisgICAgcHJpdmF0ZSBQYWludCBtVG91Y2hDcm9zc0hhaXJDb2xvcjsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRYOworICAgIHByaXZhdGUgaW50IG1Ub3VjaEhpZ2hsaWdodFk7CiAKICAgICAvKgogICAgICAqIFByaXZhdGUgbWVzc2FnZSBpZHMKQEAgLTYwNiw3ICs1NzAsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQgICAgICAgICA9IDEwNzsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhURklFTERfVEVYVF9NU0dfSUQgICAgICAgPSAxMDg7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfWk9PTV9SQU5HRSAgICAgICAgICAgICAgICAgID0gMTA5OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9PVVRfT0ZfUExVR0lOICAgICAgICAgICAgICAgICA9IDExMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVOSEFORExFRF9OQVZfS0VZICAgICAgICAgICAgICAgICAgPSAxMTA7CiAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9URVhUX0VOVFJZICAgICAgICAgICAgICAgICAgID0gMTExOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCAgICAgICA9IDExMjsKICAgICBzdGF0aWMgZmluYWwgaW50IFNIT1dfUkVDVF9NU0dfSUQgICAgICAgICAgICAgICAgICAgPSAxMTM7CkBAIC02MjcsOSArNTkxLDExIEBACiAgICAgc3RhdGljIGZpbmFsIGludCBDRU5URVJfRklUX1JFQ1QgICAgICAgICAgICAgICAgICAgID0gMTI3OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQgPSAxMjg7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVRfU0NST0xMQkFSX01PREVTICAgICAgICAgICAgICAgID0gMTI5OworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEICAgICAgICAgICA9IDEzMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgICAgICAgICAgPSAxMzE7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFDS0FHRV9NU0dfSUQgPSBTQ1JPTExfVE9fTVNHX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BBQ0tBR0VfTVNHX0lEID0gU0VUX1NDUk9MTEJBUl9NT0RFUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlclByaXZhdGVEZWJ1Z1N0cmluZyA9IHsKICAgICAgICAgIlJFTUVNQkVSX1BBU1NXT1JEIiwgLy8gICAgICAgICAgICAgID0gMTsKQEAgLTY1NCw3ICs2MjAsNyBAQAogICAgICAgICAiV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQiLCAvLyAgICAgPSAxMDc7CiAgICAgICAgICJVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEIiwgLy8gICA9IDEwODsKICAgICAgICAgIlVQREFURV9aT09NX1JBTkdFIiwgLy8gICAgICAgICAgICAgID0gMTA5OwotICAgICAgICAiTU9WRV9PVVRfT0ZfUExVR0lOIiwgLy8gICAgICAgICAgICAgPSAxMTA7CisgICAgICAgICJVTkhBTkRMRURfTkFWX0tFWSIsIC8vICAgICAgICAgICAgICA9IDExMDsKICAgICAgICAgIkNMRUFSX1RFWFRfRU5UUlkiLCAvLyAgICAgICAgICAgICAgID0gMTExOwogICAgICAgICAiVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCIsIC8vICAgPSAxMTI7CiAgICAgICAgICJTSE9XX1JFQ1RfTVNHX0lEIiwgLy8gICAgICAgICAgICAgICA9IDExMzsKQEAgLTY3Myw3ICs2MzksOSBAQAogICAgICAgICAiRklORF9BR0FJTiIsIC8vICAgICAgICAgICAgICAgICAgICAgPSAxMjY7CiAgICAgICAgICJDRU5URVJfRklUX1JFQ1QiLCAvLyAgICAgICAgICAgICAgICA9IDEyNzsKICAgICAgICAgIlJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEIiwgLy8gPSAxMjg7Ci0gICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiAvLyAgICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiLCAvLyAgICAgICAgICAgID0gMTI5OworICAgICAgICAiU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEIiwgLy8gICAgICAgPSAxMzA7CisgICAgICAgICJTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTIiAvLyAgICAgICA9IDEzMTsKICAgICB9OwogCiAgICAgLy8gSWYgdGhlIHNpdGUgZG9lc24ndCB1c2UgdGhlIHZpZXdwb3J0IG1ldGEgdGFnIHRvIHNwZWNpZnkgdGhlIHZpZXdwb3J0LApAQCAtNjg2LDQ5ICs2NTQsOSBAQAogICAgIC8vIHRoZSBtaW5pbXVtIHByZWZlcnJlZCB3aWR0aCBpcyBodWdlLCBhbiB1cHBlciBsaW1pdCBpcyBuZWVkZWQuCiAgICAgc3RhdGljIGludCBzTWF4Vmlld3BvcnRXaWR0aCA9IERFRkFVTFRfVklFV1BPUlRfV0lEVEg7CiAKLSAgICAvLyBkZWZhdWx0IHNjYWxlIGxpbWl0LiBEZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgZGVuc2l0eQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKLSAgICAvLyBzY2FsZSBsaW1pdCwgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIHZpZXdwb3J0IG1ldGEgdGFnIGluIHRoZSB3ZWIgcGFnZQotICAgIHByaXZhdGUgZmxvYXQgbU1heFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1NaW5ab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0KICAgICAvLyBpbml0aWFsIHNjYWxlIGluIHBlcmNlbnQuIDAgbWVhbnMgdXNpbmcgZGVmYXVsdC4KICAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID0gMDsKIAotICAgIC8vIHdoaWxlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUsIHRoZSBwYWdlJ3Mgd2lkdGggaXMgZnVsbHkgZml0IHRvIHRoZQotICAgIC8vIGN1cnJlbnQgd2luZG93LiBUaGUgcGFnZSBpcyBhbGl2ZSwgaW4gYW5vdGhlciB3b3JkcywgeW91IGNhbiBjbGljayB0bwotICAgIC8vIGZvbGxvdyB0aGUgbGlua3MuIERvdWJsZSB0YXAgd2lsbCB0b2dnbGUgYmV0d2VlbiB6b29tIG92ZXJ2aWV3IG1vZGUgYW5kCi0gICAgLy8gdGhlIGxhc3Qgem9vbSBzY2FsZS4KLSAgICBib29sZWFuIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgLy8gaWRlYWxseSBtWm9vbU92ZXJ2aWV3V2lkdGggc2hvdWxkIGJlIG1Db250ZW50V2lkdGguIEJ1dCBzaXRlcyBsaWtlIGVzcG4sCi0gICAgLy8gZW5nYWRnZXQgYWx3YXlzIGhhdmUgd2lkZXIgbUNvbnRlbnRXaWR0aCBubyBtYXR0ZXIgd2hhdCB2aWV3cG9ydCBzaXplIGlzLgotICAgIGludCBtWm9vbU92ZXJ2aWV3V2lkdGggPSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgIGZsb2F0IG1UZXh0V3JhcFNjYWxlOwotCi0gICAgLy8gZGVmYXVsdCBzY2FsZS4gRGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHkuCi0gICAgc3RhdGljIGludCBERUZBVUxUX1NDQUxFX1BFUkNFTlQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdFNjYWxlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQgPSAwLjAxZjsKLQotICAgIC8vIHNldCB0byB0cnVlIHRlbXBvcmFyaWx5IGR1cmluZyBTY2FsZUdlc3R1cmUgdHJpZ2dlcmVkIHpvb20KLSAgICBwcml2YXRlIGJvb2xlYW4gbVByZXZpZXdab29tT25seSA9IGZhbHNlOwotCi0gICAgLy8gY29tcHV0ZWQgc2NhbGUgYW5kIGludmVyc2UsIGZyb20gbVpvb21XaWR0aC4KLSAgICBwcml2YXRlIGZsb2F0IG1BY3R1YWxTY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZBY3R1YWxTY2FsZTsKLSAgICAvLyBpZiB0aGlzIGlzIG5vbi16ZXJvLCBpdCBpcyB1c2VkIG9uIGRyYXdpbmcgcmF0aGVyIHRoYW4gbUFjdHVhbFNjYWxlCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkluaXRpYWxab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxYOwotICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWTsKLSAgICBwcml2YXRlIGxvbmcgbVpvb21TdGFydDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9BTklNQVRJT05fTEVOR1RIID0gNTAwOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VyU2Nyb2xsID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtU25hcFNjcm9sbE1vZGUgPSBTTkFQX05PTkU7CkBAIC03NTIsNiArNjgwLDE5IEBACiAgICAgcHJpdmF0ZSBpbnQgbUhvcml6b250YWxTY3JvbGxCYXJNb2RlID0gU0NST0xMQkFSX0FVVE87CiAgICAgcHJpdmF0ZSBpbnQgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogCisgICAgLy8gdGhlIGFsaWFzIHZpYSB3aGljaCBhY2Nlc3NpYmlsaXR5IEphdmFTY3JpcHQgaW50ZXJmYWNlIGlzIGV4cG9zZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UgPSAiYWNjZXNzaWJpbGl0eSI7CisKKyAgICAvLyBKYXZhU2NyaXB0IHRvIGluamVjdCB0aGUgc2NyaXB0IGNob29zZXIgd2hpY2ggd2lsbAorICAgIC8vIHBpY2sgdGhlIHJpZ2h0IHNjcmlwdCBmb3IgdGhlIGN1cnJlbnQgVVJMCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCA9CisgICAgICAgICJqYXZhc2NyaXB0OihmdW5jdGlvbigpIHsiICsKKyAgICAgICAgIiAgICB2YXIgY2hvb3NlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyIgKworICAgICAgICAiICAgIGNob29zZXIudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOyIgKworICAgICAgICAiICAgIGNob29zZXIuc3JjID0gJ2h0dHBzOi8vc3NsLmdzdGF0aWMuY29tL2FjY2Vzc2liaWxpdHkvamF2YXNjcmlwdC9hbmRyb2lkL0FuZHJvaWRTY3JpcHRDaG9vc2VyLnVzZXIuanMnOyIgKworICAgICAgICAiICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoY2hvb3Nlcik7IiArCisgICAgICAgICIgIH0pKCk7IjsKKwogICAgIC8vIFVzZWQgdG8gbWF0Y2gga2V5IGRvd25zIGFuZCBrZXkgdXBzCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Hb3RLZXlEb3duOwogCkBAIC04NTYsNDMgKzc5Nyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGUgVmlldyBjb250YWluaW5nIHRoZSB6b29tIGNvbnRyb2xzCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBtWm9vbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVpvb21Db250cm9sUnVubmFibGU7Ci0KLSAgICAvLyBtWm9vbUJ1dHRvbnNDb250cm9sbGVyIHdpbGwgYmUgbGF6eSBpbml0aWFsaXplZCBpbgotICAgIC8vIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCi0gICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgbVpvb21CdXR0b25zQ29udHJvbGxlcjsKLQotICAgIC8vIFRoZXNlIGtlZXAgdHJhY2sgb2YgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbS4gIFRoZXkgYXJlIHVzZWQgdG8KLSAgICAvLyBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4KLSAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKLQotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyLk9uWm9vbUxpc3RlbmVyIG1ab29tTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lcigpIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAgICAgICAgIC8vIEJyaW5nIGJhY2sgdGhlIGhpZGRlbiB6b29tIGNvbnRyb2xzLgotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblpvb20oYm9vbGVhbiB6b29tSW4pIHsKLSAgICAgICAgICAgIGlmICh6b29tSW4pIHsKLSAgICAgICAgICAgICAgICB6b29tSW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgfQotICAgIH07Ci0KICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGEgQ29udGV4dCBvYmplY3QuCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCkBAIC05MjgsNTEgKzgzMiwzNyBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgogICAgICAqIEBwYXJhbSBhdHRycyBBbiBBdHRyaWJ1dGVTZXQgcGFzc2VkIHRvIG91ciBwYXJlbnQuCiAgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHJlc291cmNlIElELgotICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBpcyBhIE1hcCBvZiBpbnRhcmVmYWNlIG5hbWVzLCBhcyBrZXlzLCBhbmQKKyAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50ZXJmYWNlIG5hbWVzLCBhcyBrZXlzLCBhbmQKICAgICAgKiBvYmplY3QgaW1wbGVtZW50aW5nIHRob3NlIGludGVyZmFjZXMsIGFzIHZhbHVlcy4KICAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgogICAgICAqLwogICAgIHByb3RlY3RlZCBXZWJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUsCiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIGluaXQoKTsKKworICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1DYWxsYmFja1Byb3h5ID0gbmV3IENhbGxiYWNrUHJveHkoY29udGV4dCwgdGhpcyk7CiAgICAgICAgIG1WaWV3TWFuYWdlciA9IG5ldyBWaWV3TWFuYWdlcih0aGlzKTsKICAgICAgICAgbVdlYlZpZXdDb3JlID0gbmV3IFdlYlZpZXdDb3JlKGNvbnRleHQsIHRoaXMsIG1DYWxsYmFja1Byb3h5LCBqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CiAgICAgICAgIG1EYXRhYmFzZSA9IFdlYlZpZXdEYXRhYmFzZS5nZXRJbnN0YW5jZShjb250ZXh0KTsKICAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGNvbnRleHQpOworICAgICAgICBtWm9vbU1hbmFnZXIgPSBuZXcgWm9vbU1hbmFnZXIodGhpcywgbUNhbGxiYWNrUHJveHkpOwogCisgICAgICAgIC8qIFRoZSBpbml0IG1ldGhvZCBtdXN0IGZvbGxvdyB0aGUgY3JlYXRpb24gb2YgY2VydGFpbiBtZW1iZXIgdmFyaWFibGVzLAorICAgICAgICAgKiBzdWNoIGFzIHRoZSBtWm9vbU1hbmFnZXIuCisgICAgICAgICAqLworICAgICAgICBpbml0KCk7CiAgICAgICAgIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KGNvbnRleHQpOwogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCi0gICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLnN1cHBvcnRab29tKCkgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpOwotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKLSAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1BY3R1YWxTY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1BY3R1YWxTY2FsZSA+IG1NaW5ab29tU2NhbGUgJiYgIW1Jblpvb21PdmVydmlldzsKLSAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zLCBhcyB3ZWxsIGFzIHRoZSBmaXQgdG8gcGFnZQotICAgICAgICAgICAgLy8gYnV0dG9uLCBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbgotICAgICAgICAgICAgLy8gb3Igb3V0LgotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOwotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKQEAgLTk5MiwzNCArODgyLDM1IEBACiAgICAgICAgIC8vIHVzZSBvbmUgbGluZSBoZWlnaHQsIDE2IGJhc2VkIG9uIG91ciBjdXJyZW50IGRlZmF1bHQgZm9udCwgZm9yIGhvdwogICAgICAgICAvLyBmYXIgd2UgYWxsb3cgYSB0b3VjaCBiZSBhd2F5IGZyb20gdGhlIGVkZ2Ugb2YgYSBsaW5rCiAgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7Ci0gICAgICAgIC8vIGRlbnNpdHkgYWRqdXN0ZWQgc2NhbGUgZmFjdG9ycwotICAgICAgICBERUZBVUxUX1NDQUxFX1BFUkNFTlQgPSAoaW50KSAoMTAwICogZGVuc2l0eSk7Ci0gICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZW5zaXR5OwotICAgICAgICBtQWN0dWFsU2NhbGUgPSBkZW5zaXR5OwotICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gZGVuc2l0eTsKLSAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBkZW5zaXR5OwotICAgICAgICBERUZBVUxUX01BWF9aT09NX1NDQUxFID0gNC4wZiAqIGRlbnNpdHk7Ci0gICAgICAgIERFRkFVTFRfTUlOX1pPT01fU0NBTEUgPSAwLjI1ZiAqIGRlbnNpdHk7Ci0gICAgICAgIG1NYXhab29tU2NhbGUgPSBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgICAgICBtTWluWm9vbVNjYWxlID0gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CiAgICAgICAgIG1NYXhpbXVtRmxpbmcgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7CiAgICAgfQogCi0gICAgLyogcGFja2FnZSAqL3ZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGludCB6b29tRGVuc2l0eSkgewotICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eQotICAgICAgICAgICAgICAgICogMTAwIC8gem9vbURlbnNpdHk7Ci0gICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiAwLjAxKSB7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGRlbnNpdHkgLyBtRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW1pdHMKLSAgICAgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX1NDQUxFX1BFUkNFTlQgPSAoaW50KSAoMTAwICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX01BWF9aT09NX1NDQUxFID0gNC4wZiAqIGRlbnNpdHk7Ci0gICAgICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUgKiBzY2FsZUZhY3RvciwgdHJ1ZSwgZmFsc2UpOworICAgIC8qKgorICAgICAqIEV4cG9zZXMgYWNjZXNzaWJpbGl0eSBBUElzIHRvIEphdmFTY3JpcHQgYnkgYXBwZW5kaW5nIHRoZW0gdG8gdGhlIEphdmFTY3JpcHQKKyAgICAgKiBpbnRlcmZhY2VzIG1hcCBwcm92aWRlZCBieSB0aGUgV2ViVmlldyBjbGllbnQuIEluIGNhc2Ugb2YgY29uZmxpY3RpbmcKKyAgICAgKiBhbGlhcyB3aXRoIHRoZSBvbmUgb2YgdGhlIGFjY2Vzc2liaWxpdHkgQVBJIHRoZSB1c2VyIHNwZWNpZmllZCBvbmUgd2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBBIG1hcCB3aXRoIGludGVyZmFjZXMgdG8gYmUgZXhwb3NlZCB0byBKYXZhU2NyaXB0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBvc2VBY2Nlc3NpYmlsaXR5SmF2YVNjcmlwdEFwaShNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CisgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcy5jb250YWluc0tleShBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSkpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkphdmFTY3JpcHQgaW50ZXJmYWNlIG1hcHBlZCB0byBcIiIgKyBBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRQorICAgICAgICAgICAgICAgICAgICArICJcIiBvdmVycmlkZXMgdGhlIGFjY2Vzc2liaWxpdHkgQVBJIEphdmFTY3JpcHQgaW50ZXJmYWNlLiBObyBhY2Nlc3NpYmlsaXR5IgorICAgICAgICAgICAgICAgICAgICArICJBUEkgd2lsbCBiZSBleHBvc2VkIHRvIEphdmFTY3JpcHQhIik7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKworICAgICAgICAvLyBleHBvc2UgdGhlIFRUUyBmb3Igbm93IC4uLgorICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcy5wdXQoQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgbmV3IFRleHRUb1NwZWVjaChnZXRDb250ZXh0KCksIG51bGwpKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovdm9pZCB1cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoaW50IHpvb21EZW5zaXR5KSB7CisgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKKyAgICAgICAgICAgICAgICAqIDEwMCAvIHpvb21EZW5zaXR5OworICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOworICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBvblNhdmVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKQEAgLTExMzYsMTQgKzEwMjcsMTQgQEAKICAgICAgKiByZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHRpdGxlYmFydmlldyAoaWYgYW55KS4gRG9lcyBub3QgY2FyZSBhYm91dAogICAgICAqIHNjcm9sbGluZwogICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFRpdGxlSGVpZ2h0KCkgeworICAgIGludCBnZXRUaXRsZUhlaWdodCgpIHsKICAgICAgICAgcmV0dXJuIG1UaXRsZUJhciAhPSBudWxsID8gbVRpdGxlQmFyLmdldEhlaWdodCgpIDogMDsKICAgICB9CiAKICAgICAvKgogICAgICAqIFJldHVybiB0aGUgYW1vdW50IG9mIHRoZSB0aXRsZWJhcnZpZXcgKGlmIGFueSkgdGhhdCBpcyB2aXNpYmxlCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgeworICAgIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7CiAgICAgICAgIHJldHVybiBNYXRoLm1heChnZXRUaXRsZUhlaWdodCgpIC0gbVNjcm9sbFksIDApOwogICAgIH0KIApAQCAtMTQwNCwyOSArMTI5NSwyMyBAQAogICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBidW5kbGUKICAgICAgICAgYi5wdXRJbnQoInNjcm9sbFgiLCBtU2Nyb2xsWCk7CiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxZIiwgbVNjcm9sbFkpOwotICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7Ci0gICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgICAgICBtWm9vbU1hbmFnZXIuc2F2ZVpvb21TdGF0ZShiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVIaXN0b3J5UGljdHVyZUZpZWxkcyhQaWN0dXJlIHAsIEJ1bmRsZSBiKSB7CiAgICAgICAgIGludCBzeCA9IGIuZ2V0SW50KCJzY3JvbGxYIiwgMCk7CiAgICAgICAgIGludCBzeSA9IGIuZ2V0SW50KCJzY3JvbGxZIiwgMCk7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gYi5nZXRGbG9hdCgic2NhbGUiLCAxLjBmKTsKKwogICAgICAgICBtRHJhd0hpc3RvcnkgPSB0cnVlOwogICAgICAgICBtSGlzdG9yeVBpY3R1cmUgPSBwOwogICAgICAgICBtU2Nyb2xsWCA9IHN4OwogICAgICAgICBtU2Nyb2xsWSA9IHN5OworICAgICAgICBtWm9vbU1hbmFnZXIucmVzdG9yZVpvb21TdGF0ZShiKTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgbUhpc3RvcnlXaWR0aCA9IE1hdGgucm91bmQocC5nZXRXaWR0aCgpICogc2NhbGUpOwogICAgICAgICBtSGlzdG9yeUhlaWdodCA9IE1hdGgucm91bmQocC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCi0gICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKLSAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQotICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBzY2FsZSk7Ci0gICAgICAgIG1Jblpvb21PdmVydmlldyA9IGIuZ2V0Qm9vbGVhbigib3ZlcnZpZXciKTsKKwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCkBAIC0xODQ5LDcgKzE3MzQsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNjYWxlKCkgewotICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODYxLDcgKzE3NDYsNyBAQAogICAgICAqIEBwYXJhbSBzY2FsZUluUGVyY2VudCBUaGUgaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTY2FsZShpbnQgc2NhbGVJblBlcmNlbnQpIHsKLSAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCA9IHNjYWxlSW5QZXJjZW50OworICAgICAgICBtWm9vbU1hbmFnZXIuc2V0SW5pdGlhbFNjYWxlSW5QZXJjZW50KHNjYWxlSW5QZXJjZW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NzUsMTMgKzE3NjAsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLmludm9rZVpvb21QaWNrZXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5OTYsNyArMTg3NSw3IEBACiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgeworICAgIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgewogLy8gICAgICAgIExvZy5kKExPR1RBRywgIi0tIHBpbkxvYyAiICsgeCArICIgIiArIHZpZXdNYXggKyAiICIgKyBkb2NNYXgpOwogICAgICAgICBpZiAoZG9jTWF4IDwgdmlld01heCkgeyAgIC8vIHRoZSBkb2MgaGFzIHJvb20gb24gdGhlIHNpZGVzIGZvciAiYmxhbmsiCiAgICAgICAgICAgICAvLyBwaW4gdGhlIHNob3J0IGRvY3VtZW50IHRvIHRoZSB0b3AvbGVmdCBvZiB0aGUgc2NyZWVuCkBAIC0yMDEzLDEyICsxODkyLDEyIEBACiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB4IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NYKGludCB4KSB7CisgICAgaW50IHBpbkxvY1goaW50IHgpIHsKICAgICAgICAgcmV0dXJuIHBpbkxvYyh4LCBnZXRWaWV3V2lkdGgoKSwgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpKTsKICAgICB9CiAKICAgICAvLyBFeHBlY3RzIHkgaW4gdmlldyBjb29yZGluYXRlcwotICAgIHByaXZhdGUgaW50IHBpbkxvY1koaW50IHkpIHsKKyAgICBpbnQgcGluTG9jWShpbnQgeSkgewogICAgICAgICByZXR1cm4gcGluTG9jKHksIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwKICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgfQpAQCAtMjA2OCw3ICsxOTQ3LDcgQEAKICAgICAgKiBoZWlnaHQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdmlld1RvQ29udGVudERpbWVuc2lvbihpbnQgZCkgewotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwOTQsNyArMTk3Myw3IEBACiAgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3VG9Db250ZW50WGYoaW50IHgpIHsKLSAgICAgICAgcmV0dXJuIHggKiBtSW52QWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiB4ICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTAzLDcgKzE5ODIsNyBAQAogICAgICAqIGVtYmVkZGVkIGludG8gdGhlIFdlYlZpZXcuIFJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGZsb2F0LgogICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgdmlld1RvQ29udGVudFlmKGludCB5KSB7Ci0gICAgICAgIHJldHVybiAoeSAtIGdldFRpdGxlSGVpZ2h0KCkpICogbUludkFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4gKHkgLSBnZXRUaXRsZUhlaWdodCgpKSAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjExMyw3ICsxOTkyLDcgQEAKICAgICAgKiBoZWlnaHQuCiAgICAgICovCiAgICAgLypwYWNrYWdlKi8gaW50IGNvbnRlbnRUb1ZpZXdEaW1lbnNpb24oaW50IGQpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTU0LDcgKzIwMzMsNyBAQAogICAgIC8vIENhbGxlZCBieSBKTkkgdG8gaW52YWxpZGF0ZSB0aGUgVmlldywgZ2l2ZW4gcmVjdGFuZ2xlIGNvb3JkaW5hdGVzIGluCiAgICAgLy8gY29udGVudCBzcGFjZQogICAgIHByaXZhdGUgdm9pZCB2aWV3SW52YWxpZGF0ZShpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgZmluYWwgaW50IGR5ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgaW52YWxpZGF0ZSgoaW50KU1hdGguZmxvb3IobCAqIHNjYWxlKSwKICAgICAgICAgICAgICAgICAgICAoaW50KU1hdGguZmxvb3IodCAqIHNjYWxlKSArIGR5LApAQCAtMjE2NSw3ICsyMDQ0LDcgQEAKICAgICAvLyBDYWxsZWQgYnkgSk5JIHRvIGludmFsaWRhdGUgdGhlIFZpZXcgYWZ0ZXIgYSBkZWxheSwgZ2l2ZW4gcmVjdGFuZ2xlCiAgICAgLy8gY29vcmRpbmF0ZXMgaW4gY29udGVudCBzcGFjZQogICAgIHByaXZhdGUgdm9pZCB2aWV3SW52YWxpZGF0ZURlbGF5ZWQobG9uZyBkZWxheSwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIGZpbmFsIGludCBkeSA9IGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgIHBvc3RJbnZhbGlkYXRlRGVsYXllZChkZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpTWF0aC5mbG9vcihsICogc2NhbGUpLApAQCAtMjIwMywxMyArMjA4Miw3IEBACiAgICAgICAgICAgICAvLyB1cGRhdGVkIHdoZW4gd2UgZ2V0IG91dCBvZiB0aGF0IG1vZGUuCiAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewogICAgICAgICAgICAgICAgIC8vIHJlcGluIG91ciBzY3JvbGwsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIG5ldyBjb250ZW50IHNpemUKLSAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFggPSBwaW5Mb2NYKG1TY3JvbGxYKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHBpbkxvY1kobVNjcm9sbFkpOwotICAgICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKHBpbkxvY1gobVNjcm9sbFgpLCBwaW5Mb2NZKG1TY3JvbGxZKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2Nyb2xsLiAgUmVwaW4gdGhlIGZpbmFsIHNjcm9sbAogICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbi4KQEAgLTIyMjEsNzcgKzIwOTQsMTIgQEAKICAgICAgICAgY29udGVudFNpemVDaGFuZ2VkKHVwZGF0ZUxheW91dCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldE5ld1pvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcFNjYWxlLAotICAgICAgICAgICAgYm9vbGVhbiBmb3JjZSkgewotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgICAgICAvLyBzZXQgbUluWm9vbU92ZXJ2aWV3IGZvciBub24gbW9iaWxlIHNpdGVzCi0gICAgICAgICAgICBpZiAoc2NhbGUgPCBtRGVmYXVsdFNjYWxlKSBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cGRhdGVUZXh0V3JhcFNjYWxlKSB7Ci0gICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgLy8gcmVzZXQgbUxhc3RIZWlnaHRTZW50IHRvIGZvcmNlIFZJRVdfU0laRV9DSEFOR0VEIHNlbnQgdG8gV2ViS2l0Ci0gICAgICAgICAgICBtTGFzdEhlaWdodFNlbnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgfHwgZm9yY2UpIHsKLSAgICAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBoaXN0b3J5IFBpY3R1cmUgaXMgZHJhd24sIGRvbid0IHVwZGF0ZSBzY3JvbGwuIFRoZXkgd2lsbAotICAgICAgICAgICAgICAgIC8vIGJlIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIHNjcm9sbCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8ganVtcAotICAgICAgICAgICAgICAgIC8vIGkuZS4ga2VlcCB0aGUgY2VudGVyIG9mIHRoZSBkb2MgaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlldwotCi0gICAgICAgICAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gc2NhbGUgKiBtSW52QWN0dWFsU2NhbGU7ICAgLy8gb2xkIGludmVyc2UKLSAgICAgICAgICAgICAgICBmbG9hdCBzeCA9IHJhdGlvICogb2xkWCArIChyYXRpbyAtIDEpICogbVpvb21DZW50ZXJYOwotICAgICAgICAgICAgICAgIGZsb2F0IHN5ID0gcmF0aW8gKiBvbGRZICsgKHJhdGlvIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICogKG1ab29tQ2VudGVyWSAtIGdldFRpdGxlSGVpZ2h0KCkpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvdXIgbmV3IHNjYWxlIGFuZCBpbnZlcnNlCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblNjYWxlQ2hhbmdlZChtQWN0dWFsU2NhbGUsIHNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotCi0gICAgICAgICAgICAgICAgLy8gU2NhbGUgYWxsIHRoZSBjaGlsZCB2aWV3cwotICAgICAgICAgICAgICAgIG1WaWV3TWFuYWdlci5zY2FsZUFsbCgpOwotCi0gICAgICAgICAgICAgICAgLy8gYXMgd2UgZG9uJ3QgaGF2ZSBhbmltYXRpb24gZm9yIHNjYWxpbmcsIGRvbid0IGRvIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIC8vIGZvciBzY3JvbGxpbmcsIGFzIGl0IGNhdXNlcyB3ZWlyZCBpbnRlcm1lZGlhdGUgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgcGluU2Nyb2xsVG8oTWF0aC5yb3VuZChzeCksIE1hdGgucm91bmQoc3kpKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHBpbkxvY1goTWF0aC5yb3VuZChzeCkpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gcGluTG9jWShNYXRoLnJvdW5kKHN5KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgd2Via2l0Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGlzIGFkanVzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHpvb20gYW5pbWF0aW9uLiBCdXQgd2Ugd2FudCB0byB1cGRhdGUgdGhlIFdlYktpdCBhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSB6b29tIGFuaW1hdGlvbi4gU2VlIGNvbW1lbnRzIGluIG9uU2NhbGVFbmQoKS4KLSAgICAgICAgICAgICAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIFVzZWQgdG8gYXZvaWQgc2VuZGluZyBtYW55IHZpc2libGUgcmVjdCBtZXNzYWdlcy4KICAgICBwcml2YXRlIFJlY3QgbUxhc3RWaXNpYmxlUmVjdFNlbnQ7CiAgICAgcHJpdmF0ZSBSZWN0IG1MYXN0R2xvYmFsUmVjdDsKIAotICAgIHByaXZhdGUgUmVjdCBzZW5kT3VyVmlzaWJsZVJlY3QoKSB7Ci0gICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSByZXR1cm4gbUxhc3RWaXNpYmxlUmVjdFNlbnQ7CisgICAgUmVjdCBzZW5kT3VyVmlzaWJsZVJlY3QoKSB7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpKSByZXR1cm4gbUxhc3RWaXNpYmxlUmVjdFNlbnQ7CiAKICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgY2FsY091ckNvbnRlbnRWaXNpYmxlUmVjdChyZWN0KTsKQEAgLTIzMjQsOSArMjEzMiw2IEBACiAgICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgZ2V0R2xvYmFsVmlzaWJsZVJlY3QociwgcCk7CiAgICAgICAgIHIub2Zmc2V0KC1wLngsIC1wLnkpOwotICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICByLmJvdHRvbSAtPSBtRmluZEhlaWdodDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFNldHMgciB0byBiZSBvdXIgdmlzaWJsZSByZWN0YW5nbGUgaW4gY29udGVudCBjb29yZGluYXRlcwpAQCAtMjM3MywxNiArMjE3OCwxOSBAQAogCiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSB1bnpvb21lZCB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgaWYgdGhleSBkaWZmZXIgZnJvbSB0aGUgbGFzdAotICAgICAqIHZhbHVlcyB3ZSBzZW50LCBzZW5kIHRoZW0gdG8gd2Via2l0ICh0byBiZSB1c2VkIGhhcyBuZXcgdmlld3BvcnQpCisgICAgICogdmFsdWVzIHdlIHNlbnQsIHNlbmQgdGhlbSB0byB3ZWJraXQgKHRvIGJlIHVzZWQgYXMgbmV3IHZpZXdwb3J0KQorICAgICAqCisgICAgICogQHBhcmFtIGZvcmNlIGVuc3VyZXMgdGhhdCB0aGUgbWVzc2FnZSBpcyBzZW50IHRvIHdlYmtpdCBldmVuIGlmIHRoZSB3aWR0aAorICAgICAqIG9yIGhlaWdodCBoYXMgbm90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbWVzc2FnZQogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIG5ldyB2YWx1ZXMgd2VyZSBzZW50CiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oKSB7Ci0gICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBzZW5kVmlld1NpemVab29tKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgIGludCBuZXdXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKTsKLSAgICAgICAgaW50IG5ld0hlaWdodCA9IE1hdGgucm91bmQoZ2V0Vmlld0hlaWdodCgpICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgaW50IG5ld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CisgICAgICAgIGludCBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKGdldFZpZXdIZWlnaHQoKSAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICAgICAgLyoKICAgICAgICAgICogQmVjYXVzZSB0aGUgbmF0aXZlIHNpZGUgbWF5IGhhdmUgYWxyZWFkeSBkb25lIGEgbGF5b3V0IGJlZm9yZSB0aGUKICAgICAgICAgICogVmlldyBzeXN0ZW0gd2FzIGFibGUgdG8gbWVhc3VyZSB1cywgd2UgaGF2ZSB0byBzZW5kIGEgaGVpZ2h0IG9mIDAgdG8KQEAgLTIzOTUsMTkgKzIyMDMsMjAgQEAKICAgICAgICAgICAgIG5ld0hlaWdodCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gQXZvaWQgc2VuZGluZyBhbm90aGVyIG1lc3NhZ2UgaWYgdGhlIGRpbWVuc2lvbnMgaGF2ZSBub3QgY2hhbmdlZC4KLSAgICAgICAgaWYgKG5ld1dpZHRoICE9IG1MYXN0V2lkdGhTZW50IHx8IG5ld0hlaWdodCAhPSBtTGFzdEhlaWdodFNlbnQpIHsKKyAgICAgICAgaWYgKG5ld1dpZHRoICE9IG1MYXN0V2lkdGhTZW50IHx8IG5ld0hlaWdodCAhPSBtTGFzdEhlaWdodFNlbnQgfHwgZm9yY2UpIHsKICAgICAgICAgICAgIFZpZXdTaXplRGF0YSBkYXRhID0gbmV3IFZpZXdTaXplRGF0YSgpOwogICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBuZXdXaWR0aDsKICAgICAgICAgICAgIGRhdGEubUhlaWdodCA9IG5ld0hlaWdodDsKLSAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAvIG1UZXh0V3JhcFNjYWxlKTs7Ci0gICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IG1ab29tU2NhbGUgIT0gMCAmJiAhbUhlaWdodENhbk1lYXN1cmU7Ci0gICAgICAgICAgICBkYXRhLm1BbmNob3JYID0gbUFuY2hvclg7Ci0gICAgICAgICAgICBkYXRhLm1BbmNob3JZID0gbUFuY2hvclk7CisgICAgICAgICAgICBkYXRhLm1UZXh0V3JhcFdpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggLyBtWm9vbU1hbmFnZXIuZ2V0VGV4dFdyYXBTY2FsZSgpKTsKKyAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CisgICAgICAgICAgICBkYXRhLm1JZ25vcmVIZWlnaHQgPSBtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKQorICAgICAgICAgICAgICAgICAgICAmJiAhbUhlaWdodENhbk1lYXN1cmU7CisgICAgICAgICAgICBkYXRhLm1BbmNob3JYID0gbVpvb21NYW5hZ2VyLmdldERvY3VtZW50QW5jaG9yWCgpOworICAgICAgICAgICAgZGF0YS5tQW5jaG9yWSA9IG1ab29tTWFuYWdlci5nZXREb2N1bWVudEFuY2hvclkoKTsKICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5WSUVXX1NJWkVfQ0hBTkdFRCwgZGF0YSk7CiAgICAgICAgICAgICBtTGFzdFdpZHRoU2VudCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgbUxhc3RIZWlnaHRTZW50ID0gbmV3SGVpZ2h0OwotICAgICAgICAgICAgbUFuY2hvclggPSBtQW5jaG9yWSA9IDA7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuY2xlYXJEb2N1bWVudEFuY2hvcigpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjQxOCwxMiArMjIyNywxMiBAQAogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlXaWR0aDsKICAgICAgICAgfSBlbHNlIGlmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgeworICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CiAgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAogICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50V2lkdGggKiBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQzMiwxMiArMjI0MSwxMiBAQAogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlIZWlnaHQ7CiAgICAgICAgIH0gZWxzZSBpZiAobVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7CisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKICAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCiAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZVZlcnRpY2FsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50SGVpZ2h0ICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50SGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjgyLDE5ICsyNDkxLDIyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmluZElzVXAoYm9vbGVhbiBpc1VwKSB7CiAgICAgICAgIG1GaW5kSXNVcCA9IGlzVXA7Ci0gICAgICAgIGlmIChpc1VwKSB7Ci0gICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShtQ29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCArIG1GaW5kSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBuYXRpdmVTZXRGaW5kSXNVcChpc1VwKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZEluZGV4KCkgeworICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUZpbmRJbmRleCgpOworICAgIH0KKwogICAgIC8vIFVzZWQgdG8ga25vdyB3aGV0aGVyIHRoZSBmaW5kIGRpYWxvZyBpcyBvcGVuLiAgQWZmZWN0cyB3aGV0aGVyCiAgICAgLy8gb3Igbm90IHdlIGRyYXcgdGhlIGhpZ2hsaWdodHMgZm9yIG1hdGNoZXMuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5kSXNVcDsKIAotICAgIHByaXZhdGUgaW50IG1GaW5kSGVpZ2h0OwogICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3RyaW5nIHNlbnQsIHNvIHdlIGNhbiBzZWFyY2ggYWdhaW4gYWZ0ZXIgYW4KICAgICAvLyBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgdGhlIGRpc21pc3NhbCBvZiB0aGUgc29mdCBrZXlib2FyZC4KICAgICBwcml2YXRlIFN0cmluZyBtTGFzdEZpbmQ7CkBAIC0yNzY5LDggKzI1ODEsNiBAQAogICAgICAgICB9CiAgICAgICAgIGNsZWFyTWF0Y2hlcygpOwogICAgICAgICBzZXRGaW5kSXNVcChmYWxzZSk7Ci0gICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKG1Db250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0IC0gbUZpbmRIZWlnaHQsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAvLyBOb3cgdGhhdCB0aGUgZGlhbG9nIGhhcyBiZWVuIHJlbW92ZWQsIGVuc3VyZSB0aGF0IHdlIHNjcm9sbCB0byBhCiAgICAgICAgIC8vIGxvY2F0aW9uIHRoYXQgaXMgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYWdlLgogICAgICAgICBwaW5TY3JvbGxUbyhtU2Nyb2xsWCwgbVNjcm9sbFksIGZhbHNlLCAwKTsKQEAgLTI3NzgsMTYgKzI1ODgsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluZERpYWxvZ0hlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXRGaW5kRGlhbG9nSGVpZ2h0IGhlaWdodD0iICsgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBtRmluZEhlaWdodCA9IGhlaWdodDsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBRdWVyeSB0aGUgZG9jdW1lbnQgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGFueSBpbWFnZSByZWZlcmVuY2VzLiBUaGUKICAgICAgKiBtZXNzYWdlIG9iamVjdCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCBhcmcxIGJlaW5nIHNldCB0byAxIGlmIGltYWdlcwogICAgICAqIHdlcmUgZm91bmQgYW5kIDAgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgaW1hZ2VzLgpAQCAtMjgxMCw2ICsyNjEwLDExIEBACiAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOyAgLy8gU28gd2UgZHJhdyBhZ2FpbgogICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewogICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYm9ydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKKyAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdXBlci5jb21wdXRlU2Nyb2xsKCk7CkBAIC0yODk4LDYgKzI3MDMsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYWdlVGhhdE5lZWRzVG9TbGlkZVRpdGxlQmFyT2ZmU2NyZWVuID0gbnVsbDsKICAgICAgICAgfQorCisgICAgICAgIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpbmplY3RzIGFjY2Vzc2liaWxpdHkgaW4gdGhlIGxvYWRlZCBkb2N1bWVudCBpZiBhY2Nlc3NpYmlsaXR5CisgICAgICogaXMgZW5hYmxlZC4gSWYgSmF2YVNjcmlwdCBpcyBlbmFibGVkIHdlIHRyeSB0byBpbmplY3QgYSBVUkwgc3BlY2lmaWMgc2NyaXB0LgorICAgICAqIElmIG5vIFVSTCBzcGVjaWZpYyBzY3JpcHQgaXMgZm91bmQgb3IgSmF2YVNjcmlwdCBpcyBkaXNhYmxlZCB3ZSBmYWxsYmFjayB0bworICAgICAqIHRoZSBkZWZhdWx0IHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIGxvYWRlZCBieSB0aGlzIHtAbGluayBXZWJWaWV3fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5qZWN0QWNjZXNzaWJpbGl0eUZvclVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEphdmFTY3JpcHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2FkVXJsKEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBuZXcgQWNjZXNzaWJpbGl0eUluamVjdG9yKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBhY2Nlc3NpYmlsaXR5IHdhcyB0dXJuZWQgb2ZmIGJldHdlZW4gcmVsb2FkcworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMTQsNyArMjg0Miw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCByZXF1ZXN0IGEgbGF5b3V0LCB0cnkgdG8gc2VuZCBvdXIgdmlldyBzaXplIHRvIHRoZQogICAgICAgICAgICAgLy8gbmF0aXZlIHNpZGUgdG8gZW5zdXJlIHRoYXQgV2ViQ29yZSBoYXMgdGhlIGNvcnJlY3QgZGltZW5zaW9ucy4KLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTQ0LDcgKzI5NzIsNyBAQAogICAgICAqICAgICAgICAgc2V0dGluZ3MuCiAgICAgICovCiAgICAgcHVibGljIFdlYlNldHRpbmdzIGdldFNldHRpbmdzKCkgewotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCk7CisgICAgICAgIHJldHVybiAobVdlYlZpZXdDb3JlICE9IG51bGwpID8gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkgOiBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI4NSw3ICszMTEzLDQ3IEBACiAgICAgICAgIGlmIChBVVRPX1JFRFJBV19IQUNLICYmIG1BdXRvUmVkcmF3KSB7CiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgbVdlYlRleHRWaWV3Lm9uRHJhd1N1YnN0aXR1dGUoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNpZ25hbFJlcGFpbnREb25lKCk7CisKKyAgICAgICAgLy8gcGFpbnQgdGhlIGhpZ2hsaWdodCBpbiB0aGUgZW5kCisgICAgICAgIGlmICghbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldENvbG9yKG1IaWdodGxpZ2h0Q29sb3IpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldFBhdGhFZmZlY3QobmV3IENvcm5lclBhdGhFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9ISUdITElHSFRfQVJDKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kYXJ5UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldE5hdkR1bXAoKSkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoSGlnaGxpZ2h0WCB8IG1Ub3VjaEhpZ2hsaWdodFkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaENyb3NzSGFpckNvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvci5zZXRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYIC0gbU5hdlNsb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1OYXZTbG9wICsgMSwgbVRvdWNoSGlnaGxpZ2h0WSArIG1OYXZTbG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEsIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKG1Ub3VjaEhpZ2hsaWdodFggKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVUb3VjaEhpZ2hsaWdodChib29sZWFuIHJlbW92ZVBlbmRpbmdNZXNzYWdlKSB7CisgICAgICAgIGlmIChyZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMpOworICAgICAgICB9CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTMzMDYsMjcgKzMxNzQsMzUgQEAKICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNsaWNrIHNvIHRoYXQgdGhlIHRleHRmaWVsZCBpcyBpbiBmb2N1cwogICAgICAgICAgICAgY2VudGVyS2V5UHJlc3NPblRleHRGaWVsZCgpOwogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbVdlYlRleHRWaWV3LnBlcmZvcm1Mb25nQ2xpY2soKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtTG9uZ0NsaWNrKCk7CiAgICAgICAgIH0KKyAgICAgICAgLyogaWYgbG9uZyBjbGljayBicmluZ3MgdXAgYSBjb250ZXh0IG1lbnUsIHRoZSBzdXBlciBmdW5jdGlvbgorICAgICAgICAgKiByZXR1cm5zIHRydWUgYW5kIHdlJ3JlIGRvbmUuIE90aGVyd2lzZSwgbm90aGluZyBoYXBwZW5lZCB3aGVuCisgICAgICAgICAqIHRoZSB1c2VyIGNsaWNrZWQuICovCisgICAgICAgIGlmIChzdXBlci5wZXJmb3JtTG9uZ0NsaWNrKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8qIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYWxyZWFkeSBoYW5kbGVkIHRoZSBsb25nCisgICAgICAgICAqIGNsaWNrIGFjdGlvbiwgbG9vayBmb3IgYSB3b3JkIHVuZGVyIHRoZSAgY2xpY2suIElmIG9uZSBpcyBmb3VuZCwKKyAgICAgICAgICogYW5pbWF0ZSB0aGUgdGV4dCBzZWxlY3Rpb24gaW50byB2aWV3LgorICAgICAgICAgKiBGSVhNRTogbm8gYW5pbWF0aW9uIGNvZGUgeWV0ICovCisgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgcmV0dXJuIGZhbHNlOyAvLyBsb25nIGNsaWNrIGRvZXMgbm90aGluZyBvbiBzZWxlY3Rpb24KKyAgICAgICAgaW50IHggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtTGFzdFRvdWNoWCArIG1TY3JvbGxYKTsKKyAgICAgICAgaW50IHkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKKyAgICAgICAgc2V0VXBTZWxlY3QoKTsKKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZVdvcmRTZWxlY3Rpb24oeCwgeSkpIHsKKyAgICAgICAgICAgIG5hdGl2ZVNldEV4dGVuZFNlbGVjdGlvbigpOworICAgICAgICAgICAgZ2V0V2ViQ2hyb21lQ2xpZW50KCkub25TZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBib29sZWFuIGluQW5pbWF0ZVpvb20oKSB7Ci0gICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmVlZCB0byBhZGp1c3QgdGhlIFdlYlRleHRWaWV3IGFmdGVyIGEgY2hhbmdlIGluIHpvb20sIHNpbmNlIG1BY3R1YWxTY2FsZQotICAgICAqIGhhcyBjaGFuZ2VkLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgcGFzc3dvcmQgZmllbGRzLCB3aGljaCBhcmUKLSAgICAgKiBkcmF3biBieSB0aGUgV2ViVGV4dFZpZXcsIHNpbmNlIGl0IGNvbnZleXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHdoYXQKLSAgICAgKiB3ZWJraXQgZHJhd3MuICBUaHVzIHdlIG5lZWQgdG8gcmVwb3NpdGlvbiBpdCB0byBzaG93IGluIHRoZSBjb3JyZWN0Ci0gICAgICogcGxhY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldzsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhib29sZWFuIGFsbG93SW50ZXJzZWN0KSB7CiAgICAgICAgIFJlY3QgY29udGVudEJvdW5kcyA9IG5hdGl2ZUZvY3VzQ2FuZGlkYXRlTm9kZUJvdW5kcygpOwogICAgICAgICBSZWN0IHZCb3ggPSBjb250ZW50VG9WaWV3UmVjdChjb250ZW50Qm91bmRzKTsKQEAgLTMzNjQsMTUgKzMyNDAsNDEgQEAKICAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3IG1pc3BsYWNlZC4KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBlZGl0IHRleHQgdmlldyBpZiBuZWVkZWQKKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlIFdlYlRleHRWaWV3IG9uY2UKKyAgICAgICAgICAgIC8vIGFnYWluLgorICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShnZXRXZWJWaWV3Q29yZSgpKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkcmF3Q29yZUFuZEN1cnNvclJpbmcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLAogICAgICAgICBib29sZWFuIGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGljdHVyZShtSGlzdG9yeVBpY3R1cmUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tU2NhbGUgIT0gMDsKKyAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpOwogICAgICAgICBib29sZWFuIGFuaW1hdGVTY3JvbGwgPSAoKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpCiAgICAgICAgICAgICAgICAgfHwgbVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKQogICAgICAgICAgICAgICAgICYmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSB8fApAQCAtMzM5MSw1OSArMzI5Myw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFuaW1hdGVab29tKSB7Ci0gICAgICAgICAgICBmbG9hdCB6b29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSAoaW50KSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtWm9vbVN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSAxLjBmIC8gKG1JbnZJbml0aWFsWm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOwotICAgICAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBkb25lIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSBhZ2FpbiB0byBkcmF3IHdpdGggdGhlIGZpbmFsIGZpbHRlcnMKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldykgewotICAgICAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLiBBcyB3ZSBuZWVkIHRvIHVzZQotICAgICAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgcGluTG9jWC9ZIGRpcmVjdGx5LiBDb3B5IHRoZSBsb2dpYyBoZXJlLgotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICAgICAgICAgIGludCB0eCA9IE1hdGgucm91bmQoc2NhbGUgKiAobUluaXRpYWxTY3JvbGxYICsgbVpvb21DZW50ZXJYKQotICAgICAgICAgICAgICAgICAgICAtIG1ab29tQ2VudGVyWCk7Ci0gICAgICAgICAgICB0eCA9IC1waW5Mb2ModHgsIGdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1Db250ZW50V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1TY3JvbGxYOwotICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGludCB0eSA9IE1hdGgucm91bmQoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7Ci0gICAgICAgICAgICB0eSA9IC0odHkgPD0gdGl0bGVIZWlnaHQgPyBNYXRoLm1heCh0eSwgMCkgOiBwaW5Mb2ModHkKLSAgICAgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1Db250ZW50SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHgsIHR5KTsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7Ci0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmICFtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgJiYgbVpvb21TY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIFdlYlRleHRWaWV3IGlzIHVwLiAgS2VlcCB0cmFjayBvZiB0aGlzIHNvIHdlIGNhbiBhZGp1c3QKLSAgICAgICAgICAgICAgICAvLyBpdHMgc2l6ZSBhbmQgcGxhY2VtZW50IHdoZW4gd2UgZmluaXNoIHpvb21pbmcKLSAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgICAgICAvLyBtaXNwbGFjZWQuCi0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuYW5pbWF0ZVpvb20oY2FudmFzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gVUlBbmltYXRpb25zUnVubmluZyA9IGZhbHNlOwpAQCAtMzQ1NiwyNSArMzMwOCwyNSBAQAogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9CiAgICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCBjb2xvciwKLSAgICAgICAgICAgICAgICAoYW5pbWF0ZVpvb20gfHwgbVByZXZpZXdab29tT25seSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSwKKyAgICAgICAgICAgICAgICAobVpvb21NYW5hZ2VyLmlzWm9vbUFuaW1hdGluZygpIHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpLAogICAgICAgICAgICAgICAgIGFuaW1hdGVTY3JvbGwpOwogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKICAgICAgICAgLy8gZGVjaWRlIHdoaWNoIGFkb3JubWVudHMgdG8gZHJhdwogICAgICAgICBpbnQgZXh0cmFzID0gRFJBV19FWFRSQVNfTk9ORTsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIm1GaW5kSXNVcD0iICsgbUZpbmRJc1VwCisgICAgICAgICAgICAgICAgICAgICsgIiBtU2VsZWN0aW5nVGV4dD0iICsgbVNlbGVjdGluZ1RleHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpPSIKKyAgICAgICAgICAgICAgICAgICAgKyBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKQorICAgICAgICAgICAgICAgICAgICArICIgYW5pbWF0ZVpvb209IiArIGFuaW1hdGVab29tKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSBGaW5kRGlhbG9nIGlzIHVwLCBvbmx5IGRyYXcgdGhlIG1hdGNoZXMgaWYgd2UgYXJlIG5vdCBpbgotICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3Mgb2Ygc2Nyb2xsaW5nIHRoZW0gaW50byB2aWV3LgotICAgICAgICAgICAgaWYgKCFhbmltYXRlU2Nyb2xsKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtU2hpZnRJc1ByZXNzZWQgJiYgIW5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgewotICAgICAgICAgICAgaWYgKCFhbmltYXRlWm9vbSAmJiAhbVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX1NFTEVDVElPTjsKLSAgICAgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24obVRvdWNoU2VsZWN0aW9uIHx8IG1FeHRlbmRTZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvblBvaW50ZXIoIW1Ub3VjaFNlbGVjdGlvbiwgbUludkFjdHVhbFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFgsIG1TZWxlY3RZIC0gZ2V0VGl0bGVIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKKyAgICAgICAgfSBlbHNlIGlmIChtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfU0VMRUNUSU9OOworICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihtRHJhd1NlbGVjdGlvblBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpLAorICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCwgbVNlbGVjdFkgLSBnZXRUaXRsZUhlaWdodCgpKTsKICAgICAgICAgfSBlbHNlIGlmIChkcmF3Q3Vyc29yUmluZykgewogICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfQ1VSU09SX1JJTkc7CiAgICAgICAgIH0KQEAgLTM0ODMsMTEgKzMzMzUsNiBAQAogICAgICAgICBpZiAoZXh0cmFzID09IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HKSB7CiAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREUpIHsKICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfU0hPUlRQUkVTU19NT0RFOwotICAgICAgICAgICAgICAgIEhpdFRlc3RSZXN1bHQgaGl0VGVzdCA9IGdldEhpdFRlc3RSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGl0VGVzdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBoaXRUZXN0Lm1UeXBlID09IEhpdFRlc3RSZXN1bHQuVU5LTk9XTl9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Gb2N1c1NpemVDaGFuZ2VkKSB7CkBAIC0zNTEyLDYgKzMzNTksMTAgQEAKICAgICAgICAgcmV0dXJuIG1EcmF3SGlzdG9yeTsKICAgICB9CiAKKyAgICBpbnQgZ2V0SGlzdG9yeVBpY3R1cmVXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtSGlzdG9yeVBpY3R1cmUgIT0gbnVsbCkgPyBtSGlzdG9yeVBpY3R1cmUuZ2V0V2lkdGgoKSA6IDA7CisgICAgfQorCiAgICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIFVJIHRocmVhZAogICAgIHZvaWQgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKSB7CiAgICAgICAgIGlmIChudWxsID09IG1XZWJWaWV3Q29yZSkgcmV0dXJuOyAvLyBDYWxsYmFja1Byb3h5IG1heSB0cmlnZ2VyIHRoaXMKQEAgLTM1NjYsNyArMzQxNyw5IEBACiAgICAgICogIEBwYXJhbSAgZW5kICAgICBFbmQgb2Ygc2VsZWN0aW9uLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM1ODUsMTMgKzM0MzgsMTAgQEAKICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKIAogICAgICAgICAvLyBicmluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IHNjYWxlIHNvIHRoYXQgdXNlciBjYW4gZW50ZXIgdGV4dAotICAgICAgICBib29sZWFuIHpvb20gPSBtQWN0dWFsU2NhbGUgPCBtRGVmYXVsdFNjYWxlOworICAgICAgICBib29sZWFuIHpvb20gPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSA8IG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICAgICAgaWYgKHpvb20pIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGV4dCB3cmFwIHNjYWxlIHNvIHRoYXQgdGhlcmUgaXMgbm8gcmVmbG93Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobURlZmF1bHRTY2FsZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbVNjYWxlKG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1RleHRWaWV3KSB7CiAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM4MTcsMTcgKzM2NjcsMTkgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7CisgICAgICAgIC8vIDMuIHRoZSBhY2Nlc3NpYmlsaXR5IGluamVjdG9yIGlzIHByZXNlbnQgYW5kIHdhbnRzIHRvIGhhbmRsZSBpdDsKICAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkKLSAgICAgICAgICAgICAgICB8fCBtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlS2V5RXZlbnQoZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHx8IChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vbktleUV2ZW50KGV2ZW50KSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5hdGl2ZUN1cnNvcldhbnRzS2V5RXZlbnRzKCkgJiYgIW1TaGlmdElzUHJlc3NlZCkgewotICAgICAgICAgICAgICAgIHNldFVwU2VsZWN0WFkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5hdGl2ZUN1cnNvcldhbnRzS2V5RXZlbnRzKCkgJiYgIW1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICAgICAgc2V0VXBTZWxlY3QoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zODQ0LDExICszNjk2LDExIEBACiAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgewotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAobmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCB0cnVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2hpZnRJc1ByZXNzZWQpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgICAgIGludCB4UmF0ZSA9IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQKICAgICAgICAgICAgICAgICAgICAgPyAtMSA6IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgaW50IHlSYXRlID0ga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgPwpAQCAtMzg2OCw3ICszNzIwLDcgQEAKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUikgewogICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVNoaWZ0SXNQcmVzc2VkICYmICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGRpc2NhcmQgcHJlc3MgaWYgY29weSBpbiBwcm9ncmVzcwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtR290Q2VudGVyRG93biA9IHRydWU7CkBAIC0zODg2LDEwICszNzM4LDggQEAKICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX1JJR0hUKSB7CiAgICAgICAgICAgICAvLyB0dXJuIG9mZiBjb3B5IHNlbGVjdCBpZiBhIHNoaWZ0LWtleSBjb21ibyBpcyBwcmVzc2VkCi0gICAgICAgICAgICBtRXh0ZW5kU2VsZWN0aW9uID0gbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TRUxFQ1RfTU9ERSkgewotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CisgICAgICAgICAgICBtU2hpZnRJc1ByZXNzZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldE5hdkR1bXAoKSkgewpAQCAtMzk3MSwyMyArMzgyMSwyNyBAQAogICAgICAgICAvLyBCdWJibGUgdXAgdGhlIGtleSBldmVudCBpZgogICAgICAgICAvLyAxLiBpdCBpcyBhIHN5c3RlbSBrZXk7IG9yCiAgICAgICAgIC8vIDIuIHRoZSBob3N0IGFwcGxpY2F0aW9uIHdhbnRzIHRvIGhhbmRsZSBpdDsKLSAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CisgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCisgICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHx8IChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vbktleUV2ZW50KGV2ZW50KSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1pdENvcHkoKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChjb3B5U2VsZWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgewotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gYWx3YXlzIGhhbmRsZSB0aGUgbmF2aWdhdGlvbiBrZXlzIGluIHRoZSBVSSB0aHJlYWQKQEAgLTQwMDAsMTEgKzM4NTQsMTMgQEAKICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhMT05HX1BSRVNTX0NFTlRFUik7CiAgICAgICAgICAgICBtR290Q2VudGVyRG93biA9IGZhbHNlOwogCi0gICAgICAgICAgICBpZiAobVNoaWZ0SXNQcmVzc2VkICYmICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgICAgIGlmIChtRXh0ZW5kU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1pdENvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgY29weVNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbUV4dGVuZFNlbGVjdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEV4dGVuZFNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7IC8vIGRyYXcgdGhlIGktYmVhbSBpbnN0ZWFkIG9mIHRoZSBhcnJvdwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZGlzY2FyZCBwcmVzcyBpZiBjb3B5IGluIHByb2dyZXNzCkBAIC00MDQ5LDkgKzM5MDUsMTggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXRVcFNlbGVjdFhZKCkgeworICAgIC8qKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXBTZWxlY3QoKSB7CisgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgcmV0dXJuOworICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHJldHVybjsKICAgICAgICAgbUV4dGVuZFNlbGVjdGlvbiA9IGZhbHNlOwotICAgICAgICBtU2hpZnRJc1ByZXNzZWQgPSB0cnVlOworICAgICAgICBtU2VsZWN0aW5nVGV4dCA9IG1EcmF3U2VsZWN0aW9uUG9pbnRlciA9IHRydWU7CisgICAgICAgIC8vIGRvbid0IGxldCB0aGUgcGljdHVyZSBjaGFuZ2UgZHVyaW5nIHRleHQgc2VsZWN0aW9uCisgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOworICAgICAgICBuYXRpdmVSZXNldFNlbGVjdGlvbigpOwogICAgICAgICBpZiAobmF0aXZlSGFzQ3Vyc29yTm9kZSgpKSB7CiAgICAgICAgICAgICBSZWN0IHJlY3QgPSBuYXRpdmVDdXJzb3JOb2RlQm91bmRzKCk7CiAgICAgICAgICAgICBtU2VsZWN0WCA9IGNvbnRlbnRUb1ZpZXdYKHJlY3QubGVmdCk7CkBAIC00MDcxLDQwICszOTM2LDgyIEBACiAgICAgICogRG8gbm90IHJlbHkgb24gdGhpcyBmdW5jdGlvbmFsaXR5OyBpdCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbXVsYXRlU2hpZnRIZWxkKCkgewotICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCi0gICAgICAgIHNldFVwU2VsZWN0WFkoKTsKKyAgICAgICAgc2V0VXBTZWxlY3QoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gY29tbWl0Q29weSgpIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdEFsbCgpIHsKKyAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAorICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpKSByZXR1cm47CisgICAgICAgIGlmICghbVNlbGVjdGluZ1RleHQpIHNldFVwU2VsZWN0KCk7CisgICAgICAgIG5hdGl2ZVNlbGVjdEFsbCgpOworICAgICAgICBtRHJhd1NlbGVjdGlvblBvaW50ZXIgPSBmYWxzZTsKKyAgICAgICAgbUV4dGVuZFNlbGVjdGlvbiA9IHRydWU7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERpYWxvZ0lzVXAoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW5nVGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpIHsKKyAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBmYWxzZTsKKyAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uRG9uZSgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICBnZXRXZWJDaHJvbWVDbGllbnQoKS5vblNlbGVjdGlvbkRvbmUoKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gcmVkcmF3IHdpdGhvdXQgc2VsZWN0aW9uCisgICAgICAgICAgICBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29weVNlbGVjdGlvbigpIHsKICAgICAgICAgYm9vbGVhbiBjb3BpZWRTb21ldGhpbmcgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1FeHRlbmRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBuYXRpdmVHZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJjb21taXRDb3B5IFwiIiArIHNlbGVjdGlvbiArICJcIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChtQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0X2NvcGllZAotICAgICAgICAgICAgICAgICAgICAgICAgLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKLSAgICAgICAgICAgICAgICBjb3BpZWRTb21ldGhpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElDbGlwYm9hcmQgY2xpcCA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zZXRDbGlwYm9hcmRUZXh0KHNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDbGlwYm9hcmQgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gIiIpIHsKKyAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiY29weVNlbGVjdGlvbiBcIiIgKyBzZWxlY3Rpb24gKyAiXCIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1Db250ZXh0CisgICAgICAgICAgICAgICAgICAgICwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudGV4dF9jb3BpZWQKKyAgICAgICAgICAgICAgICAgICAgLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIGNvcGllZFNvbWV0aGluZyA9IHRydWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElDbGlwYm9hcmQgY2xpcCA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImNsaXBib2FyZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0Q2xpcGJvYXJkVGV4dChzZWxlY3Rpb24pOworICAgICAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNsaXBib2FyZCBmYWlsZWQiLCBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU2hpZnRJc1ByZXNzZWQgPSBmYWxzZTsKICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyByZW1vdmUgc2VsZWN0aW9uIHJlZ2lvbiBhbmQgcG9pbnRlcgotICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TRUxFQ1RfTU9ERSkgewotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gY29waWVkU29tZXRoaW5nOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CisgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuICIiOworICAgICAgICByZXR1cm4gbmF0aXZlR2V0U2VsZWN0aW9uKCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewogICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKQEAgLTQxMTQsMTEgKzQwMjEsMjEgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CiAgICAgICAgIGlmIChoYXNXaW5kb3dGb2N1cygpKSBzZXRBY3RpdmUoZmFsc2UpOwogICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGFuZ2VkVmlldywgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5Q2hhbmdlZChjaGFuZ2VkVmlldywgdmlzaWJpbGl0eSk7CisgICAgICAgIC8vIFRoZSB6b29tTWFuYWdlciBtYXkgYmUgbnVsbCBpZiB0aGUgd2VidmlldyBpcyBjcmVhdGVkIGZyb20gWE1MIHRoYXQKKyAgICAgICAgLy8gc3BlY2lmaWVzIHRoZSB2aWV3J3MgdmlzaWJpbGl0eSBwYXJhbSBhcyBub3QgdmlzaWJsZSAoc2VlIGh0dHA6Ly9iLzI3OTQ4NDEpCisgICAgICAgIGlmICh2aXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRSAmJiBtWm9vbU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBAZGVwcmVjYXRlZCBXZWJWaWV3IG5vIGxvbmdlciBuZWVkcyB0byBpbXBsZW1lbnQKICAgICAgKiBWaWV3R3JvdXAuT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lci4gIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBub3cuCkBAIC00MTYzLDE3ICs0MDgwLDE0IEBACiAgICAgICAgICAgICAgICAgLy8gZmFsc2UgZm9yIHRoZSBmaXJzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCAmJiBnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICAgICAmJiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCkpKSB7CisgICAgICAgICAgICBpZiAoIW1ab29tTWFuYWdlci5pc1pvb21QaWNrZXJWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSB6b29tIGNvbnRyb2xzIGNvbWUgaW4gdGhlaXIgb3duIHdpbmRvdywgc28gb3VyIHdpbmRvdwotICAgICAgICAgICAgICAgICAqIGxvc2VzIGZvY3VzLiBPdXIgcG9saWN5IGlzIHRvIG5vdCBkcmF3IHRoZSBjdXJzb3IgcmluZyBpZgotICAgICAgICAgICAgICAgICAqIG91ciB3aW5kb3cgaXMgbm90IGZvY3VzZWQsIGJ1dCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZQorICAgICAgICAgICAgICAgICAqIFRoZSBleHRlcm5hbCB6b29tIGNvbnRyb2xzIGNvbWUgaW4gdGhlaXIgb3duIHdpbmRvdywgc28gb3VyCisgICAgICAgICAgICAgICAgICogd2luZG93IGxvc2VzIGZvY3VzLiBPdXIgcG9saWN5IGlzIHRvIG5vdCBkcmF3IHRoZSBjdXJzb3IgcmluZworICAgICAgICAgICAgICAgICAqIGlmIG91ciB3aW5kb3cgaXMgbm90IGZvY3VzZWQsIGJ1dCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZQogICAgICAgICAgICAgICAgICAqIHRoZSB1c2VyIGNhbiBzdGlsbCBuYXZpZ2F0ZSB0aGUgd2ViIHBhZ2Ugd2l0aCB0aGUgem9vbQogICAgICAgICAgICAgICAgICAqIGNvbnRyb2xzIHNob3dpbmcuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBoYXMgbG9zdCBmb2N1cywgc3RvcCBkcmF3aW5nIHRoZSBjdXJzb3IgcmluZwogICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUdvdEtleURvd24gPSBmYWxzZTsKQEAgLTQyNjIsODEgKzQxNzYsMjQgQEAKICAgICAgICAgICAgIC8vIHN5c3RlbSB3b24ndCBjYWxsIG9uU2l6ZUNoYW5nZWQgaWYgdGhlIGRpbWVuc2lvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjYWxsIHNlbmRWaWV3U2l6ZVpvb20oKSBleHBsaWNpdGx5IHRvCiAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIFdlYktpdCBhYm91dCB0aGUgbmV3IGRpbWVuc2lvbnMuCi0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbVVwZGF0ZVRleHRXcmFwOwotCi0gICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoV2ViVmlldyB3ZWJWaWV3LCBib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7Ci0gICAgICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7Ci0gICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtV2ViVmlldy5tV2ViVmlld0NvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBmb3JjZSwgaW4gY2FzZSBvdXIgaGVpZ2h0IGNoYW5nZWQsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KLSAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXROZXdab29tU2NhbGUobVdlYlZpZXcubUFjdHVhbFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobVpvb21TY2FsZSA9PSAwKSB7IC8vIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHpvb21pbmcKLSAgICAgICAgICAgIC8vIFRvIGFuY2hvciBhdCB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOwotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gYWRqdXN0IHRoZSBtYXggdmlld3BvcnQgd2lkdGggZGVwZW5kaW5nIG9uIHRoZSB2aWV3IGRpbWVuc2lvbnMuIFRoaXMKICAgICAgICAgLy8gaXMgdG8gZW5zdXJlIHRoZSBzY2FsaW5nIGlzIG5vdCBnb2luZyBpbnNhbmUuIFNvIGRvIG5vdCBzaHJpbmsgaXQgaWYKICAgICAgICAgLy8gdGhlIHZpZXcgc2l6ZSBpcyB0ZW1wb3JhcmlseSBzbWFsbGVyLCBlLmcuIHdoZW4gc29mdCBrZXlib2FyZCBpcyB1cC4KLSAgICAgICAgaW50IG5ld01heFZpZXdwb3J0V2lkdGggPSAoaW50KSAoTWF0aC5tYXgodywgaCkgLyBERUZBVUxUX01JTl9aT09NX1NDQUxFKTsKKyAgICAgICAgaW50IG5ld01heFZpZXdwb3J0V2lkdGggPSAoaW50KSAoTWF0aC5tYXgodywgaCkgLyBab29tTWFuYWdlci5nZXREZWZhdWx0TWluWm9vbVNjYWxlKCkpOwogICAgICAgICBpZiAobmV3TWF4Vmlld3BvcnRXaWR0aCA+IHNNYXhWaWV3cG9ydFdpZHRoKSB7CiAgICAgICAgICAgICBzTWF4Vmlld3BvcnRXaWR0aCA9IG5ld01heFZpZXdwb3J0V2lkdGg7CiAgICAgICAgIH0KIAotICAgICAgICAvLyB1cGRhdGUgbU1pblpvb21TY2FsZSBpZiB0aGUgbWluaW11bSB6b29tIHNjYWxlIGlzIG5vdCBmaXhlZAotICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2UgZnJvbSBuYXJyb3cgc2NyZWVuIHRvIHdpZGUgc2NyZWVuLCB0aGUgbmV3IHZpZXdXaWR0aAotICAgICAgICAgICAgLy8gY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9sZCBjb250ZW50IHdpZHRoLiBXZSBsaW1pdCB0aGUgbWluaW11bQotICAgICAgICAgICAgLy8gc2NhbGUgdG8gMS4wZi4gVGhlIHByb3BlciBtaW5pbXVtIHNjYWxlIHdpbGwgYmUgY2FsY3VsYXRlZCB3aGVuCi0gICAgICAgICAgICAvLyB0aGUgbmV3IHBpY3R1cmUgc2hvd3MgdXAuCi0gICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gTWF0aC5taW4oMS4wZiwgKGZsb2F0KSBnZXRWaWV3V2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAvIChtRHJhd0hpc3RvcnkgPyBtSGlzdG9yeVBpY3R1cmUuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7Ci0gICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZUluUGVyY2VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0Ci0gICAgICAgICAgICAgICAgZmxvYXQgaW5pdGlhbFNjYWxlID0gbUluaXRpYWxTY2FsZUluUGVyY2VudCAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAobU1pblpvb21TY2FsZSA+IGluaXRpYWxTY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gaW5pdGlhbFNjYWxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotCi0gICAgICAgIC8vIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQgZHVyaW5nIFdlYlZpZXcgbGF5b3V0LiBBbmQgYW55Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKSBpcyBibG9ja2VkIGR1cmluZyBsYXlvdXQuIEFzIHNldE5ld1pvb21TY2FsZSgpIHdpbGwKLSAgICAgICAgLy8gY2FsbCBpdHMgY2hpbGQgVmlldyB0byByZXBvc2l0aW9uIGl0c2VsZiB0aHJvdWdoIFZpZXdNYW5hZ2VyJ3MKLSAgICAgICAgLy8gc2NhbGVBbGwoKSwgd2UgbmVlZCB0byBwb3N0IGEgUnVubmFibGUgdG8gZW5zdXJlIHJlcXVlc3RMYXlvdXQoKS4KLSAgICAgICAgLy8gPGIvPgotICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgdGV4dCB3cmFwIHNjYWxlIGlmIHdpZHRoIGNoYW5nZWQuCi0gICAgICAgIHBvc3QobmV3IFBvc3RTY2FsZSh0aGlzLCB3ICE9IG93KSk7CisgICAgICAgIG1ab29tTWFuYWdlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00MzQ3LDcgKzQyMDQsNyBAQAogICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQuCiAgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgIGlmIChNYXRoLm1heCh0aXRsZUhlaWdodCAtIHQsIDApICE9IE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gb2xkdCwgMCkpIHsKLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MzU1LDkgKzQyMTIsMTEgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGJvb2xlYW4gZGlzcGF0Y2ggPSB0cnVlOwogCi0gICAgICAgIC8vIFRleHRmaWVsZHMgYW5kIHBsdWdpbnMgbmVlZCB0byByZWNlaXZlIHRoZSBzaGlmdCB1cCBrZXkgZXZlbiBpZgotICAgICAgICAvLyBhbm90aGVyIGtleSB3YXMgcmVsZWFzZWQgd2hpbGUgdGhlIHNoaWZ0IGtleSB3YXMgaGVsZCBkb3duLgotICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSAmJiAobU5hdGl2ZUNsYXNzID09IDAgfHwgIW5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkpIHsKKyAgICAgICAgLy8gVGV4dGZpZWxkcywgcGx1Z2lucywgYW5kIGNvbnRlbnRFZGl0YWJsZSBub2RlcyBuZWVkIHRvIHJlY2VpdmUgdGhlCisgICAgICAgIC8vIHNoaWZ0IHVwIGtleSBldmVuIGlmIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5CisgICAgICAgIC8vIHdhcyBoZWxkIGRvd24uCisgICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMAorICAgICAgICAgICAgICAgIHx8ICFuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkpIHsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NTkxLDgxICs0NDUwLDYgQEAKICAgICBwcml2YXRlIERyYWdUcmFja2VyIG1EcmFnVHJhY2tlcjsKICAgICBwcml2YXRlIERyYWdUcmFja2VySGFuZGxlciBtRHJhZ1RyYWNrZXJIYW5kbGVyOwogCi0gICAgcHJpdmF0ZSBjbGFzcyBTY2FsZURldGVjdG9yTGlzdGVuZXIgaW1wbGVtZW50cwotICAgICAgICAgICAgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICAvLyBjYW5jZWwgdGhlIHNpbmdsZSB0b3VjaCBoYW5kbGluZwotICAgICAgICAgICAgY2FuY2VsVG91Y2goKTsKLSAgICAgICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSBzbyB0aGF0IHRoZSBwYWdlIHdvbid0IGF1dG8gZ3JvdwotICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3Ci0gICAgICAgICAgICAvLyBtaXNwbGFjZWQuCi0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVmlld01hbmFnZXIuc3RhcnRab29tKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TY2FsZUVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVmbG93IHdoZW4gem9vbSBpbjsgd2hlbiB6b29tIG91dCwgZG8gcmVmbG93IGlmIHRoZQotICAgICAgICAgICAgICAgIC8vIG5ldyBzY2FsZSBpcyBhbG1vc3QgbWluaW11bSBzY2FsZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlZmxvd05vdyA9IChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICA8PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKSk7Ci0gICAgICAgICAgICAgICAgLy8gZm9yY2Ugem9vbSBhZnRlciBtUHJldmlld1pvb21Pbmx5IGlzIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgIC8vIG5ldyB2aWV3IHNpemUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFdlYktpdAotICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUsIHJlZmxvd05vdywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgdG8gZHJhdyB3aXRob3V0IHpvb20gZmlsdGVyCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBlZGl0IHRleHQgdmlldyBpZiBuZWVkZWQKLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUKLSAgICAgICAgICAgICAgICAvLyBXZWJUZXh0VmlldyBvbmNlIGFnYWluLgotICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc3RhcnQgYSBkcmFnLCBUT1VDSF9QSU5DSF9EUkFHLCBjYW4ndCB1c2UgVE9VQ0hfSU5JVF9NT0RFIGFzIGl0Ci0gICAgICAgICAgICAvLyBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgY2xpY2ssIGNhbid0IHVzZSBUT1VDSF9EUkFHX01PREUgYXMgaXQKLSAgICAgICAgICAgIC8vIG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBmbGluZy4KLSAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9QSU5DSF9EUkFHOwotICAgICAgICAgICAgbUNvbmZpcm1Nb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0YXJ0VG91Y2goZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpLAotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSk7Ci0KLSAgICAgICAgICAgIG1WaWV3TWFuYWdlci5lbmRab29tKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IChmbG9hdCkgKE1hdGgucm91bmQoZGV0ZWN0b3IuZ2V0U2NhbGVGYWN0b3IoKQotICAgICAgICAgICAgICAgICAgICAqIG1BY3R1YWxTY2FsZSAqIDEwMCkgLyAxMDAuMCk7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpZXdab29tT25seSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAotICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOwotICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gaGl0Rm9jdXNlZFBsdWdpbihpbnQgY29udGVudFgsIGludCBjb250ZW50WSkgewogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAibmF0aXZlRm9jdXNJc1BsdWdpbigpPSIgKyBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpOwpAQCAtNDY3OSw3ICs0NDYzLDcgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpIHsKICAgICAgICAgcmV0dXJuIG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGwgfHwgKG1Gb3J3YXJkVG91Y2hFdmVudHMKLSAgICAgICAgICAgICAgICAmJiBtVG91Y2hNb2RlICE9IFRPVUNIX1NFTEVDVF9NT0RFCisgICAgICAgICAgICAgICAgJiYgIW1TZWxlY3RpbmdUZXh0CiAgICAgICAgICAgICAgICAgJiYgbVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9JR05PUkUpOwogICAgIH0KIApAQCAtNDY4Nyw2ICs0NDcxLDIyIEBACiAgICAgICAgIHJldHVybiBtRnVsbFNjcmVlbkhvbGRlciAhPSBudWxsOwogICAgIH0KIAorICAgIHZvaWQgb25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICAvLyBjYW5jZWwgdGhlIHNpbmdsZSB0b3VjaCBoYW5kbGluZworICAgICAgICBjYW5jZWxUb3VjaCgpOworICAgICAgICBvblpvb21BbmltYXRpb25TdGFydCgpOworICAgIH0KKworICAgIHZvaWQgb25QaW5jaFRvWm9vbUFuaW1hdGlvbkVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBvblpvb21BbmltYXRpb25FbmQoKTsKKyAgICAgICAgLy8gc3RhcnQgYSBkcmFnLCBUT1VDSF9QSU5DSF9EUkFHLCBjYW4ndCB1c2UgVE9VQ0hfSU5JVF9NT0RFIGFzCisgICAgICAgIC8vIGl0IG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBjbGljaywgY2FuJ3QgdXNlIFRPVUNIX0RSQUdfTU9ERQorICAgICAgICAvLyBhcyBpdCBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgZmxpbmcuCisgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9QSU5DSF9EUkFHOworICAgICAgICBtQ29uZmlybU1vdmUgPSB0cnVlOworICAgICAgICBzdGFydFRvdWNoKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSwgbUxhc3RUb3VjaFRpbWUpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDAgfHwgIWlzQ2xpY2thYmxlKCkgfHwgIWlzTG9uZ0NsaWNrYWJsZSgpKSB7CkBAIC00NzA0LDMyICs0NTA0LDM2IEBACiAKICAgICAgICAgLy8gRklYTUU6IHdlIG1heSBjb25zaWRlciB0byBnaXZlIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlIG11bHRpLXRvdWNoCiAgICAgICAgIC8vIGV2ZW50cyBsYXRlci4KLSAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiBldi5nZXRQb2ludGVyQ291bnQoKSA+IDEpIHsKLSAgICAgICAgICAgIGlmIChtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgICAgIG1TY2FsZURldGVjdG9yLm9uVG91Y2hFdmVudChldik7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY2FsZURldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lID0gZXZlbnRUaW1lOworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLnN1cHBvcnRzTXVsdGlUb3VjaFpvb20oKSAmJiBldi5nZXRQb2ludGVyQ291bnQoKSA+IDEpIHsKKworICAgICAgICAgICAgLy8gaWYgdGhlIHBhZ2UgZGlzYWxsb3dzIHpvb20sIHRoZW4gc2tpcCBtdWx0aS1wb2ludGVyIGFjdGlvbgorICAgICAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1pvb21TY2FsZUZpeGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IgPSBtWm9vbU1hbmFnZXIuZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpOworICAgICAgICAgICAgZGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKKworICAgICAgICAgICAgaWYgKGRldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHggPSBkZXRlY3Rvci5nZXRGb2N1c1goKTsKKyAgICAgICAgICAgIHkgPSBkZXRlY3Rvci5nZXRGb2N1c1koKTsKKyAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxUb3VjaCgpOworICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgbUxhc3RUb3VjaFgvWSB0byB0aGUgcmVtYWluaW5nIHBvaW50CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OworICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgorICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeCA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWCgpOwotICAgICAgICAgICAgICAgIHkgPSBtU2NhbGVEZXRlY3Rvci5nZXRGb2N1c1koKTsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKSAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLOwotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgewotICAgICAgICAgICAgICAgICAgICBjYW5jZWxUb3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgbUxhc3RUb3VjaFgvWSB0byB0aGUgcmVtYWluaW5nIHBvaW50Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIHggb3IgeSBpbmRpY2F0ZSBpdCBpcyBvbiB0aGUgZWRnZSwgc2tpcCBpdC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhZ2UgZGlzYWxsb3cgem9vbSwgc2tpcCBtdWx0aS1wb2ludGVyIGFjdGlvbgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CkBAIC00NzY3LDE4ICs0NTcxLDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9EUkFHX1NUQVJUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5GdWxsU2NyZWVuTW9kZSgpICYmIG1TaGlmdElzUHJlc3NlZCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCA9IG1TY3JvbGxYICsgKGludCkgeDsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFkgPSBtU2Nyb2xsWSArIChpbnQpIHk7Ci0gICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9TRUxFQ1RfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInNlbGVjdD0iICsgbVNlbGVjdFggKyAiLCIgKyBtU2VsZWN0WSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbVRvdWNoU2VsZWN0aW9uID0gbUV4dGVuZFNlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gZHJhdyB0aGUgaS1iZWFtIGluc3RlYWQgb2YgdGhlIGFycm93CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpdmF0ZUhhbmRsZXIuaGFzTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKSkgewogICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZIDwgbURvdWJsZVRhcFNsb3BTcXVhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET1VCTEVfVEFQX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NzkwLDE3ICs0NTg3LDQ1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgPSAoaW50KSB5ICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IG1Ub3VjaEhpZ2hsaWdodFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dFdmVudCAmJiBldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQlJPV1NFUl9ET1VCTEVfVEFQX0RVUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RUb3VjaFVwVGltZSksIGV2ZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhd1NlbGVjdGlvblBvaW50ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25TdGFydGVkID0gbmF0aXZlU3RhcnRTZWxlY3Rpb24oY29udGVudFgsIGNvbnRlbnRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2VsZWN0PSIgKyBjb250ZW50WCArICIsIiArIGNvbnRlbnRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBsaW5rCiAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFCkBAIC00ODI0LDE3ICs0NjQ5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBuZWVkcyB0byBzZXQgdGhlbSBmb3IgY29tcHV0ZSBkZWx0YVgvWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCAwKSwgVEFQX1RJTUVPVVQpOwpAQCAtNDg1NSwyNCArNDY3OCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9ET1VCTEVfVEFQX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSAmJiBtQ29uZmlybU1vdmUgJiYgKGZpcnN0TW92ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUaW1lIC0gbUxhc3RTZW50VG91Y2hUaW1lID4gbUN1cnJlbnRUb3VjaEludGVydmFsKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vdmUgJiYgIWluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9idGFpbk1lc3NhZ2UoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQsCkBAIC00ODkyLDIwICs0NzE1LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1Ub3VjaE1vZGUgPSAiICsgbVRvdWNoTW9kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXYpOwotICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TRUxFQ1RfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFggPSBtU2Nyb2xsWCArIChpbnQpIHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WSA9IG1TY3JvbGxZICsgKGludCkgeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAieHRlbmQ9IiArIG1TZWxlY3RYICsgIiwiICsgbVNlbGVjdFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0ICYmIG1TZWxlY3Rpb25TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJleHRlbmQ9IiArIGNvbnRlbnRYICsgIiwiICsgY29udGVudFkpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV4dGVuZFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUpIHsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db25maXJtTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX05PX0ZST01fVE9VQ0hfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgbUxhc3RUb3VjaFRpbWUgYXMgd2UgbWF5IG5lZWQgdG8gZG8gZmxpbmcgYXQKQEAgLTUwMzMsNiArNDg1Niw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKCkpIHJlcXVlc3RGb2N1cygpOwogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwpAQCAtNTA0MSwxMCArNDg2NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hVcFRpbWUgPSBldmVudFRpbWU7CkBAIC01MDU5LDIwICs0ODc5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaGFuZGxlRG91YmxlVGFwKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX1NFTEVDVF9NT0RFOgotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q29weSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoU2VsZWN0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9JTklUX01PREU6IC8vIHRhcAogICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX1NIT1JUUFJFU1NfU1RBUlRfTU9ERToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9TSE9SVFBSRVNTX01PREU6CkBAIC01MDg0LDkgKzQ4OTYsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb21wdXRlTWF4U2Nyb2xsWCgpID4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wdXRlTWF4U2Nyb2xsWSgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUkgdGFrZXMgY29udHJvbCBiYWNrLCBjYW5jZWwgV2ViQ29yZSB0b3VjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxXZWJDb3JlVG91Y2hFdmVudChjb250ZW50WCwgY29udGVudFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBwZXJmb3JtZWQgYSB2ZXJ5IHF1aWNrIHRvdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbWF5IGdldCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBXZWJDb3JlIGhhcyBoYWQgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGFueSBjYWxsIHRvIHByZXZlbnREZWZhdWx0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKUyB0b3VjaCBoYW5kbGVyIHdpbGwgbm90IGhhdmUgYmVlbiBleGVjdXRlZCB5ZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbmNlIHdlIHdpbGwgc2VlIGJvdGggdGhlIFVJIChub3cpIGFuZCBXZWJDb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGVuIGNvbnRleHQgc3dpdGNoZXMpIGhhbmRsaW5nIHRoZSBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB3ZWIgZGV2ZWxvcGVyIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNlcyBwcmV2ZW50RGVmYXVsdCBpbiB0aGVpciB0b3VjaCBoYW5kbGVyLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBuYXR1cmUgb2Ygb3VyIGFzeW5jaHJvbm91cyB0b3VjaCBtb2RlbC4KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIG5vdCByZXdyaXRlIGRyYWcgY29kZSBoZXJlLCBidXQgd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0cnkgZmxpbmcgaWYgaXQgYXBwbGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVkdWNlUHJpb3JpdHkoKTsKQEAgLTUxMDMsNyArNDkyMywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXBwaW5nIG9uIHNlbGVjdGlvbiBvciBjb250cm9scyBkb2VzIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYXRpdmVIaXRTZWxlY3Rpb24oY29udGVudFgsIGNvbnRlbnRZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRyaWdnZXIgZG91YmxlIHRhcCBpZiB0aGUgV2ViVmlldyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FuWm9vbUluKCkgfHwgY2FuWm9vbU91dCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9TSU5HTEVfVEFQLCBWaWV3Q29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvdWJsZVRhcFRpbWVvdXQoKSk7CkBAIC01MTk0LDIxICs1MDI0LDEwIEBACiAgICAgICAgIGlmICghbURyYWdGcm9tVGV4dElucHV0KSB7CiAgICAgICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CiAgICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3Muc3VwcG9ydFpvb20oKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICYmICFnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5pc1Zpc2libGUoKQotICAgICAgICAgICAgICAgICYmIG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgJiYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBzZXR0aW5ncy5nZXREb3VibGVUYXBUb2FzdENvdW50KCk7Ci0gICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3ICYmIGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7Ci0gICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5kb3VibGVfdGFwX3RvYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBpZiAobUhvcml6b250YWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYKKyAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5pbnZva2Vab29tUGlja2VyKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUyMTYsMTggKzUwMzUsNyBAQAogICAgICAgICBpZiAoKGRlbHRhWCB8IGRlbHRhWSkgIT0gMCkgewogICAgICAgICAgICAgc2Nyb2xsQnkoZGVsdGFYLCBkZWx0YVkpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1BsdXNNaW51cyA9IG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlOwotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCAmJiBzaG93UGx1c01pbnVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNob3coc2hvd1BsdXNNaW51cywgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci5rZWVwWm9vbVBpY2tlclZpc2libGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc3RvcFRvdWNoKCkgewpAQCAtNTI2Miw2ICs1MDcwLDkgQEAKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFNXSVRDSF9UT19MT05HUFJFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRFJBR19IRUxEX01PVElPTkxFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQVdBS0VOX1NDUk9MTF9CQVJTKTsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgfQogICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKQEAgLTUyNzMsOCArNTA4NCwxMCBAQAogICAgIHByaXZhdGUgZmxvYXQgbVRyYWNrYmFsbFJlbWFpbnNZID0gMC4wZjsKICAgICBwcml2YXRlIGludCBtVHJhY2tiYWxsWE1vdmUgPSAwOwogICAgIHByaXZhdGUgaW50IG1UcmFja2JhbGxZTW92ZSA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RpbmdUZXh0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3Rpb25TdGFydGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FeHRlbmRTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRvdWNoU2VsZWN0aW9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EcmF3U2VsZWN0aW9uUG9pbnRlciA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfS0VZX1RJTUVPVVQgPSAxMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfVElNRU9VVCA9IDIwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0tCQUxMX1dBSVQgPSAxMDA7CkBAIC01MzEzLDEwICs1MTI2LDggQEAKICAgICAgICAgICAgIGlmIChldi5nZXRZKCkgPCAwKSBwYWdlVXAodHJ1ZSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBib29sZWFuIHNoaWZ0UHJlc3NlZCA9IG1TaGlmdElzUHJlc3NlZCAmJiAobU5hdGl2ZUNsYXNzID09IDAKLSAgICAgICAgICAgICAgICB8fCAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKTsKICAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBpZiAoc2hpZnRQcmVzc2VkKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZGlzY2FyZCBwcmVzcyBpZiBjb3B5IGluIHByb2dyZXNzCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVHJhY2tiYWxsRG93biA9IHRydWU7CkBAIC01MzQxLDExICs1MTUyLDEzIEBACiAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTE9OR19QUkVTU19DRU5URVIpOwogICAgICAgICAgICAgbVRyYWNrYmFsbERvd24gPSBmYWxzZTsKICAgICAgICAgICAgIG1UcmFja2JhbGxVcFRpbWUgPSB0aW1lOwotICAgICAgICAgICAgaWYgKHNoaWZ0UHJlc3NlZCkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICAgICAgaWYgKG1FeHRlbmRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWl0Q29weSgpOworICAgICAgICAgICAgICAgICAgICBjb3B5U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtRXh0ZW5kU2VsZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gZHJhdyB0aGUgaS1iZWFtIGluc3RlYWQgb2YgdGhlIGFycm93CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBkaXNjYXJkIHByZXNzIGlmIGNvcHkgaW4gcHJvZ3Jlc3MKQEAgLTU0MTIsOCArNTIyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiB5UmF0ZT0iICsgeVJhdGUKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKHZpZXdUb0NvbnRlbnRYKG1TZWxlY3RYKSwKLSAgICAgICAgICAgICAgICB2aWV3VG9Db250ZW50WShtU2VsZWN0WSksIG1FeHRlbmRTZWxlY3Rpb24pOworICAgICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKHZpZXdUb0NvbnRlbnRYKG1TZWxlY3RYKSwgdmlld1RvQ29udGVudFkobVNlbGVjdFkpKTsKICAgICAgICAgaW50IHNjcm9sbFggPSBtU2VsZWN0WCA8IG1TY3JvbGxYID8gLVNFTEVDVF9DVVJTT1JfT0ZGU0VUCiAgICAgICAgICAgICAgICAgOiBtU2VsZWN0WCA+IG1heFggLSBTRUxFQ1RfQ1VSU09SX09GRlNFVCA/IFNFTEVDVF9DVVJTT1JfT0ZGU0VUCiAgICAgICAgICAgICAgICAgOiAwOwpAQCAtNTQ3OSw3ICs1MjkxLDE2IEBACiAgICAgICAgIGZsb2F0IHlSYXRlID0gbVRyYWNrYmFsbFJlbWFpbnNZICogMTAwMCAvIGVsYXBzZWQ7CiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKICAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChtU2hpZnRJc1ByZXNzZWQgJiYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgaWYgKCFtRHJhd1NlbGVjdGlvblBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGFzdCBzZWxlY3Rpb24gd2FzIG1hZGUgYnkgdG91Y2gsIGRpc2FibGluZyBkcmF3aW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBwb2ludGVyLiBBbGxvdyB0aGUgdHJhY2tiYWxsIHRvIGFkanVzdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBvZiB0aGUgdG91Y2ggY29udHJvbC4KKyAgICAgICAgICAgICAgICBtU2VsZWN0WCA9IGNvbnRlbnRUb1ZpZXdYKG5hdGl2ZVNlbGVjdGlvblgoKSk7CisgICAgICAgICAgICAgICAgbVNlbGVjdFkgPSBjb250ZW50VG9WaWV3WShuYXRpdmVTZWxlY3Rpb25ZKCkpOworICAgICAgICAgICAgICAgIG1EcmF3U2VsZWN0aW9uUG9pbnRlciA9IG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIG5hdGl2ZVNldEV4dGVuZFNlbGVjdGlvbigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbW92ZVNlbGVjdGlvbihzY2FsZVRyYWNrYmFsbFgoeFJhdGUsIHZpZXdXaWR0aCksCiAgICAgICAgICAgICAgICAgICAgIHNjYWxlVHJhY2tiYWxsWSh5UmF0ZSwgdmlld0hlaWdodCkpOwogICAgICAgICAgICAgbVRyYWNrYmFsbFJlbWFpbnNYID0gbVRyYWNrYmFsbFJlbWFpbnNZID0gMDsKQEAgLTU1MTcsMTEgKzUzMzgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1g9IiArIG1UcmFja2JhbGxSZW1haW5zWAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWT0iICsgbVRyYWNrYmFsbFJlbWFpbnNZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdkhhbmRsZWRLZXkoc2VsZWN0S2V5Q29kZSwgY291bnQsIGZhbHNlLCB0aW1lKSkgewogICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChrZXlDb2RlVG9Tb3VuZHNFZmZlY3Qoc2VsZWN0S2V5Q29kZSkpOwogICAgICAgICAgICAgfQpAQCAtNTU2MCw2ICs1MzgxLDE5IEBACiAgICAgICAgICAgICAgICAgLSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksIDApOwogICAgIH0KIAorICAgIGJvb2xlYW4gdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CisgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7CisgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CisgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZmxpbmdTY3JvbGwoaW50IHZ4LCBpbnQgdnkpIHsKICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgdngsIHZ5LCAwLCBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAogICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwpAQCAtNTU5NSwxMyArNTQyOSwxNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZsb2F0IGN1cnJlbnRWZWxvY2l0eSA9IG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKTsKLSAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHsKKyAgICAgICAgZmxvYXQgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDAgJiYgdmVsb2NpdHkKKyAgICAgICAgICAgICAgICA+IG1MYXN0VmVsb2NpdHkgKiBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04pIHsKICAgICAgICAgICAgIGZsb2F0IGRlbHRhUiA9IChmbG9hdCkgKE1hdGguYWJzKE1hdGguYXRhbjIobUxhc3RWZWxZLCBtTGFzdFZlbFgpCiAgICAgICAgICAgICAgICAgICAgIC0gTWF0aC5hdGFuMih2eSwgdngpKSk7CiAgICAgICAgICAgICBmaW5hbCBmbG9hdCBjaXJjbGUgPSAoZmxvYXQpIChNYXRoLlBJKSAqIDIuMGY7CiAgICAgICAgICAgICBpZiAoZGVsdGFSID4gY2lyY2xlICogMC45ZiB8fCBkZWx0YVIgPCBjaXJjbGUgKiAwLjFmKSB7CiAgICAgICAgICAgICAgICAgdnggKz0gY3VycmVudFZlbG9jaXR5ICogbUxhc3RWZWxYIC8gbUxhc3RWZWxvY2l0eTsKICAgICAgICAgICAgICAgICB2eSArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFkgLyBtTGFzdFZlbG9jaXR5OworICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZG9GbGluZyB2eD0gIiArIHZ4ICsgIiB2eT0iICsgdnkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU2MTcsNyArNTQ1NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgbUxhc3RWZWxYID0gdng7CiAgICAgICAgIG1MYXN0VmVsWSA9IHZ5OwotICAgICAgICBtTGFzdFZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CisgICAgICAgIG1MYXN0VmVsb2NpdHkgPSB2ZWxvY2l0eTsKIAogICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAtdngsIC12eSwgMCwgbWF4WCwgMCwgbWF4WSk7CiAgICAgICAgIC8vIFRPRE86IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdmVsb2NpdHksIGlmIHRoZSByYW5nZSBpcwpAQCAtNTYzMCwzMiArNTQ2Nyw2IEBACiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gem9vbVdpdGhQcmV2aWV3KGZsb2F0IHNjYWxlLCBib29sZWFuIHVwZGF0ZVRleHRXcmFwU2NhbGUpIHsKLSAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgIG1Jbml0aWFsU2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtU2Nyb2xsWTsKLQotICAgICAgICAvLyBzbmFwIHRvIERFRkFVTFRfU0NBTEUgaWYgaXQgaXMgY2xvc2UKLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbURlZmF1bHRTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgc2NhbGUgPSBtRGVmYXVsdFNjYWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCB1cGRhdGVUZXh0V3JhcFNjYWxlLCBmYWxzZSk7Ci0KLSAgICAgICAgaWYgKG9sZFNjYWxlICE9IG1BY3R1YWxTY2FsZSkgewotICAgICAgICAgICAgLy8gdXNlIG1ab29tUGlja2VyU2NhbGUgdG8gc2VlIHpvb20gcHJldmlldyBmaXJzdAotICAgICAgICAgICAgbVpvb21TdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUludkluaXRpYWxab29tU2NhbGUgPSAxLjBmIC8gb2xkU2NhbGU7Ci0gICAgICAgICAgICBtSW52RmluYWxab29tU2NhbGUgPSAxLjBmIC8gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgbVpvb21TY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgdmlldyBjb250YWluaW5nIHpvb20gY29udHJvbHMgaS5lLiArLy0gYnV0dG9ucy4gVGhlIGNhbGxlciBpcwogICAgICAqIGluIGNoYXJnZSBvZiBpbnN0YWxsaW5nIHRoaXMgdmlldyB0byB0aGUgdmlldyBoaWVyYXJjaHkuIFRoaXMgdmlldyB3aWxsCkBAIC01Njc1LDgxICs1NDg2LDI5IEBACiAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUaGlzIFdlYlZpZXcgZG9lc24ndCBzdXBwb3J0IHpvb20uIik7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgotICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKLSAgICAgICAgICAgICAqIGxheW91dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgZGlzbWlzcyB0aGUgY29udHJvbHMgaWYgdGhlIHVzZXIgaGFzCi0gICAgICAgICAgICAgICAgICAgICAqIGZvY3VzIG9uIHRoZW0uIFdhaXQgYW5kIGNoZWNrIGFnYWluIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtWm9vbUNvbnRyb2xzOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldEV4dGVybmFsWm9vbVBpY2tlcigpOwogICAgIH0KIAotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgY3JlYXRlWm9vbUNvbnRyb2xzKCkgewotICAgICAgICBFeHRlbmRlZFpvb21Db250cm9scyB6b29tQ29udHJvbHMgPSBuZXcgRXh0ZW5kZWRab29tQ29udHJvbHMobUNvbnRleHQKLSAgICAgICAgICAgICwgbnVsbCk7Ci0gICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgIHpvb21JbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB6b29tQ29udHJvbHM7CisgICAgdm9pZCBkaXNtaXNzWm9vbUNvbnRyb2woKSB7CisgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOworICAgIH0KKworICAgIGZsb2F0IGdldERlZmF1bHRab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUge0BsaW5rIFpvb21CdXR0b25zQ29udHJvbGxlcn0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWRkCi0gICAgICogYWRkaXRpb25hbCBidXR0b25zIHRvIHRoZSB6b29tIGNvbnRyb2xzIHdpbmRvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHtAbGluayBab29tQnV0dG9uc0NvbnRyb2xsZXJ9IHVzZWQgYnkgdGhpcyBjbGFzcywKLSAgICAgKiAgICAgICAgIG9yIG51bGwgaWYgaXQgaXMgdW5hdmFpbGFibGUuCi0gICAgICogQGhpZGUKKyAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBpbi4KICAgICAgKi8KLSAgICBwdWJsaWMgWm9vbUJ1dHRvbnNDb250cm9sbGVyIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlciA9IG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIodGhpcyk7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldE9uWm9vbUxpc3RlbmVyKG1ab29tTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gWm9vbUJ1dHRvbnNDb250cm9sbGVyIHBvc2l0aW9ucyB0aGUgYnV0dG9ucyBhdCB0aGUgYm90dG9tLCBidXQgaW4KLSAgICAgICAgICAgIC8vIHRoZSBtaWRkbGUuIENoYW5nZSB0aGVpciBsYXlvdXQgcGFyYW1ldGVycyBzbyB0aGV5IGFwcGVhciBvbiB0aGUKLSAgICAgICAgICAgIC8vIHJpZ2h0LgotICAgICAgICAgICAgVmlldyBjb250cm9scyA9IG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCk7Ci0gICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IGNvbnRyb2xzLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyBmcmFtZVBhcmFtcyA9IChGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHBhcmFtczsKLSAgICAgICAgICAgICAgICBmcmFtZVBhcmFtcy5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuY2FuWm9vbUluKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTc1NywxNSArNTUxNiw3IEBACiAgICAgICogQHJldHVybiBUUlVFIGlmIHpvb20gaW4gc3VjY2VlZHMuIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7Ci0gICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCi0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIG1ab29tQ2VudGVyWCA9IGdldFZpZXdXaWR0aCgpICogLjVmOwotICAgICAgICBtWm9vbUNlbnRlclkgPSBnZXRWaWV3SGVpZ2h0KCkgKiAuNWY7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgcmV0dXJuIHpvb21XaXRoUHJldmlldyhtQWN0dWFsU2NhbGUgKiAxLjI1ZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbUluKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NzczLDE0ICs1NTI0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMuIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgewotICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQotICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIG1ab29tQ2VudGVyWCA9IGdldFZpZXdXaWR0aCgpICogLjVmOwotICAgICAgICBtWm9vbUNlbnRlclkgPSBnZXRWaWV3SGVpZ2h0KCkgKiAuNWY7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgcmV0dXJuIHpvb21XaXRoUHJldmlldyhtQWN0dWFsU2NhbGUgKiAwLjhmLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tT3V0KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGlvbigpIHsKQEAgLTU4ODEsNyArNTYyNSwxNCBAQAogICAgICAgICAvLyBtTGFzdFRvdWNoWCBhbmQgbUxhc3RUb3VjaFkgYXJlIHRoZSBwb2ludCBpbiB0aGUgY3VycmVudCB2aWV3cG9ydAogICAgICAgICBpbnQgY29udGVudFggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtTGFzdFRvdWNoWCArIG1TY3JvbGxYKTsKICAgICAgICAgaW50IGNvbnRlbnRZID0gdmlld1RvQ29udGVudFkoKGludCkgbUxhc3RUb3VjaFkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIGlmIChuYXRpdmVQb2ludEluTmF2Q2FjaGUoY29udGVudFgsIGNvbnRlbnRZLCBtTmF2U2xvcCkpIHsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodChmYWxzZSk7CisgICAgICAgICAgICBXZWJWaWV3Q29yZS5Ub3VjaFVwRGF0YSB0b3VjaFVwRGF0YSA9IG5ldyBXZWJWaWV3Q29yZS5Ub3VjaFVwRGF0YSgpOworICAgICAgICAgICAgLy8gdXNlICIwIiBhcyBnZW5lcmF0aW9uIGlkIHRvIGluZm9ybSBXZWJLaXQgdG8gdXNlIHRoZSBzYW1lIHgveSBhcworICAgICAgICAgICAgLy8gaXQgdXNlZCB3aGVuIHByb2Nlc3NpbmcgR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUworICAgICAgICAgICAgdG91Y2hVcERhdGEubU1vdmVHZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9VUCwgdG91Y2hVcERhdGEpOworICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZVBvaW50SW5OYXZDYWNoZShjb250ZW50WCwgY29udGVudFksIG1OYXZTbG9wKSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUuTW90aW9uVXBEYXRhIG1vdGlvblVwRGF0YSA9IG5ldyBXZWJWaWV3Q29yZQogICAgICAgICAgICAgICAgICAgICAuTW90aW9uVXBEYXRhKCk7CiAgICAgICAgICAgICBtb3Rpb25VcERhdGEubUZyYW1lID0gbmF0aXZlQ2FjaGVIaXRGcmFtZVBvaW50ZXIoKTsKQEAgLTU5MDksMjcgKzU2NjAsMTYgQEAKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmlldyAoUGx1Z2luKSBpcyBmdWxseSB2aXNpYmxlIGFuZCBtYXhpbWl6ZWQgaW5zaWRlCiAgICAgICogdGhlIFdlYlZpZXcuCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGx1Z2luRml0T25TY3JlZW4oVmlld01hbmFnZXIuQ2hpbGRWaWV3IHZpZXcpIHsKLSAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKLSAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIHZpZXcud2lkdGgsCi0gICAgICAgICAgICAgICAgKGZsb2F0KSB2aWV3SGVpZ2h0IC8gdmlldy5oZWlnaHQpOwotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFRvVmlld1godmlldy54KSA+PSBtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LnggKyB2aWV3LndpZHRoKSA8PSBtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSkgPj0gbVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55ICsgdmlldy5oZWlnaHQpIDw9IG1TY3JvbGxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJvb2xlYW4gaXNQbHVnaW5GaXRPblNjcmVlbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgdmlldykgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOworICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gdmlldy53aWR0aCwgKGZsb2F0KSB2aWV3SGVpZ2h0IC8gdmlldy5oZWlnaHQpOworICAgICAgICBzY2FsZSA9IG1ab29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKyAgICAgICAgcmV0dXJuICFtWm9vbU1hbmFnZXIud2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54KSA+PSBtU2Nyb2xsWAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCArIHZpZXcud2lkdGgpIDw9IG1TY3JvbGxYICsgdmlld1dpZHRoCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55KSA+PSBtU2Nyb2xsWQorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSArIHZpZXcuaGVpZ2h0KSA8PSBtU2Nyb2xsWSArIHZpZXdIZWlnaHQ7CiAgICAgfQogCiAgICAgLyoKQEAgLTU5MzgsMjIgKzU2NzgsMTkgQEAKICAgICAgKiBhbmltYXRlZCBzY3JvbGwgdG8gY2VudGVyIGl0LiBJZiB0aGUgem9vbSBuZWVkcyB0byBiZSBjaGFuZ2VkLCBmaW5kIHRoZQogICAgICAqIHpvb20gY2VudGVyIGFuZCBkbyBhIHNtb290aCB6b29tIHRyYW5zaXRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNlbnRlckZpdFJlY3QoaW50IGRvY1gsIGludCBkb2NZLCBpbnQgZG9jV2lkdGgsIGludCBkb2NIZWlnaHQpIHsKKyAgICB2b2lkIGNlbnRlckZpdFJlY3QoaW50IGRvY1gsIGludCBkb2NZLCBpbnQgZG9jV2lkdGgsIGludCBkb2NIZWlnaHQpIHsKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwogICAgICAgICBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIGRvY1dpZHRoLCAoZmxvYXQpIHZpZXdIZWlnaHQKICAgICAgICAgICAgICAgICAvIGRvY0hlaWdodCk7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKKyAgICAgICAgc2NhbGUgPSBtWm9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisgICAgICAgIGlmICghbVpvb21NYW5hZ2VyLndpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgewogICAgICAgICAgICAgcGluU2Nyb2xsVG8oY29udGVudFRvVmlld1goZG9jWCArIGRvY1dpZHRoIC8gMikgLSB2aWV3V2lkdGggLyAyLAogICAgICAgICAgICAgICAgICAgICBjb250ZW50VG9WaWV3WShkb2NZICsgZG9jSGVpZ2h0IC8gMikgLSB2aWV3SGVpZ2h0IC8gMiwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5YID0gZG9jWCAqIG1BY3R1YWxTY2FsZSAtIG1TY3JvbGxYOworICAgICAgICAgICAgZmxvYXQgYWN0dWFsU2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblggPSBkb2NYICogYWN0dWFsU2NhbGUgLSBtU2Nyb2xsWDsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3WCA9IGRvY1ggKiBzY2FsZTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3V2lkdGggPSBkb2NXaWR0aCAqIHNjYWxlOwogICAgICAgICAgICAgZmxvYXQgbmV3TWF4V2lkdGggPSBtQ29udGVudFdpZHRoICogc2NhbGU7CkBAIC01OTY0LDkgKzU3MDEsOSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JlZW5YID4gKG5ld01heFdpZHRoIC0gcmVjdFZpZXdYIC0gcmVjdFZpZXdXaWR0aCkpIHsKICAgICAgICAgICAgICAgICBuZXdTY3JlZW5YID0gdmlld1dpZHRoIC0gKG5ld01heFdpZHRoIC0gcmVjdFZpZXdYKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IChvbGRTY3JlZW5YICogc2NhbGUgLSBuZXdTY3JlZW5YICogbUFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5ZID0gZG9jWSAqIG1BY3R1YWxTY2FsZSArIGdldFRpdGxlSGVpZ2h0KCkKKyAgICAgICAgICAgIGZsb2F0IHpvb21DZW50ZXJYID0gKG9sZFNjcmVlblggKiBzY2FsZSAtIG5ld1NjcmVlblggKiBhY3R1YWxTY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBhY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5ZID0gZG9jWSAqIGFjdHVhbFNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKQogICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdZID0gZG9jWSAqIHNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3SGVpZ2h0ID0gZG9jSGVpZ2h0ICogc2NhbGU7CkBAIC01OTc4LDEwOSArNTcxNSwxMCBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JlZW5ZID4gKG5ld01heEhlaWdodCAtIHJlY3RWaWV3WSAtIHJlY3RWaWV3SGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIG5ld1NjcmVlblkgPSB2aWV3SGVpZ2h0IC0gKG5ld01heEhlaWdodCAtIHJlY3RWaWV3WSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSAob2xkU2NyZWVuWSAqIHNjYWxlIC0gbmV3U2NyZWVuWSAqIG1BY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KHNjYWxlLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRpc21pc3Nab29tQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBjYWxsZWQgYWZ0ZXIgV2ViVmlldydzIGRlc3Ryb3koKS4gQXMgd2UgY2FuJ3QgZ2V0IHNldHRpbmdzLAotICAgICAgICAgICAgLy8ganVzdCBoaWRlIHpvb20gY29udHJvbCBmb3IgYm90aCBzdHlsZXMuCi0gICAgICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJ1bGUgZm9yIGRvdWJsZSB0YXA6Ci0gICAgLy8gMS4gaWYgdGhlIGN1cnJlbnQgc2NhbGUgaXMgbm90IHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgbGF5b3V0Ci0gICAgLy8gICAgYWxnb3JpdGhtIGlzIE5BUlJPV19DT0xVTU5TLCBmaXQgdG8gY29sdW1uOwotICAgIC8vIDIuIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIG5vdCBvdmVydmlldyBtb2RlLCBjaGFuZ2UgdG8gb3ZlcnZpZXcgbW9kZTsKLSAgICAvLyAzLiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBvdmVydmlldyBtb2RlLCBjaGFuZ2UgdG8gZGVmYXVsdCBzY2FsZS4KLSAgICBwcml2YXRlIHZvaWQgZG9Eb3VibGVUYXAoKSB7Ci0gICAgICAgIGlmIChtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKS5nZXRVc2VXaWRlVmlld1BvcnQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1ab29tQ2VudGVyWCA9IG1MYXN0VG91Y2hYOwotICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoMCk7Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0gICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOwotICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSA8IGdldFRpdGxlSGVpZ2h0KCkpIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICB6b29tV2l0aFByZXZpZXcoKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBjZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHpvb21Ub0RlZmF1bHQgPSBmYWxzZTsKLSAgICAgICAgaWYgKChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMpCi0gICAgICAgICAgICAgICAgJiYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG1UZXh0V3JhcFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkpIHsKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgZmxvYXQgb3ZlcnZpZXdTY2FsZSA9IChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gb3ZlcnZpZXdTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgZmxvYXQgbmV3U2NhbGUgPSAoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG5ld1NjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZIDwgZ2V0VGl0bGVIZWlnaHQoKSkgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhuZXdTY2FsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG1EZWZhdWx0U2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgem9vbVRvRGVmYXVsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB6b29tVG9EZWZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoem9vbVRvRGVmYXVsdCkgewotICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UobUFuY2hvclgsIG1BbmNob3JZLCBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgaWYgKGxlZnQgIT0gTk9fTEVGVEVER0UpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSA1cHQgcGFkZGluZyB0byB0aGUgbGVmdCBlZGdlLgotICAgICAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IGNvbnRlbnRUb1ZpZXdYKGxlZnQgPCA1ID8gMCA6IChsZWZ0IC0gNSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSB0aGUgem9vbSBjZW50ZXIgc28gdGhhdCB0aGUgbmV3IHNjcm9sbCB4IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgbGVmdCBlZGdlLgotICAgICAgICAgICAgICAgIGlmICh2aWV3TGVmdCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gdmlld0xlZnQgKiBtRGVmYXVsdFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAobURlZmF1bHRTY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQnkodmlld0xlZnQsIDApOwotICAgICAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhtRGVmYXVsdFNjYWxlLCB0cnVlKTsKKyAgICAgICAgICAgIGZsb2F0IHpvb21DZW50ZXJZID0gKG9sZFNjcmVlblkgKiBzY2FsZSAtIG5ld1NjcmVlblkgKiBhY3R1YWxTY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBhY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbUNlbnRlcih6b29tQ2VudGVyWCwgem9vbUNlbnRlclkpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnN0YXJ0Wm9vbUFuaW1hdGlvbihzY2FsZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MDkyLDYgKzU3MzAsOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdEZvY3VzKGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CisgICAgICAgIC8vIEZJWE1FOiBJZiBhIHN1YndpbmRvdyBpcyBzaG93aW5nIGZpbmQsIGFuZCB0aGUgdXNlciB0b3VjaGVzIHRoZQorICAgICAgICAvLyBiYWNrZ3JvdW5kIHdpbmRvdywgaXQgY2FuIHN0ZWFsIGZvY3VzLgorICAgICAgICBpZiAobUZpbmRJc1VwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IG1XZWJUZXh0Vmlldy5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uLApAQCAtNjE3OSw2ICs1ODIwLDEyIEBACiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdENoaWxkUmVjdGFuZ2xlT25TY3JlZW4oVmlldyBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbW1lZGlhdGUpIHsKKyAgICAgICAgLy8gZG9uJ3Qgc2Nyb2xsIHdoaWxlIGluIHpvb20gYW5pbWF0aW9uLiBXaGVuIGl0IGlzIGRvbmUsIHdlIHdpbGwgYWRqdXN0CisgICAgICAgIC8vIHRoZSBuZWNlc3NhcnkgY29tcG9uZW50cyAoZS5nLiwgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlKQorICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlY3Qub2Zmc2V0KGNoaWxkLmdldExlZnQoKSAtIGNoaWxkLmdldFNjcm9sbFgoKSwKICAgICAgICAgICAgICAgICBjaGlsZC5nZXRUb3AoKSAtIGNoaWxkLmdldFNjcm9sbFkoKSk7CiAKQEAgLTYzMjEsNyArNTk2OCw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgU1dJVENIX1RPX1NIT1JUUFJFU1M6IHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYzMzUsNiArNTk4Myw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19MT05HUFJFU1M6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSB8fCBtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOwpAQCAtNjM0NiwxNSArNTk5NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxpY2l0eSBmb3Igbm93LCB3ZSBkb24ndCBzZXQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IG1MYXN0VG91Y2hZOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvbmdDbGljaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjM5MCw4ICs2MDM2LDggQEAKICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgLy8gbVNjcm9sbFggY29udGFpbnMgdGhlIG5ldyBtaW5QcmVmV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHJlc3RvcmVTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1TY3JvbGxYLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UocmVzdG9yZVN0YXRlLCBnZXRWaWV3V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBORVdfUElDVFVSRV9NU0dfSUQ6IHsKQEAgLTY0MDEsNTYgKzYwNDcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRSb290TGF5ZXIoMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZvciBuZXcgY29udGVudAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFdlYlZpZXdDb3JlLkRyYXdEYXRhIGRyYXcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9IChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKKwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VXaWRlVmlld3BvcnQgPSBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSA9IGRyYXcubVJlc3RvcmVTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXN0b3JlU3RhdGUgPSByZXN0b3JlU3RhdGUgIT0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Jlc3RvcmVTdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHJlc3RvcmVTdGF0ZSwgdmlld1NpemUueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tTWluUHJlZldpZHRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5yZXN0b3JlWm9vbVN0YXRlKGRyYXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUluaXRpYWxTY2FsZUluUGVyY2VudCAvIDEwMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgIT0gbVRleHRXcmFwU2NhbGUgKiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShyZXN0b3JlU3RhdGUubVZpZXdTY2FsZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdXNlV2lkZVZpZXdwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gcmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgTWF0aC5hYnMoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50U2Nyb2xsVG8ocmVzdG9yZVN0YXRlLm1TY3JvbGxYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyhyZXN0b3JlU3RhdGUubVNjcm9sbFgsIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgd2UgYXJlIG9uIGEgbmV3IHBhZ2UsIHJlbW92ZSB0aGUgV2ViVGV4dFZpZXcuIFRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBuZWNlc3NhcnkgZm9yIHBhZ2UgbG9hZHMgZHJpdmVuIGJ5IHdlYmtpdCwgYW5kIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljdWxhciB3aGVuIHRoZSB1c2VyIHdhcyBvbiBhIHBhc3N3b3JkIGZpZWxkLCBzbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXZWJUZXh0VmlldyB3YXMgdmlzaWJsZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgbGF5b3V0IChpLmUuIHJlcXVlc3QgYSBsYXlvdXQgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gdmlldyBzeXN0ZW0pIGlmIHRoZSBsYXN0IHZpZXcgc2l6ZSB0aGF0IHdlIHNlbnQgdG8KICAgICAgICAgICAgICAgICAgICAgLy8gV2ViQ29yZSBtYXRjaGVzIHRoZSB2aWV3IHNpemUgb2YgdGhlIHBpY3R1cmUgd2UganVzdApAQCAtNjQ1OCw0MSArNjA3MiwyMSBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVwZGF0ZUxheW91dCA9IHZpZXdTaXplLnggPT0gbUxhc3RXaWR0aFNlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWV3U2l6ZS55ID09IG1MYXN0SGVpZ2h0U2VudDsKICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUoZHJhdy5tV2lkdGhIZWlnaHQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1XaWR0aEhlaWdodC55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAobUZpbmRJc1VwID8gbUZpbmRIZWlnaHQgOiAwKSwgdXBkYXRlTGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1XaWR0aEhlaWdodC55LCB1cGRhdGVMYXlvdXQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCBiID0gZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJORVdfUElDVFVSRV9NU0dfSUQgeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmxlZnQrIiwiK2IudG9wKyIsIitiLnJpZ2h0KyIsIitiLmJvdHRvbSsifSIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVDb250ZW50UmVjdChkcmF3Lm1JbnZhbFJlZ2lvbi5nZXRCb3VuZHMoKSk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKG1QaWN0dXJlTGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVBpY3R1cmVMaXN0ZW5lci5vbk5ld1BpY3R1cmUoV2ViVmlldy50aGlzLCBjYXB0dXJlUGljdHVyZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodXNlV2lkZVZpZXdwb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW1pdCBtWm9vbU92ZXJ2aWV3V2lkdGggdXBwZXIgYm91bmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNNYXhWaWV3cG9ydFdpZHRoIHNvIHRoYXQgaWYgdGhlIHBhZ2UgZG9lc24ndCBiZWhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbGwsIHRoZSBXZWJWaWV3IHdvbid0IGdvIGluc2FuZS4gbGltaXQgdGhlIGxvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZCB0byBtYXRjaCB0aGUgZGVmYXVsdCBzY2FsZSBmb3IgbW9iaWxlIHNpdGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21PdmVydmlld1dpZHRoID0gTWF0aC5taW4oc01heFZpZXdwb3J0V2lkdGgsIE1hdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heCgoaW50KSAodmlld1dpZHRoIC8gbURlZmF1bHRTY2FsZSksIE1hdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4KGRyYXcubU1pblByZWZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVZpZXdQb2ludC54KSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkgJiYgbUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXQgdGhlIGNvbnRlbnQgd2lkdGggdG8gdGhlIGN1cnJlbnQgdmlldy4gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmRpbmcgZXJyb3IgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1ab29tT3ZlcnZpZXdXaWR0aCwgTWF0aC5hYnMobUFjdHVhbFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1UZXh0V3JhcFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBuZXcgcGljdHVyZQorICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIub25OZXdQaWN0dXJlKGRyYXcpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3Lm1Gb2N1c1NpemVDaGFuZ2VkICYmIGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZvY3VzU2l6ZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NTMwLDE0ICs2MTI0LDggQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRDoKICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNvZnRLZXlib2FyZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV4dFNlbGVjdGlvbkZyb21NZXNzYWdlKG1zZy5hcmcxLCBtc2cuYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuVGV4dFNlbGVjdGlvbkRhdGEpIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIHRleHRmaWVsZCB3YXMgaW4gZm9jdXMsIGFuZCB0aGUgdXNlciB0b3VjaGVkIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyBpdCB0byBzZW5kIHRoaXMgbWVzc2FnZSwgdGhlbiBXZWJUZXh0VmlldyBoYXMgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gc2V0IHVwIHlldC4gIFJlYnVpbGQgaXQgc28gaXQgY2FuIHNldCBpdHMgc2VsZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV4dFNlbGVjdGlvbkZyb21NZXNzYWdlKG1zZy5hcmcxLCBtc2cuYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuVGV4dFNlbGVjdGlvbkRhdGEpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY1NTUsNyArNjE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNT1ZFX09VVF9PRl9QTFVHSU46CisgICAgICAgICAgICAgICAgY2FzZSBVTkhBTkRMRURfTkFWX0tFWToKICAgICAgICAgICAgICAgICAgICAgbmF2SGFuZGxlZEtleShtc2cuYXJnMSwgMSwgZmFsc2UsIDApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9URVhUX0VOVFJZX01TR19JRDoKQEAgLTY2NDAsMzMgKzYyMjgsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBtc2cuYXJnMiA9PSAxID8gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cuYXJnMiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRlZmF1bHQgaXMgbm90IGNhbGxlZCBpbiBXZWJDb3JlLCBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcmVwcm9jZXNzZWQgaW4gVUkKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IChUb3VjaEV2ZW50RGF0YSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGVkLm1BY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc25hcHBpbmcgaW4gZGVmZXIgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGNvbnRlbnRUb1ZpZXdYKHRlZC5tWCkgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9EUkFHX01PREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YVggPSBwaW5Mb2NYKChpbnQpIChtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWCAtIHRlZC5tVmlld1gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWCAtIHgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBwaW5Mb2NZKChpbnQpIChtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWSAtIHRlZC5tVmlld1kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWSAtIHkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRHJhZyhkZWx0YVgsIGRlbHRhWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gMCkgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gMCkgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gMCkgbUxhc3REZWZlclRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gMCkgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKQEAgLTY2ODAsOSArNjI3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0RPVUJMRVRBUDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9Eb3VibGVUYXAoKSBuZWVkcyBtTGFzdFRvdWNoWC9ZIGFzIGFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gdGVkLm1WaWV3WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gY29udGVudFRvVmlld1kodGVkLm1ZKSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaGFuZGxlRG91YmxlVGFwKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOgpAQCAtNjY5MCw3ICs2Mjg1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdFRlc3QgIT0gbnVsbCAmJiBoaXRUZXN0Lm1UeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gSGl0VGVzdFJlc3VsdC5VTktOT1dOX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb25nQ2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02ODE0LDcgKzY0MDgsNiBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBDRU5URVJfRklUX1JFQ1Q6CiAgICAgICAgICAgICAgICAgICAgIFJlY3QgciA9IChSZWN0KW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBjZW50ZXJGaXRSZWN0KHIubGVmdCwgci50b3AsIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC02ODIzLDYgKzY0MTYsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IG1zZy5hcmcyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgIGNhc2UgU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gKFN0cmluZykgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25TZWxlY3Rpb25TdHJpbmdDaGFuZ2Uoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShtVG91Y2hIaWdobGlnaHRSZWdpb24uZ2V0Qm91bmRzKCkpOworICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFJlY3Q+IHJlY3RzID0gKEFycmF5TGlzdDxSZWN0PikgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVjdCByZWN0IDogcmVjdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHZpZXdSZWN0ID0gY29udGVudFRvVmlld1JlY3QocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBzaXRlcywgbGlrZSBzdG9yaWVzIGluIG55dGltZXMuY29tLCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3VzZSBldmVudCBoYW5kbGVyIGluIHRoZSB0b3AgZGl2LiBJdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGZyaWVuZGx5IHRvIGhpZ2hsaWdodCB0aGUgZGl2IGlmIGl0IGNvdmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBzY3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdSZWN0LndpZHRoKCkgPCBnZXRXaWR0aCgpID4+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHZpZXdSZWN0LmhlaWdodCgpIDwgZ2V0SGVpZ2h0KCkgPj4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24udW5pb24odmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJTa2lwIHRoZSBodWdlIHNlbGVjdGlvbiByZWN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzEzMCwzNyArNjc1Myw2IEBACiAgICAgICAgICAgICAgICAgbmV3IEludm9rZUxpc3RCb3goYXJyYXksIGVuYWJsZWRBcnJheSwgc2VsZWN0ZWRBcnJheSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVab29tUmFuZ2UoV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSwKLSAgICAgICAgICAgIGludCB2aWV3V2lkdGgsIGludCBtaW5QcmVmV2lkdGgsIGJvb2xlYW4gdXBkYXRlWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1pblNjYWxlID09IDApIHsKLSAgICAgICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7Ci0gICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NaW5TY2FsZTsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPT0gMCkgewotICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NYXhTY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qCiAgICAgICogUmVxdWVzdCBhIGRyb3Bkb3duIG1lbnUgZm9yIGEgbGlzdGJveCB3aXRoIHNpbmdsZSBzZWxlY3Rpb24gb3IgYSBzaW5nbGUKICAgICAgKiA8c2VsZWN0PiBlbGVtZW50LgpAQCAtNzI0Myw3ICs2ODM1LDcgQEAKICAgICAgICAgLy8gRklYTUUgdGhlIGRpdmlzb3Igc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHNvbWV3aGVyZQogICAgICAgICAvLyB0aGUgY2xvc2VzdCB0aGluZyB0b2RheSBpcyBoYXJkLWNvZGVkIGludG8gU2Nyb2xsVmlldy5qYXZhCiAgICAgICAgIC8vIChmcm9tIFNjcm9sbFZpZXcuamF2YSwgbGluZSAzNjMpICAgaW50IG1heEp1bXAgPSBoZWlnaHQvMjsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0ICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzI1NCwxMCArNjg0NiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhc3MgdGhlIGtleSB0byB0aGUgcGx1Z2luLiAgVGhpcyBhc3N1bWVzIHRoYXQgbmF0aXZlRm9jdXNJc1BsdWdpbigpCi0gICAgICogcmV0dXJuZWQgdHJ1ZS4KKyAgICAgKiBQYXNzIHRoZSBrZXkgZGlyZWN0bHkgdG8gdGhlIHBhZ2UuICBUaGlzIGFzc3VtZXMgdGhhdAorICAgICAqIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpIHJldHVybmVkIHRydWUuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxldFBsdWdpbkhhbmRsZU5hdktleShpbnQga2V5Q29kZSwgbG9uZyB0aW1lLCBib29sZWFuIGRvd24pIHsKKyAgICBwcml2YXRlIHZvaWQgbGV0UGFnZUhhbmRsZU5hdktleShpbnQga2V5Q29kZSwgbG9uZyB0aW1lLCBib29sZWFuIGRvd24pIHsKICAgICAgICAgaW50IGtleUV2ZW50QWN0aW9uOwogICAgICAgICBpbnQgZXZlbnRIdWJBY3Rpb247CiAgICAgICAgIGlmIChkb3duKSB7CkBAIC03Mzk4LDkgKzY5OTAsMTAgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURlYnVnRHVtcCgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURlc3Ryb3koKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHVtcERpc3BsYXlUcmVlKFN0cmluZyB1cmxPck51bGwpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUV2YWx1YXRlTGF5ZXJzQW5pbWF0aW9ucygpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUV4dGVuZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUZpbmRBbGwoU3RyaW5nIGZpbmRMb3dlciwgU3RyaW5nIGZpbmRVcHBlcik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRmluZE5leHQoYm9vbGVhbiBmb3J3YXJkKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGb2N1c0NhbmRpZGF0ZUZyYW1lUG9pbnRlcigpOwpAQCAtNzQyNyw2ICs3MDIwLDcgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVIYXNDdXJzb3JOb2RlKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlSGFzRm9jdXNOb2RlKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlSGlkZUN1cnNvcigpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhpdFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyAgIG5hdGl2ZUltYWdlVVJJKGludCB4LCBpbnQgeSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlSW5zdHJ1bWVudFJlcG9ydCgpOwogICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIGJvb2xlYW4gbmF0aXZlTW92ZUN1cnNvclRvTmV4dFRleHRJbnB1dCgpOwpAQCAtNzQzNiwyOSArNzAzMCw0MyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZU1vdmVDdXJzb3IoaW50IGtleUNvZGUsIGludCBjb3VudCwKICAgICAgICAgICAgIGJvb2xlYW4gbm9TY3JvbGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZU1vdmVHZW5lcmF0aW9uKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihpbnQgeCwgaW50IHksCi0gICAgICAgICAgICBib29sZWFuIGV4dGVuZFNlbGVjdGlvbik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihpbnQgeCwgaW50IHkpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFnZSBzaG91bGQgZ2V0IHRoZSBzaGlmdCBhbmQgYXJyb3cga2V5cywgcmF0aGVyCisgICAgICogdGhhbiBzZWxlY3QgdGV4dC9uYXZpZ2F0aW9uLgorICAgICAqCisgICAgICogSWYgdGhlIGZvY3VzIGlzIGEgcGx1Z2luLCBvciBpZiB0aGUgZm9jdXMgYW5kIGN1cnNvciBtYXRjaCBhbmQgYXJlCisgICAgICogYSBjb250ZW50RWRpdGFibGUgZWxlbWVudCwgdGhlbiB0aGUgcGFnZSBzaG91bGQgaGFuZGxlIHRoZXNlIGtleXMuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlUG9pbnRJbk5hdkNhY2hlKGludCB4LCBpbnQgeSwgaW50IHNsb3ApOwogICAgIC8vIExpa2UgbWFueSBvdGhlciBvZiBvdXIgbmF0aXZlIG1ldGhvZHMsIHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0CiAgICAgLy8gbU5hdGl2ZUNsYXNzIGlzIG5vdCBudWxsIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnMoYm9vbGVhbiBmb2N1c2VkLAogICAgICAgICAgICAgYm9vbGVhbiBwcmVzc2VkLCBib29sZWFuIGludmFsaWRhdGUpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVJlc2V0U2VsZWN0aW9uKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2VsZWN0QWxsKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2VsZWN0QmVzdEF0KFJlY3QgcmVjdCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlU2VsZWN0aW9uWCgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVNlbGVjdGlvblkoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGaW5kSW5kZXgoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKGJvb2xlYW4gZm9sbG93ZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEhlaWdodENhbk1lYXN1cmUoYm9vbGVhbiBtZWFzdXJlKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRSb290TGF5ZXIoaW50IGxheWVyKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKGJvb2xlYW4gc2V0LAotICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSwgYm9vbGVhbiBleHRlbmRTZWxlY3Rpb24pOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldFNlbGVjdGlvblJlZ2lvbihib29sZWFuIHNldCk7CisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHgsIGludCB5KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVTdGFydFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIFJlY3QgICAgIG5hdGl2ZVN1YnRyYWN0TGF5ZXJzKFJlY3QgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlVGV4dEdlbmVyYXRpb24oKTsKICAgICAvLyBOZXZlciBjYWxsIHRoaXMgdmVyc2lvbiBleGNlcHQgYnkgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZykgLQogICAgIC8vIHdlIGFsd2F5cyB3YW50IHRvIHBhc3MgaW4gb3VyIGdlbmVyYXRpb24gbnVtYmVyLgogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVVwZGF0ZUNhY2hlZFRleHRmaWVsZChTdHJpbmcgdXBkYXRlZFRleHQsCiAgICAgICAgICAgICBpbnQgZ2VuZXJhdGlvbik7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlV29yZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIC8vIHJldHVybiBOT19MRUZURURHRSBtZWFucyBmYWlsdXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOwotICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOworICAgIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShpbnQgeCwgaW50IHksIGZsb2F0IHNjYWxlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKaW5kZXggNDExODExOS4uYmFkYjM5MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CkBAIC0zMywxMiArMzIsMTEgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk9wZW5hYmxlQ29sdW1uczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlcy5NZWRpYTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIApAQCAtMTE3LDcgKzExNSw3IEBACiAgICAgcHJpdmF0ZSBpbnQgbVZpZXdwb3J0RGVuc2l0eURwaSA9IC0xOwogCiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NhbGUgPSAwOwotICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFggPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFkgPSAwOwogCkBAIC0yNzksMzQgKzI3NywzNiBAQAogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IEpOSS4gIE9wZW4gYSBmaWxlIGNob29zZXIgdG8gdXBsb2FkIGEgZmlsZS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkgcGx1cyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKiBGSVhNRTogSnVzdCByZXR1cm4gdGhlIFVSSSBoZXJlLCBhbmQgaW4gRmlsZVN5c3RlbTo6cGF0aEdldEZpbGVOYW1lLCBjYWxsCi0gICAgICogaW50byBKYXZhIHRvIGdldCB0aGUgZmlsZW5hbWUuCisgICAgICogQHBhcmFtIGFjY2VwdFR5cGUgVGhlIHZhbHVlIG9mIHRoZSAnYWNjZXB0JyBhdHRyaWJ1dGUgb2YgdGhlCisgICAgICogICAgICAgICBpbnB1dCB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSBwaWNrZXIuCisgICAgICogQHJldHVybiBTdHJpbmcgdmVyc2lvbiBvZiB0aGUgVVJJLgogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcigpIHsKLSAgICAgICAgVXJpIHVyaSA9IG1DYWxsYmFja1Byb3h5Lm9wZW5GaWxlQ2hvb3NlcigpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHJldHVybiAiIjsKLSAgICAgICAgLy8gRmluZCBvdXQgdGhlIG5hbWUsIGFuZCBhcHBlbmQgaXQgdG8gdGhlIFVSSS4KLSAgICAgICAgLy8gV2Via2l0IHdpbGwgdHJlYXQgdGhlIG5hbWUgYXMgdGhlIGZpbGVuYW1lLCBhbmQKLSAgICAgICAgLy8gdGhlIFVSSSBhcyB0aGUgcGF0aC4gIFRoZSBVUkkgd2lsbCBiZSB1c2VkCi0gICAgICAgIC8vIGluIEJyb3dzZXJGcmFtZSB0byBnZXQgdGhlIGFjdHVhbCBkYXRhLgotICAgICAgICBDdXJzb3IgY3Vyc29yID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCi0gICAgICAgICAgICAgICAgdXJpLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE9wZW5hYmxlQ29sdW1ucy5ESVNQTEFZX05BTUUgfSwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICBwcml2YXRlIFN0cmluZyBvcGVuRmlsZUNob29zZXIoU3RyaW5nIGFjY2VwdFR5cGUpIHsKKyAgICAgICAgVXJpIHVyaSA9IG1DYWxsYmFja1Byb3h5Lm9wZW5GaWxlQ2hvb3NlcihhY2NlcHRUeXBlKTsKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSAiIjsKKyAgICAgICAgICAgIC8vIE5vdGUgLSBxdWVyeWluZyBmb3IgTWVkaWFTdG9yZS5JbWFnZXMuTWVkaWEuREFUQQorICAgICAgICAgICAgLy8gc2VlbXMgdG8gd29yayBmb3IgYWxsIGNvbnRlbnQgVVJJcywgbm90IGp1c3QgaW1hZ2VzCisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTWVkaWFTdG9yZS5JbWFnZXMuTWVkaWEuREFUQSB9LAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyB1cmlTdHJpbmcgPSB1cmkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5zdG9yZUZpbGVQYXRoRm9yQ29udGVudFVyaShmaWxlUGF0aCwgdXJpU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiB1cmlTdHJpbmc7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpICsgIi8iICsgbmFtZTsKKyAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDgwLDEyICs0ODAsMTIgQEAKICAgICAgICAgb2YgbGF5b3V0L2xpbmUtYnJlYWtpbmcuIFRoZXNlIGNvb3JkaW5hdGVzIGFyZSBpbiBkb2N1bWVudCBzcGFjZSwKICAgICAgICAgd2hpY2ggaXMgdGhlIHNhbWUgYXMgVmlldyBjb29yZHMgdW5sZXNzIHdlIGhhdmUgem9vbWVkIHRoZSBkb2N1bWVudAogICAgICAgICAoc2VlIG5hdGl2ZVNldFpvb20pLgotICAgICAgICBzY3JlZW5XaWR0aCBpcyB1c2VkIGJ5IGxheW91dCB0byB3cmFwIGNvbHVtbiBhcm91bmQuIElmIHZpZXdwb3J0IHVzZXMKLSAgICAgICAgZml4ZWQgc2l6ZSwgc2NyZWVuV2lkdGggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHdpZHRoIHdpdGggem9vbWluZy4KKyAgICAgICAgdGV4dFdyYXBXaWR0aCBpcyB1c2VkIGJ5IGxheW91dCB0byB3cmFwIGNvbHVtbiBhcm91bmQuIElmIHZpZXdwb3J0IHVzZXMKKyAgICAgICAgZml4ZWQgc2l6ZSwgdGV4dFdyYXBXaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgogICAgICAgICBzaG91bGQgdGhpcyBiZSBjYWxsZWQgbmF0aXZlU2V0Vmlld1BvcnRTaXplPwogICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjcmVlbldpZHRoLAotICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCByZWFsU2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQsIGludCBhbmNob3JYLAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB0ZXh0V3JhcFdpZHRoLAorICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCiAgICAgICAgICAgICBpbnQgYW5jaG9yWSwgYm9vbGVhbiBpZ25vcmVIZWlnaHQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKTsKQEAgLTU3Niw3ICs1NzYsMTggQEAKICAgICAvKioKICAgICAgKiBQcm92aWRlIFdlYkNvcmUgd2l0aCB0aGUgcHJldmlvdXNseSB2aXN0ZWQgbGlua3MgZnJvbSB0aGUgaGlzdG9yeSBkYXRhYmFzZQogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgIG5hdGl2ZVByb3ZpZGVWaXNpdGVkSGlzdG9yeShTdHJpbmdbXSBoaXN0b3J5KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVByb3ZpZGVWaXNpdGVkSGlzdG9yeShTdHJpbmdbXSBoaXN0b3J5KTsKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHRlciBTcGVjaWZpZXMgaG93IHRvIGFsdGVyIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRvIGFsdGVyIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IFRoZSBncmFudWxhcml0eSBvZiB0aGUgc2VsZWN0aW9uIG1vZGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdGlvbiBzdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIG5hdGl2ZU1vZGlmeVNlbGVjdGlvbihTdHJpbmcgYWx0ZXIsIFN0cmluZyBkaXJlY3Rpb24sIFN0cmluZyBncmFudWxhcml0eSk7CiAKICAgICAvLyBFdmVudEh1YiBmb3IgcHJvY2Vzc2luZyBtZXNzYWdlcwogICAgIHByaXZhdGUgZmluYWwgRXZlbnRIdWIgbUV2ZW50SHViOwpAQCAtNjk3LDYgKzcwOCwxMiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIFRvdWNoSGlnaGxpZ2h0RGF0YSB7CisgICAgICAgIGludCBtWDsKKyAgICAgICAgaW50IG1ZOworICAgICAgICBpbnQgbVNsb3A7CisgICAgfQorCiAgICAgLy8gbUFjdGlvbiBvZiBUb3VjaEV2ZW50RGF0YSBjYW4gYmUgTW90aW9uRXZlbnQuZ2V0QWN0aW9uKCkgd2hpY2ggdXNlcyB0aGUKICAgICAvLyBsYXN0IHR3byBieXRlcyBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKICAgICBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9MT05HUFJFU1MgPSAweDEwMDsKQEAgLTcwOCw4ICs3MjUsNiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgICAgIGludCBtTWV0YVN0YXRlOwogICAgICAgICBib29sZWFuIG1SZXByb2Nlc3M7Ci0gICAgICAgIGZsb2F0IG1WaWV3WDsKLSAgICAgICAgZmxvYXQgbVZpZXdZOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBHZW9sb2NhdGlvblBlcm1pc3Npb25zRGF0YSB7CkBAIC03MTgsNyArNzMzLDExIEBACiAgICAgICAgIGJvb2xlYW4gbVJlbWVtYmVyOwogICAgIH0KIAotCisgICAgc3RhdGljIGNsYXNzIE1vZGlmeVNlbGVjdGlvbkRhdGEgeworICAgICAgICBTdHJpbmcgbUFsdGVyOworICAgICAgICBTdHJpbmcgbURpcmVjdGlvbjsKKyAgICAgICAgU3RyaW5nIG1HcmFudWxhcml0eTsKKyAgICB9CiAKICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJEZWJ1Z1N0cmluZyA9IHsKICAgICAgICAgICAgICJSRVFVRVNUX0xBQkVMIiwgLy8gOTcKQEAgLTg2NSw2ICs4ODQsMTIgQEAKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBBRERfUEFDS0FHRV9OQU1FID0gMTg1OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9QQUNLQUdFX05BTUUgPSAxODY7CiAKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTID0gMTg3OworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODg7CisKKyAgICAgICAgLy8gYWNjZXNzaWJpbGl0eSBzdXBwb3J0CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9ESUZZX1NFTEVDVElPTiA9IDE5MDsKKwogICAgICAgICAvLyBwcml2YXRlIG1lc3NhZ2UgaWRzCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNUUk9ZID0gICAgIDIwMDsKIApAQCAtMTIzOCw2ICsxMjYzLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ESUZZX1NFTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlTZWxlY3Rpb25EYXRhIG1vZGlmeVNlbGVjdGlvbkRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTW9kaWZ5U2VsZWN0aW9uRGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5U2VsZWN0aW9uRGF0YS5tQWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1EaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1HcmFudWxhcml0eSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VMRUNUSU9OX1NUUklOR19DSEFOR0VELCBzZWxlY3Rpb25TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTElTVEJPWF9DSE9JQ0VTOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSBjaG9pY2VzID0gKFNwYXJzZUJvb2xlYW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmo7CkBAIC0xMzU3LDYgKzEzOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2UucmVtb3ZlUGFja2FnZU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkID0gKFRvdWNoSGlnaGxpZ2h0RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZC5tWCwgZC5tWSwgZC5tU2xvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIHJlY3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwpAQCAtMTU3NSwxMSArMTYyOCwxMiBAQAogICAgICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwbHVnaW46ICIgKyBrZXlDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5OiBhcnJvdyB1bnVzZWQgYnkgcGFnZTogIiArIGtleUNvZGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiBldnQuaXNEb3duKCkpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuTU9WRV9PVVRfT0ZfUExVR0lOLCBrZXlDb2RlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlVOSEFORExFRF9OQVZfS0VZLCBrZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xODE3LDYgKzE4NzEsOCBAQAogICAgICAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQgd2hpbGUgV0VCS0lUX0RSQVcgaXMganVzdCBwdWxsZWQgb3V0IG9mIHRoZQogICAgICAgICAvLyBxdWV1ZSBpbiBXZWJDb3JlIHRocmVhZCB0byBiZSBleGVjdXRlZC4gVGhlbiB1cGRhdGUgd29uJ3QgYmUgYmxvY2tlZC4KICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFjb3JlLmdldFNldHRpbmdzKCkuZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpKSByZXR1cm47CisKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29yZSkgewogICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewpAQCAtMTgyOSw2ICsxODg1LDEwIEBACiAKICAgICBzdGF0aWMgdm9pZCByZXN1bWVVcGRhdGVQaWN0dXJlKFdlYlZpZXdDb3JlIGNvcmUpIHsKICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgbURyYXdJc1BhdXNlZCBpcyB0cnVlLCBpZ25vcmUgdGhlIHNldHRpbmcsIGNvbnRpbnVlIHRvIHJlc3VtZQorICAgICAgICAgICAgaWYgKCFjb3JlLm1EcmF3SXNQYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewpAQCAtMjAxNCw5ICsyMDc0LDE1IEBACiAgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZW1vdmUgdGhlIHRvdWNoIGhpZ2hsaWdodCB3aGVuIG1vdmluZyB0byBhIG5ldyBwYWdlCisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgbUV2ZW50SHViLnNlbmRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKG51bGwsCisgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFMpKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHJlc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24sIHRoZSByZXN0b3JlZCBvZmZzZXQgYW5kIHNjYWxlcwogICAgICAgICBtV2Via2l0U2Nyb2xsWCA9IG1XZWJraXRTY3JvbGxZID0gbVJlc3RvcmVkWCA9IG1SZXN0b3JlZFkKLSAgICAgICAgICAgICAgICA9IG1SZXN0b3JlZFNjYWxlID0gbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIH0KIAogICAgIC8vIGNhbGxlZCBieSBKTkkKQEAgLTIwMzcsOCArMjEwMywxMCBAQAogICAgICAgICAvLyBhZGp1c3QgdGhlIGRlZmF1bHQgc2NhbGUgdG8gbWF0Y2ggdGhlIGRlbnNpdHlEcGkKICAgICAgICAgZmxvYXQgYWRqdXN0ID0gMS4wZjsKICAgICAgICAgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAhPSAxMDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3QgPSBXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAvIDEwMC4wZjsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZGVmYXVsdCB6b29tIHNjYWxlIHRvIGEgaW50ZWdlciAocGVyY2VudGFnZSkgdG8gYXZvaWQgYW55CisgICAgICAgICAgICAvLyBpc3N1ZXMgd2l0aCBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucworICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgKGludCkobVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpICogMTAwKSAhPSAxMDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA+IDApIHsKICAgICAgICAgICAgIGFkanVzdCA9IChmbG9hdCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpCkBAIC0yMTIwLDkgKzIxODgsOSBAQAogICAgICAgICBtUmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlID0gKDAgPT0gbVZpZXdwb3J0V2lkdGgpOwogICAgICAgICBpZiAobVJlc3RvcmVkU2NhbGUgPiAwKSB7CiAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZWRTY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIGlmIChtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID4gMCkgeworICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPiAwKSB7CiAgICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgIH0KQEAgLTIyMTEsMjAgKzIyNzksMTIgQEAKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNjYWxlKGludCBzY2FsZSwgaW50IHRleHRXcmFwU2NhbGUpIHsKICAgICAgICAgaWYgKG1Ccm93c2VyRnJhbWUuZmlyc3RMYXlvdXREb25lKCkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1SZXN0b3JlZFNjYWxlID0gc2NhbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY3JlZW5XaWR0aFNjYWxlKGludCBzY2FsZSkgewotICAgICAgICBpZiAoIW1TZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ccm93c2VyRnJhbWUuZmlyc3RMYXlvdXREb25lKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgICAgIGlmIChtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgICAgICBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gdGV4dFdyYXBTY2FsZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ2OSw0ICsyNTI5LDYgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVZhbGlkTm9kZUFuZEJvdW5kcyhpbnQgZnJhbWUsIGludCBub2RlLAogICAgICAgICAgICAgUmVjdCBib3VuZHMpOwogCisgICAgcHJpdmF0ZSBuYXRpdmUgQXJyYXlMaXN0PFJlY3Q+IG5hdGl2ZUdldFRvdWNoSGlnaGxpZ2h0UmVjdHMoaW50IHgsIGludCB5LAorICAgICAgICAgICAgaW50IHNsb3ApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCmluZGV4IGIxODQxOWQuLmQ3NWQ0MjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKQEAgLTE3MywxMTIgKzE3MywxNDAgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGludCBtQ2FjaGVUcmFuc2FjdGlvblJlZmNvdW50OwogCi0gICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoKSB7CisgICAgLy8gSW5pdGlhbGx5IHRydWUgdW50aWwgdGhlIGJhY2tncm91bmQgdGhyZWFkIGNvbXBsZXRlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFdlYlZpZXdEYXRhYmFzZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKwogICAgICAgICAvLyBTaW5nbGV0b24gb25seSwgdXNlIGdldEluc3RhbmNlKCkKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBXZWJWaWV3RGF0YWJhc2UgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIGlmIChtSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFdlYlZpZXdEYXRhYmFzZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CiAKLSAgICAgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsIAotICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiIAotICAgICAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHBlciB0YWJsZSBNdXRleCBsb2NrLCB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrLCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gaW1wcm92ZXMgcGVyZm9ybWFuY2UgYXMgZGF0YWJhc2UncyBSZWVudHJhbnRMb2NrIGlzIGV4cGFuc2l2ZQotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbUNhY2hlRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1DYWNoZURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBDQUNIRV9EQVRBQkFTRV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcENhY2hlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRXJhc2UgdGhlIGZpbGVzIGZyb20gdGhlIGZpbGUgc3lzdGVtIGluIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUgCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBleGlzdGluZyBjYWNoZSBjb250ZW50Ci0gICAgICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgcmVhZF91bmNvbW1pdHRlZCB0byBzcGVlZCB1cCBSRUFECi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOwotICAgICAgICAgICAgICAgIC8vIGFzIG9ubHkgUkVBRCBjYW4gYmUgY2FsbGVkIGluIHRoZSBub24tV2ViVmlld1dvcmtlclRocmVhZCwKLSAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZF91bmNvbW1pdHRlZCBpcyB1c2VkLCB3ZSBjYW4gdHVybiBvZmYgZGF0YWJhc2UgbG9jawotICAgICAgICAgICAgICAgIC8vIHRvIHVzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1c2UgSW5zZXJ0SGVscGVyIGZvciBmYXN0ZXIgaW5zZXJ0aW9uCi0gICAgICAgICAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPSBuZXcgRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIobUNhY2hlRGF0YWJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGUiKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfVVJMX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRmlsZVBhdGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTGFzdE1vZGlmeUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MQVNUX01PRElGWV9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVRBR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUV4cGlyZXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUV4cGlyZXNTdHJpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19TVFJJTkdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9NSU1FVFlQRV9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUVuY29kaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlSHR0cFN0YXR1c0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9IVFRQX1NUQVRVU19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xPQ0FUSU9OX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ29udGVudExlbmd0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ29udGVudERpc3Bvc2l0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRESVNQT1NJVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NST1NTRE9NQUlOX0NPTCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIKKyAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBEQVRBQkFTRV9WRVJTSU9OKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cGdyYWRlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHBlciB0YWJsZSBNdXRleCBsb2NrLCB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrLCB0aGlzCisgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcworICAgICAgICAvLyBleHBhbnNpdmUKKyAgICAgICAgbURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAorICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShDQUNIRV9EQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbUNhY2hlRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIKKyAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIGJvb3RzdHJhcENhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUKKyAgICAgICAgICAgIC8vIGNhc2UgdGhhdCB0aGUgZGF0YWJhc2Ugd2FzIHVwZGF0ZWQgYW5kIHRoZQorICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBleGlzdGluZyBjYWNoZSBjb250ZW50CisgICAgICAgICAgICBDYWNoZU1hbmFnZXIucmVtb3ZlQWxsQ2FjaGVGaWxlcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAorICAgICAgICBtQ2FjaGVEYXRhYmFzZS5leGVjU1FMKCJQUkFHTUEgcmVhZF91bmNvbW1pdHRlZCA9IHRydWU7Iik7CisgICAgICAgIC8vIGFzIG9ubHkgUkVBRCBjYW4gYmUgY2FsbGVkIGluIHRoZQorICAgICAgICAvLyBub24tV2ViVmlld1dvcmtlclRocmVhZCwgYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwKKyAgICAgICAgLy8gd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sgdG8gdXNlIHRyYW5zYWN0aW9uLgorICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgorICAgICAgICBtQ2FjaGVJbnNlcnRlciA9CisgICAgICAgICAgICAgICAgbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7CisgICAgICAgIG1DYWNoZVVybENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfVVJMX0NPTCk7CisgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9GSUxFX1BBVEhfQ09MKTsKKyAgICAgICAgbUNhY2hlTGFzdE1vZGlmeUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKKyAgICAgICAgbUNhY2hlRVRhZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVRBR19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX0NPTCk7CisgICAgICAgIG1DYWNoZUV4cGlyZXNTdHJpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7CisgICAgICAgIG1DYWNoZU1pbWVUeXBlQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9NSU1FVFlQRV9DT0wpOworICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRU5DT0RJTkdfQ09MKTsKKyAgICAgICAgbUNhY2hlSHR0cFN0YXR1c0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKKyAgICAgICAgbUNhY2hlTG9jYXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xPQ0FUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRMRU5HVEhfQ09MKTsKKyAgICAgICAgbUNhY2hlQ29udGVudERpc3Bvc2l0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKKyAgICAgICAgbUNhY2hlQ3Jvc3NEb21haW5Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NST1NTRE9NQUlOX0NPTCk7CisKKyAgICAgICAgLy8gVGhyZWFkIGRvbmUsIG5vdGlmeS4KKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGdyYWRlRGF0YWJhc2UoKSB7CkBAIC0zOTEsOCArNDE5LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBXYWl0IGZvciB0aGUgYmFja2dyb3VuZCBpbml0aWFsaXphdGlvbiB0aHJlYWQgdG8gY29tcGxldGUgYW5kIGNoZWNrIHRoZQorICAgIC8vIGRhdGFiYXNlIGNyZWF0aW9uIHN0YXR1cy4KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tJbml0aWFsaXplZCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB3aGlsZSAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNhdWdodCBleGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWxpemF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcoZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURhdGFiYXNlICE9IG51bGw7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0VudHJpZXMoaW50IHRhYmxlSWQpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtNDIyLDcgKzQ2Nyw3IEBACiAgICAgICovCiAgICAgQXJyYXlMaXN0PENvb2tpZT4gZ2V0Q29va2llc0ZvckRvbWFpbihTdHJpbmcgZG9tYWluKSB7CiAgICAgICAgIEFycmF5TGlzdDxDb29raWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvb2tpZT4oKTsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbGlzdDsKICAgICAgICAgfQogCkBAIC00ODEsNyArNTI2LDcgQEAKICAgICAgKiAgICAgICAgICAgIGRlbGV0ZWQuCiAgICAgICovCiAgICAgdm9pZCBkZWxldGVDb29raWVzKFN0cmluZyBkb21haW4sIFN0cmluZyBwYXRoLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01MDEsNyArNTQ2LDcgQEAKICAgICAgKi8KICAgICB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CiAgICAgICAgIGlmIChjb29raWUuZG9tYWluID09IG51bGwgfHwgY29va2llLnBhdGggPT0gbnVsbCB8fCBjb29raWUubmFtZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTM0LDcgKzU3OSw3IEBACiAgICAgICogQ2xlYXIgY29va2llIGRhdGFiYXNlCiAgICAgICovCiAgICAgdm9pZCBjbGVhckNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU0Nyw3ICs1OTIsNyBAQAogICAgICAqIENsZWFyIHNlc3Npb24gY29va2llcywgd2hpY2ggbWVhbnMgY29va2llIGRvZXNuJ3QgaGF2ZSBFWFBJUkVTLgogICAgICAqLwogICAgIHZvaWQgY2xlYXJTZXNzaW9uQ29va2llcygpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTY0LDcgKzYwOSw3IEBACiAgICAgICogQHBhcmFtIG5vdyBUaW1lIGZvciBub3cKICAgICAgKi8KICAgICB2b2lkIGNsZWFyRXhwaXJlZENvb2tpZXMobG9uZyBub3cpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjIwLDcgKzY2NSw3IEBACiAgICAgICogQHJldHVybiBDYWNoZVJlc3VsdCBUaGUgQ2FjaGVNYW5hZ2VyLkNhY2hlUmVzdWx0CiAgICAgICovCiAgICAgQ2FjaGVSZXN1bHQgZ2V0Q2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtNjYwLDcgKzcwNSw3IEBACiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsCiAgICAgICovCiAgICAgdm9pZCByZW1vdmVDYWNoZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjc0LDcgKzcxOSw3IEBACiAgICAgICogQHBhcmFtIGMgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIHZvaWQgYWRkQ2FjaGUoU3RyaW5nIHVybCwgQ2FjaGVSZXN1bHQgYykgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTcwMCw3ICs3NDUsNyBAQAogICAgICAqIENsZWFyIGNhY2hlIGRhdGFiYXNlCiAgICAgICovCiAgICAgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTcwOCw3ICs3NTMsNyBAQAogICAgIH0KIAogICAgIGJvb2xlYW4gaGFzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtODMxLDcgKzg3Niw3IEBACiAgICAgICovCiAgICAgdm9pZCBzZXRVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCwgU3RyaW5nIHVzZXJuYW1lLAogICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtODUzLDcgKzg5OCw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtODk5LDcgKzk0NCw3IEBACiAgICAgICogQ2xlYXIgcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclVzZXJuYW1lUGFzc3dvcmQoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTkyNCw3ICs5NjksNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0sIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05NDksNyArOTk0LDcgQEAKICAgICAgKiAgICAgICAgIFN0cmluZ1sxXSBpcyBwYXNzd29yZC4gUmV0dXJuIG51bGwgaWYgaXQgY2FuJ3QgZmluZCBhbnl0aGluZy4KICAgICAgKi8KICAgICBTdHJpbmdbXSBnZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIGhvc3QsIFN0cmluZyByZWFsbSkgewotICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpeworICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSl7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC05OTYsNyArMTA0MSw3IEBACiAgICAgICogQ2xlYXIgSFRUUCBhdXRoZW50aWNhdGlvbiBwYXNzd29yZCBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFySHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xMDE3LDcgKzEwNjIsNyBAQAogICAgICAqIEBwYXJhbSBmb3JtZGF0YSBUaGUgZm9ybSBkYXRhIGluIEhhc2hNYXAKICAgICAgKi8KICAgICB2b2lkIHNldEZvcm1EYXRhKFN0cmluZyB1cmwsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1kYXRhKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBmb3JtZGF0YSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBmb3JtZGF0YSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xMDY2LDcgKzExMTEsNyBAQAogICAgICAqLwogICAgIEFycmF5TGlzdDxTdHJpbmc+IGdldEZvcm1EYXRhKFN0cmluZyB1cmwsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBuYW1lID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgfQogCkBAIC0xMTI2LDcgKzExNzEsNyBAQAogICAgICAqIENsZWFyIGZvcm0gZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckZvcm1EYXRhKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5ZThmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEJhc2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ludGVyZmFjZSBab29tQ29udHJvbEJhc2UgeworCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9sIHRvIGJlIG1hZGUgdmlzaWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKTsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBkaXNhcHBlYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIHRoZSBjb250cm9sIHRvIHVwZGF0ZSBpdHMgc3RhdGUgaWYgbmVjZXNzYXJ5IGluIHJlc3BvbnNlIHRvIGEKKyAgICAgKiBjaGFuZ2UgaW4gdGhlIHBhZ2VzIHpvb20gbGV2ZWwuIEZvciBleGFtcGxlLCBpZiB0aGUgbWF4IHpvb20gbGV2ZWwgaXMKKyAgICAgKiByZWFjaGVkIHRoZW4gdGhlIGNvbnRyb2wgY2FuIGRpc2FibGUgdGhlIGJ1dHRvbiBmb3Igem9vbWluZyBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFbWJlZGRlZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjllNzJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisKK2NsYXNzIFpvb21Db250cm9sRW1iZWRkZWQgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBab29tTWFuYWdlciBtWm9vbU1hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OworCisgICAgLy8gVGhlIGNvbnRyb2xsZXIgaXMgbGF6aWx5IGluaXRpYWxpemVkIGluIGdldENvbnRyb2xzKCkgZm9yIHBlcmZvcm1hbmNlLgorICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisKKyAgICBwdWJsaWMgWm9vbUNvbnRyb2xFbWJlZGRlZChab29tTWFuYWdlciB6b29tTWFuYWdlciwgV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1ab29tTWFuYWdlciA9IHpvb21NYW5hZ2VyOworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYgKCFnZXRDb250cm9scygpLmlzVmlzaWJsZSgpICYmICFtWm9vbU1hbmFnZXIuaXNab29tU2NhbGVGaXhlZCgpKSB7CisKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZSh0cnVlKTsKKworICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICAgICAgaW50IGNvdW50ID0gc2V0dGluZ3MuZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpOworICAgICAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc0luWm9vbU92ZXJ2aWV3KCkgJiYgY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgtLWNvdW50KTsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChtV2ViVmlldy5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5kb3VibGVfdGFwX3RvYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwgJiYgbVpvb21CdXR0b25zQ29udHJvbGxlci5pc1Zpc2libGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gY2FuWm9vbUluID0gbVpvb21NYW5hZ2VyLmNhblpvb21JbigpOworICAgICAgICBib29sZWFuIGNhblpvb21PdXQgPSBtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpICYmICFtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpOworICAgICAgICBpZiAoIWNhblpvb21JbiAmJiAhY2FuWm9vbU91dCkgeworICAgICAgICAgICAgLy8gSGlkZSB0aGUgem9vbSBpbiBhbmQgb3V0IGJ1dHRvbnMgaWYgdGhlIHBhZ2UgY2Fubm90IHpvb20KKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2V0IGVhY2ggb25lIGluZGl2aWR1YWxseSwgYXMgYSBwYWdlIG1heSBiZSBhYmxlIHRvIHpvb20gaW4gb3Igb3V0CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21JbkVuYWJsZWQoY2FuWm9vbUluKTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbU91dEVuYWJsZWQoY2FuWm9vbU91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBnZXRDb250cm9scygpIHsKKyAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlciA9IG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIobVdlYlZpZXcpOworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRPblpvb21MaXN0ZW5lcihuZXcgWm9vbUxpc3RlbmVyKCkpOworICAgICAgICAgICAgLy8gWm9vbUJ1dHRvbnNDb250cm9sbGVyIHBvc2l0aW9ucyB0aGUgYnV0dG9ucyBhdCB0aGUgYm90dG9tLCBidXQgaW4KKyAgICAgICAgICAgIC8vIHRoZSBtaWRkbGUuIENoYW5nZSB0aGVpciBsYXlvdXQgcGFyYW1ldGVycyBzbyB0aGV5IGFwcGVhciBvbiB0aGUKKyAgICAgICAgICAgIC8vIHJpZ2h0LgorICAgICAgICAgICAgVmlldyBjb250cm9scyA9IG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCk7CisgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IGNvbnRyb2xzLmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgeworICAgICAgICAgICAgICAgICgoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSBwYXJhbXMpLmdyYXZpdHkgPSBHcmF2aXR5LlJJR0hUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgWm9vbUxpc3RlbmVyIGltcGxlbWVudHMgWm9vbUJ1dHRvbnNDb250cm9sbGVyLk9uWm9vbUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zd2l0Y2hPdXREcmF3SGlzdG9yeSgpOworICAgICAgICAgICAgICAgIC8vIEJyaW5nIGJhY2sgdGhlIGhpZGRlbiB6b29tIGNvbnRyb2xzLgorICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25ab29tKGJvb2xlYW4gem9vbUluKSB7CisgICAgICAgICAgICBpZiAoem9vbUluKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21PdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRXh0ZXJuYWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1MzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitARGVwcmVjYXRlZAorY2xhc3MgWm9vbUNvbnRyb2xFeHRlcm5hbCBpbXBsZW1lbnRzIFpvb21Db250cm9sQmFzZSB7CisKKyAgICAvLyBUaGUgdGltZSB0aGF0IHRoZSBleHRlcm5hbCBjb250cm9scyBhcmUgdmlzaWJsZSBiZWZvcmUgZmFkaW5nIGF3YXkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFpPT01fQ09OVFJPTFNfVElNRU9VVCA9CisgICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRab29tQ29udHJvbHNUaW1lb3V0KCk7CisgICAgLy8gVGhlIHZpZXcgY29udGFpbmluZyB0aGUgZXh0ZXJuYWwgem9vbSBjb250cm9scworICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgbVpvb21Db250cm9sczsKKyAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQ29udHJvbFJ1bm5hYmxlOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OworCisgICAgcHVibGljIFpvb21Db250cm9sRXh0ZXJuYWwoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpZihtWm9vbUNvbnRyb2xSdW5uYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgICAgICBnZXRDb250cm9scygpLnNob3codHJ1ZSk7CisgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBtWm9vbUNvbnRyb2xzICE9IG51bGwgJiYgbVpvb21Db250cm9scy5pc1Nob3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeyB9CisKKyAgICBwdWJsaWMgRXh0ZW5kZWRab29tQ29udHJvbHMgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMgPSBjcmVhdGVab29tQ29udHJvbHMoKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgc2V0IHRvIFZJU0lCTEUgZmlyc3Qgc28gdGhhdCBnZXRNZWFzdXJlZEhlaWdodCgpIGluCisgICAgICAgICAgICAgKiB7QGxpbmsgI29uU2l6ZUNoYW5nZWQoKX0gY2FuIHJldHVybiB0aGUgbWVhc3VyZWQgdmFsdWUgZm9yIHByb3BlcgorICAgICAgICAgICAgICogbGF5b3V0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgZGlzbWlzcyB0aGUgY29udHJvbHMgaWYgdGhlIHVzZXIgaGFzCisgICAgICAgICAgICAgICAgICAgICAqIGZvY3VzIG9uIHRoZW0uIFdhaXQgYW5kIGNoZWNrIGFnYWluIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBtWm9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgY3JlYXRlWm9vbUNvbnRyb2xzKCkgeworICAgICAgICBFeHRlbmRlZFpvb21Db250cm9scyB6b29tQ29udHJvbHMgPSBuZXcgRXh0ZW5kZWRab29tQ29udHJvbHMobVdlYlZpZXcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tSW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLCBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21PdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiB6b29tQ29udHJvbHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRab29tQ29udHJvbHMgZXh0ZW5kcyBGcmFtZUxheW91dCB7CisKKyAgICAgICAgcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMgbVBsdXNNaW51c1pvb21Db250cm9sczsKKworICAgICAgICBwdWJsaWMgRXh0ZW5kZWRab29tQ29udHJvbHMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsKTsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lnpvb21fbWFnbmlmeSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzID0gKGFuZHJvaWQud2lkZ2V0Llpvb21Db250cm9scykgZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21Db250cm9scyk7CisgICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tTWFnbmlmeSkuc2V0VmlzaWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgVmlldy5HT05FKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coYm9vbGVhbiBzaG93Wm9vbSkgeworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KHNob3dab29tID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgICAgIGZhZGUoVmlldy5WSVNJQkxFLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgICAgICBmYWRlKFZpZXcuR09ORSwgMS4wZiwgMC4wZik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZmFkZShpbnQgdmlzaWJpbGl0eSwgZmxvYXQgc3RhcnRBbHBoYSwgZmxvYXQgZW5kQWxwaGEpIHsKKyAgICAgICAgICAgIEFscGhhQW5pbWF0aW9uIGFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oc3RhcnRBbHBoYSwgZW5kQWxwaGEpOworICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbig1MDApOworICAgICAgICAgICAgc3RhcnRBbmltYXRpb24oYW5pbSk7CisgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsdXNNaW51c1pvb21Db250cm9scy5oYXNGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODUzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDg2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlNjYWxlR2VzdHVyZURldGVjdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCisvKioKKyAqIFRoZSBab29tTWFuYWdlciBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgdGhlIFdlYlZpZXcncyBjdXJyZW50IHpvb20KKyAqIGxldmVsIHN0YXRlLiAgSXQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2xzCisgKiBhcyB3ZWxsIGFzIGFueSBhbmltYXRpb24gb2YgdGhlIFdlYlZpZXcgZHVlIHRvIHpvb21pbmcuCisgKgorICogQ3VycmVudGx5LCB0aGVyZSBhcmUgdHdvIG1ldGhvZHMgZm9yIGFuaW1hdGluZyB0aGUgem9vbSBvZiBhIFdlYlZpZXcuCisgKgorICogKDEpIFRoZSBmaXJzdCBtZXRob2QgaXMgdHJpZ2dlcmVkIGJ5IHN0YXJ0Wm9vbUFuaW1hdGlvbiguLi4pIGFuZCBpcyBhIGZpeGVkCisgKiBsZW5ndGggYW5pbWF0aW9uIHdoZXJlIHRoZSBmaW5hbCB6b29tIHNjYWxlIGlzIGtub3duIGF0IHN0YXJ0dXAuICBUaGlzIHR5cGUgb2YKKyAqIGFuaW1hdGlvbiBub3RpZmllcyB3ZWJraXQgb2YgdGhlIGZpbmFsIHNjYWxlIEJFRk9SRSBpdCBhbmltYXRlcy4gVGhlIGFuaW1hdGlvbgorICogaXMgdGhlbiBkb25lIGJ5IHNjYWxpbmcgdGhlIENBTlZBUyBpbmNyZW1lbnRhbGx5IGJhc2VkIG9uIGEgc3RlcHBpbmcgZnVuY3Rpb24uCisgKgorICogKDIpIFRoZSBzZWNvbmQgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBhIG11bHRpLXRvdWNoIHBpbmNoIGFuZCB0aGUgbmV3IHNjYWxlCisgKiBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSB1c2VyJ3MgZ2VzdHVyZS4gVGhpcyB0eXBlIG9mIGFuaW1hdGlvbgorICogb25seSBub3RpZmllcyB3ZWJraXQgb2YgbmV3IHNjYWxlIEFGVEVSIHRoZSBnZXN0dXJlIGlzIGNvbXBsZXRlLiBUaGUgYW5pbWF0aW9uCisgKiBlZmZlY3QgaXMgYWNoaWV2ZWQgYnkgc2NhbGluZyB0aGUgVklFV1MgKGJvdGggV2ViVmlldyBhbmQgVmlld01hbmFnZXIuQ2hpbGRWaWV3KQorICogdG8gdGhlIG5ldyBzY2FsZSBpbiByZXNwb25zZSB0byBldmVudHMgcmVsYXRlZCB0byB0aGUgdXNlcidzIGdlc3R1cmUuCisgKi8KK2NsYXNzIFpvb21NYW5hZ2VyIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIndlYnZpZXdab29tIjsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKyAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrUHJveHkgbUNhbGxiYWNrUHJveHk7CisKKyAgICAvLyBXaWRnZXRzIHJlc3BvbnNpYmxlIGZvciB0aGUgb24tc2NyZWVuIHpvb20gZnVuY3Rpb25zIG9mIHRoZSBXZWJWaWV3LgorICAgIHByaXZhdGUgWm9vbUNvbnRyb2xFbWJlZGRlZCBtRW1iZWRkZWRab29tQ29udHJvbDsKKyAgICBwcml2YXRlIFpvb21Db250cm9sRXh0ZXJuYWwgbUV4dGVybmFsWm9vbUNvbnRyb2w7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBzY2FsZSBsaW1pdHMsIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KKyAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKKworICAgIC8vIFRoZSBhY3R1YWwgc2NhbGUgbGltaXRzLCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggYSB3ZWJwYWdlJ3Mgdmlld3BvcnQKKyAgICAvLyBtZXRhLXRhZy4KKyAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOworCisgICAgLy8gTG9ja3MgdGhlIG1pbmltdW0gWm9vbVNjYWxlIHRvIHRoZSB2YWx1ZSBjdXJyZW50bHkgc2V0IGluIG1NaW5ab29tU2NhbGUuCisgICAgcHJpdmF0ZSBib29sZWFuIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7CisKKyAgICAvKgorICAgICAqIFdoZW4gbG9hZGluZyBhIG5ldyBwYWdlIHRoZSBXZWJWaWV3IGRvZXMgbm90IGluaXRpYWxseSBrbm93IHRoZSBmaW5hbAorICAgICAqIHdpZHRoIG9mIHRoZSBwYWdlLiBUaGVyZWZvcmUsIHdoZW4gYSBuZXcgcGFnZSBpcyBsb2FkZWQgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAqIHRoZSBvdmVydmlldyBzY2FsZSBpcyBpbml0aWFsaXplZCB0byBhIGRlZmF1bHQgdmFsdWUuIFRoaXMgZmxhZyBpcyB0aGVuCisgICAgICogc2V0IGFuZCB1c2VkIHRvIG5vdGlmeSB0aGUgWm9vbU1hbmFnZXIgdG8gdGFrZSB0aGUgd2lkdGggb2YgdGhlIG5leHQKKyAgICAgKiBwaWN0dXJlIGZyb20gd2Via2l0IGFuZCB1c2UgdGhhdCB3aWR0aCB0byBlbnRlciBpbnRvIHpvb20gb3ZlcnZpZXcgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogV2hlbiBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKKyAgICAgKiBjdXJyZW50IHdpbmRvdy4gQWRkaXRpb25hbGx5IHdoaWxlIHRoZSBwYWdlIGlzIGluIHRoaXMgc3RhdGUgaXQgaXMKKyAgICAgKiBhY3RpdmUsIGluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvIGZvbGxvdyB0aGUgbGlua3MuIFdlIGNhY2hlIGEKKyAgICAgKiBib29sZWFuIHRvIGVuYWJsZSB1cyB0byBxdWlja2x5IGNoZWNrIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBvdmVydmlldworICAgICAqIG1vZGUsIGJ1dCB0aGlzIHZhbHVlIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIGJ5IGNoYW5nZXMgdG8gdGhlIHpvb20KKyAgICAgKiBzY2FsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbVpvb21PdmVydmlld1dpZHRoOworICAgIHByaXZhdGUgZmxvYXQgbUludlpvb21PdmVydmlld1dpZHRoOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YXJpYWJsZXMgdHJhY2sgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbSBhbmQgdGhleSBhcmUgdXNlZCB0bworICAgICAqIGRldGVybWluZSB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHdlIHNob3VsZCB6b29tLiBUaGV5IGFyZSBzdG9yZWQgaW4gdmlldworICAgICAqIGNvb3JkaW5hdGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJYOworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJZOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHNjcmVlbiBzaG91bGQgYmUKKyAgICAgKiBjZW50ZXJlZCBhZnRlciB6b29taW5nLiBJbiBvdGhlciB3b3JkcyBpdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY2VudGVyCisgICAgICogcG9pbnQgb2YgdGhlIHZpc2libGUgZG9jdW1lbnQgYWZ0ZXIgdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIHpvb21pbmcuIFRoaXMKKyAgICAgKiBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgem9vbSBtYXkgaGF2ZSBwb3RlbnRpYWxseSByZWZsb3dlZCB0aGUgdGV4dCBhbmQKKyAgICAgKiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgcHJvcGVyIHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHJlbWFpbnMgb24gdGhlCisgICAgICogc2NyZWVuLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1BbmNob3JYOworICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworCisgICAgLy8gVGhlIHNjYWxlIGZhY3RvciB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb2x1bW4gd2lkdGggZm9yIHRleHQKKyAgICBwcml2YXRlIGZsb2F0IG1UZXh0V3JhcFNjYWxlOworCisgICAgLyoKKyAgICAgKiBUaGUgZGVmYXVsdCB6b29tIHNjYWxlIGlzIHRoZSBzY2FsZSBmYWN0b3IgdXNlZCB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGEKKyAgICAgKiB6b29tIGluIGJ5IGRvdWJsZSB0YXBwaW5nIG9uIHRoZSBXZWJWaWV3LiBUaGUgdmFsdWUgaXMgaW5pdGlhbGx5IHNldAorICAgICAqIGJhc2VkIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHksIGJ1dCBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSB2aWEgdGhlCisgICAgICogV2ViU2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkRlZmF1bHRTY2FsZTsKKworICAgIC8vIHRoZSBjdXJyZW50IGNvbXB1dGVkIHpvb20gc2NhbGUgYW5kIGl0cyBpbnZlcnNlLgorICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOworICAgIAorICAgIC8qCisgICAgICogVGhlIGluaXRpYWwgc2NhbGUgZm9yIHRoZSBXZWJWaWV3LiAwIG1lYW5zIGRlZmF1bHQuIElmIGluaXRpYWwgc2NhbGUgaXMKKyAgICAgKiBncmVhdGVyIHRoYW4gMCB0aGUgV2ViVmlldyBzdGFydHMgd2l0aCB0aGlzIHZhbHVlIGFzIGl0cyBpbml0aWFsIHNjYWxlLiBUaGUKKyAgICAgKiB2YWx1ZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbnRlZ2VyIHBlcmNlbnRhZ2Ugc28gaXQgaXMgZ3VhcmVudGVlZCB0byBoYXZlCisgICAgICogbm8gbW9yZSB0aGFuIDIgc2lnbmlmaWNhbnQgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAgVGhpcyByZXN0cmljdGlvbgorICAgICAqIGFsbG93cyB1cyB0byBjb252ZXJ0IHRoZSBzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwZXJjZW50YWdlIGJ5IHNpbXBseQorICAgICAqIG11bHRpcGx5aW5nIHRoZSB2YWx1ZSBieSAxMDAuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFNjYWxlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQgPSAwLjAxZjsKKworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGFuaW1hdGluZyB6b29tLiBJZgorICAgICAqIG1ab29tU2NhbGUgaXMgbm9uLXplcm8gdGhlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHpvb20gYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBvdGhlciB2YXJpYWJsZXMgYXJlIHVzZWQgYXMgYSBjYWNoZSAoZS5nLiBpbnZlcnNlKSBvciBhcyBhIHdheSB0byBzdG9yZQorICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgdmlldyBwcmlvciB0byBhbmltYXRpbmcgKGUuZy4gaW5pdGlhbCBzY3JvbGwgY29vcmRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOworICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKKworICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7CisKKyAgICAvLyB1c2UgdGhlIGZyYW1ld29yaydzIFNjYWxlR2VzdHVyZURldGVjdG9yIHRvIGhhbmRsZSBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IGZhbHNlOworCisgICAgcHVibGljIFpvb21NYW5hZ2VyKFdlYlZpZXcgd2ViVmlldywgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1Byb3h5OworCisgICAgICAgIC8qCisgICAgICAgICAqIElkZWFsbHkgbVpvb21PdmVydmlld1dpZHRoIHNob3VsZCBiZSBtQ29udGVudFdpZHRoLiBCdXQgc2l0ZXMgbGlrZQorICAgICAgICAgKiBFU1BOIGFuZCBFbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHRoZQorICAgICAgICAgKiB2aWV3cG9ydCBzaXplIGlzLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0Wm9vbU92ZXJ2aWV3V2lkdGgoV2ViVmlldy5ERUZBVUxUX1ZJRVdQT1JUX1dJRFRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7CisgICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOworICAgICAgICBtQWN0dWFsU2NhbGUgPSBkZW5zaXR5OworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gZGVuc2l0eTsKKyAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBkZW5zaXR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBkZW5zaXR5ICogbUludkRlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IGRlZmF1bHQgZGVuc2l0eQorICAgICAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgbGltaXRzCisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOworICAgICAgICAgICAgbU1pblpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUgKiBzY2FsZUZhY3RvciwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFpvb21TY2FsZShmbG9hdCBkZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlZmF1bHRTY2FsZTsKKyAgICAgICAgbUludkRlZmF1bHRTY2FsZSA9IDEgLyBkZWZhdWx0U2NhbGU7CisgICAgICAgIERFRkFVTFRfTUFYX1pPT01fU0NBTEUgPSA0LjBmICogZGVmYXVsdFNjYWxlOworICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRJbnZTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnZBY3R1YWxTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0VGV4dFdyYXBTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0V3JhcFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RG9jdW1lbnRBbmNob3JYKCkgeworICAgICAgICByZXR1cm4gbUFuY2hvclg7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclkoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckRvY3VtZW50QW5jaG9yKCkgeworICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRab29tQ2VudGVyKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbVpvb21DZW50ZXJYID0geDsKKyAgICAgICAgbVpvb21DZW50ZXJZID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoaW50IHNjYWxlSW5QZXJjZW50KSB7CisgICAgICAgIG1Jbml0aWFsU2NhbGUgPSBzY2FsZUluUGVyY2VudCAqIDAuMDFmOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfTUlOX1pPT01fU0NBTEU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOworICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1pvb21TY2FsZUZpeGVkKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZSA+PSBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoZmxvYXQgc2NhbGVBLCBmbG9hdCBzY2FsZUIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKHNjYWxlQSAtIHNjYWxlQikgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2lsbFNjYWxlVHJpZ2dlclpvb20oZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlIC0gbUFjdHVhbFNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7CisgICAgICAgIHJldHVybiB6b29tKDEuMjVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgeworICAgICAgICByZXR1cm4gem9vbSgwLjhmKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMgYW5kIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gem9vbShmbG9hdCB6b29tTXVsdGlwbGllcikgeworICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQorICAgICAgICBtV2ViVmlldy5zd2l0Y2hPdXREcmF3SGlzdG9yeSgpOworICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCisgICAgICAgIG1ab29tQ2VudGVyWCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogLjVmOworICAgICAgICBtWm9vbUNlbnRlclkgPSBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgKiAuNWY7CisgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICByZXR1cm4gc3RhcnRab29tQW5pbWF0aW9uKG1BY3R1YWxTY2FsZSAqIHpvb21NdWx0aXBsaWVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZXMgYW4gYW5pbWF0ZWQgem9vbSBvZiB0aGUgV2ViVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IHNjYWxlIHRyaWdnZXJlZCBhbiBhbmltYXRpb24gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFpvb21BbmltYXRpb24oZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgLy8gc25hcCB0byBERUZBVUxUX1NDQUxFIGlmIGl0IGlzIGNsb3NlCisgICAgICAgIGlmICghZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBtRGVmYXVsdFNjYWxlKSkgeworICAgICAgICAgICAgc2NhbGUgPSBtRGVmYXVsdFNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0CisgICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKKyAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFdlYlZpZXcncyBkcmF3aW5nIGNvZGUgd2hlbiBhIGZpeGVkIGxlbmd0aCB6b29tCisgICAgICogYW5pbWF0aW9uIGlzIG9jY3VycmluZy4gSXRzIHB1cnBvc2UgaXMgdG8gYW5pbWF0ZSB0aGUgem9vbWluZyBvZiB0aGUgY2FudmFzCisgICAgICogdG8gdGhlIGRlc2lyZWQgc2NhbGUgd2hpY2ggd2FzIHNwZWNpZmllZCBpbiBzdGFydFpvb21BbmltYXRpb24oLi4uKS4KKyAgICAgKgorICAgICAqIEEgZml4ZWQgbGVuZ3RoIGFuaW1hdGlvbiBiZWdpbnMgd2hlbiBzdGFydFpvb21BbmltYXRpb24oLi4uKSBpcyBjYWxsZWQgYW5kCisgICAgICogY29udGludWVzIHVudGlsIHRoZSBaT09NX0FOSU1BVElPTl9MRU5HVEggdGltZSBoYXMgZWxhcHNlZC4gRHVyaW5nIHRoYXQKKyAgICAgKiBpbnRlcnZhbCBlYWNoIHRpbWUgdGhlIFdlYlZpZXcgZHJhd3MgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGljaCBpcyAKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCB0aGUgV2ViVmlldyBjYW4gY2hlY2sgdG8gc2VlIGlmIHN1Y2ggYW4gYW5pbWF0aW9uIGlzIGN1cnJlbnRseQorICAgICAqIGluIHByb2dyZXNzIGJ5IGNhbGxpbmcgaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlWm9vbShDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkEgV2ViVmlldyBpcyBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaXhlZCBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICArICJ6b29tIGFuaW1hdGlvbiB3aGVuIG5vIHpvb20gaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHpvb21TY2FsZTsKKyAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7CisgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgeworICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIGludGVydmFsIC8gWk9PTV9BTklNQVRJT05fTEVOR1RIOworICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQorICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7CisgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOworICAgICAgICAgICAgLy8gc2V0IG1ab29tU2NhbGUgdG8gYmUgMCBhcyB3ZSBoYXZlIGZpbmlzaGVkIGFuaW1hdGluZworICAgICAgICAgICAgbVpvb21TY2FsZSA9IDA7CisgICAgICAgICAgICBtV2ViVmlldy5vbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gU2luY2Ugd2UgbmVlZCB0byB1c2UKKyAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgdGhlIFdlYlZpZXcncyBwaW5Mb2NYL1kgZnVuY3Rpb25zIGRpcmVjdGx5LgorICAgICAgICBmbG9hdCBzY2FsZSA9IHpvb21TY2FsZSAqIG1JbnZJbml0aWFsWm9vbVNjYWxlOworICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkgLSBtWm9vbUNlbnRlclgpOworICAgICAgICB0eCA9IC1XZWJWaWV3LnBpbkxvYyh0eCwgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudFdpZHRoKCkKKyAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpOworICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCisgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCisgICAgICAgICAgICAgICAgLSAobVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpKTsKKyAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogV2ViVmlldy5waW5Mb2ModHkKKyAgICAgICAgICAgICAgICAtIHRpdGxlSGVpZ2h0LCBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudEhlaWdodCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIHRpdGxlSGVpZ2h0KSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKworICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7CisgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tQW5pbWF0aW5nKCkgeworICAgICAgICByZXR1cm4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB8fCBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB7CisgICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFpvb21TY2FsZShib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93VGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTY2FsZUxlc3NUaGFuTWluWm9vbSA9IHNjYWxlIDwgbU1pblpvb21TY2FsZTsKKyAgICAgICAgc2NhbGUgPSBjb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaWYgKGlzU2NhbGVMZXNzVGhhbk1pblpvb20gJiYgbU1pblpvb21TY2FsZSA8IG1EZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWZsb3dUZXh0KSB7CisgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgeworICAgICAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBmbG9hdCBvbGRJbnZTY2FsZSA9IG1JbnZBY3R1YWxTY2FsZTsKKworICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOworCisgICAgICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCisgICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3CisgICAgICAgICAgICAgICAgaW50IG9sZFggPSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG9sZEludlNjYWxlOworICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7CisgICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCisgICAgICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQorICAgICAgICAgICAgICAgIGludCBzY3JvbGxYID0gbVdlYlZpZXcucGluTG9jWChNYXRoLnJvdW5kKHN4KSk7CisgICAgICAgICAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5waW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKKyAgICAgICAgICAgICAgICBpZighbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoc2Nyb2xsWCwgc2Nyb2xsWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlIHdlIG5lZWQgdG8gcmVmbG93IHRoZSB0ZXh0IHRoZW4gZm9yY2UgdGhlIFZJRVdfU0laRV9DSEFOR0VECisgICAgICAgICAgICAvLyBldmVudCB0byBiZSBzZW50IHRvIFdlYktpdAorICAgICAgICAgICAgbVdlYlZpZXcuc2VuZFZpZXdTaXplWm9vbShyZWZsb3dUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkb3VibGUgdGFwIGdlc3R1cmUgY2FuIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmVoYXZpb3JzIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBjb250ZW50IHRoYXQgaXMgdGFwcGVkLgorICAgICAqCisgICAgICogKDEpIFBMVUdJTlM6IElmIHRoZSB0YXBzIG9jY3VyIG9uIGEgcGx1Z2luIHRoZW4gd2UgbWF4aW1pemUgdGhlIHBsdWdpbiBvbgorICAgICAqIHRoZSBzY3JlZW4uIElmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBtYXhpbWl6ZWQgdGhlbiB6b29tIHRoZSB1c2VyIGludG8KKyAgICAgKiBvdmVydmlldyBtb2RlLgorICAgICAqCisgICAgICogKDIpIEhUTUwvT1RIRVI6IElmIHRoZSB0YXBzIG9jY3VyIG91dHNpZGUgYSBwbHVnaW4gdGhlbiB0aGUgZm9sbG93aW5nCisgICAgICogaGV1cmlzdGljIGlzIHVzZWQuCisgICAgICogICBBLiBJZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgdGhlCisgICAgICogICAgICBsYXlvdXQgYWxnb3JpdGhtIHNwZWNpZmllcyB0aGUgdXNlIG9mIE5BUlJPV19DT0xVTU5TLCB0aGVuIGZpdCB0bworICAgICAqICAgICAgY29sdW1uIGJ5IHJlZmxvd2luZyB0aGUgdGV4dC4KKyAgICAgKiAgIEIuIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBvdmVydmlldyBtb2RlIHRoZW4gY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICogICBDLiBJZiB0aGUgcGFnZSBpcyBpbiBvdmVybW9kZSB0aGVuIGNoYW5nZSB0byB0aGUgZGVmYXVsdCBzY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVUYXAoZmxvYXQgbGFzdFRvdWNoWCwgZmxvYXQgbGFzdFRvdWNoWSkgeworICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsIHx8IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRab29tQ2VudGVyKGxhc3RUb3VjaFgsIGxhc3RUb3VjaFkpOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIGxhc3RUb3VjaFggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIGxhc3RUb3VjaFkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgZG91YmxlIHRhcCB3YXMgb24gYSBwbHVnaW4gdGhlbiBlaXRoZXIgem9vbSB0byBtYXhpbWl6ZSB0aGUKKyAgICAgICAgICogcGx1Z2luIG9uIHRoZSBzY3JlZW4gb3Igc2NhbGUgdG8gb3ZlcnZpZXcgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtV2ViVmlldy5tVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOworICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5pc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKKyAgICAgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMKKyAgICAgICAgICAgICAgICAmJiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpIHsKKyAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1Jblpvb21PdmVydmlldykgeworICAgICAgICAgICAgem9vbVRvT3ZlcnZpZXcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpvb21Ub0RlZmF1bHRMZXZlbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21PdmVydmlld1dpZHRoKGludCB3aWR0aCkgeworICAgICAgICBtWm9vbU92ZXJ2aWV3V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUludlpvb21PdmVydmlld1dpZHRoID0gMS4wZiAvIHdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAqIG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luWm9vbU92ZXJ2aWV3KCkgeworICAgICAgICByZXR1cm4gbUluWm9vbU92ZXJ2aWV3OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB6b29tVG9PdmVydmlldygpIHsKKyAgICAgICAgaWYgKCF3aWxsU2NhbGVUcmlnZ2VyWm9vbShnZXRab29tT3ZlcnZpZXdTY2FsZSgpKSkgcmV0dXJuOworCisgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAgICBpbnQgc2Nyb2xsWSA9IG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgaWYgKHNjcm9sbFkgPCBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpKSB7CisgICAgICAgICAgICBtV2ViVmlldy51cGRhdGVTY3JvbGxDb29yZGluYXRlcyhtV2ViVmlldy5nZXRTY3JvbGxYKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXJ0Wm9vbUFuaW1hdGlvbihnZXRab29tT3ZlcnZpZXdTY2FsZSgpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvRGVmYXVsdExldmVsKCkgeworICAgICAgICBpbnQgbGVmdCA9IG1XZWJWaWV3Lm5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UobUFuY2hvclgsIG1BbmNob3JZLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBpZiAobGVmdCAhPSBXZWJWaWV3Lk5PX0xFRlRFREdFKSB7CisgICAgICAgICAgICAvLyBhZGQgYSA1cHQgcGFkZGluZyB0byB0aGUgbGVmdCBlZGdlLgorICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gbVdlYlZpZXcuY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKKyAgICAgICAgICAgICAgICAgICAgLSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHpvb20gY2VudGVyIHNvIHRoYXQgdGhlIG5ldyBzY3JvbGwgeCB3aWxsIGJlCisgICAgICAgICAgICAvLyBvbiB0aGUgbGVmdCBlZGdlLgorICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IHZpZXdMZWZ0ICogbURlZmF1bHRTY2FsZSAvIChtRGVmYXVsdFNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2Nyb2xsQnkodmlld0xlZnQsIDApOworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRab29tQW5pbWF0aW9uKG1EZWZhdWx0U2NhbGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBjaGVjayB0aGUgcHJlY29uZGl0aW9ucworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIKQorICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLnN1cHBvcnRab29tKCkgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpOworICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgeworICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKKyAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgeworICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBwb3J0TXVsdGlUb3VjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgY2FsbGVyIHRoYXQgdGhlIFpvb21NYW5hZ2VyIGlzIHJlcXVlc3RpbmcgdGhhdCBzY2FsZSByZWxhdGVkCisgICAgICogdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0LiBUaGlzIGNhbiBvY2N1ciBpbiBjYXNlcyB3aGVyZSB0aGUKKyAgICAgKiBab29tTWFuYWdlciBpcyBwZXJmb3JtaW5nIGFuIGFuaW1hdGlvbiBhbmQgZG9lcyBub3Qgd2FudCB3ZWJraXQgdG8gdXBkYXRlCisgICAgICogdW50aWwgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzY2FsZSByZWxhdGVkIHVwZGF0ZXMgc2hvdWxkIG5vdCBiZSBzZW50IHRvIHdlYmtpdCBhbmQKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkgeworICAgICAgICAvLyBjdXJyZW50bHkgb25seSBhbmltYXRpbmcgYSBtdWx0aS10b3VjaCB6b29tIHByZXZlbnRzIHVwZGF0ZXMsIGJ1dAorICAgICAgICAvLyBvdGhlcnMgY2FuIGFkZCB0aGVpciBvd24gY29uZGl0aW9ucyB0byB0aGlzIG1ldGhvZCBpZiBuZWNlc3NhcnkuCisgICAgICAgIHJldHVybiBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIFNjYWxlR2VzdHVyZURldGVjdG9yIGdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVEZXRlY3RvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNjYWxlRGV0ZWN0b3JMaXN0ZW5lciBpbXBsZW1lbnRzIFNjYWxlR2VzdHVyZURldGVjdG9yLk9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGVCZWdpbihTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5zdGFydFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgucm91bmQoZGV0ZWN0b3IuZ2V0U2NhbGVGYWN0b3IoKSAqIG1BY3R1YWxTY2FsZSAqIDEwMCkgKiAwLjAxZjsKKyAgICAgICAgICAgIGlmICh3aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkpIHsKKyAgICAgICAgICAgICAgICBtUGluY2hUb1pvb21BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBzY2FsZSBjaGFuZ2UgcGVyIHN0ZXAKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPiBtQWN0dWFsU2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihzY2FsZSwgbUFjdHVhbFNjYWxlICogMS4yNWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDAuOGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRab29tQ2VudGVyKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSk7CisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TY2FsZUVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgaWYgKG1QaW5jaFRvWm9vbUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVmbG93IHdoZW4gem9vbSBpbjsgd2hlbiB6b29tIG91dCwgZG8gcmVmbG93IGlmIHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyBzY2FsZSBpcyBhbG1vc3QgbWluaW11bSBzY2FsZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlZmxvd05vdyA9ICFjYW5ab29tT3V0KCkgfHwgKG1BY3R1YWxTY2FsZSA8PSAwLjggKiBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgICAgICAgICAgLy8gZm9yY2Ugem9vbSBhZnRlciBtUHJldmlld1pvb21Pbmx5IGlzIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyB2aWV3IHNpemUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFdlYktpdAorICAgICAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUocmVmbG93Tm93KTsKKyAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSB0byBkcmF3IHdpdGhvdXQgem9vbSBmaWx0ZXIKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5lbmRab29tKCk7CisgICAgICAgICAgICBtV2ViVmlldy5vblBpbmNoVG9ab29tQW5pbWF0aW9uRW5kKGRldGVjdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb3csIGludCBvaCkgeworICAgICAgICAvLyByZXNldCB6b29tIGFuZCBhbmNob3IgdG8gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgc2NyZWVuCisgICAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSB6b29taW5nCisgICAgICAgIGlmICghaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgaW50IHZpc2libGVUaXRsZUhlaWdodCA9IG1XZWJWaWV3LmdldFZpc2libGVUaXRsZUhlaWdodCgpOworICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKKyAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IHZpc2libGVUaXRsZUhlaWdodDsKKyAgICAgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgobVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkodmlzaWJsZVRpdGxlSGVpZ2h0ICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSBtTWluWm9vbVNjYWxlIGlmIHRoZSBtaW5pbXVtIHpvb20gc2NhbGUgaXMgbm90IGZpeGVkCisgICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7CisgICAgICAgICAgICAvLyB3aGVuIGNoYW5nZSBmcm9tIG5hcnJvdyBzY3JlZW4gdG8gd2lkZSBzY3JlZW4sIHRoZSBuZXcgdmlld1dpZHRoCisgICAgICAgICAgICAvLyBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb2xkIGNvbnRlbnQgd2lkdGguIFdlIGxpbWl0IHRoZSBtaW5pbXVtCisgICAgICAgICAgICAvLyBzY2FsZSB0byAxLjBmLiBUaGUgcHJvcGVyIG1pbmltdW0gc2NhbGUgd2lsbCBiZSBjYWxjdWxhdGVkIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSBuZXcgcGljdHVyZSBzaG93cyB1cC4KKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBNYXRoLm1pbigxLjBmLCAoZmxvYXQpIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpCisgICAgICAgICAgICAgICAgICAgIC8gKG1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgPyBtV2ViVmlldy5nZXRIaXN0b3J5UGljdHVyZVdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ab29tT3ZlcnZpZXdXaWR0aCkpOworICAgICAgICAgICAgLy8gbGltaXQgdGhlIG1pblpvb21TY2FsZSB0byB0aGUgaW5pdGlhbFNjYWxlIGlmIGl0IGlzIHNldAorICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGUgPiAwICYmIG1Jbml0aWFsU2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7CisgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IG1Jbml0aWFsU2NhbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworCisgICAgICAgIC8vIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQgZHVyaW5nIFdlYlZpZXcgbGF5b3V0LiBBbmQgYW55CisgICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKSBpcyBibG9ja2VkIGR1cmluZyBsYXlvdXQuIEFzIHJlZnJlc2hab29tU2NhbGUoKSB3aWxsCisgICAgICAgIC8vIGNhdXNlIGl0cyBjaGlsZCBWaWV3IHRvIHJlcG9zaXRpb24gaXRzZWxmIHRocm91Z2ggVmlld01hbmFnZXIncworICAgICAgICAvLyBzY2FsZUFsbCgpLCB3ZSBuZWVkIHRvIHBvc3QgYSBSdW5uYWJsZSB0byBlbnN1cmUgcmVxdWVzdExheW91dCgpLgorICAgICAgICAvLyBBZGRpdGlvbmFsbHksIG9ubHkgdXBkYXRlIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaWYgdGhlIHdpZHRoIGNoYW5nZWQuCisgICAgICAgIG1XZWJWaWV3LnBvc3QobmV3IFBvc3RTY2FsZSh3ICE9IG93KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVVwZGF0ZVRleHRXcmFwOworCisgICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCkgeworICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwID0gdXBkYXRlVGV4dFdyYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0V2ViVmlld0NvcmUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGZvcmNlLCBpbiBjYXNlIG91ciBoZWlnaHQgY2hhbmdlZCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAgICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG92ZXIgdG8gd2Via2l0LgorICAgICAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUobVVwZGF0ZVRleHRXcmFwKTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKKyAgICAgICAgICAgICAgICB1cGRhdGVab29tUGlja2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUmFuZ2UoV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSwKKyAgICAgICAgICAgIGludCB2aWV3V2lkdGgsIGludCBtaW5QcmVmV2lkdGgpIHsKKyAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPT0gMCkgeworICAgICAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSkgeworICAgICAgICAgICAgICAgIGlmIChtaW5QcmVmV2lkdGggPiBNYXRoLm1heCgwLCB2aWV3V2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1pblByZWZXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlOworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7CisgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NaW5TY2FsZTsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPT0gMCkgeworICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgd2hlbiBXZWJraXQgcHJvZHVjZXMgYSBuZXcgcGljdHVyZS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTmV3UGljdHVyZShXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCk7CisKKyAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bworICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQorICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKKyAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCisgICAgICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChNYXRoLm1pbihXZWJWaWV3LnNNYXhWaWV3cG9ydFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgoaW50KSAodmlld1dpZHRoICogbUludkRlZmF1bHRTY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZHJhd0RhdGEubU1pblByZWZXaWR0aCwgZHJhd0RhdGEubVZpZXdQb2ludC54KSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGZsb2F0IHpvb21PdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB6b29tT3ZlcnZpZXdTY2FsZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXQgdGhlIGNvbnRlbnQgd2lkdGggdG8gdGhlIGN1cnJlbnQgdmlldy4gSWdub3JlIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgorICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgJiYgKG1Jblpvb21PdmVydmlldyB8fCBtSW5pdGlhbFpvb21PdmVydmlldykKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKSAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSB7CisgICAgICAgICAgICBtSW5pdGlhbFpvb21PdmVydmlldyA9IGZhbHNlOworICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHpvb21PdmVydmlld1NjYWxlLCAhd2lsbFNjYWxlVHJpZ2dlclpvb20obVRleHRXcmFwU2NhbGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgd2hlbiBXZWJraXQgcmVzdG9yZXMgYSBvbGQgcGljdHVyZS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVab29tU3RhdGUoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgLy8gcHJlY29uZGl0aW9uIGNoZWNrCisgICAgICAgIGFzc2VydCBkcmF3RGF0YSAhPSBudWxsOworICAgICAgICBhc3NlcnQgZHJhd0RhdGEubVJlc3RvcmVTdGF0ZSAhPSBudWxsOworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBkcmF3RGF0YS5tUmVzdG9yZVN0YXRlOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXdEYXRhLm1WaWV3UG9pbnQ7CisgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIHZpZXdTaXplLngsIGRyYXdEYXRhLm1NaW5QcmVmV2lkdGgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZmxvd1RleHQ7CisKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIHNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gcmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgICAgIHNjYWxlID0gcmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgLyBXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAorICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVab29tU3RhdGUoQnVuZGxlIGIpIHsKKyAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCisgICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKKyAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQorICAgICAgICBtQWN0dWFsU2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gbUFjdHVhbFNjYWxlOworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEJhc2UgZ2V0Q3VycmVudFpvb21Db250cm9sKCkgeworICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc3VwcG9ydFpvb20oKSkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbWJlZGRlZFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVtYmVkZGVkWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFbWJlZGRlZCh0aGlzLCBtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRW1iZWRkZWRab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRlcm5hbFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV4dGVybmFsWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFeHRlcm5hbChtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2Vab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc21pc3Nab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIHJldHVybiAoY29udHJvbCAhPSBudWxsKSA/IGNvbnRyb2wuaXNWaXNpYmxlKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVtYmVkZGVkIHpvb20gY29udHJvbCBpbnRlcmNlcHRzIHRvdWNoIGV2ZW50cyBhbmQgYXV0b21hdGljYWxseSBzdGF5cworICAgICAqIHZpc2libGUuIFRoZSBleHRlcm5hbCBjb250cm9sIG5lZWRzIHRvIGNvbnN0YW50bHkgcmVmcmVzaCBpdHMgaW50ZXJuYWwKKyAgICAgKiB0aW1lciB0byBzdGF5IHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQga2VlcFpvb21QaWNrZXJWaXNpYmxlKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0RXh0ZXJuYWxab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbC5nZXRDb250cm9scygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGExYTdhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJydW50aW1lOworCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGUgcnVudGltZSB1c2VkIHRvIGRpc3BsYXkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbnMuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgV2ViUnVudGltZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HVEFHID0gIldlYlJ1bnRpbWVBY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBVUkwgbUJhc2VVcmw7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNwbGFzaFNjcmVlbjsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDYW4ndCBnZXQgbWV0YSBkYXRhIHVzaW5nIGdldEFwcGxpY2F0aW9uSW5mbygpIGFzIGl0IGRvZXNuJ3QgcGFzcyBHRVRfTUVUQV9EQVRBCisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBhY2thZ2VNYW5hZ2VyID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUodGhpcywgZ2V0Q2xhc3MoKSk7CisgICAgICAgIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZpdHlJbmZvID0gcGFja2FnZU1hbmFnZXIuZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudE5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiRmFpbGVkIHRvIGZpbmQgY29tcG9uZW50Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2aXR5SW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJGYWlsZWQgdG8gZ2V0IGFjdGl2aXR5IGluZm8iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJ1bmRsZSBtZXRhRGF0YSA9IGFjdGl2aXR5SW5mby5tZXRhRGF0YTsKKyAgICAgICAgaWYgKG1ldGFEYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIk5vIG1ldGEgZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybCA9IG1ldGFEYXRhLmdldFN0cmluZygiYW5kcm9pZC53ZWJydW50aW1lLnVybCIpOworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIk5vIFVSTCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXNlVXJsID0gbmV3IFVSTCh1cmwpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiSW52YWxpZCBVUkwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQud2ViX3J1bnRpbWUpOworICAgICAgICBtV2ViVmlldyA9IChXZWJWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgbVNwbGFzaFNjcmVlbiA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNwbGFzaHNjcmVlbik7CisgICAgICAgIG1TcGxhc2hTY3JlZW4uc2V0SW1hZ2VSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXRJZGVudGlmaWVyKCJzcGxhc2hfc2NyZWVuIiwgImRyYXdhYmxlIiwgZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICBtV2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRPdmVycmlkZVVybExvYWRpbmcoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVVJMIG5ld09yaWdpbiA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld09yaWdpbi5nZXRIb3N0KCkuZXF1YWxzKG1CYXNlVXJsLmdldEhvc3QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNpbXBsZSBzYW1lIG9yaWdpbiB0ZXN0IHBhc3NlcywgbG9hZCBpbiB0aGUgd2Vidmlldy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZG8gYSBtb3JlIHJvYnVzdCBTT1AgY2hlY2suCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGxvYWQgYW55dGhpbmcgaWYgdGhpcyB3YXNuJ3QgYSBwcm9wZXIgVVJMLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyBpcyBhIFVSTCB0aGF0IGlzIG5vdCBzYW1lIG9yaWdpbiBzbyBwYXNzIGl0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIEJyb3dzZXIgdG8gbG9hZC4KKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXLCBVcmkucGFyc2UodXJsKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgICAgIGlmIChtU3BsYXNoU2NyZWVuLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIG1TcGxhc2hTY3JlZW4gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVXNlIGEgY3VzdG9tIFdlYkNocm9tZUNsaWVudCB3aXRoIGdlb2xvY2F0aW9uIHBlcm1pc3Npb25zIGhhbmRsaW5nIHRvIGFsd2F5cworICAgICAgICAvLyBhbGxvdyBvciBkZW55LCBiYXNlZCBvbiB0aGUgYXBwJ3MgcGVybWlzc2lvbnMuCisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd2VkID0gcGFja2FnZU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sIHBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKKyAgICAgICAgbVdlYlZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbiwgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIGFsbG93ZWQsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBTZXQgdGhlIERCIGxvY2F0aW9uLiBPcHRpb25hbC4gR2VvbG9jYXRpb24gd29ya3Mgd2l0aG91dCBEQnMuCisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0R2VvbG9jYXRpb25EYXRhYmFzZVBhdGgoCisgICAgICAgICAgICAgICAgZ2V0RGlyKCJnZW9sb2NhdGlvbiIsIE1PREVfUFJJVkFURSkuZ2V0UGF0aCgpKTsKKworICAgICAgICBTdHJpbmcgdGl0bGUgPSBtZXRhRGF0YS5nZXRTdHJpbmcoImFuZHJvaWQud2VicnVudGltZS50aXRsZSIpOworICAgICAgICAvLyBXZSB0dXJuZWQgb2ZmIHRoZSB0aXRsZSBiYXIgdG8gZ28gZnVsbCBzY3JlZW4gc28gZGlzcGxheSB0aGUKKyAgICAgICAgLy8gd2ViYXBwJ3MgdGl0bGUgYXMgYSB0b2FzdC4KKyAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIHRpdGxlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvYWQgdGhlIHdlYmFwcCdzIGJhc2UgVVJMLgorICAgICAgICBtV2ViVmlldy5sb2FkVXJsKHVybCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0sgJiYgbVdlYlZpZXcuY2FuR29CYWNrKCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LmdvQmFjaygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgbWVudS5hZGQoMCwgMCwgMCwgIk1lbnUgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKDAsIDEsIDAsICJNZW51IGl0ZW0gMiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDZjZmViNjguLjEwOTI3YTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC01NTksNiArNTU5LDE2IEBACiAKICAgICAgICAgYm9vbGVhbiBzbW9vdGhTY3JvbGxiYXIgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfc21vb3RoU2Nyb2xsYmFyLCB0cnVlKTsKICAgICAgICAgc2V0U21vb3RoU2Nyb2xsYmFyRW5hYmxlZChzbW9vdGhTY3JvbGxiYXIpOworICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGFkYXB0ZXJJZCA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BYnNMaXN0Vmlld19hZGFwdGVyLCAwKTsKKyAgICAgICAgaWYgKGFkYXB0ZXJJZCAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGMgPSBjb250ZXh0OworICAgICAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXRBZGFwdGVyKEFkYXB0ZXJzLmxvYWRBZGFwdGVyKGMsIGFkYXB0ZXJJZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTU3NSw2ICsxNTg1LDExIEBACiAgICAgICAgICAgICAgICAgdHJlZU9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIodGhpcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURhdGFTZXRPYnNlcnZlciA9IG5ldyBBZGFwdGVyRGF0YVNldE9ic2VydmVyKCk7CisgICAgICAgICAgICBtQWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU5NSw2ICsxNjEwLDExIEBACiAgICAgICAgICAgICAgICAgbUdsb2JhbExheW91dExpc3RlbmVyQWRkZWRGaWx0ZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICAgICAgbURhdGFTZXRPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkN2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCkBAIC0wLDAgKzEsMTIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbG9hZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBhZGFwdGVyc30gZGVmaW5lZCBpbgorICogWE1MIHJlc291cmNlcy4gWE1MLWRlZmluZWQgYWRhcHRlcnMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGNyZWF0ZSBhZGFwdGVycyBpbiB5b3VyCisgKiBvd24gYXBwbGljYXRpb24gb3IgdG8gcGFzcyBhZGFwdGVycyB0byBvdGhlciBwcm9jZXNzZXMuPC9wPgorICogCisgKiA8aDI+VHlwZXMgb2YgYWRhcHRlcnM8L2gyPgorICogPHA+QWRhcHRlcnMgZGVmaW5lZCB1c2luZyBYTUwgcmVzb3VyY2VzIGNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN1cHBvcnRlZAorICogdHlwZXMuIEFyYml0cmFyeSBhZGFwdGVycyBhcmUgbm90IHN1cHBvcnRlZCB0byBndWFyYW50ZWUgdGhlIHNhZmV0eSBvZiB0aGUgbG9hZGVkCisgKiBjb2RlIHdoZW4gYWRhcHRlcnMgYXJlIGxvYWRlZCBhY3Jvc3MgcGFja2FnZXMuPC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyIj5DdXJzb3IgYWRhcHRlcjwvYT46IGEgY3Vyc29yIGFkYXB0ZXIgY2FuIGJlIHVzZWQKKyAqICB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgY3Vyc29yLCBtb3N0IG9mdGVuIGNvbWluZyBmcm9tIGEgY29udGVudCBwcm92aWRlcjwvbGk+CisgKiA8L3VsPgorICogPHA+VGhlIGNvbXBsZXRlIFhNTCBmb3JtYXQgZGVmaW5pdGlvbiBvZiBlYWNoIGFkYXB0ZXIgdHlwZSBpcyBhdmFpbGFibGUgYmVsb3cuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXIiIC8+CisgKiA8aDI+Q3Vyc29yIGFkYXB0ZXI8L2gyPgorICogPHA+QSBjdXJzb3IgYWRhcHRlciBYTUwgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIj48Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+PC9hPgorICogdGFnIGFuZCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyB0YWdzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci10YWciIC8+CisgKiA8aDM+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZG9jdW1lbnQgYW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6bGF5b3V0PC9jb2RlPjogUmVmZXJlbmNlIHRvIHRoZSBYTUwgbGF5b3V0IHRvIGJlIGluZmxhdGVkIGZvcgorICogIGVhY2ggaXRlbSBvZiB0aGUgYWRhcHRlci4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c2VsZWN0aW9uPC9jb2RlPjogU2VsZWN0aW9uIGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzb3J0T3JkZXI8L2NvZGU+OiBTb3J0IGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+OiBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkgdG8gcmV0cmlldmUgYSBjdXJzb3IuCisgKiAgU3BlY2lmeWluZyB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kLCB0aGUgdmFsdWUgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaXMgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqICBvcHRpb25hbC48L2xpPgorICogPC91bD4KKyAqIDxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPiBhbmQKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT4gdGFncyBhcyBjaGlsZHJlbgorICogb2YgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPi48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIiAvPgorICogPGgzPiZsdDtzZWxlY3QgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGN1cnNvcgorICogd2hlbiBkb2luZyB0aGUgcXVlcnkuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIHdoZW4gdXNpbmcgdHJhbnNmb3JtYXRpb25zIGluIHRoZQorICogPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzLiBJdCBjYW4gYWxzbyBiZSB2ZXJ5IHVzZWZ1bCBpZiB5b3UgYXJlIHByb3ZpZGluZworICogeW91ciBvd24gPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmJpbmRlcjwvYT4gb3IKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj50cmFuc2Zvcm1hdGlvbjwvYT4gY2xhc3Nlcy4KKyAqIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBpZ25vcmVkIGlmIHlvdSBzdXBwbHkgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpjb2x1bW48L2NvZGU+OiBOYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0IGluIHRoZSBjdXJzb3IgZHVyaW5nIHRoZQorICogIHF1ZXJ5IG9wZXJhdGlvbjwvbGk+CisgKiA8L3VsPgorICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY29sdW1uIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gaXMgYWx3YXlzIGltcGxpY2l0bHkKKyAqIHNlbGVjdGVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIiAvPgorICogPGgzPiZsdDtiaW5kIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gYmluZCBhIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IgdG8KKyAqIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS4gQSBjb2x1bW4gYm91bmQgdXNpbmcgdGhpcyB0YWcgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZAorICogZHVyaW5nIHRoZSBxdWVyeSBhbmQgYSBtYXRjaGluZworICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdGhlcmVmb3JlCisgKiBub3QgcmVxdWlyZWQuPC9wPgorICogCisgKiA8cD5FYWNoIGJpbmRpbmcgaXMgZGVjbGFyZWQgYXMgYSBvbmUgdG8gb25lIG1hdGNoaW5nIGJ1dAorICogY3VzdG9tIGJpbmRlciBjbGFzc2VzIG9yIHNwZWNpYWwKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2FuCisgKiBhbGxvdyB5b3UgdG8gYmluZCBzZXZlcmFsIGNvbHVtbnMgdG8gYSBzaW5nbGUgdmlldy4gSW4gdGhpcyBjYXNlIHlvdSBtdXN0IHVzZSB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIHRvIG1ha2UKKyAqIHN1cmUgYW55IHJlcXVpcmVkIGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBxdWVyeS48L3A+CisgKiAKKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbTwvY29kZT46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLgorICogIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4gTm90ZSB0aGF0IDxjb2RlPkA8L2NvZGU+IHdoaWNoIGFyZSBub3QgdXNlZCB0byByZWZlcmVuY2UgcmVzb3VyY2VzCisgKiAgc2hvdWxkIGJlIGJhY2tzbGFzaCBwcm90ZWN0ZWQgYXMgaW4gPGNvZGU+XEA8L2NvZGU+LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG88L2NvZGU+OiBUaGUgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6YXM8L2NvZGU+OiBUaGUgPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmRhdGEgdHlwZTwvYT4KKyAqICBvZiB0aGUgYmluZGluZy4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD5JbiBhZGRpdGlvbiwgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjaGlsZHJlbgorICogdGFncy48L3A+CisgKgorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyIgLz4KKyAqIDxoND5CaW5kaW5nIGRhdGEgdHlwZXM8L2g0PgorICogPHA+Rm9yIGEgYmluZGluZyB0byBvY2N1ciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBib3VuZCBjb2x1bW4vdmlldyBwYWlyIG11c3QgYmUgc3BlY2lmaWVkLgorICogVGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+c3RyaW5nPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgbXVzdCBiZQorICogIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbgorICogIGltYWdlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2UtdXJpPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZQorICogIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+ZHJhd2FibGU8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYQorICogIGRyYXdhYmxlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+dGFnPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgd2lsbCBiZSBzZXQgYXMKKyAqICB0aGUgdGFnICh1c2luZyB7QGxpbmsgVmlldyNzZXRUYWcoT2JqZWN0KX0gb2YgdGhlIGFzc29jaWF0ZWQgVmlldy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogIGFzc29jaWF0ZSBtZXRhLWRhdGEgdG8geW91ciB2aWV3LCB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBieSBhIGxpc3RlbmVyLjwvbGk+CisgKiAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU6IFRoZSBuYW1lIG9mIGEgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9LiBDdXJzb3IgYmluZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgYmluZGluZ3Mgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBDdXN0b20gYmluZGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4gYW4KKyAqICBhcHBsaWNhdGlvbiB3aWRnZXQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24iIC8+CisgKiA8aDQ+QmluZGluZyB0cmFuc2Zvcm1hdGlvbnM8L2g0PgorICogPHA+V2hlbiBkZWZpbmluZyBhIGRhdGEgYmluZGluZyB5b3UgY2FuIHNwZWNpZnkgYW4gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gYnkgdXNpbmcgb25lCisgKiBvZiB0aGUgZm9sbG93aW5nIHRhZ3MgYXMgYSBjaGlsZCBvZiBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+OiBNYXBzIGEgY29uc3RhbnQgc3RyaW5nIHRvIGEgc3RyaW5nIG9yIGEgcmVzb3VyY2UuIFVzZQorICogIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRhZyBwZXIgdmFsdWUgeW91IHdhbnQgdG8gbWFwPC9saT4KKyAqICA8bGk+PGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT46IFRyYW5zZm9ybXMgYSBjb2x1bW4ncyB2YWx1ZSB1c2luZyBhbiBleHByZXNzaW9uCisgKiAgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiA8L3VsPgorICogPHA+V2hpbGUgc2V2ZXJhbCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiB0YWdzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIHlvdSBjYW5ub3QKKyAqIG1peCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncy4gSWYgc2V2ZXJhbAorICogPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncyBhcmUgc3BlY2lmaWVkLCBvbmx5IHRoZSBsYXN0IG9uZSBpcyByZXRhaW5lZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLW1hcCIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O21hcCAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgbWFwIGVsZW1lbnQgc2ltcGx5IHNwZWNpZmllcyBhIHZhbHVlIHRvIG1hdGNoIGZyb20gYW5kIGEgdmFsdWUgdG8gbWF0Y2ggdG8uIFdoZW4KKyAqIGEgY29sdW1uJ3MgdmFsdWUgZXF1YWxzIHRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSB0byBtYXRjaAorICogdG8uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggZnJvbS4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0b1ZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIHRvLiBUaGlzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcKKyAqICBvciBhIHJlc291cmNlIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZGVudGlmaWVyIHdoZW4gdGhlCisgKiAgZGF0YSBiaW5kaW5nIGlzIG9mIHR5cGUgPGNvZGU+ZHJhd2FibGU8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tdHJhbnNmb3JtIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBzaW1wbGUgdHJhbnNmb3JtIHRoYXQgb2NjdXJzIGVpdGhlciBieSBjYWxsaW5nIGEgc3BlY2lmaWVkIGNsYXNzIG9yIGJ5IHBlcmZvcm1pbmcKKyAqIHNpbXBsZSB0ZXh0IHN1YnN0aXR1dGlvbi4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPjogVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIGlzCisgKiAgYSBzdHJpbmcgY29udGFpbmluZyBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCB3aXRoIGN1cmx5IGJyYWNlcyB7IGFuZCB9LiBEdXJpbmcgdGhlCisgKiAgdHJhbnNmb3JtYXRpb24gZWFjaCBjb2x1bW4gbmFtZSBpcyByZXBsYWNlZCBieSBpdHMgdmFsdWUuIEFsbCBjb2x1bW5zIG11c3QgaGF2ZSBiZWVuCisgKiAgc2VsZWN0ZWQgaW4gdGhlIHF1ZXJ5LiBBbiBleGFtcGxlIG9mIGV4cHJlc3Npb24gaXMgPGNvZGU+IkZpcnN0IG5hbWU6IHtmaXJzdF9uYW1lfSwKKyAqICBsYXN0IG5hbWU6IHtsYXN0X25hbWV9IjwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeQorICogIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpZ25vcmVkIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPgorICogIGlzIHNwZWNpZmllZDwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPjogQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiAgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufS4gQ3VzdG9tCisgKiAgdHJhbnNmb3JtYXRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbgorICogIGFuIGFwcCB3aWRnZXQgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGlmIDxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+IGlzCisgKiAgbm90IHNwZWNpZmllZDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGN1cnNvciBhZGFwdGVyIHRoYXQgcXVlcmllcyBhbGwgdGhlIGNvbnRhY3RzIHdpdGgKKyAqIGEgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBjb250YWN0cyBjb250ZW50IHByb3ZpZGVyLiBFYWNoIGNvbnRhY3QgaXMgZGlzcGxheWVkIHdpdGgKKyAqIGl0cyBkaXNwbGF5IG5hbWUsIGl0cyBmYXZvcml0ZSBzdGF0dXMgYW5kIGl0cyBwaG90by4gVG8gZGlzcGxheSBwaG90b3MsIGEgY3VzdG9tIGRhdGEKKyAqIGJpbmRlciBpcyBkZWNsYXJlZDo8L3A+CisgKiAKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtjdXJzb3ItYWRhcHRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAqICAgICBhbmRyb2lkOnNlbGVjdGlvbj0iaGFzX3Bob25lX251bWJlcj0xIgorICogICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2NvbnRhY3RfaXRlbSImZ3Q7CisgKgorICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iZGlzcGxheV9uYW1lIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIgYW5kcm9pZDphcz0ic3RyaW5nIiAvJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0ic3RhcnJlZCIgYW5kcm9pZDp0bz0iQGlkL3N0YXIiIGFuZHJvaWQ6YXM9ImRyYXdhYmxlIiZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMCIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vZmYiIC8mZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjEiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb24iIC8mZ3Q7CisgKiAgICAgJmx0Oy9iaW5kJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iX2lkIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIKKyAqICAgICAgICAgICAgICBhbmRyb2lkOmFzPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5hZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8mZ3Q7CisgKgorICogJmx0Oy9jdXJzb3ItYWRhcHRlciZndDsKKyAqIDwvcHJlPgorICogCisgKiA8aDM+UmVsYXRlZCBBUElzPC9oMz4KKyAqIDx1bD4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcgorICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfbGF5b3V0IAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NvcnRPcmRlciAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfdXJpIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uIAorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NSZWZlcmVuY2UifSkKK3B1YmxpYyBjbGFzcyBBZGFwdGVycyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SID0gImN1cnNvci1hZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIGJpbmQgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9IGNvbHVtbiB0byBhIFZpZXcuIFRoaXMKKyAgICAgKiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBiaW5kaW5ncyBmb3IgZGF0YSB0eXBlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyc30uPC9wPgorICAgICAqIAorICAgICAqIDxwPkEgYmluZGVyIGlzIHByb3ZpZGVkIHdpdGggYSBjdXJzb3IgdHJhbnNmb3JtYXRpb24gd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdXNlZAorICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGN1cnNvci4gVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGd1YXJhbnRlZWQKKyAgICAgKiB0byBuZXZlciBiZSBudWxsIHNvIGl0J3MgYWx3YXlzIHNhZmUgdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgYmluZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIENvbnRleHQgYnV0IGNhbiBiZSByZS11c2VkIHdpdGggbXVsdGlwbGUgY3Vyc29ycy4KKyAgICAgKiBBcyBzdWNoLCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugbm8gYXNzdW1wdGlvbiBhYm91dCB0aGUgQ3Vyc29yIGluIHVzZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5WaWV3IAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JCaW5kZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIG5ldmVyCisgICAgICAgICAqIG51bGwgYW5kIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgdG8gdGhlIEN1cnNvciBkYXRhIGR1cmluZyB0aGUKKyAgICAgICAgICoge0BsaW5rICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KX0gb3BlcmF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1UcmFuc2Zvcm1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgYmluZGVyLjwvcD4gCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBUaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzCisgICAgICAgICAqICAgICAgICB0cmFuc2Zvcm1hdGlvbiBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIGJ5IHRoZSBiaW5kZXIgYW5kIGlzIGd1YXJhbnRlZWQKKyAgICAgICAgICogICAgICAgIHRvIG5vdCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvckJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5CaW5kcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gdG8gdGhlIHN1cHBsaWVkIFZpZXcuIFRoZSBiaW5kaW5nIG9wZXJhdGlvbgorICAgICAgICAgKiBjYW4gcXVlcnkgb3RoZXIgQ3Vyc29yIGNvbHVtbnMgYXMgbmVlZGVkLiBEdXJpbmcgdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCB2YWx1ZXMKKyAgICAgICAgICogcmV0cmlldmVkIGZyb20gdGhlIEN1cnNvciBtYXkgb3IgbWF5IG5vdCBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0aGlzIGJpbmRlcidzCisgICAgICAgICAqIGN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBiaW5kIGRhdGEgZnJvbS4KKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIGN1cnNvciB3aGVyZSB0aGUgZGF0YSB0byBiaW5kIHJlc2lkZXMuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNtVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29sdW1uIHdhcyBzdWNjZXNzZnVsbHkgYm91bmQgdG8gdGhlIFZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIHRyYW5zZm9ybSBkYXRhIGNvbWluZyBvdXQgb2YgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9CisgICAgICogYmVmb3JlIGl0IGlzIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS48L3A+CisgICAgICogCisgICAgICogPHA+VHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIHRvIHRyYW5zZm9ybSB0ZXh0LWJhc2VkIGRhdGEgKGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nKSwKKyAgICAgKiBvciB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCisgICAgICogdG8gZ2VuZXJhdGUgcmVzb3VyY2UgaWRlbnRpZmllcnMuPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvclRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSBTdHJpbmcuIFRoZSB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBjYW4gc2ltcGx5IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uIGFzIGEgU3RyaW5nICh0aGlzIGlzIGtub3duCisgICAgICAgICAqIGFzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbikgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudC4gRm9yIGluc3RhbmNlLAorICAgICAgICAgKiBhIHRyYW5zZm9ybWF0aW9uIGNhbiBwZXJmb3JtIHRleHQgc3Vic3RpdHV0aW9ucyBvciBjb25jYXRlbmF0ZSBvdGhlcgorICAgICAgICAgKiBjb2x1bW5zIHdpdGggdGhlIHNwZWNpZmllZCBjb2x1bW4uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgb2YgdGhlIGNvbHVtbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW50ZXJwcmV0cyB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uCisgICAgICAgICAqIGFzIGFuIGludGVnZXIuPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRJbnQoY29sdW1uSW5kZXgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzdXBwbGllZCBVUkkuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICogY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5zZXRVcmkodXJpKTsKKyAgICAgICAgfQorICAgICAgICBhZGFwdGVyLmxvYWQoKTsKKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBjdXJzb3IuCisgICAgICogWW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHN1cHBsaWVkIGN1cnNvci48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIFhNTCBkZWZpbml0aW9uIG9mCisgICAgICogdGhlIGFkYXB0ZXIgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGFkYXB0ZXIKKyAgICAgKiB0eXBlcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIGxvYWRlZCBhZGFwdGVyIGlzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogYW5kIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sCisgICAgICogdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLAorICAgICAqIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogIAorICAgICAqIEByZXR1cm4gQW4gYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZpbmFsIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgbnVsbCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWFuYWdlZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICgoTWFuYWdlZEFkYXB0ZXIpIGFkYXB0ZXIpLmxvYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiBhZGFwdGVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBvcHRpb25hbCBhc3NlcnROYW1lIGNhbgorICAgICAqIGJlIHVzZWQgdG8gZXhpdCBlYXJseSBpZiB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBYTUwgcmVzb3VyY2UgaXMgbm90IG9mIHRoZQorICAgICAqIGV4cGVjdGVkIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50IGRlZmluaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBhc3NlcnROYW1lIFRoZSBtYW5kYXRvcnkgbmFtZSBvZiB0aGUgYWRhcHRlciBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqICAgICAgICBJZ25vcmVkIGlmIG51bGwuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgYXNzZXJ0TmFtZSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRnJvbVhtbChjb250ZXh0LCBwYXJzZXIsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpLAorICAgICAgICAgICAgICAgICAgICBpZCwgcGFyYW1ldGVycywgYXNzZXJ0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYWRhcHRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFhNTCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCisgICAgICogZm9yIGNob29zaW5nIHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyIHRvIGNyZWF0ZSBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiBYTUwgcGFyc2VyLgorICAgICAqIAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYKKyAgICAgKiA8Y29kZT5hc3NlcnROYW1lPC9jb2RlPiBpcyBub3QgbnVsbCBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwKKyAgICAgKiBkb2N1bWVudC4gCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgY3JlYXRlQWRhcHRlckZyb21YbWwoQ29udGV4dCBjLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgU3RyaW5nIGFzc2VydE5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChhc3NlcnROYW1lICE9IG51bGwgJiYgIWFzc2VydE5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpICsgIiBtdXN0IGJlIGEgPCIgKyBuYW1lICsgIiAvPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWRhcHRlciA9IGNyZWF0ZUN1cnNvckFkYXB0ZXIoYywgcGFyc2VyLCBhdHRycywgaWQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkYXB0ZXIgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluICIgKyBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sQ3Vyc29yQWRhcHRlciB1c2luZyBhbiBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFhtbEN1cnNvckFkYXB0ZXIgY3JlYXRlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCkucGFyc2UocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VyIHRoYXQgY2FuIGdlbmVyYXRlIFhtbEN1cnNvckFkYXB0ZXIgaW5zdGFuY2VzLiBUaGlzIHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBoYW5kbGluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkIG5vZGVzIGZvciBhICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0Oy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0JJTkQgPSAiYmluZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9TRUxFQ1QgPSAic2VsZWN0IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1NUUklORyA9ICJzdHJpbmciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UgPSAiaW1hZ2UiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfVEFHID0gInRhZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkgPSAiaW1hZ2UtdXJpIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFID0gImRyYXdhYmxlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX01BUCA9ICJtYXAiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNID0gInRyYW5zZm9ybSI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFhtbFB1bGxQYXJzZXIgbVBhcnNlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVTZXQgbUF0dHJzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRnJvbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbVRvOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1JZGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjOworICAgICAgICAgICAgbVBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgICAgIG1BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbUlkID0gaWQ7CisKKyAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+KCk7CisgICAgICAgICAgICBtRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgbVRvID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgbUlkZW50aXR5ID0gbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24obUNvbnRleHQpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXIgcGFyc2UoT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLCBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXIpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3VyaSk7CisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NlbGVjdGlvbik7CisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NvcnRPcmRlcik7CisgICAgICAgICAgICBpbnQgbGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9sYXlvdXQsIDApOworICAgICAgICAgICAgaWYgKGxheW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxheW91dCBzcGVjaWZpZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0JJTkQuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQmluZFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfU0VMRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVNlbGVjdFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBmcm9tQXJyYXkgPSBtRnJvbS50b0FycmF5KG5ldyBTdHJpbmdbbUZyb20uc2l6ZSgpXSk7CisgICAgICAgICAgICBpbnRbXSB0b0FycmF5ID0gbmV3IGludFttVG8uc2l6ZSgpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9BcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRvQXJyYXlbaV0gPSBtVG8uZ2V0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25BcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3NbaV0gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyKG1Db250ZXh0LCBsYXlvdXQsIHVyaSwgZnJvbUFycmF5LCB0b0FycmF5LCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlciwgbUJpbmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0VGFnKCkgeworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gbVJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHNlbGVjdCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdjb2x1bW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQoVmlldy5OT19JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VCaW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSk7CisgICAgICAgICAgICBpZiAoZnJvbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0b05hbWUgPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvLCAwKTsKKyAgICAgICAgICAgIGlmICh0b05hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAndG8nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXNUeXBlID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzKTsKKyAgICAgICAgICAgIGlmIChhc1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYW4gJ2FzJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQodG9OYW1lKTsKKyAgICAgICAgICAgIG1CaW5kZXJzLnB1dChmcm9tTmFtZSwgZmluZEJpbmRlcihhc1R5cGUpKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBmaW5kQmluZGVyKFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyOworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG1JZGVudGl0eTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGU7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0RyYXdhYmxlID0gQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUuZXF1YWxzKHR5cGUpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICB3aGlsZSAoKCh0YWdUeXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHRhZ1R5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gZmluZFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9NQVAuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHRyYW5zZm9ybWF0aW9uIGluc3RhbmNlb2YgTWFwVHJhbnNmb3JtYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IG5ldyBNYXBUcmFuc2Zvcm1hdGlvbihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5kTWFwKCgoTWFwVHJhbnNmb3JtYXRpb24pIHRyYW5zZm9ybWF0aW9uKSwgaXNEcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGFnIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfVEFHLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFnQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlVXJpQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHJhd2FibGVCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGVyKHR5cGUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yQmluZGVyIGNyZWF0ZUJpbmRlcihTdHJpbmcgdHlwZSwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhc3MgPSBDbGFzcy5mb3JOYW1lKHR5cGUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChDdXJzb3JCaW5kZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEN1cnNvckJpbmRlcikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRNYXAoTWFwVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24sIGJvb2xlYW4gZHJhd2FibGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb20gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbVZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkU3RyaW5nTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0byA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFJlc291cmNlTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBmaW5kVHJhbnNmb3JtYXRpb24oKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzKTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdXJzb3JUcmFuc2Zvcm1hdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjID0ga2xhcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvbnRleHQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSAoQ3Vyc29yVHJhbnNmb3JtYXRpb24pIGMubmV3SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHRyYW5zZm9ybSBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgbXVzdCBoYXZlIGEgJ3dpdGhDbGFzcycgb3IgIiArCisgICAgICAgICAgICAgICAgICAgICInd2l0aEV4cHJlc3Npb24nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24obUNvbnRleHQsIGV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgYWRhcHRlcnMgdGhhdCByZXF1aXJlIHRvIGJlIGxvYWRlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIsIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYSBDdXJzb3IgYWRhcHRlciBkZWZpbmVkIGluIFhNTC4gVGhpcyBjbGFzcyBpcyBhIHRoaW4gd3JhcHBlcgorICAgICAqIG9mIGEgU2ltcGxlQ3Vyc29yQWRhcHRlci4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGUgYWJpbGl0eSB0byBoYW5kbGUgQ3Vyc29yQmluZGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyIGV4dGVuZHMgU2ltcGxlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNvcnRPcmRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JCaW5kZXJbXSBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBBc3luY1Rhc2s8Vm9pZCxWb2lkLEN1cnNvcj4gbUxvYWRUYXNrOworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgbGF5b3V0LCBTdHJpbmcgdXJpLCBTdHJpbmdbXSBmcm9tLCBpbnRbXSB0bywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IGJpbmRlcnMpIHsKKworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbGF5b3V0LCBudWxsLCBmcm9tLCB0byk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgICAgICAgICBtQ29sdW1ucyA9IG5ldyBTdHJpbmdbZnJvbS5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbWFuZGF0b3J5IGluIEN1cnNvckFkYXB0ZXIKKyAgICAgICAgICAgIG1Db2x1bW5zWzBdID0gIl9pZCI7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZyb20sIDAsIG1Db2x1bW5zLCAxLCBmcm9tLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEN1cnNvckJpbmRlciBiYXNpYyA9IG5ldyBTdHJpbmdCaW5kZXIoY29udGV4dCwgbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24oY29udGV4dCkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZnJvbS5sZW5ndGg7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBDdXJzb3JCaW5kZXJbY291bnRdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmluZGVyID0gYmluZGVycy5nZXQoZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSBiaW5kZXIgPSBiYXNpYzsKKyAgICAgICAgICAgICAgICBtQmluZGVyc1tpXSA9IGJpbmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVRvLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGZyb20gPSBtRnJvbTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHRvID0gbVRvOworICAgICAgICAgICAgZmluYWwgQ3Vyc29yQmluZGVyW10gYmluZGVycyA9IG1CaW5kZXJzOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHYgPSB2aWV3LmZpbmRWaWV3QnlJZCh0b1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kZXJzW2ldLmJpbmQodiwgY3Vyc29yLCBmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG5ldyBRdWVyeVRhc2soKS5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZUN1cnNvcihDdXJzb3IgYykgeworICAgICAgICAgICAgaWYgKG1Mb2FkVGFzayAhPSBudWxsICYmIG1Mb2FkVGFzay5nZXRTdGF0dXMoKSAhPSBRdWVyeVRhc2suU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgUXVlcnlUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEN1cnNvcj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQWN0aXZpdHkpIG1Db250ZXh0KS5tYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3JBZGFwdGVyLnN1cGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCByZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFzIGEgU3RyaW5nLAorICAgICAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgbWFuaXB1bGF0aW9uLiBUaGlzIGlzIHVzZWQgd2hlbiBubyB0cmFuc2Zvcm1hdGlvbiBpcyBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHVibGljIElkZW50aXR5VHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4cHJlc3Npb24gdHJhbnNmb3JtYXRpb24gaXMgYSBzaW1wbGUgdGVtcGxhdGUgYmFzZWQgcmVwbGFjZW1lbnQgdXRpbGl0eS4KKyAgICAgKiBJbiBhbiBleHByZXNzaW9uLCBlYWNoIHNlZ21lbnQgb2YgdGhlIGZvcm0gPGNvZGU+eyhbXn1dKyl9PC9jb2RlPiBpcyByZXBsYWNlZAorICAgICAqIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gb2YgbmFtZSAkMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbk5vZGUgbUZpcnN0Tm9kZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKCIiKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICBwYXJzZShleHByZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICBpbnQgc2VnbWVudFN0YXJ0OworICAgICAgICAgICAgaW50IGNvdW50ID0gZXhwcmVzc2lvbi5sZW5ndGgoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYSBjb2x1bW4gbmFtZSBzZWdtZW50CisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIGJ1dCB0aGUgZXhwcmVzc2lvbiBkaWRuJ3QgY2xvc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdHJhbnNmb3JtIGV4cHJlc3Npb24gY29udGFpbnMgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1jbG9zZWQgY29sdW1uIG5hbWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbHVtbkV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgaWYgd2UndmUgcmVhY2hlZCBhIGNvbHVtbiBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbUJ1aWxkZXI7CisgICAgICAgICAgICBidWlsZGVyLmRlbGV0ZSgwLCBidWlsZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBub2RlCisgICAgICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLm5leHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChub2RlLmFzU3RyaW5nKGN1cnNvcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uTm9kZSBuZXh0OworCisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29uc3RhbnQ7CisKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb2x1bW5FeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db2x1bW5OYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBDdXJzb3IgbVNpZ25hdHVyZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1Db2x1bW5JbmRleCA9IC0xOworCisgICAgICAgICAgICBDb2x1bW5FeHByZXNzaW9uTm9kZShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgICAgIG1Db2x1bW5OYW1lID0gY29sdW1uTmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG1TaWduYXR1cmUgfHwgbUNvbHVtbkluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChtQ29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYXR1cmUgPSBjdXJzb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcobUNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWFwIHRyYW5zZm9ybWF0aW9uIG9mZmVycyBhIHNpbXBsZSBtYXBwaW5nIGJldHdlZW4gc3BlY2lmaWVkIFN0cmluZyB2YWx1ZXMKKyAgICAgKiB0byBTdHJpbmdzIG9yIGludGVnZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1TdHJpbmdNYXBwaW5nczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVJlc291cmNlTWFwcGluZ3M7CisKKyAgICAgICAgcHVibGljIE1hcFRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRTdHJpbmdNYXBwaW5nKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRSZXNvdXJjZU1hcHBpbmcoU3RyaW5nIGZyb20sIGludCB0bykgeworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRyYW5zZm9ybWVkID0gbVN0cmluZ01hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IHZhbHVlIDogdHJhbnNmb3JtZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRyYW5zZm9ybWVkID0gbVJlc291cmNlTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSA6IHRyYW5zZm9ybWVkOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgU3RyaW5nIHRvIGEgVGV4dFZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFN0cmluZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgYmxvYiB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlQml0bWFwKEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFRhZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgdmlldy5zZXRUYWcodGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIFVSSSB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VVcmlCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VVcmlCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlVVJJKFVyaS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgZHJhd2FibGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhd2FibGVCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgRHJhd2FibGVCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybVRvUmVzb3VyY2UoY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IDApIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKaW5kZXggZTE1YTUyMC4uMzRhZWY5OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKQEAgLTI5LDEzICsyOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIApAQCAtOTAsNDUgKzg5LDIxIEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvQ29tcGxldGVUZXh0VmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9WSUVXX0lEID0gMHgxNzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKLSAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAotICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOwotCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OwogICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CiAKICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgRmlsdGVyIG1GaWx0ZXI7CiAgICAgcHJpdmF0ZSBpbnQgbVRocmVzaG9sZDsKIAotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOwotICAgIHByaXZhdGUgRHJvcERvd25MaXN0VmlldyBtRHJvcERvd25MaXN0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOwogICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkFuY2hvcklkOwotICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OyAgLy8gdmlldyBpcyByZXRyaWV2ZWQgbGF6aWx5IGZyb20gaWQgb25jZSBuZWVkZWQKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0KLSAgICBwcml2YXRlIERyYXdhYmxlIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQ7CiAKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbUl0ZW1DbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgbURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAgICAgcHJpdmF0ZSBib29sZWFuIG1PcGVuQmVmb3JlOwpAQCAtMTM3LDEwICsxMTIsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja0NvbXBsZXRpb247CiAKLSAgICBwcml2YXRlIExpc3RTZWxlY3RvckhpZGVyIG1IaWRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7Ci0KICAgICBwcml2YXRlIFBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lciBtUGFzc1Rocm91Z2hDbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgbU9ic2VydmVyOwogCkBAIC0xNTUsOSArMTI2LDEwIEBACiAgICAgcHVibGljIEF1dG9Db21wbGV0ZVRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAotICAgICAgICBtUG9wdXAgPSBuZXcgUG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUpOwogICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpOworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0UG9zaXRpb24oTGlzdFBvcHVwV2luZG93LlBPU0lUSU9OX1BST01QVF9CRUxPVyk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKQEAgLTE2NiwxNCArMTM4LDExIEBACiAgICAgICAgIG1UaHJlc2hvbGQgPSBhLmdldEludCgKICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uVGhyZXNob2xkLCAyKTsKIAotICAgICAgICBtSGludFRleHQgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpOwotCi0gICAgICAgIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgPSBhLmdldERyYXdhYmxlKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IpOwotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IChpbnQpCi0gICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMC4wZik7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMC4wZik7CisgICAgICAgIG1Qb3B1cC5zZXRMaXN0U2VsZWN0b3IoYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKSk7CisgICAgICAgIG1Qb3B1cC5zZXRWZXJ0aWNhbE9mZnNldCgoaW50KQorICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpKTsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpKTsKICAgICAgICAgCiAgICAgICAgIC8vIEdldCB0aGUgYW5jaG9yJ3MgaWQgbm93LCBidXQgdGhlIHZpZXcgd29uJ3QgYmUgcmVhZHksIHNvIHdhaXQgdG8gYWN0dWFsbHkgZ2V0IHRoZQogICAgICAgICAvLyB2aWV3IGFuZCBzdG9yZSBpdCBpbiBtRHJvcERvd25BbmNob3JWaWV3IGxhemlseSBpbiBnZXREcm9wRG93bkFuY2hvclZpZXcgbGF0ZXIuCkBAIC0xODQsMTMgKzE1MywxOCBAQAogICAgICAgICAKICAgICAgICAgLy8gRm9yIGRyb3Bkb3duIHdpZHRoLCB0aGUgZGV2ZWxvcGVyIGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgd2lkdGgsIG9yIE1BVENIX1BBUkVOVAogICAgICAgICAvLyAoZm9yIGZ1bGwgc2NyZWVuIHdpZHRoKSBvciBXUkFQX0NPTlRFTlQgKHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgYW5jaG9yZWQgdmlldykuCi0gICAgICAgIG1Ecm9wRG93bldpZHRoID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwogCiAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnRWaWV3LAogICAgICAgICAgICAgICAgIFIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9oaW50KTsKKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCkpOworICAgICAgICBzZXRDb21wbGV0aW9uSGludChhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpKTsKIAogICAgICAgICAvLyBBbHdheXMgdHVybiBvbiB0aGUgYXV0byBjb21wbGV0ZSBpbnB1dCB0eXBlIGZsYWcsIHNpbmNlIGl0CiAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGlzIHdpZGdldCB3aXRob3V0IGl0LgpAQCAtMjM4LDYgKzIxMiwyMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXRpb25IaW50KENoYXJTZXF1ZW5jZSBoaW50KSB7CiAgICAgICAgIG1IaW50VGV4dCA9IGhpbnQ7CisgICAgICAgIGlmIChoaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3ID0gaGludFZpZXc7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldFByb21wdFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KG51bGwpOworICAgICAgICAgICAgbUhpbnRWaWV3ID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI1MCw3ICsyMzgsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duV2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRXaWR0aCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI2Myw3ICsyNTEsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBtRHJvcERvd25XaWR0aCA9IHdpZHRoOworICAgICAgICBtUG9wdXAuc2V0V2lkdGgod2lkdGgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc3LDcgKzI2NSw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhlaWdodCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjkxLDcgKzI3OSw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkhlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTMxNiw3ICszMDQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQW5jaG9yKGludCBpZCkgewogICAgICAgICBtRHJvcERvd25BbmNob3JJZCA9IGlkOwotICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gbnVsbDsKKyAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcobnVsbCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzU4LDcgKzM0Niw3IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25WZXJ0aWNhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNjcsNyArMzU1LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duVmVydGljYWxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRWZXJ0aWNhbE9mZnNldCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM3Niw3ICszNjQsNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGhvcml6b250YWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODUsNyArMzczLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIb3Jpem9udGFsT2Zmc2V0KCk7CiAgICAgfQogCiAgICAgIC8qKgpAQCAtNDIyLDcgKzQxMCw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM5LDcgKzQyNyw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgICAgICBtUG9wdXAuc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGRyb3BEb3duQWx3YXlzVmlzaWJsZSk7CiAgICAgfQogICAgCiAgICAgLyoqCkBAIC02MDYsMTUgKzU5NCwxMyBAQAogICAgICAgICAgICAgbUZpbHRlciA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzUG9wdXBTaG93aW5nKCkKLSAgICAgICAgICAgICAgICAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CiAgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKQEAgLTYzMywxOCArNjE5LDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZCA9IG1Ecm9wRG93bkxpc3Qub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAotICAgICAgICAgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRyb3AgZG93biBhcyBpdHMgY29udGVudAotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtUG9wdXAub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKQEAgLTY1Miw4NyArNjM2LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIHdoZW4gdGhlIGRyb3AgZG93biBpcyBzaG93biwgd2UgZHJpdmUgaXQgZGlyZWN0bHkKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgotICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0Ci0gICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAotICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKLSAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KLSAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcwotICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAotICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIHBhc3NpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHRleHQgdmlldyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBib3R0b20sIHdlIGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gYXZvaWQgZ29pbmcgdG8gdGhlIG5leHQgZm9jdXNhYmxlIHdpZGdldAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckluZGV4ID09IGxhc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW5kZXggPT0gZmlyc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Qb3B1cC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBzd2l0Y2goa2V5Q29kZSkgewogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKICAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwpAQCAtNzQzLDcgKzY1MSw3IEBACiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CiAgICAgICAgIG1MYXN0S2V5Q29kZSA9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKIAotICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICAgICAgfQogCkBAIC04MDQsMTEgKzcxMiwxMiBAQAogICAgICAgICBpZiAoZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1GaWx0ZXJpbmcoZ2V0VGV4dCgpLCBtTGFzdEtleUNvZGUpOworICAgICAgICAgICAgICAgIGJ1aWxkSW1lQ29tcGxldGlvbnMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRyb3AgZG93biBpcyBhdXRvbWF0aWNhbGx5IGRpc21pc3NlZCB3aGVuIGVub3VnaCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAvLyBhcmUgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0IHZpZXcKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgZGlzbWlzc0Ryb3BEb3duKCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtRmlsdGVyLmZpbHRlcihudWxsKTsKICAgICAgICAgICAgIH0KQEAgLTg0MSwxMyArNzUwLDcgQEAKICAgICAgKiBpdCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIGxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgbGlzdC5oaWRlU2VsZWN0b3IoKTsKLSAgICAgICAgICAgIGxpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5jbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC04NTYsMTEgKzc1OSw3IEBACiAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3RvciB0by4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAvLyBMaXN0Vmlldy5zZXRTZWxlY3Rpb24oKSB3aWxsIGNhbGwgcmVxdWVzdExheW91dCgpCi0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzQsMTAgKzc3Myw3IEBACiAgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaXN0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTEsMTMgKzgwNyw3IEBACiAgICAgICAgICAgICByZXBsYWNlVGV4dChjb21wbGV0aW9uLmdldFRleHQoKSk7CiAgICAgICAgICAgICBtQmxvY2tDb21wbGV0aW9uID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBWaWV3IGhlcmUsIHNvIHdlIHdpbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIHN1cHBseSBudWxsLiAgSG9wZWZ1bGx5IG5vIGV4aXN0aW5nIGFwcHMgY3Jhc2guLi4KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgbnVsbCwgY29tcGxldGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cC5wZXJmb3JtSXRlbUNsaWNrKGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyNSw3ICs4MTUsNyBAQAogICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkSXRlbTsKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbUFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CiAgICAgICAgICAgICB9CkBAIC05MzksMTggKzgyOSwxOCBAQAogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOyAgICAgICAgICAgIAogCiAgICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RQb3B1cFdpbmRvdyBsaXN0ID0gbVBvcHVwOwogCiAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmlldyA9PSBudWxsIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPSBsaXN0LmdldFNlbGVjdGVkVmlldygpOwogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaWQgPSBsaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBzZWxlY3RlZFZpZXcsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QuZ2V0TGlzdFZpZXcoKSwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAobURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDAwLDcgKzg5MCw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvbkZpbHRlckNvbXBsZXRlKGludCBjb3VudCkgewogICAgICAgICB1cGRhdGVEcm9wRG93bkZvckZpbHRlcihjb3VudCk7Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoaW50IGNvdW50KSB7CkBAIC0xMDE0LDExICs5MDMsMTIgQEAKICAgICAgICAgICogdG8gZmlsdGVyLgogICAgICAgICAgKi8KIAotICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBtRHJvcERvd25BbHdheXNWaXNpYmxlKSAmJiBlbm91Z2hUb0ZpbHRlcigpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlID0gbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCk7CisgICAgICAgIGlmICgoY291bnQgPiAwIHx8IGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkgJiYgaGFzV2luZG93Rm9jdXMoKSkgewogICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIWRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDI2LDcgKzkxNiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgewogICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cyAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAzNiw3ICs5MjYsNyBAQAogICAgICAgICBzdXBlci5vbkRpc3BsYXlIaW50KGhpbnQpOwogICAgICAgICBzd2l0Y2ggKGhpbnQpIHsKICAgICAgICAgICAgIGNhc2UgSU5WSVNJQkxFOgotICAgICAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGlmICghbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA1MCw3ICs5NDAsNyBAQAogICAgICAgICBpZiAoIWZvY3VzZWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFmb2N1c2VkICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghZm9jdXNlZCAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA3NSw4ICs5NjUsNiBAQAogICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICBtUG9wdXAuZGlzbWlzcygpOwotICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7Ci0gICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA4OSwxOCArOTc3LDYgQEAKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Vc2VkIGZvciBsYXp5IGluc3RhbnRpYXRpb24gb2YgdGhlIGFuY2hvciB2aWV3IGZyb20gdGhlIGlkIHdlIGhhdmUuIElmIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBpZCBpcyBOT19JRCBvciB3ZSBjYW4ndCBmaW5kIGEgdmlldyBmb3IgdGhlIGdpdmVuIGlkLCB3ZSByZXR1cm4gdGhpcyBUZXh0VmlldyBhcwotICAgICAqIHRoZSBkZWZhdWx0IGFuY2hvcmluZyBwb2ludC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldERyb3BEb3duQW5jaG9yVmlldygpIHsKLSAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvclZpZXcgPT0gbnVsbCAmJiBtRHJvcERvd25BbmNob3JJZCAhPSBWaWV3Lk5PX0lEKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gZ2V0Um9vdFZpZXcoKS5maW5kVmlld0J5SWQobURyb3BEb3duQW5jaG9ySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgPyB0aGlzIDogbURyb3BEb3duQW5jaG9yVmlldzsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBJc3N1ZXMgYSBydW5uYWJsZSB0byBzaG93IHRoZSBkcm9wZG93biBhcyBzb29uIGFzIHBvc3NpYmxlLgpAQCAtMTEwOCw3ICs5ODQsNyBAQAogICAgICAqIEBoaWRlIGludGVybmFsIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd25BZnRlckxheW91dCgpIHsKLSAgICAgICAgcG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgICAgICBtUG9wdXAucG9zdFNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMTE5LDcgKzk5NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5zdXJlSW1lVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZSh2aXNpYmxlCi0gICAgICAgICAgICAgICAgPyBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOworICAgICAgICAgICAgICAgID8gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQgOiBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwogICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICB9CiAKQEAgLTExMjcsODkgKzEwMDMsMjEgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgaGVyZSBhbmQgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogPHA+RGlzcGxheXMgdGhlIGRyb3AgZG93biBvbiBzY3JlZW4uPC9wPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dEcm9wRG93bigpIHsKLSAgICAgICAgaW50IGhlaWdodCA9IGJ1aWxkRHJvcERvd24oKTsKLQotICAgICAgICBpbnQgd2lkdGhTcGVjID0gMDsKLSAgICAgICAgaW50IGhlaWdodFNwZWMgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gbm9JbnB1dE1ldGhvZCA9IGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKTsKLQotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCB0byBQb3B1cFdpbmRvdydzIHVwZGF0ZSBtZXRob2QgYmVsb3cgY2FuIGFjY2VwdCAtMSBmb3IgYW55Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IGRvIG5vdCB3YW50IHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICBpZiAobVBvcHVwLmdldEFuY2hvclZpZXcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KHRoaXMpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLQotICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCi0gICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOwotICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobmV3IFBvcHVwVG91Y2hJbnRlcmNlcHRvcigpKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zaG93QXNEcm9wRG93bihnZXREcm9wRG93bkFuY2hvclZpZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHBvc3QobUhpZGVTZWxlY3Rvcik7CiAgICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMjIwLDE5ICsxMDI4LDEwIEBACiAgICAgICogQGhpZGUgdXNlZCBvbmx5IGJ5IFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKLSAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgICAgIG1Qb3B1cC5zZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChmb3JjZUlnbm9yZU91dHNpZGVUb3VjaCk7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCi0gICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgewotICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OwotICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKLQorICAgIAorICAgIHByaXZhdGUgdm9pZCBidWlsZEltZUNvbXBsZXRpb25zKCkgewogICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7CiAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CkBAIC0xMjYwLDEzNSArMTA1OSw2IEBACiAgICAgICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBjb21wbGV0aW9ucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG1IaWRlU2VsZWN0b3IgPSBuZXcgTGlzdFNlbGVjdG9ySGlkZXIoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAotICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93Ci0gICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAotICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldERyb3BEb3duQW5jaG9yVmlldygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsICYmIHZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobmV3IFBvcHVwU2Nyb2xsTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSXRlbVNlbGVjdGVkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtSXRlbVNlbGVjdGVkTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkcm9wRG93blZpZXcgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICBWaWV3IGhpbnRWaWV3ID0gZ2V0SGludFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoaGludFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGFuIGhpbnQgaGFzIGJlZW4gc3BlY2lmaWVkLCB3ZSBhY2NvbW9kYXRlIG1vcmUgc3BhY2UgZm9yIGl0IGFuZAotICAgICAgICAgICAgICAgIC8vIGFkZCBhIHRleHQgdmlldyBpbiB0aGUgZHJvcCBkb3duIG1lbnUsIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgaGludENvbnRhaW5lciA9IG5ldyBMaW5lYXJMYXlvdXQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMCwgMS4wZgotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGRyb3BEb3duVmlldywgaGludFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKLQotICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIGhpbnQncyBoZWlnaHQgdG8gZmluZCBob3cgbXVjaCBtb3JlIHZlcnRpY2FsIHNwYWNlCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdG8gdGhlIGRyb3AgZG93bidzIGhlaWdodAotICAgICAgICAgICAgICAgIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2lkdGgoKSwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0KLSAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBkcm9wRG93blZpZXcuZmluZFZpZXdCeUlkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IHZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWF4IGhlaWdodCBhdmFpbGFibGUgb24gdGhlIHNjcmVlbiBmb3IgYSBwb3B1cC4KLSAgICAgICAgYm9vbGVhbiBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwotICAgICAgICBmaW5hbCBpbnQgbWF4SGVpZ2h0ID0gbVBvcHVwLmdldE1heEF2YWlsYWJsZUhlaWdodCgKLSAgICAgICAgICAgICAgICBnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKLQotICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAotICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKLSAgICAgICAgaW50IHBhZGRpbmcgPSAwOwotICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7Ci0gICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKLSAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKLSAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKLSAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBnZXRIaW50VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG1IaW50VGV4dCAhPSBudWxsICYmIG1IaW50VGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmluZmxhdGUoCi0gICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldElkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICByZXR1cm4gaGludFZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0MCw0NyArMTExMCw2IEBACiAgICAgICAgIHJldHVybiBtRmlsdGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBPblRvdWNoTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoKFZpZXcgdiwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gJiYKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAotICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24odiwgcG9zaXRpb24sIGlkKTsKQEAgLTE0ODgsMTIzICsxMTE3LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD5XcmFwcGVyIGNsYXNzIGZvciBhIExpc3RWaWV3LiBUaGlzIHdyYXBwZXIgaGlqYWNrcyB0aGUgZm9jdXMgdG8KLSAgICAgKiBtYWtlIHN1cmUgdGhlIGxpc3QgdXNlcyB0aGUgYXBwcm9wcmlhdGUgZHJhd2FibGVzIGFuZCBzdGF0ZXMgd2hlbgotICAgICAqIGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aGluIGEgZHJvcCBkb3duLiBUaGUgZm9jdXMgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgICAgKiBwYXNzZWQgdG8gdGhlIGRyb3AgZG93bjsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgICAgICAvKgotICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSB0b3VjaCBtb2RlIGlzc3VlLgotICAgICAgICAgKgotICAgICAgICAgKiBUb3VjaCBtb2RlIGlzIHByb3BhZ2F0ZWQgbGF6aWx5IHRvIHdpbmRvd3MuIFRoaXMgY2F1c2VzIHByb2JsZW1zIGluCi0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86Ci0gICAgICAgICAqIC0gVHlwZSBzb21ldGhpbmcgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3IGFuZCBnZXQgc29tZSByZXN1bHRzCi0gICAgICAgICAqIC0gTW92ZSBkb3duIHdpdGggdGhlIGQtcGFkIHRvIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0Ci0gICAgICAgICAqIC0gTW92ZSB1cCB3aXRoIHRoZSBkLXBhZCB1bnRpbCB0aGUgc2VsZWN0aW9uIGRpc2FwcGVhcnMKLSAgICAgICAgICogLSBUeXBlIG1vcmUgdGV4dCBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgKnVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkKgotICAgICAgICAgKiAgIGFuZCBnZXQgbmV3IHJlc3VsdHM7IHlvdSBhcmUgbm93IGluIHRvdWNoIG1vZGUKLSAgICAgICAgICogLSBUaGUgc2VsZWN0aW9uIGNvbWVzIGJhY2sgb24gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIGV2ZW4gdGhvdWdoCi0gICAgICAgICAqICAgdGhlIGxpc3QgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdG91Y2ggbW9kZQotICAgICAgICAgKgotICAgICAgICAgKiBVc2luZyB0aGUgc29mdCBrZXlib2FyZCB0cmlnZ2VycyB0aGUgdG91Y2ggbW9kZSBjaGFuZ2UgYnV0IHRoYXQgY2hhbmdlCi0gICAgICAgICAqIGlzIHByb3BhZ2F0ZWQgdG8gb3VyIHdpbmRvdyBvbmx5IGFmdGVyIHRoZSBmaXJzdCBsaXN0IGxheW91dCwgdGhlcmVmb3JlCi0gICAgICAgICAqIGFmdGVyIHRoZSBsaXN0IGF0dGVtcHRzIHRvIHJlc3VycmVjdCB0aGUgc2VsZWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgdHJpY2sgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSBpcyB0byBwcmV0ZW5kIHRoZSBsaXN0IGlzIGluIHRvdWNoCi0gICAgICAgICAqIG1vZGUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIHNlbGVjdGlvbiBzaG91bGQgbm90IGFwcGVhciwgdGhhdCBpcyB3aGVuCi0gICAgICAgICAqIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlIHNlbGVjdGlvbiBhd2F5IGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciB3ZSBleHBsaWNpdGVseSBoaWRlIHRoZSBsaXN0J3MKLSAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVudmVyIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlCi0gICAgICAgICAqIHNlbGVjdGlvbiBiYWNrIHRvIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBXaGVuIHRoaXMgYm9vbGVhbiBpcyB0cnVlLCBpc0luVG91Y2hNb2RlKCkgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgaXQKLSAgICAgICAgICogcmV0dXJucyBzdXBlci5pc0luVG91Y2hNb2RlKCkuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxpc3RTZWxlY3Rpb25IaWRkZW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkF2b2lkcyBqYXJyaW5nIHNjcm9sbGluZyBlZmZlY3QgYnkgZW5zdXJpbmcgdGhhdCBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAqIG1hZGUgb2YgYSB0ZXh0IHZpZXcgZml0IG9uIGEgc2luZ2xlIGxpbmUuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGl0ZW0gaW5kZXggaW4gdGhlIGxpc3QgdG8gZ2V0IGEgdmlldyBmb3IKLSAgICAgICAgICogQHJldHVybiB0aGUgdmlldyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgVmlldyBvYnRhaW5WaWV3KGludCBwb3NpdGlvbiwgYm9vbGVhbltdIGlzU2NyYXApIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IHN1cGVyLm9idGFpblZpZXcocG9zaXRpb24sIGlzU2NyYXApOwotCi0gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7Ci0gICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0SG9yaXpvbnRhbGx5U2Nyb2xsaW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIHJldHVybiBtTGlzdFNlbGVjdGlvbkhpZGRlbiB8fCBzdXBlci5pc0luVG91Y2hNb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXMgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSk7Ci0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkNyZWF0ZWQgZHJhd2FibGUgc3RhdGU6IFsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjB4Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJlc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIFRleHRWaWV3IGNvbXBsaWVzIHRvCiAgICAgICogYSBjZXJ0YWluIGZvcm1hdC4gIFNpbmNlIHRoZXJlIGlzIG5vIGZvb2xwcm9vZiB3YXkgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGxlYXZpbmcKICAgICAgKiB0aGlzIFZpZXcgd2l0aCBhbiBpbmNvcnJlY3QgdmFsdWUgaW4gaXQsIGFsbCB3ZSBjYW4gZG8gaXMgdHJ5IHRvIGZpeCBpdCBvdXJzZWx2ZXMKQEAgLTE2NTIsMTAgKzExNjQsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgZXh0ZW5kcyBEYXRhU2V0T2JzZXJ2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgewotICAgICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVzaXplIHRoZSBwb3B1cCB0byBmaXQgdGhlIG5ldyBhZGFwdGVyJ3MgY29udGVudAotICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZyBhbHJlYWR5LCBzaG93aW5nIGl0IHdpbGwgY2F1c2UKICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBkYXRhIHNldCBvYnNlcnZlcnMgYXR0YWNoZWQgdG8gdGhlIGFkYXB0ZXIgdG8KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuIFdlIGNhbid0IGRvIGl0IGZyb20gaGVyZSwgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZQpAQCAtMTY3MCwxNCArMTE3OSw1IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZGF0YSB0byBkaXNwbGF5IHNvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2hvd2luZwotICAgICAgICAgICAgICAgIC8vIHRoZSBkcm9wIGRvd24gYW5kIGl0cyBsaXN0Ci0gICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQppbmRleCBiYWE2ODMzLi40Y2Y4Nzg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKQEAgLTgwLDYgKzgwLDE4IEBACiAgICAgcHJvdGVjdGVkIEZpbHRlclF1ZXJ5UHJvdmlkZXIgbUZpbHRlclF1ZXJ5UHJvdmlkZXI7CiAKICAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCBjYWxsIHJlcXVlcnkoKSBvbiB0aGUgY3Vyc29yIHdoZW5ldmVyIGEgY29udGVudCBjaGFuZ2UKKyAgICAgKiBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiBJbXBsaWVzIHtAbGluayAjRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVVUT19SRVFVRVJZID0gMHgwMTsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgYWRhcHRlciB3aWxsIHJlZ2lzdGVyIGEgY29udGVudCBvYnNlcnZlciBvbiB0aGUgY3Vyc29yIGFuZCB3aWxsIGNhbGwKKyAgICAgKiB7QGxpbmsgI29uQ29udGVudENoYW5nZWQoKX0gd2hlbiBhIG5vdGlmaWNhdGlvbiBjb21lcyBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIgPSAweDAyOworCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuIFRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlcgogICAgICAqIGl0IGNoYW5nZXMgc28gdGhhdCB0aGUgbW9zdCByZWNlbnQgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqCkBAIC04Nyw3ICs5OSw3IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7Ci0gICAgICAgIGluaXQoY29udGV4dCwgYywgdHJ1ZSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgRkxBR19BVVRPX1JFUVVFUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTksMTkgKzExMSw0MyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGFsd2F5cyBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5KTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjIFRoZSBjdXJzb3IgZnJvbSB3aGljaCB0byBnZXQgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgZmxhZ3MpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5ID8gRkxBR19BVVRPX1JFUVVFUlkgOiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FVVE9fUkVRVUVSWSkgPT0gRkxBR19BVVRPX1JFUVVFUlkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUjsKKyAgICAgICAgICAgIG1BdXRvUmVxdWVyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIGN1cnNvclByZXNlbnQgPSBjICE9IG51bGw7Ci0gICAgICAgIG1BdXRvUmVxdWVyeSA9IGF1dG9SZXF1ZXJ5OwogICAgICAgICBtQ3Vyc29yID0gYzsKICAgICAgICAgbURhdGFWYWxpZCA9IGN1cnNvclByZXNlbnQ7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yUHJlc2VudCA/IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKSA6IC0xOwotICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgPT0gRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY3Vyc29yUHJlc2VudCkgewotICAgICAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBjLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEzICsyODIsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtUm93SURDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKTsKICAgICAgICAgICAgIG1EYXRhVmFsaWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKaW5kZXggMWVkNmIxNi4uYzQ3MjkyZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCkBAIC0xMjA3LDcgKzEyMDcsNyBAQAogCiAgICAgICAgIC8vIFdlIHVuZm9jdXMgdGhlIG9sZCBjaGlsZCBkb3duIGhlcmUgc28gdGhlIGFib3ZlIGhhc0ZvY3VzIGNoZWNrCiAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQotICAgICAgICBpZiAob2xkU2VsZWN0ZWRDaGlsZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChvbGRTZWxlY3RlZENoaWxkICE9IG51bGwgJiYgb2xkU2VsZWN0ZWRDaGlsZCAhPSBjaGlsZCkgewogCiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXRzIGRyYXdhYmxlIHN0YXRlIGRvZXNuJ3QgY29udGFpbiAnc2VsZWN0ZWQnCiAgICAgICAgICAgICBvbGRTZWxlY3RlZENoaWxkLnNldFNlbGVjdGVkKGZhbHNlKTsKQEAgLTEyNjMsNiArMTI2Myw3IEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAoZ2FpbkZvY3VzICYmIG1TZWxlY3RlZENoaWxkICE9IG51bGwpIHsKICAgICAgICAgICAgIG1TZWxlY3RlZENoaWxkLnJlcXVlc3RGb2N1cyhkaXJlY3Rpb24pOworICAgICAgICAgICAgbVNlbGVjdGVkQ2hpbGQuc2V0U2VsZWN0ZWQodHJ1ZSk7CiAgICAgICAgIH0KIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEKaW5kZXggZDI4MjlkYi4uZmU2OWExMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyOwpAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC0xNzc0LDYgKzE3NzUsMTkgQEAKICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXRJZk5lY2Vzc2FyeSgpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuIAorICAgICAqIFJldHVybnMge0BsaW5rICNBVVRPX0ZJVH0gaWYgdGhlIEdyaWQgaGFzIG5ldmVyIGJlZW4gbGFpZCBvdXQuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNHcmlkVmlld19udW1Db2x1bW5zCisgICAgICogCisgICAgICogQHNlZSAjc2V0TnVtQ29sdW1ucyhpbnQpCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHVibGljIGludCBnZXROdW1Db2x1bW5zKCkgeyAgCisgICAgICAgIHJldHVybiBtTnVtQ29sdW1uczsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBNYWtlIHN1cmUgdmlld3MgYXJlIHRvdWNoaW5nIHRoZSB0b3Agb3IgYm90dG9tIGVkZ2UsIGFzIGFwcHJvcHJpYXRlIGZvcgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCmluZGV4IGJkMDdlMWYuLjcyNTRjM2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKQEAgLTQwLDYgKzQwLDEzIEBACiAgKiA8cD4KICAqIEFsc28gc2VlIHtAbGluayBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dC5MYXlvdXRQYXJhbXN9CiAgKiBmb3IgbGF5b3V0IGF0dHJpYnV0ZXMgPC9wPgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWRDaGlsZEluZGV4CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfZ3Jhdml0eQorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfb3JpZW50YXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF93ZWlnaHRTdW0KICAqLwogQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBMaW5lYXJMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXAgewpAQCAtMTEyLDcgKzExOSwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBMaW5lYXJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0gCiAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpbmVhckxheW91dCk7CkBAIC0xMzcsOCArMTQ4LDcgQEAKICAgICAgICAgbUJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXggPQogICAgICAgICAgICAgICAgIGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWRDaGlsZEluZGV4LCAtMSk7CiAKLSAgICAgICAgLy8gVE9ETzogQmV0dGVyIG5hbWUsIGFkZCBKYXZhIEFQSXMsIG1ha2UgaXQgcHVibGljCi0gICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X3VzZUxhcmdlc3RDaGlsZCwgZmFsc2UpOworICAgICAgICBtVXNlTGFyZ2VzdENoaWxkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpbmVhckxheW91dF9tZWFzdXJlV2l0aExhcmdlc3RDaGlsZCwgZmFsc2UpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTE2Nyw2ICsxNzcsMzMgQEAKICAgICAgICAgbUJhc2VsaW5lQWxpZ25lZCA9IGJhc2VsaW5lQWxpZ25lZDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBXaGVuIHRydWUsIGFsbCBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHdpbGwgYmUgY29uc2lkZXJlZCBoYXZpbmcKKyAgICAgKiB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLiBJZiBmYWxzZSwgYWxsIGNoaWxkcmVuIGFyZQorICAgICAqIG1lYXN1cmVkIG5vcm1hbGx5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSB0byBtZWFzdXJlIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgdXNpbmcgdGhlIG1pbmltdW0KKyAgICAgKiAgICAgICAgIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Vc2VMYXJnZXN0Q2hpbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogRGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUKKyAgICAgKiAgICAgICAgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtVXNlTGFyZ2VzdENoaWxkID0gZW5hYmxlZDsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEJhc2VsaW5lKCkgewogICAgICAgICBpZiAobUJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXggPCAwKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkZTM4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpAQCAtMCwwICsxLDEyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25Ub3VjaExpc3RlbmVyOworCisvKioKKyAqIEEgTGlzdFBvcHVwV2luZG93IGFuY2hvcnMgaXRzZWxmIHRvIGEgaG9zdCB2aWV3IGFuZCBkaXNwbGF5cyBhCisgKiBsaXN0IG9mIGNob2ljZXMuIFdoZW4gb25lIGlzIHNlbGVjdGVkLCB0aGUgcG9wdXAgaXMgZGlzbWlzc2VkLgorICogCisgKiA8cD5MaXN0UG9wdXBXaW5kb3cgY29udGFpbnMgYSBudW1iZXIgb2YgdHJpY2t5IGJlaGF2aW9ycyBzdXJyb3VuZGluZworICogcG9zaXRpb25pbmcsIHNjcm9sbGluZyBwYXJlbnRzIHRvIGZpdCB0aGUgZHJvcGRvd24sIGludGVyYWN0aW5nCisgKiBzYW5lbHkgd2l0aCB0aGUgSU1FIGlmIHByZXNlbnQsIGFuZCBvdGhlcnMuCisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcgorICovCitwdWJsaWMgY2xhc3MgTGlzdFBvcHVwV2luZG93IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxpc3RQb3B1cFdpbmRvdyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhpcyB2YWx1ZSBjb250cm9scyB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgdXNlcgorICAgICAqIG11c3QgbGVhdmUgYSBwb2ludGVyIGRvd24gd2l0aG91dCBzY3JvbGxpbmcgdG8gZXhwYW5kCisgICAgICogdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biBsaXN0IHRvIGNvdmVyIHRoZSBJTUUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9MSVNUX1RJTUVPVVQgPSAyNTA7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdyBtUG9wdXA7CisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIERyb3BEb3duTGlzdFZpZXcgbURyb3BEb3duTGlzdDsKKworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhlaWdodCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bldpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBWaWV3IG1Qcm9tcHRWaWV3OworICAgIHByaXZhdGUgaW50IG1Qcm9tcHRQb3NpdGlvbiA9IFBPU0lUSU9OX1BST01QVF9BQk9WRTsKKworICAgIHByaXZhdGUgRGF0YVNldE9ic2VydmVyIG1PYnNlcnZlcjsKKworICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OworCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0OworCisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1JdGVtQ2xpY2tMaXN0ZW5lcjsKKyAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUl0ZW1TZWxlY3RlZExpc3RlbmVyOworCisgICAgcHJpdmF0ZSBmaW5hbCAgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGVBdHRyIERlZmF1bHQgc3R5bGUgYXR0cmlidXRlIHRvIHVzZSBmb3IgcG9wdXAgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgU3R5bGUgYXR0cmlidXRlIHRvIHJlYWQgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZVJlcyBTdHlsZSByZXNvdXJjZSBJRCB0byB1c2UgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHRoZSBkYXRhIGFuZCB0aGUgdmlld3MgdG8gcmVwcmVzZW50IHRoZSBkYXRhCisgICAgICogaW4gdGhpcyBwb3B1cCB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byB1c2UgdG8gY3JlYXRlIHRoaXMgd2luZG93J3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLiBUaGUgZGVmYXVsdCBpcworICAgICAqIHtAbGluayAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gQSBwb3NpdGlvbiBjb25zdGFudCBkZWNsYXJpbmcgd2hlcmUgdGhlIHByb21wdCBzaG91bGQgYmUgZGlzcGxheWVkLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBtUHJvbXB0UG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UHJvbXB0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvbXB0UG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogPHA+SWYgYSBwb3B1cCB3aW5kb3cgaXMgbW9kYWwsIGl0IHdpbGwgcmVjZWl2ZSBhbGwgdG91Y2ggYW5kIGtleSBpbnB1dC4KKyAgICAgKiBJZiB0aGUgdXNlciB0b3VjaGVzIG91dHNpZGUgdGhlIHBvcHVwIHdpbmRvdydzIGNvbnRlbnQgYXJlYSB0aGUgcG9wdXAgd2luZG93CisgICAgICogd2lsbCBiZSBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGFsIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHNob3VsZCBiZSBtb2RhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kYWwoYm9vbGVhbiBtb2RhbCkgeworICAgICAgICBtTW9kYWwgPSB0cnVlOworICAgICAgICBtUG9wdXAuc2V0Rm9jdXNhYmxlKG1vZGFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGFsKCkgeworICAgICAgICByZXR1cm4gbU1vZGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlcyBvdXRzaWRlIHRvdWNoZXMgdG8gYmUgaWdub3JlZC4gTm9ybWFsbHkgaWYge0BsaW5rICNpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpfSBpcworICAgICAqIGZhbHNlLCB3ZSBhbGxvdyBvdXRzaWRlIHRvdWNoIHRvIGRpc21pc3MgdGhlIGRyb3Bkb3duLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlCisgICAgICogaWdub3JlIG91dHNpZGUgdG91Y2ggZXZlbiB3aGVuIHRoZSBkcm9wIGRvd24gaXMgbm90IHNldCB0byBhbHdheXMgdmlzaWJsZS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSBVc2VkIG9ubHkgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdG8gaGFuZGxlIHNvbWUgaW50ZXJuYWwgc3BlY2lhbCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7CisgICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgZHJvcC1kb3duIHNob3VsZCByZW1haW4gdmlzaWJsZSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZHJvcC1kb3duIHdpbGwgb2NjdXB5IHRoZSBlbnRpcmUgc2NyZWVuIGJlbG93IHtAbGluayAjZ2V0QW5jaG9yVmlld30gcmVnYXJkbGVzcworICAgICAqIG9mIHRoZSBzaXplIG9yIGNvbnRlbnQgb2YgdGhlIGxpc3QuICB7QGxpbmsgI2dldEJhY2tncm91bmQoKX0gd2lsbCBmaWxsIGFueSBzcGFjZQorICAgICAqIHRoYXQgaXMgbm90IHVzZWQgYnkgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJvcERvd25BbHdheXNWaXNpYmxlIFdoZXRoZXIgdG8ga2VlcCB0aGUgZHJvcC1kb3duIHZpc2libGUuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZHJvcC1kb3duIGlzIHZpc2libGUgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IEF1dG9Db21wbGV0ZVRleHRWaWV3IHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzb2Z0IGlucHV0IGFyZWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZGVzaXJlZCBtb2RlLCBzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlfQorICAgICAqICAgICAgICBmb3IgdGhlIGZ1bGwgbGlzdAorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjc29mdElucHV0TW9kZQorICAgICAqIEBzZWUgI2dldFNvZnRJbnB1dE1vZGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvZnRJbnB1dE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUobW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldFNvZnRJbnB1dE1vZGUoaW50KX0uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTb2Z0SW5wdXRNb2RlKGludCkKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb2Z0SW5wdXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNvZnRJbnB1dE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSBsaXN0IGl0ZW0gc2VsZWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIExpc3Qgc2VsZWN0b3IgZHJhd2FibGUgdG8gdXNlIGluIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0b3IoRHJhd2FibGUgc2VsZWN0b3IpIHsKKyAgICAgICAgbURyb3BEb3duTGlzdEhpZ2hsaWdodCA9IHNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldEJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byBiZSB0aGUgYmFja2dyb3VuZCBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBBIGRyYXdhYmxlIHRvIHNldCBhcyB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBtUG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBhbmltYXRpb24gc3R5bGUgdG8gdXNlIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcyBzaG93biBvciBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGFuaW1hdGlvblN0eWxlIEFuaW1hdGlvbiBzdHlsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uU3R5bGUoaW50IGFuaW1hdGlvblN0eWxlKSB7CisgICAgICAgIG1Qb3B1cC5zZXRBbmltYXRpb25TdHlsZShhbmltYXRpb25TdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcworICAgICAqIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuaW1hdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFuaW1hdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEFuaW1hdGlvblN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmlldyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmNob3IgdGhpcyBwb3B1cC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3B1cCdzIGFuY2hvciB2aWV3CisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0QW5jaG9yVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9wdXAncyBhbmNob3Igdmlldy4gVGhpcyBwb3B1cCB3aWxsIGFsd2F5cyBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvCisgICAgICogdGhlIGFuY2hvciB2aWV3IHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGFuY2hvciBUaGUgdmlldyB0byB1c2UgYXMgYW4gYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvclZpZXcoVmlldyBhbmNob3IpIHsKKyAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGFuY2hvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhvcml6b250YWxPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvciBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWZXJ0aWNhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoaXMgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIHZpZXcgaW4gcGl4ZWxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bldpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLiBDYW4gYWxzbyBiZSB7QGxpbmsgI01BVENIX1BBUkVOVH0KKyAgICAgKiBvciB7QGxpbmsgI1dSQVBfQ09OVEVOVH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1Ecm9wRG93bldpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4gQ2FuIGFsc28gYmUge0BsaW5rICNNQVRDSF9QQVJFTlR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNsaWNrTGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgY2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIgPSBjbGlja0xpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RlZExpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBzZWxlY3RlZExpc3RlbmVyKSB7CisgICAgICAgIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IHNlbGVjdGVkTGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdmlldyB0byBhY3QgYXMgYSB1c2VyIHByb21wdCBmb3IgdGhpcyBwb3B1cCB3aW5kb3cuIFdoZXJlIHRoZSBwcm9tcHQgdmlldyB3aWxsIGFwcGVhcgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkge0BsaW5rICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFZpZXcgdG8gdXNlIGFzIGFuIGluZm9ybWF0aW9uYWwgcHJvbXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFZpZXcoVmlldyBwcm9tcHQpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93aW5nID0gaXNTaG93aW5nKCk7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb21wdFZpZXcgPSBwcm9tcHQ7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEge0BsaW5rICNzaG93KCl9IGNhbGwgdG8gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvdygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHBvcHVwIGxpc3QuIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgc2hvd2luZywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHJlY2FsY3VsYXRlIHRoZSBwb3B1cCdzIHNpemUgYW5kIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKKworICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7CisKKyAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKKworICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXRBbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KKyAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQorICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisgICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihtVG91Y2hJbnRlcmNlcHRvcik7CisgICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0QW5jaG9yVmlldygpLAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFtTW9kYWwgfHwgbURyb3BEb3duTGlzdC5pc0luVG91Y2hNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1vZGFsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtSGlkZVNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKKyAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByb21wdFZpZXcoKSB7CisgICAgICAgIGlmIChtUHJvbXB0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHBhcmVudCA9IG1Qcm9tcHRWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVWaWV3KG1Qcm9tcHRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgaG93IHRoZSBwb3B1cCBvcGVyYXRlcyB3aXRoIGFuIGlucHV0IG1ldGhvZDogb25lIG9mCisgICAgICoge0BsaW5rICNJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEV9LCB7QGxpbmsgI0lOUFVUX01FVEhPRF9ORUVERUR9LAorICAgICAqIG9yIHtAbGluayAjSU5QVVRfTUVUSE9EX05PVF9ORUVERUR9LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdGFrZSBlZmZlY3Qgb25seQorICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHBvcHVwIGlzIHNob3duIG9yIHRocm91Z2ggYSBtYW51YWwgY2FsbCB0byB0aGUge0BsaW5rICNzaG93KCl9CisgICAgICogbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRJbnB1dE1ldGhvZE1vZGUoKQorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kTW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRNZXRob2RNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGxpc3QuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gTGlzdCBwb3NpdGlvbiB0byBzZXQgYXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGlzdC5nZXRDaG9pY2VNb2RlKCkgIT0gTGlzdFZpZXcuQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgbGlzdCBzZWxlY3Rpb24uCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcG9wdXAgaXMgY29uZmlndXJlZCB0byBhc3N1bWUgdGhlIHVzZXIgZG9lcyBub3QgbmVlZAorICAgICAqIHRvIGludGVyYWN0IHdpdGggdGhlIElNRSB3aGlsZSBpdCBpcyBzaG93aW5nLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IElOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaXRlbSBjbGljayBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBsaXN0IGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGljayBhY3Rpb24gY291bGQgYmUgcGVyZm9ybWVkLCBmYWxzZSBpZiBub3QuCisgICAgICogICAgICAgICAoZS5nLiBpZiB0aGUgcG9wdXAgd2FzIG5vdCBzaG93aW5nLCB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gZmFsc2UuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbGlzdC5nZXRDaGlsZEF0KHBvc2l0aW9uIC0gbGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgY2hpbGQsIHBvc2l0aW9uLCBjaGlsZC5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1BPU0lUSU9OfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3Ige0BsaW5rIExpc3RWaWV3I0lOVkFMSURfUk9XX0lEfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1JZCgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1JPV19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmCisgICAgICoge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkVmlldygpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTGlzdFZpZXd9IGRpc3BsYXllZCB3aXRoaW4gdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4ge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCisgICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0CisgICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcworICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQorICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOworCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgorICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcworICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5VXAKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBwcmUtSU1FIGtleSBldmVudHMuIEJ5IGZvcndhcmRpbmcge0BsaW5rIFZpZXcjb25LZXlQcmVJbWUoaW50LCBLZXlFdmVudCl9CisgICAgICogZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sIHZpZXdzIHVzaW5nIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBkaXNtaXNzIHRoZSBwb3B1cAorICAgICAqIHdoZW4gdGhlIGJhY2sga2V5IGlzIHByZXNzZWQuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5UHJlSW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZmluYWwgVmlldyBhbmNob3JWaWV3ID0gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLnN0YXJ0VHJhY2tpbmcoZXZlbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLmhhbmRsZVVwRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1RyYWNraW5nKCkgJiYgIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCisgICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgeworICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OworICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKKworICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAorICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93CisgICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAorICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldEFuY2hvclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQsICFtTW9kYWwpOworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihtU2Nyb2xsTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOworICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAobVByb21wdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQkVMT1c6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQUJPVkU6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBoaW50IHBvc2l0aW9uICIgKyBtUHJvbXB0UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKworICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCisgICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCisgICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQorICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCisgICAgICAgICAgICAgICAgZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOworCisgICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCisgICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdworICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOworICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdworICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAorICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKKworICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGNhbiBoaWphY2sgdGhlIGZvY3VzIHRvCisgICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KKyAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd24gaW4gdGhpcyBtb2RlOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMaXN0UG9wdXBXaW5kb3cuVEFHICsgIi5Ecm9wRG93bkxpc3RWaWV3IjsKKyAgICAgICAgLyoKKyAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cworICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCisgICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKKyAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAorICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQorICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQorICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAorICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgorICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRseSBoaWRlIHRoZSBsaXN0J3MKKyAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVuZXZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQorICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0CisgICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRydWUgaWYgdGhpcyB3cmFwcGVyIHNob3VsZCBmYWtlIGZvY3VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IaWphY2tGb2N1czsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoaWphY2tGb2N1cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7CisgICAgICAgICAgICBtSGlqYWNrRm9jdXMgPSBoaWphY2tGb2N1czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cworICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7CisgICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKKworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICByZXR1cm4gKG1IaWphY2tGb2N1cyAmJiBtTGlzdFNlbGVjdGlvbkhpZGRlbikgfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNXaW5kb3dGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMgaWYgaGlqYWNraW5nIGZvY3VzCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IG5ldyBjb250ZW50CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSAmJgorICAgICAgICAgICAgICAgICAgICAoeCA+PSAwICYmIHggPCBnZXRXaWR0aCgpICYmIHkgPj0gMCAmJiB5IDwgZ2V0SGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCisgICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKaW5kZXggODkyYzQ0YS4uOTFmNDk0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpZiAobnVsbCAhPSBtQWRhcHRlcikgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YQppbmRleCAwMzc4MzI4Li5kNDA0Y2U3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YQpAQCAtMTYsMjcgKzE2LDI4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25Ub3VjaExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXI7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCiAgKiA8cD5BIHBvcHVwIHdpbmRvdyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYW4gYXJiaXRyYXJ5IHZpZXcuIFRoZSBwb3B1cApAQCAtMTU3LDEyICsxNTgsMjEgQEAKICAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBwcm92aWRlIGEgYmFja2dyb3VuZC48L3A+CiAgICAgICovCiAgICAgcHVibGljIFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGUgYSBuZXcsIGVtcHR5LCBub24gZm9jdXNhYmxlIHBvcHVwIHdpbmRvdyBvZiBkaW1lbnNpb24gKDAsMCkuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBwb3B1cCBkb2VzIG5vdCBwcm92aWRlIGEgYmFja2dyb3VuZC48L3A+CisgICAgICovCisgICAgcHVibGljIFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtV2luZG93TWFuYWdlciA9IChXaW5kb3dNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPQogICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qb3B1cFdpbmRvdywgZGVmU3R5bGUsIDApOworICAgICAgICAgICAgICAgIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qb3B1cFdpbmRvdywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CiAKICAgICAgICAgbUJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLlBvcHVwV2luZG93X3BvcHVwQmFja2dyb3VuZCk7CiAKQEAgLTEzMTUsNiArMTMyNSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFZpZXdDb250YWluZXIgZXh0ZW5kcyBGcmFtZUxheW91dCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUG9wdXBXaW5kb3cuUG9wdXBWaWV3Q29udGFpbmVyIjsKIAogICAgICAgICBwdWJsaWMgUG9wdXBWaWV3Q29udGFpbmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCmluZGV4IDhlOWViMDUuLjcxZjBjMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCkBAIC03MTUsOCArNzE1LDggQEAKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0RHVyYXRpb24obUR1cmF0aW9uKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwogICAgICAgICAgICAgbUFuaW1hdGlvbi5zZXRTdGFydFRpbWUoQW5pbWF0aW9uLlNUQVJUX09OX0ZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KKyAgICAgICAgcG9zdEludmFsaWRhdGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcyOSw2ICs3MjksNyBAQAogICAgICAgICAgICAgKChBbmltYXRhYmxlKSBtSW5kZXRlcm1pbmF0ZURyYXdhYmxlKS5zdG9wKCk7CiAgICAgICAgICAgICBtU2hvdWxkU3RhcnRBbmltYXRpb25EcmF3YWJsZSA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9RdWlja0NvbnRhY3RCYWRnZS5qYXZhCmluZGV4IDA3YzNlNGIuLjUwZmJiNmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9RdWlja0NvbnRhY3RCYWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9RdWlja0NvbnRhY3RCYWRnZS5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiAgICAgcHJpdmF0ZSBRdWVyeUhhbmRsZXIgbVF1ZXJ5SGFuZGxlcjsKICAgICBwcml2YXRlIERyYXdhYmxlIG1CYWRnZUJhY2tncm91bmQ7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtTm9CYWRnZUJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtRGVmYXVsdEF2YXRhcjsKIAogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtRXhjbHVkZU1pbWVzID0gbnVsbDsKIApAQCAtMTE3LDYgKzExOCwxNiBAQAogICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IHNpemUpIHsKICAgICAgICAgbU1vZGUgPSBzaXplOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbnRhY3QgcGhvdG8gdG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1hZ2VUb0RlZmF1bHQoKSB7CisgICAgICAgIGlmIChtRGVmYXVsdEF2YXRhciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGVmYXVsdEF2YXRhciA9IGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfY29udGFjdF9waWN0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1EZWZhdWx0QXZhdGFyKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBBc3NpZ24gdGhlIGNvbnRhY3QgdXJpIHRoYXQgdGhpcyBRdWlja0NvbnRhY3RCYWRnZSBzaG91bGQgYmUgYXNzb2NpYXRlZApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MuamF2YQppbmRleCA3YTcwYzgwLi5mYzAyYWNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MuamF2YQpAQCAtNjAsMTIgKzYwLDEyIEBACiAgICAgICogVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBsYXlvdXQgCiAgICAgICogcmVzb3VyY2UuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlOwogICAgIAogICAgIC8qKgogICAgICAqIFRoZSByZXNvdXJjZSBJRCBvZiB0aGUgbGF5b3V0IGZpbGUuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXlvdXRJZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTGF5b3V0SWQ7CiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSBvZiBhY3Rpb25zIHRvIHBlcmZvcm0gb24gdGhlIHZpZXcgdHJlZSBvbmNlIGl0IGhhcyBiZWVuCkBAIC01NjksNiArNTY5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IDdkMzQ1OWUuLmQxYzIyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdHJpbmdDb252ZXJzaW9uQ29sdW1uID0gLTE7CiAgICAgcHJpdmF0ZSBDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXI7CiAgICAgcHJpdmF0ZSBWaWV3QmluZGVyIG1WaWV3QmluZGVyOwotICAgIHByaXZhdGUgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKKworICAgIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDJmNmRkMWUuLjYwZTg1NjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCkBAIC0zNywxMCArMzgsMjEgQEAKICAqLwogQFdpZGdldAogcHVibGljIGNsYXNzIFNwaW5uZXIgZXh0ZW5kcyBBYnNTcGlubmVyIGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNwaW5uZXIiOwogICAgIAotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Qcm9tcHQ7Ci0gICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtUG9wdXA7Ci0KKyAgICAvKioKKyAgICAgKiBVc2UgYSBkaWFsb2cgd2luZG93IGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRElBTE9HID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgYSBkcm9wZG93biBhbmNob3JlZCB0byB0aGUgU3Bpbm5lciBmb3Igc2VsZWN0aW5nIHNwaW5uZXIgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RST1BET1dOID0gMTsKKyAgICAKKyAgICBwcml2YXRlIFNwaW5uZXJQb3B1cCBtUG9wdXA7CisgICAgcHJpdmF0ZSBEcm9wRG93bkFkYXB0ZXIgbVRlbXBBZGFwdGVyOworICAgIAogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KQEAgLTU1LDkgKzY3LDU0IEBACiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyLCBkZWZTdHlsZSwgMCk7CiAgICAgICAgIAotICAgICAgICBtUHJvbXB0ID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wcm9tcHQpOworICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfc3Bpbm5lck1vZGUsCisgICAgICAgICAgICAgICAgTU9ERV9ESUFMT0cpOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9ESUFMT0c6IHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG5ldyBEaWFsb2dQb3B1cCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgTU9ERV9EUk9QRE9XTjogeworICAgICAgICAgICAgZmluYWwgaW50IGhpbnRSZXNvdXJjZSA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wb3B1cFByb21wdFZpZXcsIDApOworCisgICAgICAgICAgICBEcm9wZG93blBvcHVwIHBvcHVwID0gbmV3IERyb3Bkb3duUG9wdXAoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBoaW50UmVzb3VyY2UpOworCisgICAgICAgICAgICBwb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoYS5nZXREcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wb3B1cEJhY2tncm91bmQpKTsKKyAgICAgICAgICAgIHBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMCkpOworICAgICAgICAgICAgcG9wdXAuc2V0SG9yaXpvbnRhbE9mZnNldChhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMCkpOworCisgICAgICAgICAgICBtUG9wdXAgPSBwb3B1cDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRUZXh0KGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gQmFzZSBjb25zdHJ1Y3RvciBjYW4gY2FsbCBzZXRBZGFwdGVyIGJlZm9yZSB3ZSBpbml0aWFsaXplIG1Qb3B1cC4KKyAgICAgICAgLy8gRmluaXNoIHNldHRpbmcgdGhpbmdzIHVwIGlmIHRoaXMgaGFwcGVuZWQuCisgICAgICAgIGlmIChtVGVtcEFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobVRlbXBBZGFwdGVyKTsKKyAgICAgICAgICAgIG1UZW1wQWRhcHRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihTcGlubmVyQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKKyAgICAgICAgaWYgKG1Qb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihuZXcgRHJvcERvd25BZGFwdGVyKGFkYXB0ZXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UZW1wQWRhcHRlciA9IG5ldyBEcm9wRG93bkFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5NCw4ICsyNTEsNiBAQAogICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBmb3IgbWFrZUFuZEFkZFZpZXcgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiBhIHZpZXcKICAgICAgKiBhbmQgZmlsbCBvdXQgaXRzIGxheW91dCBwYXJhbXRlcnMuCkBAIC0yNDYsMTUgKzMwMSwxMCBAQAogICAgICAgICAKICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRHJvcERvd25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGdldEFkYXB0ZXIoKSk7CiAKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKGFkYXB0ZXIsIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBoYW5kbGVkOwpAQCAtMjcxLDcgKzMyMSw3IEBACiAgICAgICogQHBhcmFtIHByb21wdCB0aGUgcHJvbXB0IHRvIHNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb21wdChDaGFyU2VxdWVuY2UgcHJvbXB0KSB7Ci0gICAgICAgIG1Qcm9tcHQgPSBwcm9tcHQ7CisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRUZXh0KHByb21wdCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzksMTQgKzMyOSwxNCBAQAogICAgICAqIEBwYXJhbSBwcm9tcHRJZCB0aGUgcmVzb3VyY2UgSUQgb2YgdGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb21wdElkKGludCBwcm9tcHRJZCkgewotICAgICAgICBtUHJvbXB0ID0gZ2V0Q29udGV4dCgpLmdldFRleHQocHJvbXB0SWQpOworICAgICAgICBzZXRQcm9tcHQoZ2V0Q29udGV4dCgpLmdldFRleHQocHJvbXB0SWQpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KICAgICAgKi8KICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFByb21wdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9tcHQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SGludFRleHQoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODQsNCArNDM0LDEyMyBAQAogICAgICAgICAgICAgcmV0dXJuIGdldENvdW50KCkgPT0gMDsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHNvbWUgc29ydCBvZiBwb3B1cCBzZWxlY3Rpb24gaW50ZXJmYWNlIGZvciBzZWxlY3RpbmcgYSBzcGlubmVyIG9wdGlvbi4KKyAgICAgKiBBbGxvd3MgZm9yIGRpZmZlcmVudCBzcGlubmVyIG1vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50ZXJmYWNlIFNwaW5uZXJQb3B1cCB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU2hvdyB0aGUgcG9wdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBEaXNtaXNzIHRoZSBwb3B1cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzcygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcG9wdXAgaXMgc2hvd2luZywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGhpbnQgdGV4dCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoaXMgc2hvdWxkIHByb3ZpZGUKKyAgICAgICAgICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hvaWNlIGJlaW5nIG1hZGUuCisgICAgICAgICAqIEBwYXJhbSBoaW50VGV4dCBIaW50IHRleHQgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpOworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRGlhbG9nUG9wdXAgaW1wbGVtZW50cyBTcGlubmVyUG9wdXAsIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIEFsZXJ0RGlhbG9nIG1Qb3B1cDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtTGlzdEFkYXB0ZXI7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Qcm9tcHQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgICAgICAgICBtUG9wdXAgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb3B1cCAhPSBudWxsID8gbVBvcHVwLmlzU2hvd2luZygpIDogZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgICAgIG1MaXN0QWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCkgeworICAgICAgICAgICAgbVByb21wdCA9IGhpbnRUZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qcm9tcHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGlmIChtUHJvbXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKG1Qcm9tcHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvcHVwID0gYnVpbGRlci5zZXRTaW5nbGVDaG9pY2VJdGVtcyhtTGlzdEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgIHNldFNlbGVjdGlvbih3aGljaCk7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBEcm9wZG93blBvcHVwIGV4dGVuZHMgTGlzdFBvcHVwV2luZG93IGltcGxlbWVudHMgU3Bpbm5lclBvcHVwIHsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1IaW50VmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUhpbnRSZXNvdXJjZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBEcm9wZG93blBvcHVwKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcywgaW50IGhpbnRSZXNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIDAsIGRlZlN0eWxlUmVzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSA9IGhpbnRSZXNvdXJjZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0QW5jaG9yVmlldyhTcGlubmVyLnRoaXMpOworICAgICAgICAgICAgc2V0TW9kYWwodHJ1ZSk7CisgICAgICAgICAgICBzZXRQcm9tcHRQb3NpdGlvbihQT1NJVElPTl9QUk9NUFRfQkVMT1cpOworICAgICAgICAgICAgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldyBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIudGhpcy5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpbnRUZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCkgeworICAgICAgICAgICAgbUhpbnRUZXh0ID0gaGludFRleHQ7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50VGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIHNldFByb21wdFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IHRleHRWaWV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2hvdygpOworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oU3Bpbm5lci50aGlzLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQppbmRleCBlNmVkNzBhLi4xNzk2N2Q5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQpAQCAtMzIxLDYgKzMyMSw3IEBACiAgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci50ZXh0Vmlld1N0eWxlKTsKICAgICB9CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyBUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBhdHRycywKICAgICAgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlKSB7CkBAIC03MTQsNyArNzE1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbnB1dE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBjOworICAgICAgICAgICAgQ2xhc3M8Pz4gYzsKIAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShpbnB1dE1ldGhvZC50b1N0cmluZygpKTsKQEAgLTIzMzUsNiArMjMzNiw3IEBACiAgICAgICAgICAgICByZXR1cm4gc3RyICsgIn0iOwogICAgICAgICB9CiAKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKICAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgewpAQCAtMjc1Niw2ICsyNzU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtQ2hhcnNbb2ZmICsgbVN0YXJ0XTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcobUNoYXJzLCBtU3RhcnQsIG1MZW5ndGgpOwogICAgICAgICB9CkBAIC0yNzgxLDYgKzI3ODQsMTQgQEAKICAgICAgICAgICAgIGMuZHJhd1RleHQobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIHApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApIHsKICAgICAgICAgICAgIHJldHVybiBwLm1lYXN1cmVUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICAgICAgfQpAQCAtMjc4OCw2ICsyNzk5LDIzIEBACiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0V2lkdGhzKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsCisgICAgICAgICAgICAgICAgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0LCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5DdXJzb3IobUNoYXJzLCBjb250ZXh0U3RhcnQgKyBtU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDb3VudCwgZmxhZ3MsIG9mZnNldCArIG1TdGFydCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzE5OCw3ICszMjI2LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBjcmVhdGUgSWYgdHJ1ZSwgdGhlIGV4dHJhcyB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhleSBkb24ndCBhbHJlYWR5CiAgICAgICogZXhpc3QuICBPdGhlcndpc2UsIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpZiBub25lIGhhdmUgYmVlbiBjcmVhdGVkLgotICAgICAqIEBzZWUgI3NldElucHV0RXh0cmFzKGludClWaWV3CisgICAgICogQHNlZSAjc2V0SW5wdXRFeHRyYXMoaW50KQogICAgICAqIEBzZWUgRWRpdG9ySW5mbyNleHRyYXMKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19lZGl0b3JFeHRyYXMKICAgICAgKi8KQEAgLTMzMTIsNyArMzM0MCw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFcnJvclBvcHVwIGV4dGVuZHMgUG9wdXBXaW5kb3cgewogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFib3ZlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbVZpZXc7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGV4dFZpZXcgbVZpZXc7CiAKICAgICAgICAgRXJyb3JQb3B1cChUZXh0VmlldyB2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgICAgIHN1cGVyKHYsIHdpZHRoLCBoZWlnaHQpOwpAQCAtNDg0Nyw2ICs0ODc1LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgIC8vIE5vdGUsIExheW91dCByZXNvbHZlcyBBTElHTl9PUFBPU0lURSB0byBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTYzMiw2ICs1NjYyLDggQEAKICAgICAgKiB0byB0aGUgdXNlci4gIFRoaXMgd2lsbCBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIGl0IHJlcHJlc2VudHMgbW9yZSB0aGFuCiAgICAgICogb25lIGNoYXJhY3RlciAoYSBzZWxlY3Rpb24gcmFuZ2UpLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUKICAgICAgKiBUZXh0VmlldyBjb250YWlucyBzcGFubmFibGUgdGV4dDsgb3RoZXJ3aXNlIGl0IHdpbGwgZG8gbm90aGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBhY3R1YWxseSBtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG1vdmVDdXJzb3JUb1Zpc2libGVPZmZzZXQoKSB7CiAgICAgICAgIGlmICghKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSkgewpAQCAtNTY2OCwxMSArNTcwMCwxNSBAQAogICAgICAgICBmaW5hbCBpbnQgbGVmdENoYXIgPSBtTGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSwgaHMpOwogICAgICAgICBmaW5hbCBpbnQgcmlnaHRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzcGFjZStocyk7CiAgICAgICAgIAorICAgICAgICAvLyBsaW5lIG1pZ2h0IGNvbnRhaW4gYmlkaXJlY3Rpb25hbCB0ZXh0CisgICAgICAgIGZpbmFsIGludCBsb3dDaGFyID0gbGVmdENoYXIgPCByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKyAgICAgICAgZmluYWwgaW50IGhpZ2hDaGFyID0gbGVmdENoYXIgPiByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKwogICAgICAgICBpbnQgbmV3U3RhcnQgPSBzdGFydDsKLSAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbGVmdENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gbGVmdENoYXI7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiByaWdodENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gcmlnaHRDaGFyOworICAgICAgICBpZiAobmV3U3RhcnQgPCBsb3dDaGFyKSB7CisgICAgICAgICAgICBuZXdTdGFydCA9IGxvd0NoYXI7CisgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiBoaWdoQ2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBoaWdoQ2hhcjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKG5ld1N0YXJ0ICE9IHN0YXJ0KSB7CkBAIC01OTM1LDcgKzU5NzEsNyBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+IG1WaWV3OwogCiAgICAgICAgIHByaXZhdGUgYnl0ZSBtU3RhdHVzID0gTUFSUVVFRV9TVE9QUEVEOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TY3JvbGxVbml0OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1TY3JvbGxVbml0OwogICAgICAgICBwcml2YXRlIGZsb2F0IG1NYXhTY3JvbGw7CiAgICAgICAgIGZsb2F0IG1NYXhGYWRlU2Nyb2xsOwogICAgICAgICBwcml2YXRlIGZsb2F0IG1HaG9zdFN0YXJ0OwpAQCAtNTk0Nyw3ICs1OTgzLDcgQEAKIAogICAgICAgICBNYXJxdWVlKFRleHRWaWV3IHYpIHsKICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSB2LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7Ci0gICAgICAgICAgICBtU2Nyb2xsVW5pdCA9IChNQVJRVUVFX1BJWEVMU19QRVJfU0VDT05EICogZGVuc2l0eSkgLyAoZmxvYXQpIE1BUlFVRUVfUkVTT0xVVElPTjsKKyAgICAgICAgICAgIG1TY3JvbGxVbml0ID0gKE1BUlFVRUVfUElYRUxTX1BFUl9TRUNPTkQgKiBkZW5zaXR5KSAvIE1BUlFVRUVfUkVTT0xVVElPTjsKICAgICAgICAgICAgIG1WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+KHYpOwogICAgICAgICB9CiAKQEAgLTY1MzIsMjQgKzY1NjgsMzcgQEAKICAgICB9CiAKICAgICBjbGFzcyBDb21taXRTZWxlY3Rpb25SZWNlaXZlciBleHRlbmRzIFJlc3VsdFJlY2VpdmVyIHsKLSAgICAgICAgaW50IG1OZXdTdGFydDsKLSAgICAgICAgaW50IG1OZXdFbmQ7Ci0gICAgICAgIAotICAgICAgICBDb21taXRTZWxlY3Rpb25SZWNlaXZlcigpIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVByZXZTdGFydCwgbVByZXZFbmQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1OZXdTdGFydCwgbU5ld0VuZDsKKworICAgICAgICBwdWJsaWMgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoaW50IG1QcmV2U3RhcnQsIGludCBtUHJldkVuZCwgaW50IG1OZXdTdGFydCwgaW50IG1OZXdFbmQpIHsKICAgICAgICAgICAgIHN1cGVyKGdldEhhbmRsZXIoKSk7CisgICAgICAgICAgICB0aGlzLm1QcmV2U3RhcnQgPSBtUHJldlN0YXJ0OworICAgICAgICAgICAgdGhpcy5tUHJldkVuZCA9IG1QcmV2RW5kOworICAgICAgICAgICAgdGhpcy5tTmV3U3RhcnQgPSBtTmV3U3RhcnQ7CisgICAgICAgICAgICB0aGlzLm1OZXdFbmQgPSBtTmV3RW5kOwogICAgICAgICB9Ci0gICAgICAgIAorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0Q29kZSAhPSBJbnB1dE1ldGhvZE1hbmFnZXIuUkVTVUxUX1NIT1dOKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1UZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmIChtTmV3U3RhcnQgPiBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ld1N0YXJ0ID0gbGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU5ld0VuZCA+IGxlbikgewotICAgICAgICAgICAgICAgICAgICBtTmV3RW5kID0gbGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpbVRleHQsIG1OZXdTdGFydCwgbU5ld0VuZCk7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBtTmV3U3RhcnQ7CisgICAgICAgICAgICBpbnQgZW5kID0gbU5ld0VuZDsKKworICAgICAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXcgcG9zaXRpb24sIHVubGVzcyB0aGlzIHRhcCB3YXMgYWN0dWFsbHkKKyAgICAgICAgICAgIC8vIHVzZSB0byBzaG93IHRoZSBJTU0uIExlYXZlIGN1cnNvciB1bmNoYW5nZWQgaW4gdGhhdCBjYXNlLgorICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gSW5wdXRNZXRob2RNYW5hZ2VyLlJFU1VMVF9TSE9XTikgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbVByZXZTdGFydDsKKyAgICAgICAgICAgICAgICBlbmQgPSBtUHJldkVuZDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1UZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gbGVuKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5kID4gbGVuKSB7CisgICAgICAgICAgICAgICAgZW5kID0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBzdGFydCwgZW5kKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTY1NjIsNyArNjYxMSw3IEBACiAgICAgICAgICAgICBtVG91Y2hGb2N1c1NlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtU2Nyb2xsZWQgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmaW5hbCBib29sZWFuIHN1cGVyUmVzdWx0ID0gc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKIAogICAgICAgICAvKgpAQCAtNjU3NSw3ICs2NjI0LDggQEAKICAgICAgICAgICAgIHJldHVybiBzdXBlclJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobU1vdmVtZW50ICE9IG51bGwgfHwgb25DaGVja0lzVGV4dEVkaXRvcigpKSAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiBtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChtTW92ZW1lbnQgIT0gbnVsbCB8fCBvbkNoZWNrSXNUZXh0RWRpdG9yKCkpICYmCisgICAgICAgICAgICAgICAgbVRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUgJiYgbUxheW91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgCkBAIC02NTkwLDI5ICs2NjQwLDE3IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgaXNGb2N1c2VkKCkgJiYgIW1TY3JvbGxlZCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZ29pbmcgdG8gYmUgZ3Jvc3MuLi4gIGlmIHRhcHBpbmcgb24gdGhlIHRleHQgdmlldwotICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZXMgdGhlIElNRSB0byBiZSBkaXNwbGF5ZWQsIHdlIGRvbid0IHdhbnQgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGFuZ2UuICBCdXQgdGhlIHNlbGVjdGlvbiBoYXMgYWxyZWFkeSBjaGFuZ2VkLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd29uJ3Qga25vdyByaWdodCBhd2F5IHdoZXRoZXIgdGhlIElNRSBpcyBnZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXllZCwgc28uLi4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQobVRleHQpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChtVGV4dCk7CisKICAgICAgICAgICAgICAgICAgICAgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgY3NyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlbFN0YXJ0ICE9IG9sZFNlbFN0YXJ0IHx8IG5ld1NlbEVuZCAhPSBvbGRTZWxFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzciA9IG5ldyBDb21taXRTZWxlY3Rpb25SZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyLm1OZXdTdGFydCA9IG5ld1NlbFN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyLm1OZXdFbmQgPSBuZXdTZWxFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3IgPSBuZXcgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIob2xkU2VsU3RhcnQsIG9sZFNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VsU3RhcnQsIG5ld1NlbEVuZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbW0uc2hvd1NvZnRJbnB1dCh0aGlzLCAwLCBjc3IpICYmIGNzciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgSU1FIG1pZ2h0IGdldCBzaG93biAtLSByZXZlcnQgdG8gdGhlIG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uLCBhbmQgY2hhbmdlIHRvIHRoZSBuZXcgd2hlbiB3ZSBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG91dCBvZiBpdCBpcyBva2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBvbGRTZWxTdGFydCwgb2xkU2VsRW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IGltbS5zaG93U29mdElucHV0KHRoaXMsIDAsIGNzcikgJiYgKGNzciAhPSBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY2NTcsNyArNjY5NSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmxpbmsgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+IG1WaWV3OworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+IG1WaWV3OwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZDsKIAogICAgICAgICBwdWJsaWMgQmxpbmsoVGV4dFZpZXcgdikgewpAQCAtNzI5MSw2ICs3MzI5LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1Mb25nQ2xpY2soKSB7CiAgICAgICAgIGlmIChzdXBlci5wZXJmb3JtTG9uZ0NsaWNrKCkpIHsKICAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOwpAQCAtNzMxOCw5ICs3MzU3LDkgQEAKICAgICBwcml2YXRlIEFycmF5TGlzdDxUZXh0V2F0Y2hlcj4gIG1MaXN0ZW5lcnMgPSBudWxsOwogCiAgICAgLy8gZGlzcGxheSBhdHRyaWJ1dGVzCi0gICAgcHJpdmF0ZSBUZXh0UGFpbnQgICAgICAgICAgICAgICBtVGV4dFBhaW50OworICAgIHByaXZhdGUgZmluYWwgVGV4dFBhaW50ICAgICAgICAgbVRleHRQYWludDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1Vc2VyU2V0VGV4dFNjYWxlWDsKLSAgICBwcml2YXRlIFBhaW50ICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRQYWludDsKKyAgICBwcml2YXRlIGZpbmFsIFBhaW50ICAgICAgICAgICAgIG1IaWdobGlnaHRQYWludDsKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRDb2xvciA9IDB4RkZCQkRERkY7CiAgICAgcHJpdmF0ZSBMYXlvdXQgICAgICAgICAgICAgICAgICBtTGF5b3V0OwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKaW5kZXggOTA3Y2ZiMy4uN2I2Njg5MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQpAQCAtMzEsMTEgKzMxLDEzIEBACiAgKgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2luQW5pbWF0aW9uCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldwogICovCiBwdWJsaWMgY2xhc3MgVmlld0FuaW1hdG9yIGV4dGVuZHMgRnJhbWVMYXlvdXQgewogCiAgICAgaW50IG1XaGljaENoaWxkID0gMDsKICAgICBib29sZWFuIG1GaXJzdFRpbWUgPSB0cnVlOworCiAgICAgYm9vbGVhbiBtQW5pbWF0ZUZpcnN0VGltZSA9IHRydWU7CiAKICAgICBBbmltYXRpb24gbUluQW5pbWF0aW9uOwpAQCAtNTksNiArNjEsMTAgQEAKICAgICAgICAgaWYgKHJlc291cmNlID4gMCkgewogICAgICAgICAgICAgc2V0T3V0QW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKICAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZmxhZyA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldywgdHJ1ZSk7CisgICAgICAgIHNldEFuaW1hdGVGaXJzdFZpZXcoZmxhZyk7CisKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAKICAgICAgICAgaW5pdFZpZXdBbmltYXRvcihjb250ZXh0LCBhdHRycyk7CkBAIC04NCwxMCArOTAsMTAgQEAKICAgICAgICAgc2V0TWVhc3VyZUFsbENoaWxkcmVuKG1lYXN1cmVBbGxDaGlsZHJlbik7CiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFNldHMgd2hpY2ggY2hpbGQgdmlldyB3aWxsIGJlIGRpc3BsYXllZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB3aGljaENoaWxkIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdmlldyB0byBkaXNwbGF5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheWVkQ2hpbGQoaW50IHdoaWNoQ2hpbGQpIHsKQEAgLTEwNSwxNCArMTExLDE0IEBACiAgICAgICAgICAgICByZXF1ZXN0Rm9jdXMoRk9DVVNfRk9SV0FSRCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBjaGlsZCB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheWVkQ2hpbGQoKSB7CiAgICAgICAgIHJldHVybiBtV2hpY2hDaGlsZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYW51YWxseSBzaG93cyB0aGUgbmV4dCBjaGlsZC4KICAgICAgKi8KQEAgLTEyOCw2ICsxMzQsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4sCisgICAgICogb3B0aW9uYWxseSB3aXRoIHRoZSB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgY2hpbGQgZW50ZXJzIHRoZSBzY3JlZW4sIG9wdGlvbmFsbHkgd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICogQHBhcmFtIGFuaW1hdGUgV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBpbiBhbmQgb3V0IGFuaW1hdGlvbnMsIGRlZmF1bHRzCisgICAgICogICAgICAgICAgICB0byB0cnVlLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgogICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbgogICAgICAqIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kIHRoZSBzcGVjaWZpZWQgY2hpbGQKICAgICAgKiBlbnRlcnMgdGhlIHNjcmVlbiB3aXRoIHRoZSB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KQEAgLTEzNSwyNCArMTcwLDggQEAKICAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgogICAgICAqLwogICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja0ZvckZpcnN0ID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKLSAgICAgICAgICAgIGlmIChpID09IGNoaWxkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JGaXJzdCAmJiBtSW5BbmltYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtSW5BbmltYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUZpcnN0VGltZSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JGaXJzdCAmJiBtT3V0QW5pbWF0aW9uICE9IG51bGwgJiYgY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtT3V0QW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmdldEFuaW1hdGlvbigpID09IG1JbkFuaW1hdGlvbikKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbmltYXRlID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhCmluZGV4IDgwMzQ5NjEuLmM2ZjZlODEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZygpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX1VTRVJfUFJFU0VOVC5lcXVhbHMoYWN0aW9uKSkgewogICAgICAgICAgICAgICAgIG1Vc2VyUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQoaW50IHZpc2liaWxpdHkpIHsKICAgICAgICAgc3VwZXIub25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKICAgICAgICAgbVZpc2libGUgPSB2aXNpYmlsaXR5ID09IFZJU0lCTEU7Ci0gICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDQsMTAgKzE0NCwyMiBAQAogICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZygpIHsKKyAgICAgICAgdXBkYXRlUnVubmluZyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc3RhcnQgb3Igc3RvcCBkaXNwYXRjaGluZyBmbGlwIHtAbGluayBNZXNzYWdlfSBiYXNlZAorICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGlwTm93IERldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gZXhlY3V0ZSB0aGUgYW5pbWF0aW9uIG5vdywgaW4KKyAgICAgKiAgICAgICAgICAgIGFkZGl0aW9uIHRvIHF1ZXVpbmcgZnV0dXJlIGZsaXBzLiBJZiBvbWl0dGVkLCBkZWZhdWx0cyB0bworICAgICAqICAgICAgICAgICAgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZyhib29sZWFuIGZsaXBOb3cpIHsKICAgICAgICAgYm9vbGVhbiBydW5uaW5nID0gbVZpc2libGUgJiYgbVN0YXJ0ZWQgJiYgbVVzZXJQcmVzZW50OwogICAgICAgICBpZiAocnVubmluZyAhPSBtUnVubmluZykgewogICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsKLSAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCk7CisgICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIGZsaXBOb3cpOwogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CiAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCmluZGV4IDNkZjQxOWEuLjQ1MGM5NjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKQEAgLTY2LDggKzY2LDkgQEAKICAqIHtAbGluayAjc2V0Wm9vbUluRW5hYmxlZChib29sZWFuKX0gYW5kIHtAbGluayAjc2V0Wm9vbU91dEVuYWJsZWQoYm9vbGVhbil9LgogICogPHA+CiAgKiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgd2l0aCBhIGN1c3RvbSBWaWV3LCBwbGVhc2UgY2FsbAotICoge0BsaW5rICNzZXRWaXNpYmxlKGJvb2xlYW4pIHNldFZpc2libGUoZmFsc2UpfSBmcm9tIHRoZQotICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9LgorICoge0BsaW5rICNzZXRWaXNpYmxlKGJvb2xlYW4pIHNldFZpc2libGUoZmFsc2UpfSBmcm9tCisgKiB7QGxpbmsgVmlldyNvbkRldGFjaGVkRnJvbVdpbmRvd30gYW5kIGZyb20ge0BsaW5rIFZpZXcjb25WaXNpYmlsaXR5Q2hhbmdlZH0KKyAqIHdoZW4gPGNvZGU+dmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEU8L2NvZGU+LgogICoKICAqLwogcHVibGljIGNsYXNzIFpvb21CdXR0b25zQ29udHJvbGxlciBpbXBsZW1lbnRzIFZpZXcuT25Ub3VjaExpc3RlbmVyIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU3BsaXRBY3Rpb25CYXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU3BsaXRBY3Rpb25CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFlNzkzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TcGxpdEFjdGlvbkJhci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uQmFyVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CisKKy8qKgorICogU3BsaXRBY3Rpb25CYXIgaXMgdGhlIEFjdGlvbkJhciBpbXBsZW1lbnRhdGlvbiB1c2VkCisgKiBieSBzbWFsbC1zY3JlZW4gZGV2aWNlcy4gSXQgZXhwZWN0cyB0byBzcGxpdCBjb250ZXh0dWFsCisgKiBtb2RlcyBhY3Jvc3MgYm90aCB0aGUgQWN0aW9uQmFyVmlldyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4KKyAqIGFuZCBhIGhvcml6b250YWwgTGluZWFyTGF5b3V0IGF0IHRoZSBib3R0b20gd2hpY2ggaXMgbm9ybWFsbHkKKyAqIGhpZGRlbi4KKyAqLworcHVibGljIGNsYXNzIFNwbGl0QWN0aW9uQmFyIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIEFjdGlvbkJhclZpZXcgbUFjdGlvblZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUNvbnRleHRWaWV3OworICAgIAorICAgIHB1YmxpYyBTcGxpdEFjdGlvbkJhcihBY3Rpb25CYXJWaWV3IHZpZXcsIExpbmVhckxheW91dCBjb250ZXh0VmlldykgeworICAgICAgICBtQWN0aW9uVmlldyA9IHZpZXc7CisgICAgICAgIG1Db250ZXh0VmlldyA9IGNvbnRleHRWaWV3OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyB2aWV3KSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEN1c3RvbU5hdmlnYXRpb25WaWV3KHZpZXcpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QpOworICAgICAgICBtQWN0aW9uVmlldy5zZXREcm9wZG93bkFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUodGl0bGUsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSwgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucyhvcHRpb25zKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKSB7CisgICAgICAgIGZpbmFsIGludCBjdXJyZW50ID0gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsgCisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKChvcHRpb25zICYgbWFzaykgfCAoY3VycmVudCAmIH5tYXNrKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0TmF2aWdhdGlvbk1vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXlPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQppbmRleCA5OTQxMGJjLi4wMDI1NTEyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKQEAgLTE4MiwyNCArMTgyLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IG1DdXJzb3JzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnNvcnNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJzb3JzW2ldLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFN0cmluZyhjb2x1bW4pOwpAQCAtMjM2LDYgKzIxOCwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1Bvd2VyUHJvZmlsZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1Bvd2VyUHJvZmlsZS5qYXZhCmluZGV4IDIzNjlkMjUuLjEyN2VkNjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9Qb3dlclByb2ZpbGUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUG93ZXJQcm9maWxlLmphdmEKQEAgLTEyNiw2ICsxMjYsMTEgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPV0VSX0NQVV9TUEVFRFMgPSAiY3B1LnNwZWVkcyI7CiAKKyAgICAvKioKKyAgICAgKiBCYXR0ZXJ5IGNhcGFjaXR5IGluIG1pbGxpQW1wSG91ciAobUFoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1dFUl9CQVRURVJZX0NBUEFDSVRZID0gImJhdHRlcnkuY2FwYWNpdHkiOworCiAgICAgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHNQb3dlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVZJQ0UgPSAiZGV2aWNlIjsKQEAgLTI0Myw2ICsyNDgsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhdHRlcnkgY2FwYWNpdHksIGlmIGF2YWlsYWJsZSwgaW4gbWlsbGkgQW1wIEhvdXJzLiBJZiBub3QgYXZhaWxhYmxlLAorICAgICAqIGl0IHJldHVybnMgemVyby4KKyAgICAgKiBAcmV0dXJuIHRoZSBiYXR0ZXJ5IGNhcGFjaXR5IGluIG1BaAorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0QmF0dGVyeUNhcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gZ2V0QXZlcmFnZVBvd2VyKFBPV0VSX0JBVFRFUllfQ0FQQUNJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzcGVlZHMgdGhhdCB0aGUgQ1BVIGNhbiBiZSBydW4gYXQuCisgICAgICogQHJldHVybgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtU3BlZWRTdGVwcygpIHsKICAgICAgICAgT2JqZWN0IHZhbHVlID0gc1Bvd2VyTWFwLmdldChQT1dFUl9DUFVfU1BFRURTKTsKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBEb3VibGVbXSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCmluZGV4IDVmNWM3YTQuLjM4MzYyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLm9zOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uU2FtcGxpbmdQcm9maWxlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKQEAgLTM1LDE1ICszNiwyNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24iOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gIi9kYXRhL3NuYXBzaG90cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3Igc25hcHNob3RXcml0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNhbXBsaW5nUHJvZmlsZXJIejsKKyAgICAKKyAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpck1hZGUgPSBmYWxzZTsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBhIHNuYXBzaG90IGlzIGJlaW5nIHBlcnNpc3RlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIHBlbmRpbmcgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKICAgICBzdGF0aWMgewotICAgICAgICBlbmFibGVkID0gIjEiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5zYW1wbGluZ19wcm9maWxlciIpKTsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgc2FtcGxpbmdQcm9maWxlckh6ID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoInBlcnNpc3Quc3lzLnByb2ZpbGVyX2h6IiwgMCk7CisgICAgICAgIGlmIChzYW1wbGluZ1Byb2ZpbGVySHogPiAwKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZW5hYmxlZC4iKTsKKyAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZW5hYmxlZC4gU2FtcGxpbmcgUHJvZmlsZXIgSHo6ICIgKyBzYW1wbGluZ1Byb2ZpbGVySHopOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZGlzYWJsZWQuIik7CiAgICAgICAgIH0KICAgICB9CkBAIC02MCw0NSArNzMsNDUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuOwotICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc3RhcnQoMTApOworICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc3RhcnQoc2FtcGxpbmdQcm9maWxlckh6KTsKICAgICB9CiAKLSAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBkaXJNYWRlID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyBiZWluZyBwZXJzaXN0ZWQuICovCi0gICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gcGVuZGluZzsKLQogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IHRvIHRoZSBTRCBjYXJkIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgorICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoZmluYWwgU3RyaW5nIHByb2Nlc3NOYW1lLCBmaW5hbCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewogICAgICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjsKIAogICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVlaW5nIGFub3RoZXIKKyAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZXVlaW5nIGFub3RoZXIKICAgICAgICAgICogcmVxdWVzdCByaWdodCBub3cuIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsCiAgICAgICAgICAqIHNuYXBzaG90cyBhbmQgaW4gdHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCAob25lIGJpZwogICAgICAgICAgKiBzbmFwc2hvdCBpcyBzbWFsbGVyIHRoYW4gTiBzdWJzZXQgc25hcHNob3RzKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghcGVuZGluZykgewotICAgICAgICAgICAgcGVuZGluZyA9IHRydWU7CisgICAgICAgIGlmIChwZW5kaW5nLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSAiL3NkY2FyZC9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHdyaXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRXcml0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aHkgeWV0LCBidXQgbW9kZSA3MjMgd291bGQgd29yaywgd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgNzIyIHRocm93cyBGaWxlTm90Rm91bmRFeGVjcHRpb24gYXQgbGluZSAxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJNYWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIGRpciArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBTTkFQU0hPVF9ESVIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KFNOQVBTSE9UX0RJUiwgcHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtMTEwLDEzICsxMjMsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVaeWdvdGVTbmFwc2hvdCgpIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIGRpciA9ICIvZGF0YS96eWdvdGUvc25hcHNob3RzIjsKLSAgICAgICAgbmV3IEZpbGUoZGlyKS5ta2RpcnMoKTsKLSAgICAgICAgd3JpdGVTbmFwc2hvdChkaXIsICJ6eWdvdGUiKTsKKyAgICAgICAgd3JpdGVTbmFwc2hvdCgienlnb3RlIiwgbnVsbCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgLyoqCisgICAgICogcGFzcyBpbiBQYWNrYWdlSW5mbyB0byByZXRyaWV2ZSB2YXJpb3VzIHZhbHVlcyBmb3Igc25hcHNob3QgaGVhZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgYnl0ZVtdIHNuYXBzaG90ID0gU2FtcGxpbmdQcm9maWxlci5nZXRJbnN0YW5jZSgpLnNuYXBzaG90KCk7CiAgICAgICAgIGlmIChzbmFwc2hvdCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMjgsMzkgKzE0MSw1NCBAQAogICAgICAgICAgKiB3ZSBjYXB0dXJlIHR3byBzbmFwc2hvdHMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KICAgICAgICAgICovCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lLnJlcGxhY2UoJzonLCAnLicpICsgIi0iICsKLSAgICAgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5zbmFwc2hvdCI7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZUFsbCgiOiIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZSArICItIiArU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVHJ5IHRvIG9wZW4gdGhlIGZpbGUgYSBmZXcgdGltZXMuIFRoZSBTRCBjYXJkIG1heSBub3QgYmUgbW91bnRlZC4KLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0OwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID4gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsgLyogaWdub3JlICovIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHNuYXBzaG90KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpOworICAgICAgICAgICAgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihuYW1lLCBwYWNrYWdlSW5mbywgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZShzbmFwc2hvdCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHdyaXRpbmcgc25hcHNob3QuIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gbGV0IGl0IGdvLgorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIHNldCBmaWxlIHJlYWRhYmxlIHRvIHRoZSB3b3JsZCBzbyB0aGF0IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlCisgICAgICAgIC8vIGNhbiBwdXQgaXQgdG8gZHJvcGJveAorICAgICAgICBuZXcgRmlsZShwYXRoKS5zZXRSZWFkYWJsZSh0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZW5lcmF0ZSBoZWFkZXIgZm9yIHNuYXBzaG90cywgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdCAobGlrZSBodHRwIGhlYWRlcik6CisgICAgICoKKyAgICAgKiBWZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgcHJvZmlsZXI+XG4KKyAgICAgKiBQcm9jZXNzOiA8cHJvY2VzcyBuYW1lPlxuCisgICAgICogUGFja2FnZTogPHBhY2thZ2UgbmFtZSwgaWYgZXhpc3RzPlxuCisgICAgICogUGFja2FnZS1WZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2UsIGlmIGV4aXN0cz5cbgorICAgICAqIEJ1aWxkOiA8ZmluZ2VycHJpbnQ+XG4KKyAgICAgKiBcbgorICAgICAqIDx0aGUgYWN0dWFsIHNuYXBzaG90IGNvbnRlbnQgYmVnaW5zIGhlcmUuLi4+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZVNuYXBzaG90SGVhZGVyKFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8sCisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHJvZmlsZXIgdmVyc2lvbgorICAgICAgICBvdXQud3JpdGUoIlZlcnNpb246IDFcbiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dC53cml0ZSgoIlByb2Nlc3M6ICIgKyBwcm9jZXNzTmFtZSArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICBpZihwYWNrYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoKCJQYWNrYWdlOiAiICsgcGFja2FnZUluZm8ucGFja2FnZU5hbWUgKyAiXG4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgoIlBhY2thZ2UtVmVyc2lvbjogIiArIHBhY2thZ2VJbmZvLnZlcnNpb25Db2RlICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKCgiQnVpbGQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICAvLyBzaW5nbGUgYmxhbmsgbGluZSBtZWFucyB0aGUgZW5kIG9mIHNuYXBzaG90IGhlYWRlci4KKyAgICAgICAgb3V0LndyaXRlKCJcbiIuZ2V0Qnl0ZXMoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKaW5kZXggYjY3N2IxZS4uOWZjZDNmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCkBAIC02NiwxMCArNjYsNiBAQAogICAgIC8qKiB3aGVuIHByZWxvYWRpbmcsIEdDIGFmdGVyIGFsbG9jYXRpbmcgdGhpcyBtYW55IGJ5dGVzICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRUxPQURfR0NfVEhSRVNIT0xEID0gNTAwMDA7CiAKLSAgICAvKiogdGhyb3cgb24gbWlzc2luZyBwcmVsb2FkLCBvbmx5IGlmIHRoaXMgbG9va3MgbGlrZSBhIGRldmVsb3BlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVEhST1dfT05fTUlTU0lOR19QUkVMT0FEID0KLSAgICAgICAgICAgICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3Quc2VydmljZS5hZGIuZW5hYmxlIikpOwotCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfU1RSSU5HID0KICAgICAgICAgICAgICIgPFwidHJ1ZVwifFwiZmFsc2VcIiBmb3Igc3RhcnRTeXN0ZW1TZXJ2ZXI+IjsKIApAQCAtMjg3LDcgKzI4Myw2IEBACiAKICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIFN0cmluZyBtaXNzaW5nQ2xhc3NlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcy4KICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwpAQCAtMzExLDEyICszMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDbGFzcyBub3QgZm91bmQgZm9yIHByZWxvYWRpbmc6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXNzaW5nQ2xhc3NlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NsYXNzZXMgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nQ2xhc3NlcyArPSAiICIgKyBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2xhc3Mgbm90IGZvdW5kIGZvciBwcmVsb2FkaW5nOiAiICsgbGluZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBwcmVsb2FkaW5nICIgKyBsaW5lICsgIi4iLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRXJyb3IpIHsKQEAgLTMyOSwxMyArMzE5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChUSFJPV19PTl9NSVNTSU5HX1BSRUxPQUQgJiYKLSAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NsYXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIGNsYXNzKGVzKSBmb3IgcHJlbG9hZGluZywgdXBkYXRlIHByZWxvYWRlZC1jbGFzc2VzIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaXNzaW5nQ2xhc3NlcyArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiLi4ucHJlbG9hZGVkICIgKyBjb3VudCArICIgY2xhc3NlcyBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKS1zdGFydFRpbWUpICsgIm1zLiIpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQppbmRleCBjNTk5ZDY4Li43MTM4YjVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMTE5Nyw2ICsxMTk3LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBhbmQgc2V0IE1lc3NhZ2UudGFyZ2V0ID0gdGhpcywKKyAgICAgKiB3aGF0LCBhcmcxIGFuZCBhcmcyCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hhdCAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS53aGF0CisgICAgICogQHBhcmFtIGFyZzEgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMQorICAgICAqIEBwYXJhbSBhcmcyICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzIKKyAgICAgKiBAcmV0dXJuICBBIE1lc3NhZ2Ugb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIG9idGFpbk1lc3NhZ2UoaW50IHdoYXQsIGludCBhcmcxLCBpbnQgYXJnMikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXNzYWdlLm9idGFpbihtSHNtSGFuZGxlciwgd2hhdCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBhbmQgc2V0IE1lc3NhZ2UudGFyZ2V0ID0gdGhpcywKKyAgICAgKiB3aGF0LCBhcmcxLCBhcmcyIGFuZCBvYmoKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEBwYXJhbSBvYmogaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5vYmoKKyAgICAgKiBAcmV0dXJuICBBIE1lc3NhZ2Ugb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIG9idGFpbk1lc3NhZ2UoaW50IHdoYXQsIGludCBhcmcxLCBpbnQgYXJnMiwgT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXNzYWdlLm9idGFpbihtSHNtSGFuZGxlciwgd2hhdCwgYXJnMSwgYXJnMiwgb2JqKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFbnF1ZXVlIGEgbWVzc2FnZSB0byB0aGlzIHN0YXRlIG1hY2hpbmUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2VuZE1lc3NhZ2UoaW50IHdoYXQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCmluZGV4IDhkOGRmMTYuLmUwMGE4NTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yODQsNiArMjg1LDI2IEBACiAKICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibGlzdCIpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVTZXRYbWwoU2V0IHZhbCwgU3RyaW5nIG5hbWUsIFhtbFNlcmlhbGl6ZXIgb3V0KQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInNldCIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuYW1lIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoT2JqZWN0IHYgOiB2YWwpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWVYbWwodiwgbnVsbCwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic2V0Iik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmxhdHRlbiBhIGJ5dGVbXSBpbnRvIGFuIFhtbFNlcmlhbGl6ZXIuICBUaGUgbGlzdCBjYW4gbGF0ZXIgYmUgcmVhZCBiYWNrCkBAIC00MjYsNiArNDQ3LDkgQEAKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgd3JpdGVMaXN0WG1sKChMaXN0KXYsIG5hbWUsIG91dCk7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkgeworICAgICAgICAgICAgd3JpdGVTZXRYbWwoKFNldCl2LCBuYW1lLCBvdXQpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgICAgIC8vIFhYWCBUaGlzIGlzIHRvIGFsbG93IHVzIHRvIGF0IGxlYXN0IHdyaXRlIHNvbWV0aGluZyBpZgogICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHN0eWxlZCB0ZXh0Li4uICBidXQgaXQgbWVhbnMgd2Ugd2lsbCBkcm9wIGFsbApAQCAtNDc2LDcgKzUwMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4gVGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KICAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBUaGUgcmVzdWx0aW5nIGxpc3QuCisgICAgICogQHJldHVybiBBcnJheUxpc3QgVGhlIHJlc3VsdGluZyBsaXN0LgogICAgICAqCiAgICAgICogQHNlZSAjcmVhZE1hcFhtbAogICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbApAQCAtNDkwLDYgKzUxNCwyOSBAQAogICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOwogICAgICAgICByZXR1cm4gKEFycmF5TGlzdClyZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKICAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgZnJvbSBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIFhNTC4gVGhlIHN0cmVhbSBjYW4KKyAgICAgKiBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIGJ5IHdyaXRlU2V0WG1sKCkuCisgICAgICogCisgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSByZXN1bHRpbmcgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbAorICAgICAqIEBzZWUgI3JlYWRUaGlzU2V0WG1sCisgICAgICogQHNlZSAjd3JpdGVTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFNldFhtbChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOworICAgICAgICByZXR1cm4gKEhhc2hTZXQpIHJlYWRWYWx1ZVhtbChwYXJzZXIsIG5ldyBTdHJpbmdbMV0pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgYSBIYXNoTWFwIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTU3Myw2ICs2MjAsNDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gVGhlIFhNTCBkYXRhIGNvdWxkIHByZXZpb3VzbHkKKyAgICAgKiBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHdyaXRlU2V0WG1sKCkuIFRoZSBYbWxQdWxsUGFyc2VyIG11c3QgYmUgcG9zaXRpb25lZAorICAgICAqIDxlbT5hZnRlcjwvZW0+IHRoZSB0YWcgdGhhdCBiZWdpbnMgdGhlIHNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBYbWxQdWxsUGFyc2VyIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgc2V0IGRhdGEuCisgICAgICogQHBhcmFtIGVuZFRhZyBOYW1lIG9mIHRoZSB0YWcgdGhhdCB3aWxsIGVuZCB0aGUgc2V0LCB1c3VhbGx5ICJzZXQiLgorICAgICAqIEBwYXJhbSBuYW1lIEFuIGFycmF5IG9mIG9uZSBzdHJpbmcsIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAqICAgICAgICAgICAgIG9mIHRoZSBzZXQncyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhc2hTZXQgVGhlIG5ld2x5IGdlbmVyYXRlZCBzZXQuCisgICAgICogCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSAjcmVhZFNldFhtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSGFzaFNldCByZWFkVGhpc1NldFhtbChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVuZFRhZywgU3RyaW5nW10gbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBwYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlYWRUaGlzVmFsdWVYbWwocGFyc2VyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBzZXQuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyB0byBzZXQ6ICIgKyB2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZW5kVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAiICsgZW5kVGFnICsgIiBlbmQgdGFnIGF0OiAiICsgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICB9IHdoaWxlIChldmVudFR5cGUgIT0gcGFyc2VyLkVORF9ET0NVTUVOVCk7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGFuIGludFtdIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTc0MCw2ICs4MjgsMTIgQEAKICAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CiAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIHJlcyA9IHJlYWRUaGlzU2V0WG1sKHBhcnNlciwgInNldCIsIG5hbWUpOworICAgICAgICAgICAgbmFtZVswXSA9IHZhbHVlTmFtZTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdmFsdWUgZm9yICIgKyB2YWx1ZU5hbWUgKyAiOiAiICsgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWc6ICIgKyB0YWdOYW1lKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0NGViYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnUgaW1wbGVtZW50cyBNZW51IHsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1F3ZXJ0eTsKKyAgICAKKyAgICBwcml2YXRlIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gbUl0ZW1zOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICByZXR1cm4gYWRkKDAsIDAsIDAsIHRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKGludCB0aXRsZVJlcykgeworICAgICAgICByZXR1cm4gYWRkKDAsIDAsIDAsIHRpdGxlUmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsIGludCB0aXRsZVJlcykgeworICAgICAgICByZXR1cm4gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyh0aXRsZVJlcykpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBncm91cElkLCBpdGVtSWQsIDAsIG9yZGVyLCB0aXRsZSk7CisgICAgICAgIG1JdGVtcy5hZGQob3JkZXIsIGl0ZW0pOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFkZEludGVudE9wdGlvbnMoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwKKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY2FsbGVyLCBJbnRlbnRbXSBzcGVjaWZpY3MsIEludGVudCBpbnRlbnQsIGludCBmbGFncywKKyAgICAgICAgICAgIE1lbnVJdGVtW10gb3V0U3BlY2lmaWNJdGVtcykgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb2x2ZUluZm8+IGxyaSA9CisgICAgICAgICAgICAgICAgcG0ucXVlcnlJbnRlbnRBY3Rpdml0eU9wdGlvbnMoY2FsbGVyLCBzcGVjaWZpY3MsIGludGVudCwgMCk7CisgICAgICAgIGZpbmFsIGludCBOID0gbHJpICE9IG51bGwgPyBscmkuc2l6ZSgpIDogMDsKKworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BUFBFTkRfVE9fR1JPVVApID09IDApIHsKKyAgICAgICAgICAgIHJlbW92ZUdyb3VwKGdyb3VwSWQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgZmluYWwgUmVzb2x2ZUluZm8gcmkgPSBscmkuZ2V0KGkpOworICAgICAgICAgICAgSW50ZW50IHJpbnRlbnQgPSBuZXcgSW50ZW50KAorICAgICAgICAgICAgICAgIHJpLnNwZWNpZmljSW5kZXggPCAwID8gaW50ZW50IDogc3BlY2lmaWNzW3JpLnNwZWNpZmljSW5kZXhdKTsKKyAgICAgICAgICAgIHJpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICByaS5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICByaS5hY3Rpdml0eUluZm8ubmFtZSkpOworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW0gaXRlbSA9IGFkZChncm91cElkLCBpdGVtSWQsIG9yZGVyLCByaS5sb2FkTGFiZWwocG0pKQorICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihyaS5sb2FkSWNvbihwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQocmludGVudCk7CisgICAgICAgICAgICBpZiAob3V0U3BlY2lmaWNJdGVtcyAhPSBudWxsICYmIHJpLnNwZWNpZmljSW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG91dFNwZWNpZmljSXRlbXNbcmkuc3BlY2lmaWNJbmRleF0gPSBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE47CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBtSXRlbXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgZmluZEl0ZW1JbmRleChpbnQgaWQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGl0ZW1zLmdldChpKS5nZXRJdGVtSWQoKSA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGZpbmRJdGVtKGludCBpZCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChmaW5kSXRlbUluZGV4KGlkKSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNWaXNpYmxlSXRlbXMoKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBmaW5kSXRlbVdpdGhTaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gVE9ETyBNYWtlIHRoaXMgc21hcnRlci4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBxd2VydHkgPSBtSXNRd2VydHk7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgZmluYWwgY2hhciBzaG9ydGN1dCA9IHF3ZXJ0eSA/IGl0ZW0uZ2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkgOgorICAgICAgICAgICAgICAgICAgICBpdGVtLmdldE51bWVyaWNTaG9ydGN1dCgpOworICAgICAgICAgICAgaWYgKGtleUNvZGUgPT0gc2hvcnRjdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3J0Y3V0S2V5KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICByZXR1cm4gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUlkZW50aWZpZXJBY3Rpb24oaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZmluZEl0ZW1JbmRleChpZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KS5pbnZva2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtU2hvcnRjdXQoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGZpbmRJdGVtV2l0aFNob3J0Y3V0KGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gaXRlbS5pbnZva2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChpbnQgZ3JvdXBJZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50KSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEdyb3VwSWQoKSA9PSBncm91cElkKSB7CisgICAgICAgICAgICAgICAgaXRlbXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIGl0ZW1Db3VudC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJdGVtKGludCBpZCkgeworICAgICAgICBtSXRlbXMucmVtb3ZlKGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cENoZWNrYWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gY2hlY2thYmxlLAorICAgICAgICAgICAgYm9vbGVhbiBleGNsdXNpdmUpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcm91cElkKCkgPT0gZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldENoZWNrYWJsZShjaGVja2FibGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RXhjbHVzaXZlQ2hlY2thYmxlKGV4Y2x1c2l2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cEVuYWJsZWQoaW50IGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcm91cElkKCkgPT0gZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cFZpc2libGUoaW50IGdyb3VwLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcm91cElkKCkgPT0gZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldFZpc2libGUodmlzaWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRd2VydHlNb2RlKGJvb2xlYW4gaXNRd2VydHkpIHsKKyAgICAgICAgbUlzUXdlcnR5ID0gaXNRd2VydHk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLnNpemUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkNWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51SXRlbSBpbXBsZW1lbnRzIE1lbnVJdGVtIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUdyb3VwOworICAgIHByaXZhdGUgZmluYWwgaW50IG1DYXRlZ29yeU9yZGVyOworICAgIHByaXZhdGUgZmluYWwgaW50IG1PcmRlcmluZzsKKyAgICAKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlQ29uZGVuc2VkOworICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dE51bWVyaWNDaGFyOworICAgIHByaXZhdGUgY2hhciBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICAKKyAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uRHJhd2FibGU7CisgICAgcHJpdmF0ZSBpbnQgbUljb25SZXNJZCA9IE5PX0lDT047CisgICAgCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIAorICAgIHByaXZhdGUgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbUNsaWNrTGlzdGVuZXI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0lDT04gPSAwOworICAgIAorICAgIHByaXZhdGUgaW50IG1GbGFncyA9IEVOQUJMRUQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLQUJMRSAgICAgID0gMHgwMDAwMDAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tFRCAgICAgICAgPSAweDAwMDAwMDAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVVNJVkUgICAgICA9IDB4MDAwMDAwMDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJRERFTiAgICAgICAgID0gMHgwMDAwMDAwODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRCAgICAgICAgPSAweDAwMDAwMDEwOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbShDb250ZXh0IGNvbnRleHQsIGludCBncm91cCwgaW50IGlkLCBpbnQgY2F0ZWdvcnlPcmRlciwgaW50IG9yZGVyaW5nLAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIG1Hcm91cCA9IGdyb3VwOworICAgICAgICBtQ2F0ZWdvcnlPcmRlciA9IGNhdGVnb3J5T3JkZXI7CisgICAgICAgIG1PcmRlcmluZyA9IG9yZGVyaW5nOworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGNoYXIgZ2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkgeworICAgICAgICByZXR1cm4gbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRHcm91cElkKCkgeworICAgICAgICByZXR1cm4gbUdyb3VwOworICAgIH0KKworICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRJY29uKCkgeworICAgICAgICByZXR1cm4gbUljb25EcmF3YWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJdGVtSWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgcHVibGljIENvbnRleHRNZW51SW5mbyBnZXRNZW51SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgZ2V0TnVtZXJpY1Nob3J0Y3V0KCkgeworICAgICAgICByZXR1cm4gbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1PcmRlcmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBnZXRTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGVDb25kZW5zZWQoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGVDb25kZW5zZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViTWVudSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2thYmxlKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIENIRUNLQUJMRSkgIT0gMDsgCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIENIRUNLRUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIEVOQUJMRUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIEhJRERFTikgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KGNoYXIgYWxwaGFDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyID0gYWxwaGFDaGFyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0Q2hlY2thYmxlKGJvb2xlYW4gY2hlY2thYmxlKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+Q0hFQ0tBQkxFKSB8IChjaGVja2FibGUgPyBDSEVDS0FCTEUgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbSBzZXRFeGNsdXNpdmVDaGVja2FibGUoYm9vbGVhbiBleGNsdXNpdmUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5FWENMVVNJVkUpIHwgKGV4Y2x1c2l2ZSA/IEVYQ0xVU0lWRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0VEKSB8IChjaGVja2VkID8gQ0hFQ0tFRCA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5FTkFCTEVEKSB8IChlbmFibGVkID8gRU5BQkxFRCA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIG1JY29uRHJhd2FibGUgPSBpY29uOworICAgICAgICBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEljb24oaW50IGljb25SZXMpIHsKKyAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXM7CisgICAgICAgIG1JY29uRHJhd2FibGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShpY29uUmVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXROdW1lcmljU2hvcnRjdXQoY2hhciBudW1lcmljQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbWVudUl0ZW1DbGlja0xpc3RlbmVyKSB7CisgICAgICAgIG1DbGlja0xpc3RlbmVyID0gbWVudUl0ZW1DbGlja0xpc3RlbmVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0U2hvcnRjdXQoY2hhciBudW1lcmljQ2hhciwgY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0TnVtZXJpY0NoYXIgPSBudW1lcmljQ2hhcjsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRUaXRsZShpbnQgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlQ29uZGVuc2VkKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGVDb25kZW5zZWQgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiBISURERU4pIHwgKHZpc2libGUgPyAwIDogSElEREVOKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52b2tlKCkgeworICAgICAgICBpZiAobUNsaWNrTGlzdGVuZXIgIT0gbnVsbCAmJiBtQ2xpY2tMaXN0ZW5lci5vbk1lbnVJdGVtQ2xpY2sodGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KG1JbnRlbnQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ5ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW1WaWV3IGV4dGVuZHMgSW1hZ2VCdXR0b24gaW1wbGVtZW50cyBNZW51Vmlldy5JdGVtVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51SXRlbVZpZXciOworICAgIAorICAgIHByaXZhdGUgTWVudUl0ZW1JbXBsIG1JdGVtRGF0YTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBNZW51QnVpbGRlci5JdGVtSW52b2tlciBtSXRlbUludm9rZXI7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQnV0dG9uU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUl0ZW1JbXBsIGl0ZW1EYXRhLCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbUl0ZW1EYXRhID0gaXRlbURhdGE7CisgICAgICAgIAorICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0VGl0bGUoaXRlbURhdGEuZ2V0VGl0bGUoKSk7CisgICAgICAgIHNldEljb24oaXRlbURhdGEuZ2V0SWNvbigpKTsKKyAgICAgICAgc2V0SWQoaXRlbURhdGEuZ2V0SXRlbUlkKCkpOworICAgICAgICAKKyAgICAgICAgc2V0VmlzaWJpbGl0eShpdGVtRGF0YS5pc1Zpc2libGUoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIHNldEVuYWJsZWQoaXRlbURhdGEuaXNFbmFibGVkKCkpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7CisgICAgICAgIC8vIExldCB0aGUgdmlldydzIGxpc3RlbmVyIGhhdmUgdG9wIHByaW9yaXR5CisgICAgICAgIGlmIChzdXBlci5wZXJmb3JtQ2xpY2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSXRlbUludm9rZXIgIT0gbnVsbCAmJiBtSXRlbUludm9rZXIuaW52b2tlSXRlbShtSXRlbURhdGEpKSB7CisgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QoU291bmRFZmZlY3RDb25zdGFudHMuQ0xJQ0spOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUludm9rZXIoTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgaW52b2tlcikgeworICAgICAgICBtSXRlbUludm9rZXIgPSBpbnZva2VyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByZWZlcnNDb25kZW5zZWRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICAvLyBUT0RPIFN1cHBvcnQgY2hlY2thYmxlIGFjdGlvbiBpdGVtcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIHNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoYm9vbGVhbiBzaG93U2hvcnRjdXQsIGNoYXIgc2hvcnRjdXRLZXkpIHsKKyAgICAgICAgLy8gQWN0aW9uIGJ1dHRvbnMgZG9uJ3Qgc2hvdyB0ZXh0IGZvciBzaG9ydGN1dCBrZXlzLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93c0ljb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDI3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgTWVudUJ1aWxkZXIuSXRlbUludm9rZXIsIE1lbnVWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbk1lbnVWaWV3IjsKKyAgICAKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworCisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1QYWRkaW5nOworICAgIHByaXZhdGUgaW50IG1JdGVtTWFyZ2luOworICAgIHByaXZhdGUgaW50IG1NYXhJdGVtczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWUpOworICAgICAgICBtSXRlbVBhZGRpbmcgPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbkJ1dHRvblBhZGRpbmcsIDApOworICAgICAgICBtSXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZyAvIDI7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5hY3Rpb25faWNvbl9zaXplKTsKKyAgICAgICAgZmluYWwgaW50IHNwYWNlQXZhaWxhYmxlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMgLyAyOworICAgICAgICBmaW5hbCBpbnQgaXRlbVNwYWNlID0gc2l6ZSArIG1JdGVtUGFkZGluZzsgCisgICAgICAgIAorICAgICAgICBtTWF4SXRlbXMgPSBzcGFjZUF2YWlsYWJsZSAvIChpdGVtU3BhY2UgPiAwID8gaXRlbVNwYWNlIDogMSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgcDsKKyAgICAgICAgICAgIHJldHVybiBscC5sZWZ0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmIGxwLnJpZ2h0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmCisgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoID09IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgJiYgbHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgcGFyYW1zLmxlZnRNYXJnaW4gPSBtSXRlbU1hcmdpbjsKKyAgICAgICAgcGFyYW1zLnJpZ2h0TWFyZ2luID0gbUl0ZW1NYXJnaW47CisgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRJdGVtTWFyZ2luKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1NYXJnaW47CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52b2tlSXRlbShNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gbU1lbnUucGVyZm9ybUl0ZW1BY3Rpb24oaXRlbSwgMCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXaW5kb3dBbmltYXRpb25zKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1lbnVCdWlsZGVyIG1lbnUsIGludCBtZW51VHlwZSkgeworICAgICAgICBtZW51LnNldE1heEFjdGlvbkl0ZW1zKG1NYXhJdGVtcyk7CisgICAgICAgIG1NZW51ID0gbWVudTsKKyAgICAgICAgdXBkYXRlQ2hpbGRyZW4odHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2hpbGRyZW4oYm9vbGVhbiBjbGVhcmVkKSB7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldEFjdGlvbkl0ZW1zKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtc1RvU2hvdy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbURhdGEgPSBpdGVtc1RvU2hvdy5nZXQoaSk7CisgICAgICAgICAgICBhZGRJdGVtVmlldygoQWN0aW9uTWVudUl0ZW1WaWV3KSBpdGVtRGF0YS5nZXRJdGVtVmlldyhNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sCisgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtVmlldyhBY3Rpb25NZW51SXRlbVZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldEl0ZW1JbnZva2VyKHRoaXMpOworICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCmluZGV4IGJlYjU3YmEuLmJiZjdjNjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgYSBjbGVhciByZWZyZXNoIG9mIGNoaWxkcmVuCiAgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldFZpc2libGVJdGVtcygpOworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldE5vbkFjdGlvbkl0ZW1zKCk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtcyA9IGl0ZW1zVG9TaG93LnNpemUoKTsKICAgICAgICAgZmluYWwgaW50IG51bUl0ZW1zVGhhdENhbkZpdCA9IG1NYXhJdGVtczsKICAgICAgICAgLy8gTWluaW11bSBvZiB0aGUgbnVtIHRoYXQgY2FuIGZpdCBhbmQgdGhlIG51bSB0aGF0IHdlIGhhdmUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQppbmRleCAyMjhkNWQwLi5hOTYyMjEyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCkBAIC0yNywxNiArMjcsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CkBAIC01NCw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJNZW51QnVpbGRlciI7CiAgICAgCiAgICAgLyoqIFRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG1lbnUgdHlwZXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDQ7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBpY29uIG1lbnUgdmlldyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUNPTiA9IDA7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBleHBhbmRlZCBtZW51IHZpZXcgKi8KQEAgLTY1LDYgKzY2LDExIEBACiAgICAgICogaGF2ZSBhbiBJdGVtVmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RJQUxPRyA9IDI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBidXR0b24gaW4gdGhlIGFwcGxpY2F0aW9uJ3MgYWN0aW9uIGJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDVElPTl9CVVRUT04gPSAzOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKICAgICAKQEAgLTczLDYgKzc5LDcgQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9JY29uTWVudSwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9FeHBhbmRlZE1lbnUsCiAgICAgICAgIDAsCisgICAgICAgIDAsCiAgICAgfTsKICAgICAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTgwLDYgKzg3LDcgQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuaWNvbl9tZW51X2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZXhwYW5kZWRfbWVudV9sYXlvdXQsCiAgICAgICAgIDAsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2xheW91dCwKICAgICB9OwogCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC04Nyw2ICs5NSw3IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSAgc0NhdGVnb3J5VG9PcmRlciA9IG5ldyBpbnRbXSB7CkBAIC0xMzAsNiArMTM5LDI0IEBACiAgICAgICogZmV0Y2hlZCBmcm9tIHtAbGluayAjZ2V0VmlzaWJsZUl0ZW1zKCl9CiAgICAgICovIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlSXRlbXNTdGFsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvbmx5IHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgaXRlbXMgdGhhdCBzaG91bGQgTk9UIGFwcGVhciBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IG1Ob25BY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpc2libGUgYWN0aW9uIGJ1dHRvbnMgcGVybWl0dGVkIGluIHRoaXMgbWVudQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1NYXhBY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbXMgKG9yIGFueSBvbmUgaXRlbSdzIGFjdGlvbiBzdGF0ZSkgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzCisgICAgICogbGFzdCBmZXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25JdGVtc1N0YWxlOwogCiAgICAgLyoqCiAgICAgICogQ3VycmVudCB1c2UgY2FzZSBpcyBDb250ZXh0IE1lbnVzOiBBcyBWaWV3cyBwb3B1bGF0ZSB0aGUgY29udGV4dCBtZW51LCBlYWNoIG9uZSBoYXMKQEAgLTI4MSw2ICszMDgsMTAgQEAKICAgICAgICAgbVZpc2libGVJdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOwogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgIAorICAgICAgICBtQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbU5vbkFjdGlvbkl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICAKICAgICAgICAgbVNob3J0Y3V0c1Zpc2libGUgPQogICAgICAgICAgICAgICAgIChtUmVzb3VyY2VzLmdldENvbmZpZ3VyYXRpb24oKS5rZXlib2FyZCAhPSBDb25maWd1cmF0aW9uLktFWUJPQVJEX05PS0VZUyk7CiAgICAgfQpAQCAtOTAwLDYgKzkzMSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIG9uSXRlbXNDaGFuZ2VkKGJvb2xlYW4gY2xlYXJlZCkgewogICAgICAgICBpZiAoIW1QcmV2ZW50RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQpIHsKICAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzVmlzaWJsZUl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPT0gZmFsc2UpIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBNZW51VHlwZVtdIG1lbnVUeXBlcyA9IG1NZW51VHlwZXM7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9UWVBFUzsgaSsrKSB7CkBAIC05MjAsNiArOTUyLDE1IEBACiAgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZW51SXRlbUltcGx9IHdoZW4gaXRzIGFjdGlvbiByZXF1ZXN0IHN0YXR1cyBpcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgaGFzIGdvbmUgdGhyb3VnaCBhIGNoYW5nZSBpbiBhY3Rpb24gcmVxdWVzdCBzdGF0dXMuCisgICAgICovCisgICAgdm9pZCBvbkl0ZW1BY3Rpb25SZXF1ZXN0Q2hhbmdlZChNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICAvLyBOb3RpZnkgb2YgaXRlbXMgYmVpbmcgY2hhbmdlZAorICAgICAgICBvbkl0ZW1zQ2hhbmdlZChmYWxzZSk7CisgICAgfQorICAgIAogICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldFZpc2libGVJdGVtcygpIHsKICAgICAgICAgaWYgKCFtSXNWaXNpYmxlSXRlbXNTdGFsZSkgcmV0dXJuIG1WaXNpYmxlSXRlbXM7CiAgICAgICAgIApAQCAtOTM0LDkgKzk3NSw2NCBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKCkgeworICAgICAgICBpZiAoIW1Jc0FjdGlvbkl0ZW1zU3RhbGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gdmlzaWJsZUl0ZW1zID0gZ2V0VmlzaWJsZUl0ZW1zKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtc1NpemUgPSB2aXNpYmxlSXRlbXMuc2l6ZSgpOworICAgICAgICBpbnQgbWF4QWN0aW9ucyA9IG1NYXhBY3Rpb25JdGVtczsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXNTaXplOyBpKyspIHsKKyAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gdmlzaWJsZUl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLnJlcXVpcmVzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUFjdGlvbkl0ZW1zLmNsZWFyKCk7CisgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5pc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU5vbkFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXRBY3Rpb25JdGVtcygpIHsKKyAgICAgICAgZmxhZ0FjdGlvbkl0ZW1zKCk7CisgICAgICAgIHJldHVybiBtQWN0aW9uSXRlbXM7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldE5vbkFjdGlvbkl0ZW1zKCkgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMoKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQppbmRleCA5YjU4MjA1Li5kYzFlODFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKQEAgLTc0LDYgKzc0LDE1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTX0FDVElPTiAgICAgID0gMHgwMDAwMDAyMDsKKyAgICAKKyAgICAvKgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhdHRycy54bWwgZW51bSBjb25zdGFudHMgZm9yIHNob3dBc0FjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9ORVZFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0lGX1JPT00gPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9BTFdBWVMgPSAyOworICAgIHByaXZhdGUgaW50IG1TaG93QXNBY3Rpb24gPSBTSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIC8qKiBVc2VkIGZvciB0aGUgaWNvbiByZXNvdXJjZSBJRCBpZiB0aGlzIGl0ZW0gZG9lcyBub3QgaGF2ZSBhbiBpY29uICovCiAgICAgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKQEAgLTYzMCw0ICs2MzksMzUgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTaG93SWNvbihpbnQgbWVudVR5cGUpIHsKICAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fCBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBJU19BQ1RJT04pID09IElTX0FDVElPTiB8fCByZXF1aXJlc0FjdGlvbkJ1dHRvbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0c0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fSUZfUk9PTTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBY3Rpb25CdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtU2hvd0FzQWN0aW9uID09IFNIT1dfQVNfQUNUSU9OX0FMV0FZUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGlvbkJ1dHRvbihib29sZWFuIGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgIGlmIChpc0FjdGlvbkJ1dHRvbikgeworICAgICAgICAgICAgbUZsYWdzIHw9IElTX0FDVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFncyAmPSB+SVNfQUNUSU9OOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFVzZWQgYnkgTWVudUluZmxhdGVyIHRvIHNldCBob3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBwcmVzZW5jZSBvZgorICAgICAqIGFuIEFjdGlvbiBCYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aW9uRW51bSBFbnVtIGZsYWcgYXMgZGVmaW5lZCBpbiBhdHRycy54bWwvU0hPV19BU18gY29uc3RhbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSkgeworICAgICAgICBtU2hvd0FzQWN0aW9uID0gYWN0aW9uRW51bTsKKyAgICAgICAgbU1lbnUub25JdGVtQWN0aW9uUmVxdWVzdENoYW5nZWQodGhpcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMTQ2Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEhlYWRlciB1c2VkIGFjcm9zcyBzeXN0ZW0gZm9yIGRpc3BsYXlpbmcgYSB0aXRsZSBiYXIgd2l0aCBjb250YWN0IGluZm8uIFlvdQotICogY2FuIGJpbmQgc3BlY2lmaWMgdmFsdWVzIG9uIHRoZSBoZWFkZXIsIG9yIHVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlCi0gKiB7QGxpbmsgI2JpbmRGcm9tQ29udGFjdElkKGxvbmcpfSB0byBwb3B1bGF0ZSBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIHBhcmVudCBtdXN0IHJlcXVlc3QgdGhlIHtAbGluayBNYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfQ09OVEFDVFN9Ci0gKiBwZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWN0IGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWN0SGVhZGVyV2lkZ2V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RIZWFkZXJXaWRnZXQiOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGlzcGxheU5hbWVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWdncmVnYXRlQmFkZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUGhvbmV0aWNOYW1lVmlldzsKLSAgICBwcml2YXRlIENoZWNrQm94IG1TdGFycmVkVmlldzsKLSAgICBwcml2YXRlIFF1aWNrQ29udGFjdEJhZGdlIG1QaG90b1ZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVByZXNlbmNlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c0F0dHJpYnV0aW9uVmlldzsKLSAgICBwcml2YXRlIGludCBtTm9QaG90b1Jlc291cmNlOwotICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXJpIG1Db250YWN0VXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1FeGNsdWRlTWltZXMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIGEgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEhlYWRlckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QaG90b0NsaWNrKFZpZXcgdmlldyk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheU5hbWVDbGljayhWaWV3IHZpZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGFjdEhlYWRlckxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29udGFjdFF1ZXJ5IHsKLSAgICAgICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IGluZm8gaW4gdGhlIGhlYWRlci4KLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuU1RBUlJFRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfTEFCRUwsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBfSUQgPSAwOwotICAgICAgICBpbnQgTE9PS1VQX0tFWSA9IDE7Ci0gICAgICAgIGludCBQSE9UT19JRCA9IDI7Ci0gICAgICAgIGludCBESVNQTEFZX05BTUUgPSAzOwotICAgICAgICBpbnQgUEhPTkVUSUNfTkFNRSA9IDQ7Ci0gICAgICAgIC8vVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB3ZSdyZSBnb2luZyB0byBnZXQgdGhlIHBob25ldGljIG5hbWUuCi0gICAgICAgIC8vc3RhdGljIGZpbmFsIGludCBIRUFERVJfUEhPTkVUSUNfTkFNRV9DT0xVTU5fSU5ERVgKLSAgICAgICAgaW50IFNUQVJSRUQgPSA1OwotICAgICAgICBpbnQgQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMgPSA2OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVMgPSA3OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QID0gODsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFID0gOTsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX0xBQkVMID0gMTA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUGhvdG9RdWVyeSB7Ci0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgUGhvdG8uUEhPVE8KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgUEhPVE8gPSAwOwotICAgIH0KLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBwaG9uZSBudW1iZXIKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmVMb29rdXAuX0lELAotICAgICAgICBQaG9uZUxvb2t1cC5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gZW1haWwgYWRkcmVzcwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBSYXdDb250YWN0cy5DT05UQUNUX0lELAotICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUX0xPT0tVUF9JRF9DT0xVTU5fSU5ERVggPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0NPTlRBQ1RfSU5GTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT05FX0xPT0tVUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VNQUlMX0xPT0tVUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT1RPX1FVRVJZID0gMzsKLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQotICAgICAgICAgICAgKExheW91dEluZmxhdGVyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRhY3RfaGVhZGVyLCB0aGlzKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlID0gZmluZFZpZXdCeUlkKFIuaWQuYWdncmVnYXRlX2JhZGdlKTsKLQotICAgICAgICBtUGhvbmV0aWNOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucGhvbmV0aWNfbmFtZSk7Ci0KLSAgICAgICAgbVN0YXJyZWRWaWV3ID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLnN0YXIpOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1QaG90b1ZpZXcgPSAoUXVpY2tDb250YWN0QmFkZ2UpIGZpbmRWaWV3QnlJZChSLmlkLnBob3RvKTsKLQotICAgICAgICBtUHJlc2VuY2VWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJlc2VuY2UpOwotCi0gICAgICAgIG1TdGF0dXNWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX2RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGhvdG8gd2l0aCBhIHJhbmRvbSAibm8gY29udGFjdCIgaW1hZ2UKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgaW50IG51bSA9IChpbnQpIG5vdyAmIDB4ZjsKLSAgICAgICAgaWYgKG51bSA8IDkpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSByaWdodCwgY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmU7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtIDwgMTQpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSBsZWZ0IHVuY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIHRoZSB0b3AsIHJhcmUKLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUNsaWNrTGlzdGVuZXJzKCkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVBob3RvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBnaXZlbiB7QGxpbmsgQ29udGFjdEhlYWRlckxpc3RlbmVyfSB0byBoYW5kbGUgaGVhZGVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0SGVhZGVyTGlzdGVuZXIoQ29udGFjdEhlYWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGhvdG9DbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25QaG90b0NsaWNrKG1QaG90b1ZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlOYW1lQ2xpY2sobURpc3BsYXlOYW1lVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyAhPSBtUXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUXVlcnlDb21wbGV0ZTogZGlzY2FyZCByZXN1bHQsIHRoZSBxdWVyeSBoYW5kbGVyIGlzIHJlc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT1RPX1FVRVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcGhvdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBwaG90b0JpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnNvci5pc051bGwoUGhvdG9RdWVyeS5QSE9UTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGhvdG9EYXRhID0gY3Vyc29yLmdldEJsb2IoUGhvdG9RdWVyeS5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShwaG90b0RhdGEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0RhdGEubGVuZ3RoLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvQml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChwaG90b0JpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NPTlRBQ1RfSU5GTzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZENvbnRhY3RJbmZvKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGxvb2t1cFVyaSA9IENvbnRhY3RzLmdldExvb2t1cFVyaShjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkxPT0tVUF9LRVkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGhvdG9JZCA9IGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5QSE9UT19JRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9JZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAobG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQaG90b1F1ZXJ5KHBob3RvSWQsIGxvb2t1cFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT05FX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKHBob25lTnVtYmVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tUGhvbmUocGhvbmVOdW1iZXIsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9FTUFJTF9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUoZW1haWxBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tRW1haWwoZW1haWxBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgYWdncmVnYXRlIGJhZGdlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0FnZ3JlZ2F0ZUJhZGdlKGJvb2xlYW4gc2hvd0JhZ2RlKSB7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZS5zZXRWaXNpYmlsaXR5KHNob3dCYWdkZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgc3RhciBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTdGFyKGJvb2xlYW4gc2hvd1N0YXIpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N0YXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc3RhcnJlZCBzdGF0ZSBvZiB0aGlzIGhlYWRlciB3aWRnZXQuIFRoaXMgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9IHZhbHVlLCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFyZWQoYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcHJlc2VuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VuY2UoaW50IHByZXNlbmNlKSB7Ci0gICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpKSB7Ci0gICAgICAgIHNldENvbnRhY3RVcmkodXJpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpLCBib29sZWFuIHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gdXJpOwotICAgICAgICBpZiAoc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwaG90byB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlCi0gICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG90byhCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmV0aWMgbmFtZSB0byBzaG93IGluIHRoZSBoZWFkZXIuCi0gICAgICogVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShDaGFyU2VxdWVuY2UgZGlzcGxheU5hbWUsIENoYXJTZXF1ZW5jZSBwaG9uZXRpY05hbWUpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRUZXh0KGRpc3BsYXlOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY05hbWUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRUZXh0KHBob25ldGljTmFtZSk7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHNvY2lhbCBzbmlwcGV0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvY2lhbFNuaXBwZXQoQ2hhclNlcXVlbmNlIHNuaXBwZXQpIHsKLSAgICAgICAgaWYgKHNuaXBwZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHNuaXBwZXQpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBzcGVjaWZpYyBNSU1FLXR5cGVzIHRvIGV4Y2x1ZGUgYW5kIG5vdCBkaXNwbGF5LiBGb3IKLSAgICAgKiBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGhpZGUgdGhlIHtAbGluayBDb250YWN0cyNDT05URU5UX0lURU1fVFlQRX0KLSAgICAgKiBwcm9maWxlIGljb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1pbWVzKFN0cmluZ1tdIGV4Y2x1ZGVNaW1lcykgewotICAgICAgICBtRXhjbHVkZU1pbWVzID0gZXhjbHVkZU1pbWVzOwotICAgICAgICBtUGhvdG9WaWV3LnNldEV4Y2x1ZGVNaW1lcyhleGNsdWRlTWltZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdExvb2t1cFVyaSBhIHtDb250YWN0cy5DT05URU5UX0xPT0tVUF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUNvbnRhY3RMb29rdXBVcmkoVXJpIGNvbnRhY3RMb29rdXBVcmkpIHsKLSAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoY29udGFjdExvb2t1cFVyaSwgdHJ1ZSAvKiByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBtQ29udGFjdFVyaSA9IGNvbnRhY3RVcmk7Ci0gICAgICAgIHN0YXJ0Q29udGFjdFF1ZXJ5KGNvbnRhY3RVcmksIHJlc2V0UXVlcnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIGVtYWlsCi0gICAgICogYWRkcmVzcywgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUVtYWlsKFN0cmluZyBlbWFpbEFkZHJlc3MpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9FTUFJTF9MT09LVVAsIGVtYWlsQWRkcmVzcywKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChFbWFpbC5DT05URU5UX0xPT0tVUF9VUkksIFVyaS5lbmNvZGUoZW1haWxBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBwaG9uZSBudW1iZXIgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBwaG9uZQotICAgICAqIG51bWJlciwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbVBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9ORV9MT09LVVAsIG51bWJlciwKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksIFVyaS5lbmNvZGUobnVtYmVyKSksCi0gICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0Q29udGFjdFF1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBieSBVcmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29udGFjdFF1ZXJ5KFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NPTlRBQ1RfSU5GTywgY29udGFjdFVyaSwgY29udGFjdFVyaSwgQ29udGFjdFF1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRQaG90b1F1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBwaG90byBieSBwaG90byBpZCBhbmQgdXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBob3RvSWQgdGhlIHBob3RvIGlkLgotICAgICAqIEBwYXJhbSBsb29rdXBLZXkgdGhlIGxvb2t1cCB1cmkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFBob3RvUXVlcnkobG9uZyBwaG90b0lkLCBVcmkgbG9va3VwS2V5LCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT1RPX1FVRVJZLCBsb29rdXBLZXksCi0gICAgICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgcGhvdG9JZCksIFBob3RvUXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZm9yY2UgdGhpcyB3aWRnZXQgdG8gZm9yZ2V0IGV2ZXJ5dGhpbmcgaXQga25vd3MgYWJvdXQgdGhlIGNvbnRhY3QuCi0gICAgICogV2UgbmVlZCB0byBzdG9wIGFueSBleGlzdGluZyBhc3luYyBxdWVyaWVzIGZvciBwaG9uZSwgZW1haWwsIGNvbnRhY3QsIGFuZCBwaG90b3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2lwZUNsZWFuKCkgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgc2V0UHJlc2VuY2UoMCk7Ci0gICAgICAgIG1Db250YWN0VXJpID0gbnVsbDsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpIHsKLSAgICAgICAgLy8gdGhlIGFwaSBBc3luY1F1ZXJ5SGFuZGxlci5jYW5jZWxPcGVyYXRpb24oKSBkb2Vzbid0IHJlYWxseSB3b3JrLiBTaW5jZSB3ZSByZWFsbHkKLSAgICAgICAgLy8gbmVlZCB0aGUgb2xkIGFzeW5jIHF1ZXJpZXMgdG8gYmUgY2FuY2VsbGVkLCBsZXQncyBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gICAgICAgIG1RdWVyeUhhbmRsZXIgPSBuZXcgUXVlcnlIYW5kbGVyKG1Db250ZW50UmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGNvbnRhY3QgZGV0YWlscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmluZENvbnRhY3RJbmZvKEN1cnNvciBjKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5ESVNQTEFZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LlBIT05FVElDX05BTUUpOwotICAgICAgICB0aGlzLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lLCBwaG9uZXRpY05hbWUpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnJlZCA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5TVEFSUkVEKSAhPSAwOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLQotICAgICAgICAvL1NldCB0aGUgcHJlc2VuY2Ugc3RhdHVzCi0gICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKSkgewotICAgICAgICAgICAgaW50IHByZXNlbmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCB0aGUgc3RhdHVzIHVwZGF0ZQotICAgICAgICBTdHJpbmcgc3RhdHVzID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHN0YXR1cyk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aW1lc3RhbXAgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRlID0gYy5nZXRMb25nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkYXRlL3RpbWUgZmllbGQgYnkgbWl4aW5nIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHRpbWVzLgotICAgICAgICAgICAgICAgIGludCBmbGFncyA9IERhdGVVdGlscy5GT1JNQVRfQUJCUkVWX1JFTEFUSVZFOwotCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBEYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUywgZmxhZ3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGFja2FnZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSk7Ci0gICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzb3VyY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlc1BhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihyZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBwYWNrYWdlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzUGFja2FnZSArICJAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXR0cmlidXRpb247Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID09IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFRleHQoYXR0cmlidXRpb24pOwotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgc3dpdGNoICh2aWV3LmdldElkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFyOiB7Ci0gICAgICAgICAgICAgICAgLy8gVG9nZ2xlICJzdGFycmVkIiBzdGF0ZQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvbnRhY3QKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRhY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KENvbnRhY3RzLlNUQVJSRUQsIG1TdGFycmVkVmlldy5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKG1Db250YWN0VXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5waG90bzogewotICAgICAgICAgICAgICAgIHBlcmZvcm1QaG90b0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQubmFtZTogewotICAgICAgICAgICAgICAgIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpdG1hcCBsb2FkUGxhY2Vob2xkZXJQaG90byhCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBpZiAobU5vUGhvdG9SZXNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlLCBvcHRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQppbmRleCBmYTQ3ZmY2Li4yM2UyMjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CkBAIC0zOSw3ICszOSw3IEBACiAvKioKICAqIERpc3BsYXlzIHRoZSB0aW1lCiAgKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIFJlbGF0aXZlTGF5b3V0IHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMTIgPSAiaDptbSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0yNCA9ICJrazptbSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IGRiYmQyODYuLjBiNjJhNjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC05Miw2ICs5Miw4IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfVFlQRV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF90eXBlIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DS19QQVNTV09SRF9TQUxUX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3NhbHQiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX0hJU1RPUllfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRoaXN0b3J5IjsKKwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKQEAgLTEzOCw2ICsxNDAsMzMgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTGV0dGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1OdW1lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1TeW1ib2xzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcGFzc3dvcmQgbW9kZSwgYXMgc2V0IGJ5IGtleWd1YXJkIGFmdGVyIHVwZGF0aW5nIHRoZSBwYXNzd29yZC4KICAgICAgKgpAQCAtMjAyLDggKzIzMSwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGZpbGUgZXhpc3RzIGFuZCBjb250YWlucyBhbnkgZGF0YS4gUmV0dXJucyB0cnVlIGlmIGl0IGRvZXMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIG1hdGNoZXMgYW55IG9mIHRoZSBwYXNzd29yZHMgc3RvcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgaW4gdGhlIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQYXNzd29yZEhpc3RvcnkoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhhc2hTdHJpbmcgPSBuZXcgU3RyaW5nKHBhc3N3b3JkVG9IYXNoKHBhc3N3b3JkKSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzd29yZCBIaXN0b3J5IG1heSBiZSB0b28gbG9uZy4uLgorICAgICAgICBpbnQgcGFzc3dvcmRIYXNoTGVuZ3RoID0gcGFzc3dvcmRIYXNoU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IHBhc3N3b3JkSGFzaExlbmd0aCAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aAorICAgICAgICAgICAgICAgICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeS5sZW5ndGgoKSA+IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzd29yZEhpc3RvcnkuY29udGFpbnMocGFzc3dvcmRIYXNoU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBmaWxlIGV4aXN0cyBhbmQgY29udGFpbnMgYW55IGRhdGEuIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIGl0IGRvZXMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlbmFtZQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGV4aXN0cyBhbmQgaXMgbm9uLWVtcHR5LgogICAgICAqLwpAQCAtMjc0LDYgKzMzMSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CisgICAgICAgICAgICAgICAgaWYgKGlzTG9ja1Bhc3N3b3JkRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWN0aXZlUGFzc3dvcmRRdWFsaXR5OwogICAgIH0KQEAgLTI4Miw4ICszNDQsNiBAQAogICAgICAqIENsZWFyIGFueSBsb2NrIHBhdHRlcm4gb3IgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJMb2NrKCkgewotICAgICAgICBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOwogICAgICAgICBzYXZlTG9ja1Bhc3N3b3JkKG51bGwsIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwogICAgICAgICBzZXRMb2NrUGF0dGVybkVuYWJsZWQoZmFsc2UpOwogICAgICAgICBzYXZlTG9ja1BhdHRlcm4obnVsbCk7CkBAIC0yOTYsNyArMzU2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzYXZlTG9ja1BhdHRlcm4oTGlzdDxMb2NrUGF0dGVyblZpZXcuQ2VsbD4gcGF0dGVybikgewogICAgICAgICAvLyBDb21wdXRlIHRoZSBoYXNoCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoICA9IExvY2tQYXR0ZXJuVXRpbHMucGF0dGVyblRvSGFzaChwYXR0ZXJuKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGhhc2ggPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgaGFzaCB0byBmaWxlCiAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNMb2NrUGF0dGVybkZpbGVuYW1lLCAicnciKTsKQEAgLTMxMSwxNCArMzcxLDE1IEBACiAgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2V0Qm9vbGVhbihQQVRURVJOX0VWRVJfQ0hPU0VOX0tFWSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7Ci0gICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgorICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzCisgICAgICAgICAgICAvLyBwcm92aWRlcgogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIHNhdmUgbG9jayBwYXR0ZXJuIHRvICIgKyBzTG9ja1BhdHRlcm5GaWxlbmFtZSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoCkBAIC0zNzYsMTcgKzQzNyw1OSBAQAogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGludCBjb21wdXRlZFF1YWxpdHkgPSBjb21wdXRlUGFzc3dvcmRRdWFsaXR5KHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBjb21wdXRlZFF1YWxpdHkpOworICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKGNvbXB1dGVkUXVhbGl0eSwgcGFzc3dvcmQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbG93ZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBub25sZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSwgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCksIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLCBudW1iZXJzLCBzeW1ib2xzLCBub25sZXR0ZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBub3QgYW55dGhpbmcuCiAgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBwYXNzd29yZCB0byB0aGUgcGFzc3dvcmQgaGlzdG9yeS4gV2UgYXNzdW1lIGFsbAorICAgICAgICAgICAgICAgIC8vIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgLy8gaGFzaGVzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGZvciBzaW1wbGljaXR5IG9mIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBwYXNzd29yZEhpc3RvcnlMZW5ndGggPSBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZyhoYXNoKSArICIsIiArIHBhc3N3b3JkSGlzdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3V0IGl0IHRvIGNvbnRhaW4gcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIGhhc2hlcworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0xIGNvbW1hcy4KKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBNYXRoLm1pbihoYXNoLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmRIaXN0b3J5TGVuZ3RoICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMSwgcGFzc3dvcmRIaXN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSwgcGFzc3dvcmRIaXN0b3J5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgpAQCAtNTI2LDcgKzYyOSw4IEBACiAgICAgICAgIHJldHVybiBzYXZlZFBhc3N3b3JkRXhpc3RzKCkgJiYKICAgICAgICAgICAgICAgICAobW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwogICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTAsMTIgKzc1NCwyMSBAQAogICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5wdXRMb25nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHNlY3VyZVNldHRpbmdLZXkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKICAgICAgICAgbG9uZyBtb2RlID0gZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhdHRlcm4gPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXNzd29yZCA9IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDCi0gICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VjdXJlID0gaXNQYXR0ZXJuICYmIGlzTG9ja1BhdHRlcm5FbmFibGVkKCkgJiYgc2F2ZWRQYXR0ZXJuRXhpc3RzKCkKICAgICAgICAgICAgICAgICB8fCBpc1Bhc3N3b3JkICYmIHNhdmVkUGFzc3dvcmRFeGlzdHMoKTsKICAgICAgICAgcmV0dXJuIHNlY3VyZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKaW5kZXggOTE1MjcyOS4uMzIxOGJhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKQEAgLTE3LDEwICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKQEAgLTM4LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgpAQCAtNjksMjEgKzY4LDIxIEBACiAgICAgcHJpdmF0ZSBpbnQgbUdyYWJiZWRTdGF0ZSA9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyaWdnZXJlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwotICAgIHByaXZhdGUgZmxvYXQgbURlbnNpdHk7IC8vIHVzZWQgdG8gc2NhbGUgZGltZW5zaW9ucyBmb3IgYml0bWFwcy4KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCiAKICAgICAvKioKICAgICAgKiBFaXRoZXIge0BsaW5rICNIT1JJWk9OVEFMfSBvciB7QGxpbmsgI1ZFUlRJQ0FMfS4KICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3JpZW50YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yaWVudGF0aW9uOwogCi0gICAgcHJpdmF0ZSBTbGlkZXIgbUxlZnRTbGlkZXI7Ci0gICAgcHJpdmF0ZSBTbGlkZXIgbVJpZ2h0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1MZWZ0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1SaWdodFNsaWRlcjsKICAgICBwcml2YXRlIFNsaWRlciBtQ3VycmVudFNsaWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIHByaXZhdGUgZmxvYXQgbVRocmVzaG9sZDsKICAgICBwcml2YXRlIFNsaWRlciBtT3RoZXJTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1BbmltYXRpbmc7Ci0gICAgcHJpdmF0ZSBSZWN0IG1UbXBSZWN0OworICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVG1wUmVjdDsKIAogICAgIC8qKgogICAgICAqIExpc3RlbmVyIHVzZWQgdG8gcmVzZXQgdGhlIHZpZXcgd2hlbiB0aGUgY3VycmVudCBhbmltYXRpb24gY29tcGxldGVzLgpAQCAtNjA4LDE0ICs2MDcsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgotICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWdnZXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtT3RoZXJTbGlkZXIuc2hvdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIucmVzZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlci5oaWRlVGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgbU90aGVyU2xpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbEdyYWIoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYyMyw2ICs2MTUsMTcgQEAKICAgICAgICAgcmV0dXJuIG1UcmFja2luZyB8fCBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjYW5jZWxHcmFiKCkgeworICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICBtT3RoZXJTbGlkZXIuc2hvdyh0cnVlKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIucmVzZXQoZmFsc2UpOworICAgICAgICBtQ3VycmVudFNsaWRlci5oaWRlVGFyZ2V0KCk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyID0gbnVsbDsKKyAgICAgICAgbU90aGVyU2xpZGVyID0gbnVsbDsKKyAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgfQorCiAgICAgdm9pZCBzdGFydEFuaW1hdGluZyhmaW5hbCBib29sZWFuIGhvbGRBZnRlcikgewogICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIHRyYW5zMTsKQEAgLTgzMiw2ICs4MzUsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGFuZ2VkVmlldywgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5Q2hhbmdlZChjaGFuZ2VkVmlldywgdmlzaWJpbGl0eSk7CisgICAgICAgIC8vIFdoZW4gdmlzaWJpbGl0eSBjaGFuZ2VzIGFuZCB0aGUgdXNlciBoYXMgYSB0YWIgc2VsZWN0ZWQsIHVuc2VsZWN0IGl0IGFuZAorICAgICAgICAvLyBtYWtlIHN1cmUgdGhlaXIgY2FsbGJhY2sgZ2V0cyBjYWxsZWQuCisgICAgICAgIGlmIChjaGFuZ2VkVmlldyA9PSB0aGlzICYmIHZpc2liaWxpdHkgIT0gVklTSUJMRQorICAgICAgICAgICAgICAgICYmIG1HcmFiYmVkU3RhdGUgIT0gT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKSB7CisgICAgICAgICAgICBjYW5jZWxHcmFiKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGdyYWJiZWQgc3RhdGUsIGFuZCBkaXNwYXRjaGVzIGEgZ3JhYmJlZCBzdGF0ZSBjaGFuZ2UKICAgICAgKiBldmVudCB0byBvdXIgbGlzdGVuZXIuCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCBkODU0ZTg3Li4xOTQyOGY5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDYgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlBY3Rpdml0eU1hbmFnZXIuY3BwIFwKIAlBbmRyb2lkUnVudGltZS5jcHAgXAotCUN1cnNvcldpbmRvdy5jcHAgXAogCVRpbWUuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwLmFybSBcCkBAIC00OSw2ICs0OCw4IEBACiAJYW5kcm9pZF92aWV3X0lucHV0UXVldWUuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfSW5wdXRUYXJnZXQuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfS2V5RXZlbnQuY3BwIFwKKwlhbmRyb2lkX3ZpZXdfSGFyZHdhcmVSZW5kZXJlci5jcHAgXAorCWFuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwIFwKIAlhbmRyb2lkX3RleHRfQW5kcm9pZENoYXJhY3Rlci5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAgXApAQCAtMTEyLDYgKzExMyw4IEBACiAJYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAgXAogCWFuZHJvaWRfbWVkaWFfQXVkaW9UcmFjay5jcHAgXAogCWFuZHJvaWRfbWVkaWFfSmV0UGxheWVyLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgXAogCWFuZHJvaWRfbWVkaWFfVG9uZUdlbmVyYXRvci5jcHAgXAogCWFuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcCBcCiAJYW5kcm9pZF9oYXJkd2FyZV9TZW5zb3JNYW5hZ2VyLmNwcCBcCkBAIC0xNDAsMTEgKzE0MywxMyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJJChMT0NBTF9QQVRIKS9hbmRyb2lkL2dyYXBoaWNzIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uL2xpYnMvaHd1aSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJsdWVkcm9pZCkgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZSkvaGFyZHdhcmUgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZV9sZWdhY3kpL2hhcmR3YXJlX2xlZ2FjeSBcCiAJJChMT0NBTF9QQVRIKS8uLi8uLi9pbmNsdWRlL3VpIFwKIAkkKExPQ0FMX1BBVEgpLy4uLy4uL2luY2x1ZGUvdXRpbHMgXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vbWVkaWEvbXRwIFwKIAlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCiAJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAogCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXApAQCAtMTY4LDYgKzE3Myw3IEBACiAJbGliYmluZGVyIFwKIAlsaWJuZXR1dGlscyBcCiAJbGlidWkgXAorCWxpYmh3dWkgXAogCWxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCiAJbGliY2FtZXJhX2NsaWVudCBcCiAJbGlic2tpYWdsIFwKQEAgLTE5MCw2ICsxOTYsOCBAQAogCWxpYndwYV9jbGllbnQgXAogCWxpYmpwZWcKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHBob3N0IGxpYnVzYmhvc3QKKwogaWZlcSAoJChCT0FSRF9IQVZFX0JMVUVUT09USCksdHJ1ZSkKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCWV4dGVybmFsL2RidXMgXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCmluZGV4IDNlNjljNzguLjViMmQ5NjYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAorKysgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKQEAgLTExNCw2ICsxMTQsOCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfaW50ZXJuYWxfZ3JhcGhpY3NfTmF0aXZlVXRpbHMoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfRGlzcGxheShKTklFbnYqIGVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfSGFyZHdhcmVSZW5kZXJlcihKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52KiBlbnYpOwpAQCAtMTI0LDYgKzEyNiw4IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGVidWdfSk5JVGVzdChKTklFbnYqIGVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfcGltX0V2ZW50UmVjdXJyZW5jZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdGV4dF9mb3JtYXRfVGltZShKTklFbnYqIGVudik7CkBAIC0xMjEyLDYgKzEyMTYsOCBAQAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9uaW9fdXRpbHMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0dyYXBoaWNzKSwKKyAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1N1cmZhY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsKSwKQEAgLTEyNzYsNiArMTI4Miw4IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0F1ZGlvU3lzdGVtKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfQXVkaW9UcmFjayksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0pldFBsYXllciksCisgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudCksCisgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvciksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX1RvbmVHZW5lcmF0b3IpLAogCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX29wZW5nbF9jbGFzc2VzKSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcAppbmRleCA4OGJiYWZkLi5iMDYyMjY0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCkBAIC0zMTMsNiArMzEzLDEwIEBACiAgICAgcmV0dXJuIGJpdG1hcC0+Y29uZmlnKCk7DQogfQ0KIA0KK3N0YXRpYyBpbnQgQml0bWFwX2dldEdlbmVyYXRpb25JZChKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KKyAgICByZXR1cm4gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsNCit9DQorDQogc3RhdGljIGpib29sZWFuIEJpdG1hcF9oYXNBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KICAgICByZXR1cm4gIWJpdG1hcC0+aXNPcGFxdWUoKTsNCiB9DQpAQCAtNjA2LDYgKzYxMCw3IEBACiAgICAgICAgICh2b2lkKilCaXRtYXBfd3JpdGVUb1BhcmNlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUV4dHJhY3RBbHBoYSIsICAgICAgICIoSUlbSSlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7IiwNCiAgICAgICAgICh2b2lkKilCaXRtYXBfZXh0cmFjdEFscGhhIH0sDQorICAgIHsgICAibmF0aXZlR2VuZXJhdGlvbklkIiwgICAgICAgIihJKUkiLCAodm9pZCopQml0bWFwX2dldEdlbmVyYXRpb25JZCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVsIiwgICAgICAgICAgICIoSUlJKUkiLCAodm9pZCopQml0bWFwX2dldFBpeGVsIH0sDQogICAgIHsgICAibmF0aXZlR2V0UGl4ZWxzIiwgICAgICAgICAgIihJW0lJSUlJSUkpViIsICh2b2lkKilCaXRtYXBfZ2V0UGl4ZWxzIH0sDQogICAgIHsgICAibmF0aXZlU2V0UGl4ZWwiLCAgICAgICAgICAgIihJSUlJKVYiLCAodm9pZCopQml0bWFwX3NldFBpeGVsIH0sDQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCmluZGV4IGUxZTk1MzYuLmIwNDQyNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKQEAgLTMwLDYgKzMwLDEyIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisvLyB0ZW1wb3JhcnkgZm9yIGRlYnVnZ2luZworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjZGVmaW5lIFRJTUVfRFJBV3gKIAogc3RhdGljIHVpbnQzMl90IGdldF90aHJlYWRfbXNlYygpIHsKQEAgLTUyLDYgKzU4LDI0IEBACiBjbGFzcyBTa0NhbnZhc0dsdWUgewogcHVibGljOgogCisgICAgZW51bSB7CisgICAgICBrRGlyZWN0aW9uX0xUUiA9IDAsCisgICAgICBrRGlyZWN0aW9uX1JUTCA9IDEKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICBrRGlyZWN0aW9uX01hc2sgPSAweDEKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICBrQmlkaV9MVFIgPSAwLAorICAgICAga0JpZGlfUlRMID0gMSwKKyAgICAgIGtCaWRpX0RlZmF1bHRfTFRSID0gMiwKKyAgICAgIGtCaWRpX0RlZmF1bHRfUlRMID0gMywKKyAgICAgIGtCaWRpX0ZvcmNlX0xUUiA9IDQsCisgICAgICBrQmlkaV9Gb3JjZV9SVEwgPSA1CisgICAgfTsKKwogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDYW52YXMqIGNhbnZhcykgewogICAgICAgICBjYW52YXMtPnVucmVmKCk7CiAgICAgfQpAQCAtNzQzLDQ1ICs3NjcsMjE4IEBACiAgICAgICAgIGNhbnZhcy0+ZHJhd1ZlcnRpY2VzKG1vZGUsIHB0Q291bnQsIHZlcnRzLCB0ZXhzLCBjb2xvcnMsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMsIGluZGV4Q291bnQsICpwYWludCk7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19fQ0lJRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgewotICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7Ci0gICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOworCisgICAgLyoqCisgICAgICogQGNvbnRleHQgdGhlIHRleHQgY29udGV4dAorICAgICAqIEBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQGNvdW50IHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gcmVuZGVyLCBzdGFydCArIGNvdW50ICBtdXN0IGJlIDw9IGxlbgorICAgICAqIEBjb250ZXh0Q291bnQgdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICAgICAqIEBzaGFwZWQgd2hlcmUgdG8gcHV0IHRoZSBzaGFwZWQgdGV4dCwgbXVzdCBoYXZlIGNhcGFjaXR5IGZvciBjb3VudCB1Y2hhcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHNoYXBlZCB0ZXh0LCBvciAtMSBpZiBlcnJvcgorICAgICAqLworICAgIHN0YXRpYyBpbnQgc2hhcGVSdGxUZXh0X18oY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworCisgICAgICAgIC8vIFdlJ2QgcmF0aGVyIHVzZSBoYXJmYnV6eiBoZXJlLiAgVXNlIGNoYXJhY3RlciBiYXNlZCBzaGFwaW5nIGZvciBub3cuCisKKyAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgIHVfc2hhcGVBcmFiaWMoY29udGV4dCwgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKworICAgICAgICBpZiAoIVVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBTa0NhbnZhcyogYyA9IEdyYXBoaWNzSk5JOjpnZXROYXRpdmVDYW52YXMoZW52LCBjYW52YXMpOwotICAgICAgICBjLT5kcmF3VGV4dCh0ZXh0XywgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksCi0gICAgICAgICAgICAgICAgICAgICpHcmFwaGljc0pOSTo6Z2V0TmF0aXZlUGFpbnQoZW52LCBwYWludCkpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CisKKyAgICAgICAgLy8gdHJpbSBvdXQgMHhmZmZmIGZvbGxvd2luZyBsaWdhdHVyZXMsIGlmIGFueQorICAgICAgICBpbnQgZW5kID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJbZW5kKytdID0gYnVmZmVyW2ldOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gZW5kOworICAgICAgICAvLyBMT0coTE9HX0lORk8sICJDU1JUTCIsICJzdGFydCAlZCBjb3VudCAlZCBjY291bnQgJWRcbiIsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50KTsKKyAgICAgICAgdWJpZGlfd3JpdGVSZXZlcnNlKGJ1ZmZlciwgY291bnQsIHNoYXBlZCwgY291bnQsIFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX09VVFBVVF9SRVZFUlNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcsICZzdGF0dXMpOworICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQotICAgIAorCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfXyhKTklFbnYqIGVudiwgU2tDYW52YXMqIGNhbnZhcywgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisKKyAgICAgICAgU2tQYWludDo6QWxpZ24gaG9yaXogPSBwYWludC0+Z2V0VGV4dEFsaWduKCk7CisKKyAgICAgICAgYm9vbCBuZWVkQmlkaSA9IChmbGFncyA9PSBrQmlkaV9SVEwpIHx8IChmbGFncyA9PSBrQmlkaV9EZWZhdWx0X1JUTCk7CisgICAgICAgIGlmICghbmVlZEJpZGkgJiYgZmxhZ3MgPCBrQmlkaV9Gb3JjZV9MVFIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSAweDA1OTApIHsKKyAgICAgICAgICAgICAgICAgICAgbmVlZEJpZGkgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGlyID0gKGZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkgPyBrRGlyZWN0aW9uX1JUTCA6IGtEaXJlY3Rpb25fTFRSOyAvLyB3aWxsIGJlIHJlc2V0IGlmIHdlIHJ1biBiaWRpCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBqY2hhciAqc2hhcGVkID0gTlVMTDsKKyAgICAgICAgaW50MzJfdCBzbGVuID0gMDsKKyAgICAgICAgaWYgKG5lZWRCaWRpIHx8IChmbGFncyA9PSBrQmlkaV9Gb3JjZV9SVEwpKSB7CisgICAgICAgICAgICBzaGFwZWQgPSAoamNoYXIgKiltYWxsb2MobGVuICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgICAgICBpZiAoIXNoYXBlZCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuZWVkQmlkaSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IFJUTF9PUFRTID0gVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJJRElfUkVNT1ZFX0JJRElfQ09OVFJPTFMgfCBVQklESV9PVVRQVVRfUkVWRVJTRTsKKyAgICAgICAgICAgICAgICAgICAgamludCBsaW5lRGlyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmbGFncykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGtCaWRpX0xUUjogbGluZURpciA9IDA7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBMVFIgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBrQmlkaV9SVEw6IGxpbmVEaXIgPSAxOyBicmVhazsgLy8gbm8gSUNVIGNvbnN0YW50LCBjYW5vbmljYWwgUlRMIGxldmVsCisgICAgICAgICAgICAgICAgICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9MVFI6IGxpbmVEaXIgPSBVQklESV9ERUZBVUxUX0xUUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9SVEw6IGxpbmVEaXIgPSBVQklESV9ERUZBVUxUX1JUTDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBVQmlEaSogYmlkaSA9IHViaWRpX29wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgdWJpZGlfc2V0UGFyYShiaWRpLCB0ZXh0LCBsZW4sIGxpbmVEaXIsIE5VTEwsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IHViaWRpX2dldFBhcmFMZXZlbChiaWRpKSAmIDB4MTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gdWJpZGlfY291bnRSdW5zKGJpZGksICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQmlEaURpcmVjdGlvbiBkaXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IHViaWRpX2dldFZpc3VhbFJ1bihiaWRpLCBpLCAmc3RhcnQsICZsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIHNoYXBpbmcsIGV4Y2VwdCBpdCBkb2Vzbid0IHNoYXBlLCBqdXN0IG1pcnJvcnMgYW5kIHJldmVyc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBoYXJmYnV6eiB3aGVuIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IFVCSURJX1JUTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSB1YmlkaV93cml0ZVJldmVyc2UodGV4dCArIHN0YXJ0LCBsZW5ndGgsIHNoYXBlZCArIHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIFJUTF9PUFRTLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRbc2xlbiArIGldID0gdGV4dFtzdGFydCArIGldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB1YmlkaV9jbG9zZShiaWRpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBsZW4gPSBzaGFwZVJ0bFRleHRfXyh0ZXh0LCAwLCBsZW4sIGxlbiwgc2hhcGVkLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzM1XTsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiRHJhd1RleHQgYmlkaSBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBkb1Rocm93SUFFKGVudiwgYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgdHJpbUxlZnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgdHJpbVJpZ2h0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaG9yaXopIHsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a0xlZnRfQWxpZ246IHRyaW1MZWZ0ID0gZGlyICYga0RpcmVjdGlvbl9NYXNrOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjogdHJpbUxlZnQgPSB0cmltUmlnaHQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOiB0cmltUmlnaHQgPSAhKGRpciAmIGtEaXJlY3Rpb25fTWFzayk7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyKiB3b3JrVGV4dCA9IHNoYXBlZCA/IHNoYXBlZCA6IHRleHQ7CisgICAgICAgICAgICBjb25zdCBqY2hhciogd29ya0xpbWl0ID0gd29ya1RleHQgKyBsZW47CisKKyAgICAgICAgICAgIGlmICh0cmltTGVmdCkgeworICAgICAgICAgICAgICAgIHdoaWxlICh3b3JrVGV4dCA8IHdvcmtMaW1pdCAmJiAqd29ya1RleHQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICsrd29ya1RleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyaW1SaWdodCkgeworICAgICAgICAgICAgICAgIHdoaWxlICh3b3JrTGltaXQgPiB3b3JrVGV4dCAmJiAqKHdvcmtMaW1pdCAtIDEpID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAtLXdvcmtMaW1pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHdvcmtCeXRlcyA9ICh3b3JrTGltaXQgLSB3b3JrVGV4dCkgPDwgMTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hhcGVkKSB7CisgICAgICAgICAgICBmcmVlKHNoYXBlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGRyYXdUZXh0X18oZW52LCBjYW52YXMsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBkcmF3VGV4dF9fKGVudiwgY2FudmFzLCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgfQorCisgICAgLy8gRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dC4KKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fKEpOSUVudiogZW52LCBTa0NhbnZhcyogY2FudmFzLCBjb25zdCBqY2hhciogY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKworICAgICAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOworICAgICAgICBpZiAocnRsKSB7CisgICAgICAgICAgICBqY2hhciBjb250ZXh0W2NvbnRleHRDb3VudF07CisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIGNvdW50ID0gc2hhcGVSdGxUZXh0X18oY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBjb250ZXh0LCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjb250ZXh0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvVGhyb3dJQUUoZW52LCAic2hhcGluZyBlcnJvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjaGFycyArIHN0YXJ0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fX0NJSUlJRkZJUGFpbnQoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwKKyAgICAgICAgaW50IGNvdW50LCBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqY2hhciogY2hhcnMgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBkcmF3VGV4dFJ1bl9fKGVudiwgY2FudmFzLCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY2hhcnMsIEpOSV9BQk9SVCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIGppbnQgc3RhcnQsCisgICAgICAgIGppbnQgZW5kLCBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGppbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisKKyAgICAgICAgamludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGNvbnN0IGpjaGFyKiBjaGFycyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGRyYXdUZXh0UnVuX18oZW52LCBjYW52YXMsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCBjaGFycyk7CisgICAgfQorCiAgICAgc3RhdGljIHZvaWQgZHJhd1Bvc1RleHRfX19DSUlfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CkBAIC04MDQsNyArMTAwMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CkBAIC04MjcsNyArMTAyNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoX19fQ0lJUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAogICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgewpAQCAtODM3LDcgKzEwMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgewpAQCAtODQ3LDcgKzEwNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dF8pOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyBib29sIGdldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGJvdW5kcykgewogICAgICAgICBTa1JlY3QgICByOwpAQCAtOTQwLDE5ICsxMTM3LDIwIEBACiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwUlJ9LAogICAgIHsibmF0aXZlX2RyYXdCaXRtYXAiLCAiKElbSUlJRkZJSVpJKVYiLAogICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBBcnJheX0sCi0gICAgCiAgICAgeyJuYXRpdmVEcmF3Qml0bWFwTWF0cml4IiwgIihJSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWF0cml4fSwKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNZXNoIiwgIihJSUlJW0ZJW0lJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcE1lc2h9LAogICAgIHsibmF0aXZlRHJhd1ZlcnRpY2VzIiwgIihJSUlbRklbRklbSUlbU0lJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd1ZlcnRpY2VzfSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJW0NJSUZGSSlWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19fQ0lJRkZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX1N0cmluZ0lJRkZQYWludH0sCi0gICAgeyJkcmF3VGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztGRkxhbmRyb2lkL2dyYXBoaWNzL1BhaW50OylWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdTdHJpbmd9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19fQ0lJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSVtDSUlJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dFJ1bl9fX0NJSUlJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0UnVuIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19TdHJpbmdJSUlJRkZJUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElbQ0lJW0ZJKVYiLAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1Bvc1RleHRfX19DSUlfRlBhaW50fSwKICAgICB7Im5hdGl2ZV9kcmF3UG9zVGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7W0ZJKVYiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAppbmRleCA3ODBiYWRjLi5jYTljOWRlIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcApAQCAtMzEsNiArMzEsMTAgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrVHlwZWZhY2UuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKworLy8gdGVtcG9yYXJ5IGZvciBkZWJ1Z2dpbmcKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01Nyw2ICs2MSw5IEBACiAKIGNsYXNzIFNrUGFpbnRHbHVlIHsKIHB1YmxpYzoKKyAgICBlbnVtIE1vdmVPcHQgeworICAgICAgICBBRlRFUiwgQVRfT1JfQUZURVIsIEJFRk9SRSwgQVRfT1JfQkVGT1JFLCBBVAorICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIG9iaikgewogICAgICAgICBkZWxldGUgb2JqOwpAQCAtMzk1LDcgKzQwMiwxODQgQEAKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KLSAgICAKKworICAgIHN0YXRpYyBqZmxvYXQgZG9UZXh0UnVuQWR2YW5jZXMoSk5JRW52ICplbnYsIFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgIGpmbG9hdCBhZHZhbmNlc0FycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICAgICAgU2tTY2FsYXIqIHNjYWxhckFycmF5ID0gKFNrU2NhbGFyICopYWR2YW5jZXNBcnJheTsKKyAgICAgICAgamZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CisKKyAgICAgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAgICAgLy8gZm9yIG5vdyB3ZSBqdXN0IHVzZSB1c2hhcGUuYworCisgICAgICAgIGludCB3aWR0aHM7CisgICAgICAgIGlmIChmbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICAgICAgICAgIHVfc2hhcGVBcmFiaWModGV4dCwgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSdyZSBob3NlZCBhbnl3YXkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4MjAwYjsgLy8gemVyby13aWR0aC1zcGFjZSBmb3Igc2tpYQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyhidWZmZXIgKyBzdGFydCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkKKyAgICAgICAgICAgIC8vIG9uZSB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBwID0gMDsgaSA8IHdpZHRoczsgKytpKSB7CisgICAgICAgICAgICAgICAgdG90YWxBZHZhbmNlICs9IGFkdmFuY2VzQXJyYXlbcCsrXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKHAgPCBjb3VudCAmJiBjaGFyc1twXSA+PSAweGRjMDAgJiYgY2hhcnNbcF0gPCAweGUwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW3AtMV0gPj0gMHhkODAwICYmIGNoYXJzW3AtMV0gPCAweGRjMDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNBcnJheVtwKytdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0gYWR2YW5jZXNBcnJheVtpXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRGbG9hdEFycmF5UmVnaW9uKGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCBjb3VudCwgYWR2YW5jZXNBcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgamludCBpbmRleCwgamludCBjb3VudCwgamludCBjb250ZXh0SW5kZXgsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgamludCBmbGFncywgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGluZGV4IC0gY29udGV4dEluZGV4LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LCBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywKKyAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGpmbG9hdCByZXN1bHQgPSBkb1RleHRSdW5BZHZhbmNlcyhlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBzdGFydCAtIGNvbnRleHRTdGFydCwgZW5kIC0gc3RhcnQsIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGRvVGV4dFJ1bkN1cnNvcihKTklFbnYgKmVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgamludCBjb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgb3B0KSB7CisgICAgICAgIFNrU2NhbGFyIHNjYWxhckFycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvdW50XTsKKworICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgICAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jIGFuZCB3aWR0aHMgcmV0dXJuZWQgZnJvbSBza2lhCisKKyAgICAgICAgaW50IHdpZHRoczsKKyAgICAgICAgaWYgKGZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICAgICAgdV9zaGFwZUFyYWJpYyh0ZXh0ICsgc3RhcnQsIGNvdW50LCBidWZmZXIsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8IFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8IFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKGJ1ZmZlciwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkgb25lCisgICAgICAgICAgICAvLyB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCwgcCA9IHdpZHRocyAtIDE7IC0taSA+IHA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID49IDB4ZGMwMCAmJiBjaGFyc1tpXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbaS0xXSA+PSAweGQ4MDAgJiYgY2hhcnNbaS0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgICAgICBzY2FsYXJBcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gc2NhbGFyQXJyYXlbLS1wXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqaW50IHBvcyA9IG9mZnNldCAtIHN0YXJ0OworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICBjYXNlIEFGVEVSOgorICAgICAgICAgIGlmIChwb3MgPCBjb3VudCkgeworICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0FGVEVSOgorICAgICAgICAgIHdoaWxlIChwb3MgPCBjb3VudCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUZPUkU6CisgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBBVF9PUl9CRUZPUkU6CisgICAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICAtLXBvczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgcG9zID0gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkgeworICAgICAgICAgIHBvcyArPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqY2hhckFycmF5IHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IGN1cnNvck9wdCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamludCByZXN1bHQgPSBkb1RleHRSdW5DdXJzb3IoZW52LCBwYWludCwgdGV4dEFycmF5LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CiAgICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOwpAQCAtNTc2LDYgKzc2MCwxMyBAQAogICAgIHsibmF0aXZlX2JyZWFrVGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztaRltGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpicmVha1RleHRTfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElbQ0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX19DSUlfRn0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fU3RyaW5nSUlfRn0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElbQ0lJSUlJW0ZJKUYiLCAodm9pZCopCisgICAgICAgIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUlbRkkpRiIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElbQ0lJSUlJKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJKUkiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmd9LAogICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aH0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGh9LAogICAgIHsibmF0aXZlR2V0U3RyaW5nQm91bmRzIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCmluZGV4IDlhOGYxYjguLjUzYWM2MjUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcApAQCAtNjgsNiArNjgsMTAgQEAKICAgICB7IlVVSURzIiwgREJVU19UWVBFX0FSUkFZfSwKIH07CiAKK3N0YXRpYyBQcm9wZXJ0aWVzIGlucHV0X3Byb3BlcnRpZXNbXSA9IHsKKyAgICB7IkNvbm5lY3RlZCIsIERCVVNfVFlQRV9CT09MRUFOfSwKK307CisKIHR5cGVkZWYgdW5pb24gewogICAgIGNoYXIgKnN0cl92YWw7CiAgICAgaW50IGludF92YWw7CkBAIC02OTgsNiArNzAyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKIH0KIAoram9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZykgeworICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2csIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKICAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZhZGFwdGVyX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkYXB0ZXJfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwpAQCAtNzA4LDYgKzcxNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSkgewogICAgIGNoYXIgKmQgPSAoKGNoYXIgKiliYSkgKyA1LCAqZW5kcDsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKaW5kZXggMzc4YmI2Zi4uMjdhMDBhZSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKQEAgLTE2Miw2ICsxNjIsOCBAQAogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIHZvaWQgYXBwZW5kX3ZhcmlhbnQoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgdm9pZCAqdmFsKTsKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKTsKIHZvaWQgZ2V0X2JkYWRkcl9hc19zdHJpbmcoY29uc3QgYmRhZGRyX3QgKmJhLCBjaGFyICpzdHIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCmluZGV4IDkxNDQ5YmMuLjA0MGRhYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIApAQCAtMjI1LDcwICsyMjUsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNCbG9iX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGJsb2Igb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfQkxPQiB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzU3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIHN0cmluZyBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9TVFJJTkcgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGFuIGludGVnZXIgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGZsb2F0IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9GTE9BVDsKLX0KLQogc3RhdGljIGpzdHJpbmcgZ2V0U3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKICAgICBpbnQzMl90IGVycjsKQEAgLTQ4NywxMCArNDIzLDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc051bGxfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQorYm9vbCBpc051bGxfbmF0aXZlKEN1cnNvcldpbmRvdyAqd2luZG93LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisgICAgTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwogCiAgICAgYm9vbCBpc051bGw7CiAgICAgaWYgKHdpbmRvdy0+Z2V0TnVsbChyb3csIGNvbHVtbiwgJmlzTnVsbCkpIHsKQEAgLTY1Miw2ICs1ODcsMjYgQEAKICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CiB9CiAKK3N0YXRpYyBqaW50IGdldFR5cGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQoreworICAgIGludDMyX3QgZXJyOworICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOworICAgIExPR19XSU5ET1coInJldHVybmluZyBjb2x1bW4gdHlwZSBhZmZpbml0eSBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworCisgICAgaWYgKGlzTnVsbF9uYXRpdmUod2luZG93LCByb3csIGNvbHVtbikpIHsKKyAgICAgIHJldHVybiBGSUVMRF9UWVBFX05VTEw7CisgICAgfQorCisgICAgZmllbGRfc2xvdF90IGZpZWxkOworICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmaWVsZC50eXBlOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KQEAgLTY2MiwxMSArNjE3LDkgQEAKICAgICB7ImNsb3NlX25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9jbG9zZX0sCiAgICAgeyJnZXRMb25nX25hdGl2ZSIsICIoSUkpSiIsICh2b2lkICopZ2V0TG9uZ19uYXRpdmV9LAogICAgIHsiZ2V0QmxvYl9uYXRpdmUiLCAiKElJKVtCIiwgKHZvaWQgKilnZXRCbG9iX25hdGl2ZX0sCi0gICAgeyJpc0Jsb2JfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Jsb2JfbmF0aXZlfSwKICAgICB7ImdldFN0cmluZ19uYXRpdmUiLCAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopZ2V0U3RyaW5nX25hdGl2ZX0sCiAgICAgeyJjb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlIiwgIihJSUlMYW5kcm9pZC9kYXRhYmFzZS9DaGFyQXJyYXlCdWZmZXI7KVtDIiwgKHZvaWQgKiljb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlfSwKICAgICB7ImdldERvdWJsZV9uYXRpdmUiLCAiKElJKUQiLCAodm9pZCAqKWdldERvdWJsZV9uYXRpdmV9LAotICAgIHsiaXNOdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNOdWxsX25hdGl2ZX0sCiAgICAgeyJnZXROdW1Sb3dzX25hdGl2ZSIsICIoKUkiLCAodm9pZCAqKWdldE51bVJvd3N9LAogICAgIHsic2V0TnVtQ29sdW1uc19uYXRpdmUiLCAiKEkpWiIsICh2b2lkICopc2V0TnVtQ29sdW1uc30sCiAgICAgeyJhbGxvY1Jvd19uYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhbGxvY1Jvd30sCkBAIC02NzYsOSArNjI5LDcgQEAKICAgICB7InB1dERvdWJsZV9uYXRpdmUiLCAiKERJSSlaIiwgKHZvaWQgKilwdXREb3VibGVfbmF0aXZlfSwKICAgICB7ImZyZWVMYXN0Um93X25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWZyZWVMYXN0Um93fSwKICAgICB7InB1dE51bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilwdXROdWxsX25hdGl2ZX0sCi0gICAgeyJpc1N0cmluZ19uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzU3RyaW5nX25hdGl2ZX0sCi0gICAgeyJpc0Zsb2F0X25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNGbG9hdF9uYXRpdmV9LAotICAgIHsiaXNJbnRlZ2VyX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNJbnRlZ2VyX25hdGl2ZX0sCisgICAgeyJnZXRUeXBlX25hdGl2ZSIsICIoSUkpSSIsICh2b2lkICopZ2V0VHlwZV9uYXRpdmV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKaW5kZXggOGQxYzM5ZWUuLmRlNGM1YzggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCkBAIC05MSwyMiArOTEsMTEgQEAKICAgICBjb21waWxlKGVudiwgb2JqZWN0LCBHRVRfSEFORExFKGVudiwgb2JqZWN0KSwgc3FsU3RyaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKLXsKLSAgICBpbnQgZXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOwotCi0gICAgaWYgKHN0YXRlbWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKLSAgICAgICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGdTdGF0ZW1lbnRGaWVsZCwgMCk7Ci0gICAgfQotfQogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7Im5hdGl2ZV9jb21waWxlIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2NvbXBpbGV9LAotICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIigpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsKEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKaW5kZXggMzYyMzRhOS4uNWE5MjE5MyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKQEAgLTYzLDggKzYzLDggQEAKIAogc3RhdGljIGpmaWVsZElEIG9mZnNldF9kYl9oYW5kbGU7CiAKLXN0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCkgewotICAgIGludCBsZW4gPSBzdHJsZW4ocGF0aCk7CitzdGF0aWMgY2hhciAqY3JlYXRlU3RyKGNvbnN0IGNoYXIgKnBhdGgsIHNob3J0IGV4dHJhKSB7CisgICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKSArIGV4dHJhOwogICAgIGNoYXIgKnN0ciA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOwogICAgIHN0cm5jcHkoc3RyLCBwYXRoLCBsZW4pOwogICAgIHN0cltsZW5dID0gTlVMTDsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICB9CiAKICAgICBMT0dWKCJSZWdpc3RlcmluZyBzcWxpdGUgbG9nZ2luZyBmdW5jIFxuIik7Ci0gICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoKSk7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoLCAwKSk7CiAgICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgTE9HRSgic3FsaXRlX2NvbmZpZyBmYWlsZWQgZXJyb3JfY29kZSA9ICVkLiBUSElTIFNIT1VMRCBORVZFUiBvY2N1ci5cbiIsIGVycik7CiAgICAgICAgIHJldHVybjsKQEAgLTE3NiwxMyArMTc2LDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzE5NiwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMDgsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjUxLDcgKzI1NSw4IEBACiAgICAganNpemUgc3FsTGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgoc3FsU3RyaW5nKTsKIAogICAgIGlmIChzcWwgPT0gTlVMTCB8fCBzcWxMZW4gPT0gMCkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIllvdSBtdXN0IHN1cHBseSBhbiBTUUwgc3RyaW5nIik7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNjEsNyArMjY2LDggQEAKIAogICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICBMT0dFKCJGYWlsdXJlICVkICglcykgb24gJXAgd2hlbiBwcmVwYXJpbmcgJyVzJy5cbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKKyAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gcHJlcGFyaW5nICclcycuXG4iLCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSksCisgICAgICAgICAgICAgICAgaGFuZGxlLCBzcWw4KTsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUsIHNxbDgpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwogICAgICAgICByZXR1cm47CkBAIC0yNzIsMTAgKzI3OCwxMiBAQAogCiAgICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwKKyAgICAgICAgICAgICAgICAgICAgIlF1ZXJpZXMgY2Fubm90IGJlIHBlcmZvcm1lZCB1c2luZyBleGVjU1FMKCksIHVzZSBxdWVyeSgpIGluc3RlYWQuIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSksIGhhbmRsZSwgc3FsOCk7CisgICAgICAgICAgICBMT0dFKCJGYWlsdXJlICVkICglcykgb24gJXAgd2hlbiBleGVjdXRpbmcgJyVzJ1xuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIHNxbDgpOwogICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUsIHNxbDgpOwogICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBzcWw4KTsKIApAQCAtNDQzLDE5ICs0NTEsMjcgQEAKICAgICByZXR1cm4gc3FsaXRlM19yZWxlYXNlX21lbW9yeShTUUxJVEVfU09GVF9IRUFQX0xJTUlUKTsKIH0KIAorc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCBzdGF0ZW1lbnRJZCkKK3sKKyAgICBpZiAoc3RhdGVtZW50SWQgPiAwKSB7CisgICAgICAgIHNxbGl0ZTNfZmluYWxpemUoKHNxbGl0ZTNfc3RtdCAqKXN0YXRlbWVudElkKTsKKyAgICB9Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJkYm9wZW4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopZGJvcGVufSwKICAgICB7ImRiY2xvc2UiLCAiKClWIiwgKHZvaWQgKilkYmNsb3NlfSwKLSAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKLSAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCisgICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAorICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCiAgICAgeyJuYXRpdmVfZXhlY1NRTCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjU1FMfSwKICAgICB7Imxhc3RJbnNlcnRSb3ciLCAiKClKIiwgKHZvaWQgKilsYXN0SW5zZXJ0Um93fSwKICAgICB7Imxhc3RDaGFuZ2VDb3VudCIsICIoKUkiLCAodm9pZCAqKWxhc3RDaGFuZ2VDb3VudH0sCiAgICAgeyJuYXRpdmVfc2V0TG9jYWxlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKW5hdGl2ZV9zZXRMb2NhbGV9LAogICAgIHsibmF0aXZlX2dldERiTG9va2FzaWRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2dldERiTG9va2FzaWRlfSwKICAgICB7InJlbGVhc2VNZW1vcnkiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZU1lbW9yeX0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKEkpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlKEpOSUVudiAqZW52KQpAQCAtNDc0LDcgKzQ5MCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwKKyAgICAgICAgICAgIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwogfQogCiAvKiB0aHJvdyBhIFNRTGl0ZUV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGVycm9yIGluIGhhbmRsZSAqLwpAQCAtNTIzLDYgKzU0MCw3IEBACiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXNrSU9FeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX05PVEFEQjogLy8gdHJlYXQgInVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0IiBlcnJvciBhcyBjb3JydXB0aW9uIGFsc28KICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09OU1RSQUlOVDoKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKaW5kZXggNDQyNzE2ODMuLjc0N2VlNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKIAogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKaW5kZXggZmYyZWQ1ZC4uMDM0MWUwYiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcApAQCAtNTgsNyArNTgsOSBAQAogICAgIGVyciA9IHNxbGl0ZTNfc3RlcChzdGF0ZW1lbnQpOwogCiAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQKLSAgICBpZiAoZXJyICE9IFNRTElURV9ET05FKSB7CisgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIExPR1YoIlF1ZXJpZXMgY2Fubm90IGJlIHBlcmZvcm1lZCB1c2luZyBleGVjdXRlKCkuIHVzZSBTUUxpdGVEYXRhYmFzZS5xdWVyeSgpIGluc3RlYWQuIik7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb25fZXJyY29kZShlbnYsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ2xpZW50Sk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZXZpY2VSZW1vdmVkOworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CisKK2NsYXNzIE15Q2xpZW50IDogcHVibGljIE10cENsaWVudCB7Citwcml2YXRlOgorCisgICAgZW51bSB7CisgICAgICAgIGtEZXZpY2VBZGRlZCA9IDEsCisgICAgICAgIGtEZXZpY2VSZW1vdmVkLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpOworICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKTsKKworICAgIGJvb2wgICAgICAgICAgICByZXBvcnREZXZpY2VBZGRlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpOworICAgIGJvb2wgICAgICAgICAgICByZXBvcnREZXZpY2VSZW1vdmVkKEpOSUVudiAqZW52LCBNdHBEZXZpY2UgKmRldmljZSk7CisKKyAgICBKTklFbnYqICAgICAgICAgbUVudjsKKyAgICBqb2JqZWN0ICAgICAgICAgbUNsaWVudDsKKyAgICBNdXRleCAgICAgICAgICAgbUV2ZW50TG9jazsKKyAgICBDb25kaXRpb24gICAgICAgbUV2ZW50Q29uZGl0aW9uOworICAgIE11dGV4ICAgICAgICAgICBtQWNrTG9jazsKKyAgICBDb25kaXRpb24gICAgICAgbUFja0NvbmRpdGlvbjsKKyAgICBpbnQgICAgICAgICAgICAgbUV2ZW50OworICAgIE10cERldmljZSogICAgICBtRXZlbnREZXZpY2U7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2aXJ0dWFsICAgICAgICAgfk15Q2xpZW50KCk7CisgICAgdm9pZCAgICAgICAgICAgIHdhaXRGb3JFdmVudChKTklFbnYgKmVudik7CisKK307CisKK010cENsaWVudCogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KQoreworICAgIHJldHVybiAoTXRwQ2xpZW50KillbnYtPkdldEludEZpZWxkKGphdmFDbGllbnQsIGZpZWxkX2NvbnRleHQpOworfQorCisKK015Q2xpZW50OjpNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1FbnYoZW52KSwKKyAgICAgICAgbUNsaWVudChlbnYtPk5ld0dsb2JhbFJlZihjbGllbnQpKSwKKyAgICAgICAgbUV2ZW50KDApLAorICAgICAgICBtRXZlbnREZXZpY2UoTlVMTCkKK3sKK30KKworTXlDbGllbnQ6On5NeUNsaWVudCgpIHsKKyAgICBtRW52LT5EZWxldGVHbG9iYWxSZWYobUNsaWVudCk7Cit9CisKKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlQWRkZWRcbiIpOworICAgIG1BY2tMb2NrLmxvY2soKTsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBtRXZlbnQgPSBrRGV2aWNlQWRkZWQ7CisgICAgbUV2ZW50RGV2aWNlID0gZGV2aWNlOworICAgIG1FdmVudENvbmRpdGlvbi5zaWduYWwoKTsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworICAgIG1BY2tDb25kaXRpb24ud2FpdChtQWNrTG9jayk7CisgICAgbUFja0xvY2sudW5sb2NrKCk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlUmVtb3ZlZFxuIik7CisgICAgbUFja0xvY2subG9jaygpOworICAgIG1FdmVudExvY2subG9jaygpOworICAgIG1FdmVudCA9IGtEZXZpY2VSZW1vdmVkOworICAgIG1FdmVudERldmljZSA9IGRldmljZTsKKyAgICBtRXZlbnRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKyAgICBtQWNrQ29uZGl0aW9uLndhaXQobUFja0xvY2spOworICAgIG1BY2tMb2NrLnVubG9jaygpOworfQorCitib29sIE15Q2xpZW50OjpyZXBvcnREZXZpY2VBZGRlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OnJlcG9ydERldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgcmV0dXJuICghZW52LT5FeGNlcHRpb25DaGVjaygpKTsKK30KKworYm9vbCBNeUNsaWVudDo6cmVwb3J0RGV2aWNlUmVtb3ZlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKKyAgICBMT0dEKCJNeUNsaWVudDo6cmVwb3J0RGV2aWNlUmVtb3ZlZCAlc1xuIiwgbmFtZSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DbGllbnQsIG1ldGhvZF9kZXZpY2VSZW1vdmVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgcmV0dXJuICghZW52LT5FeGNlcHRpb25DaGVjaygpKTsKK30KKwordm9pZCBNeUNsaWVudDo6d2FpdEZvckV2ZW50KEpOSUVudiAqZW52KSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgbUV2ZW50Q29uZGl0aW9uLndhaXQobUV2ZW50TG9jayk7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIHN3aXRjaCAobUV2ZW50KSB7CisgICAgICAgIGNhc2Uga0RldmljZUFkZGVkOgorICAgICAgICAgICAgcmVwb3J0RGV2aWNlQWRkZWQoZW52LCBtRXZlbnREZXZpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0RldmljZVJlbW92ZWQ6CisgICAgICAgICAgICByZXBvcnREZXZpY2VSZW1vdmVkKGVudiwgbUV2ZW50RGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1BY2tMb2NrLmxvY2soKTsKKyAgICBtQWNrQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIG1BY2tMb2NrLnVubG9jaygpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgRXhjZXB0aW9uQ2hlY2sodm9pZCogZW52KQoreworICAgIHJldHVybiAoKEpOSUVudiAqKWVudiktPkV4Y2VwdGlvbkNoZWNrKCk7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoInNldHVwXG4iKTsKKyAgICBNeUNsaWVudCogY2xpZW50ID0gbmV3IE15Q2xpZW50KGVudiwgdGhpeik7CisgICAgY2xpZW50LT5zdGFydCgpOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCljbGllbnQpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGVsZXRlIGNsaWVudDsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3dhaXRfZm9yX2V2ZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgTE9HRCgid2FpdF9mb3JfZXZlbnRcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+d2FpdEZvckV2ZW50KGVudik7Cit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmRlbGV0ZU9iamVjdChvYmplY3RfaWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfcGFyZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0UGFyZW50KG9iamVjdF9pZCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmdldFN0b3JhZ2VJRChvYmplY3RfaWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV93YWl0X2Zvcl9ldmVudCIsICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3dhaXRfZm9yX2V2ZW50fSwKKyAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElJKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAorICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUkpSSIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCisgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZUFkZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRldmljZUFkZGVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX2RldmljZUFkZGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VBZGRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZXZpY2VSZW1vdmVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRldmljZVJlbW92ZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlUmVtb3ZlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGV2aWNlUmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cENsaWVudC5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cENsaWVudCIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYjdiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29ySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCisvLyBGcm9tIGFuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorQ3Vyc29yV2luZG93ICogZ2V0X3dpbmRvd19mcm9tX29iamVjdChKTklFbnYgKiBlbnYsIGpvYmplY3QgamF2YVdpbmRvdyk7CisKKy8vIEZyb20gYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCitNdHBDbGllbnQgKiBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KEpOSUVudiAqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCit7CisgICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YUNsaWVudCwKKyAgICAgICAgamludCBxdWVyeVR5cGUsIGppbnQgZGV2aWNlSUQsIGppbnQgc3RvcmFnZUlELCBqaW50IG9iamVjdElELCBqaW50QXJyYXkgamF2YUNvbHVtbnMpCit7CisgICAgTE9HRCgiYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAgcXVlcnlUeXBlOiAlZCBkZXZpY2VJRDogJWQgc3RvcmFnZUlEOiAlZCBvYmplY3RJRDogJWRcbiIsCisgICAgICAgICAgICAgICAgcXVlcnlUeXBlLCBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCk7CisKKyAgICBpbnQqIGNvbHVtbnMgPSBOVUxMOworICAgIGludCBjb2x1bW5Db3VudCA9IDA7CisgICAgaWYgKGphdmFDb2x1bW5zKSB7CisgICAgICAgIGNvbHVtbnMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoamF2YUNvbHVtbnMsIDApOworICAgICAgICBjb2x1bW5Db3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoamF2YUNvbHVtbnMpOworICAgIH0KKworICAgIE10cENsaWVudCogY2xpZW50ID0gZ2V0X2NsaWVudF9mcm9tX29iamVjdChlbnYsIGphdmFDbGllbnQpOworICAgIE10cEN1cnNvciogY3Vyc29yID0gbmV3IE10cEN1cnNvcihjbGllbnQsIHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5Db3VudCwgY29sdW1ucyk7CisKKyAgICBpZiAoY29sdW1ucykKKyAgICAgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgY29sdW1ucywgMCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWN1cnNvcik7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGRlbGV0ZSBjdXJzb3I7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvdyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFXaW5kb3csIGppbnQgc3RhcnRQb3MpCit7CisgICAgQ3Vyc29yV2luZG93KiB3aW5kb3cgPSBnZXRfd2luZG93X2Zyb21fb2JqZWN0KGVudiwgamF2YVdpbmRvdyk7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworCisgICAgcmV0dXJuIGN1cnNvci0+ZmlsbFdpbmRvdyh3aW5kb3csIHN0YXJ0UG9zKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50O0lJSUlbSSlWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9maWxsX3dpbmRvdyIsICAgICAgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93fSwKKworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cEN1cnNvci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cEN1cnNvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKaW5kZXggNTBkZjlkMy4uZmViMGRhZCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcApAQCAtMjIsOCArMjIsMjkgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG5ldHV0aWxzL2lmYy5oPgotI2luY2x1ZGUgPG5ldHV0aWxzL2RoY3AuaD4KK2V4dGVybiAiQyIgeworaW50IGlmY19lbmFibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfZGlzYWJsZShjb25zdCBjaGFyICppZm5hbWUpOworaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHVpbnQzMl90IGFkZHIpOworaW50IGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfc2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aW50MzJfdCBnYXRld2F5KTsKK2ludCBpZmNfZ2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfcmVzZXRfY29ubmVjdGlvbnMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfY29uZmlndXJlKGNvbnN0IGNoYXIgKmlmbmFtZSwgaW5fYWRkcl90IGlwYWRkciwgaW5fYWRkcl90IG5ldG1hc2ssIGluX2FkZHJfdCBnYXRld2F5LCBpbl9hZGRyX3QgZG5zMSwgaW5fYWRkcl90IGRuczIpOworCitpbnQgZGhjcF9kb19yZXF1ZXN0KGNvbnN0IGNoYXIgKmlmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICppcGFkZHIsCisgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZ2F0ZXdheSwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmRuczEsCisgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMiwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqbGVhc2UpOworaW50IGRoY3Bfc3RvcChjb25zdCBjaGFyICppZm5hbWUpOworaW50IGRoY3BfcmVsZWFzZV9sZWFzZShjb25zdCBjaGFyICppZm5hbWUpOworY2hhciAqZGhjcF9nZXRfZXJybXNnKCk7Cit9CiAKICNkZWZpbmUgTkVUVVRJTFNfUEtHX05BTUUgImFuZHJvaWQvbmV0L05ldHdvcmtVdGlscyIKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKaW5kZXggM2ZjMGQ1OC4uNzM5MjQ0MiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCkBAIC0zMCw2ICszMCwyMyBAQAogCiBzdGF0aWMgamJvb2xlYW4gc1NjYW5Nb2RlQWN0aXZlID0gZmFsc2U7CiAKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJlbWVtYmVycyB0aGUgamZpZWxkSUQncyBvZiB0aGUgZmllbGRzCisgKiBvZiB0aGUgRGhjcEluZm8gSmF2YSBvYmplY3QsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZQorICogdG8gbG9vayB0aGVtIHVwIGV2ZXJ5IHRpbWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmllbGRJZHMgeworICAgIGpjbGFzcyBkaGNwSW5mb0NsYXNzOworICAgIGptZXRob2RJRCBjb25zdHJ1Y3RvcklkOworICAgIGpmaWVsZElEIGlwYWRkcmVzczsKKyAgICBqZmllbGRJRCBnYXRld2F5OworICAgIGpmaWVsZElEIG5ldG1hc2s7CisgICAgamZpZWxkSUQgZG5zMTsKKyAgICBqZmllbGRJRCBkbnMyOworICAgIGpmaWVsZElEIHNlcnZlckFkZHJlc3M7CisgICAgamZpZWxkSUQgbGVhc2VEdXJhdGlvbjsKK30gZGhjcEluZm9GaWVsZElkczsKKwogc3RhdGljIGludCBkb0NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXBseWJ1ZiwgaW50IHJlcGx5YnVmbGVuKQogewogICAgIHNpemVfdCByZXBseV9sZW4gPSByZXBseWJ1ZmxlbiAtIDE7CkBAIC00NzYsNiArNDkzLDI4IEBACiAgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoIkJMQUNLTElTVCBjbGVhciIsICJPSyIpOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0IGluZm8pCit7CisgICAgamludCBpcGFkZHIsIGdhdGV3YXksIG1hc2ssIGRuczEsIGRuczIsIHNlcnZlciwgbGVhc2U7CisgICAgamJvb2xlYW4gc3VjY2VlZGVkID0gKChqYm9vbGVhbik6OmRvX2RoY3BfcmVxdWVzdCgmaXBhZGRyLCAmZ2F0ZXdheSwgJm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRuczEsICZkbnMyLCAmc2VydmVyLCAmbGVhc2UpID09IDApOworICAgIGlmIChzdWNjZWVkZWQgJiYgZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmlwYWRkcmVzcywgaXBhZGRyKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmdhdGV3YXksIGdhdGV3YXkpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGRoY3BJbmZvRmllbGRJZHMubmV0bWFzaywgbWFzayk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQoaW5mbywgZGhjcEluZm9GaWVsZElkcy5kbnMxLCBkbnMxKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmRuczIsIGRuczIpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGRoY3BJbmZvRmllbGRJZHMuc2VydmVyQWRkcmVzcywgc2VydmVyKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmxlYXNlRHVyYXRpb24sIGxlYXNlKTsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2NlZWRlZDsKK30KKworc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9uZXRfd2lmaV9nZXREaGNwRXJyb3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKDo6Z2V0X2RoY3BfZXJyb3Jfc3RyaW5nKCkpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qCkBAIC01MzIsNiArNTcxLDkgQEAKICAgICB7ICJzZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCB9LAogICAgIHsgImFkZFRvQmxhY2tsaXN0Q29tbWFuZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfYWRkVG9CbGFja2xpc3RDb21tYW5kIH0sCiAgICAgeyAiY2xlYXJCbGFja2xpc3RDb21tYW5kIiwgIigpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9jbGVhckJsYWNrbGlzdENvbW1hbmQgfSwKKworICAgIHsgImRvRGhjcFJlcXVlc3QiLCAiKExhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0IH0sCisgICAgeyAiZ2V0RGhjcEVycm9yIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldERoY3BFcnJvciB9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfbmV0X3dpZmlfV2lmaU1hbmFnZXIoSk5JRW52KiBlbnYpCkBAIC01MzksNiArNTgxLDE4IEBACiAgICAgamNsYXNzIHdpZmkgPSBlbnYtPkZpbmRDbGFzcyhXSUZJX1BLR19OQU1FKTsKICAgICBMT0dfRkFUQUxfSUYod2lmaSA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBXSUZJX1BLR19OQU1FKTsKIAorICAgIGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL25ldC9EaGNwSW5mbyIpOworICAgIGlmIChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MgIT0gTlVMTCkgeworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLmNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5pcGFkZHJlc3MgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAiaXBBZGRyZXNzIiwgIkkiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5nYXRld2F5ID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgImdhdGV3YXkiLCAiSSIpOworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLm5ldG1hc2sgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAibmV0bWFzayIsICJJIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMuZG5zMSA9IGVudi0+R2V0RmllbGRJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICJkbnMxIiwgIkkiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5kbnMyID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgImRuczIiLCAiSSIpOworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLnNlcnZlckFkZHJlc3MgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAic2VydmVyQWRkcmVzcyIsICJJIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMubGVhc2VEdXJhdGlvbiA9IGVudi0+R2V0RmllbGRJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICJsZWFzZUR1cmF0aW9uIiwgIkkiKTsKKyAgICB9CisKICAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCiAgICAgICAgICAgICBXSUZJX1BLR19OQU1FLCBnV2lmaU1ldGhvZHMsIE5FTEVNKGdXaWZpTWV0aG9kcykpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggMDFiNjcxMS4uM2M4ODE1OCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwCkBAIC02NCw2ICs2NCw4IEBACiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50QXV0aG9yaXplOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BZ2VudENhbmNlbDsKIAorc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZDsKKwogdHlwZWRlZiBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgbmF0aXZlX2RhdGFfdDsKIAogI2RlZmluZSBFVkVOVF9MT09QX1JFRlMgMTAKQEAgLTExNiw2ICsxMTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisKIAogICAgIGZpZWxkX21OYXRpdmVEYXRhID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwogI2VuZGlmCkBAIC04NTMsNiArODU4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uRGV2aWNlRGlzY29ubmVjdFJlcXVlc3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihyZW1vdGVfZGV2aWNlX3BhdGgpKTsKICAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYmx1ZXouSW5wdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgICBqb2JqZWN0QXJyYXkgc3RyX2FycmF5ID0KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnKTsKKyAgICAgICAgaWYgKHN0cl9hcnJheSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobmF0LT5tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGNfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOworICAgICAgICB9CisgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICB9CiAKICAgICByZXQgPSBhMmRwX2V2ZW50X2ZpbHRlcihtc2csIGVudik7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IDQ0MjBhY2EuLmE1MmE3NGMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgREJVU19BREFQVEVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5BZGFwdGVyIgogI2RlZmluZSBEQlVTX0RFVklDRV9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuRGV2aWNlIgorI2RlZmluZSBEQlVTX0lOUFVUX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5JbnB1dCIKKwogI2RlZmluZSBMT0dfVEFHICJCbHVldG9vdGhTZXJ2aWNlLmNwcCIKIAogI2luY2x1ZGUgImFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIgpAQCAtODgxLDYgKzg4Myw0MyBAQAogICAgIHJldHVybiBKTklfRkFMU0U7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGlmIChuYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSwgTlVMTCwgTlVMTCwgbmF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXRoLCBEQlVTX0lOUFVUX0lGQUNFLCAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgaWYgKG5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLCBOVUxMLCBOVUxMLCBuYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKQEAgLTkyNiw2ICs5NjUsOSBAQAogICAgIHsiYWRkUmZjb21tU2VydmljZVJlY29yZE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SkpTKUkiLCAodm9pZCAqKWFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmV9LAogICAgIHsicmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZSIsICIoSSlaIiwgKHZvaWQgKilyZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InNldExpbmtUaW1lb3V0TmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVoiLCAodm9pZCAqKXNldExpbmtUaW1lb3V0TmF0aXZlfSwKKyAgICAvLyBISUQgZnVuY3Rpb25zCisgICAgeyJjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQgKiljb25uZWN0SW5wdXREZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKEpOSUVudiAqZW52KSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOWNlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlIDxPcGVuR0xSZW5kZXJlci5oPgorI2luY2x1ZGUgPFJlY3QuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphdmEgQVBJcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgam1ldGhvZElEIHNldDsKK30gZ1JlY3RDbGFzc0luZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnN0cnVjdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgT3BlbkdMUmVuZGVyZXIqIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jcmVhdGVSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMpIHsKKyAgICByZXR1cm4gbmV3IE9wZW5HTFJlbmRlcmVyOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfZGVzdHJveVJlbmRlcmVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgZGVsZXRlIHJlbmRlcmVyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXR1cAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2V0Vmlld3BvcnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7CisgICAgcmVuZGVyZXItPnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcHJlcGFyZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5wcmVwYXJlKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YXRlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9zYXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLAorICAgICAgICBqaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlKGZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2dldFNhdmVDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJldHVybiByZW5kZXJlci0+Z2V0U2F2ZUNvdW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9yZXN0b3JlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmUoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3Jlc3RvcmVUb0NvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IHNhdmVDb3VudCkgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMYXllcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NhdmVMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NhdmVMYXllckFscGhhKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBqaW50IGFscGhhLCBqaW50IHNhdmVGbGFncykgeworICAgIHJldHVybiByZW5kZXJlci0+c2F2ZUxheWVyQWxwaGEobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xpcHBpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3F1aWNrUmVqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa0NhbnZhczo6RWRnZVR5cGUgZWRnZSkgeworICAgIHJldHVybiByZW5kZXJlci0+cXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2NsaXBSZWN0RihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2NsaXBSZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGxlZnQsIGppbnQgdG9wLCBqaW50IHJpZ2h0LCBqaW50IGJvdHRvbSkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QoZmxvYXQobGVmdCksIGZsb2F0KHRvcCksIGZsb2F0KHJpZ2h0KSwgZmxvYXQoYm90dG9tKSk7Cit9CisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRDbGlwQm91bmRzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqb2JqZWN0IHJlY3QpIHsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnVpcmVuZGVyZXI6OlJlY3QmIGJvdW5kcyhyZW5kZXJlci0+Z2V0Q2xpcEJvdW5kcygpKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QocmVjdCwgZ1JlY3RDbGFzc0luZm8uc2V0LAorICAgICAgICAgICAgaW50KGJvdW5kcy5sZWZ0KSwgaW50KGJvdW5kcy50b3ApLCBpbnQoYm91bmRzLnJpZ2h0KSwgaW50KGJvdW5kcy5ib3R0b20pKTsKKworICAgIHJldHVybiAhYm91bmRzLmlzRW1wdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfdHJhbnNsYXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZHgsIGpmbG9hdCBkeSkgeworICAgIHJlbmRlcmVyLT50cmFuc2xhdGUoZHgsIGR5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3JvdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZW5kZXJlci0+cm90YXRlKGRlZ3JlZXMpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2NhbGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBzeCwgamZsb2F0IHN5KSB7CisgICAgcmVuZGVyZXItPnNjYWxlKHN4LCBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9zZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+c2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Z2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jb25jYXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Y29uY2F0TWF0cml4KG1hdHJpeCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERyYXdpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2RyYXdDb2xvcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBjb2xvciwgamludCBtb2RlKSB7CisgICAgcmVuZGVyZXItPmRyYXdDb2xvcihjb2xvciwgKFNrWGZlcm1vZGU6Ok1vZGUpIG1vZGUpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfZHJhd1JlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgICAibkNyZWF0ZVJlbmRlcmVyIiwgICAgIigpSSIsICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jcmVhdGVSZW5kZXJlciB9LAorICAgIHsgICAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICAgIm5TZXRWaWV3cG9ydCIsICAgICAgICIoSUlJKVYiLCAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2V0Vmlld3BvcnQgfSwKKyAgICB7ICAgIm5QcmVwYXJlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcHJlcGFyZSB9LAorCisgICAgeyAgICJuU2F2ZSIsICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NhdmUgfSwKKyAgICB7ICAgIm5SZXN0b3JlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcmVzdG9yZSB9LAorICAgIHsgICAiblJlc3RvcmVUb0NvdW50IiwgICAgIihJSSlWIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9yZXN0b3JlVG9Db3VudCB9LAorICAgIHsgICAibkdldFNhdmVDb3VudCIsICAgICAgIihJKUkiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRTYXZlQ291bnQgfSwKKworICAgIHsgICAiblNhdmVMYXllciIsICAgICAgICAgIihJRkZGRklJKUkiLCAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9zYXZlTGF5ZXIgfSwKKyAgICB7ICAgIm5TYXZlTGF5ZXJBbHBoYSIsICAgICIoSUZGRkZJSSlJIiwgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2F2ZUxheWVyQWxwaGEgfSwKKworICAgIHsgICAiblF1aWNrUmVqZWN0IiwgICAgICAgIihJRkZGRkkpWiIsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9xdWlja1JlamVjdCB9LAorICAgIHsgICAibkNsaXBSZWN0IiwgICAgICAgICAgIihJRkZGRilaIiwgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jbGlwUmVjdEYgfSwKKyAgICB7ICAgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUlJSUkpWiIsICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfY2xpcFJlY3QgfSwKKworICAgIHsgICAiblRyYW5zbGF0ZSIsICAgICAgICAgIihJRkYpViIsICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl90cmFuc2xhdGUgfSwKKyAgICB7ICAgIm5Sb3RhdGUiLCAgICAgICAgICAgICIoSUYpViIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcm90YXRlIH0sCisgICAgeyAgICJuU2NhbGUiLCAgICAgICAgICAgICAiKElGRilWIiwgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NjYWxlIH0sCisKKyAgICB7ICAgIm5TZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2V0TWF0cml4IH0sCisgICAgeyAgICJuR2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2dldE1hdHJpeCB9LAorICAgIHsgICAibkNvbmNhdE1hdHJpeCIsICAgICAgIihJSSlWIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jb25jYXRNYXRyaXggfSwKKworICAgIHsgICAibkRyYXdDb2xvciIsICAgICAgICAgIihJSUkpViIsICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9kcmF3Q29sb3IgfSwKKyAgICB7ICAgIm5EcmF3UmVjdCIsICAgICAgICAgICIoSUZGRkZJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfZHJhd1JlY3QgfSwKKworICAgIHsgICAibkdldENsaXBCb3VuZHMiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspWiIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRDbGlwQm91bmRzIH0sCit9OworCisjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpIFwKKyAgICAgICAgdmFyID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsgXAorICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBjbGFzcyAiIGNsYXNzTmFtZSk7IFwKKyAgICAgICAgdmFyID0gamNsYXNzKGVudi0+TmV3R2xvYmFsUmVmKHZhcikpOworCisjZGVmaW5lIEdFVF9NRVRIT0RfSUQodmFyLCBjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcikgXAorICAgICAgICB2YXIgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKTsgXAorICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiBtZXRob2ROYW1lKTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpIHsKKyAgICBGSU5EX0NMQVNTKGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAiYW5kcm9pZC9ncmFwaGljcy9SZWN0Iik7CisgICAgR0VUX01FVEhPRF9JRChnUmVjdENsYXNzSW5mby5zZXQsIGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAic2V0IiwgIihJSUlJKVYiKTsKKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwga0NsYXNzUGF0aE5hbWUsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDc4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfSGFyZHdhcmVSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1dGlscy9Ta0dMQ2FudmFzLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19IYXJkd2FyZVJlbmRlcmVyX2FiYW5kb25HbENhY2hlcyhKTklFbnYqIGVudiwgam9iamVjdCkgeworICAgIFNrR0xDYW52YXM6OkFiYW5kb25BbGxUZXh0dXJlcygpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgICAibmF0aXZlQWJhbmRvbkdsQ2FjaGVzIiwgIigpViIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXJfYWJhbmRvbkdsQ2FjaGVzIH0sCit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIoSk5JRW52KiBlbnYpIHsKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICBrQ2xhc3NQYXRoTmFtZSwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcAppbmRleCA1MTczYmI4Li4yOTg4YWU4IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKQEAgLTc2LDEwICs3Niw2IEBACiAgICAgY2FudmFzLT5yZXN0b3JlKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19WaWV3Um9vdF9hYmFuZG9uR2xDYWNoZXMoSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICBTa0dMQ2FudmFzOjpBYmFuZG9uQWxsVGV4dHVyZXMoKTsKLX0KLQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTg3LDkgKzgzLDcgQEAKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewogICAgIHsgICAibmF0aXZlU2hvd0ZQUyIsICIoTGFuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzO0kpViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9zaG93RlBTIH0sCi0gICAgeyAgICJuYXRpdmVBYmFuZG9uR2xDYWNoZXMiLCAiKClWIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3RfYWJhbmRvbkdsQ2FjaGVzIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X3Nob3dGUFMgfQogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19WaWV3Um9vdChKTklFbnYqIGVudikgewpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjFmODFkZi4uZTA0NGMyYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zNDcsNiArMzQ3LDEzIEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gaW50ZXJuYWwgdXNlciB0byB1c2UgcHJpdmFsZWRnZWQgQ29ubmVjdGl2aXR5TWFuYWdlcgorICAgIEFQSXMuCisgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5ORVRXT1JLIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iIC8+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgYWNjZXNzaW5nIGFjY291bnRzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjIwZTQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNkZjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKQEAgLTAsMCArMSw5Nzg0IEBACitJU084ODU5LTEKK0xFRlRIWVBIRU5NSU4gMgorUklHSFRIWVBIRU5NSU4gMworLmEyY2g0CisuYWQ0ZGVyCisuYTJkCisuYWQxZDQKKy5hMmYxdAorLmEyZgorLmE0bDN0CisuYW01YXQKKy40YTFtYQorLmFuNWMKKy5hMm4KKy4yYW5nNAorLmFuMWk1bQorLmFuMXQ0CisuYW4zdGUKKy5hbnRpNXMKKy5hbnQyaQorLmE0cjVzMgorLjJhMnIKKy5hcjR0MmllNAorLmFyMXRpCisuYXI0dHkKKy5hczNjCisuYXMxcAorLmEyczFzCisuYXN0ZXI1CisuYTJ0b201CisuYTF0bworLmF1MWQKKy5hdjRpCisuYXduNAorLmJhNGcKKy5iYTVuYQorLmJhMm4KKy5iYXM0ZQorLmJlcjQKKy5iZTVyMWEKKy5iZTNzMW0KKy40YmVzNAorLmI0ZTVzMnRvCisuYnJpMgorLmJ1dDR0aQorLmJ1NHQzdDIKKy5jYW00cGUKKy4xY2EKKy5jYTRtMXAKKy5jYW41YworLmNhMm4KKy5jYXBhNWIKKy5jYTFwYQorLmNhcjVvbAorLmMyYTJyCisuY2E0dAorLmNlNGxhCisuMmNoNAorLmNoaWxsNWkKKy5jaDRpbDIKKy5jaGlsMWwKKy4xY2kyCisuY2l0NXIKKy4yYzFpdAorLmNvM2UyCisuMWNvCisuY280cgorLmNvcjVuMWVyCisuY29ybjJlCisuZGU0bW9pMgorLmQ0ZW0KKy5kZTFtbworLmRlM28KKy5kZTNyMWEKKy5kZTNyMWkKKy5kZTFzNGMKKy5kZXMyCisuZGljMXQyaW81CisuM2RpMmMxdAorLmRvNHQKKy4xZG8KKy5kdTRjCisuMWR1CisuZHU0bTFiNQorLmVhcnRoNQorLmVhcjJ0CisuZTJhMnIKKy5lYXMzaQorLjJlMWI0CisuZWVyNAorLmVnMgorLmUybDVkCisuZWwzZW0KKy5lbmFtMworLmUxbmEKKy5lbjNnCisuZTJuM3MyCisuZXE1dWk1dAorLmUxcQorLmVxdTIKKy5lcTJ1aTIKKy5lcjRyaQorLmVyMXI0CisuZXMzCisuNGV1MworLmV5ZTUKKy5mZXMzCisuZm9yNW1lcgorLjFmbworLmZvMnIKKy5mb3IxbQorLmZvcjJtZQorLjFnYTIKKy5nZTIKKy5nZW4zdDQKKy4xZ2VuCisuZ2U1bzJnCisuMWdlbworLjFnMmk1YQorLmdpNGIKKy5nbzRyCisuMWdvCisuaGFuZDVpCisuaGEybgorLmg0YW5kCisuaGE0bjVrMgorLmhlMgorLmhlcm81aTIKKy5oMmVybworLmgxZXMzCisuaGU0dDMKKy5oaTNiCisuaGkzZXIKKy5oMmllNAorLmhvbjVleQorLmhvMm4KKy5ob24zbworLmhvdjUKKy5pZDRsCisuMmlkCisuaWRvbDMKKy5pMWRvCisuaW0zbQorLmltNXAxaTJuCisuaTRtMXAKKy5pbTJwaQorLmluMQorLmluM2NpCisuMmluZTIKKy40aTRuMmsyCisuMmkybjNzMgorLmlyNXI0CisuNGlyCisuaXM0aQorLmp1M3IKKy5sYTRjeQorLmxhNG0KKy5sYXQ1ZXIKKy5sNGF0aDUKKy5sZTIKKy5sZWc1ZQorLmxlbjQKKy5sZXA1CisubGV2MQorLmwyaTRnCisubGkxZzVhCisubGkybgorLmwyaTNvCisubDFpNHQKKy5tYTFnNWE1CisuMW1hCisubWFsNW8KKy5tYTFuNWEKKy5tYTJuCisubWFyNXRpCisubTJhMnIKKy5tZTIKKy5tZXIzYworLm1lNXRlcgorLm1lMXRlCisubTJpczEKKy5taXM0dDVpCisubW9uM2UKKy4xbW8KKy5tbzJuCisubW8zcm8KKy5tbzJyCisubXU1dGEKKy4xbXUKKy5tdTJ0YTViCisubmk0YworLm9kMgorLm9kMWQ1Cisub2Y1dGUKKy5vMmZ0Cisub3I1YTF0bworLm8xcmEKKy5vcjNjCisub3IxZAorLm9yM3QKKy5vczMKKy5vczR0bAorLjRvdGgzCisub3V0MworLm91MgorLnBlZDVhbAorLjJwMmVkCisucDJlMmQyYQorLnBlNXRlCisucGUydAorLnBlNXRpdAorLnAyaTRlNAorLnBpbzVuNAorLjNwMmkxbworLnBpMnQKKy5wcmUzbQorLnByMgorLnJhNGMKKy5yYW40dAorLnJhMm4KKy5yYXRpbzVuMWEKKy5yYXRpbzJuNAorLnJhMXQyaW8KKy5yZWUyCisucmU1bWl0CisucmVzMgorLnJlNXN0YXQKKy5yZXMydAorLnJlczF0YQorLnIyaTRnCisucmkydDV1Cisucm80cQorLnJvczV0Cisucm93NWQKKy5ydTRkCisuM3M0YzJpM2U0CisuczFjaQorLjVzZTJsMmY1Cisuc2VsMWw1Cisuc2UybgorLnNlNXIyaWU0Cisuc2VyMWkKKy5zMmgyCisuc2kyCisuczNpbmc0CisuMnMxaW4KKy5zdDQKKy5zdGE1YjJsMgorLnMxdGEKKy5zMnRhYgorLnM0eTIKKy4xdGE0CisudGU0CisuM3RlbjVhMm4KKy50ZTFuYQorLnRoMgorLnRpMgorLnRpbDQKKy50aTFtNW81CisuMXRpbQorLnRpbmc0CisuMnQxaW4KKy50NGk0bjVrMgorLnRvMW40YQorLjF0bworLnRvMm4KKy50bzRwCisudG9wNWkKKy50bzJ1NXMKKy50b3UyCisudHJpYjV1dAorLnRyNGliCisudTFuMWEKKy51bjNjZQorLnVuZGVyNQorLnVuMWRlCisudTJuMWUKKy51NG41azIKKy51bjVvCisudW4zdTQKKy51cDMKKy51cmUzCisudXM1YTIKKy4ydXMKKy52ZW40ZGUKKy52ZTVyMWEKKy53aWw1aQorLndpMgorLndpbDIKKy55ZTQKKzRhYi4KK2E1YmFsCithNWJhMm4KK2FiZTIKK2FiNWVyZAorYWIyaTVhCithYjVpMnQ1YWIKK2FiaTJ0CithYmkxdGEKK2FiNWxhdAorYWIybDIKK2FiNW81bDFpegorYWJvbDJpCis0YWJyCithYjVyb2cKK2FiM3VsCithNGMyYTJyCithMWNhCithYzVhcmQKK2FjNWFybworYTVjZW91MgorYWMxZXIKK2E1Y2hlNHQKK2EyY2gKK2FjaGUyCis0YTJjaQorYTNjMmllNAorYTJjMWluCithM2MyaW8KK2FjNXJvYgorYWN0NWlmMgorYTJjMXQKK2FjM3VsCithYzR1bQorYTJkCithZDRkMWluCithZDFkNAorYWQ1ZXIuCisyYWRpCithM2Q0aTNhCithZDNpMWNhCithZGk0ZXIKK2FkMmllNAorYTNkMmlvCithM2RpdAorYTVkaTF1CithZDRsZQorYWQzb3cKK2ExZG8KK2FkNXJhMm4KK2ExZHIKK2FkNHN1CithMmQxczIKKzRhMWR1CithM2R1MmMKK2FkNXVtCithZTRyCithZXIyaTRlNAorYWVyMWkKK2EyZgorYTRmMWY0CithNGdhYgorYTFnYQorYWdhNG4KK2FnNWVsMWwKK2ExZ2U0bworNGFnNGV1CithZzFpCis0YWc0bDIKK2FnMW4KK2EyZ28KKzNhM2c0bzRnCithZzNvM25pCithZ28ybjIKK2E1Z3VlcgorYTJndWUKK2FnNXVsCithNGd5CithM2hhCithM2hlCithNGg0bDQKK2EzaG8KK2FpMgorYTVpMWEKK2EzaWMuCithaTVseQorYTRpNG4KK2FpbjVpbgorYTJpbmkKK2EyaTFuNW8KK2FpdDVlbgorYTJpdGUKK2ExagorYWsxZW4KK2FsNWFiCithbDNhMmQKK2E0bDJhMnIKKzRhbGRpNAorYTJsZAorMmFsZQorYWwzZW5kCithNGxlbnQyaQorYTFsZW4xdAorYTVsZTVvCithbDFpCithbDRpYS4KK2FsMmkxYQorYWwyaTRlNAorYWw1bGV2CithbDFsCithbDJsZQorNGFsbGljCithbGwyaQorNGEybG0KK2E1bG9nLgorYTRseS4KK2ExbHkKKzRhMmx5czQKKzVhNWx5czF0Cis1YWx5dAorM2FseXoKKzRhMW1hCithMm01YWIKK2FtM2FnCithbWE1cmEKK2FtMmEycgorYW01YXNjCithNG1hM3RpcworYTRtNWExdG8KK2FtNWVyMWEKK2FtM2ljCithbTVpZgorYW01aTFseQorYW0xaW4KK2FtMmk0bm8KK2EybW8KK2E1bW8ybgorYW1vcjVpCithbW8ycgorYW1wNWVuCithNG0xcAorYTJuCithbjNhZ2UKK2ExbmEKKzNhbmExbHkKK2EzbjJhMnIKK2FuM2FyM2MKK2FuYXI0aQorYTNuYXRpCithbjJhdAorNGFuZAorYW5kZTRzMgorYW4xZGUKK2FuM2RpczEKK2FuMWRsCithbjRkb3cKK2FuMWRvCithNW5lZQorYTNuZW4KK2FuNWUyc3QuCithMW5lcworYTJuZXN0CithM240ZXUKKzJhbmcKK2FuZzVpZTQKK2FuMWdsMgorYTRuMWljCithM25pZXMKK2FuMmllNAorYW4zaTNmCithbjRpbWUKK2FuMWltCithNW5pbTFpCithNW4yaW5lCithbjFpbgorYW4zaTRvCithM24yaXAKK2FuM2lzMmgKK2FuM2l0CithM25pMXUKK2FuNGtsaQorYTRuazIKK2FuMWsxbAorNWFubml6CithNG4xbjIKK2FubzQKK2FuNW90CithbjRvdGg1CithbjJzYTIKK2EybjFzMgorYW40czFjbworYW5zNGMKK2FuNHMxbjQKK2FuMnNwCithbnMzcG8KK2FuNHN0CithbjRzdTJyCithbjFzdQorYW50YTJsNAorYW4xdAorYW4xdGEKK2FuNHQyaWU0CithbnQyaQorNGFuMXRvCithbjJ0cgorYW40dHc0CithbjN1MWEKK2FuM3VsCithNW51cgorNGFvCithcDJhMnI0CithMXBhCithcDVhdAorYXA1ZXIzbworYTNwaDRlcgorNGFwaGkKK2E0cGlsbGEKK2FwaWwxbAorYXA1aWxsMmEycgorYXAzaTJuCithcDNpMXRhCithM3BpMnR1CithMnAybDIKK2FwbzRjNQorYXA1bzFsYQorYXBvcjVpCithMXA0b3IKK2Fwb3MzdAorYTFwb3MKK2FwczVlNHMKK2EycDFzMgorYXAyc2UKK2EzcHUKK2FxdWU1CithcXUyCisyYTJyCithcjNhMmMxdAorYTVyYWRlCithcmEyZAorYXI1YWRpczEKK2FyMmFkaQorYXIzYWwKK2E1cmFtZTF0ZQorYXJhbTNldAorYXIyYW40ZworYXJhMm4KK2FyYTNwCithcjRhdAorYTVyYTF0MmlvCithcjVhMXQyaXYKK2E1cmF1CithcjVhdjQKK2FyYXc0CithcmJhbDQKK2FyMWIKK2FyNGNoYTJuCithcjFjCithcjNjaGEKK2FyMmNoCithcjVkMmluZQorYXJkMmkKK2FyZDFpbjQKK2FyNGRyCithcjVlYXMKK2EzcmVlCithcjNlbjF0CithNXIyZTJzcworYXI0ZmkKK2FyMWYKK2FyNGY0bDIKK2FyMWkKK2FyNWkyYWwKK2FyMmkzYQorYXIzaTJhMm4KK2Ezcmk1ZXQKK2FyMmllNAorYXI0aW0KK2FyNWluMmF0CithcjJpMW5hCithcjNpMW8KK2FyMml6CithcjJtaQorYXIxbQorYXI1bzVkCithNXJvbmkKK2FybzJuCithM3JvbzIKK2FyMnAKK2FyM3EKK2FycmU0CithcjFyNAorYXI0c2EyCithNHJzMgorYXIyczJoCis0YXMuCithMnM0YWIKK2FzYTIKK2FzM2FuMXQKK2FzYTJuCithc2hpNAorYXMyaAorYTVzaWEuCithczJpMWEKK2Ezc2kxYgorYTNzaWMKKzVhNXNpNHQKK2FzazNpCithc2syCithczRsMgorYTRzb2MKK2Exc28KK2FzNXBoCithczRzMmgKK2Eyc3MKK2FzM3RlbgorYXMxdDRyCithc3UxcjVhCithMXN1Cithc3UycgorYTJ0YQorYXQzYWIybDIKK2EydGFiCithdDVhYworYXQzYWxvCithdGEybAorYXQ1YXAKK2F0ZTVjCithdDVlMmNoCithdDNlMWdvCithdGVnNAorYXQzZW4uCithdDNlcjFhCithdGVyNW4KK2E1dGVyMW5hCithdDNlc3QKK2F0NWV2Cis0YXRoCithdGg1ZW0KK2F0aDJlCithNXRoZTJuCithdDRobworYXRoNW9tCis0YXRpLgorYTV0MmkxYQorYTJ0NWk1YgorYXQxaWMKK2F0M2lmMgorYXRpb241YTJyCithMXQyaW8KK2F0aW8ybgorYXRpbzFuMWEKK2F0M2kxdHUKK2E0dG9nCithMXRvCithMnRvbQorYXQ1b20yaXoKK2E0dG9wCithNHRvczIKK2ExdHIKK2F0NXJvcAorYXQ0c2syCithNHQxczIKK2F0NHRhZworYTR0M3QyCithdDF0YQorYXQ1dGUKK2F0NHRoCithMnR1CithdDV1MWEKK2E0dDV1ZQorYXQzdWwKK2F0M3UxcmEKK2EydHkKK2F1NGIKK2F1Z2gzCithdTNndQorYXU0bDIKK2F1bjVkCithdTNyCithdTVzaTFiCithMnVzCithNHV0NWVuCithdTF0aAorYTJ2YQorYXYzYWc0CithNXZhMm4KK2F2NGU0bm8KK2F2M2VyMWEKK2F2NWVybgorYXY1ZXJ5CithdjFpCithdmk0ZXIKK2F2MmllNAorYXYzaWcKK2F2NW9jCithMXZvcgorM2F3YXkKK2F3M2kyCithdzRseQorYXdzNAorYXg0aTVjCitheDNpCitheDRpZAorYXk1YWwKK2F5ZTQKK2F5czQKK2F6aTRlcgorYTJ6MWkKK2F6MmllNAorYXoyejVpCithNHoxejIKKzViYS4KK2JhZDVnZXIKK2JhMmQKK2JhNGdlCitiYWwxYQorYmFuNWRhZworYmEybgorYjRhbmQKK2JhbjFkMmEKK2JhbjRlCitiYW4zaQorYmFyYmk1CitiMmEycgorYmFyMWIKK2JhcjJpNGEKK2JhcjFpCitiYXM0c2kKK2JhMnNzCisxYmF0CitiYTR6CisyYjFiCitiMmJlCitiM2JlcgorYmJpNG5hCis0YjFkCis0YmUuCitiZWFrNAorYmVhMnQzCis0YmUyZAorYjJlM2QyYQorYmUzZGUKK2I0ZTNkaQorYmUzZ2kKK2JlNWd1CisxYmVsCitiZTFsMmkKK2JlM2xvCis0YmU1bQorYmU1bjJpZworYmU1bnUKKzRiZXM0CitiZTNzcAorYjJlNXN0NHIKKzNiZXQKK2JlMXQ1aXoKK2JlNXRyCitiZTN0dzQKK2JlM3cKK2JlNXkxbzQKKzJiZgorNGIzaAorYmkyYgorYjJpNGQKKzNiMmllNAorYmk1ZW4KK2JpNGVyCisyYjNpZgorMWJpbAorYmkzbDJpegorYmlsMWkKK2JpbjJhNXI0CitiaTFuYQorYjRpbjRkCitiaTVuZXQKK2IyaW5lCitiaTNvMmdyCitiMmlvCitiaTVvdTIKK2JpMnQKKzNiMmkzdDJpbworYmkxdGkKK2JpM3RyCiszYml0NXUxYQorYmkxdHUKK2I1aTR0egorYjFqCitiazQKK2IybDIKK2JsNGF0aDUKK2I0bGUuCitibGVuNAorNWJsZTFzcAorYmxlczIKK2IzbGlzCitiNGxvCitibHVuNHQKKzRiMW0KKzRiM24KK2JuZTVnCiszYm9kCitib2QzaQorYm80ZQorYm9sM2ljCitib2wyaQorYm9tNGJpCitibzRtMWIKK2JvMW40YQorYm8ybgorYm9uNWF0CiszYm9vMgorNWJvci4KKzRiMW8xcmEKK2JvcjVkCis1Ym9yZQorNWJvcmkKKzVib3M0CitiNW8xdGEKK2I0b3RoNQorYm80dG8KK2JvdW4yZDMKK2JvdTIKKzRicAorNGJyaXQKK2JyNG90aDMKKzJiNXMyCitic29yNAorYjFzbworMmJ0CitiMnQ0bAorYjR0bworYjN0cgorYnVmNGZlcjEKK2J1NGYxZgorYnU0Z2EKK2J1M2wyaQorYnUxbWk0CitidTRuCitidW50NGkKK2J1bjF0CitidTNyZQorYnVzNWllNAorYjJ1cworYnVzczRlCitidTJzcworNWJ1c3QKKzRidTF0YQorM2J1MXQyaW8KK2I0dTF0MmkKK2I1dTF0bworYjF2Cis0YjV3Cis1YnkuCitieXM0CisxY2EKK2NhYjNpbgorY2ExYjJsMgorY2EyY2g0CitjYTVkZW4KK2NhMmQKKzRjYWc0CisyYzVhaAorY2EzbGF0CitjYWw0bGEKK2NhbDFsCitjYWwybDVpbjQKK2NhbGwyaQorNGNhbG8KK2M0YW41ZAorY2EybgorY2FuNGUKK2NhNG40aWMKK2NhbjVpcworY2FuM2l6CitjYW40dHkKK2NhbjF0CitjYW55NAorY2E1cGVyCitjYXI1b20KK2MyYTJyCitjYXN0NWVyCitjYXM1dDJpZworY2FzdDJpCis0Y2FzNHkKK2M0YTR0aAorNGNhMXQyaXYKK2NhdjVhbAorY2EydmEKK2MzYworY2NoYTUKK2MyY2gKK2MzYzJpNGEKK2MxY2kKK2Njb20xcGE1CitjMWNvCitjY280bTFwCitjY28ybjQKK2Njb3UzdAorY2NvdTIKKzJjZS4KKzRjZWQuCis0Y2UxZGVuCiszY2VpMgorNWNlbC4KKzNjZWwxbAorMWNlbgorM2NlbmMKKzJjZW40ZQorNGNlbmkKKzNjZW4xdAorM2NlcAorY2U1cmFtCitjZXIxYQorNGNlMXM0YTIKKzNjZXMxc2kKK2MyZTJzcworY2VzNXNpNWIKK2NlczV0CitjZXQ0CitjNWU0dGEKK2NldzQKKzJjaAorNGNoLgorNGNoM2FiCis1Y2hhNG4xaWMKK2NoYTJuCitjaDVhNW5pcworY2hlMgorY2hlYXAzCis0Y2g0ZWQKK2NoNWU1bG8KKzNjaGVtaQorY2g1ZW5lCitjaGUybgorY2gzZXIuCitjaDNlNHIxczIKKzRjaDFpbgorNWNoaTJuZS4KK2NoMmluZQorY2g1aTVuMmUyc3MKK2NoaTFuZXMKKzVjaDJpbmkKKzVjaDJpbworM2NoaXQKK2NoaTJ6CiszY2hvMgorY2g0dGkKKzFjaQorM2MyaTFhCitjaTJhNWIKK2NpMmE1cgorY2k1YworNGNpZXIKK2MyaWU0Cis1YzRpMmYzaWMuCitjaTFmaQorNGM0aTVpNAorY2k0bGEKKzNjaWwxaQorMmNpbQorMmNpbgorYzRpMW5hCiszY2luMmF0CitjaW4zZW0KK2MyaW5lCitjMWluZworYzVpbmcuCis1YzJpMW5vCitjaW8ybjQKK2MyaW8KKzRjaXBlNAorYzJpcAorY2kzcGgKKzRjaXA0aWMKK2NpcDNpCis0Y2lzMXRhCis0Y2lzMXQyaQorMmMxaXQKK2NpMXQzaXoKK2NpMXRpCis1Y2l6CitjazEKK2NrM2kKKzFjNGw0Cis0Y2wyYTJyCitjNWxhNXJhMXQyaW8KK2NsYXI0YXQKKzVjbGFyZQorY2xlNG0KKzRjbGljCitjbGltNAorYzFseTQKK2M1bgorMWNvCitjbzVhZworYzRvYQorY29lMgorMmNvZworY280Z3IKK2NvaTQKK2NvM2luYworY29sNWkKKzVjb2xvCitjb2wzbzRyCitjb201ZXIKK2NvMm1lCitjbzFuNGEKK2NvMm4KK2M0b25lCitjb24zZworY29uNXQKK2NvM3BhCitjb3AzaWMKK2NvNHAybDIKKzRjb3IxYgorY29ybzNuCitjb3M0ZQorY292MQorY292ZTQKK2NvdzVhCitjbzJ6NWUKK2NvNXoxaQorYzFxCitjcmFzNXQKK2NyMmFzCis1Y3JhdC4KKzVjcmF0MWljCitjcmUzYTJ0Cis1YzJyMmVkCis0YzNyZTF0YQorY3JlNHYyCitjcmkyCitjcmk1ZgorYzRyaW4KK2NyMmlzNAorNWNyaTF0aQorY3JvNHAybDIKK2Nyb3A1bworY3JvczRlCitjcnU0ZAorNGMzczIKKzJjMXQKK2MydGE0YgorYzF0YQorY3Q1YW5nCitjdGEybgorYzV0YW4xdAorYzJ0ZQorYzN0ZXIKK2M0dDRpYzF1CitjdGltM2kKK2MxdGltCitjdHU0cgorYzF0dQorYzR0dzQKK2N1ZDUKK2M0dWYKK2M0dWkyCitjdTVpMXR5Cis1Y3VsMmkKK2N1bDR0aXM0CitjdWwxdGkKK2N1NGx0CiszYzR1bDF0dTIKK2N1Mm1hCitjM3VtZQorY3U0bWkKKzNjdW4KK2N1M3BpCitjdTVweQorY3UycjVhNGIKK2N1MXJhCitjdTVyMmkzYQorMWMydXMKK2N1czFzNGkKK2N1MnNzCiszYzR1dAorY3U0dDJpZTQKK2M0dTF0MmkKKzRjNXUxdDJpdgorNGN1dHIKKzFjeQorYzJ6ZTQKKzFkMmEKKzVkYS4KKzJkM2E0YgorZGEyY2g0Cis0ZGEyZgorMmRhZworZGEybTIKK2QyYW4zZworZGEybgorZGFyZDUKK2QyYTJyCitkYXJrNQorNGRhcnkKKzNkYXQKKzRkYTF0Mml2Cis0ZGExdG8KKzVkYXY0CitkYXY1ZQorNWRheQorZDFiCitkNWMKK2QxZDQKKzJkZS4KK2RlYTJmNQorZGU0YjVpMnQKK2QyZTFiCitkZTRibzJuCitkZWNhMm40CitkZTFjYQorZGU0Y2lsCitkZTFjMmkKK2RlNWNvbQorZGUxY28KKzJkMWVkCis0ZGVlLgorZGU1aWYKK2RlaTIKK2RlbDJpNGU0CitkZWwyaQorZGU0bDVpNXEKK2RlNWxvCitkNGVtCis1ZGVtLgorM2RlbWljCitkZW01aWMuCitkZTVtaWwKK2RlNG1vMm4zczIKK2RlMW1vCitkZW1vMm4KK2RlbW8ycjUKKzFkZW4KK2RlNG4yYTJyCitkZTFuYQorZDRlM25vCitkZW50aTVmMgorZGVuMXQKK2RlbnQyaQorZGUzbnUKK2RlMXAKK2RlM3BhCitkZXBpNAorZGUycHUKK2QzZTFxCitkNGVyMWg0Cis1ZGVyM200CitkNWVybjVpegorZGU0cjVzMgorZGVzMgorZDJlcy4KK2RlMXMyYworZGUyczVvCitkZXMzdDJpCitkMmUzc3Q0cgorZGU0c3UKK2RlMXQKK2RlMnRvCitkZTF2CitkZTJ2M2k0bAorZGUxdmkKKzRkZXkKKzRkMWYKK2Q0Z2EKK2QzZ2U0dAorZGcxaQorZDJneQorZDFoMgorNWRpLgorMWQ0aTNhCitkaWE1YgorZDRpNGNhbQorZGkxY2EKK2Q0aWNlCiszZGkyYzF0CiszZDJpZAorNWRpM2VuCitkMmllNAorZDFpZgorZGkzZ2UKK2QyaWcKK2RpNGxhMXRvCitkaTFsYQorZDFpbgorMWRpMW5hCiszZGkybmUuCitkMmluZQorNWQyaW5pCitkaTVuaXoKKzFkMmlvCitkaW81ZworZGk0cDJsMgorZDJpcAorZDRpcjIKK2RpMXJlCitkaXIxdDVpCitkaXMxCis1ZGlzaQorZDRpczN0CitkMmkxdGkKKzFkMmkxdgorZDFqCitkNWsyCis0ZDVsYQorM2RsZS4KKzNkbGVkCiszZGxlcy4KK2RsZXMyCis0ZDNsMmUyc3MKKzJkM2xvCis0ZDVsdQorMmQxbHkKK2QxbQorNGQxbjQKKzFkbworM2RvLgorZG81ZGUKKzVkb2UKKzJkNW9mCitkNG9nCitkbzRsYQorZG9sMmk0CitkbzVsbzRyCitkb201aXoKK2RvM24yYXQKK2RvMm4KK2RvMW4xYQorZG9uaTQKK2RvbzNkCitkb28yCitkbzRwNHAKK2Q0b3IKKzNkb3MKKzRkNW91dAorZG91MgorZG80dgorM2RveAorZDFwCisxZHIKK2RyYWc1bzJuMgorZHJhMmdvCis0ZHIyYWkyCitkcmU0CitkcmUyYTVyCis1ZHJlbgorZHI0aTRiCitkcmlsNAorZHJvNHAKKzRkcm93Cis1ZHJ1cGxpCitkcnUzcDJsMgorNGRyeQorMmQxczIKK2RzNHAKK2Q0c3cyCitkNHM0eQorZDJ0aAorMWR1CitkMXUxYQorZHUyYworZDF1M2NhCitkdWM1ZXIKKzRkdWN0LgorZHUyYzF0Cis0ZHVjNHQxczIKK2R1NWVsCitkdTRnCitkM3VsNGUKK2R1bTRiZQorZHU0bTFiCitkdTRuCis0ZHVwCitkdTRwZQorZDF2CitkMXcKK2QyeQorNWR5bgorZHk0czJlCitkeXM1cAorZTFhNGIKK2UzYTJjMXQKK2VhMmQxCitlYWQ1aWU0CitlMmFkaQorZWE0Z2UKK2VhNWdlcgorZWE0bAorZWFsNWVyCitlMmFsZQorZWFsM291MgorZWFtM2VyCitlNWFuZAorZWEybgorZWFyM2EKK2UyYTJyCitlYXI0YworZWFyNWVzCitlYXI0aWMKK2VhcjFpCitlYXI0aWwKK2VhcjVrCitlYXIydAorZWFydDNlCitlYTVzcAorZTNhMnNzCitlYXN0MworZWEydAorZWF0NWVuCitlYXRoM2kKK2U0YXRoCitlNWF0M2lmMgorZTRhM3R1CitlYTJ2CitlYXYzZW4KK2VhdjVpCitlYXY1bworMmUxYgorZTRiZWwuCitlMWJlbAorZTRiZTJsMXMyCitlNGJlbgorZTRiaTJ0CitlM2JyCitlNGNhMmQKK2UxY2EKK2VjYW41YworZWNhMm4KK2VjMWNhNQorZWMzYworZTFjZQorZWM1ZXMxc2EyCitlYzJlMnNzCitlMWMyaQorZTRjaWIKK2VjNWlmaWNhdAorZWNpMWZpCitlY2lmaTFjYQorZWM1aTNmMmllNAorZWM1aTFmeQorZTJjM2ltCitlMmMxaTR0CitlNWMyaXRlCitlNGNsYW0KK2UxYzRsNAorZTRjbDJ1cworZTJjb2wKK2UxY28KK2U0Y29tMW0KK2U0Y29tcGUKK2VjbzRtMXAKK2U0Y29uMWMKK2VjbzJuCitlMmNvcgorZWMzbzFyYQorZWNvNXJvCitlMWNyCitlNGNyZW0KK2VjNHRhMm4KK2UyYzF0CitlYzF0YQorZWM0dGUKK2UxY3UKK2U0Y3VsCitlYzN1MWxhCisyZTJkMmEKKzRlZDNkNAorZTRkMWVyCitlZGU0czIKKzRlZGkKK2UzZDRpM2EKK2VkM2liCitlZDNpMWNhCitlZDNpbQorZWQxaXQKK2VkaTV6Cis0ZTFkbworZTRkb2wKK2VkbzJuMgorZTRkcmkKK2UxZHIKK2U0ZHVsCitlMWR1CitlZDV1MWw0bworZWUyYworZTRlZDNpCitlZTJmCitlZWwzaQorZWU0bHkKK2VlMm0KK2VlNG5hCitlZTRwMQorZWUyczQKK2Vlc3Q0CitlZTR0eQorZTVleAorZTFmCitlNGYzZXJlCitlZmVyMQorMWU0ZjFmCitlNGZpYworZTFmaQorNWVmMmkxYzRpCitlZmlsNAorZTNmMmkybmUKK2UyZmluCitlZjVpNW4yaXRlCitlZjJpbmkKK2VmaW4yaXQKKzNlZml0CitlZm9yNWVzCitlMWZvCitlZm8ycgorZTRmdTRzZS4KK2UzZnUKK2VmMnVzCis0ZWdhbAorZTFnYQorZWdlcjQKK2VnNWliCitlZzRpYworZWc1aW5nCitlNWdpdDUKK2VnNW4KK2U0Z28uCitlMWdvCitlNGdvcworZWcxdWwKK2U1Z3VyCis1ZTFneQorZTFoNAorZWhlcjQKK2VpMgorZTVpYworZTJpNWQKK2UyaWcyCitlaTVnNGwyCitlM2k0bTFiCitlM2luM2YKK2UxaW5nCitlNWluc3QKK2UyaTJuMXMyCitlaXI0ZAorZTRpcgorZTJpdDNlCitlMmkzdGgKK2U1aTF0eQorZTFqCitlNGp1ZAorZWo1dWRpCitla2k0bgorZWsxaQorZWs0bGEKK2VrMWwKK2UxbGEKK2U0bGEuCitlNGxhYworZTNsNGFuNGQKK2VsYTJuCitlNGw1YTF0Mml2CitlNGxhdworZWxheDFhNAorZTNsZTJhCitlbDVlYnJhCitlbDJlMWIKK2VsZTNicgorNWVsZWMKK2U0bGVkCitlbDNlMWdhCitlNWxlbgorZTRsMWVyCitlMWxlczIKK2UybDJmCitlbDJpCitlM2xpYmU0CitlNGw1aWMuCitlbDNpMWNhCitlM2xpZXIKK2VsMmllNAorZWw1aTNnaWIKK2VsMmlnCitlbDRpZ2kKK2U1bGltCitlNGwzaW5nCitlM2wyaW8KK2UybGlzCitlbDVpczJoCitlM2wyaXYzCis0ZWxsYQorZWwxbAorZWw0bGFiCitlbGw0bzQKK2U1bG9jCitlbDVvZworZWwzb3AuCitlbDJzMmgKK2UybDFzMgorZWw0dGEKK2U0bHQKK2U1bHVkCitlbDV1ZworZTRtYWMKK2UxbWEKK2U0bWFnCitlNW1hMm4KK2VtNWExbmEKK2U0bTViCitlMW1lCitlMm1lbAorZTRtZXQKK2VtM2kxY2EKK2VtMmk0ZTQKK2VtNWlncmEKK2VtMmlnNAorZW1pMWdyCitlbTFpbjIKK2VtNWluZQorZW0zaTNuaQorZTRtMmlzCitlbTVpczJoCitlNW00aTJzMXMKK2VtM2l6Cis1ZW1uaXoKK2U0bTFuCitlbW80ZworZTFtbworZW1vM24yaTVvCitlbW8ybgorZW0zcGkKK2U0bTFwCitlNG11bAorZTFtdQorZW01dTFsYQorZW11M24yCitlM215CitlbjVhMm1vCitlMW5hCitlNG5hbjF0CitlbjJhMm4KK2VuY2g0ZXIKK2VuMmNoCitlbmNoZTIKK2VuM2RpYworZTVuZWEKK2U1bmVlCitlbjNlbQorZW41ZXJvCitlbjFlcgorZW41ZTFzaQorZTFuZXMKK2UybjVlc3QKK2VuM2V0cgorZTNuZTR3CitlbjVpNGMzczIKK2U1bjJpZTQKK2U1bmlsCitlM24yaTRvCitlbjNpczJoCitlbjNpdAorZTVuaTF1Cis1ZW5pegorNGU0bjFuMgorNGVubworZTRubzRnCitlNG5vcworZW4zb3YKK2VuNHN3MgorZTJuMXMyCitlbnQ1YWdlCitlbjF0CitlbjF0YQorNGVudGgxZXMKK2VudGgyZQorZW4zdTFhCitlbjV1ZgorZTNueS4KKzRlNG4zegorZTVvZgorZW8yZworZTRvaTQKK2Uzb2wKK2VvcDNhMnIKK2VvMnBhCitlMW9yCitlbzNyZQorZW81cm9sCitlb3M0CitlNG90CitlbzR0bworZTVvdXQKK2VvdTIKK2U1b3cKK2UycGEKK2UzcDRhaTIKK2VwNWFuYworZXBhMm4KK2U1cGVsCitlM3BlbjF0CitlcDVlNXQyaTF0MmlvCitlcGUydAorZXBldGkxdGkKK2VwaGU0CitlNHBsaQorZTFwMmwyCitlMXBvCitlNHByZWMKK2VwcjIKK2VwNXJlMWNhCitlNHAycjJlZAorZXAzcmUxaDQKK2UzcHJvCitlNHByb2IKK2VwNHM0aAorZTJwMXMyCitlcDV0aTViCitlMnAxdAorZTRwdTJ0CitlcDV1MXRhCitlMXEKK2VxdWkzbAorZXF1MgorZXEydWkyCitlNHEzdWkzcworZXIxYQorZTJyYTRiCis0ZXI0YW5kCitlcmEybgorZXIzYTJyCis0ZXI0YXRpLgorMmVyMWIKK2VyNGIybDIKK2VyM2NoCitlcjFjCitlcjRjaGUyCisyZTJyZS4KK2UzcmUxYTRsCitlcmU1Y28KK2VyZTNpbgorZXJlaTIKK2VyNWVsLgorZXIzZTFtbworZXI1ZTFuYQorZXI1ZW5jZQorNGVyZW5lCitlcjNlbjF0CitlcmU0cQorZXI1ZTJzcworZXIzZXMydAorZXJldDQKK2VyMWg0CitlcjFpCitlMXIyaTNhNAorNWVyaWNrMQorZTNyaWVuCitlcjJpZTQKK2VyaTRlcgorZXIzaW40ZQorZTFyMmkxbworNGVyaXQKK2VyNGkxdQorZXIyaTR2CitlNHJpMXZhCitlcjNtNAorZXI0bmlzNAorNGVyM24yaXQKKzVlcm5pegorZXIzbm80CisyZXJvCitlcjVvYgorZTVyMm9jCitlcm80cgorZXIxb3UyCitlNHIxczIKK2VyM3NldAorZXIyc2UKK2VydDNlcgorNGVyMnRsCitlcjN0dzQKKzRlcnUKK2VydTR0Cis1ZXJ3YXUKK2VyMXcKK2UxczRhMgorZTRzYTJnZS4KK2U0c2FnZXMKK2VzMmMKK2UyczFjYQorZXM1Y2EybgorZTNzY3IKK2VzNWN1CitlMXMyZQorZTJzZWMKK2VzNWUxY3IKK2U0czVlbmMKK2U0c2VydC4KK2U0c2VyNHQxczIKK2U0c2VyMXZhCis0ZXMyaAorZTNzaGEKK2VzaDVlMm4KK2Uxc2kKK2Uyc2ljCitlMnMyaWQKK2VzNWkxZGVuCitlNHM1aWcxbjRhCitlczJpZworZTJzNWltCitlMnM0aTRuCitlc2lzNHRlCitlMXNpcworZTVzaTR1CitlNXNraW4KK2VzazIKK2VzazFpCitlczRtaQorZTJzMW0KK2Uyc29sCitlMXNvCitlczNvbHUKK2Uyc28ybgorZXM1bzFuMWE0CitlMXNwCitlMnMzcGVyCitlczVwaTFyYQorZXNwNGlyCitlczRwcmUKK2VzcHIyCisyZTJzcworZXM0c2k0YgorZXMxc2kKK2VzdGEybjQKK2VzMXRhCitlczN0MmlnCitlc3QyaQorZXM1dGltCis0ZXMydG8KK2Uzc3RvMm4KKzJlc3Q0cgorZTVzdHJvCitlc3RydWM1CitlMnN1MnIKK2Uxc3UKK2VzNXVyMXI0CitlczR3MgorZTJ0YTRiCitlMXRhCitlM3RlbjRkCitlM3RlbworZXRob2QzCitldDFpYworZTV0aWRlCitldDJpZAorZTJ0MWluNAorZXQyaTRubworZTV0NGlyCitlNXQyaTF0MmlvCitldGkxdGkKK2V0NWkxdDJpdgorNGUydDFuMgorZXQ1bzFuMWEKK2UxdG8KK2V0bzJuCitlM3RyYQorZTN0cmUKK2V0M3JpYworZXQ1cmlmCitldDNyb2cKK2V0NXJvcworZXQzdTFhCitlMXR1CitldDV5bQorZTF0eQorZTR0NXoKKzRldQorZTV1bgorZTN1cAorZXUzcm8KK2UydXM0CitldXRlNAorZXV0aTVsCitlNHUxdDJpCitldTV0cgorZXZhMnA1CitlMXZhCitlMnZhcworZXY1YXN0CitlNXZlYQorZXYzZWwxbAorZXZlNGwzbworZTV2ZW5nCitldmVuNGkKK2V2MWVyCitlNXYyZXIxYgorZTF2aQorZXYzaWQKK2Uydmk0bAorZTR2MWluCitlM3YyaTR2CitlNXZvYworZTV2dQorZTF3YQorZTR3YWcKK2U1d2VlCitlM3doCitld2lsNQorZXdpMgorZXczaW40ZworZTN3aXQKKzFleDNwCis1ZXkxYworNWV5ZS4KK2V5czQKKzFmYQorZmEzYjJsMgorZjRhYjNyCitmYTRjZQorNGZhZworZmE0aTRuNAorZmFpMgorZmFsMmw1ZQorZmFsMWwKKzRmNGE0bWEKK2ZhbTVpcworNWYyYTJyCitmYXI1dGgKK2ZhM3RhCitmYTN0aDJlCitmNGF0aAorNGZhMXRvCitmYXU0bHQ1CitmYXU0bDIKKzRmNWIKKzRmZAorNGZlLgorZmVhczQKK2ZlNGF0aDMKK2ZlYTJ0CitmMmU0YgorNGZlMWNhCis1ZmUyYzF0CisyZmVkCitmZTNsMmkKK2ZlNG1vCitmZW4yZAorZmVuMWQ1ZQorZmVyMQorNWZlcjFyNAorZmV2NAorNGYxZgorZjRmZXMKK2Y0ZjJpZTQKK2YxZmkKK2Y1ZjJpbi4KK2YyZmluCitmMmY1aXMKK2Y0ZjJseTUKK2ZmNGwyCitmMmZ5Cis0ZmgKKzFmaQorZjJpM2EKKzJmM2ljLgorNGYzaWNhbAorZmkxY2EKK2YzaWNhMm4KKzRmaWNhdGUKK2YzaTFjZW4KK2ZpM2NlcgorZjJpMWM0aQorNWZpM2MyaTFhCis1ZmljMmllNAorNGZpNGMzczIKK2ZpM2N1CitmaTVkZWwKK2YyaWQKK2ZpZ2h0NQorZjJpZworZmlsNWkKK2ZpbDJsNWluNAorZmlsMWwKK2ZpbGwyaQorNGZpMWx5CisyZmluCis1ZmkxbmEKK2Y0aW4yZDUKK2YyaTJuZQorZjFpbjNnCitmMmk0bjRuMgorZmlzNHQyaQorZjRsMgorZjVsMmUyc3MKK2ZsZXMyCitmbGluNAorZmxvM3JlCitmMmx5NQorNGZtCis0Zm4KKzFmbworNWZvMm4KK2ZvbjRkZQorZjJvbmQKK2ZvbjR0CitmbzJyCitmbzVyYXQKK2ZvMXJhCitmb3I1YXkKK2ZvcmU1dAorZm9yNGkKK2ZvcjF0NWEKK2ZvczUKKzRmNXAKK2ZyYTR0CitmNXJlYQorZnJlczVjCitmcmkyCitmcmlsNAorZnJvbDUKKzJmM3MKKzJmdAorZjR0bworZjJ0eQorM2Z1CitmdTVlbAorNGZ1ZworZnU0bWluCitmdTFtaQorZnU1bmUKK2Z1M3JpCitmdXNpNAorZjJ1cworZnUyczRzCis0ZnUxdGEKKzFmeQorMWdhCitnYTJmNAorNWdhbC4KKzNnYWwxaQorZ2EzbG8KKzJnYW0KK2dhNW1ldAorZzVhMm1vCitnYW41aXMKK2dhMm4KK2dhM25pegorZ2FuaTV6YTEKKzRnYW5vNAorZ2FyNW40CitnMmEycgorZ2Eyc3M0CitnNGF0aDMKKzRnYTF0Mml2Cis0Z2F6CitnM2IKK2dkNAorMmdlLgorMmdlZAorZ2VlejQKK2dlbDRpbgorZ2VsMmkKK2dlNWxpcworZ2U1bDFpegorNGdlMWx5CisxZ2VuCitnZTRuMmF0CitnZTFuYQorZzVlNW5pegorNGc0ZW5vCis0Z2VueQorMWdlbworZ2Uzb20KK2c0ZXJ5Cis1Z2Uxc2kKK2dldGg1Cis0Z2UxdG8KK2dlNHR5CitnZTR2Cis0ZzFnMgorZzJnZQorZzNnZXIKK2dnbHU1CitnZ2wyCitnMWdvNAorZ2gzaW4KK2doNW91dAorZ2hvdTIKK2doNHRvCis1Z2kuCisxZzJpNGEKK2dpMmE1cgorZzFpYworNWdpM2MyaTFhCitnMmkxY2kKK2c0aTFjbworZ2llbjUKK2cyaWU0Cis1Z2llcy4KK2dpbDQKK2czaTFtZW4KKzNnNGluLgorZzRpbjVnZQorNWc0aTJuMXMyCis1ZzJpbworM2c0aXIKK2dpcjRsCitnM2lzMWwyCitnaTR1Cis1ZzJpdgorM2dpegorZ2wyCitnbGE0CitnbDJhZDVpCitnbGEyZAorNWdsYXMKKzFnbGUKK2dsaTRiCitnM2wyaWcKKzNnbG8KK2dsbzNyCitnMW0KK2c0bXkKK2cxbjRhCitnNG5hLgorZ25lNHQ0dDIKK2cxbmkKK2cybjFpbgorZzRuMmk0bworZzFubworZzRubzRuCisxZ28KKzNnby4KK2dvYjUKKzVnb2UKKzNnNG80ZworZ28zaXMKK2dvaTIKK2dvMm4yCis0ZzNvM24xYQorZ29uNWRvNQorZzJvbmQKK2dvM25pCis1Z29vMgorZ281cml6Citnb3I1b3UyCis1Z29zLgorZ292MQorZzNwCisxZ3IKKzRncmExZDJhCitncmEyZAorZzRyMmFpMgorZ3JhMm4yCis1Z3JhNHBoLgorZzVyYTNwaDRlcgorNWdyYXBoMWljCitncjRhcGhpCis0ZzNyYTFwaHkKKzRncmF5CitncmU0bgorNGdyZXNzLgorZ3IyZTJzcworNGdyaXQKK2c0cm8KK2dydWY0CitnczIKK2c1c3RlCitndGgzCitndTRhCiszZ3VhcjJkCitndTJhMnIKKzJndWUKKzVndWk1dAorZzJ1aTIKKzNndW4KKzNnMnVzCis0Z3U0dAorZzN3CisxZ3kKKzJnNXkzbgorZ3k1cmEKK2gzYWI0bDIKK2hhMmNoNAoraGFlNG0KK2hhZTR0CitoNWFndQoraGEzbGEKK2hhbGEzbQoraGE0bQoraGFuNGNpCitoYTJuCitoYW40Y3kKKzVoYW5kLgoraDRhbmQKK2gyYW40ZworaGFuZzVlcgoraGFuMWc1bworaDVhNW5pegoraGE0bjRrMgoraGFuNHRlCitoYW4xdAoraGEycDNsMgoraGEycDV0CitoYTNyYTJuCitoMmEycgoraGE1cjJhcworaGFyMmQKK2hhcmQzZQoraGFyNGxlNAoraGFyMWwKK2hhcnA1ZW4KK2hhcjJwCitoYXI1dGVyCitoYTJzNXMKK2hhdW40Cis1aGF6CitoYXozYTEKK2gxYgorMWhlYTJkMQorM2hlMmEycgoraGU0Y2EybgoraGUxY2EKK2g1ZWNhdAoraDRlZAoraDRlNWRvNQoraGUzbDRpCitoZWw0bGlzCitoZWwxbAoraGVsbDJpCitoZWw0bHkKK2g1ZWxvCitoZTRtNHAKK2hlMm4KK2hlMW5hNAoraGVuNWF0CitoZTFvNXIKK2hlcDUKK2g0ZXIxYQoraGVyYTNwCitoZXI0YmEKK2gyZXIxYgoraGVyZTVhCitoM2VybgoraDVlcjFvdTIKK2gyZXJvCitoM2VyeQoraDFlcworaGUyczVwCitoZTR0CitoZTJ0NGVkCitoNGV1NAoraDFmCitoMWgKK2hpNWEybgoraDJpMWEKK2hpNGNvCitoaWdoNQoraDJpZworaDRpbDIKK2hpbWVyNAoraDRpMW5hCitoaW9uNGUKK2gyaW8KK2hpbzJuCitoMmk0cAoraGlyNGwKK2g0aXIKK2hpM3JvCitoaXI0cAoraGlyNHI0CitoaXMzZWwKK2g0aXNlCitoNGkyczRzCitoaXRoNWVyCitoMml0aAoraGl0aDJlCitoMmkydgorNGhrCis0aDFsNAoraGxhMm40CitoMmxvCitobG8zcmkKKzRoMW0KK2htZXQ0CisyaDFuCitoNW9kaXoKK2g1bzJkMXMyCitobzRnCitobzFnZTQKK2hvbDVhMnIKK2hvMWxhCiszaG9sNGUKK2hvNG1hCitobzJtZTMKK2hvMW40YQoraG8ybgoraG81bnkKKzNob29kCitob28yCitob28ybjQKK2hvcjVhdAoraG8xcmEKK2hvNXIyaXMKK2hvcnQzZQoraG81cnUKK2hvczRlCitobzVzZW4KK2hvczFwCisxaG8ydXMKK2hvdTIKK2hvdXNlMworaG92NWVsCis0aDVwCis0aHI0CitocmVlNQoraHJvNW5pegoraHJvMm4KK2hybzNwbworNGgxczIKK2g0czJoCitoNHQyYTJyCitoMXRhCitodDFlbgoraHQ1ZXMKK2g0dHkKK2h1NGcKK2h1NG1pbgoraHUxbWkKK2h1bjVrZQoraHU0bmsyCitodW40dAoraHVzM3Q0CitoMnVzCitodTR0CitoMXcKK2g0d2FyNHQKK2h3MmEycgoraHkzcGUKK2h5M3BoCitoeTJzCisyaTFhCitpMmFsCitpYW00CitpYW01ZTF0ZQoraTJhMm4KKzRpYW5jCitpYW4zaQorNGlhbjR0CitpYTVwZQoraWEyc3M0CitpNGExdDJpdgoraWE0dHJpYworaWExdHIKK2k0YTJ0dQoraWJlNAoraWIzZXIxYQoraWI1ZXJ0CitpYjVpMWEKK2liM2luCitpYjVpdC4KK2liaTJ0CitpYjVpdGUKK2kxYjJsMgoraWIzbGkKK2k1Ym8KK2kxYnIKK2kyYjVyaQoraTVidTRuCis0aWNhbQoraTFjYQorNWljYXAKKzRpYzJhMnIKK2k0Y2FyLgoraTRjYXJhCitpY2FzNQoraTRjYXkKK2ljY3U0CitpYzNjCis0aWNlbworNGkyY2gKKzJpMWNpCitpNWMyaWQKK2ljNWkxbmEKK2kyY2luCitpMmMyaXAKK2ljM2kxcGEKK2k0YzFseTQKK2kxYzRsNAoraTJjNW9jCitpMWNvCis0aTFjcgorNWljcmEKK2k0Y3J5CitpYzR0ZQoraTJjMXQKK2ljMXR1MgoraWM0dDN1MWEKK2ljM3UxbGEKK2ljNHVtCitpYzV1bworaTNjdXIKKzJpZAoraTRkYWkyCitpMWQyYQoraWQ1YW5jCitpZGEybgoraWQ1ZDQKK2lkZTNhNGwKK2lkZTRzMgoraTJkaQoraWQ1aTJhMm4KK2kxZDRpM2EKK2lkaTRhMnIKK2k1ZDJpZTQKK2kxZDNpbworaWRpNW91MgoraWQxaXQKK2lkNWkxdQoraTNkbGUKK2k0ZG9tCitpMWRvCitpZDNvdworaTRkcgoraTJkdQoraWQ1dW8KKzJpZTQKK2llZDRlCis1aWU1Z2EKK2llMmxkMworaWUxbjVhNAoraWVuNGUKK2k1ZTRuMW4yCitpM2VudDJpCitpZW4xdAoraTFlci4KK2kzZXMyYworaTFlc3QKK2kzZXQKKzRpZi4KK2lmNWVybworaWZlcjEKK2lmZjVlbgoraTRmMWYKK2lmNGZyCis0aTJmM2ljLgoraTFmaQoraTNmMmllNAoraTNmNGwyCis0aTJmdAorMmlnCitpZ2E1YgoraTFnYQoraWczZXIxYQoraWdodDNpCis0aWdpCitpM2dpYgoraWczaWw0CitpZzNpbgoraWczaXQKK2k0ZzRsMgoraTJnbworaWczb3IKK2lnNW90CitpNWdyZQoraTFncgoraWcydTVpMgoraWcxdXIKK2kzaAorNGk1aTQKK2kzagorNGlrCitpMWxhCitpbDNhNGIKK2k0bDRhZGUKK2lsYTJkCitpMmw1YW0KK2lsYTVyYQoraWwyYTJyCitpM2xlZworaWwxZXIKK2lsZXY0CitpMmw1ZgoraWwxaQoraWwzaTFhCitpbDJpYgoraWwzaW8KK2lsNGlzdAorMmlsMWl0CitpbDJpegoraWxsNWFiCitpbDFsCis0aTJsMW4yCitpbDNvMXEKK2lsNHR5CitpNGx0CitpbDV1cgoraWwzdgoraTRtYWcKK2kxbWEKK2ltM2FnZQoraW1hNXJ5CitpbTJhMnIKK2ltZW50MmE1cgoraTFtZW4KK2kzbWVuMXQKK2ltZW4xdGEKKzRpbWV0CitpbTFpCitpbTVpMWQ0YQoraW0yaWQKK2ltaTVsZQoraTVtMmluaQorNGltaXQKK2ltNG5pCitpNG0xbgoraTNtbzJuCitpMW1vCitpMm11CitpbTN1MWxhCisyaW4uCitpNG4zYXUKK2kxbmEKKzRpbmF2CitpbmNlbDQKK2luM2NlcgorNGluZAoraW41ZGxpbmcKKzJpbmUKK2kzbmVlCitpbjRlcjRhMnIKK2luMWVyCitpbmVyMWEKK2k1bjJlMnNzCitpMW5lcworNGluMWdhCis0aW5nZQoraW41Z2VuCis0aW5naQoraW41Z2xpbmcKK2luZ2wyCis0aW4xZ28KKzRpbjFndQorMmluaQoraTVuaS4KK2k0bjRpMWEKK2luM2k0bworaW4xaXMKK2k1bmk0dGUuCitpbjJpdAoraW4yaXRlCis1aTNuMmkxdDJpbworaW5pMXRpCitpbjNpMXR5Cis0aTRuazIKKzRpNG4xbAorMmk0bjFuMgorMmkxbm8KK2k0bm80YworaW5vNHMKK2k0bm90CisyaTJuMXMyCitpbjNzZQoraW5zdTFyNWEKK2luMXN1CitpbnN1MnIKKzJpbnQuCitpbjF0CisyaW40dGgKK2luMXUKK2k1bjJ1cworNGlueQorMmlvCis0aW8uCitpbzFnZTQKK2lvMmdyCitpMW9sCitpbzRtCitpb24zYXQKK2lvMm4KK2lvMW4xYQoraW9uNGVyeQoraW9uMWVyCitpb24zaQoraTJvNXBoCitpb3IzaQoraTRvcworaTRvNXRoCitpNW90aQoraW80dG8KK2k0b3VyCitpb3UyCisyaXAKK2lwZTQKK2lwaHIyYXM0CitpcDRocjQKK2lwM2kKK2lwNGljCitpcDRyZTQKK2lwcjIKK2lwM3VsCitpM3F1YQoraXF1MgoraXE1dWUxZgoraXEzdTJpZAoraXEydWkyCitpcTN1aTN0Cis0aXIKK2kxcmEKK2kycmE0YgoraTRyYWMKK2lyZDVlCitpcmU0ZGUKK2kycjJlZAoraTRyZTFmCitpNHJlbDQKK2k0cmVzCitpcjVnaQoraXJnMgoraXIxaQoraXJpNWRlCitpcjJpZAoraXI0aXMKK2lyaTN0dQorNWk1cjJpegoraXI0bWluCitpcjFtCitpcm80ZworNWlyb24uCitpcm8ybgoraXI1dWwKKzJpcy4KK2lzNWFnCitpc2EyCitpczNhMnIKK2lzYXM1CisyaXMxYworaXMzY2gyCis0aXNlCitpczNlcgorM2k0czNmCitpczVoYTJuCitpczJoCitpczNobzJuMworaXNobzQKK2lzaDVvcAoraXMzaTFiCitpczJpNGQKK2k1c2lzCitpczVpMXQyaXYKK2lzaTF0aQorNGlzNGsyCitpc2xhMm40CitpczFsMgorNGlzNG0xczIKK2kyczFtCitpMnNvCitpc281bWVyCitpM3NvbQoraXNvMm1lCitpczFwCitpczJwaQoraXM0cHkKKzRpMnMxcworaXM0c2FsCitpczFzYTIKK2lzc2VuNAoraXM0czFlNHMKK2lzNHRhLgoraXMxdGEKK2lzMXRlCitpczF0MmkKK2lzdDRseQoraXMydGwKKzRpc3RyYWwKK2lzdDRyCitpczF0cmEKK2kyc3UKK2lzNXVzCis0aTN0YS4KK2kxdGEKK2l0YTRiaQoraTJ0YWIKK2k0dGFnCis0aXRhNW0KK2kzdGEybgoraTN0YXQKKzJpdGUKK2l0M2VyMWEKK2k1dGVyMWkKK2l0NGVzCisyaXRoCitpMXRpCis0aTF0MmkxYQorNGkydGljCitpdDNpMWNhCis1aTV0aWNrMQoraTJ0M2lnCitpdDVpbDFsCitpMnRpbQorMmkxdDJpbworNGl0aXMKK2k0dGkyczRtCitpMnQ1bzVtCitpMXRvCis0aXRvMm4KK2k0dHJhbQoraTF0cmEKK2l0NXJ5Cis0aTR0M3QyCitpdDN1MWF0CitpMXR1CitpdHUxYQoraTV0dWQyCitpdDN1bAorNGl0ei4KK2k0dHoKK2kxdQorMml2CitpdjNlbDFsCitpdjNlbi4KK2k0djNlci4KK2k0dmVycy4KK2l2ZTRyMXMyCitpdjVpbC4KK2kydmlsCitpdjVpbworaXYxaXQKK2k1dm9yZQoraXYzbzNybworaTR2M290Cis0aTV3CitpeDRvCis0aXkKKzRpejJhMnIyCitpemExCitpMnoxaTQKKzVpem9uMXQKK2kxem8KK2l6bzJuCis1amEKK2phYzRxCitqYTRwCisxamUKK2plNHI1czIKKzRqZXM0dDJpZTQKK2plc3QyaQorNGplczJ0eQoramV3Mworam80cAorNWp1ZGcKKzNrYS4KK2szYWIKK2s1YWcKK2thaXM0CitrYWkyCitrYWw0CitrMWIKK2syZWQKKzFrZWUKK2tlNGcKK2tlNWwyaQorazNlbjRkCitrMWVyCitrZXM0CitrM2Uyc3QuCitrZTR0eQorazNmCitraDQKK2sxaQorNWtpLgorNWsyaWMKK2s0aWwxbAora2lsbzUKK2s0aW0KK2s0aW4uCitraW40ZGUKK2s0aW5kCitrNWk1bjJlMnNzCitrMmluZQora2kxbmVzCitraW40ZworazJpNHAKK2tpczQKK2s1aXMyaAora2s0CitrMWwKKzRrM2xleQorNGsxbHkKK2sxbQorazVuZXMKKzFrMm5vCitrbzVyCitrb3MyaDQKK2szb3UyCitrcm81bgorNGsxczIKK2s0c2MKK2tzNGwyCitrNHM0eQorazV0CitrMXcKK2xhYjNpYworbDRhYm8KK2w0YTJjaTQKK2w0YWRlCitsYTJkCitsYTNkMnkKK2xhZzRuCitsYTJtM28KKzNsNGFuZAorbGEybgorbGFuNGRsCitsYW41ZXQKK2xhbjR0ZQorbGFuMXQKK2xhcjRnMgorbDJhMnIKK2xhcjNpCitsYXM0ZQorbGE1dGEybgorbGEydGEKKzRsYXRlbDJpNAorNGxhMXQyaXYKKzRsYXYKK2xhNHY0YQorMmwxYgorbGJpbjQKKzRsMWMyCitsY2U0CitsM2NpCisybGQKK2wyZGUKK2xkNGVyZQorbGQ0ZXIxaQorbGRpNAorbGQ1aXMxCitsM2RyCitsNGRyaQorbGUyYQorbGU0YmkKK2wyZTFiCitsZTJmdDUKK2xlMWYKKzVsZWcuCis1bGU0ZzFnMgorbGU0bWF0CitsZTFtYQorbGVtNWF0MWljCis0bGVuLgorM2xlbmMKKzVsZTJuZS4KKzFsZW4xdAorbGUzcGgKK2xlNHByMgorbGUycmE1YgorbGVyMWEKK2xlcjRlCiszbGVyZzIKKzNsNGVyMWkKK2w0ZXJvCitsZXMyCitsZTVzMWNvCitsZXMyYworNWxlc3EKKzNsMmUyc3MKKzVsZXNzLgorbDNlMXZhCitsZXY0ZXIuCitsZXYxZXIKK2xldjRlcjFhCitsZXY0ZTRyMXMyCiszbGV5Cis0bGV5ZQorMmxmCitsNWZyCis0bDFnNAorbDVnYQorbGcyYTJyMworbDRnZXMKK2wxZ28zCisybDNoCitsaTRhZworbDJpMWEKK2xpMmFtNAorbGlhcjVpegorbGkyYTJyCitsaWFyMWkKK2xpNGFzCitsaTRhMXRvCitsaTViaQorNWxpYzJpbworbDJpMWNpCitsaTRjb3IKK2xpMWNvCis0bGk0YzNzMgorNGxpY3QuCitsaTJjMXQKK2w0aWN1CitsM2kxY3kKK2wzaTFkMmEKK2wyaWQKK2xpZDVlcgorM2xpMmRpCitsaWYzZXIxCitsNGk0ZjFmCitsaTRmNGwyCis1bGlnYXRlCitsMmlnCitsaTFnYQorM2xpZ2gKK2xpNGdyYQorbGkxZ3IKKzNsNGlrCis0bDRpNGwKK2xpbTRiMmwyCitsaTRtMWIKK2xpbTNpCitsaTRtbworbDRpNG00cAorbDRpMW5hCisxbDRpbmUKK2xpbjNlYQorbDJpbjNpCitsaW5rNWVyCitsNGk0bmsyCitsaTVvZworbDJpbworNGw0aXEKK2xpczRwCitsMWl0CitsMml0LgorNWxpdDNpMWNhCitsaTF0aQorbDRpMnRpYworbDVpNXRpNGMzczIKK2xpdjNlcgorbDJpdgorbDFpegorNGxqCitsa2EzCitsM2thbDQKK2xrYTR0CitsMWwKK2w0bGF3CitsMmxlCitsNWxlMmEKK2wzbGVjCitsM2xlZworbDNsZWwKK2wzbGU0bgorbDNsZTR0CitsbDJpCitsMmxpbjQKK2w1bDRpMW5hCitsbDRvCitsbG9xMnVpNQorbGxvMXEKK2xsb3F1MgorbDJsNW91dAorbGxvdTIKK2w1bG93CisybG0KK2w1bWV0CitsbTNpbmcKK2w0bW8yZDEKK2wxbW8KK2xtbzJuNAorMmwxbjIKKzNsby4KK2xvYjVhbAorbG80Y2kKKzRsb2YKKzNsb2cxaWMKK2w1bzFnbworM2xvZ3UKK2xvbTNlcgorbG8ybWUKKzVsb25nCitsbzJuCitsb240aQorbDNvM25pegorbG9vZDUKK2xvbzIKKzVsbzRwZS4KK2xvcDNpCitsM280cDFtCitsbzFyYTQKK2xvNHJhMXRvCitsbzVyMmllNAorbG9yNW91MgorNWxvcy4KK2xvczVldAorNWxvczVvM3BoaXoKK2xvMnNvCitsb3M0b3AKK2xvczJvcGgKKzVsb3M1bzFwaHkKK2xvczR0CitsbzR0YQorbG91bjVkCitsb3UyCisybG91dAorNGxvdgorMmxwCitscGE1YgorbDFwYQorbDNwaGEKK2w1cGhpCitscDVpbmcKK2xwaTJuCitsM3BpdAorbDRwMmwyCitsNXByMgorNGwxcgorMmwxczIKK2w0c2MKK2wyc2UKK2w0czJpZTQKKzRsdAorbHQ1YWcKK2wxdGEKK2x0YW5lNQorbHRhMm4KK2wxdGUKK2x0ZW40CitsdGVyMWE0CitsdGgzaQorbDV0aWVzLgorbHQyaWU0CitsdGlzNAorbDF0cgorbDF0dTIKK2x0dTFyM2EKK2x1NWEKK2x1M2JyCitsdTJjaDQKK2x1M2NpCitsdTNlbgorbHVmNAorbHU1aWQKK2wydWkyCitsdTRtYQorNWx1MW1pCitsNXVtbi4KK2x1NG0xbgorNWx1bTNuNGkxYQorbHUzbworbHVvM3IKKzRsdXAKK2x1MnNzNAorbDJ1cworbHVzM3RlCisxbHV0CitsNXZlbgorbDV2ZXQ0CisybDF3CisxbHkKKzRseWEKKzRseTFiCitseTVtZTQKK2x5M25vCisybHlzNAorbDV5M3MyZQorMW1hCisybWFiCittYTJjYQorbWE1Y2gyaW5lCittYTJjaAorbWE0Y2gxaW4KK21hNGM0bDQKK21hZzVpbgorbWFnMWkKKzVtYWcxbgorMm1haAorbWEyaWQ1CittYWkyCis0bWEybGQKK21hM2wyaWcKK21hbDFpCittYTVsaW4KK21hbDRsMmkKK21hbDFsCittYWw0dHkKK21hNGx0Cis1bWEzbjRpMWEKK21hMm4KK21hbjVpcworbWFuM2l6Cis0bWFwCittYTVyaTJuZS4KK20yYTJyCittYXIxaQorbWFyMmluNGUKK21hNXIyaXoKK21hcjRseQorbWFyMWwKK21hcjN2CittYTVzY2UKK21hczRlCittYXMxdAorNW1hdGUKK200YXRoMworbWEzdGlzCis0bWF0aTN6YTEKK21hMXRpegorNG0xYgorbTFiYTR0NQorbTViaWwKK200YjNpbmcKK21iMmk0dgorNG01YworNG1lLgorMm1lZAorNG1lZC4KKzVtZTNkNGkzYQorbTRlZGkKK21lM2QyaWU0CittNWU1ZDJ5CittZTJnCittZWw1bzJuCittZTRsNHQKK21lMm0KK21lMW0xbzMKKzFtZW4KK21lMW40YQorbWVuNWFjCittZW40ZGUKKzRtZW5lCittZW40aQorbWUybjFzNAorbWVuMXN1NQorM21lbjF0CittZW40dGUKK21lNW8ybgorbTVlcjFzYTIKK21lNHIxczIKKzJtZXMKKzNtZXN0MmkKK21lNHRhCittZXQzYTJsCittZTF0ZQorbWU1dGhpCittNGV0cgorNW1ldDNyaWMKK21lNXRyMmllNAorbWUzdHJ5CittZTR2Cis0bTFmCisybWgKKzVtaS4KK20yaTNhCittaTFkNGEKK20yaWQKK21pZDRnCittMmlnNAorM21pbDNpMWEKK21pbDFpCittNWk1bDJpZTQKK200aWwxbAorbWkxbjRhCiszbTRpbmQKK201aTNuZWUKK20yaW5lCittNGluZ2wyCittaW41Z2xpCittNWluZzFseQorbWluNHQKK200aW4xdQorbWlvdDQKK20yaW8KK20yaXMKK21pNHM0ZXIuCittNGlzZQorbWlzM2VyCittaXM1bDIKK21pczR0MmkKK201aTRzdHJ5CittaXN0NHIKKzRtMml0aAorbTJpegorNG1rCis0bTFsCittMW0KK21tYTVyeQorbTFtYQorbW0yYTJyCis0bTFuCittMW40YQorbTRuMWluCittbjRvCisxbW8KKzRtb2NyCis1bW9jNXJhMXRpegorbW8yZDEKK21vNGdvCittb2lzMgorbW9pMgorbW80aTVzZQorNG0yb2sKK21vNWxlc3QKK21vbGVzMgorbW8zbWUKK21vbjVldAorbW8ybgorbW9uNWdlCittbzNuNGkzYQorbW9uNGkyczFtCittb24xaXMKK21vbjRpc3QKK21vM25pegorbW9ub2w0CittbzNueS4KK21vMnIKKzRtbzVyYS4KK21vMXJhCittb3MyCittbzVzZXkKK21vM3NwCittNG90aDMKK201b3VmCittb3UyCiszbW8ydXMKK21vMnYKKzRtMXAKK21wYXJhNQorbTFwYQorbXAyYTJyCittcGE1cmFiCittcDRhNHI1aQorbTNwZTJ0CittcGhhczQKK20ycGkKK21wMmk0YQorbXA1aWVzCittcDJpZTQKK200cDFpMm4KK201cDRpcgorbXA1aXMKK21wbzNyaQorbTFwNG9yCittcG9zNWl0ZQorbTFwb3MKK200cG8ydXMKK21wb3UyCittcG92NQorbXA0dHIKK20ycDF0CittMnB5Cis0bTNyCis0bTFzMgorbTRzMmgKK201c2kKKzRtdAorMW11CittdWwyYTVyNAorbXUxbGEKKzVtdTRsdAorbXVsMXRpMworM211bQorbXVuMgorNG11cAorbXU0dQorNG13CisxbmEKKzJuMWEyYgorbjRhYnUKKzRuYWMuCituYTRjYQorbjVhMmMxdAorbmFnNWVyLgorbmFrNAorbmE0bDFpCituYTVsMmkxYQorNG5hNGx0CituYTVtaXQKK24yYTJuCituYW4xY2k0CituYW40aXQKK25hNG5rNAorbmFyM2MKK24yYTJyCis0bmFyZQorbmFyM2kKK25hcjRsCituNWFyMW0KK240YXMKK25hczRjCituYXM1dDJpCituMmF0CituYTN0YTJsCituYTJ0YQorbmF0NW81bTJpegorbmEydG9tCituYTF0bworbjJhdQorbmF1M3NlCituYTJ1cworM25hdXQKK25hdjRlCis0bjFiNAorbmMyYTJyNQorbjFjYQorbjRjZXMuCituM2NoYQorbjJjaAorbjVjaGVvCituY2hlMgorbjVjaDRpbDIKK24zY2hpcworbjJjMWluCituMWNpCituMmM0aXQKK25jb3UxcjVhCituMWNvCituY291MgorbjFjcgorbjFjdQorbjRkYWkyCituMWQyYQorbjVkYTJuCituMWRlCituZDVlMnN0LgorbmRlczIKK25kaTRiCituNWQyaWYKK24xZGl0CituM2RpegorbjVkdTJjCituMWR1CituZHU0cgorbmQyd2UKK25kMXcKKzJuZS4KK24zZTJhMnIKK24yZTJiCituZWIzdQorbmUyYworNW5lY2sxCisybmVkCituZTRnYXQKK25lMWdhCituZTRnNWExdDJpdgorNW5lZ2UKK25lNGxhCituZWw1aXoKK25lbDJpCituZTVtaQorbmU0bW8KKzFuZW4KKzRuZW5lCiszbmVvCituZTRwbworbmUycQorbjFlcgorbmUycmE1YgorbmVyMWEKK240ZXIzYTJyCituMmVyZQorbjRlcjVpCituZXI0cjQKKzFuZXMKKzJuZXMuCis0bmUxc3AKKzJuZXN0Cis0bmVzNHcyCiszbmV0MWljCituZTR2CituNWV2ZQorbmU0dworbjNmCituNGdhYgorbjFnYQorbjNnZWwKK25nZTRuNGUKK24xZ2VuCituNWdlcmUKK24zZ2VyMWkKK25nNWhhCituM2dpYgorbmcxaW4KK241Z2l0CituNGdsYTQKK25nbDIKK25nb3Y0CituMWdvCituZzVzMmgKK25nczIKK24xZ3UKK240Z3VtCituMmd5Cis0bjFoNAorbmhhNAorbmhhYjMKK25oZTQKKzNuNGkxYQorbmkzYTJuCituaTRhcAorbmkzYmEKK25pNGIybDIKK24yaTRkCituaTVkaQorbmk0ZXIKK24yaWU0CituaTJmaQorbmk1ZmljYXQKK25pZmkxY2EKK241aTFncgorbjJpZworbjRpazQKK24xaW0KK25pM20yaXoKK25pbTFpCituMWluCis1bmkybmUuCituMmluZQorbmluNGcKK24yaTRvCis1bjJpcy4KK25pczR0YQorbjJpdAorbjRpdGgKKzNuMmkxdDJpbworbmkxdGkKK24zaXRvcgorbmkxdG8KK25pM3RyCituMWoKKzRuazIKK241azJlcm8KK25rMWVyCituM2tldAorbmszaW4KK25rMWkKK24xazFsCis0bjFsCituNW0KK25tZTQKK25tZXQ0Cis0bjFuMgorbm5lNAorbm5pM2FsCituM240aTFhCitubjJpNHYKK25vYjRsMgorbm8zYmxlCituNW8xYzRsNAorNG4zbzJkCiszbm9lCis0bm9nCitubzFnZTQKK25vaXM1aQorbm9pMgorbm81bDRpCis1bm9sMW8xZ2lzCiszbm9taWMKK241bzVtMml6CitubzRtbworbm8zbXkKK25vNG4KK25vbjRhZworbm8xbjFhCitub241aQorbjVvbml6Cis0bm9wCis1bm9wNW81bDJpCitubzJyNWFiCitubzFyYQorbm80cmFyeQorbm9yMmEycgorNG5vczJjCitub3M0ZQorbm9zNXQKK25vNXRhCisxbm91MgorM25vdW4KK25vdjNlbDMKK25vd2wzCituMXA0CitucGk0CitucHJlNGMKK25wcjIKK24xcQorbjFyCitucnU0CisybjFzMgorbjJzNWFiCituc2EyCituc2F0aTQKK25zNGMKK24yc2UKK240czNlNHMKK25zMmlkMQorbnMyaWc0CituMnMxbDIKK24yczNtCituNHNvYworbjFzbworbnM0cGUKK241c3BpCituc3RhNWIybDIKK25zMXRhCituczJ0YWIKK24xdAorbjJ0YTRiCituMXRhCitudGU0cjNzMgorbnQyaQorbjV0aTJiCitudGk0ZXIKK250MmllNAorbnRpMmYyCituM3QyaW5lCituMnQxaW4KK240dDNpbmcKK250Mmk0cAorbnRyb2w1bDJpCitudHJvbDFsCituNHQ0czIKK250dTNtZQorbjF0dQorbjN0dW0KK251MWEKK251NGQKK251NWVuCitudWY0ZmUKK251NGYxZgorbjN1aTRuCituMnVpMgorM251M2l0CituNHVtCitudTFtZQorbjV1MW1pCiszbnU0bgorbjN1bworbnUzdHIKK24xdjIKK24xdzQKK255bTQKK255cDQKKzRuegorbjN6YTEKKzRvYQorb2EyZDMKK281YTVsZXMyCitvMmFsZQorb2FyZDMKK28yYTJyCitvYXM0ZQorb2FzdDVlCitvYXQ1aQorb2IzYTNiCitvNWIyYTJyCitvMWJlNGwKK28xYmkKK28yYmluCitvYjVpbmcKK28zYnIKK29iM3VsCitvMWNlCitvMmNoNAorbzNjaGU0dAorb2NoZTIKK29jaWYzCitvMWNpCitvNGNpbAorbzRjbGFtCitvMWM0bDQKK280Y29kCitvMWNvCitvYzNyYWMKK29jNXJhMXRpegorb2NyZTMKKzVvY3JpdAorb2NyaTIKK29jdG8ycjVhCitvMmMxdAorb2MxdG8KK29jM3UxbGEKK281Y3VyZQorb2Q1ZDFlZAorb2QxZDQKK29kM2ljCitvMWQyaTNvCitvMmRvNAorb2Q0b3IzCitvNGQ1dWN0LgorbzFkdQorb2R1MmMKK29kdTJjMXQKK280ZDV1YzR0MXMyCitvNGVsCitvNWVuZworbzNlcgorb2U0dGEKK28zZXYKK28yZmkKK29mNWl0ZQorb2Y0aTR0NHQyCitvMmc1YTVyCitvMWdhCitvNGc1YTF0Mml2CitvNGdhMXRvCitvMWdlCitvNWdlbmUKK28xZ2VuCitvNWdlbworbzRnZXIKK28zZzJpZTQKKzFvMWdpcworb2czaXQKK280Z2wyCitvNWcybHkKKzNvZ25pegorb2cxbmkKK280ZzRybworbzFncgorb2cydTVpMgorMW8xZ3kKKzJvMmc1eTNuCitvMWgyCitvaGFiNQorb2kyCitvaWMzZXMKK29pM2RlcgorbzJpZAorb2k0ZjFmNAorbzJpZzQKK29pNWxldAorbzNpbmcKK29pbnQ1ZXIKK29pbjF0CitvNWkyczFtCitvaTVzbzJuCitvaTJzbworb2lzdDVlbgorb2lzMXRlCitvaTN0ZXIKK28yaXRlCitvNWoKKzJvaworbzNrZW4KK29rNWllNAorb2sxaQorbzFsYQorbzRsYTJuCitvbGEyc3M0CitvMmwyZAorb2wyZDFlCitvbDNlcgorbzNsZXMyYworb2xlczIKK28zbGV0CitvbDRmaQorbzJsZgorb2wyaQorbzNsMmkxYQorbzNsaWNlCitvbDVpZC4KK29sMmlkCitvM2xpNGYKK281bDRpNGwKK29sM2luZworbzVsMmlvCitvNWwyaXMuCitvbDNpczJoCitvNWwyaXRlCitvbDFpdAorbzVsMmkxdDJpbworb2xpMXRpCitvNWwyaXYKK29sbDJpNGU0CitvbDFsCitvbGwyaQorb2w1bzNnaXoKK29sbzRyCitvbDVwMmwyCitvMmxwCitvNGwydAorb2wzdWIKK29sM3VtZQorb2wzdW4KK281bDJ1cworb2wydgorbzJseQorbzJtNWFoCitvMW1hCitvbWE1bAorb201YTF0aXoKK29tMmJlCitvNG0xYgorb200YjJsMgorbzJtZQorb20zZTFuNGEKK28xbWVuCitvbTVlcjJzZQorb21lNHIxczIKK280bWV0CitvbTVlM3RyeQorb200ZXRyCitvM20yaTNhCitvbTNpYy4KK29tM2kxY2EKK281bTJpZAorb20xaW4KK281bTJpbmkKKzVvbW1lbmQKK29tMW0KK29tMW1lbgorb21vNGdlCitvMW1vCitvNG1vMm4KK29tM3BpCitvNG0xcAorb21wcm81CitvbXByMgorbzJuCitvMW4xYQorb240YWMKK28zbjJhMm4KK29uMWMKKzNvbmNpbAorb24xY2kKKzJvbmQKK29uNWRvCitvM25lbgorbzJuNWVzdAorbzFuZXMKK29uNGd1CitvbjFpYworbzNuMmk0bworb24xaXMKK281bmkxdQorb24za2V5CitvNG5rMgorb240b2RpCitvNG4zbzJkCitvbjNvM215CitvMm4zczIKK29uNXNwaTQKK29uc3BpMXI1YQorb25zcDRpcgorb24xc3U0CitvbnRlbjQKK29uMXQKK29uM3Q0aQorb250aTJmNQorb241dW0KK29uMXZhNQorb24xdjIKK29vMgorb29kNWUKK29vZDVpCitvMm80aworb29wM2kKK28zb3JkCitvb3N0NQorbzJwYQorbzJwMmU1ZAorb3AxZXIKKzNvcGVyMWEKKzRvcDRlcmFnCisyb3BoCitvNXBoYTJuCitvNXBoNGVyCitvcDNpbmcKK29waTJuCitvM3BpdAorbzVwbzJuCitvNHBvc2kKK28xcG9zCitvMXByMgorb3AxdQorb3B5NQorbzFxCitvMXJhCitvNXJhLgorbzRyM2FnCitvcjVhbDFpegorb3JhbDFpCitvcjVhbjRnZQorb3JhMm4KK29yMmFuZworb3JlNWEKK281cmUxYTRsCitvcjNlaTIKK29yNGU1czJoCitvcjVlMnN0Lgorb3JlczJ0CitvcmV3NAorb3I0Z3UKK29yZzIKKzRvNXIyaTNhCitvcjNpMWNhCitvNXJpbAorb3IxaW4KK28xcjJpMW8KK29yM2kxdHkKK28zcmkxdQorb3IybWkKK29yMW0KK29ybjJlCitvNXJvZgorb3Izb3VnCitvcm91Mgorb3I1cGUKK29yMXAKKzNvcnJoNAorb3IxcjQKK29yNHNlCitvNHJzMgorb3JzNWVuCitvcnN0NAorb3IzdGhpCitvcjN0aHkKK29yNHR5CitvNXJ1bQorbzFyeQorb3MzYWwKK29zYTIKK29zMmMKK29zNGNlCitvM3Njb3AKK29zMWNvCis0b3Njb3BpCitvNXNjcgorb3M0aTRlNAorb3M1aTF0Mml2Citvc2kxdGkKK29zM2kxdG8KK29zM2kxdHkKK281c2k0dQorb3M0bDIKK28yc28KK28yczRwYQorb3M0cG8KK29zMnRhCitvNXN0YXRpCitvczV0aWwKK29zdDJpCitvczV0aXQKK280dGEybgorbzF0YQorb3RlbGU0Zworb3QzZXIuCitvdDVlNHIxczIKK280dGVzCis0b3RoCitvdGg1ZTFzaQorb3RoMmUKK290aDFlcworb3RoM2k0CitvdDNpYy4KK290NWkxY2EKK28zdGljZQorbzN0aWYyCitvM3Rpcworb3RvNXMyCitvMXRvCitvdTIKK291M2IybDIKK291Y2g1aQorb3UyY2gKK291NWV0CitvdTRsCitvdW5jNWVyCitvdW4yZAorb3U1djIKK292NGVuCitvdmVyNG5lCitvdmU0cjNzMgorb3Y0ZXJ0CitvM3ZpcworbzR2aTF0aTQKK281djRvbAorb3czZGVyCitvdzNlbAorb3c1ZXN0Mworb3cxaTIKK293bjVpCitvNHdvMgorb3kxYQorMXBhCitwYTRjYQorcGE0Y2UKK3BhMmM0dAorcDRhMmQKKzVwYWdhNG4KK3BhMWdhCitwM2FnYXQKK3A0YWkyCitwYTRpNG40CitwNGFsCitwYTFuNGEKK3BhMm4KK3BhbjNlbAorcGFuNHR5CitwYW4xdAorcGEzbnkKK3BhMXAKK3BhNHB1CitwYXJhNWIybDIKK3AyYTJyCitwYTJyYWIKK3BhcjVhZ2UKK3BhcjVkMmkKKzNwYXJlCitwYXI1ZWwKK3A0YTRyMWkKK3BhcjRpcworcGEydGUKK3BhNXRlcgorNXBhdGhpYworcDRhdGgKK3BhNXRoeQorcGE0dHJpYworcGExdHIKK3BhdjQKKzNwYXkKKzRwMWIKK3BkNAorNHBlLgorM3BlNGEKK3BlYXI0bAorcGUyYTJyCitwZTJjCisycDJlZAorM3BlZGUKKzNwNGVkaQorcGUzZDRpM2E0CitwZWQ0aWMKK3A0ZWUKK3BlZTRkCitwZWs0CitwZTRsYQorcGVsMmk0ZTQKK3BlbDJpCitwZTRuMmEybgorcGUxbmEKK3A0ZW5jCitwZW40dGgKK3BlbjF0CitwZTVvMm4KK3A0ZXJhLgorcGVyMWEKK3BlcmE1YjJsMgorcGUycmE0YgorcDRlcmFnCitwNGVyMWkKK3Blcmk1c3QKK3BlcjJpcworcGVyNG1hbAorcGVyM200CitwZXIxbWEKK3BlcjJtZTUKK3A0ZXJuCitwMmVyM28KK3BlcjN0aQorcDRlNXJ1CitwZXIxdgorcGUydAorcGU1dGVuCitwZTV0aXoKKzRwZgorNHBnCis0cGguCitwaGFyNWkKK3BoMmEycgorcGg0ZTNubworcGhlMm4KK3BoNGVyCitwaDRlcy4KK3BoMWVzCitwaDFpYworNXBoMmllNAorcGg1aW5nCis1cGhpczF0MmkKKzNwaGl6CitwNGgybDQKKzNwaG9iCiszcGhvbmUKK3BobzJuCis1cGhvbmkKK3BobzRyCis0cDRoMXMyCitwaDN0Cis1cGh1CisxcGh5CitwMmkzYQorcGkyYTJuNAorcGk0YzJpZTQKK3AyaTFjaQorcGk0Y3kKK3A0aWQKK3A1aTFkMmEKK3BpM2RlCis1cGkyZGkKKzNwaWVjCitwMmllNAorcGkzZW4KK3BpNGdyYXAKK3AyaWcKK3BpMWdyCitwaTNsbworcGkybgorcDRpbi4KK3A0aW5kNAorcDRpMW5vCiszcDJpMW8KK3BpbzJuNAorcDNpdGgKK3BpNXRoYQorcGkydHUKKzJwM2syCisxcDJsMgorM3BsYTJuCitwbGFzNXQKK3BsMmkzYQorcGxpNWVyCitwbDJpZTQKKzRwbDJpZworcGxpNG4KK3Bsb2k0CitwbHU0bQorcGx1NG00YgorNHAxbQorMnAzbgorcG80YworNXBvZC4KK3BvNWVtCitwbzNldDUKKzVwbzRnCitwb2luMgorcG9pMgorNXBvaW4xdAorcG9seTV0CitwbzJseQorcG80bmkKK3BvMm4KK3BvNHAKKzFwNG9yCitwbzRyeQorMXBvcworcG8yczFzCitwNG90CitwbzR0YQorNXBvdW4KK3BvdTIKKzRwMXAKK3BwYTVyYQorcDFwYQorcHAyYTJyCitwMnBlCitwNHAyZWQKK3A1cGVsCitwM3BlbgorcDNwZXIKK3AzcGUydAorcHBvNXMyaXRlCitwMXBvcworcHIyCitwcmF5NGU0Cis1cHJlMWMyaQorcHJlNWNvCitwcmUzZTJtCitwcmU0ZjVhYworcHJlMWYKK3ByZTFmYQorcHJlNGxhCitwcjFlM3I0CitwM3JlMXMyZQorM3ByMmUyc3MKK3ByZTV0ZW4KK3ByZTN2MgorNXByMmk0ZTQKK3ByaW40dDMKK3ByMmk0cworcHJpMnMzbworcDNybzFjYQorcHIyb2MKK3Byb2Y1aXQKK3BybzJmaQorcHJvM2wKK3Byb3MzZQorcHJvMXQKKzJwMXMyCitwMnNlCitwczRoCitwNHNpMWIKKzJwMXQKK3AydDVhNGIKK3AxdGEKK3AydGUKK3AydGgKK3AxdGkzbQorcHR1NHIKK3AxdHUKK3A0dHc0CitwdWIzCitwdWU0CitwdWY0CitwdTRsM2MyCitwdTRtCitwdTJuCitwdXI0cjQKKzVwMnVzCitwdTJ0Cis1cHV0ZQorcHV0M2VyCitwdTN0cgorcHV0NHQxZWQKK3B1NHQzdDIKK3B1dDR0MWluCitwM3cKK3F1MgorcXVhNXY0CisycXVlLgorM3F1ZXIKKzNxdWV0CisycmFiCityYTNiaQorcmFjaDRlMgorcmEyY2gKK3I1YTFjNGw0CityYWY1ZmkKK3JhMmYKK3JhNGYxZjQKK3JhMmY0dAorcjJhaTIKK3JhNGxvCityYW0zZXQKK3IyYW1pCityYTNuZTVvCityYTJuCityYW40Z2UKK3IyYW5nCityNGFuaQorcmE1bm80CityYXAzZXIKKzNyYTFwaHkKK3JhcjVjCityMmEycgorcmFyZTQKK3JhcjVlMWYKKzRyYXJpbAorcmFyMWkKK3IyYXMKK3JhdGlvMm40CityYTF0MmlvCityYXU0dAorcmE1dmFpMgorcmEydmEKK3JhdjNlbAorcmE1ejJpZTQKK3JhMnoxaQorcjFiCityNGJhYgorcjRiYWcKK3JiaTIKK3IyYjNpNGYKK3IyYmluCityNWIyaW5lCityYjVpbmcuCityYjRvCityMWMKK3IyY2UKK3IxY2VuNAorcjNjaGEKK3IyY2gKK3JjaDRlcgorcmNoZTIKK3I0Y2k0YgorcjFjaQorcjJjNGl0CityY3VtMworcjRkYWwKK3IxZDJhCityZDJpCityMWQ0aTRhCityZGk0ZXIKK3JkMmllNAorcmQxaW40CityZDNpbmcKKzJyZS4KK3JlMWE0bAorcmUzYTJuCityZTVhcjFyNAorcmUyYTJyCis1cmVhMnYKK3JlNGF3CityNWVicmF0CityMmUxYgorcmUzYnIKK3JlYzVvbDFsCityZTJjb2wKK3JlMWNvCityZTRjNW9tcGUKK3JlY280bTFwCityZTRjcmUKK3JlMWNyCisycjJlZAorcmUxZGUKK3JlM2RpczEKK3I0ZWRpCityZWQ1aXQKK3JlNGZhYworcmUxZgorcmUxZmEKK3JlMmZlCityZTVmZXIuCityZWZlcjEKK3JlM2ZpCityZTRmeQorcmVnM2lzCityZTVpdAorcmVpMgorcmUxbDJpCityZTVsdQorcjRlbjR0YQorcmVuMXQKK3JlbjR0ZQorcmUxbworcmU1cGkybgorcmU0cG9zaQorcmUxcG8KK3JlMXBvcworcmUxcHUKK3IxZXI0CityNGVyMWkKK3IyZXJvNAorcjRlNXJ1CityNGVzLgorcmU0c3BpCityZTFzcAorcmVzNHM1aTRiCityMmUyc3MKK3JlczFzaQorcmVzMnQKK3JlNXMydGEybAorcmVzMXRhCityMmUzc3Q0cgorcmU0dGVyCityZTR0aTR6CityZTN0cmkKK3I0ZXUyCityZTV1MXQyaQorcmV2MgorcmU0dmFsCityZTF2YQorcmV2M2VsCityNWV2NWVyLgorcmV2MWVyCityZTV2ZTRyMXMyCityZTV2ZXJ0CityZTV2aTRsCityZTF2aQorcmV2NW9sdQorcmU0d2gKK3IxZgorcjNmdTQKK3I0ZnkKK3JnMgorcmczZXIKK3IzZ2V0CityM2cxaWMKK3JnaTRuCityZzNpbmcKK3I1Z2lzCityNWdpdAorcjFnbDIKK3JnbzRuMgorcjFnbworcjNndQorcmg0Cis0cmguCis0cmhhbAorcjJpM2EKK3JpYTRiCityaTRhZworcjRpYgorcmliM2EKK3JpYzVhczUKK3JpMWNhCityNGljZQorNHIyaTFjaQorNXJpNWMyaWQKK3JpNGMyaWU0CityNGkxY28KK3JpZDVlcgorcjJpZAorcmkzZW5jCityMmllNAorcmkzZW4xdAorcmkxZXIKK3JpNWV0CityaWc1YTJuCityMmlnCityaTFnYQorNXI0aWdpCityaWwzaXoKK3JpbDFpCis1cmltYTJuCityaTFtYQorcmltNWkKKzNyaTFtbworcmltNHBlCityaTRtMXAKK3IyaTFuYQorNXJpbmEuCityNGluNGQKK3IyaW40ZQorcmluNGcKK3IyaTFvCis1cmlwaAorcjJpcAorcmlwaDVlCityaTJwMmwyCityaXA1bGljCityNGlxCityMmlzCityNGlzLgorcjJpczRjCityM2lzMmgKK3JpczRwCityaTN0YTNiCityaTF0YQorcjVpdGVkLgorcjJpdGUKK3JpMnQxZWQKK3JpdDVlci4KK3JpdDVlNHIxczIKK3I0aTJ0M2ljCityaTF0aQorcmkydHUKK3JpdDV1cgorcml2NWVsCityMml2CityaXYzZXQKK3JpdjNpCityM2oKK3Iza2V0CityazRsZQorcmsxbAorcms0bGluCityMWwKK3JsZTQKK3IybGVkCityNGwyaWcKK3I0bGlzCitybDVpczJoCityM2xvNAorcjFtCitybWE1YworcjFtYQorcjJtZQorcjNtZW4KK3JtNWU0cjFzMgorcm0zaW5nCityNG1pbmcuCityNG0yaW8KK3IzbWl0CityNG15CityNG4yYTJyCityMW5hCityM25lbAorcjRuMWVyCityNW5ldAorcjNuZXkKK3I1bmljCityMW5pczQKK3IzbjJpdAorcjNuMml2Citybm80CityNG5vdTIKK3IzbnUKK3JvYjNsMgorcjJvYworcm8zY3IKK3JvNGUKK3JvMWZlCitybzVmaWwKK3JvMmZpCityMm9rMgorcm81azFlcgorNXJvbGUuCityb201ZTF0ZQorcm8ybWUKK3JvNG1ldAorcm9tNGkKK3JvNG00cAorcm9uNGFsCitybzJuCitybzFuMWEKK3JvbjRlCitybzVuNGlzCityb240dGEKK3JvbjF0Cisxcm9vbQorcm9vMgorNXJvb3QKK3JvM3BlbAorcm9wM2ljCityb3IzaQorcm81cm8KK3JvMnM1cGVyCitybzJzNHMKK3JvNHRoMmUKK3I0b3RoCitybzR0eQorcm80dmEKK3JvdjVlbAorcm94NQorcjFwCityNHBlNGEKK3I1cGVuMXQKK3JwNWVyLgorcjNwZTJ0CitycDRoNAorcnAzaW5nCitycGkybgorcjNwbworcjFyNAorcnJlNGMKK3JyZTRmCityNHJlMW8KK3JyZTRzMnQKK3JyMmk0bworcnIyaTR2Citycm8ybjQKK3Jyb3M0CitycnlzNAorNHJzMgorcjFzYTIKK3JzYTV0aQorcnM0YworcjJzZQorcjNzZWMKK3JzZTRjcgorcjRzNWVyLgorcnMzZTRzCityNXNlNXYyCityMXMyaAorcjVzaGEKK3Ixc2kKK3I0c2k0YgorcnNvMm4zCityMXNvCityMXNwCityNXN3MgorcnRhMmNoNAorcjF0YQorcjR0YWcKK3IzdDJlMWIKK3IzdGVuNGQKK3IxdGU1bworcjF0aQorcjJ0NWkyYgorcnQyaTRkCityNHRpZXIKK3J0MmllNAorcjN0MmlnCitydGlsM2kKK3J0aWw0bAorcjR0aTFseQorcjR0aXN0CityNHQyaXYKK3IzdHJpCitydHIyb3BoNAorcnQ0czJoNAorcjR0MXMyCitydTNhCitydTNlNGwKK3J1M2VuCitydTRnbDIKK3J1M2k0bgorcjJ1aTIKK3J1bTNwMmwyCitydTRtMnAKK3J1Mm4KK3J1NG5rNQorcnVuNHR5CitydW4xdAorcjV1c2MyCityMnVzCitydTJ0MWk1bgorcjR1MXQyaQorcnY0ZQorcnZlbDRpCityM3ZlbgorcnY1ZXIuCityNXZlc3QKK3J2NGUycworcjN2ZXkKK3IzdmljCityM3YyaTR2CityM3ZvCityMXcKK3J5NGMKKzVyeW5nZQorcnluNWcKK3J5M3QKK3NhMgorMnMxYWIKKzVzYWNrMQorc2FjM3JpMgorczNhMmMxdAorNXNhaTIKK3NhNGwyYTJyNAorczRhMmw0bQorc2E1bG8KK3NhNGw0dAorM3NhbmMKK3NhMm4KK3NhbjRkZQorczRhbmQKK3MxYXAKK3NhNXRhCis1c2EzdDJpbworc2EydDN1CitzYXU0CitzYTV2b3IKKzVzYXcKKzRzNWIKK3NjYW40dDUKK3MxY2EKK3NjYTJuCitzY2E0cAorc2NhdjUKK3M0Y2VkCis0czNjZWkyCitzNGNlcworczJjaDIKK3M0Y2hvMgorM3M0YzJpZTQKK3MxY2kKKzVzYzRpbjRkCitzMmNpbgorc2NsZTUKK3MxYzRsNAorczRjbGkKK3Njb2Y0CitzMWNvCis0c2NvcHk1CitzY291MXI1YQorc2NvdTIKK3MxY3UKKzRzNWQKKzRzZS4KK3NlNGEKK3NlYXM0CitzZWE1dworc2UyYzNvCiszc2UyYzF0Cis0czRlZAorc2U0ZDRlCitzNWVkbAorc2UyZworc2UxZzNyCis1c2VpMgorc2UxbGUKKzVzZTJsMmYKKzVzZWx2Cis0c2UxbWUKK3NlNG1vbAorc2UxbW8KK3NlbjVhdAorc2UxbmEKKzRzZW5jCitzZW40ZAorczVlMm5lZAorc2VuNWcKK3M1ZW4xaW4KKzRzZW40dDFkCitzZW4xdAorNHNlbjJ0bAorc2UycDNhMworNHMxZXIuCitzNGVyMWwKK3MyZXI0bworNHNlcjN2bworczFlNHMKK3M0ZTVzMmgKK3NlczV0Cis1c2U1dW0KK3M0ZXUKKzVzZXYKK3NldjNlbgorc2V3NGkyCis1c2V4Cis0czNmCisyczNnCitzMmgKKzJzaC4KK3NoMWVyCis1c2hldgorc2gxaW4KK3NoM2lvCiszc2gyaTRwCitzaDJpMnY1CitzaG80CitzaDVvMmwyZAorc2hvMm4zCitzaG9yNAorc2hvcnQ1Cis0c2gxdworc2kxYgorczVpYzNjCiszc2kyZGUuCitzMmlkCis1c2lkZTRzMgorNXNpMmRpCitzaTVkaXoKKzRzaWcxbjRhCitzMmlnCitzaWw0ZQorNHNpMWx5CisyczFpbgorczJpMW5hCis1c2kybmUuCitzMmluZQorczNpbmcKKzFzMmlvCis1c2lvMm4KK3NpbzFuNWEKK3M0aTJyCitzaTFyNWEKKzFzaXMKKzNzMmkxdDJpbworc2kxdGkKKzVzaTF1CisxczJpdgorNXNpegorc2syCis0c2tlCitzM2tldAorc2s1aW5lCitzazFpCitzazVpbjRnCitzMWwyCitzM2xhdAorczJsZQorc2wyaXRoNQorc2wxaXQKKzJzMW0KK3MzbWEKK3NtYWwxbDMKK3NtYTJuMworc21lbDQKK3M1bWVuCis1czRtMml0aAorc21vMmw1ZDQKK3MxbW8KK3MxbjQKKzFzbworc280Y2UKK3NvMmZ0Mworc280bGFiCitzbzFsYQorc28ybDNkMgorc28zbGljCitzb2wyaQorNXNvbDJ2Ciszc29tCiszczRvbi4KK3NvMm4KK3NvMW4xYTQKK3NvbjRnCitzNG9wCis1c29waDFpYworczJvcGgKK3M1bzNwaGl6CitzNW8xcGh5Citzb3I1Yworc29yNWQKKzRzb3YKK3NvNXZpCisyczFwYQorNXNwNGFpMgorc3BhNG4KK3NwZW40ZAorMnM1cGVvCisyc3BlcgorczJwaGUKKzNzcGg0ZXIKK3NwaG81CitzcGlsNAorc3A1aW5nCitzcGkybgorNHMzcDJpMW8KK3M0cDFseQorczFwMmwyCitzNHBvMm4KK3MxcDRvcjQKKzRzcDRvdAorc3F1YWw0bAorc3F1MgorczFyCisyc3MKK3Mxc2EyCitzc2FzMworczJzNWMKK3Mzc2VsCitzNXNlbjVnCitzNHNlcy4KK3NzMWU0cworczVzZXQKK3Mxc2kKK3M0czJpZTQKK3NzaTRlcgorczRzNWkxbHkKK3M0czFsMgorc3M0bGkKK3M0czFuNAorc3NwZW40ZDQKK3NzMnQKK3NzdTFyNWEKK3Mxc3UKK3NzdTJyCitzczV3MgorMnN0LgorczJ0YWcKK3MxdGEKK3MydGEybAorc3RhbTRpCis1c3Q0YW5kCitzdGEybgorczR0YTRwCis1c3RhdC4KK3M0dDFlZAorc3Rlcm41aQorczV0MmVybworc3RlMncKK3N0ZTF3NWEKK3MzdGgyZQorc3QyaQorczR0aS4KK3M1dDJpMWEKK3MxdGljCis1czR0aWNrMQorczR0MmllNAorczN0aWYyCitzdDNpbmcKK3MydDFpbgorNXN0NGlyCitzMXRsZQorczJ0bAorNXN0b2NrMQorczF0bworc3RvMm0zYQorNXN0b25lCitzdG8ybgorczR0b3AKKzNzdG9yZQorc3Q0cgorczR0cmEyZAorczF0cmEKKzVzdHJhMnR1CitzNHRyYXkKK3M0dHIyaWQKKzRzdHJ5Cis0c3QzdzQKK3MydHkKKzFzdQorc3UxYWwKK3N1NGIzCitzdTJnMworc3U1aXMKK3MydWkyCitzdWl0MworczR1bAorc3UybQorc3UxbTNpCitzdTJuCitzdTJyCis0c3YKK3N3MgorNHMxd28yCitzNHkKKzRzeTFjCiszc3lsCitzeW41bworc3k1cmluCisxdGEKKzN0YS4KKzJ0YWIKK3RhNWJsZXMyCit0YWIybDIKKzV0YWI1bzVsMWl6Cit0YWJvbDJpCis0dDRhMmNpCit0YTVkbwordGEyZAorNHRhMmY0Cit0YWk1bG8KK3RhaTIKK3RhMmwKK3RhNWxhCit0YWw1ZW4KK3QyYWxlCit0YWwzaQorNHRhbGsKK3RhbDRsaXMKK3RhbDFsCit0YWxsMmkKK3RhNWxvZwordGE1bW8KK3RhbjRkZQordGEybgordDRhbmQKKzF0YW4xdGEzCit0YW4xdAordGE1cGVyCit0YTVwMmwyCit0YXI0YQordDJhMnIKKzR0YXIxYworNHRhcmUKK3RhM3IyaXoKK3RhcjFpCit0YXM0ZQordGE1czR5Cis0dGF0MWljCit0YTR0dXIKK3RhMnR1Cit0YXVuNAordGF2NAorMnRhdwordGF4NGlzCit0YXgzaQorMnQxYgorNHRjCit0NGNoCit0Y2g1ZTR0Cit0Y2hlMgorNHQxZAorNHRlLgordGUyYWQ0aQordGVhMmQxCis0dGVhMnQKK3RlMWNlNAorNXRlMmMxdAorMnQxZWQKK3Q0ZTVkaQorMXRlZQordGVnNAordGU1Z2VyNAordGU1Z2kKKzN0ZWwuCit0ZWwyaTQKKzV0ZTJsMXMyCit0ZTJtYTIKK3RlbTNhdAorM3RlbjJhMm4KK3RlMW5hCiszdGVuYworM3RlbmQKKzR0ZTFuZXMKKzF0ZW4xdAordGVuNHRhZwordGVuMXRhCisxdGVvCit0ZTRwCit0ZTVwZQordGVyM2MKKzV0ZXIzZAorMXRlcjFpCit0ZXI1aWVzCit0ZXIyaWU0Cit0ZXIzaXMKK3Rlcmk1emExCis1dDRlcjNuMml0Cit0ZXI1dgorNHRlcy4KKzR0MmUyc3MKK3QzZXNzLgordGV0aDVlCiszdDRldQorM3RleAorNHRleQorMnQxZgorNHQxZworMnRoLgordGhhMm40Cit0aDJlCis0dGhlYQordGgzZWFzCit0aGU1YTJ0Cit0aGUzaXMKK3RoZWkyCiszdGhlNHQKK3RoNWljLgordGg1aTFjYQorNHRoNGlsMgorNXRoNGk0bmsyCis0dDRoMWw0Cit0aDVvZGUKKzV0aG9kM2ljCis0dGhvbzIKK3Rob3I1aXQKK3RobzVyaXoKKzJ0NGgxczIKKzF0MmkxYQordGk0YWIKK3RpNGExdG8KKzJ0aTJiCis0dGljazEKK3Q0aTFjbwordDRpYzF1Cis1dGkyZGkKK3QyaWQKKzN0aWVuCit0MmllNAordGlmMgordGk1ZnkKKzJ0MmlnCis1dGlndQordGlsMmw1aW40Cit0aWwxbAordGlsbDJpCisxdGltCis0dGk0bTFwCit0aW01dWwKK3RpMm11CisydDFpbgordDJpMW5hCiszdGkybmUuCit0MmluZQorM3QyaW5pCisxdDJpbwordGk1b2MKK3Rpb241ZWUKK3RpbzJuCis1dGlxCit0aTNzYTIKKzN0NGlzZQordGkyczRtCit0aTVzbwordGlzNHAKKzV0aXN0aTFjYQordGlzMXQyaQordGlzMXRpYwordGkzdGwKK3RpNHUKKzF0Mml2Cit0aTF2NGEKKzF0aXoKK3RpM3phMQordGkzemU0bgordGkyemUKKzJ0bAordDVsYQordGxhMm40CiszdGxlLgorM3RsZWQKKzN0bGVzLgordGxlczIKK3Q1bGV0LgordDVsbworNHQxbQordG1lNAorMnQxbjIKKzF0bwordG8zYgordG81Y3JhdAorNHRvMmRvNAorMnRvZgordG8yZ3IKK3RvNWljCit0b2kyCit0bzJtYQordG80bTRiCit0bzNteQordG9uNGE0bDFpCit0bzJuCit0bzFuMWEKK3RvM24yYXQKKzR0b25vCis0dG9ueQordG8ycmEKK3RvM3IyaWU0Cit0b3I1aXoKK3RvczIKKzV0b3VyCit0b3UyCis0dG91dAordG8zdzJhMnIKKzR0MXAKKzF0cmEKK3QycmEzYgordHJhNWNoCit0cjRhMmNpNAordHJhMmM0aXQKK3RyYWM0dGUKK3RyYTJjMXQKK3RyMmFzNAordHJhNXZlbgordHJhdjVlMnM1Cit0cmU1ZgordHJlNG0KK3RyZW01aQorNXRyMmkzYQordHJpNWNlcwordHI0aWNlCis1dHJpM2MyaTFhCit0NHIyaTFjaQorNHRyaTRjM3MyCisydHJpbQordHIyaTR2Cit0cm81bTRpCit0cm9uNWkKK3RybzJuCis0dHJvbnkKK3RybzVwaGUKK3RyMm9waAordHJvM3NwCit0cm8zdgordHIydTVpMgordHIydXM0Cis0dDFzMgordDRzYwordHMyaDQKK3Q0c3cyCis0dDN0MgordDR0ZXMKK3Q1dG8KK3QxdHU0CisxdHUKK3R1MWEKK3R1M2EycgordHU0YjRpCit0dWQyCis0dHVlCis0dHVmNAorNXQydTNpMgorM3R1bQordHU0bmlzCit0dTFuaQorMnQzdXAuCiszdHVyZQorNXR1cmkKK3R1cjNpcwordHVyNW8KK3R1NXJ5CiszdDJ1cworNHR2Cit0dzQKKzR0MXdhCit0d2lzNAordHdpMgorNHQxd28yCisxdHkKKzR0eWEKKzJ0eWwKK3R5cGUzCit0eTVwaAorNHR6Cit0Mno0ZQorNHVhYgordWFjNAordWE1bmEKK3VhMm4KK3VhbjRpCit1YXI1YW4xdAordTJhMnIKK3VhcmEybgordWFyMmQKK3VhcjNpCit1YXIzdAordTFhdAordWF2NAordWI0ZQordTRiZWwKK3UzYmVyCit1NGIyZXJvCit1MWI0aQordTRiNWluZwordTNiNGxlLgordWIybDIKK3UzY2EKK3VjaTRiCit1MWNpCit1MmM0aXQKK3VjbGUzCit1MWM0bDQKK3UzY3IKK3UzY3UKK3U0Y3kKK3VkNWQ0Cit1ZDNlcgordWQ1ZXN0Cit1ZGVzMgordWRlMXY0Cit1MWRpYwordWQzaWVkCit1ZDJpZTQKK3VkM2llcwordWQ1aXMxCit1NWRpdAordTRkbzJuCit1MWRvCit1ZDRzaQordTJkMXMyCit1NGR1Cit1NGVuZQordWUybjFzNAordWVuNHRlCit1ZW4xdAordWVyNGlsCit1ZXIxaQorM3UxZmEKK3UzZjRsMgordWdoM2UybgordWc1aW4KKzJ1aTIKK3VpbDVpegordWlsMWkKK3VpNG4KK3UxaW5nCit1aXI0bQordTRpcgordWkxdGE0Cit1Mml2MwordWk0djRlci4KK3U1agorNHVrCit1MWxhCit1bGE1YgordTVsYXRpCit1bDJjaDQKK3U0bDFjMgorNXVsY2hlMgordWwzZGVyCit1MmxkCit1bDJkZQordWw0ZQordTFsZW4KK3VsNGdpCit1NGwxZzQKK3VsMmkKK3U1bDJpMWEKK3VsM2luZwordWw1aXMyaAordWw0bDJhMnIKK3VsMWwKK3VsNGxpNGIKK3VsbDJpCit1bDRsaXMKKzR1MmwzbQordTFsNG8KKzR1MmwxczIKK3VsczVlNHMKK3VsMnNlCit1bDF0aQordTRsdAordWwxdHJhMwordWwxdHIKKzR1bDF0dTIKK3UzbHUKK3VsNXVsCit1bDV2Cit1Mm01YWIKK3UxbWEKK3VtNGJpCit1NG0xYgordW00YjFseQordW1iMmwyCit1MW1pCit1NG0zaW5nCit1bW9yNW8KK3UxbW8KK3VtbzJyCit1NG0ycAordW4yYXQ0Cit1MW5hCit1Mm5lCit1bjRlcgordTFuaQordW40aW0KK3UybjFpbgordW41aXMyaAordW4yaTN2Cit1Mm4zczQKK3VuNHN3MgordW4ydDNhNGIKK3VuMXQKK3VuMXRhCit1bjR0ZXIuCit1bjR0ZXMKK3VudTQKK3VuNXkKK3U0bjV6Cit1NG80cnMyCit1NW9zCit1MW91MgordTFwZQordXBlNHI1czIKK3U1cDJpM2EKK3VwM2luZwordXBpMm4KK3UzcDJsMgordTRwM3AKK3VwcG9ydDUKK3VwMXA0b3IKK3VwMnQ1aTJiCit1MnAxdAordXAxdHU0Cit1MXJhCis0dXJhLgordTRyYWcKK3U0cjJhcwordXI0YmUKK3VyMWIKK3VyMWM0Cit1cjFkCit1cmU1YTJ0Cit1cjRmZXIxCit1cjFmCit1cjRmcgordTNyaWYKK3VyaTRmaWMKK3VyaTFmaQordXIxaW4KK3UzcjJpMW8KK3Uxcml0Cit1cjNpegordXIybAordXJsNWluZy4KK3VyNG5vNAordXJvczQKK3VyNHBlCit1cjFwCit1cjRwaQordXJzNWVyCit1NHJzMgordXIyc2UKK3VyNXRlcwordXIzdGgyZQordXIxdGk0Cit1cjR0MmllNAordTNydQorMnVzCit1NXNhMmQKK3VzYTIKK3U1c2EybgordXM0YXAKK3VzYzIKK3VzM2NpCit1c2U1YQordTVzMmkxYQordTNzaWMKK3VzNGxpbgordXMxbDIKK3VzMXAKK3VzNXMxbDIKK3Uyc3MKK3VzNXRlcmUKK3VzMXQ0cgordTJzdQordXN1MnI0Cit1MnRhNGIKK3UxdGEKK3UzdGF0Cis0dTR0ZS4KKzR1dGVsCis0dXRlbgordXRlbjRpCis0dTF0MmkKK3V0aTVsMml6Cit1dGlsMWkKK3UzdDJpbmUKK3UydDFpbgordXQzaW5nCit1dGlvMW41YQordTF0MmlvCit1dGlvMm4KK3U0dGlzCis1dTV0aXoKK3U0dDFsCit1MnQ1b2YKK3UxdG8KK3V0bzVnCit1dG81bWF0MWljCit1dG8ybWEKK3U1dG8ybgordTR0b3UyCit1NHQxczQKK3UzdQordXU0bQordTF2MgordXgxdTMKK3UyejRlCisxdmEKKzV2YS4KKzJ2MWE0YgordmFjNWlsCit2NGEyY2kKK3ZhYzN1Cit2YWc0Cit2YTRnZQordmE1bDJpNGU0Cit2YWwxaQordmFsNW8KK3ZhbDF1Cit2YTVtbwordmE1bml6Cit2YTJuCit2YTVwaQordmFyNWllZAordjJhMnIKK3ZhcjFpCit2YXIyaWU0CiszdmF0Cis0dmUuCis0dmVkCit2ZWczCit2M2VsLgordmVsM2wyaQordmVsMWwKK3ZlNGxvCit2NGUxbHkKK3ZlbjNvbQordjRlbm8KK3Y1ZW51ZQordjRlcmQKKzV2MmUycmUuCit2NGVyZWwKK3YzZXJlbgordmVyNWVuYwordjRlcmVzCit2ZXIzaWU0Cit2ZXIxaQordmVybWk0bgordmVyM200CiszdmVyMnNlCit2ZTRyMXMyCit2ZXIzdGgKK3Y0ZTJzCis0dmVzLgordmVzNHRlCit2ZTR0ZQordmV0M2VyCit2ZTR0eQordmk1YWwxaQordjJpMWEKK3ZpMmFsCis1dmkyYTJuCis1dmkyZGUuCit2MmlkCis1dmkyZDFlZAorNHYzaTFkZW4KKzV2aWRlNHMyCis1dmkyZGkKK3YzaWYKK3ZpNWduCit2MmlnCit2NGlrNAorMnZpbAorNXYyaWwxaXQKK3ZpbDFpCit2M2kzbDJpegordjFpbgorNHZpNG5hCit2MmluYwordjRpbjVkCis0dmluZwordmkxbzNsCit2MmlvCit2M2lvNHIKK3ZpMW91MgordjJpNHAKK3ZpNXJvCit2NGlyCit2aXMzaXQKK3ZpM3NvCit2aTNzdQorNHZpMXRpCit2aXQzcgorNHZpMXR5CiszdjJpdgorNXZvLgordm9pNAorM3Yyb2sKK3ZvNGxhCit2NW9sZQorNXZvNGwydAorM3ZvbDJ2Cit2b201aQordm8ycjVhYgordm8xcmEKK3Zvcmk0Cit2bzRyeQordm80dGEKKzR2bzF0ZWUKKzR2djQKK3Y0eQordzVhYjJsMgorMndhYword2E1Z2VyCit3YTJnNW8KK3dhaXQ1Cit3YWkyCit3NWFsLgord2FtNAord2FyNHQKK3cyYTJyCit3YXM0dAord2ExdGUKK3dhNXZlcgordzFiCit3ZWE1cjJpZTQKK3dlMmEycgord2VhcjFpCit3ZTRhdGgzCit3ZWEydAord2U0ZDRuNAord2VldDMKK3dlZTV2Cit3ZWw0bAordzFlcgord2VzdDMKK3czZXYKK3doaTQKK3dpMgord2lsMgord2lsMmw1aW40Cit3aWwxbAord2lsbDJpCit3aW40ZGUKK3c0aW5kCit3aW40ZwordzRpcjQKKzN3NGlzZQordzJpdGgzCit3aXo1Cit3NGsKK3dsNGVzMgord2wzaW4KK3c0bm8KKzF3bzIKK3dvbTEKK3dvNXY0ZW4KK3c1cAord3JhNAord3JpNAord3JpMXRhNAordzNzMmgKK3dzNGwyCit3czRwZQordzVzNHQKKzR3dAord3k0Cit4MWEKK3hhYzVlCit4NGEyZ28KK3hhbTMKK3g0YXAKK3hhczUKK3gzYzIKK3gxZQoreGU0Y3UxdG8KK3hlMWN1Cit4ZTNjNHV0Cit4MmVkCit4ZXI0aQoreDJlNXJvCit4MWgKK3hoaTIKK3hoNGlsNQoreGh1NAoreDNpCit4Mmk1YQoreGk1YworeGk1ZGkKK3gyaWQKK3g0aW1lCit4aTVtMml6Cit4aW0xaQoreDNvCit4NG9iCit4M3AKK3hwNGFuNGQKK3gxcGEKK3hwYTJuCit4cGVjMXRvNQoreHBlMmMKK3hwZTJjMXQKK3gycDJlM2QKK3gxdDIKK3gzdGkKK3gxdQoreHUzYQoreHg0Cit5NWFjCiszeTJhMnI0Cit5NWF0Cit5MWIKK3kxYworeTJjZQoreWM1ZXIKK3kzY2gKK3ljaDRlMgoreWNvbTQKK3kxY28KK3ljb3Q0Cit5MWQKK3k1ZWUKK3kxZXIKK3k0ZXIxZgoreWVzNAoreWU0dAoreTVnaQorNHkzaAoreTFpCit5M2xhCit5bGxhNWIybDIKK3lsMWwKK3kzbG8KK3k1bHUKK3ltYm9sNQoreTRtMWIKK3ltZTQKK3ltMXBhMworeTRtMXAKK3luM2M0aHI0Cit5bjJjaAoreW41ZAoreW41ZworeW41aWMKKzV5bngKK3kxbzQKK3lvNWQKK3k0bzVnCit5b200Cit5bzVuZXQKK3lvMm4KK3k0bzJuM3MyCit5NG9zCit5NHAyZWQKK3lwZXI1Cit5cDNpCit5M3BvCit5NHBvNGMKK3lwMnRhCit5MnAxdAoreTVwdQoreXJhNW0KK3lyNWkzYQoreTNybworeXI0cjQKK3lzNGMKK3kzczJlCit5czNpMWNhCit5MXMzaW8KKzN5MXNpcworeTRzbworeTJzczQKK3lzMXQKK3lzM3RhCit5c3UycjQKK3kxc3UKK3kzdGhpbgoreXQzaWMKK3kxdworemExCit6NWEyYgorejJhMnIyCis0emIKKzJ6ZQoremU0bgoremU0cAorejFlcgorejJlM3JvCit6ZXQ0CisyejFpCit6NGlsCit6NGlzCis1emwKKzR6bQorMXpvCit6bzRtCit6bzVvbAorem9vMgorenRlNAorNHoxejIKK3o0enkKKy5hczlzOG85YzhpOGE4dGUuCisuYXMxc28KKy5hc3NvMWNpCisuYXNzbzNjMmkxYQorLmFzOXM4bzljOGk4YTh0OGVzLgorLmRlOGM5bDhpOW44YTl0OGk4b24uCisuZGUxYzRsNAorLmRlY2w0aTFuYQorLmRlY2xpbjJhdAorLmRlY2xpbmExdDJpbworLmRlY2xpbmF0aW8ybgorLm9iOGw4aThnOWE5dDhvOHJ5LgorLm9iMmwyCisub2JsMmlnCisub2JsaTFnYQorLm9ibGlnYTF0bworLm9ibGlnYXRvMXJ5CisucGg4aThsOWE4bjl0OGg4cjhvOHA4aWMuCisucGg0aWwyCisucGhpMWxhCisucGhpbGEybgorLnBoaWxhbjF0CisucGhpbGFudDRocjQKKy5waGlsYW50aHJvcDNpYworLnByOGU4czhlOG50LgorLnAzcmUxczJlCisucHJlc2VuMXQKKy5wcjhlOHM4ZThuOHRzLgorLnByZXNlbjR0NHMyCisucHI4bzhqOGU4Y3QuCisucHJvNWoKKy5wcm8xamUKKy5wcm9qZTJjMXQKKy5wcjhvOGo4ZThjOHRzLgorLnByb2plYzR0MXMyCisucmU4YzlpOXA4cjhvOGM5aTl0OHkuCisucmUxYzJpCisucmVjMmlwCisucmVjaXByMgorLnJlY2lwcjJvYworLnJlMWNpcHJvMWNpCisucmVjaXBybzJjMWl0CisucmVjaXByb2NpMXR5CisucmU5YzhvOGc5bjhpOXo4YThuOGNlLgorLnJlMWNvCisucmUyY29nCisucmVjM29nbml6CisucmVjb2cxbmkKKy5yZWNvZ25pemExCisucmVjb2duaXphMm4KKy5yZThmOW84cjltOGE5dDhpOG9uLgorLnJlMWYKKy5yZTFmbworLnJlZm8ycgorLnJlZm9yMW0KKy5yZWZvcjFtYQorLnJlZm9ybWExdDJpbworLnJlZm9ybWF0aW8ybgorLnJlOHQ5cjhpOWI4dTl0OGk4b24uCisucmUzdHJpCisucmV0cjRpYgorLnJldHJpM2J1MXQyaW8KKy5yZXRyaWI0dTF0MmkKKy5yZXRyaWJ1dGlvMm4KKy50YTliOGxlLgorLjJ0YWIKKy50YWIybDIKKy5hYzhhOGQ5ZTltOHkuCisuYTFjYQorLmFjYTJkCisuYWNhZDRlbQorLmFjYWRlM215CisuYWM4YThkOWU5bThpOGU4cy4KKy5hY2FkZW0yaTRlNAorLmFjOWM4dTlzOGE5dDhpOHY4ZS4KKy5hYzNjCisuYWMxYzJ1cworLmFjY3VzYTIKKy5hY2N1c2ExdDJpdgorLmFjOHI4bzluOHk4bS4KKy5hY3JvMm4KKy5hY3JvbnltNAorLmFjOHI4eThsOWE4bThpOGQ4ZS4KKy5hY3J5M2xhCisuYWNyeWxhbTJpZAorLmFjOHI4eThsOWE4bThpOGQ4ZThzLgorLmFjcnlsYW1pZGU0czIKKy5hYzhyOHk4bDlhOGw4ZDhlOWg4eThkOGUuCisuYWNyeWxhMmxkCisuYWNyeWxhbDJkZQorLmFjcnlsYWxkZTFoNAorLmFjcnlsYWxkZWh5MWQKKy5hZDhkOWE5YjhsOGUuCisuYWQxZDJhCisuYWQyZDNhNGIKKy5hZGRhYjJsMgorLmFkOGQ5aTliOGw4ZS4KKy5hZGRpMWIybDIKKy5hZDhyOGU4bjlhOWw4aThuOGUuCisuYTFkcgorLmFkcmU0CisuYTVkcmVuCisuYWRyZTFuYQorLmFkcmVuYTRsMWkKKy5hZHJlbmExbDRpbmUKKy5hZThyOG85czhwOGE4YzhlLgorLmFlNHIKKy5hMmVybworLmFlcm8yczRwYQorLmFlcm9zcGE0Y2UKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0LgorLmFmdGVydGhvdTIKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0OHMuCisuYWZ0ZXJ0aG91Z2g0dDFzMgorLmFnOHI4bzhuOW85bThpOHM4dC4KKy5hMWdyCisuYWc0cm8KKy5hZ3JvMm4KKy5hZ3Jvbm9tMmlzCisuYWc4cjhvOG45bzltOGk4czh0OHMuCisuYWdyb25vbWlzNHQxczIKKy5hbDlnOGU5YjhyOGE5aTljOGE4bDlsOHkuCisuYTRsMWc0CisuYWxnMmUxYgorLmFsZ2UzYnIKKy5hbGdlYnIyYWkyCisuYWxnZWJyYWkxY2EKKy5hbGdlYnJhaWNhbDFsCisuYWxnZWJyYWljYWwxbHkKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZS4KKy5hNG0xcAorLmFtcGhlNHQKKy5hbXBoZTF0YQorLmFtcGhldGFtMWluCisuYW1waGV0YW0yaW5lCisuYW05cDhoOGU4dDlhOW04aThuOGU4cy4KKy5hbXBoZXRhbWkxbmVzCisuYW45YTlsOHk4czhlLgorLjNhbmExbHkKKy5hMW5hCisuYW40YTJseXM0CisuYW5hbDV5M3MyZQorLmFuOWE5bDh5OHM4ZThkLgorLmFuYWx5NHM0ZWQKKy5hbjhhOGw4eTlzOGU4cy4KKy5hbmFseXMxZTRzCisuYW45aThzOG85dDhyOG84cDlpOGMuCisuYW5pMnNvCisuYW5pc290cm9wM2ljCisuYW45aThzOG85dDhyOG84cDlpOWM4YThsOWw4eS4KKy5hbmlzb3Ryb3BpMWNhCisuYW5pc290cm9waWNhbDFsCisuYW5pc290cm9waWNhbDFseQorLmFuOWk4czhvOHQ5cjhvOXA4aThzOG0uCisuYW5pc290cm9waTJzMW0KKy5hbjlpOHM4bzh0OXI4bzhwOHkuCisuYW5pc290cm9weTUKKy5hbjhvOG05YThsOHkuCisuYW5vNAorLmFub21hNWwKKy5hbm8xbWEKKy5hbm9tYTFseQorLmFuOG84bTlhOGw4aThlOHMuCisuYW5vbWFsMWkKKy5hbm9tYWwyaTRlNAorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlLgorLmFudDJpZAorLmFudGlkZXIxaQorLmFudGlkZXIyaTR2CisuYW50aWRlNHJpMXZhCisuYW50aWRlcmkzdmF0CisuYW50aWRlcjJpdmExdDJpdgorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlOHMuCisuYW50aWRlcml2YXRpdjRlMnMKKy5hbjh0OGk5aDhvOGw4bzltOG84cjlwOGg4aThjLgorLmFudGkzaAorLmFudGlob2xvMW1vCisuYW50aWhvbG9tbzJyCisuYW50aWhvbG9tb3IxcAorLmFudGlob2xvbW9ycDRoNAorLmFudGlob2xvbW9ycGgxaWMKKy5hbjl0OGk4bjlvOW04eS4KKy5hbjJ0MWluCisuYW50Mmkxbm8KKy5hbnRpbm8zbXkKKy5hbjl0OGk4bjlvOW04aThlOHMuCisuYW50aW5vbTJpZTQKKy5hbjl0OGk5bjh1OWM4bDhlOGE4ci4KKy5hbnRpbjF1CisuYW50aW51Y2xlMworLmFudGludTFjNGw0CisuYW50aW51Y2xlMmEKKy5hbnRpbnVjbGUyYTJyCisuYW45dDhpOW44dTljOGw4ZTlvOG4uCisuYW50aW51Y2xlbzJuCisuYW45dDhpOXI4ZTh2OW85bDh1OXQ4aThvOG45YThyOHkuCisuYW50NGlyCisuYW50aXJldjIKKy5hbnRpcmV2NW9sdQorLmFudGlyZXZvMWx1dAorLmFudGlyZXZvbDR1MXQyaQorLmFudGlyZXZvbHV0aW8xbjVhCisuYW50aXJldm9sdTF0MmlvCisuYW50aXJldm9sdXRpbzJuCisuYW50aXJldm9sdXRpb24yYTJyCisuYXA4bzh0OGg5ZTlvOXM4ZThzLgorLmFwNG90CisuYXA0b3RoCisuYXBvdGgyZQorLmFwb3RoZW9zNAorLmFwb3RoZW9zMWU0cworLmFwOG84dDhoOWU5bzlzOGk4cy4KKy5hcG90aGVvMXNpcworLmFwOXA4ZThuOWQ4aTh4LgorLmE0cDFwCisuYXAycGUKKy5hcDNwZW4KKy5hcjljOGg4aTltOGU5ZDhlOGE4bi4KKy5hcjFjCisuYXIyY2gKKy5hcmNoaTJtZWQKKy5hcmNoaW1lZGVhMm4KKy5hcjljOGg4aTlwOGU4bDlhOGc4by4KKy5hcmNoMmk0cAorLmFyY2hpcGU0CisuYXJjaGlwZTRsYQorLmFyY2hpcGVsYTJnbworLmFyOWM4aDhpOXA4ZThsOWE5ZzhvOHMuCisuYXI5YzhoOGk4djhlLgorLmFyY2gyaTJ2CisuYXI5YzhoOGk4djhlOHMuCisuYXJjaGl2NGUycworLmFyOWM4aDhpOHY5aThuOGcuCisuYXJjaGl2MWluCisuYXJjaGk0dmluZworLmFyOWM4aDhpOHY5aThzOHQuCisuYXI5YzhoOGk4djlpOHM4dDhzLgorLmFyY2hpdmlzNHQxczIKKy5hcjljOGg4ZTl0OHk4cDlhOGwuCisuYXJjaGUyCisuYXJjaGU0dAorLmFyY2hlMXR5CisuYXJjaGV0eTFwYQorLmFyY2hldHlwNGFsCisuYXI5YzhoOGU5dDh5OHA5aTljOGE4bC4KKy5hcmNoZXR5cDNpCisuYXJjaGV0eXBpMWNhCisuYXI4Yzl0OGE4bjlnOGU4bjh0LgorLmFyMmMxdAorLmFyY3Q1YW5nCisuYXJjMXRhCisuYXJjdGEybgorLmFyY3RhbjFnZW4KKy5hcmN0YW5nZW4xdAorLmFyOGM5dDhhOG45ZzhlOG44dDhzLgorLmFyY3RhbmdlbjR0NHMyCisuYXM5czhpOGc4bjlhOWI4bDhlLgorLmFzMXNpCisuYXM0c2lnMW40YQorLmFzczJpZworLmFzc2lnMm4xYTJiCisuYXNzaWduYWIybDIKKy5hczlzOGk4ZzhuOW84ci4KKy5hc3NpZzFubworLmFzOXM4aThnOG45bzhyOHMuCisuYXNzaWdubzRyczIKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHAuCisuYXMxc2lzCisuYXNzaXMxdGEKKy5hc3Npc3RhMm4KKy5hc3Npc3RhbjF0CisuYXNzaXN0YW40dDRzMgorLmFzc2lzdGFudHMyaDQKKy5hc3Npc3RhbnQzc2gyaTRwCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwOHMuCisuYXNzaXN0YW50c2hpMnAxczIKKy5hczh5OG04cDl0OG85bThhOHQ4aThjLgorLmFzNHkKKy5hc3k0bTFwCisuYXN5bTJwMXQKKy5hc3ltcDF0bworLmFzeW1wdG8ybWEKKy5hc3ltcHRvbWF0MWljCisuYXM5eThtOHA5dDhvOHQ5aThjLgorLmFzOHk4bjljOGg4cjhvOW44bzh1OHMuCisuYXN5bjNjNGhyNAorLmFzeW4yY2gKKy5hc3luY2hybzJuCisuYXN5bmNocm8xbm91MgorLmFzeW5jaHJvbm8ydXMKKy5hdDhoOWU4cjlvOXM4YzhsOGU5cjhvOXM4aThzLgorLjRhdGgKKy5hdGgyZQorLmF0aDJlcm8KKy5hdGhlcm9zMmMKKy5hdGhlcm9zY2xlNQorLmF0aGVyb3MxYzRsNAorLmF0aDJlcm9zY2w0ZXJvCisuYXRoZXJvc2NsZXJvMXNpcworLmF0OW04bzhzOXA4aDhlOHI4ZS4KKy5hNHQxbQorLmF0MW1vCisuYXRtb3MyCisuYXRtbzNzcAorLmF0bW9zMnBoZQorLmF0bW8zc3BoNGVyCisuYXQ5bThvOHM5cDhoOGU4cjhlOHMuCisuYXQ5dDhyOGk4Yjl1OHQ4ZThkLgorLmE0dDN0MgorLmF0dHI0aWIKKy5hdHRyaWJ1MnQxZWQKKy5hdDl0OHI4aThiOXU4dDlhOGI4bDhlLgorLmF0dHJpNGJ1MXRhCisuYXR0cmlidTJ0YTRiCisuYXR0cmlidXRhYjJsMgorLmF1OXQ4bzltOGE5dDhpOG84bi4KKy5hdTF0bworLmF1dG8ybWEKKy5hdXRvbWExdDJpbworLmF1dG9tYXRpbzJuCisuYXU5dDhvOG05YTl0OG84bi4KKy5hdXRvbWExdG8KKy5hdXRvbWF0bzJuCisuYXU5dDhvOG05YTl0OGEuCisuYXV0b21hMnRhCisuYXU5dDhvOW44dThtOWI4ZThyOWk4bjhnLgorLmF1NXRvMm4KKy5hdXRvbjV1bQorLmF1dG9udTRtMWIKKy5hdXRvbnVtYmVyMWkKKy5hdXRvbnVtYmVyaW40ZworLmF1OXQ4bzhuOW85bThvOHU4cy4KKy5hdTR0b25vCisuYXV0b25vNG1vCisuYXV0b25vM21vMnVzCisuYXV0b25vbW91MgorLmF1OHQ4bzlyOG84dThuOGQ5aThuOGcuCisuYXV0b3JvdTIKKy5hdXRvcm91bjJkCisuYXV0b3JvdW5kMWluCisuYXY5bzhpOHI5ZDh1OXA4bzhpOHMuCisuYXZvaTQKKy5hdm80aXIKKy5hdm9pcjFkdQorLmF2b2lyNGR1cAorLmF2b2lyZHVwb2kyCisuYmE4bjhkOWw4ZThhOGQ4ZThyLgorLmI0YW5kCisuYmFuMWRsCisuYmFuZGxlMmEKKy5iYW5kbGVhMmQxCisuYmE4bjhkOWw4ZThhOGQ4ZThyOHMuCisuYmFuZGxlYWRlNHI1czIKKy5iYThuOGs5cjh1OHA4dC4KKy5iYTRuazIKKy5iYW5rcnUycDF0CisuYmE4bjhrOXI4dThwOHQ5Yzh5LgorLmJhbmtydXA0dGMKKy5iYW5rcnVwdDFjeQorLmJhOG44azlyOHU4cDh0OWM4aThlOHMuCisuYmFua3J1cHQxY2kKKy5iYW5rcnVwdGMyaWU0CisuYmE4cjlvOG44aThlOHMuCisuYjJhMnIKKy5iYTVyb25pCisuYmFybzJuCisuYmFyb24yaWU0CisuYmE4czhlOWw4aThuOGU5czhrOGk4cC4KKy5iYXNlbDJpCisuYmFzZTFsNGluZQorLmJhc2VsaTFuZXMKKy5iYXNlbGluZXNrMgorLmJhc2VsaW5lc2sxaQorLmJhc2VsaW5lc2syaTRwCisuYmE5dDhoOHk4bTllOXQ4cjh5LgorLjFiYXQKKy5iNGF0aAorLmJhdGh5bWU0CisuYmF0aHltNGV0cgorLmJhdGh5bWUzdHJ5CisuYmE4dDhoOHk5czhjOGE4cDhoOGUuCisuYmF0aHkycworLmJhdGh5czRjCisuYmF0aHlzY2E0cAorLmJhdGh5czFjYQorLmJlOGE4bjlpOGU4cy4KKy5iZWEybgorLmJlYTNuaWVzCisuYmVhbjJpZTQKKy5iZTloOGE4djlpOG84dThyLgorLmJlMWg0CisuYmVoYXYxaQorLmJlaGF2aTFvdTIKKy5iZWhhdjJpbworLmJlaGF2aTRvdXIKKy5iZTloOGE4djlpOG84dThyOHMuCisuYmVoYXZpb3U0cnMyCisuYmU4djhpOGU4cy4KKy5iZTF2aQorLmJldjJpZTQKKy5iaThiOWw4aTlvOGc5cjhhOXA4aDh5OXM4dDh5OGw4ZS4KKy5iaTJiCisuYmkxYjJsMgorLmJpYjNsaQorLmJpYmxpNW9nCisuYmlibDJpbworLmJpYmxpbzJncgorLmJpYmxpbzRnM3JhMXBoeQorLmJpYmxpb2dyYXBoeTJzCisuYmlibGlvZ3JhcGh5czF0CisuYmlibGlvZ3JhcGh5czJ0eQorLmJpYmxpb2dyYXBoeXMydHlsCisuYmk5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuYjJpNGQKKy5iaTJkaQorLmJpZDFpZgorLmJpZGk0ZjFmCisuYmlkaWZmZXIxCisuYmlkaWZmZXIzZW4xdAorLmJpZGlmZmVyZW50MmkKKy5iaWRpZmZlcmVuMXQyaTFhCisuYmlkaWZmZXJlbnRpMmFsCisuYmk4ZzlnOGU4czh0LgorLmIyaWcKKy5iaTRnMWcyCisuYmlnMmdlCisuYmk4bDhsOWE4YjhsOGUuCisuMWJpbAorLmJpbGw1YWIKKy5iaWwxbAorLmJpbGxhYjJsMgorLmJpOG85bThhOHQ4aDllOW04YTh0OWk4YzhzLgorLmIyaW8KKy5iaW80bQorLmJpbzFtYQorLmJpb200YXRoMworLmJpb21hdGg1ZW0KKy5iaW9tYXRoMmUKKy5iaW9tYXRoZTFtYQorLmJpb21hdGhlbWF0MWljCisuYmlvbWF0aGVtYXRpNGMzczIKKy5iaThvOW04ZThkOWk5YzhhOGwuCisuYmlvMm1lCisuYmlvMm1lZAorLmJpb200ZWRpCisuYmlvbWVkM2kxY2EKKy5iaThvOW04ZThkOWk5YzhpOG44ZS4KKy5iaW9tZWQyaTFjaQorLmJpb21lZGkyY2luCisuYmlvbWVkaWMyaW5lCisuYmk4bzlyOGg4eTh0OGg4bThzLgorLmJpb3JoNAorLmJpb3JoeXQ0aDFtCisuYmlvcmh5dGg0bTFzMgorLmJpOHQ5bThhOHAuCisuYmkydAorLmJpNHQxbQorLmJpdDFtYQorLmJpdDRtYXAKKy5iaTh0OW04YThwOHMuCisuYml0bWEycDFzMgorLmJsOGE4bjhkOWU4ci4KKy5iMmwyCisuYjNsNGFuZAorLmJsYTJuCisuYmxhbjFkZQorLmJsOGE4bjhkOWU4czh0LgorLmJsYW5kZTRzMgorLmJsOGk4bjhkOWU4ci4KKy5ibDRpbmQKKy5ibGluMWRlCisuYmw4bzhuOGQ4ZThzLgorLmI0bG8KKy5ibG8ybgorLmJsMm9uZAorLmJsb24xZGUKKy5ibG9uZGVzMgorLmJsOHU4ZTlwOHI4aThuOHQuCisuYmx1ZXByMgorLmJsdWVwcmluNHQzCisuYmw4dThlOXA4cjhpOG44dDhzLgorLmJsdWVwcmluNHQ0czIKKy5ibzlsOG84bTllOXQ4ZThyLgorLmJvbG8ybWUKKy5ib2xvNG1ldAorLmJvbG9tZTF0ZQorLmJvOG84azlzOGU4bDhsOWU4ci4KKy4zYm9vMgorLmJvMm80aworLmJvbzRrMXMyCisuYm9va3NlbDFsCisuYm9va3NlbDJsZQorLmJvOG84azlzOGU4bDhsOWU4cjhzLgorLmJvb2tzZWxsZTRyMXMyCisuYm84bzhsOWU4YThuLgorLmJvb2xlMmEKKy5ib29sZWEybgorLmJvOG84bDllOGE4bjhzLgorLmJvb2xlYTJuMXMyCisuYm84cjluOG85bDhvOGc5aTljOGE4bC4KKy5ib3JubzQKKy5ib3JubzNsb2cxaWMKKy5ib3Jub2xvZ2kxY2EKKy5ibzh0OXU5bDhpOHM4bS4KKy5ibzF0dQorLmJvdHVsMmkKKy5ib3R1bGkyczFtCisuYnI4dThzOHE4dThlOHIuCisuYnIydXMKKy5icnVzcXUyCisuYnJ1czNxdWVyCisuYnU4ZjlmOGU4ci4KKy5idWY0ZmVyMQorLmJ1NGYxZgorLmJ1OGY5ZjhlOHI4cy4KKy5idWZmZTRyMXMyCisuYnU4czhpOGU4ci4KKy5idXM1aWU0CisuYjJ1cworLmJ1OHM4aThlOHM4dC4KKy5idXNpMWVzdAorLmJ1OHM4czhpOG44Zy4KKy5idTJzcworLmJ1czFzaQorLmJ1czJzMWluCisuYnVzczNpbmcKKy5idTh0OHQ4ZThkLgorLmJ1dDJ0MWVkCisuYnU4ejh6OXc4bzhyOGQuCisuYnU0ejF6MgorLmJ1enoxd28yCisuYnU4ejh6OXc4bzhyOGQ4cy4KKy5idXp6d29yMmQxczIKKy5jYTljOG84cDhoOW85bjh5LgorLmNhMWNvCisuY2FjMm9waAorLmNhY29waG81bnkKKy5jYWNvcGhvMm4KKy5jYTljOG84cDhoOW85bjhpOGU4cy4KKy5jYWNvNXBob25pCisuY2Fjb3Bob24yaWU0CisuY2E4bDhsOWU4ci4KKy5jYWwxbAorLmNhbDJsZQorLmNhOGw4bDllOHI4cy4KKy5jYWxsZTRyMXMyCisuY2E4bTllOHI4YTltOGU4bi4KKy5jYW01ZXIxYQorLmNhbWVyYTFtZW4KKy5jYThyOHQ5dzhoOGU4ZThsLgorLmNhcnR3NAorLmNhOHI4dDl3OGg4ZThlOGw4cy4KKy5jYXJ0d2hlZTJsMXMyCisuY2E5dDhhOHI4cjhoOHMuCisuY2EydGEKKy5jYXQyYTJyCisuY2F0YXIxcjQKKy5jYXRhcnJoNAorLmNhdGFycjRoMXMyCisuY2E4dDlhOXM4dDhyOG84cDhoOWk4Yy4KKy5jYXRhczF0NHIKKy5jYXRhc3RyMm9waAorLmNhdGFzdHJvcGgxaWMKKy5jYTh0OWE5czh0OHI4bzhwOGg5aTljOGE4bDhsOHkuCisuY2F0YXN0cm9waGkxY2EKKy5jYXRhc3Ryb3BoaWNhbDFsCisuY2F0YXN0cm9waGljYWwxbHkKKy5jYTh0OWU5bjhvOGk4ZC4KKy5jYXQ0ZW5vCisuY2F0ZW5vaTIKKy5jYXRlbm8yaWQKKy5jYTh0OWU5bjhvOGk4ZDhzLgorLmNhdGVub2kyZDFzMgorLmNhOHU5bDhpOWY4bDhvOHc5ZThyLgorLmNhdTRsMgorLmNhdWwyaQorLmNhdWxpNGY0bDIKKy5jYXVsaWZsb3cxZXIKKy5jaDhhOHA5YThyOXI4YThsLgorLmNoYXAyYTJyNAorLmNoYTFwYQorLmNoYXBhcjFyNAorLmNoOGE4cjl0OHI4ZTh1OHM4ZS4KKy5jaDJhMnIKKy5jaGFydHI0ZXUyCisuY2hhcnRyZTJ1czQKKy5jaDhlOG04bzl0OGg4ZThyOWE4cDh5LgorLmNoZTIKKy5jaGUxbW8KKy5jaGVtNG90aDMKKy5jaGVtb3RoMmUKKy5jaGVtb3RoNGVyMWEKKy5jaGVtb3RoZXJhM3AKKy5jaDhlOG04bzl0OGg4ZThyOWE5cDhpOGU4cy4KKy5jaGVtb3RoZXJhcDJpZTQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuYzRoMWw0CisuY2gybG8KKy5jaGxvcm8ybWUKKy5jaGxvcm80bWV0CisuY2hsb3JvbWV0aGEybjQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGU4cy4KKy5jaGxvcm9tZXRoYTFuZXMKKy5jaDhvOWw4ZThzOXQ4ZThyOGk4Yy4KKy4zY2hvMgorLmMzaG9sNGUKKy5jaG9sZXMyCisuY2hvbGVzMXRlcjFpCisuY2k4ZzlhOXI4ZTh0OHQ4ZS4KKy5jMmlnCisuY2kxZ2EKKy5jaWcyYTJyCisuY2lnYXJlNHQzdDIKKy5jaThnOWE5cjhlOHQ4dDhlOHMuCisuY2lnYXJldDR0ZXMKKy5jaThuOHE4dThlOWY4bzhpOGwuCisuMmNpbgorLmNpbjFxCisuY2lucXUyCisuY2lucXVlMWYKKy5jaW5xdWUxZm8KKy5jaW5xdWVmb2kyCisuY285YThzOHM4bzljOGk4YTl0OGk4djhlLgorLmM0b2EKKy5jb2Eyc3MKKy5jb2FzMXNvCisuY29hc3NvMWNpCisuY29hc3NvM2MyaTFhCisuY29hc3NvY2k0YTF0Mml2CisuY285ZzhuOGE4Yy4KKy4yY29nCisuY29nMW40YQorLmNvOWc4bjhhOGM4cy4KKy5jb2duYTRjM3MyCisuY285azhlOHI5bjhlOGwuCisuYzJvaworLmNvazFlcgorLmNva2VyM25lbAorLmNvOWs4ZThyOW44ZThsOHMuCisuY29rZXJuZTJsMXMyCisuY284bDlsOGk4bjllOGE5dDhpOG84bi4KKy5jb2wxbAorLmNvbGwyaQorLmNvbDJsaW40CisuY29sMWw0aW5lCisuY29sbGluM2VhCisuY29sbGluZWEydAorLmNvbGxpbmVhMXQyaW8KKy5jb2xsaW5lYXRpbzJuCisuY284bDl1OG04bjhzLgorLmNvbHU0bTFuCisuY29sdW0ybjFzMgorLmNvOG05cDhhOHI5YThuOGQuCisuY280bTFwCisuY29tcGFyYTUKKy5jb20xcGEKKy5jb21wMmEycgorLmNvbXBhcmEybgorLmNvbXBhcjRhbmQKKy5jbzhtOXA4YThyOWE4bjhkOHMuCisuY29tcGFyYW4yZDFzMgorLmNvOG05cDhlOG45ZDhpOHU4bS4KKy5jb21wZW5kaTF1CisuY284bTlwOG85bjhlOG44dDl3OGk4czhlLgorLmNvbXBvMm4KKy5jb21wbzNuZW4KKy5jb21wb25lbjF0CisuY29tcG9uZW50dzQKKy5jb21wb25lbnR3aXM0CisuY29tcG9uZW50d2kyCisuY29tcG9uZW50M3c0aXNlCisuY284bThwOXQ4cjhvOGw5bDhlOHIuCisuY29tcDR0cgorLmNvbTJwMXQKKy5jb21wdHJvbDFsCisuY29tcHRyb2wybGUKKy5jbzhtOHA5dDhyOG84bDlsOGU4cjhzLgorLmNvbXB0cm9sbGU0cjFzMgorLmNvOG45ZjhvOHI4bTlhOGI4bDhlLgorLmNvMm4KKy5jb24zZgorLmNvbjFmbworLmNvbmZvMnIKKy5jb25mb3IxbQorLmNvbmZvcjFtYQorLmNvbmZvcjJtYWIKKy5jb25mb3JtYWIybDIKKy5jbzhuOWY4bzhyOG05aThzOHQuCisuY29uZm9yMm1pCisuY29uZm9ybTJpcworLmNvOG45ZjhvOHI4bTlpOHM4dDhzLgorLmNvbmZvcm1pczR0MXMyCisuY284bjlmOG84cjhtOWk4dDh5LgorLmNvbmZvcjNtaXQKKy5jb25mb3JtaTF0eQorLmNvOG45ZzhyOGU4czhzLgorLmNvbjNnCisuY29uMWdyCisuY29uZ3IyZTJzcworLmNvOG45ZzhyOGU4czhzOGU4cy4KKy5jb25ncmVzczFlNHMKKy5jbzhuOXQ4cjhpOGI5dTh0OGUuCisuY29uNXQKKy5jb250cjRpYgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThzLgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThkLgorLmNvbnRyaWJ1MnQxZWQKKy5jbzlyOGU5bDhhOXQ4aThvOG4uCisuY29yZTFsYQorLmNvcmVsYTF0MmlvCisuY29yZWxhdGlvMm4KKy5jbzlyOGU5bDhhOXQ4aThvOG44cy4KKy5jb3JlbGF0aW8ybjNzMgorLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dC4KKy5jb3JlMWwyaQorLmNvcmVsMmlnCisuY29yZWw0aWdpCisuY29yZWxpNWcyaW8KKy5jb3JlbGlnaW9uM2kKKy5jb3JlbGlnaW8ybgorLmNvcmVsaWdpb24xaXMKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQ4cy4KKy5jb3JlbGlnaW9uaXM0dDFzMgorLmNvOXI4ZTlvOHA5czhpOHMuCisuY29yZTFvCisuY29yZW8ycDFzMgorLmNvcmVvcDFzaXMKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0LgorLmNvcmUxc3AKKy5jb3JlczRwbzJuCisuY29yZXNwMm9uZAorLmNvcmVzcG9uMWRlCisuY29yZXNwb24xZGVuCisuY29yZXNwb25kZW4xdAorLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQ4cy4KKy5jb3Jlc3BvbmRlbjR0NHMyCisuY285czhlOWM4YThuOHQuCisuY29zNGUKKy5jb3NlMWNhCisuY29zZWNhMm4KKy5jb3NlY2FuMXQKKy5jbzl0OGE4bjlnOGU4bjh0LgorLmNvNHRhMm4KKy5jbzF0YQorLmNvdDJhbmcKKy5jb3RhbjFnZW4KKy5jb3RhbmdlbjF0CisuY284dThyOXM4ZThzLgorLmNvdTIKKy5jb3U0cnMyCisuY291cjJzZQorLmNvdXJzM2U0cworLmNvOXc4bzhyOGs5ZThyLgorLmNvNHdvMgorLmNvd29yazFlcgorLmNvOXc4bzhyOGs5ZThyOHMuCisuY293b3JrZTRyMXMyCisuY3I4YThuOGs5YzhhOHM4ZS4KKy5jcmEybgorLmNyYTRuazIKKy5jcmFuazFjYQorLmNyOGE4bjhrOXM4aDhhOGY4dC4KKy5jcmFuNGsxczIKKy5jcmFua3MyaAorLmNyYW5rc2hhMmYKKy5jcmFua3NoYTJmdAorLmNyOG84YzlvOWQ4aThsOGUuCisuY3Iyb2MKKy5jcm80Y29kCisuY3JvMWNvCisuY3I4bzhjOW85ZDhpOGw4ZThzLgorLmNyb2NvZGlsZXMyCisuY3I4bzhzOHM5aDhhOHQ4YzhoLgorLmNybzJzNHMKKy5jcm9zczJoCisuY3Jvc3NoYTR0YworLmNyb3NzaGF0NGNoCisuY3I4bzhzOHM5aDhhOHQ4YzhoOGU4ZC4KKy5jcm9zc2hhdGNoZTIKKy5jcm9zc2hhdDRjaDRlZAorLmNyOG84czhzOW84djhlOHIuCisuY3JvczFzbworLmNyb3M0c292CisuY3I4eThwOXQ4bzlnOHI4YThtLgorLmNyeTJwMXQKKy5jcnlwMXRvCisuY3J5cHRvMmdyCisuY3I4eThwOXQ4bzlnOHI4YThtOHMuCisuY3J5cHRvZ3JhNG0xczIKKy5jdThmOGY5bDhpOG44ay4KKy5jNHVmCisuY3U0ZjFmCisuY3VmZjRsMgorLmN1ZmZsaW40CisuY3VmZmw0aTRuazIKKy5jdThmOGY5bDhpOG44azhzLgorLmN1ZmZsaW40azFzMgorLmN1OW44ZThpOWY4bzhyOG0uCisuM2N1bgorLmN1Mm5lCisuY3VuZWkyCisuY3VuZWkxZm8KKy5jdW5laWZvMnIKKy5jdW5laWZvcjFtCisuY3U4czl0OG84bTlpOHo5YTliOGw4ZS4KKy4xYzJ1cworLmN1czF0bworLmN1c3RvbTJpegorLmN1c3RvbWl6YTEKKy5jdXN0b21pejVhMmIKKy5jdXN0b21pemFiMmwyCisuY3U4czl0OG84bTlpOHo4ZS4KKy5jdXN0b21pMnplCisuY3U4czl0OG84bTlpOHo4ZThzLgorLmN1OHM5dDhvOG05aTh6OGU4ZC4KKy5kYThjOGg4czloOHU4bjhkLgorLjFkMmEKKy5kYTJjaDQKKy5kYWM0aDFzMgorLmRhY2g0czJoCisuZGE4bTlzOGU4bDlmOGw4eS4KKy5kYTJtMgorLmRhNG0xczIKKy5kYW01c2UybDJmCisuZGFtc2VsZjRsMgorLmRhbXNlbGYybHk1CisuZGE4bTlzOGU4bDlmOGw4aThlOHMuCisuZGFtc2VsZmwyaWU0CisuZGE4Yzh0OHk4bDlvOWc4cjhhOG0uCisuZGEyYzF0CisuZGFjMXR5CisuZGFjMnR5bAorLmRhY3R5M2xvCisuZGFjdHlsbzFncgorLmRhOGM4dDh5OGw5bzlnOHI4YThwOGguCisuZGE4dDhhOWI4YThzOGUuCisuM2RhdAorLmRhMnRhCisuZGEydGFiCisuZGE4dDhhOWI4YThzOGU4cy4KKy5kYXRhYmFzMWU0cworLmRhOHQ4YTlwOGE4dDhoLgorLmRhdDVhcAorLmRhdGFwNWF0CisuZGF0YTFwYQorLmRhdGFwNGF0aAorLmRhOHQ4YTlwOGE4dDhoOHMuCisuZGF0YXBhMnQ0aDFzMgorLmRhOHQ4ZTlzOHQ4YThtOHAuCisuZGF0M2VzdAorLmRhdGVzMXRhCisuZGF0ZXN0YTRtMXAKKy5kYTh0OGU5czh0OGE4bThwOHMuCisuZGF0ZXN0YW0ycDFzMgorLmRlOWM4bDhhOHI5YThiOGw4ZS4KKy5kZTRjbDJhMnIKKy5kZWNsYTJyYWIKKy5kZWNsYXJhYjJsMgorLmRlOWY4aThuOWk5dDhpOHY4ZS4KKy5kZTFmCisuZGUxZmkKKy5kZTJmaW4KKy5kZWYyaW5pCisuZGVmaW4yaXQKKy5kZWZpbmkxdGkKKy5kZWZpbmkxdDJpdgorLmRlOWw4ZThjOXQ4YTliOGw4ZS4KKy5kNWVsZWMKKy5kZWxlMmMxdAorLmRlbGVjMnRhNGIKKy5kZWxlYzF0YQorLmRlbGVjdGFiMmwyCisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuZGU0bTJpcworLmRlbTRpc2UKKy5kZW1pc2VtaTNxdWEKKy5kZW1pc2VtaXF1MgorLmRlbWlzZW1pcXVhNXY0CisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5kZW1pc2VtaXF1YXZlNHIxczIKKy5kZTltOG84YzlyOGE5dDhpOHM4bS4KKy5kZTRtb2NyCisuZGVtb2NyYXRpMnM0bQorLmRlOG04bzhzLgorLmRlbW9zMgorLmRlOXI4aTh2OWE5dDhpOHY4ZS4KKy5kZXIyaTR2CisuZGU0cmkxdmEKKy5kZXJpM3ZhdAorLmRlcjJpdmExdDJpdgorLmRlOXI4aTh2OWE5dDhpOHY4ZThzLgorLmRlcml2YXRpdjRlMnMKKy5kaThhOWw4ZThjOXQ4aThjLgorLjFkNGkzYQorLmRpMmFsCisuZGkyYWxlCisuZGlhbGUyYzF0CisuZGk4YTlsOGU4Yzl0OGk4YzhzLgorLmRpYWxlY3RpNGMzczIKKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuLgorLmRpYWxlY3QyaTFjaQorLmQyaTFhbGVjdGkzYzJpMWEKKy5kaWFsZWN0aWNpMmEybgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG44cy4KKy5kaWFsZWN0aWNpYTJuMXMyCisuZGk5YzhoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5kNGkyY2gKKy5kaWM0aDFsNAorLmRpY2gybG8KKy5kaWNobG9ybzJtZQorLmRpY2hsb3JvNG1ldAorLmRpY2hsb3JvbWV0aGEybjQKKy5kaThmOWY4cjhhOGM4dC4KKy5kMWlmCisuZGlmNGZyCisuZGk0ZjFmCisuZGlmZnJhMmMxdAorLmRpOGY5ZjhyOGE4Yzh0OHMuCisuZGlmZnJhYzR0MXMyCisuZGk4ZjlmOHI4YThjOXQ4aThvOG4uCisuZGlmZnJhYzF0MmlvCisuZGlmZnJhY3RpbzJuCisuZGk4ZjlmOHI4YThjOXQ4aThvOG44cy4KKy5kaWZmcmFjdGlvMm4zczIKKy5kaThyOGU4ci4KKy5kNGlyMgorLmRpMXJlCisuZGlyMWVyNAorLmRpOHI4ZTluOGU4czhzLgorLmRpcmUxbmVzCisuZGlyZW4yZTJzcworLmRpOHM5cDhhOHI5YThuOGQuCisuZGlzMQorLmRpczFwCisuZGkyczFwYQorLmRpc3AyYTJyCisuZGlzcGFyYTJuCisuZGlzcGFyNGFuZAorLmRpOHM5cDhhOHI5YThuOGQ4cy4KKy5kaXNwYXJhbjJkMXMyCisuZGk4czl0OHI4YTh1OGc4aDh0OWw4eS4KKy5kNGlzM3QKKy5kaXN0NHIKKy5kaXMxdHJhCisuZGlzdHJhdWdoMworLmRpc3RyYXVnaDJ0bAorLmRpc3RyYXVnaHQxbHkKKy5kaThzOXQ4cjhpOGI5dTh0OGUuCisuZGlzdHI0aWIKKy5kaThzOXQ4cjhpOGI5dTh0OGU4cy4KKy5kaThzOXQ4cjhpOGI5dTh0OGU4ZC4KKy5kaXN0cmlidTJ0MWVkCisuZG84dTliOGw4ZTlzOHA4YThjOGUuCisuZG91MgorLmRvdTNiMmwyCisuZG91NWJsZTFzcAorLmRvdWJsZXMyCisuZG91YmxlMnMxcGEKKy5kb3VibGVzcGE0Y2UKKy5kbzh1OWI4bDhlOXM4cDhhOGM5aThuOGcuCisuZG91Ymxlc3A0YTJjaQorLmRvdWJsZXNwYTJjMWluCisuZG91Ymxlc3BhYzFpbmcKKy5kbzhsOGw5aThzOGguCisuZG9sMWwKKy5kb2xsMmkKKy5kb2xsaXMyaAorLmRyOGk4Zjh0OWE4ZzhlLgorLjFkcgorLmRyNGkyZnQKKy5kcmlmMXRhCisuZHI4aTh2OWU4cjhzLgorLmRyMml2CisuZHJpdmU0cjFzMgorLmRyOG84bTllOWQ4YThyOHkuCisuZHJvMm1lCisuZHJvMm1lZAorLmRyb20yZTJkMmEKKy5kcm9tZTRkYXJ5CisuZHJvbWVkMmEycgorLmRyOG84bTllOWQ4YThyOGk4ZThzLgorLmRyb21lZGFyMWkKKy5kcm9tZWRhcjJpZTQKKy5kdTlvOHA5bzlsOGk4czh0LgorLmR1b3BvbDJpCisuZHU5bzhwOW85bDhpOHM4dDhzLgorLmR1b3BvbGlzNHQxczIKKy5kdTlvOHA5bzhsOHkuCisuZHVvcG8ybHkKKy5keThzOWw4ZTh4OGk4YS4KKy5kMnkKKy5keXMxbDIKKy5keXMybGUKKy5keXNsZXgzaQorLmR5c2xleDJpNWEKKy5keThzOWw4ZThjOXQ4aThjLgorLmR5c2xlMmMxdAorLmVhOHM4dDllOG44ZDllOHI4cy4KKy5lYXN0MworLmVhczN0ZW4KKy5lYXMzdGVuZAorLmVhc3RlbjFkZQorLmVhc3RlbmRlNHI1czIKKy5lYzhvOW44bzhtOWk4YzhzLgorLmUxY28KKy5lY28ybgorLmVjbzNub21pYworLmVjb25vbWk0YzNzMgorLmVjOG84bjlvOW04aThzOHQuCisuZWNvbm9tMmlzCisuZWM4bzhuOW85bThpOHM4dDhzLgorLmVjb25vbWlzNHQxczIKKy5laTlnOGU4bjljOGw4YThzOHMuCisuZWkyCisuZTJpZzIKKy5laTFnZW4KKy5laWdlbjFjNGw0CisuZWlnZW5jbGEyc3MKKy5laTlnOGU4bjljOGw4YThzOHM4ZThzLgorLmVpZ2VuY2xhc3MxZTRzCisuZWk5ZzhlOG45djhhOGw5dThlLgorLmVpZ2VuMXYyCisuZWlnZW4xdmEKKy5laWdlbnZhbDF1CisuZWk5ZzhlOG45djhhOGw5dThlOHMuCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOWk5YzhhOGwuCisuNWVsZWMKKy5lbGUyYzF0CisuZWxlY3RybzJtZQorLmVsZWN0cm9tZTJjaAorLmVsZWN0cm9tZTVjaGE0bjFpYworLmVsZWN0cm9tZWNoYTJuCisuZWxlY3Ryb21lY2hhbmkxY2EKKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG44bzlhOGM4bzh1OHM4dDhpOGMuCisuZWxlY3Ryb21lY2hhbm80CisuZWxlY3Ryb21lY2hhbjRvYQorLmVsZWN0cm9tZWNoYW5vYTFjbworLmVsZWN0cm9tZWNoYW5vYWNvdTIKKy5lbGVjdHJvbWVjaGFub2FjbzJ1cworLmVsZWN0cm9tZWNoYW5vYWNvdXN0MmkKKy5lbGVjdHJvbWVjaGFub2Fjb3VzMXRpYworLmVsOGk4dDlpOHM4dC4KKy5lbDJpCisuZWwxaXQKKy5lbGkxdGkKKy5lbDRpdGlzCisuZWw4aTh0OWk4czh0OHMuCisuZWxpdGlzNHQxczIKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyLgorLmVuMXQKKy5lbnRyZXByMgorLmVudHJlcHJlbjRldQorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHI5aThhOGwuCisuZW50cmVwcmVuZXVyMmkzYQorLmVudHJlcHJlbmV1cmkyYWwKKy5lcDlpOW44ZThwOGg5cjhpOG44ZS4KKy5lcGkybgorLmVwMmluZQorLmVwaW5lcDRocjQKKy5lcDJpbmVwaHIyaW40ZQorLmVxOHU4aTl2OGE4cjhpOWE4bjh0LgorLmVxdTJpdjMKKy5lcXVpMXZhCisuZXF1aXYyYTJyCisuZXF1aXZhcjFpCisuZXF1aXZhcjNpMmEybgorLmVxdWl2YXIyaTNhCisuZXF1aXZhcjRpYW40dAorLmVxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisuZXF1aXZhcjRpYW5jCisuZXQ4aDlhOG44ZS4KKy5ldGhhMm40CisuZXQ4aDl5OGw5ZThuOGUuCisuZXY4ZThyOXM4aTliOGw4ZS4KKy5ldjFlcgorLmV2ZTRyMXMyCisuZXZlcjFzaQorLmV2ZXI0c2k0YgorLmV2ZXJzaTFiMmwyCisuZXY4ZThyOHQuCisuZXY4ZThyOHQ4cy4KKy5ldmVyNHQxczIKKy5ldjhlOHI4dDllOGQuCisuZXZlcjJ0MWVkCisuZXY4ZThyOHQ5aThuOGcuCisuZXZlcjF0aQorLmV2ZXIydDFpbgorLmV4OXE4dThpOHM5aTh0OGUuCisuZXhxdTIKKy5leHEydWkyCisuZXhxdWlzMml0ZQorLmV4OXQ4cjhhOW84cjlkOGk5bjhhOHI4eS4KKy5leDF0MgorLmV4MXRyYQorLmV4dHI0YW8KKy5leHRyYW9yZDJpCisuZXh0cmFvcmQxaW40CisuZXh0cmFvcjFkaTFuYQorLmV4dHJhb3JkaW4yYTJyCisuZmE4bDhsOWk4bjhnLgorLjFmYQorLmZhbDFsCisuZmFsbDJpCisuZmFsMmxpbjQKKy5mZThyOG04aTlvOG44cy4KKy5mZXIxCisuZmVyM200CisuZmVyNG0yaW8KKy5mZXJtaW8ybgorLmZlcm1pbzJuM3MyCisuZmk5bjhpOHQ4ZTlsOHkuCisuMWZpCisuMmZpbgorLmYyaW5pCisuZmluMml0CisuZmluMml0ZQorLmZpbml0ZTFseQorLmZsOGE5ZzhlOGw5bDh1OG0uCisuZjRsMgorLmZsYWc1ZWwxbAorLmZsOGE5ZzhlOGw5bDhhLgorLmZsYWc0ZWxsYQorLmZsOGE4bTltOGE5YjhsOGU4cy4KKy5mbGFtMW0KKy5mbGFtMW1hCisuZmxhbTJtYWIKKy5mbGFtbWFiMmwyCisuZmxhbW1hYmxlczIKKy5mbDhlOGQ4ZzlsOGk4bjhnLgorLmZsZWRnbDIKKy5mbDhvOHc5YzhoOGE4cjh0LgorLmZsb3cyY2gKKy5mbG93Y2gyYTJyCisuZmw4bzh3OWM4aDhhOHI4dDhzLgorLmZsb3djaGFyNHQxczIKKy5mbDh1OG84cjhvOWM4YThyOWI4bzhuLgorLmZsdTNvCisuZmx1bzNyCisuZmx1b3Iyb2MKKy5mbHVvcm8xY2EKKy5mbHVvcm9jMmEycgorLmZsdW9yb2NhcjFiCisuZmx1b3JvY2FyYjRvCisuZmx1b3JvY2FyYm8ybgorLmZvOHI5bThpOWQ4YTliOGw4ZS4KKy5mb3IybWkKKy5mb3JtaTFkNGEKKy5mb3JtMmlkCisuZm9ybWkyZDNhNGIKKy5mb3JtaWRhYjJsMgorLmZvOHI5bThpOWQ4YTliOGw4eS4KKy5mb3JtaWRhYjFseQorLmZvOHI5czh5OHQ4aDlpOGEuCisuZm80cnMyCisuZm9yczR5CisuZm9yc3l0aDJpMWEKKy5mbzhyOHQ4aDlyOGk4ZzhoOHQuCisuZm9ydDRocjQKKy5mb3J0aHIyaWcKKy5mcjhlOGU5bDhvOGE4ZDhlOHIuCisuZnJlZWw0b2EKKy5mcmVlbG9hMmQzCisuZnI4ZThlOWw4bzhhOGQ4ZThyOHMuCisuZnJlZWxvYWRlNHI1czIKKy5mcjhpOGU4bjhkOWw4aThlOHIuCisuZnJpMgorLmZyMmllNAorLmZyaWVuZGwyaWU0CisuZnI4aTl2OG84bDlpOHQ4eS4KKy5mcjJpdgorLmZyaXZvbDJpCisuZnJpdm9sMWl0CisuZnJpdm9saTF0eQorLmZyOGk5djhvOGw5aTl0OGk4ZThzLgorLmZyaXZvbGkxdGkKKy5mcml2b2xpdDJpZTQKKy5mcjhpOHY5bzlsOG84dThzLgorLmZyaXZvbG91MgorLmZyaXZvbG8ydXMKKy5nYTlsOGE4Yzl0OGk4Yy4KKy5nYWxhMmMxdAorLmdhOGw5YTh4OHkuCisuZ2E4bDlhOHg5aThlOHMuCisuZ2FsYXgzaQorLmdhbGF4MmllNAorLmdhOHM5bzhtOWU5dDhlOHIuCisuZ2Exc28KKy5nYTNzb20KKy5nYXNvMm1lCisuZ2FzbzRtZXQKKy5nYXNvbWUxdGUKKy5nZTlvOWQ4ZThzOWk4Yy4KKy5nZW9kZXMyCisuZ2VvZGUxc2kKKy5nZW9kZTJzaWMKKy5nZTlvOWQ4ZTh0OWk4Yy4KKy5nZW9kZTF0CisuZ2VvZGV0MWljCisuZ2U4bzltOGU4dDlyOGk4Yy4KKy5nZTNvbQorLmdlbzJtZQorLmdlbzRtZXQKKy5nZW9tNGV0cgorLmdlbzVtZXQzcmljCisuZ2U4bzltOGU4dDlyOGk4YzhzLgorLmdlb21lNHRyaTRjM3MyCisuZ2U5bzlzOHQ4cjhvOHA4aDhpOGMuCisuZ2VvczQKKy5nZW9zdDRyCisuZ2Vvc3RyMm9waAorLmdlb3N0cm9waDFpYworLmdlOG85dDhoOGU4cjltOGE4bC4KKy5nZTRvdAorLmdlNG90aAorLmdlb3RoMmUKKy5nZW90aGVyM200CisuZ2VvdGhlcjFtYQorLmdlOW84dDlyOG85cDhpOHM4bS4KKy5nZW90cm9waTJzMW0KKy5nbjhvOW04bzhuLgorLmcxbm8KKy5nbm80bW8KKy5nbm80bW8ybgorLmduOG85bThvOG44cy4KKy5nbm9tbzJuM3MyCisuZ3I4YThuOGQ5dThuOGM4bDhlLgorLjFncgorLmdyYTJuMgorLmdyNGFuZAorLmdyYW4xZHUKKy5ncmFuZHU0bgorLmdyYW5kdW4xYzRsNAorLmdyOGE4bjhkOXU4bjhjOGw4ZThzLgorLmdyYW5kdW5jbGVzMgorLmdyOGk4ZTh2OWE4bjhjOGUuCisuZ3IyaWU0CisuZ3JpZTF2YQorLmdyaWV2YTJuCisuZ3I4aThlOHY5YThuOGM4ZThzLgorLmdyOGk4ZTh2OW84dThzLgorLmdyaWV2b3UyCisuZ3JpZXZvMnVzCisuZ3I4aThlOHY5bzh1OHM5bDh5LgorLmdyaWV2b3VzMWwyCisuZ3JpZXZvdXMxbHkKKy5oYThpOHI5czh0OHk4bDhlLgorLmhhaTIKKy5oYTRpcgorLmhhaTRyczIKKy5oYWlyczJ0eQorLmhhaXJzMnR5bAorLmhhOGk4cjlzOHQ4eThsOGU4cy4KKy5oYWlyc3R5bGVzMgorLmhhOGk4cjlzOHQ4eThsOWk4czh0LgorLmhhOGk4cjlzOHQ4eThsOWk4czh0OHMuCisuaGFpcnN0eWxpczR0MXMyCisuaGE4bDhmOXM4cDhhOGM4ZS4KKy5oYTJsZgorLmhhbDJmM3MKKy5oYWxmMnMxcGEKKy5oYWxmc3BhNGNlCisuaGE4bDhmOXM4cDhhOGM4ZThzLgorLmhhOGw4Zjl3OGE4eS4KKy5oYThyOWI4aThuOWc4ZThyLgorLmgyYTJyCisuaGFyMWIKKy5oYXJiaTIKKy5oYXIyYmluCisuaGFyYjRpbmdlCisuaGE4cjliOGk4bjlnOGU4cjhzLgorLmhhcmJpbmdlNHIxczIKKy5oYThyOWw4ZTlxOHU4aThuLgorLmhhcjRsZTQKKy5oYXIxbAorLmhhcmxlMXEKKy5oYXJsZXF1MgorLmhhcmxlcTJ1aTIKKy5oYXJsZXF1aTRuCisuaGE4cjlsOGU5cTh1OGk4bjhzLgorLmhhcmxlcXUyaTJuMXMyCisuaGE4dDhjOGg5ZThyOGk4ZThzLgorLmhhNHRjCisuaGF0NGNoCisuaGF0Y2hlMgorLmhhdGNoZXIxaQorLmhhdGNoZXIyaWU0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5oZW0yaWQKKy5oZW1pZDRlbQorLmhlbWlkZTRtMmlzCisuaGVtaWRlbTRpc2UKKy5oZW1pZGVtaXNlbWkzcXVhCisuaGVtaWRlbWlzZW1pcXUyCisuaGVtaWRlbWlzZW1pcXVhNXY0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmhlbWlkZW1pc2VtaXF1YXZlNHIxczIKKy5oZTltOG85ZzhsOG85YjhpOG4uCisuaGVtbzRnCisuaGUxbW8KKy5oZW1vNGdsMgorLmhlbW8zZ2xvCisuaGVtb2dsbzFiaQorLmhlbW9nbG8yYmluCisuaGU5bThvOXA4aDhpOGw5aThhLgorLmhlbTJvcGgKKy5oZW1vcGg0aWwyCisuaGVtb3BoaWwxaQorLmhlbW9waGlsM2kxYQorLmhlOW04bzlwOGg4aThsOWk4YThjLgorLmhlOW04bzlwOGg4aThsOWk4YThjOHMuCisuaGVtb3BoaWxpYTRjM3MyCisuaGU4bThvOXI4aDhlOW84bDlvOGc4eS4KKy5oZW1vMnIKKy5oZW1vcmg0CisuaGVtb3JoZTNvbAorLmhlbW9yaGVvbDFvMWd5CisuaGU5cDhhOHQ5aThjLgorLmhlcDUKKy5oZTJwYQorLmhlcGF0MWljCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDhlLgorLmhlcjNtNAorLmhlcjFtYQorLmhlcjRtYXAKKy5oZXJtYXA0aHI0CisuaGVybWFwaHJvZDJpdGUKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OWk4Yy4KKy5oZXJtYXBocm9kMmkxdGkKKy5oZXJtYXBocm9kNGkydGljCisuaGU5cjhvOGU4cy4KKy5oZXJvNGUKKy5oZTh4OGE5ZDhlOGM5aTltOGE4bC4KKy5oZXgxYQorLmhleGEyZAorLmhleGFkZTFjMmkKKy5oZXhhZGUyYzNpbQorLmhleGFkZWNpMW1hCisuaG85bDhvOW44bzltOHkuCisuaG9sbzJuCisuaG9sb24zbzNteQorLmhvOW04ZThvOW04bzhyOXA4aDhpOGMuCisuaG8ybWUzCisuaG9tZW8xbW8KKy5ob21lb21vMnIKKy5ob21lb21vcjFwCisuaG9tZW9tb3JwNGg0CisuaG9tZW9tb3JwaDFpYworLmhvOW04ZThvOW04bzhyOXA4aDhpOHM4bS4KKy5ob21lb21vcnBoaTJzMW0KKy5obzltOG85dDhoOGU4dDhpOGMuCisuaG8xbW8KKy5ob200b3RoMworLmhvbW90aDJlCisuaG9tbzN0aGU0dAorLmhvbW90aGV0MWljCisuaG84cjhzOGU5cjhhOGQ5aThzOGguCisuaG9yNHNlCisuaG80cnMyCisuaG9yc2VyMWEKKy5ob3JzZXJhMmQKKy5ob3JzZXIyYWRpCisuaG9yc2VyYWRpczEKKy5ob3JzZXJhZGlzMmgKKy5obzh0OWI4ZThkLgorLmhvMnQxYgorLmhvdDRiZTJkCisuaG84dDliOGU4ZDhzLgorLmhvdGJlMmQxczIKKy5oeTlkOHI4bzl0OGg4ZThyOW04YThsLgorLmh5MWQKKy5oeTFkcgorLmh5ZHJvNHRoMmUKKy5oeWRyNG90aAorLmh5ZHJvdGhlcjNtNAorLmh5ZHJvdGhlcjFtYQorLmh5OXA4bzl0OGg4YThsOWE5bTh1OHMuCisuaHkzcG8KKy5oeXA0b3QKKy5oeXA0b3RoCisuaHlwb3RoYTNsYQorLmh5cG90aGFsYTNtCisuaHlwb3RoYWxhMW11CisuaHlwb3RoYWxhbTJ1cworLmlkOGU4YThsOHMuCisuaWRlM2E0bAorLmlkZWEybDFzMgorLmlkOGU4bzlnOHI4YThwOGg4cy4KKy5pZGVvMmcKKy5pZGVvMWdyCisuaWRlb2dyYTRwNGgxczIKKy5pZDhpOG85czh5OG45YzhyOGE4czh5LgorLmkyZGkKKy5pMWQzaW8KKy5pZGk0b3MKKy5pZGlvczR5CisuaWRpb3N5bjFjcgorLmlkaW9zeW5jcjJhcworLmlkaW9zeW5jcmFzNHkKKy5pZDhpOG85czh5OG45YzhyOGE5czhpOGU4cy4KKy5pZGlvc3luY3JhczJpZTQKKy5pZDhpOG85czh5OG45YzhyOGE4dDhpOGMuCisuaWRpb3N5bjVjcmF0MWljCisuaWQ4aThvOXM4eThuOWM4cjhhOHQ5aTljOGE4bDlsOHkuCisuaWRpb3N5bmNyYXRpMWNhCisuaWRpb3N5bmNyYXRpY2FsMWwKKy5pZGlvc3luY3JhdGljYWwxbHkKKy5pZzluOGk4dDllOHIuCisuMmlnCisuaWcxbmkKKy5pZ24yaXQKKy5pZ24yaXRlCisuaWc5bjhpOHQ5ZThyOHMuCisuaWduaXRlNHIxczIKKy5pZzluOGk5dDhvOHIuCisuaWduM2l0b3IKKy5pZ25pMXRvCisuaWc4bjhvOHI4ZTlzOHA4YThjOGU4cy4KKy5pZzFubworLmlnbm9yZTFzcAorLmlnbm9yZTJzMXBhCisuaWdub3Jlc3BhNGNlCisuaW05cDhlOGQ5YThuOGM4ZS4KKy5pbTJwMmVkCisuaW1wMmUyZDJhCisuaW1wZWRhMm4KKy5pbTlwOGU4ZDlhOG44YzhlOHMuCisuaW45ZDh1OWI4aTl0OGE5YjhsOGUuCisuNGluZAorLmluMWR1CisuaW5kdTFiNGkKKy5pbmR1YmkydAorLmluZHViaTF0YQorLmluZHViaTJ0YWIKKy5pbmR1Yml0YWIybDIKKy5pbjlmOGk4bjlpOHQ4ZTlsOHkuCisuaW4zZgorLmluMWZpCisuaW4yZmluCisuaW5mMmluaQorLmluZmluMml0CisuaW5maW4yaXRlCisuaW5maW5pdGUxbHkKKy5pbjlmOGk4bjlpOXQ4ZThzOWk5bThhOGwuCisuaW5maW5pdDRlcworLmluZmluaXRlMXNpCisuaW5maW5pdGUyczVpbQorLmluZmluaXRlc2kxbWEKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZS4KKy5pbmZyMmFzCisuaW5mcmFzMXQ0cgorLmluZnJhc3RydTJjMXQKKy5pbmZyYXN0cnVjdHU0cgorLmluZnJhc3RydWMxdHUKKy5pbmZyYXN0cnVjM3R1cmUKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZThzLgorLmluOXM4dDhhOGw4bDllOHIuCisuaW5zMnRhMmwKKy5pbnMxdGEKKy5pbnN0YWwxbAorLmluc3RhbDJsZQorLmluOXM4dDhhOGw4bDllOHI4cy4KKy5pbnN0YWxsZTRyMXMyCisuaW45dDhlOHI5ZDhpOHM5YzhpOXA4bDhpOW44YThyOHkuCisuaW4xdAorLmluNXRlcjNkCisuaW50ZXJkMmkKKy5pbnRlcmRpczEKKy5pbnRlcmQyaXMxYworLmludGVyZGlzMWNpCisuaW50ZXJkaXNjMmlwCisuaW50ZXJkaXNjaTFwMmwyCisuaW50ZXJkaXNjaXBsaTRuCisuaW50ZXJkaXNjaXBsNGkxbmEKKy5pbnRlcmRpc2NpcGxpbjJhMnIKKy5pbjl0OGU4cjlnOGE5bDhhOGM5dDhpOGMuCisuaW50ZXJnMgorLmludGVyMWdhCisuaW50ZXJnYWxhMmMxdAorLmluOXU4dDhpOGw4ZS4KKy5pbjF1CisuaW40dTF0MmkKKy5pbjl1OHQ4aThsOWk5dDh5LgorLmludXRpbDFpCisuaW51dDJpbDFpdAorLmludXRpbGkxdHkKKy5pcjlyOGU5ZDh1OGM5aThiOGw4ZS4KKy5pcjJyMmVkCisuaXJyZTFkdQorLmlycmVkdTJjCisuaXJyZWR1Y2k0YgorLmlycmVkdTFjaQorLmlycmVkdWNpMWIybDIKKy5pcjlyOGU5ZDh1OGM5aThiOGw4eS4KKy5pcnJlZHVjaWIxbHkKKy5pcjlyOGU4djlvOWM4YTliOGw4ZS4KKy5pcnJldjIKKy5pcnJlNXZvYworLmlycmV2bzFjYQorLmlycmV2b2NhMWIybDIKKy5pczhvOHQ5cjhvOHA4eS4KKy5pMnNvCisuaXNvdHJvcHk1CisuaXM4bzl0OHI4bzhwOWk4Yy4KKy5pc290cm9wM2ljCisuaXQ4aThuOWU4cjlhOHI4eS4KKy5pMXRpCisuaTJ0MWluCisuaXQyaW5lCisuaXRpbjRlcjRhMnIKKy5pdGluMWVyCisuaXRpbmVyMWEKKy5pdDhpOG45ZThyOWE4cjlpOGU4cy4KKy5pdGluZXJhcjFpCisuaXRpbmVyYXIyaWU0CisuamU5cjhlOW04aTlhOGQ4cy4KKy4xamUKKy5qZXJlbTJpM2EKKy5qZXJlbWlhMmQKKy5qZXJlbWlhMmQxczIKKy5rZTh5OW44bzh0OGUuCisua2U4eTluOG84dDhlOHMuCisua2V5bm80dGVzCisua2U4eTlzOHQ4cjhvOGs4ZS4KKy5rZXlzNAorLmtleXMxdAorLmtleXN0NHIKKy5rZXlzdHIyb2syCisua2U4eTlzOHQ4cjhvOGs4ZThzLgorLmtleXN0cm9rZXM0Cisua2k4bDhuOWk4bjhnLgorLmsxaQorLms0aTJsMW4yCisua2lsbjFpbgorLmtpbG5pbjRnCisubGE4YzlpOWU4czh0LgorLmw0YTJjaTQKKy5sYTNjMmllNAorLmxhY2kxZXN0CisubGE4bTllOG45dDhhOWI4bDhlLgorLmxhMW1lbgorLmxhM21lbjF0CisubGFtZW4ydGE0YgorLmxhbWVuMXRhCisubGFtZW50YWIybDIKKy5sYThuOGQ5czhjOGE4cDllOHIuCisuM2w0YW5kCisubGEybgorLmxhbjJkMXMyCisubGFuZHNjYTRwCisubGFuZHMxY2EKKy5sYW5kc2NhNXBlcgorLmxhOG44ZDlzOGM4YThwOWU4cjhzLgorLmxhbmRzY2FwZTRyMXMyCisubGE4cjljOGU5bjh5LgorLmwyYTJyCisubGFyMWMKKy5sYXIyY2UKKy5sYXIxY2VuNAorLmxhOHI5YzhlOW45aThzOHQuCisubGFyNGNlbmkKKy5sZThhOGY5aDhvOHA5cDhlOHIuCisubGUyYQorLmxlYTJmCisubGVhNGZoCisubGVhZmhvNHAxcAorLmxlYWZob3AycGUKKy5sZWFmaG9wM3BlcgorLmxlOGE4ZjloOG84cDlwOGU4cjhzLgorLmxlYWZob3BwZTRyMXMyCisubGU4dDl0OGU4cjlzOHA4YThjOWk4bjhnLgorLmxlNHQzdDIKKy5sZXR0ZTRyMXMyCisubGV0dGVyMXNwCisubGV0dGVyMnMxcGEKKy5sZXR0ZXJzcDRhMmNpCisubGV0dGVyc3BhMmMxaW4KKy5sZXR0ZXJzcGFjMWluZworLmxpOGY4ZTlzOHA4YThuLgorLmxpZmUxc3AKKy5saWZlMnMxcGEKKy5saWZlc3BhNG4KKy5saThmOGU5czhwOGE4bjhzLgorLmxpZmVzcGEybjFzMgorLmxpOGY4ZTlzOHQ4eThsOGUuCisubGlmZXMydHkKKy5saWZlczJ0eWwKKy5saThmOGU5czh0OHk4bDhlOHMuCisubGlmZXN0eWxlczIKKy5saThnOGg4dDl3OGU4aThnOGg4dC4KKy4zbGlnaAorLmxpZ2h0dzQKKy5saWdodHdlaTIKKy5sMmlnaHR3ZTJpZzIKKy5saThtOW84dTlzOGk4bjhlOHMuCisubGk0bW8KKy5saTNtbzJ1cworLmxpbW91MgorLmxpbW91MnMxaW4KKy5saW1vdXMyaW5lCisubGltb3VzaTFuZXMKKy5saThuOGU5YjhhOGM4azhlOHIuCisuMWw0aW5lCisubGluMmUyYgorLmxpbmViYWNrMQorLmxpbmViYWNrMWVyCisubGk4bjhlOXM4cDhhOGM4aThuOGcuCisubGkxbmVzCisubGk0bmUxc3AKKy5saW5lMnMxcGEKKy5saW5lc3A0YTJjaQorLmxpbmVzcGEyYzFpbgorLmxpbmVzcGFjMWluZworLmxpOW84bjllOHM4cy4KKy5saW8ybgorLmxpbzFuZXMKKy5saW9uMmUyc3MKKy5saTh0OGg5bzlnOHI4YThwOGg4ZThkLgorLmwyaXRoCisubGl0aG80ZworLmxpdGhvMWdyCisubGl0aG9ncmFwaDRlZAorLmxpOHQ4aDlvOWc4cjhhOHA4aDhzLgorLmxpdGhvZ3JhNHA0aDFzMgorLmxvOWI4bzh0OW84bTh5LgorLmxvYm80dG8KKy5sb2JvdG8zbXkKKy5sbzliOG84dDlvOG05aTh6OGUuCisubG9ib3RvbTJpegorLmxvYm90b21pMnplCisubG84ZzhlOHMuCisubG8xZ2UKKy5sbzhuOGc5ZThzOHQuCisuNWxvbmcKKy5sbzJuCisubG85cTh1OGE4YzlpOHQ4eS4KKy5sbzFxCisubG9xdTIKKy5sb3F1YWM0CisubG9xdTRhMmNpCisubG9xdWEyYzFpdAorLmxvcXVhY2kxdHkKKy5sbzh2OGU5czh0OHI4dThjOGsuCisuNGxvdgorLmxvdjRlMnMKKy5sb3YyZXN0NHIKKy5sb3Zlc3RydWM1CisubG92ZXN0cnVjazEKKy5tYThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tYWNybzRlCisubWFjcm9lMWNvCisubWFjcm9lY28ybgorLm1hY3JvZWNvM25vbWljCisubWFjcm9lY29ub21pNGMzczIKKy5tYThsOWE5cDhyOG84cDlpOHM4bS4KKy5tYWxhcHIyCisubWFsYXByb3BpMnMxbQorLm1hOGw5YTlwOHI4bzhwOWk4czhtOHMuCisubWFsYXByb3A0aXM0bTFzMgorLm1hOG45czhsOGE4dThnOGg5dDhlOHIuCisubWEybjFzMgorLm1hbjJzMWwyCisubWFuc2xhdWdoMworLm1hOG45dTlzOGM4cjhpOHA4dC4KKy5tYW4ydXMKKy5tYW51c2MyCisubWFudXNjcmkyCisubWFudXNjcjJpcAorLm1hbnVzY3JpMnAxdAorLm1hOHI5ZzhpOG45YThsLgorLm1hcmcyCisubWFyZ2k0bgorLm1hcmdpMW5hCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuLgorLm00YXRoMworLm1hdGg1ZW0KKy5tYXRoMmUKKy4xbWF0aGUxbWEKKy5tYXRoZW1hdDFpYworLm1hdGhlbWF0MmkxY2kKKy5tYXRoZW1hdGkzYzJpMWEKKy5tYXRoZW1hdGljaTJhMm4KKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG44cy4KKy5tYXRoZW1hdGljaWEybjFzMgorLm1hOHQ4dDhlOHMuCisubWF0NXRlCisubWE0dDN0MgorLm1hdDR0ZXMKKy5tZThkOWk4YzlhOGk4ZC4KKy4ybWVkCisubTRlZGkKKy5tZWQzaTFjYQorLm1lZGljYWkyCisubWVkaWNhMmlkCisubWU4ZDhpOW84YzhyOGUuCisubWUxZDJpbworLm1lZGlvY3JlMworLm1lOGQ4aTlvOGM5cjhpOXQ4aThlOHMuCisubWVkaTVvY3JpdAorLm1lZGlvY3JpMgorLm1lZGlvNWNyaTF0aQorLm1lZGlvY3JpdDJpZTQKKy5tZThnOGE5bDhpOHQ4aC4KKy5tZTJnCisubTRlZ2FsCisubWUxZ2EKKy5tZTNnYWwxaQorLm1lZ2FsMWl0CisubWVnYWwyaXRoCisubWU4ZzhhOWw4aTh0OGg4cy4KKy5tZWdhbGkydDRoMXMyCisubWU4dDhhOWI4bzhsOWk4Yy4KKy5tZTR0YQorLm1lMnRhNGIKKy5tZXRhYm9sM2ljCisubWV0YWJvbDJpCisubWU5dDhhOGI5bzlsOGk4czhtLgorLm1ldGFib2xpMnMxbQorLm1lOXQ4YThiOW85bDhpOHM4bThzLgorLm1ldGFib2w0aXM0bTFzMgorLm1lOXQ4YThiOW85bDhpOHQ4ZS4KKy5tZXRhYm81bDJpdGUKKy5tZXRhYm9sMWl0CisubWU5dDhhOGI5bzlsOGk4dDhlOHMuCisubWV0YWJvbGl0NGVzCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZS4KKy5tZXQzYTJsCisubWV0YTVsYQorLm1ldGFsYTJuCisubWV0YWwyYW5nCisubWV0YWxhbjFndQorLm1ldGFsYW5ndTRhCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZThzLgorLm1lOHQ4YTlwOGg4bzhyOWk4Yy4KKy5tZXRhcGhvNHIKKy5tZTh0OGg5YThuOGUuCisubWV0aGEybjQKKy5tZTl0OHI4bzhwOW85bDhpOHMuCisubTRldHIKKy5tZXRyb3BvbDJpCisubWU5dDhyOG84cDlvOWw4aThzOGU4cy4KKy5tZXRyb3BvbDRpc2UKKy5tZXRyb3BvbGlzMWU0cworLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG4uCisubWV0cm9wb2wxaXQKKy5tZXRyb3BvbGkzdGEybgorLm1ldHJvcG9saTF0YQorLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG44cy4KKy5tZXRyb3BvbGl0YTJuMXMyCisubWk4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubTRpMWNyCisubWljcm80ZQorLm1pY3JvZTFjbworLm1pY3JvZWNvMm4KKy5taWNyb2VjbzNub21pYworLm1pY3JvZWNvbm9taTRjM3MyCisubWk5YzhyOG85ZjhpOGM4aDhlLgorLm1pY3JvMmZpCisubWljcm9mNGkyY2gKKy5taWNyb2ZpY2hlMgorLm1pOWM4cjhvOWY4aThjOGg4ZThzLgorLm1pY3JvZmljaDFlcworLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bS4KKy5taWNyb28yCisubWljcm9vcmcyCisubWljcm9vcjFnYQorLm1pY3Jvb3JnYW41aXMKKy5taWNyb29yZ2EybgorLm1pY3Jvb3JnYW5pMnMxbQorLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bThzLgorLm1pY3Jvb3JnYW40aXM0bTFzMgorLm1pOGw4bDlhOGc4ZS4KKy5tNGlsMWwKKy5taThsOWw4aTlsOGk4dDhlOHIuCisubWlsbDJpCisubWlsNGw0aTRsCisubWlsbGlsMWkKKy5taWxsMmlsMWl0CisubWlsbGlsMml0ZQorLm1pOG04ZThvOWc4cjhhOHA4aDhlOGQuCisubWltZW8yZworLm1pbWVvMWdyCisubWltZW9ncmFwaDRlZAorLm1pOG04ZThvOWc4cjhhOHA4aDhzLgorLm1pbWVvZ3JhNHA0aDFzMgorLm1pOG05aThjOXI4aThlOHMuCisubWltMWkKKy5taW00aTFjcgorLm1pbWljcmkyCisubWltaWNyMmllNAorLm1pOG45aThzLgorLm0yaW5pCisubWluMWlzCisubWk4bjhpOXM4eThtOXA4bzlzOGk4dThtLgorLm1pbmlzNHkKKy5taW5pc3k0bTFwCisubWluaXN5bTFwb3MKKy5taW5pc3ltcG81c2k0dQorLm1pOG44aTlzOHk4bTlwOG85czhpOGEuCisubWluaXN5bXBvczJpMWEKKy5taTluOHU4dDllOHIuCisubTRpbjF1CisubWk5bjh1OHQ5ZThzOHQuCisubWk4czljOGg4aThlOXY4bzh1OHM5bDh5LgorLm0yaXMxYworLm1pczNjaDIKKy5taXNjaDJpZTQKKy5taXNjaGlldm91MgorLm1pc2NoaWV2bzJ1cworLm1pc2NoaWV2b3VzMWwyCisubWlzY2hpZXZvdXMxbHkKKy5taTlzOGU4cjhzLgorLm00aXNlCisubWlzM2VyCisubWlzZTRyMXMyCisubWk5czhvOGc5YTltOHkuCisubWkyc28KKy5taXNvMWdhCisubWlzbzJnYW0KKy5tbzhkOWU4bDlsOGk4bjhnLgorLm1vMmQxCisubW9kZWwxbAorLm1vZGVsbDJpCisubW9kZWwybGluNAorLm1vOGw5ZTljOHU4bDhlLgorLm1vbGUxY3UKKy5tb2xlNGN1bAorLm1vbGVjdWw0ZQorLm1vOGw5ZTljOHU4bDhlOHMuCisubW9sZWN1bGVzMgorLm1vOG45YThyOGM4aDhzLgorLm1vMW4xYQorLm1vbmFyM2MKKy5tb24yYTJyCisubW9uYXIyY2gKKy5tb25hcmM0aDFzMgorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyLgorLm1vbmV5bGVuMWRlCisubW84bjhlOHk5bDhlOG45ZDhlOHI4cy4KKy5tb25leWxlbmRlNHI1czIKKy5tbzhuOG85YzhoOHI4bzhtOGUuCisubW9ubzJjaDQKKy5tb25vYzRocjQKKy5tb25vY2hybzJtZQorLm1vOG44bzllOG45ZThyOWc4ZTh0OGk4Yy4KKy5tbzNub2UKKy5tb25vZW4xZXIKKy5tb25vZW5lcmcyCisubW9ub2VuZXIzZ2V0CisubW9ub2VuZXJnZXQxaWMKKy5tbzhuOW84aThkLgorLm1vbm9pMgorLm1vbm8yaWQKKy5tbzhuOG85cDhvOGw4ZS4KKy5tbzRub3AKKy5tbzhuOG85cDhvOGw4ZThzLgorLm1vbm9wb2xlczIKKy5tbzluOG84cDlvOGw4eS4KKy5tb25vcG8ybHkKKy5tbzhuOG85czhwOGw4aThuOGUuCisubW9ub3MxcDJsMgorLm1vbm9zcGxpNG4KKy5tb25vc3AxbDRpbmUKKy5tbzhuOG85czhwOGw4aThuOGU4cy4KKy5tb25vc3BsaTFuZXMKKy5tbzhuOG85czh0OHI4bzhmOGk4Yy4KKy5tb25vczV0CisubW9ub3N0NHIKKy5tb25vc3RybzJmaQorLm1vOW44bzh0OW85bjhpOGU4cy4KKy5tb25vMXRvCisubW8ybm90bzJuCisubW9ub3RvbjJpZTQKKy5tbzluOG84dDlvOW44bzh1OHMuCisubW9ubzR0b25vCisubW9ub3RvMW5vdTIKKy5tb25vdG9ubzJ1cworLm1vOXI4bzhuOWk4czhtLgorLm1vcm81bjRpcworLm1vcm8ybgorLm1vcm9uaTJzMW0KKy5tbzhzOXE4dThpOXQ4by4KKy5tb3MyCisubW9zcXUyCisubW9zcTJ1aTIKKy5tb3NxdWkxdG8KKy5tbzhzOXE4dThpOXQ4bzhzLgorLm1vc3F1aXRvczIKKy5tbzhzOXE4dThpOXQ4bzhlOHMuCisubXU4ZDlyOG84bzhtLgorLm11MWRyCisubXVkMXJvb20KKy5tdWRyb28yCisubXU4ZDlyOG84bzhtOHMuCisubXVkcm9vNG0xczIKKy5tdThsOXQ4aTlmOGE4YzllOHQ4ZThkLgorLjVtdTRsdAorLm11bDF0aTMKKy5tdWx0aWYyCisubXVsdGkxZmEKKy5tdWx0aWZhNGNlCisubXVsdGlmYWNldDQKKy5tdWx0aWZhY2UydDFlZAorLm11OGw5dDhpOXA4bDhpOGM5YThiOGw4ZS4KKy5tdWx0MmlwCisubXVsdGkxcDJsMgorLm11bHRpcGxpMWNhCisubXVsdGlwbGljYTFiMmwyCisubXU4bDh0OGk5dThzOGU4ci4KKy5tdWx0aTR1CisubXVsdGkydXMKKy5uZThvOWY4aThlOGw4ZDhzLgorLjNuZW8KKy5uZTVvZgorLm5lbzJmaQorLm5lb2YyaWU0CisubmVvZmllMmxkMworLm5lb2ZpZWwyZDFzMgorLm5lOG85bjhhOHo4aS4KKy5uZW8ybgorLm5lbzFuMWEKKy5uZW9uYTJ6MWkKKy5uZThvOW44YTh6OGk4cy4KKy5uZW9uYXo0aXMKKy5uZThwOGg5ZTh3OHMuCisubmVwaGU0CisubmU4cDhoOXI4aTh0OGUuCisubmVwNGhyNAorLm5lcGhyMml0ZQorLm5lOHA4aDlyOGk4dDhpOGMuCisubmVwaHI0aTJ0M2ljCisubmVwaHJpMXRpCisubmU4dzllOHM4dC4KKy5uZTR3CisubmV3ZXN0MworLm5lOHc4czlsOGU4dDl0OGU4ci4KKy5uZXdzNGwyCisubmV3czJsZQorLm5ld3NsZTR0M3QyCisubmU4dzhzOWw4ZTh0OXQ4ZThyOHMuCisubmV3c2xldHRlNHIxczIKKy5uaTh0OHI4bzltOGU4dDhoOWE4bjhlLgorLm4yaXQKKy5uaTN0cgorLm5pdHJvMm1lCisubml0cm80bWV0Cisubml0cm9tZXRoYTJuNAorLm5vOW44YThtOGUuCisubm80bgorLm5vMW4xYQorLm5vOG45YThyOWk4dDhoOW04ZTh0OWk4Yy4KKy5ub25hcjNpCisubm9uMmEycgorLm5vbmFyMml0aAorLm5vbmFyaXQ0aDFtCisubm9uYXJpdGhtZXQ0Cisubm9uYXJpdGhtZXQxaWMKKy5ubzhuOWU4bThlOHI5ZzhlOG44Yzh5LgorLm5vbmUxbWUKKy5ub25lbWVyZzIKKy5ub25lbWVyMWdlbgorLm5vbmVtZXJnZW4xY3kKKy5ubzhuOWU4cTh1OGk5djhhOHI4aTlhOG44YzhlLgorLm5vbmUycQorLm5vbmVxdTIKKy5ub25lcTJ1aTIKKy5ub25lcXUyaXYzCisubm9uZXF1aTF2YQorLm5vbmVxdWl2MmEycgorLm5vbmVxdWl2YXIxaQorLm5vbmVxdWl2YXIzaTJhMm4KKy5ub25lcXVpdmFyMmkzYQorLm5vbmVxdWl2YXI0aWFuYworLm5vOG44ZTl0OGg4ZTlsOGU4czhzLgorLm5vbmV0aDJlCisubm9uZXRoZTFsZXMyCisubm9uZXRoZTNsMmUyc3MKKy5ubzhuOWU4dThjOGw4aThkOWU4YThuLgorLm5vbjRldQorLm5vbmV1MWM0bDQKKy5ub25ldWNsMmlkCisubm9uZXVjbGlkZWEybgorLm5vOG45aThzOG85bThvOHI5cDhoOGk4Yy4KKy5ub241aQorLm5vbjFpcworLm5vbmkyc28KKy5ub25pM3NvbQorLm5vbmlzbzFtbworLm5vbmlzb21vMnIKKy5ub25pc29tb3IxcAorLm5vbmlzb21vcnA0aDQKKy5ub25pc29tb3JwaDFpYworLm5vOG45cDhzOGU4dThkOG85YzhvOG05cDhhOGM4dC4KKy5ub24xcDQKKy5ub24ycDFzMgorLm5vbnAyc2UKKy5ub25wczRldQorLm5vbnBzZXUxZG8KKy5ub25wc2V1ZG8xY28KKy5ub25wc2V1ZG9jbzRtMXAKKy5ub25wc2V1ZG9jb20xcGEKKy5ub25wc2V1ZG9jb21wYTJjNHQKKy5ubzhuOXM4bThvOG84dDhoLgorLm5vMm4zczIKKy5ub24yczNtCisubm9uczFtbworLm5vbnNtb28yCisubm9uc21vNG90aAorLm5vOG45dThuOGk5ZjhvOHI4bS4KKy5ubzNudTRuCisubm9udTFuaQorLm5vbnVuaTFmbworLm5vbnVuaWZvMnIKKy5ub251bmlmb3IxbQorLm5vOG45dThuOGk5ZjhvOHI4bTlsOHkuCisubm9udW5pZm9yNG0xbAorLm5vbnVuaWZvcm0xbHkKKy5ubzhyOWU4cDlpOW44ZThwOGg5cjhpOG44ZS4KKy5ub3JlNXBpMm4KKy5ub3JlcDJpbmUKKy5ub3JlcGluZXA0aHI0Cisubm9yZXAyaW5lcGhyMmluNGUKKy5ubzh0OXc4aTh0OGg5czh0OGE4bjhkOWk4bjhnLgorLm5vdHc0Cisubm90d2kyCisubm90dzJpdGgzCisubm90d2kydDRoMXMyCisubm90d2l0aDVzdDRhbmQKKy5ub3R3aXRoczF0YQorLm5vdHdpdGhzdGEybgorLm5vdHdpdGhzdGFuZDFpbgorLm51OWM4bDhlOG85dDhpOGQ4ZS4KKy5udWNsZTMKKy5udTFjNGw0CisubnVjbGU0b3QKKy5udWNsZW90MmlkCisubnU5YzhsOGU4bzl0OGk4ZDhlOHMuCisubnVjbGVvdGlkZTRzMgorLm51OHQ5YzhyOGE4YzhrOWU4ci4KKy5udTR0YworLm51dGNyYWNrMQorLm51dGNyYWNrMWVyCisubnU4dDljOHI4YThjOGs5ZThyOHMuCisubnV0Y3JhY2tlNHIxczIKKy5vZThyOXM4dDhlOGQ4cy4KKy5vM2VyCisub2U0cjFzMgorLm9lcnM0dDFlZAorLm9lcnN0ZTJkMXMyCisub2Y4ZjlsOGk4bjhlLgorLm80ZjFmCisub2ZmNGwyCisub2ZmbGluNAorLm9mZjFsNGluZQorLm9mOGY5bDhvOGE4ZC4KKy5vZmZsNG9hCisub2ZmbG9hMmQzCisub2Y4ZjlsOG84YThkOHMuCisub2ZmbG9hMmQxczIKKy5vZjhmOWw4bzhhOGQ4ZThkLgorLm9mZmxvYTJkMWVkCisub2w4aTlnOG84cDlvOWw4aThzOHQuCisub2wyaQorLm9sMmlnCisub2xpMmdvCisub2wyaWdvcG9sMmkKKy5vbDhpOWc4bzhwOW85bDhpOHM4dDhzLgorLm9saWdvcG9saXM0dDFzMgorLm9sOGk5ZzhvOHA5bzhsOHkuCisub2xpZ29wbzJseQorLm9sOGk5ZzhvOHA5bzhsOWk4ZThzLgorLm9saWdvcG9sMmllNAorLm9wOWU4cjlhOG44ZC4KKy5vcDFlcgorLjNvcGVyMWEKKy5vcDRlcjRhbmQKKy5vcGVyYTJuCisub3A5ZThyOWE4bjhkOHMuCisub3BlcmFuMmQxczIKKy5vcjhhOG44Zzl1OHQ4YThuLgorLm9yYTJuCisub3IyYW5nCisub3JhbjFndQorLm9yYW40Z3U0dAorLm9yYW5ndTF0YQorLm9yYTJuZ3V0YTJuCisub3I4YThuOGc5dTh0OGE4bjhzLgorLm9yYW5ndXRhMm4xczIKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0LgorLm9ydGhvMmRvNAorLm9ydGhvZG8ybgorLm9ydGhvZG9uM3Q0aQorLm9ydGhvZG9uMXQKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0OHMuCisub3J0aG9kb250aXM0dDFzMgorLm9yOXQ4aDhvOWs4ZThyOWE5dDhvOGw5bzhnOHkuCisub3J0aDJvaworLm9ydGhvazFlcgorLm9ydGhva2VyMWEKKy5vcnRob2tlcmExdG8KKy5vcnRob2tlcmF0b2wxbzFneQorLm9yOHQ4aDhvOW44aTh0OHI4bzl0OG84bDh1OGU4bjhlLgorLm9ydGhvMm4KKy5vcnRob24yaXQKKy5vcnRob25pM3RyCisub3J0aG9uaXRybzF0bworLm9ydGhvbml0cm90b2x1M2VuCisub3J0aG9uaXRyb3RvbHU0ZW5lCisub3Y4ZThyOXY4aThlOHcuCisub3ZlcnYyaWU0Cisub3Y4ZThyOXY4aThlOHc4cy4KKy5veDlpOGQ5aThjLgorLm94M2kKKy5veGk1ZGkKKy5veDJpZAorLnBhOGQ5ZDhpOG44Zy4KKy4xcGEKKy5wNGEyZAorLnBhZDRkMWluCisucGFkMWQ0CisucGE4aThuOWw4ZThzOHM5bDh5LgorLnA0YWkyCisucGE0aTRuNAorLnBhNGk0bjFsCisucGFpbmxlczIKKy5wYWluM2wyZTJzcworLnBhaW5sZXM0czFsMgorLnBhaW5sZXNzMWx5CisucGE4bDllOHQ4dDhlLgorLnA0YWwKKy5wMmFsZQorLnBhbGU0dDN0MgorLnBhOGw5ZTh0OHQ4ZThzLgorLnBhbGV0NHRlcworLnBhOHI5YTliOG84bDhhLgorLnAyYTJyCisucGEycmFiCisucGFyYWJvMWxhCisucGE4cjlhOWI4bzhsOWk4Yy4KKy5wYXJhYm9sM2ljCisucGFyYWJvbDJpCisucGE5cjhhOGI5bzlsOG84aThkLgorLnBhcmFib2xvaTIKKy5wYXJhYm9sbzJpZAorLnBhOHI5YTlkOGk4ZzhtLgorLnBhcmEyZAorLnBhcjJhZGkKKy5wYXJhZDJpZworLnBhcmFkaWcxbQorLnBhOHI5YTlkOGk4ZzhtOHMuCisucGFyYWRpZzRtMXMyCisucGE4cjhhOWM4aDh1OHQ4ZS4KKy5wYXJhMmNoCisucGFyYWNodTR0CisucGE4cjhhOWM4aDh1OHQ4ZThzLgorLnBhOHI4YTlkOGk5bThlOHQ4aDh5OGw5YjhlOG44ejhlOG44ZS4KKy5wYXJhZDRpbWV0CisucGFyYWRpbWV0aHkybDFiCisucGFyYWRpbWV0aHlsYjRlNG4zegorLnBhcmFkaW1ldGh5bGJlbjJ6ZQorLnBhcmFkaW1ldGh5bGJlbnplNG4KKy5wYThyOGE5ZjhsOHU4bzhyOG85dDhvOGw4dThlOG44ZS4KKy5wYXJhMmYKKy5wYXJhZjRsMgorLnBhcmFmbHUzbworLnBhcmFmbHVvM3IKKy5wYXJhZmx1b3JvMXRvCisucGFyYWZsdW9yb3RvbHUzZW4KKy5wYXJhZmx1b3JvdG9sdTRlbmUKKy5wYThyOGE5ZzhyOGE4cDhoOWU4ci4KKy5wYXJhMWdyCisucGFyYWc1cmEzcGg0ZXIKKy5wYThyOGE5bDhlOWc4YThsLgorLnBhcjNhbAorLnBhcjJhbGUKKy5wYXJhbDRlZ2FsCisucGFyYWxlMWdhCisucGE4cjlhOGw5bDhlOGw5aThzOG0uCisucGFyYWwxbAorLnBhcmFsMmxlCisucGFyYWwzbGVsCisucGFyYWxsZWwyaQorLnBhcmFsbGUybGlzCisucGFyYWxsZWxpMnMxbQorLnBhOHI4YTltOGE4ZzluOGU4dDlpOHM4bS4KKy5wYXI0YTFtYQorLnBhcmFtM2FnCisucGFyYTVtYWcxbgorLnBhcmFtYWduZXRpMnM0bQorLnBhOHI4YTltOGU4ZDhpOGMuCisucGFyYTJtZWQKKy5wYXJhbTRlZGkKKy5wYThyOGE5bThlOHQ4aDh5OGw5YThuOGk4czhvOGw4ZS4KKy5wYXJhbTNldAorLnBhcmFtZXRoeTNsYQorLnBhcmFtZXRoeWxhMm4KKy5wYXJhbWV0aHlsYW5pMnNvCisucGE5cjhhOG05ZTl0OHI4aTh6OGUuCisucGFyYW00ZXRyCisucGFyYW1ldHJpMnplCisucGE4cjhhOW04aThsOWk5dDhhOHI4eS4KKy5wYXIyYW1pCisucGFyYW1pbDFpCisucGFyYW0yaWwxaXQKKy5wYXJhbWlsaTF0YQorLnBhcmFtaWxpdDJhMnIKKy5wYThyOGE5bThvOHU4bjh0LgorLnBhcmEybW8KKy5wYXJhbW91MgorLnBhcmFtb3VuMXQKKy5wYTh0OGg5bzlnOGU4bjlpOGMuCisucDRhdGgKKy5wYXQ0aG8KKy5wYXRobzRnCisucGF0aG8xZ2U0CisucGF0aG8xZ2VuCisucGU4ZTh2OWk4czhoLgorLnA0ZWUKKy5wZWUxdmkKKy5wZWV2aXMyaAorLnBlOGU4djlpOHM4aDluOGU4czhzLgorLnBlZXZpczJoMW4KKy5wZWV2aXNoMW5lcworLnBlZXZpc2huMmUyc3MKKy5wZThuOXQ4YTlnOG84bi4KKy5wZW4xdAorLnBlbjF0YQorLnBlbnRhMmdvCisucGVudGFnbzJuMgorLnBlOG45dDhhOWc4bzhuOHMuCisucGVudGFnbzJuM3MyCisucGU5dDhyOG85bDhlOXU4bS4KKy5wZXRyb2w0ZXUKKy5waDhlOW44bzhtOWU5bjhvOG4uCisucGg0ZTNubworLnBoZTJuCisucGhlbm8ybWUKKy5waGVubzFtZW4KKy5waGVub200ZW5vCisucGhlbm9tZW5vNG4KKy5waDhlOG44eThsOWE4bDhhOW44aThuOGUuCisucGhlbnkzbGEKKy5waGVueWxhbGEybgorLnBoZW55bGFsYTVuMmluZQorLnBoZW55bGFsYW4xaW4KKy5waDhpOWw4YTh0OWU5bDhpOHM4dC4KKy5waGk0bGF0ZWwyaTQKKy5waGlsYXRlMmxpcworLnBoOGk5bDhhOHQ5ZTlsOGk4czh0OHMuCisucGhpbGF0ZWxpczR0MXMyCisucGg4bzluOGU4bThlLgorLjNwaG9uZQorLnBobzJuCisucGhvbmUxbWUKKy5waDhvOW44ZThtOGU4cy4KKy5waG9uZTJtZXMKKy5waDhvOW44ZTltOGk4Yy4KKy5waG9uZTVtaQorLnBoOG84czlwOGg4bzhyOWk4Yy4KKy5waG9zMXAKKy5waG9zcGhvNQorLnBob3NwaG80cgorLnBoOG85dDhvOWc4cjhhOHA4aDhzLgorLnBobzF0bworLnBob3RvMmdyCisucGhvdG9ncmE0cDRoMXMyCisucGg4bzl0OG85bzhmOGY5czhlOHQuCisucGhvdG9vMgorLnBob3RvbzRmMWYKKy5waG90b29mMmYzcworLnBpOGM5YTlkOG84ci4KKy5waTFjYQorLnBpY2EyZAorLnBpY2ExZG8KKy5waWNhZDRvcgorLnBpOGM5YTlkOG84cjhzLgorLnBpY2FkbzRyczIKKy5waThwOGU5bDhpOG44ZS4KKy5wMmlwCisucGlwZTQKKy5waXBlbDJpCisucGlwZTFsNGluZQorLnBpOHA4ZTlsOGk4bjhlOHMuCisucGlwZWxpMW5lcworLnBpOHA4ZTlsOGk4bjlpOG44Zy4KKy5waXBlbDJpbjNpCisucGlwZWxpbjFpbgorLnBpcGVsaW5pbjRnCisucGk5cjhhOW44aDhhOHMuCisucDRpcgorLnBpMXJhCisucGlyYTJuCisucGlyYTRuMWg0CisucGlyYW5oYTQKKy5wbDhhOGM4YTliOGw4ZS4KKy4xcDJsMgorLnBsYTFjYQorLnBsYWNhMWIybDIKKy5wbDhhOG44dDloOG84cDlwOGU4ci4KKy4zcGxhMm4KKy5wbGFuMXQKKy5wbGFudGhvNHAxcAorLnBsYW50aG9wMnBlCisucGxhbnRob3AzcGVyCisucGw4YThuOHQ5aDhvOHA5cDhlOHI4cy4KKy5wbGFudGhvcHBlNHIxczIKKy5wbDhlOGE4czlhOG44YzhlLgorLnBsZTJhCisucGxlYXNhMgorLnBsZWEzc2FuYworLnBsZWFzYTJuCisucGw4dThnOWk4bi4KKy5wbHVnNWluCisucGw4dThnOWk4bjhzLgorLnBsdTVnNGkybjFzMgorLnBvOGw5dDhlOHI5ZzhlOGk4czh0LgorLnBvNGwydAorLnBvbDF0ZQorLnBvbHRlcmcyCisucG9sdGVyZ2VpMgorLnBvOGw4eTllOG44ZS4KKy5wbzJseQorLnBvOGw4eTllOHQ4aDl5OGw5ZThuOGUuCisucG9seWU0dAorLnBvOWw4eThnOWE5bThpOHM4dC4KKy5wb2x5MWdhCisucG9seTJnYW0KKy5wb2x5Z2FtMmlzCisucG85bDh5OGc5YTltOGk4czh0OHMuCisucG9seWdhbWlzNHQxczIKKy5wbzhsOHk4ZzlvOG45aTl6OGE5dDhpOG84bi4KKy5wb2x5MWdvCisucG9seWdvMm4yCisucG9seWdvM25pCisucG9seWdvbml6YTEKKy5wb2x5Z29uaXphMXQyaW8KKy5wb2x5Z29uaXphdGlvMm4KKy5wbzlsOHk4cDhoOW85bjhvOHU4cy4KKy5wb2x5cGhvMm4KKy5wb2x5cGhvMW5vdTIKKy5wb2x5cGhvbm8ydXMKKy5wbzhsOHk5czh0OHk4cjhlOG44ZS4KKy5wbzJseXM0CisucG9seXMxdAorLnBvbHlzMnR5CisucG84bThlOWc4cjhhOG45YTh0OGUuCisucG8ybWUKKy5wb21lMmcKKy5wb21lMWdyCisucG9tZWdyYTJuMgorLnBvbWVncmExbmEKKy5wb21lZ3JhbjJhdAorLnBvOHI4bzllOGw4YThzOXQ4aThjLgorLjFwNG9yCisucG9ybzRlCisucG9ybzRlbAorLnBvcm9lMWxhCisucG9yb2VsYXN0MmkKKy5wb3JvZWxhczF0aWMKKy5wbzhyOW84dThzLgorLnBvcm91MgorLnBvcm8ydXMKKy5wbzhyOXQ4YTliOGw4ZS4KKy5wb3IxdGEKKy5wb3IydGFiCisucG9ydGFiMmwyCisucG84czh0OWE4bTliOGw4ZS4KKy4xcG9zCisucG9zMnRhCisucG9zdGE0bTFiCisucG9zdGFtYjJsMgorLnBvOHM4dDlhOG05YjhsOGU4cy4KKy5wb3N0YW1ibGVzMgorLnBvOHM4dDloOHU5bThvOHU4cy4KKy5wb3N0aHUxbW8KKy5wb3N0aHUzbW8ydXMKKy5wb3N0aHVtb3UyCisucG84czh0OXM4YzhyOGk4cDh0LgorLnBvczR0MXMyCisucG9zdDRzYworLnBvc3RzY3JpMgorLnBvc3RzY3IyaXAKKy5wb3N0c2NyaTJwMXQKKy5wbzhzOHQ5czhjOHI4aThwOHQ4cy4KKy5wb3N0c2NyaXA0dDFzMgorLnBvOHM5dDh1OHI5YThsLgorLnBvczF0dQorLnBvc3R1MXJhCisucHI4ZTlhOG05YjhsOGUuCisucHJlYTRtMWIKKy5wcmVhbWIybDIKKy5wcjhlOWE4bTliOGw4ZThzLgorLnByZWFtYmxlczIKKy5wcjhlOWw4bzhhOGQ4ZThkLgorLnByZWw0b2EKKy5wcmVsb2EyZDMKKy5wcmVsb2EyZDFlZAorLnByOGU5cDhhOHI5aThuOGcuCisucHJlMnBhCisucHJlcDRhNHIxaQorLnByZXAyYTJyCisucHJlcGFyaW40ZworLnByOGU5cDhyOGk4bjh0LgorLnByMmVwcjIKKy5wcmVwcmluNHQzCisucHI4ZTlwOHI4aThuOHQ4cy4KKy5wcmVwcmluNHQ0czIKKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyLgorLnByZTNwcm8KKy5wcmVwcjJvYworLnByZXBybzFjZQorLnByZXByb2MyZTJzcworLnByZXByb2NlczFzbworLnByOGU5cDhyOG84YzhlOHM5czhvOHI4cy4KKy5wcmVwcm9jZXNzbzRyczIKKy5wcjhlOXM4cDhsOGk4dDl0OGk4bjhnLgorLnByZTFzcAorLnByZXMxcDJsMgorLnByZXNwbDFpdAorLnByZXNwbDRpNHQzdDIKKy5wcmVzcGxpdDJ0MWluCisucHI4ZTl3OHI4YThwLgorLnByZXdyYTQKKy5wcjhlOXc4cjhhOHA4cDhlOGQuCisucHJld3JhNHAxcAorLnByZXdyYXAycGUKKy5wcmV3cmFwNHAyZWQKKy5wcjhpOGU4czh0OWU4czhzOGU4cy4KKy41cHIyaTRlNAorLnByaTFlc3QKKy5wcmllczR0MmUyc3MKKy5wcmllc3Rlc3MxZTRzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4ZThyLgorLnByZTR0M3QyCisucHJldDF0eQorLnByMmV0dHlwcjIKKy5wcmV0dHlwcmluNHQzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4aThuOGcuCisucHJldHR5cHJpbnQyaQorLnByZXR0eXByaW40dDNpbmcKKy5wcmV0dHlwcmluMnQxaW4KKy5wcjhvOWM4ZTlkOHU4cjlhOGwuCisucHIyb2MKKy5wcm8xY2UKKy5wcm9jZTFkdQorLnByb2NlZHUxcmEKKy5wcjhvOGM4ZThzOHMuCisucHJvYzJlMnNzCisucHI4bzljOHU4cjlhOG44YzhlLgorLnByb2N1MXJhCisucHJvY3VyYTJuCisucHI4bzhnOWU5bjhpOGU4cy4KKy5wcm8xZ2UKKy5wcm8xZ2VuCisucHJvZ2U1bjJpZTQKKy5wcjhvOGc5ZTluOHkuCisucHJvNGdlbnkKKy5wcjhvOWc4cjhhOG05bThhOGI4bDhlLgorLnBybzFncgorLnByb2dyYW0xbQorLnByb2dyYW0xbWEKKy5wcm9ncmFtMm1hYgorLnByb2dyYW1tYWIybDIKKy5wcjhvOG05aTluOGU4bjh0LgorLnByb200aQorLnByb20xaW4KKy5wcm9tMmluZQorLnByb21pMW5lbgorLnByb21pbmVuMXQKKy5wcjhvOW04aThzOWM4dTlvOHU4cy4KKy5wcm9tMmlzCisucHJvbTJpczFjCisucHJvbWlzMWN1CisucHJvbWlzY3Uxb3UyCisucHJvbWlzY3VvMnVzCisucHI4bzhtOWk4czlzOG84cjh5LgorLnByb200aTJzMXMKKy5wcm9taXMxc28KKy5wcm9taXNzbzFyeQorLnByOG84bTlpOHM4ZS4KKy5wcm9tNGlzZQorLnByOG84bTlpOHM4ZThzLgorLnByb21pczFlNHMKKy5wcjhvOXA4ZThsOWw4ZThyLgorLnBybzNwZWwKKy5wcm9wZWwxbAorLnByb3BlbDJsZQorLnByOG85cDhlOGw5bDhlOHI4cy4KKy5wcm9wZWxsZTRyMXMyCisucHI4bzlwOGU4bDlsOGk4bjhnLgorLnByb3BlbGwyaQorLnByb3BlbDJsaW40CisucHI4bzloOGk4YjlpOXQ4aTh2OGUuCisucHJvMWgyCisucHJvaGliaTJ0CisucHJvaGliaTF0aQorLnByb2hpYmkxdDJpdgorLnByOG85aDhpOGI5aTl0OGk4djhlOWw4eS4KKy5wcm9oaWJpdGl2NGUxbHkKKy5wcjhvOXM4YzhpOHU4dDl0OG8uCisucHJvczJjCisucHJvczFjaQorLnByb3NjaTF1CisucHJvc2NpdTR0M3QyCisucHJvc2NpdXQ1dG8KKy5wcjhvOXQ4ZThzOHQ5ZThyLgorLnBybzF0CisucHJvNHRlcworLnByOG85dDhlOHM4dDllOHI4cy4KKy5wcm90ZXN0ZTRyMXMyCisucHI4bzl0OGU4czl0OG84ci4KKy5wcm90NGVzMnRvCisucHI4bzl0OGU4czl0OG84cjhzLgorLnByb3Rlc3RvNHJzMgorLnByOG85dDhvOWw4YThuOWc4dThhOGc4ZS4KKy5wcm8xdG8KKy5wcm90bzFsYQorLnByb3RvNGxhMm4KKy5wcm90b2wyYW5nCisucHJvdG9sYW4xZ3UKKy5wcm90b2xhbmd1NGEKKy5wcjhvOXQ4bzl0OHk4cDlhOGwuCisucHJvdG8xdHkKKy5wcm90b3R5MXBhCisucHJvdG90eXA0YWwKKy5wcjhvOHY5aThuOGM4ZS4KKy5wcm92MWluCisucHJvdjJpbmMKKy5wcjhvOHY5aThuOGM4ZThzLgorLnByOG85djhpOG45YzhpOGE4bC4KKy5wcm92aW4xY2kKKy5wcm92aW4zYzJpMWEKKy5wcm92aW5jaTJhbAorLnByOG84dzllOHM4cy4KKy5wcm93MmUyc3MKKy5wczhlOHU5ZDhvOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjJwMXMyCisucDJzZQorLnBzNGV1CisucHNldTFkbworLnBzZXVkb2QxaWYKKy5wc2V1ZG9kaTRmMWYKKy5wc2V1ZG9kaWZmZXIxCisucHNldWRvZGlmZmVyM2VuMXQKKy5wc2V1ZG9kaWZmZXJlbnQyaQorLnBzZXVkb2RpZmZlcmVuMXQyaTFhCisucHNldWRvZGlmZmVyZW50aTJhbAorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGUuCisucHNldTJkNW9mCisucHNldWRvMmZpCisucHNldWRvMmZpbgorLnBzZXVkb2YyaW5pCisucHNldWRvZmluMml0CisucHNldWRvZmluMml0ZQorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGU5bDh5LgorLnBzZXVkb2Zpbml0ZTFseQorLnBzOGU4dTlkOG85ZjhvOHI4YzhlOHMuCisucHNldWRvMWZvCisucHNldWRvZm8ycgorLnBzZXVkb2ZvcjFjCisucHNldWRvZm9yMmNlCisucHM4ZTh1OWQ4bzhnOXI4YTlwOGg4ZThyLgorLnBzZXVkNG9nCisucHNldWRvMWdyCisucHNldWRvZzVyYTNwaDRlcgorLnBzOGU4dTlkOG85ZzhyOG84dThwLgorLnBzZXVkbzRnNHJvCisucHNldWRvZ3JvdTIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cDhzLgorLnBzZXVkb2dyb3UycDFzMgorLnBzOGU4dTlkOG85bjh5OG0uCisucHNldTRkbzJuCisucHNldWRvbnltNAorLnBzOGU4dTlkOG85bjh5OG04cy4KKy5wc2V1ZG9ueTRtMXMyCisucHM4ZTh1OWQ4bzl3OG84cjhkLgorLnBzZXVkbzR3bzIKKy5wczhlOHU5ZDhvOXc4bzhyOGQ4cy4KKy5wc2V1ZG93b3IyZDFzMgorLnBzOHk5YzhoOGU5ZDhlOGw5aThjLgorLnBzNHkKKy5wNHN5MWMKKy5wc3kzY2gKKy5wc3ljaDRlMgorLnBzeTRjaDRlZAorLnBzeWNoZWRlbDJpCisucHM4eThjOGg4cy4KKy5wc3ljNGgxczIKKy5wdTliOGU4czljOGU4bjhjOGUuCisucHViMworLnB1YjRlCisucHU0YmVzNAorLnB1YmVzMmMKKy5wdWJlczFjZW4KKy5wdWJlczNjZW5jCisucXU4YThkOWQ4aThuOGcuCisucXUyCisucXVhMmQKKy5xdWFkNGQxaW4KKy5xdWFkMWQ0CisucXU4YTlkOHI4YTh0OWk4Yy4KKy5xdWExZHIKKy5xdWFkcmF0MWljCisucXU4YTlkOHI4YTh0OWk4YzhzLgorLnF1YWRyYXRpNGMzczIKKy5xdThhOGQ5cjhhOXQ4dThyOGUuCisucXVhZHJhMnR1CisucXVhZHJhM3R1cmUKKy5xdThhOGQ5cjhpOXA4bDhlOGc5aThjLgorLnF1YWRyaTJwMmwyCisucXVhZHIyaXAKKy5xdWFkcmlwbGVnNGljCisucXU4YThpOG44dDllOHIuCisucXVhaTIKKy5xdWE0aTRuCisucXVhaW4xdAorLnF1OGE4aThuOHQ5ZThzOHQuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlLgorLnF1YXMyaWU0CisucXVhc2llMXEKKy5xdTJhc2llcXUyCisucXVhc2llcTJ1aTIKKy5xdWFzaWVxdTJpdjMKKy5xdWFzaWVxdWkxdmEKKy5xdWFzaWVxdWl2MmFsZQorLnF1YXNpZXF1aXZhM2xlbmMKKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGU4cy4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjh0LgorLnF1YXNpZXF1aXZhMWxlbjF0CisucXU4YTlzOGk5aDh5OXA4bzluOG84cjltOGE4bC4KKy5xdWFzaTNoCisucXVhc2loeTNwbworLnF1YXNpaHlwbzJuCisucXVhc2loeXBvbm9yMW0KKy5xdWFzaWh5cG9ub3IxbWEKKy5xdThhOXM4aTlyOGE4ZDlpOWM4YThsLgorLnF1YXM0aTJyCisucXVhc2kxcjVhCisucXVhc2lyYTJkCisucXVhc2lyMmFkaQorLnF1YXNpcmFkM2kxY2EKKy5xdThhOXM4aTlyOGU4czhpOGQ5dThhOGwuCisucXVhc2k0cmVzCisucXVhc2lyZTFzaQorLnF1YXNpcmUyczJpZAorLnF1YXNpcmVzaTJkdQorLnF1YXNpcmVzaWQxdTFhCisucXU4YTlzOGk5czhtOG84bzh0OGguCisucXVhMXNpcworLnF1YXNpMnMxbQorLnF1YXNpczFtbworLnF1YXNpc21vbzIKKy5xdWFzaXNtbzRvdGgKKy5xdThhOXM4aTlzOHQ4YTl0OGk4bzhuOWE4cjh5LgorLnF1YXNpczF0YQorLnF1YXNpc3RhdGlvbjVhMnIKKy5xdWFzaXN0YTF0MmlvCisucXVhc2lzdGF0aW8ybgorLnF1YXNpc3RhdGlvMW4xYQorLnF1OGE5czhpOXQ4bzhwOG84cy4KKy5xdTVhNXNpNHQKKy5xdWFzaTF0bworLnF1YXNpdG8xcG9zCisucXU4YTlzOGk5dDhyOGk5YThuOWc4dTlsOGE4ci4KKy5xdWFzaTV0cjJpM2EKKy5xdWFzaXRyaTJhMm4KKy5xdWFzaXRyaTJhbmcKKy5xdWFzaXRyaWFuMWd1CisucXVhc2l0cmlhbmd1MWxhCisucXVhc2l0cmlhbmd1bDJhMnIKKy5xdThhOXM4aTl0OHI4aTh2OWk4YThsLgorLnF1YXNpdHIyaTR2CisucXVhc2l0cml2M2kKKy5xdWFzaXRyaXYyaTFhCisucXVhc2l0cml2aTJhbAorLnF1OGk4bjl0OGU4czlzOGU4bjhjOGUuCisucTJ1aTIKKy5xdWk0bgorLnF1aW4xdAorLnF1aW40dDJlMnNzCisucXVpbnRlczRzZW5jCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZThzLgorLnF1OGk4bjl0OGU4czlzOGU4bjl0OGk4YThsLgorLnF1aW50ZXNzZW4xdAorLnF1aW50ZXNzZW50MmkKKy5xdWludGVzc2VuMXQyaTFhCisucXVpbnRlc3NlbnRpMmFsCisucmE4YjliOGk4dDlyOHkuCisuMnJhYgorLnJhMmIxYgorLnJhYmJpMnQKKy5yYWJiaTN0cgorLnJhYmJpdDVyeQorLnJhOWQ4aTlvOGc5cjhhOXA4aDh5LgorLnJhMmQKKy5yMmFkaQorLnJhM2QyaW8KKy5yYWRpbzVnCisucmFkaW8yZ3IKKy5yYWRpbzRnM3JhMXBoeQorLnJhOGY4ZjlpOHM4aC4KKy5yYWY1ZmkKKy5yYTJmCisucmE0ZjFmNAorLnJhZjJmNWlzCisucmFmZmlzMmgKKy5yYThmOGY5aThzOGg5bDh5LgorLnJhZmZpczRoMWw0CisucmFmZmlzaDFseQorLnJhOG05czhoOGE4YzhrOGw4ZS4KKy5yYTRtMXMyCisucmFtNHMyaAorLnJhbXNoYWNrMQorLnJhbXNoYWNrMWwKKy5yYTh2OWU4bjlvOHU4cy4KKy5yYXY0ZTRubworLnJhdmUxbm91MgorLnJhdmVubzJ1cworLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dC4KKy5yZTVhcjFyNAorLnJlMmEycgorLnJlYXJyYW40Z2UKKy5yZWFycmEybgorLnJlYXJyMmFuZworLnJlYXJyYW5nZTFtZQorLnJlYXJyYW5nZTFtZW4KKy5yZWFycmFuZ2UzbWVuMXQKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQ4cy4KKy5yZWFycmFuZ2VtZW40dDRzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDhpOGU4cy4KKy5yZWNpcHJvY2kxdGkKKy5yZWNpcHJvY2l0MmllNAorLnJlOGM5dDhhOG45ZzhsOGUuCisucmVjNHRhMm4KKy5yZTJjMXQKKy5yZWN0NWFuZworLnJlYzF0YQorLnJlY3RhbjFnbDIKKy5yZWN0YW4xZ2xlCisucmU4Yzl0OGE4bjlnOGw4ZThzLgorLnJlY3RhbmdsZXMyCisucmU4Yzl0OGE4bjlnOHU5bDhhOHIuCisucmVjdGFuMWd1CisucmVjdGFuZ3UxbGEKKy5yZWN0YW5ndWwyYTJyCisucmU5ZDhpOXI4ZThjOHQuCisuMnIyZWQKKy5yNGVkaQorLnJlZDRpcjIKKy5yZWRpMXJlCisucmVkaXJlMmMxdAorLnJlOWQ4aTlyOGU4Yzh0OWk4bzhuLgorLnJlZGlyZWMxdDJpbworLnJlZGlyZWN0aW8ybgorLnJlOWQ4dThjOWk4YjhsOGUuCisucmUxZHUKKy5yZWR1MmMKKy5yZWR1Y2k0YgorLnJlZHUxY2kKKy5yZWR1Y2kxYjJsMgorLnJlOWU4YzhoOG8uCisucmVlMmMKKy5yZWUyY2gKKy5yZWUzY2hvMgorLnJlOXA4aDhyOGE4czhlLgorLnJlcDRocjQKKy5yZXBocjJhcworLnJlOXA4aDhyOGE4czhlOHMuCisucmVwaHJhczFlNHMKKy5yZTlwOGg4cjhhOHM4ZThkLgorLnJlcGhyYTRzNGVkCisucmU5cDhvOXM4aTl0OGk4bzhuLgorLnJlNHBvc2kKKy5yZTFwbworLnJlMXBvcworLnJlcG8zczJpMXQyaW8KKy5yZXBvc2kxdGkKKy5yZXBvc2l0aW8ybgorLnJlOXA4bzlzOGk5dDhpOG84bjhzLgorLnJlcG9zaXRpbzJuM3MyCisucmU5cDhyOGk4bjh0LgorLnJlcHIyCisucmVwcmluNHQzCisucmU5cDhyOGk4bjh0OHMuCisucmVwcmluNHQ0czIKKy5yZTlzOHQ4bzhyOWE4YjhsOGUuCisucjRlczJ0bworLnJlc3RvMnJhCisucmVzdG8ycmFiCisucmVzdG9yYWIybDIKKy5yZTh0OHI4bzlmOGk4dC4KKy5yZXRybzJmaQorLnJlOHQ4cjhvOWY4aTh0OXQ4ZThkLgorLnJldHJvZjRpNHQ0dDIKKy5yZXRyb2ZpdDJ0MWVkCisucmU5dThzOWE4YjhsOGUuCisucjRldTIKKy5yZTJ1czQKKy5yZXVzYTIKKy5yZXUyczFhYgorLnJldXNhYjJsMgorLnJlOXU4czhlLgorLnJlOXc4aThyOGUuCisucmV3aTIKKy5yZXc0aXI0CisucmU5dzhyOGE4cC4KKy5yZXdyYTQKKy5yZTl3OHI4YThwOHA4ZThkLgorLnJld3JhNHAxcAorLnJld3JhcDJwZQorLnJld3JhcDRwMmVkCisucmU5dzhyOGk4dDhlLgorLnJld3JpNAorLnJld3IyaXRlCisucmg4aTluOG84YzllOHI5bzhzLgorLnJoNAorLnJoMmkxbm8KKy5yaGk0bm80YworLnJoaW5vMWNlCisucmhpbm9jMmVybworLnJpOGc4aDh0OWU4bzh1OHMuCisucmlnaDF0ZW8KKy5yaWdodGVvdTIKKy5yaWdodGVvMnVzCisucmk4ZzhoOHQ5ZThvOHU4czluOGU4czhzLgorLnJpZ2h0ZW91czFuNAorLnJpZ2h0ZW91czFuZXMKKy5yaWdodGVvdXNuMmUyc3MKKy5yaThuOGc5bDhlOGE4ZDhlOHIuCisucmluNGcKKy5yaW5nbDIKKy5yaW4xZ2xlCisucmluZ2xlMmEKKy5yaW5nbGVhMmQxCisucmk4bjhnOWw4ZThhOGQ4ZThyOHMuCisucmluZ2xlYWRlNHI1czIKKy5ybzliOG84dC4KKy5ybzliOG84dDhzLgorLnJvYm80dDFzMgorLnJvOWI4bzh0OGk4Yy4KKy5ybzliOG84dDlpOGM4cy4KKy5yb2JvdGk0YzNzMgorLnJvOHU4bjhkOXQ4YThiOGw4ZS4KKy5yb3UyCisucm91bjJkCisucm91bmQxdGEKKy5yb3VuZDJ0YWIKKy5yb3VuZHRhYjJsMgorLnJvOHU4bjhkOXQ4YThiOGw4ZThzLgorLnJvdW5kdGE1YmxlczIKKy5zYThsOGU4czljOGw4ZThyOGsuCisuc2EyCisuczJhbGUKKy5zYWxlczIKKy5zYWxlczJjCisuc2FsZXNjbGU1Cisuc2FsZXMxYzRsNAorLnNhOGw4ZThzOWM4bDhlOHI4azhzLgorLnNhbGVzY2xlcjRrMXMyCisuc2E4bDhlOHM5dzhvOG04YThuLgorLnNhbGVzNHcyCisuc2FsZTRzMXdvMgorLnNhbGVzd29tMQorLnNhbGVzd28xbWEKKy5zYWxlc3dvbWEybgorLnNhOGw4ZThzOXc4bzhtOGU4bi4KKy5zYWxlc3dvMm1lCisuc2FsZXN3bzFtZW4KKy5zYThsOW04bzluOGU4bDlsOGEuCisuczRhMmw0bQorLnNhbG1vMm40Cisuc2FsMW1vCisuc2FsbW9uNGVsbGEKKy5zYWxtb25lbDFsCisuc2E4bDl0OGE5dDhpOG84bi4KKy5zYTRsNHQKKy5zYWwxdGEKKy5zYWx0YTF0MmlvCisuc2FsdGF0aW8ybgorLnNhOHI5czhhOXA4YThyOWk4bDlsOGEuCisuczJhMnIKKy5zYTJyNHNhMgorLnNhNHJzMgorLnNhcnMxYXAKKy5zMmEycnNhcDJhMnI0Cisuc2Fyc2ExcGEKKy5zYXJzYXA0YTRyMWkKKy5zYXJzYXBhcmlsMWwKKy5zYTh1OGU4cjlrOHI4YTh1OHQuCisuc2F1NAorLnNhdWVya3JhdTR0Cisuc2M4YTh0OW85bDhvOGc5aTljOGE4bC4KKy5zMWNhCisuc2NhMXRvCisuc2NhdG8zbG9nMWljCisuc2NhdG9sb2dpMWNhCisuc2M4aDhlOGQ5dThsOWk4bjhnLgorLnMyY2gyCisuc2NoZTIKKy5zNGNoNGVkCisuc2NoZTRkdWwKKy5zY2hlMWR1Cisuc2NoZWR1bDJpCisuc2NoZWR1bDNpbmcKKy5zYzhoOGk4ejlvOXA4aDhyOGU4bjhpOGMuCisuc2NoaTJ6Cisuc2NoaTF6bworLnNjaGl6Mm9waAorLnNjaGl6b3A0aHI0Cisuc2M4aDhuOGE4dTl6OGU4ci4KKy5zYzJoMW4KKy5zY2gxbmEKKy5zY2huMmF1Cisuc2NobmF1Mno0ZQorLnNjaG5hdXoxZXIKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZC4KKy5zNGNobzIKKy5zY2hvbzIKKy5zY2hvbzRsMWMyCisuczJjaG9vbDJjaAorLnNjaG9vbGNoNGlsMgorLnNjaG9vbGNoaTJsZAorLnNjOGg4bzhvOGw5YzhoOGk4bDhkOXI4ZThuLgorLnNjaG9vbGNoaWwzZHIKKy5zY2hvb2xjaGlsZHJlNAorLnNjaG9vbGNoaWw1ZHJlbgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOGU4ci4KKy5zY2hvbzRsMnQKKy5zY2hvb2wxdGUKKy5zMmNob29sdGVhMmNoCisuc2Nob29sdGVhY2hlMgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOWU4cjhzLgorLnNjaG9vbHRlYWNoM2U0cjFzMgorLnNjOHI4dTl0OGk5bjh5LgorLnNjcnUydDFpNW4KKy5zY3I0dTF0MmkKKy5zY3J1dDRpbnkKKy5zYzh5OHQ4aDlpOG44Zy4KKy5zMWN5Cisuc2N5M3RoaW4KKy5zZThsOGw5ZThyLgorLnNlbDJsZQorLnNlOGw4bDllOHI4cy4KKy5zZWxsZTRyMXMyCisuc2U4YzlyOGU5dDhhOHI5aThhOHQuCisuc2UxY3IKKy5zZTRjM3JlMXRhCisuc2VjcmV0MmEycgorLnNlY3JldGFyMWkKKy5zZWNyZXRhcjJpM2EKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dDhzLgorLnNlY3JldGFyaWE0dDFzMgorLnNlOG05YTlwOGg4bzhyOGUuCisuc2UxbWEKKy5zZTRtYXAKKy5zZW1hcGhvNHIKKy5zZThtOWE5cDhoOG84cjhlOHMuCisuc2U5bThlOHM5dDhlOHIuCisuNHNlMW1lCisuc2UybWVzCisuc2U4bThpOWQ4ZThmOWk5bjhpOHQ4ZS4KKy5zZW0yaWQKKy5zZW1pZGUxZgorLnNlbWlkZWY1aTVuMml0ZQorLnNlbWlkZTFmaQorLnNlbWlkZTJmaW4KKy5zZW1pZGVmMmluaQorLnNlbWlkZWZpbjJpdAorLnNlOG04aTlkOGk5cjhlOGM4dC4KKy5zZW1pMmRpCisuc2VtaWQ0aXIyCisuc2VtaWRpMXJlCisuc2VtaWRpcmUyYzF0Cisuc2U4bThpOWg4bzltOG85dDhoOGU4dDlpOGMuCisuc2VtaTNoCisuc2VtaWhvMW1vCisuc2VtaWhvbTRvdGgzCisuc2VtaWhvbW90aDJlCisuc2VtaWhvbW8zdGhlNHQKKy5zZW1paG9tb3RoZXQxaWMKKy5zZThtOGk5cjhpOG44Zy4KKy5zZW00aXIKKy5zZW1pcjFpCisuc2VtaXJpbjRnCisuc2U4bThpOXI4aThuOGc4cy4KKy5zZW1pcmluZ3MyCisuc2U4bThpOXM4aThtOXA4bDhlLgorLnNlNG0yaXMKKy5zZW1pc2k0bTFwCisuc2VtaXNpbTFwMmwyCisuc2U4bThpOXM4azhpOGw4bDhlOGQuCisuc2VtNGlzNGsyCisuc2VtaXNrMWkKKy5zZW1pc2s0aWwxbAorLnNlbWlza2lsMmxlCisuc2U4cjhvOWU4cDhpOWQ4ZTltOGk5bzlsOG84ZzlpOWM4YThsLgorLnMyZXI0bworLnNlcm80ZQorLnNlcm9lcDRpZAorLnNlcm9lcGkzZGUKKy5zZXJvZXBpZDRlbQorLnNlcm9lcGlkZW0yaW8KKy5zZXJvZXBpZGVtaTFvbAorLnNlcm9lcGlkZW1pbzNsb2cxaWMKKy5zZXJvZXBpZGVtaW9sb2dpMWNhCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG0uCisuNHNlcjN2bworLnNlcnZvMm1lCisuc2Vydm9tZTJjaAorLnNlcnZvbWVjaDVhNW5pcworLnNlcnZvbWVjaGEybgorLnNlcnZvbWVjaGFuaTJzMW0KKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bThzLgorLnNlcnZvbWVjaGFuNGlzNG0xczIKKy5zZThzOXE4dThpOXA4ZTlkOGE5bDhpOGE4bi4KKy5zMWU0cworLnNlc3F1MgorLnNlc3EydWkyCisuc2VzcXUyaXAKKy5zZXNxdWlwZTQKKy5zZXNxdWkycDJlZAorLnNlc3F1aXAyZTJkMmEKKy5zZXNxdWlwZWRhbDFpCisuc2VzcXVpcGVkYWwyaTFhCisuc2VzcXVpcGVkYWxpMmEybgorLnNlOHQ5dThwLgorLnNlMXR1Cisuc2U4dDl1OHA4cy4KKy5zZXR1MnAxczIKKy5zZTl2OGU4cjhlOWw4eS4KKy41c2V2Cisuc2V2MWVyCisuc2V2NGVyZWwKKy5zZXZlcmUxbHkKKy5zaDhhOHA4ZTlhOGI4bDhlLgorLnNoYTNwZTRhCisuc2hhcGUxYTRiCisuc2hhcGVhYjJsMgorLnNoOG84ZTlzOHQ4cjhpOG44Zy4KKy5zaG80Cisuc2hvMmVzdDRyCisuc2hvZXN0cmluNGcKKy5zaDhvOGU5czh0OHI4aThuOGc4cy4KKy5zaG9lc3RyaW5nczIKKy5zaThkOGU5czh0OGU4cC4KKy41c2lkZTRzMgorLnMyaWQKKy5zaWRlc3RlNHAKKy5zaThkOGU5czh0OGU4cDhzLgorLnNpZGVzdGUycDFzMgorLnNpOGQ4ZTlzOHc4aThwOGUuCisuc2lkZXM0dzIKKy5zaWRlc3dpMgorLnNpZGVzdzJpcAorLnNpZGVzd2lwZTQKKy5zazh5OXM4YzhyOGE4cDhlOHIuCisuc2syCisuc2t5czRjCisuc2t5c2NyYXAzZXIKKy5zazh5OXM4YzhyOGE4cDhlOHI4cy4KKy5za3lzY3JhcGU0cjFzMgorLnNtOG84azhlOXM4dDhhOGM4ay4KKy4yczFtCisuczFtbworLnM0bTJvaworLnNtb2tlczQKKy5zbW9rZXMxdGEKKy5zbW9rZXN0YWNrMQorLnNtOG84azhlOXM4dDhhOGM4azhzLgorLnNtb2tlc3RhYzRrMXMyCisuc244bzhyOWs4ZThsOWk4bjhnLgorLnMxbjQKKy5zbm9ya2U1bDJpCisuc25vcmtlNGwzaW5nCisuc285bDhlOW44bzhpOGQuCisuMXNvCisuc29sNGVubworLnNvbGVub2kyCisuc29sZW5vMmlkCisuc285bDhlOW44bzhpOGQ4cy4KKy5zb2xlbm9pMmQxczIKKy5zbzhsOHU4dDhlLgorLnNvMWx1dAorLnNvOGw4dTh0OGU4cy4KKy5zbzh2OWU4cjllOGk4ZzhuLgorLjRzb3YKKy5zb3ZlcmVpMgorLnNvdmVyZTJpZzIKKy5zbzh2OWU4cjllOGk4ZzhuOHMuCisuc292ZXJlaWcybjFzMgorLnNwOGE5YzhlOHMuCisuMnMxcGEKKy5zcGE0Y2UKKy5zcDhlOWM4aThvOHU4cy4KKy5zcGUyYworLnNwZTFjMmkKKy5zcGVjMmlvCisuc3BlY2lvdTIKKy5zcGVjaW8ydXMKKy5zcDhlOGw4bDllOHIuCisuc3BlbDFsCisuc3BlbDJsZQorLnNwOGU4bDhsOWU4cjhzLgorLnNwZWxsZTRyMXMyCisuc3A4ZThsOGw5aThuOGcuCisuc3BlbGwyaQorLnNwZWwybGluNAorLnNwOGU5bDh1OG44azllOHIuCisuc3BlbHU0bmsyCisuc3BlbHVuazFlcgorLnNwOGU4bjhkOXQ4aDhyOGk4Zjh0LgorLnNwZW40ZAorLnNwZW5kMnRoCisuc3BlbmR0NGhyNAorLnNwZW5kdGhyNGkyZnQKKy5zcDhoOGU4cjlvOGk4ZC4KKy5zMnBoZQorLjNzcGg0ZXIKKy5zcGgyZXJvCisuc3BoZXJvaTIKKy5zcGhlcm8yaWQKKy5zcDhoOGU4cjlvOGk4ZDlhOGwuCisuc3BoZXJvaTFkMmEKKy5zcDhoOGk4bjlnOGU4cy4KKy5zcGg1aW5nCisuc3BoNGluZ2UKKy5zcDhpOGM5aTlsOHkuCisuc3AyaTFjaQorLnNwaWNpMWx5Cisuc3A4aThuOW84cjhzLgorLnNwaTJuCisuc3A0aTFubworLnNwaW5vNHJzMgorLnNwOG84azhlOHM5dzhvOG04YThuLgorLnNwMm9rCisuc3Bva2VzNAorLnNwb2tlczR3MgorLnNwb2tlNHMxd28yCisuc3Bva2Vzd29tMQorLnNwb2tlc3dvMW1hCisuc3Bva2Vzd29tYTJuCisuc3A4bzhrOGU4czl3OG84bThlOG4uCisuc3Bva2Vzd28ybWUKKy5zcG9rZXN3bzFtZW4KKy5zcDhvOHI4dDhzOWM4YThzOHQuCisuczFwNG9yNAorLnNwb3I0dDFzMgorLnNwb3J0NHNjCisuc3BvcnRzMWNhCisuc3A4bzhyOHQ4czljOGE4czh0OWU4ci4KKy5zcG9ydHNjYXN0NWVyCisuc3A4bzhyOXQ4aTh2OGU5bDh5LgorLnNwb3IxdGkKKy5zcG9yNHQyaXYKKy5zcG9ydGl2NGUxbHkKKy5zcDhvOHI4dDhzOXc4ZThhOHIuCisuc3BvcnQ0c3cyCisuc3BvcnRzd2UyYTJyCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4ci4KKy5zcG9ydHN3cmk0Cisuc3BvcnRzd3IyaXRlCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4cjhzLgorLnNwb3J0c3dyaXQ1ZTRyMXMyCisuc3A4cjhpOGc4aDh0OWw4aThlOHIuCisuc3ByMgorLnNwcjJpZworLnNwcmlnaDJ0bAorLnNwcmlnaHRsMmllNAorLnNxOHU4ZThhOW04aThzOGguCisuc3F1MgorLnNxdWVhbTJpcworLnNxdWVhbWlzMmgKKy5zdDhhOG44ZDlhOGw4bzhuOGUuCisuNXN0NGFuZAorLnN0YTJuCisuc3RhbjFkMmEKKy5zdGFuZGFsbzJuCisuc3Q4YThyOXQ4bDhpOG44Zy4KKy5zdDJhMnIKKy5zdGFyMnRsCisuc3Q4YThyOXQ4bDhpOG44ZzlsOHkuCisuc3RhcnRsaW5nbDIKKy5zdGFydGxpbmcxbHkKKy5zdDhhOXQ4aThzOXQ4aThjOHMuCisuc3RhdGlzMXQyaQorLnN0YXRpczF0aWMKKy5zdGF0aXN0aTRjM3MyCisuc3Q4ZThhOGw4dDhoOWk4bDh5LgorLnN0ZWE0bAorLnN0ZWE0bHQKKy5zdGVhbHRoM2kKKy5zdGVhbDR0aDRpbDIKKy5zdGVhbHRoaTFseQorLnN0OGU4ZThwOGw4ZTljOGg4YThzOGUuCisuczF0ZWUKKy5zdGVlNHAxCisuc3RlZTFwMmwyCisuc3RlZXBsZTJjaAorLnN0OGU4cjhlOG85ZzhyOGE4cDhoOWk4Yy4KKy5zdGVyZTFvCisuc3RlcmVvMmcKKy5zdGVyZW8xZ3IKKy5zdGVyZW81Z3JhcGgxaWMKKy5zdGVyZW9ncjRhcGhpCisuc3Q4bzljOGg4YThzOXQ4aThjLgorLnMxdG8KKy5zdG8yY2g0Cisuc3RvY2hhc3QyaQorLnN0b2NoYXMxdGljCisuc3Q4cjhhOG44ZzhlOW44ZThzOHMuCisuc3Q0cgorLnMxdHJhCisuc3RyYW40Z2UKKy5zdHJhMm4KKy5zdHIyYW5nCisuc3RyYW5nZTRuNGUKKy5zdHJhbjFnZW4KKy5zdHJhbmdlMW5lcworLnN0cmFuZ2VuMmUyc3MKKy5zdDhyOGE4cDloOGE4bjhnOGU4ci4KKy5zdHJhcGgyYW40ZworLnN0cmFwaGFuZzVlcgorLnN0cmFwaGEybgorLnN0OHI4YTh0OWE5ZzhlOG0uCisuc3RyYTJ0YQorLnN0OHI4YTh0OWE5ZzhlOG04cy4KKy5zdHJhdGFnZTRtMXMyCisuc3Q4cjhlOHQ4YzhoOWk5ZThyLgorLnN0cmU0dGMKKy5zdHJldDRjaAorLnN0cmV0Y2gyaWU0Cisuc3Q4cjhpOHA5dDhlOGE4czhlLgorLnN0cjJpcAorLnN0cmkycDF0Cisuc3RyaXAydGUKKy5zdDhyOG84bjhnOWg4bzhsOGQuCisuc3RybzJuCisuc3Ryb25naG8ybDJkCisuc3Q4cjhvOG44ZzllOHM4dC4KKy5zdDh1OXA4aThkOWU4ci4KKy5zMXR1Cisuc3R1cDRpZAorLnN0dXBpM2RlCisuc3Q4dTlwOGk4ZDllOHM4dC4KKy5zdHVwaWRlNHMyCisuc3U4YjlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4xc3UKKy5zdTRiMworLnN1NGIxZAorLnN1YmQxaWYKKy5zdWJkaTRmMWYKKy5zdWJkaWZmZXIxCisuc3ViZGlmZmVyM2VuMXQKKy5zdWJkaWZmZXJlbnQyaQorLnN1YmRpZmZlcmVuMXQyaTFhCisuc3ViZGlmZmVyZW50aTJhbAorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bi4KKy5zdWI0ZQorLnN1YjFleDNwCisuc3ViZXhwcjIKKy5zdWJleDNwcjJlMnNzCisuc3ViZXhwcmVzMXNpCisuc3ViZXhwcmVzMXMyaW8KKy5zdWJleHByZXM1c2lvMm4KKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG44cy4KKy5zdWJleHByZXNzaW8ybjNzMgorLnN1OG05bThhOWI4bDhlLgorLnN1Mm0KKy5zdW0xbQorLnN1bTFtYQorLnN1bTJtYWIKKy5zdW1tYWIybDIKKy5zdThwOGU4cjllOGc4by4KKy5zdTFwZQorLnN1cGVyZTFnbworLnN1OHA4ZThyOWU4ZzhvOHMuCisuc3VwZXJlNGdvcworLnN1OXA4cjhlOG05YTljOGk4czh0LgorLnN1cHIyCisuc3VwcmU0bWFjCisuc3VwcmUxbWEKKy5zdXByZW00YTJjaQorLnN1OXA4cjhlOG05YTljOGk4czh0OHMuCisuc3VwcmVtYWNpczR0MXMyCisuc3U4cjl2OGU4aThsOWw4YThuOGM4ZS4KKy5zdTJyCisuc3VydjRlCisuc3VydmVpMgorLnN1cnZlaWwxbAorLnN1cnZlaWxsYTJuCisuc3c4aThtOW04aThuOGc5bDh5LgorLnN3MgorLnN3aTIKKy5zd2ltMW0KKy5zd2ltbTRpbmdsMgorLnN3aW1tNWluZzFseQorLnN5OG04cDl0OG85bThhOHQ4aThjLgorLnN5NG0xcAorLnN5bTJwMXQKKy5zeW1wMXRvCisuc3ltcHRvMm1hCisuc3ltcHRvbWF0MWljCisuc3k4bjljOGg4cjhvOW04ZThzOGguCisuc3luM2M0aHI0Cisuc3luMmNoCisuc3luY2hybzJtZQorLnN5bmNocm8ybWVzCisuc3luY2hyb200ZXMyaAorLnN5OG45YzhoOHI4bzluOG84dThzLgorLnN5bmNocm8ybgorLnN5bmNocm8xbm91MgorLnN5bmNocm9ubzJ1cworLnN5OG45YzhoOHI4bzl0OHI4bzhuLgorLnN5bmNocm90cm8ybgorLnRhOGY4ZjlyOGE4aThsLgorLjR0YTJmNAorLnRhNGYxZjQKKy50YWZmcjJhaTIKKy50YThsOGs5YTl0OGk4djhlLgorLnRhMmwKKy40dGFsaworLnRhbGthMworLnRhbGthNHQKKy50YWxrYTF0Mml2CisudGE5cDhlOHM5dDhyOHkuCisudGFwMmVzdDRyCisudGFwZTRzdHJ5CisudGE5cDhlOHM5dDhyOGk4ZThzLgorLnRhcGVzdHIyaWU0CisudGE4cjlwOGE4dTlsOGk4bi4KKy50MmEycgorLnRhcjJwCisudGFyMXBhCisudGFycGF1NGwyCisudGFycGF1bDJpCisudGE4cjlwOGE4dTlsOGk4bjhzLgorLnRhcnBhdWwyaTJuMXMyCisudGU5bDhlOGc5cjhhOXA4aDhlOHIuCisudGVsZTFncgorLnRlbGVnNXJhM3BoNGVyCisudGU5bDhlOGc5cjhhOXA4aDhlOHI4cy4KKy50ZWxlZ3JhcGhlNHIxczIKKy50ZThsOGU5azhpOW44ZTh0OWk4Yy4KKy50ZWxla2k0bgorLnRlbGVrMWkKKy50ZWxlazJpbmUKKy50ZWxla2kzbmV0MWljCisudGU4bDhlOWs4aTluOGU4dDlpOGM4cy4KKy50ZWxla2luZXRpNGMzczIKKy50ZThsOGU5cjhvOWI4bzh0OWk4YzhzLgorLnRlNGwxZXIKKy50ZWw0ZXJvCisudGVsZXI1b2IKKy50ZWxlcm9ib3RpNGMzczIKKy50ZThsOGw5ZThyLgorLnRlbDFsCisudGVsMmxlCisudGU4bDhsOWU4cjhzLgorLnRlbGxlNHIxczIKKy50ZThtOXA4bzlyOGE4cjlpOGw4eS4KKy50ZTRtMXAKKy50ZW0xcDRvcgorLnRlbXBvMXJhCisudGVtcG80cmFyaWwKKy50ZW1wb3IyYTJyCisudGVtcG9yYXIxaQorLnRlbXBvcmFyaTFseQorLnRlOG45dThyOGUuCisudGU4czh0OWI4ZThkLgorLnRlczJ0MWIKKy50ZXN0NGJlMmQKKy50ZTh4OHQ5dzhpOGQ4dDhoLgorLjN0ZXgKKy50ZXgxdDIKKy50ZXh0dzQKKy50ZXh0d2kyCisudGV4dHcyaWQKKy50ZXh0d2lkMnRoCisudGg4YThsOWE5bTh1OHMuCisudGhhM2xhCisudGhhbGEzbQorLnRoYWxhMW11CisudGhhbGFtMnVzCisudGg4ZThyOW04bzllOGw4YThzOXQ4aThjLgorLnRoMmUKKy50aGVyM200CisudGhlcjFtbworLnRoZXJtbzRlbAorLnRoZXJtb2UxbGEKKy50aGVybW9lbGFzdDJpCisudGhlcm1vZWxhczF0aWMKKy50aThtOGU5czh0OGE4bThwLgorLnRpMm1lcworLnRpbWVzMXRhCisudGltZXN0YTRtMXAKKy50aThtOGU5czh0OGE4bThwOHMuCisudGltZXN0YW0ycDFzMgorLnRvOG84bDlrOGk4dC4KKy50b28yCisudG9vbGsxaQorLnRvOG84bDlrOGk4dDhzLgorLnRvb2xraTR0MXMyCisudG84cDhvOWc4cjhhOHA4aDlpOWM4YThsLgorLnRvNXBvNGcKKy50b3BvMWdyCisudG9wbzVncmFwaDFpYworLnRvcG9ncjRhcGhpCisudG9wb2dyYXBoaTFjYQorLnRvOHE4dThlOHMuCisudG8xcQorLnRvcXUyCisudHI4YThpOXQ4bzhyOW84dThzLgorLjF0cmEKKy50cjJhaTIKKy50cmFpMXRvCisudHJhaXRvcm91MgorLnRyYWl0b3JvMnVzCisudHI4YThuOHM5YzhlOGk4djhlOHIuCisudHJhMm4KKy50cmEybjFzMgorLnRyYW5zNGMKKy50cmFuNHMzY2VpMgorLnRyYW5zY2UyaXYKKy50cjhhOG44czljOGU4aTh2OGU4cjhzLgorLnRyYW5zY2VpdmU0cjFzMgorLnRyOGE4bjhzOWc4cjhlOHM4cy4KKy50cmFuMnMzZworLnRyYW5zMWdyCisudHJhbnNncjJlMnNzCisudHI4YThuOHM5djhlOHI5czhhOGwuCisudHJhbjRzdgorLnRyYW5zdmU0cjFzMgorLnRyYW5zdmVyMXNhMgorLnRyOGE4bjhzOXY4ZThyOXM4YThsOHMuCisudHJhbnN2ZXJzYTJsMXMyCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZS4KKy50cmFuc3Y0ZTJzCisudHJhbnN2ZXN0MmkKKy50cmFuc3Zlc3QyaXRlCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZThzLgorLnRyYW5zdmVzdGl0NGVzCisudHI4YTl2OGU4cjhzOWE5YjhsOGUuCisudHJhdmU0cjFzMgorLnRyYXZlcjFzYTIKKy50cmF2ZXIyczFhYgorLnRyYXZlcnNhYjJsMgorLnRyOGE5djhlOHI5czhhOGwuCisudHI4YTl2OGU4cjlzOGE4bDhzLgorLnRyYXZlcnNhMmwxczIKKy50cjhpOWU4dDhoOHk4bDlhOG04aThuOGUuCisudHJpNWV0CisudHIyaWU0CisudHJpZXRoeTNsYQorLnRyaWV0aHlsYW0xaW4KKy50cmlldGh5bGFtMmluZQorLnRyOGU4YThjOGg5ZThyOGk4ZThzLgorLnRyZWEyY2gKKy50cmVhY2hlMgorLnRyZWFjaGVyMWkKKy50cmVhY2hlcjJpZTQKKy50cjhvOHU5YjhhOWQ4bzh1OHIuCisudHJvdTIKKy50cm91YmEyZAorLnRyb3ViYTFkbworLnRyb3ViYWRvdTIKKy50dThyOWs4ZTh5LgorLjF0dQorLnR1OHI5azhlOHk4cy4KKy50dXJrZXlzNAorLnR1OHI4bjlhOHI4bzh1OG44ZC4KKy50dXI0bjJhMnIKKy50dXIxbmEKKy50dXJuYXJvdTIKKy50dXJuYXJvdW4yZAorLnR1OHI4bjlhOHI4bzh1OG44ZDhzLgorLnR1cm5hcm91bjJkMXMyCisudHk4cDlhOGwuCisuMXR5CisudHkxcGEKKy50eXA0YWwKKy51bjlhOHQ5dDhhOGM4aDhlOGQuCisudW4yYXQ0CisudW5hNHQzdDIKKy51bmF0MXRhCisudW5hdHRhMmNoCisudW5hdHRhY2hlMgorLnVuYXR0YTRjaDRlZAorLnVuOWU4cjhyOWk4bjhnOWw4eS4KKy51bjRlcgorLnVuZXI0cjQKKy51bmVycmluNGcKKy51bmVycmluZ2wyCisudW5lcnJpbmcxbHkKKy51bjlmOHI4aThlOG44ZDlsOHkuCisudW4zZgorLnVuZnJpMgorLnVuZnIyaWU0CisudW5mcmllbjJkMWx5CisudW45ZjhyOGk4ZThuOGQ5bDhpOWU4ci4KKy51bmZyaWVuZGwyaWU0CisudmE4Zzh1OGU4ci4KKy4xdmEKKy52YWc0CisudmE1Z3VlcgorLnZhMmd1ZQorLnZhOHU4ZDhlOXY4aThsOGw4ZS4KKy52YXVkZTF2NAorLnZhdWRlMnYzaTRsCisudmF1ZGUxdmkKKy52YXVkZXZpbDFsCisudmF1ZGV2aWwybGUKKy52aThjOWE4cjhzLgorLnY0aWMyYTJyCisudmkxY2EKKy52aWNhNHJzMgorLnZpOGw5bDhhOGk4bjllOHM4cy4KKy4ydmlsCisudmlsMWwKKy52aWxsYWkyCisudmlsbGE0aTRuCisudmlsbGEyaW5lCisudmlsbGFpNW4yZTJzcworLnZpbGxhaTFuZXMKKy52aThzOXU4YThsLgorLnZpM3N1CisudmlzdTFhbAorLnZpOHM5dThhOGw5bDh5LgorLnZpc3VhbDFsCisudmlzdWFsMWx5Cisudmk5djhpOHA5YTlyOG84dThzLgorLjN2Mml2Cisudml2Mmk0cAorLnZpdmkxcGEKKy52aXZpcDJhMnIKKy52aXZpcGFyb3UyCisudml2aXBhcm8ydXMKKy52bzhpOGM4ZTlwOHI4aThuOHQuCisudm9pNAorLnZvaTNjZXAKKy52b2ljZXByMgorLnZvaWNlcHJpbjR0MworLnZzOHA4YThjOGUuCisudjJzMXBhCisudnNwYTRjZQorLndhOGQ5ZDhpOG44Zy4KKy53YTJkCisud2FkNGQxaW4KKy53YWQxZDQKKy53YThsOGw5ZjhsOG84dzhlOHIuCisud2FsMWwKKy53YWwybGYKKy53YWxsZjRsMgorLndhbGxmbG93MWVyCisud2E4bDhsOWY4bDhvOHc5ZThyOHMuCisud2FsbGZsb3dlNHIxczIKKy53YThyOG05ZThzOHQuCisudzJhMnIKKy53YXIxbQorLndhcjJtZQorLndhcjJtZXMKKy53YThzOHQ4ZTl3OGE4dDhlOHIuCisud2FzNHQKKy53YXN0ZTJ3Cisud2FzdGUxdzVhCisud2FzdGV3YTF0ZQorLndhOHY4ZTlnOHU4aThkOGUuCisud2F2ZWczCisud2F2ZWcydWkyCisud2F2ZWd1MmlkCisud2E4djhlOWc4dThpOGQ4ZThzLgorLndhdmVndWlkZTRzMgorLndhOHY4ZTlsOGU4dC4KKy53YTh2OGU5bDhlOHQ4cy4KKy53YXZlbGU0dDFzMgorLndlOGI5bDhpOGs4ZS4KKy53MmUxYgorLndlYjJsMgorLndlYjNsNGlrCisud2U4ZThrOW44aThnOGg4dC4KKy53ZWVrbjJpZworLndlOGU4azluOGk4ZzhoOHQ4cy4KKy53ZWVrbmlnaDR0MXMyCisud2g4ZThlOGw5YzhoOGE4aThyLgorLndoZWU0bDFjMgorLndoZWVsMmNoCisud2hlZWxjaGFpMgorLndoZWVsY2hhNGlyCisud2g4ZThlOGw5YzhoOGE4aThyOHMuCisud2hlZWxjaGFpNHJzMgorLndoOGk4YzhoOWU4djhlOHIuCisud2hpNAorLndoNGkyY2gKKy53aGljaGUyCisud2hpY2hldjFlcgorLndoOGk4dDhlOXM4aThkOGU4ZC4KKy53aDJpdGUKKy53aGl0NGVzCisud2hpdGUxc2kKKy53aGl0ZTJzMmlkCisud2hpdGVzaTJkMWVkCisud2g4aTh0OGU5czhwOGE4YzhlLgorLndoaXRlMXNwCisud2hpdGUyczFwYQorLndoaXRlc3BhNGNlCisud2g4aTh0OGU5czhwOGE4YzhlOHMuCisud2k4ZDhlOXM4cDhyOGU4YThkLgorLncyaWQKKy53aWRlNHMyCisud2lkZTFzcAorLndpZGVzNHByZQorLndpZGVzcHIyCisud2lkZXNwcmVhMmQxCisud2k4bjhnOXM4cDhhOG4uCisud2luNGcKKy53aW5nczIKKy53aW5nMnMxcGEKKy53aW5nc3BhNG4KKy53aThuOGc5czhwOGE4bjhzLgorLndpbmdzcGEybjFzMgorLndpOG44ZzlzOHA4cjhlOGE4ZC4KKy53aW5nc3ByMgorLndpbmdzcHJlYTJkMQorLndpOHQ4YzhoOWM4cjhhOGY4dC4KKy53aTR0YworLndpdDRjaAorLndpdGNoY3JhMmY0dAorLndpdGNoY3JhMmYKKy53bzhyOGQ5czhwOGE4YzlpOG44Zy4KKy4xd28yCisud29yMmQxczIKKy53b3JkczRwCisud29yZDJzMXBhCisud29yZHNwNGEyY2kKKy53b3Jkc3BhMmMxaW4KKy53b3Jkc3BhYzFpbmcKKy53bzhyOGs5YThyOG84dThuOGQuCisud29yazJhMnIKKy53b3JrYXJvdTIKKy53b3JrYXJvdW4yZAorLndvOHI4azlhOHI4bzh1OG44ZDhzLgorLndvcmthcm91bjJkMXMyCisud284cjhrOWg4bzhyOHM4ZS4KKy53b3JraDQKKy53b3JraG9yNHNlCisud29ya2hvNHJzMgorLndvOHI4azloOG84cjhzOGU4cy4KKy53b3JraG9yczNlNHMKKy53cjhhOHA5YThyOG84dThuOGQuCisud3JhNAorLndyYXAyYTJyNAorLndyYTFwYQorLndyYXBhcm91MgorLndyYXBhcm91bjJkCisud3I4ZTh0OGM4aDllOGQuCisud3JlNHRjCisud3JldDRjaAorLndyZXRjaGUyCisud3JldDRjaDRlZAorLndyOGU4dDhjOGg5ZThkOWw4eS4KKy53cmV0Y2hlMmQxbHkKKy55ZThzOXQ4ZThyOXk4ZThhOHIuCisueWVzNAorLnllc3RlcnllMmEycgorLmFsOWc4ZTliOHI4YThpOXM4YzhoOGUuCisuYWxnZWJyYTJpczFjCisuYWxnZWJyYWlzM2NoMgorLmFsZ2VicmFpc2NoZTIKKy5hbDlsOGU5ZzhoOGU5bjh5LgorLmFsMWwKKy5hbDJsZQorLmFsM2xlZworLmFsbGVnaGUybgorLmFyOWs4YThuOXM4YThzLgorLmFya2EybgorLmFya2FuMnNhMgorLmFya2EybjFzMgorLmF0OHA5YThzOGUuCisuYTR0MXAKKy5hdDFwYQorLmF0OHA5YThzOGU4cy4KKy5hdHBhczFlNHMKKy5hdThzOXQ4cjhhOGw5YThzOGk4YThuLgorLmEydXMKKy5hdXMxdDRyCisuYXVzMXRyYQorLmF1c3RyYWxhczJpMWEKKy5hdXN0cmFsYXNpMmEybgorLmF1OHQ4bzltOGE4dDhpOXM4aThlOHI5dDhlOHIuCisuYXV0b21hM3RpcworLmF1dG9tYXRpczJpZTQKKy5hdXRvbWF0aXNpZXJ0M2VyCisuYmU5ZDhpOGU5bjh1OG44Zy4KKy40YmUyZAorLmI0ZTNkaQorLmJlNWRpM2VuCisuYmVkMmllNAorLmJlZGllM251NG4KKy5iZThtOGI4by4KKy40YmU1bQorLmJlNG01YgorLmJpOGI5bDhpOW85ZzhyOGE5cDhoOGk5czhjOGg4ZS4KKy5iaWJsaW9ncjRhcGhpCisuYmlibGlvZ3JhcGgyaXMxYworLmJpYmxpb2dyYXBoaXMzY2gyCisuYmlibGlvZ3JhcGhpc2NoZTIKKy5ibzhzOXQ4bzhuLgorLjVib3M0CisuYm9zMXRvCisuYm9zdG8ybgorLmJyOG84dzhuOWk4YThuLgorLmJyb3duNWkKKy5icm93M240aTFhCisuYnJvd25pM2EybgorLmJyOHU4bjhzOXc4aThjOGsuCisuYnJ1Mm4KKy5icnUybjNzNAorLmJydW40c3cyCisuYnJ1bnN3aTIKKy5icnVuc3dpY2sxCisuYnU5ZDhhOXA4ZThzOHQuCisuYnUxZDJhCisuY2E4cjlpOGI5YjhlOGE4bi4KKy5jYXIxaQorLmNhcjRpYgorLmNhcmkyYjFiCisuY2FyaWIyYmUKKy5jYXJpYmJlYTJuCisuY2g4YThyOGw4ZThzOXQ4bzhuLgorLmNoYXI0bGU0CisuY2hhcjFsCisuY2hhcmxlczIKKy5jaGFybDRlczJ0bworLmNoYXJsZTNzdG8ybgorLmNoOGE4cjlsOG84dDh0OGU4czl2OGk4bDhsOGUuCisuY2hhcjNsbzQKKy5jaGFybG80dDN0MgorLmNoYXJsb3Q0dGVzCisuY2hhcmxvdHRlNHN2CisuY2hhcmxvdHRlczJ2aWwKKy5jaGFybG90dGVzdmlsMWwKKy5jaGFybG90dGVzdmlsMmxlCisuY285bDh1OG05YjhpOGEuCisuY29sdW00YmkKKy5jb2x1NG0xYgorLmNvbHVtYjJpMWEKKy5jejhlOGM4aDhvOXM4bDhvOXY4YTlrOGk4YS4KKy5jMnplNAorLmN6ZTJjaAorLmN6ZTNjaG8yCisuY3plY2hvczRsMgorLmN6ZWNob3M0bG92CisuY3plY2hvc2xvMXZhCisuY3plY2hvc2xvdmFrMWkKKy5jemVjaG9zbG92YWsyaTFhCisuZGU4bDlhOXc4YThyOGUuCisuZGUxbGEKKy5kZTRsYXcKKy5kZWxhdzJhMnIKKy5kaThqOGs5czh0OHI4YS4KKy5kaTNqCisuZGlqNGsxczIKKy5kaWprc3Q0cgorLmRpamtzMXRyYQorLmR1OGE4bjhlLgorLmQxdTFhCisuZHVhMm4KKy5keTluOGE5bThpOXM4YzhoOGUuCisuNWR5bgorLmR5MW5hCisuZHluYW0yaXMKKy5keW5hbTJpczFjCisuZHluYW1pczNjaDIKKy5keW5hbWlzY2hlMgorLmVuOGc5bDhpOHM4aC4KKy5lbmdsMgorLmVuZ2xpczJoCisuZXU4bDhlOHI5aThhOG4uCisuZXVsNGUKKy5ldTNsNGVyMWkKKy5ldWxlMXIyaTNhNAorLmV1bGVyaTJhMm4KKy5ldjhhOG45czh0OG84bi4KKy5lMXZhCisuZXZhMm4KKy5ldmFuNHN0CisuZXZhMm4xczIKKy5ldmFuczF0bworLmV2YW5zdG8ybgorLmZlOGI5cjh1OWE4cjh5LgorLmYyZTRiCisuZmUzYnIKKy5mZWJydTNhCisuZmVicnUyYTJyCisuZmU4czh0OXM4YzhoOHI4aThmOHQuCisuZmVzNHQxczIKKy5mZXN0NHNjCisuZmVzdHMyY2gyCisuZmVzdHNjNGhyNAorLmZlc3RzY2hyNGkyZnQKKy5mbDhvOHI5aTlkOGEuCisuZmxvcjJpZAorLmZsb3JpMWQyYQorLmZsOG84cjlpOWQ5aThhOG4uCisuZmxvcmkyZGkKKy5mbG9yaWQ1aTJhMm4KKy5mbG9yaTFkNGkzYQorLmZvOHI5czhjOGg4dThuOGc4czlpOG45czh0OGk5dDh1OHQuCisuZm9yczRjCisuZm9yczJjaDIKKy5mb3JzY2h1bmdzMgorLmZvcnNjaHVuZzJzMWluCisuZm9yc2NodW5nczJpMm4xczIKKy5mb3JzY2h1bmdzaW5zdDJpCisuZm9yc2NodW5nc2luc3RpMXR1CisuZnI4ZThlOWI4czhkLgorLmZyZTJlMWIKKy5mcmVlMmI1czIKKy5mcmVlYjRzNWQKKy5mdThuOGs5dDhzOGk4bzhuOGE4bC4KKy4zZnUKKy5mdTRuazIKKy5mdW5rNXQKKy5mdW5rNHQxczIKKy5mdW5rdDFzMmlvCisuZnVua3Q1c2lvMm4KKy5mdW5rdHNpbzFuNWEKKy5nYTh1OHM4czlpOGE4bi4KKy5nYTJ1cworLmdhdTJzcworLmdhdXMxc2kKKy5nYXVzczJpMWEKKy5nYXVzc2kyYTJuCisuZ2g4bzhzOHQ5czhjOHI4aThwOHQuCisuZ2hvczR0MXMyCisuZ2hvc3Q0c2MKKy5naG9zdHNjcmkyCisuZ2hvc3RzY3IyaXAKKy5naG9zdHNjcmkycDF0CisuZ2g4bzhzOHQ5djhpOGU4dy4KKy5naG9zNHR2CisuZ2hvc3R2MmllNAorLmdyOGE4czhzOW04YThuOG45aThhOG4uCisuZ3IyYXMKKy5ncmEyc3MKKy5ncmFzMnMxbQorLmdyYXNzM21hCisuZ3Jhc3NtYTJuMworLmdyYXNzbWE0bjFuMgorLmdyYXNzbWFuM240aTFhCisuZ3Jhc3NtYTJubmkzYTJuCisuZ3I4ZThpOGY4czl3OGE4bDhkLgorLmdyZWkyCisuZ3JlaTJmM3MKKy5ncmVpZnN3MgorLmdyZWlmc3dhMmxkCisuZ3I4bzh0OGg4ZThuOWQ4aThlOGM4ay4KKy5nNHJvCisuZ3JvNHRoMmUKKy5ncjRvdGgKKy5ncm90aGUybgorLmdyb3RoZW5kMmllNAorLmdyb3RoZW5kaWVjazEKKy5ncjh1OG44ZDlsOGU4aDlyOGU4bi4KKy5ncnUybgorLmdydW5kbGUxaDQKKy5ncnVuZGxlNGhyNAorLmhhOWQ4YTltOGE4cjhkLgorLmhhMmQKKy5oYTFkMmEKKy5oYWRhMm0yCisuaGFkNGExbWEKKy5oYWRhbTJhMnIKKy5oYThpOWY4YS4KKy5oYWkxZmEKKy5oYThtOGk4bDl0OG84bjlpOGE4bi4KKy5oYTRtCisuaGFtaTRsdAorLmhhbWlsMXRvCisuaGFtaWx0bzJuCisuaGFtaWx0bzNuNGkxYQorLmhhbWlsdG9uaTNhMm4KKy5oZThsOXM4aThuOGs4aS4KKy5oZTJsMXMyCisuaGVsMnMxaW4KKy5oZWxzNGk0bmsyCisuaGVsc2luazFpCisuaGU4cjltOGk4dDlpOGE4bi4KKy5oZXIzbWl0CisuaGVybWkxdGkKKy5oZXJtNGkxdDJpMWEKKy5oZXJtaXRpMmEybgorLmhpOGI4YjhzLgorLmhpMmIxYgorLmhpYjJiNXMyCisuaG84azlrOGE4aTlkOG8uCisuaDJvaworLmhva2s0CisuaG9ra2FpMgorLmhva2thMmlkCisuaG9ra2FpMWRvCisuamE4YzlrOG84dzlzOGs4aS4KKy41amEKKy5qYWNrMQorLmphY2tvd3NrMgorLmphY2tvd3NrMWkKKy5qYThuOXU5YThyOHkuCisuamEybgorLmphbjN1MWEKKy5qYW51MmEycgorLmphOXA4YTluOGU4czhlLgorLmphNHAKKy5qYTFwYQorLmphcGEybgorLmphcGExbmVzCisuamFwYW5lMXMyZQorLmthOGQ5bzhtOXQ4czhlOHYuCisua2EyZAorLmthMWRvCisua2FkbzRtdAorLmthZG9tNHQxczIKKy5rYWRvbXQ1c2V2Cisua2E4bjlzOGE4cy4KKy5rYTJuCisua2FuMnNhMgorLmthMm4xczIKKy5rYThyOGw4czlyOHU4aDhlLgorLmsyYTJyCisua2FyMWwKKy5rYXIybDFzMgorLmthcmxzMXIKKy5rbzhyOXQ4ZTl3OGU4Zy4KKy5rbzVyCisua3I4aThzOGg4bjhhLgorLmtyMmlzCisua3IzaXMyaAorLmtyaXMyaDFuCisua3Jpc2gxbmEKKy5rcjhpOHM4aDluOGE5aThzOG0uCisua3Jpc2huYWkyCisua3Jpc2huYWkyczFtCisua3I4aThzOGg5bjhhOG4uCisua3Jpc2huMmEybgorLmxhOG45YzhhOHM5dDhlOHIuCisubGFuMWNhCisubGFuY2FzdDVlcgorLmxlOWc4ZThuOGQ4cjhlLgorLmxlMWdlbgorLmxlZ2VuMWRyCisubGVnZW5kcmU0CisubGU4aThjOGU4czl0OGU4ci4KKy5sZWkyCisubGU1aWMKKy5sZWljZXM1dAorLmxpOHA5czhjOGg4aTh0OHouCisubDJpcAorLmxpMnAxczIKKy5saXBzMmNoMgorLmxpcHMzY2hpdAorLmxpcHNjaGk0dHoKKy5saThwOXM4YzhoOGk4dDh6OWk4YThuLgorLmxpcHNjaGl0MnoxaQorLmxpcHNjaGl0ejJpMWEKKy5saXBzY2hpdHppMmEybgorLmxvOGo5YjhhOG4uCisubG81agorLmxvamJhMm4KKy5sbzh1OWk5czhpOWE4bjhhLgorLmxvdTIKKy5sbzJ1aTIKKy5sb3VpczJpMWEKKy5sb3Vpc2kyYTJuCisubG91aXNpYTFuYQorLm1hOGM5bzhzLgorLm1hMWNvCisubWE4bjljOGg4ZThzOXQ4ZThyLgorLm1hbjJjaAorLm1hbmNoZTIKKy5tYW5jaDFlcworLm1hOHI5azhvOHY5aThhOG4uCisubWFya281dmkyYTJuCisubWFya292MmkxYQorLm1hOHI4azh0OW84YjhlOHI5ZDhvOHI4Zi4KKy5tYXJrNXQKKy5tYXJrMXRvCisubWFya3RvM2IKKy5tYXJrdG9iZXIxZG8KKy5tYXJrdG9iZXJkNG9yCisubWFya3RvYmVyZG9yMWYKKy5tYThzOHM5YTljOGg4dTlzOGU4dDh0OHMuCisubWEyc3MKKy5tYXMxc2EyCisubWFzc2EyY2gKKy5tYXNzYWNoMnVzCisubWFzc2FjaHVzZTR0M3QyCisubWFzc2FjaHVzZXQ0dDFzMgorLm1hOHg5dzhlOGw4bC4KKy5tYXh3ZWw0bAorLm1pOWM4cjhvOXM4bzhmOHQuCisubWljcm8yc28KKy5taWNyb3NvMmZ0MworLm1pOG45bjhlOWE4cDlvOWw4aThzLgorLm0yaTRuMW4yCisubWlubmU0CisubWlubmVhcG9sMmkKKy5taThuOW44ZTlzOG84dDhhLgorLm1pbjFuZXMKKy5taW5uZTFzbworLm1pbm5lc28xdGEKKy5tbzhzOWM4bzh3LgorLm1vczJjCisubW9zMWNvCisubmE4YzhoOXI4aThjOGg4dDhlOG4uCisuMW5hCisubmEyY2gKKy5uYWM0aHI0CisubmEyY2hyNGkyY2gKKy5uYWNocmljaHQxZW4KKy5uYThzOGg5djhpOGw4bDhlLgorLm40YXMKKy5uYXMyaAorLm5hc2gydmlsCisubmFzaHZpbDFsCisubmFzaHZpbDJsZQorLm5lOHQ5YjhzOGQuCisubmUydDFiCisubmV0MmI1czIKKy5uZXRiNHM1ZAorLm5lOHQ5czhjOGE4cDhlLgorLm5lNHQxczIKKy5uZXQ0c2MKKy5uZXRzY2E0cAorLm5ldHMxY2EKKy5uaThqOW04ZTlnOGU4bi4KKy5uaTNqCisubmlqbWUyZworLm5pam1lMWdlbgorLm5vOGU5dDhoOGU4cjlpOGE4bi4KKy4zbm9lCisubm9ldGgyZQorLm5vZXRoZXIxaQorLm5vZXRoZTFyMmkzYTQKKy5ub2V0aGVyaTJhMm4KKy5ubzhvOHI4ZDl3OGk4ajhrOGU4cjloOG84dTh0LgorLm5vbzIKKy5ubzNvcmQKKy5ub29yZDF3Cisubm9vcmR3aTIKKy5ub29yZHdpM2oKKy5ub29yZHdpamsxZXIKKy5ub29yZHdpamtlcjFoNAorLm5vb3Jkd2lqa2VyaG91MgorLm5vOXY4ZThtOWI4ZThyLgorLm5vdmU0bTViCisub3A4ZThuOWI4czhkLgorLm9wZTRuMWI0Cisub3BlbjJiNXMyCisub3BlbmI0czVkCisub3A4ZThuOW84ZjhmOGk4YzhlLgorLm9wNGVubworLm9wZW5vNGYxZgorLm9wZW5vZjFmaQorLnBhOGw4YTl0OGk4bjhvLgorLnBhbGEydDFpbgorLnBhbGF0Mmkxbm8KKy5wYTlsOGU4cjltOG8uCisucGFsZXIzbTQKKy5wYWxlcjFtbworLnBlOXQ4cjhvOHY5czhrOGkuCisucGV0cm8zdgorLnBldHJvdnNrMgorLnBldHJvdnNrMWkKKy5wZjhhOGY4ZjlpOGE4bi4KKy40cGYKKy5wMWZhCisucGZhMmYKKy5wZmE0ZjFmNAorLnBmYWYxZmkKKy5wZmFmZjJpM2EKKy5wZmFmZmkyYTJuCisucGg4aThsOWE5ZDhlOGw5cDhoOGk4YS4KKy5waGk0bDRhZGUKKy5waGlsYTJkCisucGhpbGFkZTJscAorLnBoaWxhZGVsNXBoaQorLnBoaWxhZGVscGgyaTFhCisucGg4aThsOW85czhvOHA4aDlpOXM4YzhoOGUuCisucGhpbG8yc28KKy5waGlsb3M0b3AKKy5waGlsb3Myb3BoCisucGhpbG9zb3BoMmlzMWMKKy5waGlsb3NvcGhpczNjaDIKKy5waGlsb3NvcGhpc2NoZTIKKy5wbzhpOG45YzhhOHI4ZS4KKy5wb2luMgorLnBvaTIKKy5wb2luYzJhMnI1CisucG9pbjFjYQorLnBvOXQ4ZThuOXQ4aThhOGw5ZzhsOGU4aTljOGg4dThuOGcuCisucDRvdAorLnBvMXRlbjF0CisucG90ZW50MmkKKy5wb3RlbjF0MmkxYQorLnBvdGVudGkyYWwKKy5wb3RlbnRpYTRsMWc0CisucG90ZW50aWFsZ2wyCisucG90ZW50aWFsMWdsZQorLnBvdGVudGlhbGdsZWkyCisucG90ZW50aWFsZ2xlNWljCisucG90ZW50aWFsZ2xlNGkyY2gKKy5yYTlkOGg4YTlrOHI4aThzOGg5bjhhOG4uCisucmFkMWgyCisucmFkaGFrcjJpcworLnJhZGhha3IzaXMyaAorLnJhZGhha3JpczJoMW4KKy5yYWRoYWtyaXNoMW5hCisucmFkaGFrcmlzaG4yYTJuCisucmE4dDhoOHM5azhlOGw5bDhlOHIuCisucjRhdGgKKy5yYTJ0NGgxczIKKy5yYXRoc2syCisucmF0aDRza2UKKy5yYXRoc2tlbDFsCisucmF0aHNrZWwybGUKKy5yaThlOW04YThuOG45aThhOG4uCisucjJpZTQKKy5yaWU1bWEybgorLnJpZTFtYQorLnJpZW1hNG4xbjIKKy5yaWVtYW4zbjRpMWEKKy5yaWVtYTJubmkzYTJuCisucnk4ZDliOGU4cjhnLgorLnJ5MWQKKy5yeWQxYgorLnJ5ZGJlcmcyCisuc2M4aDhvOHQ5dDhpOHM4YzhoOGUuCisuc2NobzR0M3QyCisuc2Nob3R0MmlzMWMKKy5zMmNoMm90dGlzM2NoMgorLnNjaG90dGlzY2hlMgorLnNjOGg4cjhvOWQ4aThuOGc5ZThyLgorLnNjNGhyNAorLnNjaHJvZDFpbgorLnNjaHJvZDRpbmdlCisuc2M4aDh3OGE5YjhhOWM4aDhlOHIuCisuc2NoMXcKKy5zY2h3YWJhMmNoCisuc2Nod2FiYWNoZTIKKy5zYzhoOHc4YThyOHo5czhjOGg4aThsOGQuCisuc2NodzJhMnIKKy5zMmNod2FyenMyY2gyCisuc2Nod2FyenNjaDRpbDIKKy5zY2h3YXJ6c2NoaTJsZAorLnNlOHA5dDhlOG05YjhlOHIuCisuc2UycDF0Cisuc2VwMnRlCisuc2VwdGU0bTViCisuc3Q4bzhrOGU4czlzOGM4aDhlLgorLnN0Mm9rCisuc3Rva2VzNAorLnN0b2syZTJzcworLnN0b2tlczJzNWMKKy5zdG9rZXNzMmNoMgorLnN0b2tlc3NjaGUyCisuc3Q4dTh0OHQ5ZzhhOHI4dC4KKy5zdHU0dDN0MgorLnN0dXQ0dDFnCisuc3R1dHQxZ2EKKy5zdHV0dGcyYTJyCisuc3U4czlxOHU4ZTloOGE4bjluOGEuCisuczJ1cworLnN1c3F1MgorLnN1c3F1ZTFoNAorLnN1c3F1ZWhhMm4KKy5zdXNxdWVoYTRuMW4yCisuc3VzcXVlaGFuMW5hCisudGE4dTliOGU4cjlpOGE4bi4KKy50YXU0YgorLnRhdWI0ZQorLnRhdTNiZXIKKy50YXViZXIxaQorLnRhdWJlMXIyaTNhNAorLnRhdWJlcmkyYTJuCisudGU4YzhoOW44aTlzOGM4aDhlLgorLnRlMmNoCisudGVjMmgxbgorLnRlY2huMmlzMWMKKy50ZTJjaG5pczNjaDIKKy50ZWNobmlzY2hlMgorLnRlOG45bjhlOHM5czhlOGUuCisudDRlNG4xbjIKKy50ZW5uZTQKKy50ZW4xbmVzCisudGVubjJlMnNzCisudG85bThhOXM4ejhlOHc5czhrOGkuCisudG8ybWEKKy50b21hczJ6ZQorLnRvbWFzemV3c2syCisudG9tYXN6ZXdzazFpCisudHk5cDhvOWc4cjhhOHA4aDhpOHE4dThlLgorLnR5M3BvCisudHk1cG80ZworLnR5cG8xZ3IKKy50eXBvZ3I0YXBoaQorLnR5cG9ncmFwaGlxdTIKKy51azhyOGE4aThuOWk4YThuLgorLjR1aworLnVrcjJhaTIKKy51a3JhNGk0bgorLnVrcmEyaW5pCisudWtyYWk0bjRpMWEKKy51a3JhaW5pM2EybgorLnZlOHI5YThsOGw5ZzhlOW04ZThpOG45ZThyOHQ4ZS4KKy52ZXJhbDFsCisudmVyYWw0bDFnNAorLnZlcmFsbGdlMW1lCisudmVyYWxsZ2VtZWkyCisudmVyYWxsZ2VtZTJpbmUKKy52ZXJhbGxnZW1laW4xZXIKKy52ZThyOWU4aThuOWk5Zzh1OG44Zy4KKy52ZXJlM2luCisudmVyZWkyCisudmVyZTJpbmkKKy52ZXJlaW4yaWcKKy52ZXJlaW5pM2d1bgorLnZlOHI5dDhlOGk5bDh1OG45ZzhlOG4uCisudmVydGVpMgorLnZlcnRlaWx1bjFnZW4KKy52aThpOGk4dDhoLgorLnY0aTVpNAorLnZpNGk1aTQKKy52aWkyaXRoCisudmk4aTh0OGguCisudmkyaXRoCisud2E4aDhyOXM4YzhoOGU4aThuOWw4aThjOGg5azhlOGk4dDhzOXQ4aDhlOG85cjhpOGUuCisud2E0aHI0Cisud2FoNHJzMgorLndhaHJzNGMKKy53YWhyczJjaDIKKy53YWhyc2NoZTIKKy53YWhyc2NoZWkyCisud2FocnNjaGU0aTRuMWwKKy53YWhyczJjaGVpbmw0aTJjaAorLndhaHJzY2hlaW5saWM0aGsKKy53YWhyc2NoZWlubGljaGtlaTIKKy53YWhyc2NoZWlubGljaGtlaTR0MXMyCisud2FocnNjaGVpbmxpY2hrZWl0czN0aDJlCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZTFvNXIKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlb3IyaWU0Cisud2U4cjluOGU4ci4KKy53MWVyCisud2VyNG4xZXIKKy53ZThyOXQ4aDhlOHI5aThhOG4uCisud2VydGgyZQorLndlcnRoZXIxaQorLndlcnRoZTFyMmkzYTQKKy53ZXJ0aGVyaTJhMm4KKy53aThuOWM4aDhlOHM5dDhlOHIuCisud2luMmNoCisud2luY2hlMgorLndpbmNoMWVzCisud2k4cjh0OXM4YzhoOGE4Zjh0LgorLnc0aXI0Cisud2lyNHQxczIKKy53aXJ0NHNjCisud2lydHMyY2gyCisud2lydHNjaGEyZgorLndpcnRzY2hhMmZ0Cisud2k4czlzOGU4bjlzOGM4aDhhOGY4dDlsOGk4YzhoLgorLnc0aTJzMXMKKy53aXNzZW40Cisud2lzc2UybjFzMgorLndpc3NlbnM0YworLndpc3NlbnMyY2gyCisud2lzc2Vuc2NoYTJmCisud2lzc2Vuc2NoYTJmdAorLndpc3NlbnNjaGFmMnRsCisud2lzc2VuczJjaGFmdGw0aTJjaAorLnh2OGk4aThpOHQ4aC4KKy54djRpNWk0CisueHZpNGk1aTQKKy54dmlpMml0aAorLnh2OGk4aTh0OGguCisueHZpMml0aAorLnh4OGk4aThpOHI4ZC4KKy54eDQKKy54eDNpCisueHg0aTVpNAorLnh4aTRpNWk0CisueHhpaTRpcgorLnh4OGk4aThuOGQuCisueHhpNGluZAorLnlpOG44Zzl5OG84bjhnLgorLnkxaQorLnlpbjJneQorLnlpbmd5MW80CisueWluZ3lvMm4KKy5zaDh1OXg4dThlLgorLnNodXgxdTMKKy5qaTlzOHU4YThuLgorLmppMnN1CisuamlzdWEybgorLnplOGE5bDhhOG44ZC4KKy4yemUKKy56ZWE0bAorLnplYTNsNGFuZAorLnplYWxhMm4KKy56ZThpOHQ5czhjOGg4cjhpOGY4dC4KKy56ZWkyCisuemVpNHQxczIKKy56ZWl0NHNjCisuemVpdHMyY2gyCisuemVpdHNjNGhyNAorLnplaXRzY2hyNGkyZnQKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGViNDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYwMzAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTE1YjEuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDQzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwppbmRleCAxMDVmN2QwLi5kYThhZmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmRiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZTJiMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9sb2FkaW5nX3RpbGVfYW5kcm9pZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbG9hZGluZ190aWxlX2FuZHJvaWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGU0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbG9hZGluZ190aWxlX2FuZHJvaWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9ub190aWxlXzI1Ni5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbm9fdGlsZV8yNTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbm9fdGlsZV8yNTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzMDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZTFlMmU0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY5NTk3OWEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmNmNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjUwYjMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNjOWRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyYzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjdjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUZXh0VmlldworICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKworICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA2MjUxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXcKKyAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAppbmRleCA3YWU2OGY5Li5iNzQ2ZDI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dXNlTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgogICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NjdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhbm5lciIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX21lZGl1bSIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCI+Ci0KLSAgICA8YW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2UgYW5kcm9pZDppZD0iQCtpZC9waG90byIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iLTFkaXAiCi0gICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiAvPgotICAgIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FnZ3JlZ2F0ZV9iYWRnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2FnZ3JlZ2F0ZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0JCMDAwMDAwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIyLjc1IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Bob25ldGljX25hbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVzZW5jZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAvPgotCi0gICAgPENoZWNrQm94Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9kZXNjcmlwdGlvbl9zdGFyIgotICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9zdGFyU3R5bGUiIC8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBjMWI0MDZmLi44MzM4MWExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApAQCAtNTgsMTggKzU4LDE5IEBACiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgogICAgICAgICAgICAgLz4KKwogICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKQEAgLTg0LDggKzg1LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAppbmRleCA3NGEwZWVlLi44ZGFjZmFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjU2c3AiCkBAIC03NCw4ICs3NCw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAppbmRleCA4Zjg2OTgxLi44NDRkMzM4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbApAQCAtNCwyMiArNCw1OCBAQAogKioKICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIKICAgICAvPgorCisgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2JhciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19idG5fYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY2tfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUmlnaHQ9IkBkcmF3YWJsZS9pY19idG5fbmV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNGI0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGggdGhlIEFjdGlvbiBCYXIgZW5hYmxlZC4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8QWN0aW9uQmFyVmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXIiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dBY3Rpb25CYXJTdHlsZSIgLz4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2NvbnRleHRfYWN0aW9uX2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMDk2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorICAgIDxXZWJWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2VidmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BsYXNoc2NyZWVuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRTdGFydCIKKyAgICAvPgorCis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmluZGV4IDhkNGZhNGUuLjNkMzFjMjcgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0xNCw4ICsxNCw4IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nIAotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiAKKzwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nCisgICAgIHRoZSBkb2N1bWVudGF0aW9uIG91dHB1dC4gVG8gc3VwcHJlc3MgY29tbWVudCBsaW5lcyBmcm9tIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgIG91dHB1dCwgaW5zZXJ0IGFuIGVhdC1jb21tZW50IGVsZW1lbnQgYWZ0ZXIgdGhlIGNvbW1lbnQgbGluZXMuCiAtLT4KIApAQCAtMjQ0LDYgKzI0NCwxMyBAQAogICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI1dpbmRvd0FuaW1hdGlvbn0uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgaGF2ZSBhbiBBY3Rpb24gQmFyCisgICAgICAgICAgICAgaW4gcGxhY2Ugb2YgdGhlIHVzdWFsIHRpdGxlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorCisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgc3R5bGUgZm9yIHRoZSBBY3Rpb24gQmFyIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNvZnQgaW5wdXQgc3RhdGUgdGhhdCB0aGlzIHdpbmRvdyB3b3VsZAogICAgICAgICAgICAgIGxpa2Ugd2hlbiBpdCBpcyBkaXNwbGF5ZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTb2Z0SW5wdXRNb2RlIj4KQEAgLTM5MCw2ICszOTcsMTIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTcGlubmVyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGRyb3Bkb3duIFNwaW5uZXIgc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBBY3Rpb25CYXIgZHJvcGRvd24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFjdGlvbiBidXR0b24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTdGFyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFRhYldpZGdldCBzdHlsZS4gLS0+CkBAIC00MjYsNiArNDM5LDEzIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAogICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIGJhciBzdHlsZXMgICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFtb3VudCBvZiBwYWRkaW5nIHRvIHVzZSBiZXR3ZWVuIGFjdGlvbiBidXR0b25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisKKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIFByZWZlcmVuY2Ugc3R5bGVzICAgLS0+CiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KICAgICAgICAgPGVhdC1jb21tZW50IC8+CkBAIC05NDgsNiArOTY4LDggQEAKICAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltRW5hYmxlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUFtb3VudCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBkZXNjcmliZSBhIEFsZXJ0RGlhbG9nJ3MgdGhlbWUuIC0tPgpAQCAtOTc0LDcgKzk5Niw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1Nob3dBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGdvaW5nIGZyb20gVklTSUJMRSB0byBJTlZJU0lCTEUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dIaWRlQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5LCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcwogICAgICAgICAgICAgICBydW4gb24gdGhlIG5leHQgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMTAxNSw3ICsxMDM3LDcgQEAKICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSB0b3AgYWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgdGFzawogICAgICAgICAgICAgICAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRhc2tUb0JhY2tFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgc2hvd3MgdGhlIHdhbGxwYXBlciwgd2hpbGUKICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgbmV3IHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgpAQCAtMTAzMiw3ICsxMDU0LDcgQEAKICAgICAgICAgICAgICAgY3VycmVudGx5IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBvbGQgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgaXMgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIKICAgICAgICAgICAgICAgd2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBhbHNvIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIG5ldyBhY3Rpdml0eQpAQCAtMTUyMCw2ICsxNTQyLDggQEAKICAgICAgICAgICAgICB3aWxsIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFkYXB0ZXIgYW5kIHRoZSBudW1iZXIgb2YgaXRlbXMgdmlzaWJsZQogICAgICAgICAgICAgIG9uIHNjcmVlbiB0byBkZXRlcm1pbmUgdGhlIHNjcm9sbGJhcidzIHByb3BlcnRpZXMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzbW9vdGhTY3JvbGxiYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBBIHJlZmVyZW5jZSB0byBhbiBYTUwgZGVzY3JpcHRpb24gb2YgdGhlIGFkYXB0ZXIgdG8gYXR0YWNoIHRvIHRoZSBsaXN0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWRhcHRlciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3MTUsNyArMTczOSw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0yMTM5LDcgKzIxNjMsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkFuY2hvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBiYXNpYyB3aWR0aCBvZiB0aGUgZHJvcGRvd24uIEl0cyB2YWx1ZSBtYXkKICAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCB3aWR0aCwKLSAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSAKKyAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZQogICAgICAgICAgICAgIHNjcmVlbiwgb3Igd3JhcF9jb250ZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZgogICAgICAgICAgICAgIHRoZSBhbmNob3JlZCB2aWV3LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iPgpAQCAtMjE3NSw4ICsyMTk5LDEzIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBoaWRkZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvdXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgd2hlbiB0aGUgVmlld0FuaW1hdGlvbgorICAgICAgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3RmxpcHBlciI+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZsaXBJbnRlcnZhbCIgZm9ybWF0PSJpbnRlZ2VyIiBtaW49IjAiIC8+CkBAIC0yMTk2LDYgKzIyMjUsMzAgQEAKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIHNwaW5uZXIncyBkaWFsb2cgaXMgc2hvd24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9tcHQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERpc3BsYXkgbW9kZSBmb3Igc3Bpbm5lciBvcHRpb25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lck1vZGUiIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhIGRpYWxvZyB3aW5kb3cuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZGlhbG9nIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gU3Bpbm5lciBvcHRpb25zIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIGFuIGlubGluZSBkcm9wZG93bgorICAgICAgICAgICAgICAgICBhbmNob3JlZCB0byB0aGUgc3Bpbm5lciB3aWRnZXQgaXRzZWxmLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRyb3Bkb3duIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIExpc3Qgc2VsZWN0b3IgdG8gdXNlIGZvciBzcGlubmVyTW9kZT0iZHJvcGRvd24iIGRpc3BsYXkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNlbGVjdG9yIiAvPgorICAgICAgICA8IS0tIEJhY2tncm91bmQgZHJhd2FibGUgdG8gdXNlIGZvciB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBWZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgc3Bpbm5lciB3aWRnZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcm9wZG93biBpbgorICAgICAgICAgICAgIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIEhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24KKyAgICAgICAgICAgICBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIFdpZHRoIG9mIHRoZSBkcm9wZG93biBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgLz4KKyAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBsYXlvdXQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGEgcHJvbXB0IGluIHRoZSBkcm9wZG93biBmb3IKKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiBUaGlzIGxheW91dCBtdXN0IGNvbnRhaW4gYSBUZXh0VmlldyB3aXRoIHRoZSBpZAorICAgICAgICAgICAgIEBhbmRyb2lkOmlkL3RleHQxIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBwcm9tcHQgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwUHJvbXB0VmlldyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRGF0ZVBpY2tlciI+CiAgICAgICAgIDwhLS0gVGhlIGZpcnN0IHllYXIgKGluY2x1c2l2ZSksIGZvciBleGFtcGxlICIxOTQwIi4gLS0+CkBAIC0yNTA2LDYgKzI1NTksMTAgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNaXBtYXBEcmF3YWJsZUl0ZW0iPgorICAgICAgICA8YXR0ciBuYW1lPSJkcmF3YWJsZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJvdGF0ZURyYXdhYmxlIj4KICAgICAgICAgPGF0dHIgbmFtZT0idmlzaWJsZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZnJvbURlZ3JlZXMiIGZvcm1hdD0iZmxvYXQiIC8+CkBAIC0zMjM3LDYgKzMyOTQsMTcgQEAKICAgICAgICAgPCEtLSBXaGV0aGVyIHRoZSBpdGVtIGlzIGVuYWJsZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogCisgICAgICAgIDwhLS0gTmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgQ29udGV4dCB1c2VkIHRvIGluZmxhdGUgdGhlIG1lbnUgdGhhdCB3aWxsIGJlCisgICAgICAgICAgICAgY2FsbGVkIHdoZW4gdGhlIGl0ZW0gaXMgY2xpY2tlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9uQ2xpY2siIC8+CisKKyAgICAgICAgPCEtLSBIb3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBBY3Rpb24gQmFyLCBpZiBwcmVzZW50LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic2hvd0FzQWN0aW9uIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibmV2ZXIiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iaWZSb29tIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImFsd2F5cyIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKwogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CkBAIC0zMzM5LDYgKzM0MDcsMTYgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSI+CisgICAgICAgIDwhLS0gVGhlIGh1bWFuLXJlYWRhYmxlIGFycmF5IHRvIHByZXNlbnQgYXMgYSBsaXN0LiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICBpbmRleCBpbiBlbnRyeVZhbHVlcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJpZXMiIC8+CisgICAgICAgIDwhLS0gVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgICAgICAgICBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgICAgICAgICBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBCYXNlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIFJpbmd0b25lUHJlZmVyZW5jZS4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJpbmd0b25lUHJlZmVyZW5jZSI+CiAgICAgICAgIDwhLS0gV2hpY2ggcmluZ3RvbmUgdHlwZShzKSB0byBzaG93IGluIHRoZSBwaWNrZXIuIC0tPgpAQCAtMzQ5MCw3ICszNTY4LDcgQEAKICAgICA8IS0tIEFwcFdpZGdldCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YXBwd2lkZ2V0LXByb3ZpZGVyPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gQXBwV2lkZ2V0IHByb3ZpZGVyLiAgU2VlIHtAbGluayBhbmRyb2lkLmFwcHdpZGdldCBhbmRyb2lkLmFwcHdpZGdldH0KICAgICAgICAgIHBhY2thZ2UgZm9yIG1vcmUgaW5mby4KQEAgLTM1MTMsNyArMzU5MSw0MCBAQAogICAgIDwhLS0gQXBwIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gVmlldyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggPGNvZGU+Jmx0O2ZyYWdtZW50Jmd0OzwvY29kZT4KKyAgICAgICAgIHRhZ3MgaW5zaWRlIG9mIHRoZSBsYXlvdXQgb2YgYW4gQWN0aXZpdHkuICBUaGlzIGluc3RhbnRpYXRlcworICAgICAgICAgdGhlIGdpdmVuIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH0gYW5kIGluc2VydHMgaXRzIGNvbnRlbnQKKyAgICAgICAgIHZpZXcgaW50byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0LiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnQiPgorICAgICAgICA8IS0tIFN1cHBseSB0aGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgY2xhc3MgdG8gaW5zdGFudGlhdGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGFuIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3LCB0byBsYXRlciByZXRyaWV2ZSBpdAorICAgICAgICAgICAgIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZCBWaWV3LmZpbmRWaWV3QnlJZCgpfSBvcgorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5kVmlld0J5SWQgQWN0aXZpdHkuZmluZFZpZXdCeUlkKCl9LgorICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcmVmZXJlbmNlOyB0eXBpY2FsbHkgeW91IHNldCB0aGlzIHVzaW5nIHRoZQorICAgICAgICAgICAgIDxjb2RlPkArPC9jb2RlPiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IElEIHJlc291cmNlcy4KKyAgICAgICAgICAgICBGb3IgZXhhbXBsZTogPGNvZGU+YW5kcm9pZDppZD0iQCtpZC9teV9pZCI8L2NvZGU+IHdoaWNoCisgICAgICAgICAgICAgYWxsb3dzIHlvdSB0byBsYXRlciByZXRyaWV2ZSB0aGUgdmlldworICAgICAgICAgICAgIHdpdGggPGNvZGU+ZmluZFZpZXdCeUlkKFIuaWQubXlfaWQpPC9jb2RlPi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImlkIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGEgdGFnIGZvciB0aGUgdG9wLWxldmVsIHZpZXcgY29udGFpbmluZyBhIFN0cmluZywgdG8gYmUgcmV0cmlldmVkCisgICAgICAgICAgICAgbGF0ZXIgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0VGFnIFZpZXcuZ2V0VGFnKCl9IG9yCisgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3V2l0aFRhZworICAgICAgICAgICAgIFZpZXcuZmluZFZpZXdXaXRoVGFnKCl9LiAgSXQgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlCisgICAgICAgICAgICAgSURzICh0aHJvdWdoIHRoZSBhbmRyb2lkOmlkIGF0dHJpYnV0ZSkgaW5zdGVhZCBvZiB0YWdzIGJlY2F1c2UKKyAgICAgICAgICAgICB0aGV5IGFyZSBmYXN0ZXIgYW5kIGFsbG93IGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRhZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBVc2UgPGNvZGU+ZGV2aWNlLWFkbWluPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXJ9LCB3aGljaCBpcwpAQCAtMzU1Myw3ICszNjY0LDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzU3NCw3ICszNjg1LDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzU5MCw3ICszNzAxLDcgQEAKICAgICA8IS0tIENvbnRhY3RzIG1ldGEtZGF0YSBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVE9ETzogcmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBzdHlsZWFibGUuIC0tPgogICAgIDxlYXQtY29tbWVudCAvPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJY29uIj4KQEAgLTM2MTYsNiArMzcyNyw5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbENvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHRoYXQgZGV0YWlsIHNob3VsZCBiZSBidWlsdCBmcm9tIFNvY2lhbFByb3ZpZGVyLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZGV0YWlsU29jaWFsU3VtbWFyeSIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgdGVybSAiQWxsIENvbnRhY3RzIiAoZS5nLiAiQWxsIEZyaWVuZHMiIG9yCisgICAgICAgICJBbGwgY29ubmVjdGlvbnMiKS4gT3B0aW9uYWwgKERlZmF1bHQgaXMgIkFsbCBDb250YWN0cyIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiBmb3JtYXQ9InN0cmluZyIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMzY0Nyw0ICszNzYxLDEwNSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzZXR0aW5nc0FjdGl2aXR5IiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBZGFwdGVycyBhdHRyaWJ1dGVzICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQWRhcHRlciB1c2VkIHRvIGJpbmQgY3Vyc29ycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXIiPgorICAgICAgICA8IS0tIFVSSSB0byBnZXQgdGhlIGN1cnNvciBmcm9tLiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InVyaSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU2VsZWN0aW9uIHN0YXRlbWVudCBmb3IgdGhlIHF1ZXJ5LiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNlbGVjdGlvbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU29ydCBvcmRlciBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzb3J0T3JkZXIiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIExheW91dCByZXNvdXJjZSB1c2VkIHRvIGRpc3BsYXkgZWFjaCByb3cgZnJvbSB0aGUgY3Vyc29yLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIGluIGJpbmQgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX0JpbmRJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJvbSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHJlc291cmNlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHlwZSBvZiBiaW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0eXBlIHdpbGwgYmUKKyAgICAgICAgICAgICBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSAidG8iIHRhcmdldCB2aWV3LiBNYW5kYXRvcnkuCisKKyAgICAgICAgICAgICBUaGUgdHlwZSBjYW4gYmUgb25lIG9mOgorICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICA8bGk+c3RyaW5nLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgYmxvYiBkZXNjcmliaW5nIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLXVyaSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5kcmF3YWJsZSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkIHRvIGEgZHJhd2FibGUuPC9saT4KKyAgICAgICAgICAgICA8bGk+QSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSwgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIuPC9saT4KKyAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gc2VsZWN0IGl0ZW1zIGZvciBYTUwgY3Vyc29yIGFkYXB0ZXJzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHNlbGVjdC4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sdW1uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX01hcEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyb21WYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBtYXAgdmFsdWVzIHRvIG5ldyB2YWx1ZXMgaW4gWE1MIGN1cnNvciBhZGFwdGVycycgYmluZCBpdGVtcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIE1hbmRhdG9yeSBpZiAid2l0aENsYXNzIiBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aEV4cHJlc3Npb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBjbGFzcywgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbi4gTWFuZGF0b3J5IGlmICJ3aXRoRXhwcmVzc2lvbiIKKyAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aENsYXNzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gc3R5bGUgdGhlIEFjdGlvbiBCYXIuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBY3Rpb25CYXIiPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIG5hdmlnYXRpb24gdG8gdXNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiPgorICAgICAgICAgICAgPCEtLSBOb3JtYWwgc3RhdGljIHRpdGxlIHRleHQgLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJub3JtYWwiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIGRyb3AtZG93biBzZWxlY3Rpb24gaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93bkxpc3QiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIHNlcmllcyBvZiBob3Jpem9udGFsIHRhYnMgaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ0YWJCYXIiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gT3B0aW9ucyBhZmZlY3RpbmcgaG93IHRoZSBhY3Rpb24gYmFyIGlzIGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRpc3BsYXlPcHRpb25zIj4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InVzZUxvZ28iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iaGlkZUhvbWUiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBjb2xvciB1c2VkIHRvIHN0eWxlIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sb3JGaWx0ZXIiIGZvcm1hdD0iY29sb3IiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRpdGxlIHRleHQgdXNlZCBmb3IgbmF2aWdhdGlvbk1vZGU9Im5vcm1hbCIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBzdWJ0aXRsZSB0ZXh0IHVzZWQgZm9yIG5hdmlnYXRpb25Nb2RlPSJub3JtYWwiIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdWJ0aXRsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3Igc3VidGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBpY29uLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBsb2dvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIGl0ZW0gZGl2aWRlcnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaXZpZGVyIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBsYXlvdXQgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLiBPdmVycmlkZXMgbmF2aWdhdGlvbk1vZGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKaW5kZXggZjE4ZDE0ZS4uNWU4YzYxOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKQEAgLTIzNSw2ICsyMzUsMTAgQEAKICAgICAgICAgIHRoZSBzYWZlIG1vZGUuICAtLT4KICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAKKyAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbidzIHJlbmRlcmluZyBzaG91bGQgYmUgaGFyZHdhcmUKKyAgICAgICAgIGFjY2VsZXJhdGVkIGlmIHBvc3NpYmxlLiAgLS0+CisgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorCiAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gY29tcG9uZW50IGlzIGF2YWlsYWJsZQogICAgICAgICAgdG8gb3RoZXIgYXBwbGljYXRpb25zLiAgSWYgZmFsc2UsIGl0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5CiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBpdHMgc2FtZSB1c2VyIGlkICh3aGljaCB1c3VhbGx5IG1lYW5zIG9ubHkgYnkKQEAgLTczNCw2ICs3MzgsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZWJ1Z2dhYmxlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgICAgICA8IS0tIE5hbWUgb2YgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgZm9yIG1hbmFnaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNwYWNlIG9uIHRoZSBkZXZpY2UuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJtYW5hZ2VTcGFjZUFjdGl2aXR5IiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJhbGxvd0NsZWFyVXNlckRhdGEiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggY2ZmY2QxZC4uZWMwZDgzYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtOTgsNiArOTgsOSBAQAogICAgICAgICA8aXRlbT4iMCwxIjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gVGhlIG1heGltdW0gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykgd2UgZXhwZWN0IGEgbmV0d29yayB0cmFuc2l0aW9uIHRvIHRha2UgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCI+NjAwMDA8L2ludGVnZXI+CisKICAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKICAgICAgICAgIFVTQiBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoaW5nIG92ZXIgVVNCIHRoaXMgc2hvdWxkCiAgICAgICAgICBiZSBlbXB0eS4gIEFuIGV4YW1wbGUgd291bGQgYmUgInVzYi4qIiAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAppbmRleCA4YTkyNzU3Li42NTY0NzFjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0yNSw2ICsyNSw5IEBACiAgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhcHBsaWNhdGlvbiBpY29uIHRoYXQKICAgICAgICAgIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBhcHAgbGF1bmNoZXIgYW5kIGVsc2V3aGVyZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9ImFwcF9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBzdGFuZGFyZCBzaXplIChib3RoIHdpZHRoIGFuZCBoZWlnaHQpIG9mIGFuIGFjdGlvbiBpY29uIHRoYXQgd2lsbAorICAgICAgICAgYmUgZGlzcGxheWVkIGluIGFwcGxpY2F0aW9uIGFjdGlvbiBiYXJzLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0iYWN0aW9uX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJ0b2FzdF95X29mZnNldCI+NjRkaXA8L2RpbWVuPgogICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+MjVkaXA8L2RpbWVuPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCmluZGV4IDhiNmFmNzEuLmU2MDdmYWQ1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCkBAIC02OCw0ICs2OCw1IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJhY2NvdW50UHJlZmVyZW5jZXMiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzbWFsbEljb24iIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggMjdjYjc2My4uM2QyZGIzOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbApAQCAtMTE3OCw3ICsxMTc4LDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2xvckJhY2tncm91bmRDYWNoZUhpbnQiIGlkPSIweDAxMDEwMmFiIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWMiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWQiIC8+Ci0gIAorCiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlciIgaWQ9IjB4MDEwMzAwNWUiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyIiBpZD0iMHgwMTAzMDA1ZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIgaWQ9IjB4MDEwMzAwNjAiIC8+CkBAIC0xMTg2LDcgKzExODYsNyBAQAogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5XYWxscGFwZXJTZXR0aW5ncyIgaWQ9IjB4MDEwMzAwNjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5UaXRsZSIgaWQ9IjB4MDEwMzAwNjMiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSIgaWQ9IjB4MDEwMzAwNjQiIC8+Ci0gIAorCiAgIDwhLS0gU2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBwbGFjaW5nIGEgZGFyawogICAgICAgIHRoZW1lZCBVSSBvbiB0b3Agb2Ygc29tZSBhcmJpdHJhcnkgYmFja2dyb3VuZCAoc3VjaCBhcyB0aGUKICAgICAgICB3YWxscGFwZXIpLiAgVGhpcyBkYXJrZW5zIHRoZSBiYWNrZ3JvdW5kIHN1ZmZpY2llbnRseSB0aGF0IHRoZSBVSQpAQCAtMTE5NCw3ICsxMTk0LDcgQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFya190cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYTkiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2xpZ2h0X3RyYW5zcGFyZW50IiBpZD0iMHgwMTA4MDBhYSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9ub3RpZnlfc2RjYXJkX3ByZXBhcmUiIGlkPSIweDAxMDgwMGFiIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNiBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciAyLjAuMSkuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMDYsNyArMTIwNiw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93U21hbGwiIGlkPSIweDAxMDEwMmIxIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSIgaWQ9IjB4MDEwMTAyYjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGlkPSIweDAxMDEwMmIzIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNyBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjE1LDcgKzEyMTUsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dGhvciIgaWQ9IjB4MDEwMTAyYjQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXV0b1N0YXJ0IiBpZD0iMHgwMTAxMDJiNSIgLz4KIAotICAgIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA4IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIE1SMikuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMzYsMTggKzEyMzYsMTggQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0YWJTdHJpcEVuYWJsZWQiIGlkPSIweDAxMDEwMmJkIiAvPgogCiAgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImN1c3RvbSIgaWQ9IjB4MDEwMjAwMmIiIC8+Ci0gICAgCisKICAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJjeWNsZV9pbnRlcnBvbGF0b3IiIGlkPSIweDAxMGEwMDBjIiAvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZXNvdXJjZXMgaW50cm9kdWNlZCBpbiBrcmFrZW4uCisgICAgIFJlc291cmNlcyBpbnRyb2R1Y2VkIGluIEdpbmdlcmJyZWFkLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgIAorICA8ZWF0LWNvbW1lbnQgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsb2dvIiBpZD0iMHgwMTAxMDJiZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ4bGFyZ2VTY3JlZW5zIiBpZD0iMHgwMTAxMDJiZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoZWF2eVdlaWdodCIgaWQ9IjB4MDEwMTAyYzAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhdHRyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMTAzMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpZCIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDIwMDQwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYW5pbSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMGEwMDIwIiAvPgogCkBAIC0xMjU3LDkgKzEyNTcsOSBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV92aWRlb19vbmxpbmUiIGlkPSIweDAxMDgwMGFlIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19hd2F5IiBpZD0iMHgwMTA4MDBhZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYnVzeSIgaWQ9IjB4MDEwODAwYjAiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX29ubGluZSIgaWQ9IjB4MDEwODAwYjEiIC8+ICAKKyAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fb25saW5lIiBpZD0iMHgwMTA4MDBiMSIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwODAxMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJzdHlsZSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDMwMDkwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0ic3RyaW5nIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNDAwMjAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpbnRlZ2VyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwZTAwMTAiIC8+CkBAIC0xMjY4LDQgKzEyNjgsNDIgQEAKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImNvbG9yIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNjAwMjAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhcnJheSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDcwMDEwIiAvPgogCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXNvdXJjZXMgcHJvcG9zZWQgZm9yIEhvbmV5Y29tYi4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8ZWF0LWNvbW1lbnQgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhZGFwdGVyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNlbGVjdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzb3J0T3JkZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idXJpIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyb20iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbVZhbHVlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRvVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sdW1uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpdGhFeHByZXNzaW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpdGhDbGFzcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbGxDb250YWN0c05hbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im5hdmlnYXRpb25Nb2RlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRpc3BsYXlPcHRpb25zIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN1YnRpdGxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJtZWFzdXJlV2l0aExhcmdlc3RDaGlsZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2hvd0FzQWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0iaG9tZSIgLz4KKworICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiIgLz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA2MmZkMTY5Li42YjM3MWRmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE0MjEsMjAgKzE0MjEsMTggQEAKICAgICA8IS0tIEN1c3RvbSBvcmdhbml6YXRpb24gdHlwZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iPkN1c3RvbTwvc3RyaW5nPgogCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIHVua25vd24gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iPnZpYSA8eGxpZmY6ZyBpZD0ic291cmNlIiBleGFtcGxlPSJHb29nbGUgVGFsayI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KLQotICAgIDwhLS0gQXR0YnV0aW9uIG9mIGEgY29udGFjdCBzdGF0dXMgdXBkYXRlLCB3aGVuIHRoZSB0aW1lIG9mIHVwZGF0ZSBpcyBrbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiPjx4bGlmZjpnIGlkPSJkYXRlIiBleGFtcGxlPSIzIGhvdXJzIGFnbyI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMiRzPC94bGlmZjpnPjwvc3RyaW5nPgotCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBTSU0gUElOIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSI+RW50ZXIgUElOIGNvZGU8L3N0cmluZz4KIAotICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciB0ZXh0IHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIj5FbnRlciBwYXNzd29yZCB0byB1bmxvY2s8L3N0cmluZz4KIAorICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSI+RW50ZXIgUElOIHRvIHVubG9jazwvc3RyaW5nPgorCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0aGF0IHRoZXkgZW50ZXJlZCB0aGUgd3JvbmcgcGluIHdoaWxlIHRyeWluZwogICAgICAgICAgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4gIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIj5JbmNvcnJlY3QgUElOIGNvZGUhPC9zdHJpbmc+CkBAIC0xNDcxLDYgKzE0NjksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiPkNvcnJlY3QhPC9zdHJpbmc+CiAgICAgPCEtLSBPbiB0aGUgdW5sb2NrIHBhdHRlcm4gc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXR0ZXJuIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciPlNvcnJ5LCB0cnkgYWdhaW48L3N0cmluZz4KKyAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGFzc3dvcmQgc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXNzd29yZCBhbmQgbXVzdCB0cnkgYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgogCiAgICAgPCEtLSBXaGVuIHRoZSBsb2NrIHNjcmVlbiBpcyBzaG93aW5nIGFuZCB0aGUgcGhvbmUgcGx1Z2dlZCBpbiwgYW5kIHRoZSBiYXR0ZXJ5CiAgICAgICAgICBpcyBub3QgZnVsbHkgY2hhcmdlZCwgc2hvdyB0aGUgY3VycmVudCBjaGFyZ2UgJS4gIC0tPgpAQCAtMTUxNCwxMiArMTUxNCwyNyBAQAogICAgICAgICAgcHJvZ3Jlc3MgZGlhbG9nIGluIHRoZSBtZWFudGltZS4gIHRoaXMgaXMgdGhlIGVtc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIj5VbmxvY2tpbmcgU0lNIGNhcmRcdTIwMjY8L3N0cmluZz4KIAotICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtLT4KKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGRyYXdpbmcgdGhlIHVubG9jayBwYXR0ZXJuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgogICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KICAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBwYXNzd29yZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIj4KKyAgICAgICAgWW91IGhhdmUgaW5jb3JyZWN0bHkgZW50ZXJlZCB5b3VyIHBhc3N3b3JkIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBQSU4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgUElOIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGlzIGFsbW9zdCBhdCB0aGUgbGltaXQKICAgICAgICAgIHdoZXJlIHRoZXkgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZCBtYXkgaGF2ZSB0byBlbnRlciBhbiBhbHRlcm5hdGUgdXNlcm5hbWUvcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwaG9uZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iPgpAQCAtMTU5MCw3ICsxNjA1LDcgQEAKIAogICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gIFdlYlZpZXcgVXNlciBBZ2VudCBzdHJpbmcgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+PHhsaWZmOmcgaWQ9IngiPk1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCAlcykKLSAgICAgICAgQXBwbGVXZWJLaXQvNTMzLjEgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzMy4xPC94bGlmZjpnPjwvc3RyaW5nPgorICAgICAgICBBcHBsZVdlYktpdC81MzQuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTM0LjE8L3hsaWZmOmc+PC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIGZvciBhIEphdmFTY3JpcHQgZGlhbG9nLiAiVGhlIHBhZ2UgYXQgPHVybCBvZiBjdXJyZW50IHBhZ2U+IHNheXM6IiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ190aXRsZSI+VGhlIHBhZ2UgYXQgXCc8eGxpZmY6ZyBpZD0idGl0bGUiPiVzPC94bGlmZjpnPlwnIHNheXM6PC9zdHJpbmc+CkBAIC0yMjQyLDE3ICsyMjU3LDEzIEBACiAgICAgPCEtLSBMb2NhbGl6ZWQgc3RyaW5ncyBmb3IgV2ViVmlldyAtLT4KICAgICA8IS0tIExhYmVsIGZvciBidXR0b24gaW4gYSBXZWJWaWV3IHRoYXQgd2lsbCBvcGVuIGEgY2hvb3NlciB0byBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIj5DaG9vc2UgZmlsZTwvc3RyaW5nPgorICAgIDwhLS0gTGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBjb250cm9sIHdoZW4gbm8gZmlsZSBoYXMgYmVlbiBjaG9zZW4geWV0IC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iPk5vIGZpbGUgY2hvc2VuPC9zdHJpbmc+CiAgICAgPCEtLSBMYWJlbCBmb3IgPGlucHV0IHR5cGU9InJlc2V0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCI+UmVzZXQ8L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0ic3VibWl0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiPlN1Ym1pdDwvc3RyaW5nPgogCi0gICAgPCEtLSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgU3Rhci9GYXZvcml0ZSBjaGVja2JveAotCi0gICAgICAgICBVc2VkIGJ5IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHRvIGFubm91bmNlIHRoZSBwdXJwb3NlIG9mIHRoZSB2aWV3LgotICAgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciI+ZmF2b3JpdGU8L3N0cmluZz4KLQogICAgIDwhLS0gU3RyaW5ncyBmb3IgY2FyIG1vZGUgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiBjYXIgbW9kZSBpcyBlbmFibGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiPkNhciBtb2RlIGVuYWJsZWQ8L3N0cmluZz4KQEAgLTIyNjMsNiArMjI3NCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIj5UZXRoZXJpbmcgb3IgaG90c3BvdCBhY3RpdmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIj5Ub3VjaCB0byBjb25maWd1cmU8L3N0cmluZz4KIAorICAgIDwhLS0gIFN0cmluZ3MgZm9yIHBvc3NpYmxlIFByZWZlcmVuY2VBY3Rpdml0eSBCYWNrL05leHQgYnV0dG9ucyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIj5CYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCI+TmV4dDwvc3RyaW5nPgorCiAgICAgPCEtLSBTdHJpbmdzIGZvciB0aHJvdHRsaW5nIG5vdGlmaWNhdGlvbiAtLT4KICAgICA8IS0tIFNob3duIHdoZW4gdGhlIHVzZXIgaXMgaW4gZGFuZ2VyIG9mIGJlaW5nIHRocm90dGxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIj5IaWdoIG1vYmlsZSBkYXRhIHVzZTwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IGFmMDQxMTcuLjVlZDI2ZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTQ1MSw2ICs0NTEsMTggQEAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kcm9wZG93bjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRpYWxvZzwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0Ij4tMTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cFByb21wdFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZHJvcGRvd248L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51Ij4KQEAgLTU2Nyw2ICs1NzksNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3F1aWNrY29udGFjdF9iYWRnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRDZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19jb250YWN0X3BpY3R1cmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwiPgpAQCAtODU0LDQgKzg2NywxMyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdCb3R0b20iPjFkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhcjwvaXRlbT4KICAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpc3BsYXlPcHRpb25zIj51c2VMb2dvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpdmlkZXIiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlcjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAppbmRleCBkNTg1ZDllLi43NmJiYTRiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC0xMTUsNiArMTE1LDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLkFjdGl2aXR5PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGUiPnN0YXRlVW5zcGVjaWZpZWR8YWRqdXN0VW5zcGVjaWZpZWQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BY3Rpb25CYXI8L2l0ZW0+CiAKICAgICAgICAgPCEtLSBEaWFsb2cgYXR0cmlidXRlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWxlcnREaWFsb2dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQWxlcnREaWFsb2c8L2l0ZW0+CkBAIC0xNjcsNiArMTY5LDkgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU2Nyb2xsVmlldzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkFjdGlvbkJ1dHRvbjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic3RhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQ29tcG91bmRCdXR0b24uU3RhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGFiV2lkZ2V0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UYWJXaWRnZXQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UZXh0VmlldzwvaXRlbT4KQEAgLTE5OCw2ICsyMDMsOSBAQAogCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfd2lkZ2V0X2NvcnB1c19pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyI+MTJkaXA8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGRlZmF1bHQgKGRhcmspIHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtNTIxLDUgKzUyOSw5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5SZWNlbnRBcHBsaWNhdGlvbnM8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ub2ZvY3VzPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CiAgICAgCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcG93ZXJfcHJvZmlsZS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bvd2VyX3Byb2ZpbGUueG1sCmluZGV4IGNlNjIzZTguLjMwMzEyYjMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcG93ZXJfcHJvZmlsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wb3dlcl9wcm9maWxlLnhtbApAQCAtMTgsNiArMTgsNyBAQAogLS0+CiAKIDxkZXZpY2UgbmFtZT0iQW5kcm9pZCI+CisgIDwhLS0gQWxsIHZhbHVlcyBhcmUgaW4gbUFoIGV4Y2VwdCBhcyBub3RlZCAtLT4KICAgPGl0ZW0gbmFtZT0ibm9uZSI+MDwvaXRlbT4KICAgPGl0ZW0gbmFtZT0ic2NyZWVuLm9uIj4wLjE8L2l0ZW0+CiAgIDxpdGVtIG5hbWU9ImJsdWV0b290aC5hY3RpdmUiPjAuMTwvaXRlbT4KQEAgLTQ4LDQgKzQ5LDYgQEAKICAgPGFycmF5IG5hbWU9ImNwdS5hY3RpdmUiPgogICAgICAgPHZhbHVlPjAuMjwvdmFsdWU+CiAgIDwvYXJyYXk+CisgIDwhLS0gVGhpcyBpcyB0aGUgYmF0dGVyeSBjYXBhY2l0eSBpbiBtQWggLS0+CisgIDxpdGVtIG5hbWU9ImJhdHRlcnkuY2FwYWNpdHkiPjEwMDA8L2l0ZW0+CiA8L2RldmljZT4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDMwMDJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOjtBXDtCXFw7Q1xcXDs7RDtcOkU7XFxcXDsNCi1GTjpBO0JcQ1w7RDpFXFwNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMzRlMTYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkd1bXA7Rm9ycmVzdDtIb2dlO1BvcztUYW8NCi1GTjpKb2UgRHVlDQotT1JHOkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0Llw7TWFuYWdlcjtGaXNoIGtlZXBlcg0KLVJPTEU6RmlzaCBDYWtlIEtlZXBlciENCi1YLUNMQVNTOlBVQkxJQw0KLVRJVExFOlNocmltcCBNYW4NCi1URUw7V09SSztWT0lDRTooMTExKSA1NTUtMTIxMg0KLVRFTDtIT01FO1ZPSUNFOig0MDQpIDU1NS0xMjEyDQotVEVMO0NFTEw6MDMxMTExMTExMQ0KLVRFTDtWSURFTzowMzIyMjIyMjIyDQotVEVMO1ZPSUNFOjAzMzMzMzMzMzMNCi1BRFI7V09SSzo7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQ0KLUxBQkVMO1dPUks7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRToxMDAgV2F0ZXJzIEVkZ2U9MEQ9MEFCYXl0b3duLCBMQSAzMDMxND0wRD0wQVVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2ENCi1BRFI7SE9NRTo7OzQyIFBsYW50YXRpb24gU3QuO0JheXRvd247TEE7MzAzMTQ7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhDQotTEFCRUw7SE9NRTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjQyIFBsYW50YXRpb24gU3QuPTBEPTBBPQ0KLUJheXRvd24sIExBIDMwMzE0PTBEPTBBPQ0KLVVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2ENCi1FTUFJTDtQUkVGO0lOVEVSTkVUOmZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tDQotRU1BSUw7Q0VMTDpjZWxsQGV4YW1wbGUuY29tDQotTk9URTpUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4NCi1OT1RFO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Tm93J3MgdGhlIHRpbWUgPQ0KLWZvciBhbGwgZm9sayB0byBjb21lPQ0KLSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuDQotDQotUEhPVE87RU5DT0RJTkc9QkFTRTY0O1RZUEU9SlBFRzoNCi0gLzlqLzRRb1BSWGhwWmdBQVRVMEFLZ0FBQUFnQURRRU9BQUlBQUFBUEFBQUFxZ0VQQUFJQUFBQUhBQUFBdWdFUUFBSUFBQUFHDQotIEFBQUF3Z0VTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQXlBRWJBQVVBQUFBQkFBQUEwQUVvQUFNQUFBQUJBQUlBQUFFeA0KLSBBQUlBQUFBT0FBQUEyQUV5QUFJQUFBQVVBQUFBNWdJVEFBTUFBQUFCQUFFQUFJS1lBQUlBQUFBT0FBQUErb2RwQUFRQUFBQUINCi0gQUFBQmhNU2xBQWNBQUFCOEFBQUJDQUFBQkI0eU1EQTRNVEF5T1RFek5UVXpNUUFBUkc5RGIwMXZBQUJFT1RBMWFRQUFBQUJJDQotIEFBQUFBUUFBQUVnQUFBQUJSRGt3TldrZ1ZtVnlNUzR3TUFBeU1EQTRPakV3T2pJNUlERXpPalUxT2pRM0FDQWdJQ0FnSUNBZw0KLSBJQ0FnSUNBQVVISnBiblJKVFFBd016QXdBQUFBQmdBQkFCUUFGQUFDQVFBQUFBQURBQUFBTkFFQUJRQUFBQUVCQVFBQUFBRVENCi0gZ0FBQUFBQUFFUWtBQUNjUUFBQVBDd0FBSnhBQUFBV1hBQUFuRUFBQUNMQUFBQ2NRQUFBY0FRQUFKeEFBQUFKZUFBQW5FQUFBDQotIEFJc0FBQ2NRQUFBRHl3QUFKeEFBQUJ2bEFBQW5FQUFvZ3BvQUJRQUFBQUVBQUFOcWdwMEFCUUFBQUFFQUFBTnlpQ0lBQXdBQQ0KLSBBQUVBQWdBQWtBQUFCd0FBQUFRd01qSXdrQU1BQWdBQUFCUUFBQU42a0FRQUFnQUFBQlFBQUFPT2tRRUFCd0FBQUFRQkFnTUENCi0ga1FJQUJRQUFBQUVBQUFPaWtnRUFDZ0FBQUFFQUFBT3FrZ0lBQlFBQUFBRUFBQU95a2dRQUNnQUFBQUVBQUFPNmtnVUFCUUFBDQotIEFBRUFBQVBDa2djQUF3QUFBQUVBQWdBQWtnZ0FBd0FBQUFFQUFBQUFrZ2tBQXdBQUFBRUFBQUFBa2dvQUJRQUFBQUVBQUFQSw0KLSBrbndBQndBQUFBRUFBQUFBa29ZQUJ3QUFBQllBQUFQU29BQUFCd0FBQUFRd01UQXdvQUVBQXdBQUFBRUFBUUFBb0FJQUF3QUENCi0gQUFFQVlBQUFvQU1BQXdBQUFBRUFTQUFBb0FVQUJBQUFBQUVBQUFRQW9nNEFCUUFBQUFFQUFBUG9vZzhBQlFBQUFBRUFBQVB3DQotIG9oQUFBd0FBQUFFQUFnQUFvaGNBQXdBQUFBRUFBZ0FBb3dBQUJ3QUFBQUVEQUFBQW93RUFCd0FBQUFFQkFBQUFwQUVBQXdBQQ0KLSBBQUVBQUFBQXBBSUFBd0FBQUFFQUFBQUFwQU1BQXdBQUFBRUFBQUFBcEFRQUJRQUFBQUVBQUFQNHBBVUFBd0FBQUFFQUhRQUENCi0gcEFZQUF3QUFBQUVBQUFBQXBBY0FBd0FBQUFFQUFBQUFwQWdBQXdBQUFBRUFBQUFBcEFrQUF3QUFBQUVBQUFBQXBBb0FBd0FBDQotIEFBRUFBQUFBcEF3QUF3QUFBQUVBQWdBQUFBQUFBQUFBQUZNQUFDY1FBQUFCWGdBQUFHUXlNREE0T2pFd09qSTVJREV6T2pVMQ0KLSBPak14QURJd01EZzZNVEE2TWprZ01UTTZOVFU2TkRjQUFBQXBpQUFBR3dBQUFBS3lBQUFBWkFBQUFWNEFBQUJrQUFBQUFBQUENCi0gQUdRQUFBQWxBQUFBQ2dBQURwSUFBQVBvQUFBQUFBQUFBQUF5TURBNE1UQXlPVEV6TlRVek1RQUFJQ29BQUFBS0FBQXE0Z0FBDQotIEFBb0FBQUFBQUFBQUFRQUNBQUVBQWdBQUFBUlNPVGdBQUFJQUJ3QUFBQVF3TVRBd0FBQUFBQUFHQVFNQUF3QUFBQUVBQmdBQQ0KLSBBUm9BQlFBQUFBRUFBQVJzQVJzQUJRQUFBQUVBQUFSMEFTZ0FBd0FBQUFFQUFnQUFBZ0VBQkFBQUFBRUFBQVI4QWdJQUJBQUENCi0gQUFFQUFBV0xBQUFBQUFBQUFFZ0FBQUFCQUFBQVNBQUFBQUgvMlAvYkFJUUFJQllZSEJnVUlCd2FIQ1FpSUNZd1VEUXdMQ3d3DQotIFlrWktPbEIwWm5wNGNtWndib0NRdUp5QWlLNktibkNnMnFLdXZzVE8wTTU4bXVMeTRNand1TXJPeGdFaUpDUXdLakJlTkRSZQ0KLSB4b1J3aE1iR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkcNCi0gLzhBQUVRZ0FlQUNnQXdFaEFBSVJBUU1SQWYvRUFhSUFBQUVGQVFFQkFRRUJBQUFBQUFBQUFBQUJBZ01FQlFZSENBa0tDeEFBDQotIEFnRURBd0lFQXdVRkJBUUFBQUY5QVFJREFBUVJCUkloTVVFR0UxRmhCeUp4RkRLQmthRUlJMEt4d1JWUzBmQWtNMkp5Z2drSw0KLSBGaGNZR1JvbEppY29LU28wTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0ZVhxRGhJV0cNCi0gaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsDQotIDV1Zm82ZXJ4OHZQMDlmYjMrUG42QVFBREFRRUJBUUVCQVFFQkFBQUFBQUFBQVFJREJBVUdCd2dKQ2dzUkFBSUJBZ1FFQXdRSA0KLSBCUVFFQUFFQ2R3QUJBZ01SQkFVaE1RWVNRVkVIWVhFVElqS0JDQlJDa2FHeHdRa2pNMUx3RldKeTBRb1dKRFRoSmZFWEdCa2ENCi0gSmljb0tTbzFOamM0T1RwRFJFVkdSMGhKU2xOVVZWWlhXRmxhWTJSbFptZG9hV3B6ZEhWMmQzaDVlb0tEaElXR2g0aUppcEtUDQotIGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVMajVPWG01K2pwNnZMeg0KLSA5UFgyOS9qNSt2L2FBQXdEQVFBQ0VRTVJBRDhBRkZTcUtrWklvcVJWcGdTS0tlQlRFT0Fwd0ZBRHNVWXBnSVJTRVVBTklwcEYNCi0gSUNOaFVUQ2dDTWlvMkZJQ0poVUxDZ0Mwb3FWYUFKRkZTcUtCa2dGT0FwaUhDbkNnQjJLTVVDRU5KUUEwaW1FVURHTUtpWVVBDQotIFJ0VWJVZ0lXcUpoUUJaU3BGb0FsV3BWb0dQRlBGTVE3dFNLMk9EUUE0eUtPOUhtS2U5RnhBekRIRklPbEFBYVlhQUdOVVRVRA0KLSBJbXFOcVFFVFZFMUFFNlZLS0FKRk5TcWFBSGcwOEdtQU5JRkZRTTVZNXFKTUJ1VDYwWk5RSWNya1ZZU1FNS3VMR0thYWFzUXgNCi0gcWlhZ1pFMVJ0U0FqYW9tb0FrUTFLcG9BbFUxSXBvQWtVMDdPQlRBck8rNXFrVjEyWTcxbGZVQm1hS2tDUlN1em5yVEZiYTJhDQotIG9Dd0d5TTBFMXFJalkxR3hvR1JOVVpOSUNOcWlhZ0J5R3BsTkFFaW1wRk5NQjRZRHZTdWNweFNZRUlVMDRLYXpzQXUxcUFyVQ0KLSBXRUx0UHBUU3Bvc0JORVR0NXB4TmFvQ05qVWJHZ0NOalVab0dSdFVUVWdGVTFLcG9Ba0JxUUhpZ0NGbk83clVxT2RsWnA2Z0ENCi0gYyt0T0RuMXBYQVh6RDYwZVlmV25jUXZtTlNHUTA3Z09NaENWRUpHejFwdGdTNXlLWXhxd0dFMUd4b0FpYW1Ha01hcHFWVFFCDQotIEtwcCtlS0FJQ2ZtcVdNL0thejZnQU5PQnFRRnpSbW1BdWFUTkFDc2ZrcU1IbW05d0pzOFUwbXRSREdOUnNhQUkycGhwREkxTg0KLSBTcWFBSkZOU0E4VUNJU2ZtcVNNL0thejZqQUhtbkExSUNnMHVhQUZ6U1pwZ0t4K1NtRHJUZTRFMmVLYVRXb2lNbW1NYUFJelQNCi0gRFNHUktha1UwQVNLYWVEVEVSc2Vha2pQeW1zK294QWFjRFVnT0JwYzBnRnpTWnBnT1kvS0tZdjNxcnFJbHBwclFCakdveWFBDQotIEdHbW1rTWdVMUlwcGdQQnFRR2dRdTBHbjR3dkZLd0VRcHdOWkRIWnBjMEFMbWlnUktCbGVhUUtCV3RnQTAwMVFER3FNMGdHbQ0KLSBtR2tNcnFha0JvQWVwcDROTVJJRFR3YUFFMkEwMDhHb2tnSHhqZDFwektGcFcwdUFnNU5TQkJUaXJnT3BEV2dEVFRUUUF3MHcNCi0gMGdHR21tZ1pXQnA0cEFTS2FlRFRFT0JwNE5BRHdhamJyVXlCRWtYV25TVWRBR3IxcWVpQU1Ta05XQWhwaG9BYWFZYVFERFRUDQotIFNHVlJUd2FZRHhUd2FCRHdhZURRQTRHbEs1b2F1SWVvMjBwR2FMYUFLcWdVNmhLd0JTR21BaHBob0FhYVlhUXhocHBwREtnTg0KLSBQRk1CNHA0b0VQRk9CcGdQQnA0TkFod3B3b0FXbG9BS1NnQkRUVFFNWWFZYVFEVFRUU0dBLzluLzJ3Q0VBQW9IQndnSEJnb0kNCi0gQ0FnTENnb0xEaGdRRGcwTkRoMFZGaEVZSXg4bEpDSWZJaUVtS3pjdkppazBLU0VpTUVFeE5EazdQajQrSlM1RVNVTThTRGM5DQotIFBqc0JDZ3NMRGcwT0hCQVFIRHNvSWlnN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzNw0KLSBPenM3T3pzN096czdPenM3Ty8vQUFCRUlBRWdBWUFNQklRQUNFUUVERVFIL3hBR2lBQUFCQlFFQkFRRUJBUUFBQUFBQUFBQUENCi0gQVFJREJBVUdCd2dKQ2dzUUFBSUJBd01DQkFNRkJRUUVBQUFCZlFFQ0F3QUVFUVVTSVRGQkJoTlJZUWNpY1JReWdaR2hDQ05DDQotIHNjRVZVdEh3SkROaWNvSUpDaFlYR0JrYUpTWW5LQ2txTkRVMk56ZzVPa05FUlVaSFNFbEtVMVJWVmxkWVdWcGpaR1ZtWjJocA0KLSBhbk4wZFhaM2VIbDZnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMNCi0gMDlUVjF0ZlkyZHJoNHVQazVlYm42T25xOGZMejlQWDI5L2o1K2dFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJDQotIENRb0xFUUFDQVFJRUJBTUVCd1VFQkFBQkFuY0FBUUlERVFRRklURUdFa0ZSQjJGeEV5SXlnUWdVUXBHaHNjRUpJek5TOEJWaQ0KLSBjdEVLRmlRMDRTWHhGeGdaR2lZbktDa3FOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDQNCi0gZVhxQ2c0U0Zob2VJaVlxU2s1U1ZscGVZbVpxaW82U2xwcWVvcWFxeXM3UzF0cmU0dWJyQ3c4VEZ4c2ZJeWNyUzA5VFYxdGZZDQotIDJkcmk0K1RsNXVmbzZlcnk4L1QxOXZmNCtmci8yZ0FNQXdFQUFoRURFUUEvQUo3U0xnY1ZyMjBJNHJORkd2YlFBQUhGYUVVWA0KLSBTclFpNUhDTWRLazhvWTZWU0pZeDRoanBWYVdNZWxBRkM0aUdEeFdQZFI4bWt4bVJkeGpCckV2SSt0WmpOMjB4dEhOYk5xQWMNCi0gVUlEWGc2Q3IwV0t0Q1k4WEtRT3l6T0IzRktOV3N5Y2VaK2xTNnNZNk5ranZQU2R3SW1CSFVtbXk0cTA3Nm9Dak9PRFdQZGdjDQotIDBNcEdQZEFZTllsNG81ck5qTkt6a3lvclp0WHhpaEFhMXZJRGlwN205RnJiNy80andLY255eGJFek4zaWVKcHBac3laNFUxSA0KLSB1cnpaYXU0bVdWbE5yR2swVXVXUFZhMVlyb1hFSWtIZnJYWmg1VzkwUlduY0FIbXNpNmJKTmRRMFpOdzNCckd1aU1HczJNa3MNCi0gcHVCeld6YnpkT2FFQmVPcFIyb1V0a2s5aFRydTdpdW80bTh3Z2VtS3lxVGkwNHNCc2ZrRWY2OGo4S2xVUVp6OW8vU3VaUmozDQotIEpZcmlBamk0L1NwN1c2aHRiVjJhWGN1NzByYW1veGxlNGdON0hjSVhqYmlzKzRrNU5kYWFhdWhtVmN2MXJIdVc2MURHaUcxbQ0KLSA2YzFzMjAvVG1nQXY1dm1qNTdWS2szK2l4blBjMXhWVjcwaDlDVkp1T3RTckw3MWhGZ3h6U2NVa2tuK2lZLzJxMWk5eERyR1QNCi0gOXkzMXBKNU90ZDFMK0doTXk3bVRyV1hPMlNhcGpSbjI4dlRtdGEzbnhqbWdHT3ZKZDJ3MUtrditpcHovQUJHdU9vdmVZZENlDQotIE9ianJVNnk1cmxzQTh5Y1Vrc24raWovZU5hdzZpSkxOc1c1OXpUSm42ODE2RlA0RUptYk8rU2F6NW02MDJVaklnazRITmFkdg0KLSBMd0thQmwrTXBJTU9NaXBwNDkwU0NKZUY3Q29xUXZGMkp1UnFXUTRZRUdyU2lRSnVLbkhyWEJ5TXBraTczR0ZCTlhJb2g5bjINCi0gU3Jubk9LNk1QVGJkM3NTd0lWRjJxTUNxa3pIbXV5MWxZUm5USHJWR1dwWmFNS0IrQldsYnljWW9RTTBJWkR4elYrR1U4YzFhDQotIElZeTVZK2RuSGF0QXNmc0FIZkFybVMxbVBvaDFnVDh4OXF0azFyUVg3dENlNURJYXB6R3RHQlFtNzFTbHFHV2puSUg2Vm93dA0KLSB6bWhBeS9FM3ZWNkY2dEVNdXhsV0l5QWZyVnhDQ0FPMVZaRUV5WUE0QUFweE5Hd3lKK2xWSlJVc2FLTXc2MVNsRlF6UkFQL1oNCi0NCi1YLUFUVFJJQlVURTpTb21lIFN0cmluZw0KLUJEQVk6MTk4MDAxMDENCi1HRU86MzUuNjU2Mzg1NCwxMzkuNjk5NDIzMw0KLVVSTDpodHRwOi8vd3d3LmV4YW1wbGUuY29tLw0KLVJFVjoyMDA4MDQyNFQxOTUyNDNaDQotRU5EOlZDQVJEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEwNzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOnZDYXJkDQotVkVSU0lPTjoyLjENCi1VSUQ6MzU3DQotTjo7Q29uZmVyZW5jZSBDYWxsDQotRk46Q29uZmVyZW5jZSBDYWxsDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkLg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpUaGlzIGlzIGFuIChzaGFycCAtPj0NCi0jPC0gc2hhcnApIGV4YW1wbGUuIFRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLg0KLSMgVGhpcyBsaW5lIG11c3QgYmUgaWdub3JlZCB0b28uDQotRU5EOnZDYXJkDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZTJmZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN47Ozs7DQotVEVMO1BSRUY7Vk9JQ0U6MDMwMDAwMDAwMA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTRhY2IuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk47Q0hBUlNFVD1TSElGVF9KSVM6iMCToSCDjYNDg2ggMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToTuDjYNDg2gxOzs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rM727LE3jE7OzsNCi1BRFI7SE9NRTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjs9OTM9OEM9OEI9OUU9OTM9NzM9DQotPThGPTYxPTkyPTRBPThCPUU2PThEPUY3PThCPTc1PTkyPUFDMjYtMT04Mz01QT04Mz04Qj04Mz04QT04Mz00MT04Mz05Mz0NCi09ODM9NUU9ODM9OEY9ODE9NUI2PThBPTRCOzs7OzE1MC04NTEyOw0KLU5PVEU7Q0hBUlNFVD1TSElGVF9KSVM7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo9ODM9ODE9ODM9ODINCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmIxOWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDM7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeMzs7OzsNCi1URUw7WC1ORUMtU0VDUkVUOjkNCi1URUw7WC1ORUMtSE9URUw6MTANCi1URUw7WC1ORUMtU0NIT09MOjExDQotVEVMO0hPTUU7RkFYOjEyDQotRU5EOlZDQVJEDQotDQotDQotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDQ7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeNDs7OzsNCi1URUw7TU9ERU06MTMNCi1URUw7UEFHRVI6MTQNCi1URUw7WC1ORUMtRkFNSUxZOjE1DQotVEVMO1gtTkVDLUdJUkw6MTYNCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNTs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN41Ozs7Ow0KLVRFTDtYLU5FQy1CT1k6MTcNCi1URUw7WC1ORUMtRlJJRU5EOjE4DQotVEVMO1gtTkVDLVBIUzoxOQ0KLVRFTDtYLU5FQy1SRVNUQVVSQU5UOjIwDQotRU5EOlZDQVJEDQotDQotDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMTE5MC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5vcm1hbCBHdXkNCi1PUkc6Q29tcGFueTtPcmdhbml6YXRpb247RGV2aXNpb247Um9vbTtTaGVldCBOby4NCi1USVRMRTpFeGNlbGxlbnQgSmFuaXRvcg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDUzMTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1CRUdJTjpWQ0FSRAotVkVSU0lPTjoyLjEKLUZOOlNtaXRoCi1URUw7SE9NRToxCi1URUw7V09SSztQUkVGOjIKLVRFTDtJU0ROOjMKLUVNQUlMO1BSRUY7SE9NRTp0ZXN0QGV4YW1wbGUuY29tCi1FTUFJTDtDRUxMO1BSRUY6dGVzdDJAZXhhbWluYXRpb24uY29tCi1PUkc6Q29tcGFueQotVElUTEU6RW5naW5lZXIKLU9SRzpNeXN0ZXJ5Ci1USVRMRTpCbG9nZ2VyCi1PUkc6UG9ldHJ5Ci1USVRMRTpQb2V0Ci1FTkQ6VkNBUkQKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhYmI0Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ1YWI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1GTjpBbmRvIFJvaWQNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGRhYmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLU46QW5kbztSb2lkOw0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGM3MzguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjpOaWNlIEd1eQ0KLVRJVExFOkNvb2wgVGl0bGUNCi1PUkc6TWFydmVyb3VzO1BlcmZlY3Q7R3JlYXQ7R29vZDtCYWQ7UG9vcg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4MGQwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjpFeGFtcGxlOzs7Ow0KLUZOOkV4YW1wbGUNCi1BTk5JVkVSU0FSWTtWQUxVRT1EQVRFOjIwMDkxMDEwDQotQUdFTlQ6SW52YWxpZCBsaW5lIHdoaWNoIG11c3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkuDQotWC1DTEFTUzpQVUJMSUMNCi1YLVJFRFVDVElPTjoNCi1YLU5POg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGE3ZjIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1OOkY7RztNOzsNCi1URUw7VFlQRT1QQUdFUixXT1JLLE1TRzo2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbQ0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTg2NjFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotRk46QW5kIFJvaWQNCi1OOkFuZDtSb2lkOzs7DQotT1JHOk9wZW47SGFuZHNldDsgQWxsaWFuY2UNCi1TT1JULVNUUklORzphbmRyb2lkDQotVEVMO1RZUEU9UFJFRjtUWVBFPVZPSUNFOjAzMDAwMDAwMDANCi1DTEFTUzpQVUJMSUMNCi1YLUdOTzowDQotWC1HTjpncm91cDANCi1YLVJFRFVDVElPTjowDQotUkVWOjIwMDgxMDMxVDA2NTg1NFoNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUxZWVhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdGV4dCB0aGUgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsgZW5kIHRvIGVuZC4KLSAqIDxwPgotICogTm90ZTogU2luY2UgYWNjZXNzaWJpbGl0eSBpcyBwcm92aWRlZCBieSB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3ZSBjcmVhdGUgb25lLAotICogYW5kIGl0IGdlbmVyYXRlcyBhbiBldmVudCBhbmQgYW4gaW50ZXJydXB0aW9uIGRpc3BhdGNoaW5nIHRoZW0gdGhyb3VnaCB0aGUKLSAqIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uIFdlIHZlcmlmeSB0aGUgcmVjZWl2ZWQgcmVzdWx0LiBUbyB0cmlnZ2VyIHRoZSB0ZXN0Ci0gKiBnbyB0byBTZXR0aW5ncy0+QWNjZXNzaWJpbGl0eSBhbmQgc2VsZWN0IHRoZSBlbmFibGUgYWNjZXNzaWJpbGl0eSBjaGVjayBhbmQgdGhlbgotICogc2VsZWN0IHRoZSBjaGVjayBmb3IgdGhpcyBzZXJ2aWNlIChzYW1lIG5hbWUgYXMgdGhlIGNsYXNzKS4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJmb28uYmFyLmJhei5UZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImZvby5iYXIuYmF6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJTb21lIHN0dWZmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1RFWFQgPSAiU29tZSBvdGhlciBzdHVmZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ERVNDUklQVElPTiA9ICJDb250ZW50IGRlc2NyaXB0aW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX0NPVU5UID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfSVRFTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPSAweDAwMDAwMjAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZST01fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERFRF9DT1VOVCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfQ09VTlQgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUyA9IDgwOwotCi0gICAgcHJpdmF0ZSBpbnQgbVJlY2VpdmVkUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBUaW1lciBtVGltZXIgPSBuZXcgVGltZXIoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7Ci0gICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFU19BTExfTUFTSzsKLSAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKLSAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTOwotICAgICAgICBpbmZvLmZsYWdzICY9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOwotICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHN5c3RlbSBwaWNrcyBvdXIgY29uZmlndXJhdGlvbgotICAgICAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBub3Qgbm90aWZ5IHVzCi0gICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgaW4gdGVzdGluZyBBY2Nlc3NpYmlsaXR5IGZlYXR1cmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDEwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGhlcmUgaWYgdGhlIGV2ZW50IHdlIHJlY2VpdmVkIGlzIGFjdHVhbGx5IHRoZSBvbmUgd2Ugc2VudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYXNzZXJ0KEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0KENMQVNTX05BTUUuZXF1YWxzKGV2ZW50LmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydChQQUNLQUdFX05BTUUuZXF1YWxzKGV2ZW50LmdldFBhY2thZ2VOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gZXZlbnQuZ2V0VGV4dCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydChURVhULmVxdWFscyhldmVudC5nZXRUZXh0KCkuZ2V0KDApKSk7Ci0gICAgICAgIGFzc2VydChCRUZPUkVfVEVYVC5lcXVhbHMoZXZlbnQuZ2V0QmVmb3JlVGV4dCgpKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0NoZWNrZWQoKSk7Ci0gICAgICAgIGFzc2VydChDT05URU5UX0RFU0NSSVBUSU9OLmVxdWFscyhldmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkpOwotICAgICAgICBhc3NlcnQoSVRFTV9DT1VOVCA9PSBldmVudC5nZXRJdGVtQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChDVVJSRU5UX0lURU1fSU5ERVggPT0gZXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzRW5hYmxlZCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzUGFzc3dvcmQoKSk7Ci0gICAgICAgIGFzc2VydChGUk9NX0lOREVYID09IGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KEFEREVEX0NPVU5UID09IGV2ZW50LmdldEFkZGVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChSRU1PVkVEX0NPVU5UID09IGV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydCgxID09ICgoTm90aWZpY2F0aW9uKSBldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpKS5pY29uKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBmbGFnIHRoYXQgd2UgcmVjZWl2ZWQgdGhlIGludGVycnVwdCByZXF1ZXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgewotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gaXMgc2VudCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7Ci0KLSAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKENMQVNTX05BTUUpOwotICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKFBBQ0tBR0VfTkFNRSk7Ci0gICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChURVhUKTsKLSAgICAgICBldmVudC5zZXRCZWZvcmVUZXh0KEJFRk9SRV9URVhUKTsKLSAgICAgICBldmVudC5zZXRDaGVja2VkKHRydWUpOwotICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihDT05URU5UX0RFU0NSSVBUSU9OKTsKLSAgICAgICBldmVudC5zZXRJdGVtQ291bnQoSVRFTV9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleChDVVJSRU5UX0lURU1fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0RnJvbUluZGV4KEZST01fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEFkZGVkQ291bnQoQURERURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFJlbW92ZWRDb3VudChSRU1PVkVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRQYXJjZWxhYmxlRGF0YShuZXcgTm90aWZpY2F0aW9uKDEsICJGb28iLCAxMjM0KSk7Ci0KLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLQotICAgICAgIGFzc2VydChtUmVjZWl2ZWRSZXN1bHQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmc6IFN1Y2Nlc3MiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBJZiBhY2Nlc3NpYmlsaXR5IGZlZWRiYWNrIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLmludGVycnVwdCgpOwotCi0gICAgICAgYXNzZXJ0KElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPT0gbVJlY2VpdmVkUmVzdWx0KTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEludGVycnVwdDogU3VjY2VzcyIpOwotICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCmluZGV4IGZiNWEzNmYuLjAyNjVjODcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCkBAIC05Miw0MyArOTIsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEN1cnNvclVwZGF0ZSgpIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCi0gICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkIElOVEVHRVIsIHMgSU5URUdFUik7Iik7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gdGVzdCAoZCwgcykgVkFMVUVTICgiICsgaSArIAotICAgICAgICAgICAgICAgICIsIiArIGklMiArICIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeSgidGVzdCIsIG51bGwsICJzID0gMCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBpbnQgZENvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkIik7Ci0gICAgICAgIGludCBzQ29sID0gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coInMiKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjLnVwZGF0ZUludChkQ29sLCAzKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGMucmVxdWVyeSgpKTsKLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgYy5nZXRJbnQoZENvbCkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb3VudCk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5tb3ZlVG9GaXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmRlbGV0ZVJvdygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGMuZ2V0Q291bnQoKSk7Ci0gICAgICAgIGMuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjcmVhdGUgdGFibGUKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCkBAIC0xNjQsMjQgKzEyNyw3IEBACiAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhibG9iLCBjQmxvYikpOwogICAgICAgICBhc3NlcnRFcXVhbHMocywgYy5nZXRTdHJpbmcoc0NvbCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGRvdWJsZSlkLCBjLmdldERvdWJsZShkQ29sKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbmV3IGJ5dGVbXQotICAgICAgICBieXRlW10gbmV3YmxvYiA9IG5ldyBieXRlWzEwMDBdOwotICAgICAgICB2YWx1ZSA9IDk4OwotICAgICAgICBBcnJheXMuZmlsbChibG9iLCB2YWx1ZSk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGMudXBkYXRlQmxvYihiQ29sLCBuZXdibG9iKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNvbW1pdAotICAgICAgICBhc3NlcnRUcnVlKGMuY29tbWl0VXBkYXRlcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIGMubW92ZVRvTmV4dCgpOwotICAgICAgICBjQmxvYiA9ICBjLmdldEJsb2IoYkNvbCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXdibG9iLCBjQmxvYikpOyAgICAgICAgCi0gICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWwsIGMuZ2V0TG9uZyhsQ29sKSk7ICAgICAgICAKICAgICB9CiAgICAgCiAgICAgQE1lZGl1bVRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQppbmRleCA2NTYwMjlkLi5jODZiZGZhIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCkBAIC0yNiwxMyArMjYsMTYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIApAQCAtNDY3LDQ1ICs0NzAsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdGlmaWNhdGlvblRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIEN1cnNvciBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeShOb3Rlcy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge05vdGVzLl9JRCwgTm90ZXMuTk9URX0sCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobmV3IE15Q29udGVudE9ic2VydmVyKHRydWUpKTsKLSAgICAgICAgaW50IGNvdW50ID0gYy5jb3VudCgpOwotCi0gICAgICAgIE15Q29udGVudE9ic2VydmVyIG9ic2VydmVyID0gbmV3IE15Q29udGVudE9ic2VydmVyKGZhbHNlKTsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihOb3Rlcy5DT05URU5UX1VSSSwgdHJ1ZSwgb2JzZXJ2ZXIpOwotCi0gICAgICAgIFVyaSB1cmk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuTk9URSwgInRlc3Qgbm90ZTEiKTsKLSAgICAgICAgdXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBjLnJlcXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgYy5jb3VudCgpKTsKLSAgICAgICAgYy5maXJzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgbm90ZTEiLCBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4KE5vdGVzLk5PVEUpKSk7Ci0gICAgICAgIGMudXBkYXRlU3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSksICJ0ZXN0IG5vdGUyIik7Ci0gICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKQEAgLTEwMjMsNiArOTg3LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbnNXaXRoQmluZEFyZ3MoKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB1bmlvbnMgd2l0aCBiaW5kYXJncyB3b3JrIGh0dHA6Ly9iL2lzc3VlP2lkPTEwNjEyOTEgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBBIChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgQiAoayBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEMgKG4gaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMik7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEMgdmFsdWVzKDkwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDIpOyIpOworICAgICAgICBTdHJpbmcgcyA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+IDIgIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gMjAxICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPTkwMDsiOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzLCBudWxsKTsKKyAgICAgICAgaW50IG4gPSBjLmdldENvdW50KCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHMxID0gInNlbGVjdCBpIGZyb20gQSB3aGVyZSBpID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IGsgZnJvbSBCIHdoZXJlIGsgPiA/ICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPSA/OyI7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeShzMSwgbmV3IFN0cmluZ1tdeyIyIiwgIjIwMSIsICI5MDAifSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHRlc3QgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaGFzIGEgbG9jYWxlIHdpdGggdGhlIGxhbmd1YWdlICJqYSIuCiAgICAgICogSXQgZmluaXNoZXMgd2l0aG91dCBmYWlsdXJlIHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZS4gIApAQCAtMTEwOCw1ICsxMTAwLDMwNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gICAgCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMcnVDYWNoaW5nT2ZTcWxpdGVDb21waWxlZFNxbE9ianMoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEsMSk7Iik7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIGRvIE4rMSBxdWVyaWVzIC0gYW5kIHdoZW4gdGhlIDB0aCBlbnRyeSBpcyByZW1vdmVkIGZyb20gTFJVIGNhY2hlIGR1ZSB0byB0aGUKKyAgICAgICAgLy8gaW5zZXJ0aW9uIG9mIChOKzEpdGggZW50cnksIG1ha2Ugc3VyZSAwdGggZW50cnkgaXMgY2xvc2VkCisgICAgICAgIEFycmF5TGlzdDxTUUxpdGVTdGF0ZW1lbnQ+IHN0bXRPYmpzID0gbmV3IEFycmF5TGlzdDxTUUxpdGVTdGF0ZW1lbnQ+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBjID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gIiArIGkpOworICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgc3RtdE9ianMuYWRkKGksIGMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXRPYmpzLmdldCgwKS5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdG10T2Jqcy5nZXQoaSkuZ2V0VW5pcXVlSWQoKSA+IDApOworICAgICAgICB9CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYXhDYWhlc2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gdHJ5IHJlZHVjZSBjYWNoZXNpemUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgeworICAgICAgICBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gYW5kIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLgorICAgICAgICAvLyBpdCBzaG91bGQgZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAgICBGaWxlIGRiZmlsZSA9IG5ldyBGaWxlKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihtRGF0YWJhc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UuIGFuZCBjb3JydXB0aW9uIGhhbmRsZXIgc2hvdWxkbid0IHRyeSB0byBkZWxldGUgaXQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbWVtb3J5RGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiOm1lbW9yeToiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1vcnlEYik7CisgICAgICAgIG1lbW9yeURiLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lbW9yeURiLmlzT3BlbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obWVtb3J5RGIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGtlZXAgaXQgb3BlbiwgY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJPYmogPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2UuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBkYXRhYmFzZSwgYXR0YWNoIDIgbW9yZSBkYXRhYmFzZXMgdG8gaXQKKyAgICAgICAgLy8gICAgYXR0YWNoZWQgZGF0YWJhc2UgIyAxOiAiOm1lbW9yeToiCisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMjogbURhdGFiYXNlLmdldFBhdGgoKSArICIxIjsKKyAgICAgICAgLy8gY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGVzIGluY2x1ZGluZyB0aGUgb25lIGZvciBhdHRhY2hlZCBkYXRhYmFzZSAjIDIKKyAgICAgICAgLy8gc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU3RyaW5nIGF0dGFjaGVkRGIxRmlsZSA9IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnIiArICBhdHRhY2hlZERiMUZpbGUgKyAiJyBhcyBhdHRhY2hlZERiMSIpOworICAgICAgICBhc3NlcnRUcnVlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiMUZpbGUpLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGlzIGlzIGEgYml0IG9mIHN0cmVzcyB0ZXN0aW5nLiBhdHRhY2ggNSBkYXRhYmFzZSBmaWxlcworICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCByZW1vdmVkLgorICAgICAgICBpbnQgTiA9IDU7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF0dGFjaGVkRGJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJGaWxlcy5hZGQobURhdGFiYXNlLmdldFBhdGgoKSArIGkpOworICAgICAgICB9CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYkZpbGVzLmdldChpKSArICInIGFzIGF0dGFjaGVkRGIiICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkpLmV4aXN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBzdGF0ZW1lbnQgZmluYWxpemF0aW9ucyBhcmUgbm90IGRvbmUgcmlnaHQgYXdheSBidXQKKyAgICAgKiBwaWdneWJhY2tlZCBvbnRvIHRoZSBuZXh0IHNxbCBzdGF0ZW1lbnQgZXhlY3V0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2UoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2VcCisgICAgICAgIGludCBOID0gMjY7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICBpbnQgc3RtdDBJZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIpOyIpOworICAgICAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBzdG10LmdldFVuaXF1ZUlkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10MSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgaSA9IDE7Iik7CisgICAgICAgIHN0bXQxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdGhlIGFib3ZlIGNsb3NlKCkgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRlbWVudElkcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgc3RhdGVtZW50IHRvIGJlIGZpbmFsaXplZCBpcyBmcm9tIFRocmVhZCAjIDEuCisgICAgICogYW5kIGl0IGlzIGV2ZW50dWFsbHkgZmluYWxpemVkIGluIFRocmVhZCAjIDIgd2hlbiBpdCBleGVjdXRlcyBhIHNxbCBzdGF0ZW1lbnQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VEaWZmVGhyZWFkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCk7Iik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IDI2OworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0bXQwSWQoc3RtdC5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAorICAgICAgICB0MS5qb2luKCk7CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSAxOyIpOworICAgICAgICAgICAgICAgIHN0bXQxLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHQyLmpvaW4oKTsKKworICAgICAgICAvLyBjbG9zZSgpIGluIHRoZSBhYm92ZSB0aHJlYWQgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gaXMgdGhlIHN0YXRlbWVudCBmaW5hbGl6ZWQ/CisgICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBzdG10MElkID0gMDsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldFN0bXQwSWQoaW50IHN0bXQwSWQpIHsKKyAgICAgICAgdGhpcy5zdG10MElkID0gc3RtdDBJZDsKKyAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldFN0bXQwSWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0bXQwSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBxdWV1ZSBvZiBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhcmUgZmluYWxpemVkCisgICAgICogYnkgZGF0YWJhc2UgY2xvc2UoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZUJ5RGJDbG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UgaW4gYSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSAyNjsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIik7Iik7CisgICAgICAgICAgICAgICAgICAgIHN0bXQuZXhlY3V0ZUluc2VydCgpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdG10MElkKHN0bXQuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10MSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gMTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRTdG10MElkKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlLiBldmVyeXRoaW5nIGZyb20gbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UKKyAgICAgICAgLy8gc2hvdWxkIGJlIGZpbmFsaXplZCBhbmQgY2xlYXJlZCBmcm9tIHRoZSBsaXN0CisgICAgICAgIC8vIGFnYWluIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MyA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gY2hlY2sgbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UuIGl0IHNob3VsZCBiZSBlbXB0eQorICAgICAgICBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOThiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VHZW5lcmFsVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OID0gNDI7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYlNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlRlYXJkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiZGF0YWJhc2VfdGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFZlcnNpb24oQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb29sKTsKKyAgICAgICAgLy8gbWFrZSB0aGUgc2FtZSBjYWxsIGFnYWluIGFuZCBtYWtlIHN1cmUgdGhlIHBvb2wgYWxyZWFkeSBzZXR1cCBpcyBub3QgcmUtY3JlYXRlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvb2wsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q29ubmVjdGlvblBvb2xTaXplKCkgeworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byB6ZXJvCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDApOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgICAgIC8vIHNldCBwb29sIHNpemUgdG8gYSB2YWxpZCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBjYW4ndCBzZXQgcG9vbCBzaXplIHRvIDwgdGhlIHZhbHVlIGFib3ZlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBlbnN1cmUgdGhhdCByZWFkZXJzIGFyZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGRhdGEgKG9sZCB2ZXJzaW9ucykKKyAgICAgKiBFVkVOIFdIRU4gdGhlIHdyaXRlciBpcyBpbiBhIHRyYW5zYWN0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqPHA+CisgICAgICogVGhpcyB0ZXN0IHN0YXJ0cyAxIFdyaXRlciBhbmQgMiBSZWFkZXJzIGFuZCBzZXRzIHVwIGNvbm5lY3Rpb24gcG9vbCBmb3IgcmVhZGVycworICAgICAqIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZCB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogV3JpdGVyIGRvZXMgdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBiZWdpbiB0cmFuc2FjdGlvbgorICAgICAqICAgICBpbnNlcnQgaW50byB0YWJsZV8xCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzIKKyAgICAgKiAgICAgY29tbWl0CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogQXMgbG9uZyBhIHRoZSB3cml0ZXIgaXMgYWxpdmUsIFJlYWRlcnMgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AgYXQgdGhlIHNhbWUgdGltZQorICAgICAqIDxwcmU+CisgICAgICogICAgIFJlYWRlcl9LIGRvZXMgInNlbGVjdCBjb3VudCgqKSBmcm9tIHRhYmxlX0siICB3aGVyZSBLID0gMSBvciAyCisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcnVuIGZvciBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1Igc2VjLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZXN0IGlzIHJlcGVhdGVkIGZvciBkaWZmZXJlbnQgY29ubmVjdGlvbi1wb29sLXNpemVzICgxLi4zKQorICAgICAqIDxwPgorICAgICAqIEFuZCBhdCB0aGUgZW5kIG9mIG9mIGVhY2ggdGVzdCwgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGFyZSBwcmludGVkCisgICAgICogPHVsPgorICAgICAqICAgIDxsaT5jb25uZWN0aW9uLXBvb2wtc2l6ZTwvbGk+CisgICAgICogICAgPGxpPm51bWJlci1vZi10cmFuc2FjdGlvbnMgYnkgd3JpdGVyPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyIG9mIHJlYWRzIGJ5IHJlYWRlcl9LIHdoaWxlIHRoZSB3cml0ZXIgaXMgSU4gb3IgTk9ULUlOIHhhY3Rpb248L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW5jeUVmZmVjdHNPZkNvbm5Qb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJ1biB0aGUgdGVzdCB3aXRoIHNxbGl0ZSBXQUwgZW5hYmxlCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdCh0cnVlKTsKKworICAgICAgICAvLyBydW4gdGhlIHNhbWUgdGVzdCBXSVRIT1VUIHNxbGl0ZSBXQUwgZW5hYmxlZAorICAgICAgICBydW5Db25uZWN0aW9uUG9vbFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Db25uZWN0aW9uUG9vbFRlc3QoYm9vbGVhbiB1c2VXYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgTSA9IDM7CisgICAgICAgIFN0cmluZ0J1aWxkZXJbXSBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXJbTV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXNlV2FsKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRDb25uZWN0aW9uUG9vbFNpemUoaSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MSAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdDIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyBrKyspIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDEgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtrKyIiLCBrKyIifSk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHQyIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aysiIiwgaysiIn0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IGEgd3JpdGVyCisgICAgICAgICAgICBXcml0ZXIgdyA9IG5ldyBXcml0ZXIobURhdGFiYXNlKTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbiBhcnJheSBvZiBjb3VudGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIHJlYWRlcnMKKyAgICAgICAgICAgIFJlYWRlciByMSA9IG5ldyBSZWFkZXIobURhdGFiYXNlLCAidDEiLCB3LCAwKTsKKyAgICAgICAgICAgIFJlYWRlciByMiA9IG5ldyBSZWFkZXIobURhdGFiYXNlLCAidDIiLCB3LCAxKTsKKyAgICAgICAgICAgIHcuc3RhcnQoKTsKKyAgICAgICAgICAgIHIxLnN0YXJ0KCk7CisgICAgICAgICAgICByMi5zdGFydCgpOworCisgICAgICAgICAgICAvLyB3YWl0IGZvciBhbGwgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgICAgIHcuam9pbigpOworICAgICAgICAgICAgcjEuam9pbigpOworICAgICAgICAgICAgcjIuam9pbigpOworCisgICAgICAgICAgICAvLyBwcmludCB0aGUgc3RhdHMKKyAgICAgICAgICAgIGludFtdW10gY291bnRzID0gZ2V0Q291bnRzKCk7CisgICAgICAgICAgICBidWZmW2ldID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCJjb25ucG9vbC1zaXplID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChpICsgMSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBudW0geGFjdHMgYnkgd3JpdGVyID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChnZXROdW1YYWN0cygpKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIG51bS1yZWFkcy1pbi14YWN0L05PVC1pbi14YWN0IGJ5IHJlYWRlcjEgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGNvdW50c1swXVsxXSArICIvIiArIGNvdW50c1swXVswXSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBieSByZWFkZXIyID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChjb3VudHNbMV1bMV0gKyAiLyIgKyBjb3VudHNbMV1bMF0pOworCisgICAgICAgICAgICBMb2cuaShUQUcsICJkb25lIHRlc3RpbmcgZm9yIGNvbm4tcG9vbC1zaXplIG9mICIgKyAoaSsxKSk7CisKKyAgICAgICAgICAgIGRiVGVhcmRvd24oKTsKKyAgICAgICAgICAgIGRiU2V0VXAoKTsKKyAgICAgICAgfQorICAgICAgICBMb2cuaShUQUcsICJkdXJhdGlvbiBvZiB0ZXN0ICIgKyBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgKyAiIHNlYyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCBidWZmW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluWGFjdCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG51bVhhY3RzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgPSAxNTsgLy8gbnVtIHNlYyB0aGlzIHRlc3Qgc2hvdWRsIHJ1bgorICAgIHByaXZhdGUgaW50W11bXSBjb3VudHMgPSBuZXcgaW50WzJdWzJdOworCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpblhhY3QoKSB7CisgICAgICAgIHJldHVybiBpblhhY3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJblhhY3RGbGFnKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpblhhY3QgPSBmbGFnOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0Q291bnRzKGludCByZWFkZXJOdW0sIGludFtdIG51bVJlYWRzKSB7CisgICAgICAgIGNvdW50c1tyZWFkZXJOdW1dWzBdID0gbnVtUmVhZHNbMF07CisgICAgICAgIGNvdW50c1tyZWFkZXJOdW1dWzFdID0gbnVtUmVhZHNbMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50W11bXSBnZXRDb3VudHMoKSB7CisgICAgICAgIHJldHVybiBjb3VudHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXROdW1YYWN0cyhpbnQgbnVtKSB7CisgICAgICAgIG51bVhhY3RzID0gbnVtOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXROdW1YYWN0cygpIHsKKyAgICAgICAgcmV0dXJuIG51bVhhY3RzOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgV3JpdGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIHB1YmxpYyBXcml0ZXIoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gaW4gYSBsb29wLCBmb3IgTiBzZWMsIGRvIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIC8vICAgIEJFR0lOIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAvLyAgICBpbnNlcnQgaW50byB0YWJsZSB0MSwgdDIKKyAgICAgICAgICAgIC8vICAgIENvbW1pdAorICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgZm9yIChrID0gMDsoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3cpIC8gMTAwMCA8IFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUjsgaysrKSB7CisgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICAgICAgICAgIHNldEluWGFjdEZsYWcodHJ1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoImluc2VydCBpbnRvIHQxIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aSsiIiwgaSsiIn0pOworICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJpbnNlcnQgaW50byB0MiB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2krIiIsIGkrIiJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICAgICAgc2V0SW5YYWN0RmxhZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE51bVhhY3RzKGspOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZWFkZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGUgPSBudWxsOworICAgICAgICBwcml2YXRlIFdyaXRlciB3ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmVhZGVyTnVtOworICAgICAgICBwcml2YXRlIGludFtdIG51bVJlYWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgcHVibGljIFJlYWRlcihTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHRhYmxlLCBXcml0ZXIgdywgaW50IHJlYWRlck51bSkgeworICAgICAgICAgICAgdGhpcy5kYiA9IGRiOworICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgICAgIHRoaXMucmVhZGVyTnVtID0gcmVhZGVyTnVtOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgd3JpdGUgaXMgYWxpdmUsIGluIGEgbG9vcCBkbyB0aGUgcXVlcnkgb24gYSB0YWJsZQorICAgICAgICAgICAgd2hpbGUgKHcuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLCAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIHRoaXMudGFibGUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY291bnQgb2YgcmVhZHMKKyAgICAgICAgICAgICAgICAgICAgbnVtUmVhZHNbaW5YYWN0KCkgPyAxIDogMF0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb3VudHMocmVhZGVyTnVtLCBudW1SZWFkcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2MwNzczLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLQotLyoqCi0gKiBDb250ZW50VmFsdWVzLWxpa2UgY2xhc3Mgd2hpY2ggZW5hYmxlcyB1c2VycyB0byBjaGFpbiBwdXQoKSBtZXRob2RzIGFuZCByZXN0cmljdHMKLSAqIHRoZSBvdGhlciBtZXRob2RzLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXM7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgQnl0ZSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgU2hvcnQgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIExvbmcgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXROdWxsKFN0cmluZyBrZXkpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0TnVsbChrZXkpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTk4NzUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlIYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBDb250ZW50VmFsdWVzVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgTGlzdDxDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtPiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbUluZGV4OwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gYWRkRWxlbShBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBpbXBvcnRWZXJpZmllciA9IG5ldyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5hZGQoaW1wb3J0VmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gaW1wb3J0VmVyaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZDYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwKLSAgICAgICAgICAgICAgICB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIHVzZSBTdHJpY3RQYXJzaW5nCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfQotICAgICAgICB2ZXJpZnkoaXMsIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGJ1aWxkZXIgPQotICAgICAgICAgICAgbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3RvcihudWxsLCBudWxsLCBmYWxzZSwgdkNhcmRUeXBlLCBudWxsKTsKLSAgICAgICAgYnVpbGRlci5hZGRFbnRyeUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgYnVpbGRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtIDogbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0KSB7Ci0gICAgICAgICAgICBlbGVtLm9uUGFyc2luZ1N0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChWQ2FyZEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKG1JbmRleCA8IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpOwotICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QuZ2V0KG1JbmRleCkub25FbnRyeUNyZWF0ZWQoZW50cnkpOwotICAgICAgICBtSW5kZXgrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpIHsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gOiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QpIHsKLSAgICAgICAgICAgIGVsZW0ub25QYXJzaW5nRW5kKCk7Ci0gICAgICAgICAgICBlbGVtLnZlcmlmeVJlc29sdmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYmIzNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29tbWl0dGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1UZXN0Q2FzZTsKLSAgICBwcml2YXRlIGZpbmFsIEltcG9ydFRlc3RSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZEVudHJ5SGFuZGxlciBtSGFuZGxlcjsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtUmVzb2x2ZXIgPSBuZXcgSW1wb3J0VGVzdFJlc29sdmVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IFZDYXJkRW50cnlDb21taXR0ZXIobVJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkRXhwZWN0ZWQoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgbVJlc29sdmVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VmFsdWVzQnVpbGRlcihjb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZDYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdkNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXI7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1YzMCh2Q2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMzAodHJ1ZSk7ICAvLyB1c2UgU3RyaWN0UGFyc2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IobnVsbCwgbnVsbCwgZmFsc2UsIHZDYXJkVHlwZSwgbnVsbCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkRW50cnlIYW5kbGVyKG1IYW5kbGVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCBidWlsZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZlcmlmeVJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5UmVzb2x2ZXIoKSB7Ci0gICAgICAgIG1SZXNvbHZlci52ZXJpZnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdTdGFydCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25TdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbnRyeUNyZWF0ZWQoZW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUGFyc2luZ0VuZCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbmQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjhlODMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0N1cnNvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIHB1YmxpYyBjbGFzcyBFeHBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBFeHBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotICAgIHB1YmxpYyBFeHBvcnRUZXN0UmVzb2x2ZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVByb3ZpZGVyID0gbmV3IEV4cG9ydFRlc3RQcm92aWRlcih0ZXN0Q2FzZSk7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFZDYXJkQ29tcG9zZXIuVkNBUkRfVEVTVF9BVVRIT1JJVFksIG1Qcm92aWRlcik7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLCBtUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRDb250YWN0RW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYnVpbGRJbnB1dEVudHJ5KCk7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIE1vY2tFbnRpdHlJdGVyYXRvciBpbXBsZW1lbnRzIEVudGl0eUl0ZXJhdG9yIHsKLSAgICBMaXN0PEVudGl0eT4gbUVudGl0eUxpc3Q7Ci0gICAgSXRlcmF0b3I8RW50aXR5PiBtSXRlcmF0b3I7Ci0KLSAgICBwdWJsaWMgTW9ja0VudGl0eUl0ZXJhdG9yKExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgbUVudGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVudGl0eT4oKTsKLSAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkobmV3IENvbnRlbnRWYWx1ZXMoKSk7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoRGF0YS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUVudGl0eUxpc3QuYWRkKGVudGl0eSk7Ci0gICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eSBuZXh0KCkgewotICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci19Ci0KLS8qKgotICogUmVwcmVzZW50cyBvbmUgY29udGFjdCwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gbXVsdGlwbGUgQ29udGVudFZhbHVlcyBsaWtlCi0gKiBTdHJ1Y3R1cmVkTmFtZSwgRW1haWwsIGV0Yy4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBDb250YWN0RW50cnkgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBtQ29udGVudFZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCk7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkQ29udGVudFZhbHVlcyhTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtQ29udGVudFZhbHVlc0xpc3QuYWRkKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbnRlbnRWYWx1ZXM+IGdldExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGVudFZhbHVlc0xpc3Q7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIEV4cG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIGZpbmFsIHByaXZhdGUgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4gbUNvbnRhY3RFbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBFeHBvcnRUZXN0UHJvdmlkZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBidWlsZElucHV0RW50cnkoKSB7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBjb250YWN0RW50cnkgPSBuZXcgQ29udGFjdEVudHJ5KCk7Ci0gICAgICAgIG1Db250YWN0RW50cnlMaXN0LmFkZChjb250YWN0RW50cnkpOwotICAgICAgICByZXR1cm4gY29udGFjdEVudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIG9sZCBtZXRob2Qgd2hpY2ggaGFkIGV4aXN0ZWQgYnV0IHdhcyByZW1vdmVkIGZyb20gQ29udGVudFJlc29sdmVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBzdGlsbCBrZWVwIHVzaW5nIHRoaXMgbWV0aG9kIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBwcm9wZWVyIHdheSB0byBrbm93Ci0gICAgICogd2hpY2ggdmFsdWUgaW4gdGhlIENvbnRlbnRWYWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgZW50cnkgaW4gQ29udGFjdHMgZGF0YWJhc2UuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldGFpbDoKLSAgICAgKiBUaGVyZSdzIGFuIGVhc3kgd2F5IHRvIGtub3cgd2hpY2ggaW5kZXggImZhbWlseSBuYW1lIiBjb3JyZXNwb25kcyB0bywgdmlhCi0gICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdH0uCi0gICAgICogRkFNSUxZX05BTUUgZXF1YWxzIERBVEEzLCBzbyB0aGUgY29ycmVzcG9uZGluZyBpbmRleAotICAgICAqIGZvciAiZmFtaWx5IG5hbWUiIHNob3VsZCBiZSAyIChub3RlIHRoYXQgaW5kZXggaXMgMC1vcmlnaW4pLgotICAgICAqIEhvd2V2ZXIsIHdlIGNhbm5vdCBrbm93IHdoYXQgdGhlIGluZGV4IDIgY29ycmVzcG9uZHMgdG87IGl0IG1heSBiZSAiZmFtaWx5IG5hbWUiLAotICAgICAqICJsYWJlbCIgZm9yIG5vdywgYnV0IG1heSBiZSB0aGUgb3RoZXIgc29tZSBjb2x1bW4gaW4gdGhlIGZ1dHVyZS4gV2UgZG9uJ3QgaGF2ZQotICAgICAqIGNvbnZlbmllbnQgd2F5IHRvIGtub3cgdGhlIG9yaWdpbmFsIGRhdGEgc3RydWN0dXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3IgcXVlcnlFbnRpdGllcyhVcmkgdXJpLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZSh1cmkgIT0gbnVsbCk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHModXJpLmdldFNjaGVtZSgpKSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHkgPSB1cmkuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLmVxdWFscyhhdXRob3JpdHkpKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoKERhdGEuQ09OVEFDVF9JRCArICI9PyIpLmVxdWFscyhzZWxlY3Rpb24pKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscygxLCBzZWxlY3Rpb25BcmdzLmxlbmd0aCk7Ci0gICAgICAgIGZpbmFsIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0aW9uQXJnc1swXSk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKGlkID49IDAgJiYgaWQgPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0VudGl0eUl0ZXJhdG9yKG1Db250YWN0RW50cnlMaXN0LmdldChpZCkuZ2V0TGlzdCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoVkNhcmRDb21wb3Nlci5DT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLmVxdWFscyh1cmkpKTsKLSAgICAgICAgLy8gSW4gdGhpcyB0ZXN0LCBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb24pOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoc29ydE9yZGVyKTsKLQotICAgICAgICByZXR1cm4gbmV3IE1vY2tDdXJzb3IoKSB7Ci0gICAgICAgICAgICBpbnQgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9GaXJzdCgpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9OZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFBvc2l0aW9uIDwgbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24rKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZUZpcnN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uIDwgMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbiA+PSBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgY29sdW1uTmFtZSkgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRFcXVhbHMoQ29udGFjdHMuX0lELCBjb2x1bW5OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDAsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShtQ3VycmVudFBvc2l0aW9uID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJbnQoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZjZmNzkuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0ltcG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBJbXBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBmaW5hbCBJbXBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RSZXNvbHZlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgSW1wb3J0VGVzdFByb3ZpZGVyKHRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBlcXVhbHNTdHJpbmcoYXV0aG9yaXR5LCBSYXdDb250YWN0cy5DT05URU5UX1VSSS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5hcHBseUJhdGNoKG9wZXJhdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBtUHJvdmlkZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBtUHJvdmlkZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0gICAgICAgIGlmIChhID09IG51bGwgfHwgYS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogcGFja2FnZSAqLyBjbGFzcyBJbXBvcnRUZXN0UHJvdmlkZXIgZXh0ZW5kcyBNb2NrQ29udGVudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25NaW1lVHlwZVNldCA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUsIFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgSW0uQ09OVEVOVF9JVEVNX1RZUEUsIE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgTm90ZS5DT05URU5UX0lURU1fVFlQRSwgV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgR3JvdXBNZW1iZXJzaGlwLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0KLSAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+PiBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlczsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RQcm92aWRlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+PigpOwotICAgICAgICBmb3IgKFN0cmluZyBhY2NlcHRhbmJsZU1pbWVUeXBlIDogc0tub3duTWltZVR5cGVTZXQpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgSGFzaFNldCBzaW5jZSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIHRoZSBjb250ZW50IG9mCi0gICAgICAgICAgICAvLyBDb250ZW50VmFsdWVzIGFmdGVyIHRoZSBpbnNlcnRpb24sIHdoaWNoIG1ha2UgdGhlIHJlc3VsdCBvZiBoYXNoQ29kZSgpCi0gICAgICAgICAgICAvLyBjaGFuZ2VzLi4uCi0gICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5wdXQoCi0gICAgICAgICAgICAgICAgICAgIGFjY2VwdGFuYmxlTWltZVR5cGUsIG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gZXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICBpZiAoIXNLbm93bk1pbWVUeXBlU2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlVua25vdyBNaW1lVHlwZSAlcyBpbiB0aGUgdGVzdCBjb2RlLiBUZXN0IGNvZGUgc2hvdWxkIGJlIGJyb2tlbi4iLAotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgY29udGVudFZhbHVlc0NvbGxlY3Rpb24uYWRkKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJUaGVyZSBpcyBubyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9wZXJhdGlvbnMuc2l6ZSgpOwotICAgICAgICBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBmYWtlUmVzdWx0QXJyYXkgPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0W3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCBTdHJpbmcudmFsdWVPZihpKSk7Ci0gICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXlbaV0gPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0KHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gb3BlcmF0aW9uLnJlc29sdmVWYWx1ZUJhY2tSZWZlcmVuY2VzKAotICAgICAgICAgICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXksIGkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGFjdHVhbENvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gb3BlcmF0aW9uLmdldFVyaSgpOwotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoYWN0dWFsQ29udGVudFZhbHVlcy5nZXQoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoYWN0dWFsQ29udGVudFZhbHVlcy5nZXQoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHVyaS5lcXVhbHMoRGF0YS5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBhY3R1YWxDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICAgICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gTWltZVR5cGUgJXMuIFByb2JhYmx5IGFkZGVkIGFmdGVyIGRldmVsb3BpbmcgdGhpcyB0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZGF0YSBtZWFuaW5nbGVzcyBpbiB0aGlzIHVuaXQgdGVzdHMuCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCBEYXRhLkRBVEExIC0gREFUQTcgYXJlIHNldCB0byBudWxsIG9yIGVtcHR5IFN0cmluZwotICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0LCBidXQgaXQgbWF5IGNoYW5nZSBkZXBlbmRpbmcgb24gaG93Ci0gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXItcmVsYXRlZCBjb2RlIGhhbmRsZXMgaXQuCi0gICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgaWdub3JlIHRoZXNlIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBzcGVjcyBhbmQKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHdoZXRoZXIgdkNhcmQgaW1wb3J0ZXIgY29ycmVjdGx5IGluc2VydHMgcmVsbGV2ZW50IGRhdGEuCi0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4ga2V5VG9CZVJlbW92ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBhY3R1YWxDb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVRvQmVSZW1vdmVkLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5OiBrZXlUb0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTWltZVR5cGU6ICVzLCBkYXRhOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLCBhY3R1YWxDb250ZW50VmFsdWVzLnRvU3RyaW5nKCkpKTsgKi8KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgUkFXX0NPTlRBQ1RfSUQgZW50cnkganVzdCBmb3Igc2FmZXR5LCBzaW5jZSB3ZSBkbyBub3QgY2FyZQotICAgICAgICAgICAgICAgIC8vIGhvdyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyB0aGUgZW50cnkgaW4gdGhpcyB1bml0IHRlc3QsCi0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbENvbnRlbnRWYWx1ZXMuY29udGFpbnNLZXkoRGF0YS5SQVdfQ09OVEFDVF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcy5yZW1vdmUoRGF0YS5SQVdfQ09OVEFDVF9JRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5nZXQobWltZVR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkNvbnRlbnRWYWx1ZXMgZm9yIE1pbWVUeXBlICIgKyBtaW1lVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgZXhwZWN0ZWQgYXQgYWxsICgiICsgYWN0dWFsQ29udGVudFZhbHVlcyArICIpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvKmZvciB0ZXN0aW5nCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLCAiZXhwZWN0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiQEBAIiwgImFjdHVhbCAgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhhY3R1YWxDb250ZW50VmFsdWVzKSk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsc0ZvckNvbnRlbnRWYWx1ZXMoZXhwZWN0ZWRDb250ZW50VmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5yZW1vdmUoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiVW5leHBlY3RlZDogIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGFjdHVhbENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuRXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBVcmkgaGFzIGNvbWU6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXR1cm4gZmFrZVJlc3VsdEFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uIDoKLSAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlczogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYWlsTXNnID0KLSAgICAgICAgICAgICAgICAiVGhlcmUgaXMoYXJlKSByZW1haW5pbmcgZXhwZWN0ZWQgQ29udGVudFZhbHVlcyBpbnN0YW5jZShzKTogXG4iCi0gICAgICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoZmFpbE1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBwcmludCBDb250ZW50VmFsdWVzIHdob3NlIGNvbnRlbnQgaXMgcHJpbnRlZCB3aXRoIHNvcnRlZCBrZXlzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtaW1lVHlwZVZhbHVlID0gIiI7Ci0gICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkTWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogY29udGVudFZhbHVlcy52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyaW5nID0gKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoRGF0YS5NSU1FVFlQRS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIG1pbWVUeXBlVmFsdWUgPSB2YWx1ZVN0cmluZzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydE5vdE51bGwoa2V5KTsKLSAgICAgICAgICAgICAgICBzb3J0ZWRNYXAucHV0KGtleSwgdmFsdWVTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKERhdGEuTUlNRVRZUEUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgnPScpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChtaW1lVHlwZVZhbHVlKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBzb3J0ZWRNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChrZXkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIj1cIiIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzRm9yQ29udGVudFZhbHVlcygKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWQsIENvbnRlbnRWYWx1ZXMgYWN0dWFsKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkID09IG51bGwgfHwgYWN0dWFsID09IG51bGwgfHwgZXhwZWN0ZWQuc2l6ZSgpICE9IGFjdHVhbC5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogZXhwZWN0ZWQudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghYWN0dWFsLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgYWN0dWFsVmFsdWUgPSBhY3R1YWwuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKChieXRlW10pdmFsdWUsIChieXRlW10pYWN0dWFsVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lcXVhbHMoYWN0dWFsLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYxNWZkNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotY2xhc3MgTGluZVZlcmlmaWVyIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+IG1MaW5lVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgaW50IGluZGV4OwotCi0gICAgcHVibGljIExpbmVWZXJpZmllcihUZXN0Q2FzZSB0ZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZExpbmVWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllckVsZW0obVRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0LmFkZChsaW5lVmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gbGluZVZlcmlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIExpbmVWZXJpZmllciAoIiArIGluZGV4ICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbUxpbmVWZXJpZmllckVsZW1MaXN0LmdldChpbmRleCk7Ci0gICAgICAgIGxpbmVWZXJpZmllci52ZXJpZnkodmNhcmQpOwotCi0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIHZlcmlmeSh2Y2FyZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXJFbGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2IyOWIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWNsYXNzIExpbmVWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1FeHBlY3RlZExpbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1YzMDsKLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtKFRlc3RDYXNlIHRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkKGZpbmFsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LmFkZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVBcnJheSA9IHZjYXJkLnNwbGl0KCJcXHI/XFxuIik7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBsaW5lQXJyYXkubGVuZ3RoOwotICAgICAgICBib29sZWFuIGJlZ2luRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW5kRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdmVyc2lvbkV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZUFycmF5W2ldOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgiQkVHSU46VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFwiQkVHSU46VkNBUkRcIiBsaW5lIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmVnaW5FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJFTkQ6VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkVORDpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtSXNWMzAgPyAiVkVSU0lPTjozLjAiIDogIlZFUlNJT046Mi4xIikuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBWRVJTSU9OIGxpbmUgKyBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBCRUdJTiBjYW1lIGJlZm9yZSBCRUdJTiBwcm9wZXJ0eTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gRU5EIGNhbWUgYWZ0ZXIgRU5EIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtRXhwZWN0ZWRMaW5lTGlzdC5pbmRleE9mKGxpbmUpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBtRXhwZWN0ZWRMaW5lTGlzdC5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBsaW5lOiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBlY3RlZExpbmVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkTGluZSA6IG1FeHBlY3RlZExpbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChleHBlY3RlZExpbmUpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJFeHBlY3RlZCBsaW5lKHMpIG5vdCBmb3VuZDoiICsgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzFmNmQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Qcm9wZXJ0eU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKgotICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHRlc3RpbmcgcGFyc2VyIGNvZGUgKFZDYXJkUGFyc2VyKSwgc2luY2UgYWxsIHByb3BlcnRpZXMgY2FuIGJlCi0gKiBjaGVja2VkIHZpYSB0aGlzIGNsYXNzIHVubGlrZSB7QGxpbmsgVkNhcmRFbnRyeX0sIHdoaWNoIG9ubHkgZW1pdHMgdGhlIHJlc3VsdCBvZgotICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgZWFjaCB2Q2FyZC4gV2UgY2Fubm90IGtub3cgd2hldGhlciB2Q2FyZCBwYXJzZXIgb3IKLSAqIENvbnRhY3RTdHJ1Y3QgaXMgd3Jvbmcgd2l0aG91dGggdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBwcm9wTmFtZTsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BWYWx1ZTsKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZV92ZWN0b3I7Ci0KLSAgICAvKiogU3RvcmUgdmFsdWUgYXMgYnl0ZVtdLGFmdGVyIGRlY29kZS4KLSAgICAgKiBVc2VkIHdoZW4gcHJvcFZhbHVlIGlzIGVuY29kZWQgYnkgc29tZXRoaW5nIGxpa2UgQkFTRTY0LCBRVU9URUQtUFJJTlRBQkxFLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXM7Ci0KLSAgICAvKiogcGFyYW0gc3RvcmU6IGtleT1wYXJhbVR5cGUsIHZhbHVlPXBhcmFtVmFsdWUKLSAgICAgKiBOb3RlIHRoYXQgY3VycmVudGx5IFByb3BlcnR5Tm9kZSBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHBhcmFtLXZhbHVlcwotICAgICAqIGRlZmluZWQgaW4gdkNhcmQgMy4wIChTZWUgYWxzbyBSRkMgMjQyNikuIG11bHRpcGxlLXZhbHVlcyBhcmUgc3RvcmVkIGFzCi0gICAgICogb25lIFN0cmluZyB2YWx1ZSBsaWtlICJBLEIiLCBub3QgWyJBIiwgIkIiXS4uLgotICAgICAqIFRPRE86IGZpeCB0aGlzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBwYXJhbU1hcDsKLQotICAgIC8qKiBPbmx5IGZvciBUWVBFPT8/PyBwYXJhbSBzdG9yZS4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRTsKLQotICAgIC8qKiBTdG9yZSBncm91cCB2YWx1ZXMuIFVzZWQgb25seSBpbiBWQ2FyZC4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0OwotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoKSB7Ci0gICAgICAgIHByb3BOYW1lID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgcGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvciwKLSAgICAgICAgICAgIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEUsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBwcm9wVmFsdWVfdmVjdG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcm9wVmFsdWVfYnl0ZXMgPSBwcm9wVmFsdWVfYnl0ZXM7Ci0gICAgICAgIGlmIChwYXJhbU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gcGFyYW1NYXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1NYXBfVFlQRSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBwYXJhbU1hcF9UWVBFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wR3JvdXBTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBwcm9wR3JvdXBTZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAvLyB2Q2FyZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHNhbWUgbGluZSBpbiBvbmUgZW50cnksIHdoaWxlIEhhc2hTZXQgb3IgYW55IG90aGVyCi0gICAgICAgIC8vIGxpYnJhcnkgd2hpY2ggdXRpbGl6ZSBoYXNoQ29kZSgpIGRvZXMgbm90IGhvbm9yIHRoYXQsIHNvIGludGVudGlvbmFsbHkgdGhyb3cgYW4KLSAgICAgICAgLy8gRXhjZXB0aW9uLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlByb3BlcnR5Tm9kZSBkb2VzIG5vdCBwcm92aWRlIGhhc2hDb2RlKCkgaW1wbGVtZW50YXRpb24gaW50ZW50aW9uYWxseS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9wZXJ0eU5vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5Tm9kZSBub2RlID0gKFByb3BlcnR5Tm9kZSlvYmo7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcE5hbWUgPT0gbnVsbCB8fCAhcHJvcE5hbWUuZXF1YWxzKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9wR3JvdXBTZXQuZXF1YWxzKG5vZGUucHJvcEdyb3VwU2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsICYmIEFycmF5cy5lcXVhbHMocHJvcFZhbHVlX2J5dGVzLCBub2RlLnByb3BWYWx1ZV9ieXRlcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUuZXF1YWxzKG5vZGUucHJvcFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGluIHByb3BWYWx1ZV92ZWN0b3IgaXMgbm90IGRlY29kZWQgZXZlbiBpZiBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRlY29kZWQgYnkgQkFTRTY0IG9yIFFVT1RFRC1QUklOVEFCTEUuIFdoZW4gdGhlIHNpemUgb2YgcHJvcFZhbHVlX3ZlY3RvcgotICAgICAgICAgICAgLy8gaXMgMSwgdGhlIGVuY29kZWQgdmFsdWUgaXMgc3RvcmVkIGluIHByb3BWYWx1ZSwgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAgICAgICAgIC8vIGNoZWNrIGl0LgotICAgICAgICAgICAgcmV0dXJuIChwcm9wVmFsdWVfdmVjdG9yLmVxdWFscyhub2RlLnByb3BWYWx1ZV92ZWN0b3IpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5wcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgicHJvcE5hbWU6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocGFyYW1NYXAudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwX1RZUEU6IFsiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgaWYgKCFwcm9wR3JvdXBTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wR3JvdXBTZXQ6IFsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsICYmIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX3ZlY3RvciBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV9ieXRlcyBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV9ieXRlcy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZTogXCIiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiIik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkMDc0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgZXh0ZW5kcyBWTm9kZUJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtPiBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbUFuZHJvaWRUZXN0Q2FzZTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBuZXcgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbShtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LmFkZChlbGVtKTsKLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwKLSAgICAgICAgICAgICAgICB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIFVzZSBTdHJpY3RQYXJzaW5nLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5KGlzLCB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgdGhpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBzdXBlci5lbmRFbnRyeSgpOwotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCB2Tm9kZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LmdldChtSW5kZXgpLnZlcmlmeSh2Tm9kZUxpc3QuZ2V0KG1JbmRleCkpOwotICAgICAgICBtSW5kZXgrKzsKLSAgICB9Ci19Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCB2ZXJpZmllcyBpbnB1dCBWTm9kZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGZpcnN0IGNoZWNrcyB3aGV0aGVyIGVhY2ggcHJvcGVydHlOb2RlIGluIHRoZSBWTm9kZSBpcyBpbiB0aGUKLSAqICJvcmRlcmVkIGV4cGVjdGVkIHByb3BlcnR5IGxpc3QiLgotICogSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlICJvcmRlcmVkIGxpc3QiLCB0aGUgY2xhc3MgcmVmZXJzIHRvCi0gKiAidW5vcmRlcmQgZXhwZWN0ZWQgcHJvcGVydHkgc2V0IiBhbmQgY2hlY2tzIHRoZSBub2RlIGlzIGV4cGVjdGVkIHNvbWV3aGVyZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIHsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgVHlwZVNldChTdHJpbmcgLi4uIGFycmF5KSB7Ci0gICAgICAgICAgICBzdXBlcihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwU2V0IGV4dGVuZHMgSGFzaFNldDxTdHJpbmc+IHsKLSAgICAgICAgcHVibGljIEdyb3VwU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4gbU9yZGVyZWROb2RlTWFwOwotICAgIC8vIEludGVudGlvbmFsbHkgdXNlIEFycmF5TGlzdCBpbnN0ZWFkIG9mIFNldCwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUKLSAgICAvLyBleGFjdGx5IHNhbWUgb2JqZWN0cy4KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IG1Vbm9yZGVyZWROb2RlTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIFRlc3RDYXNlIG1UZXN0Q2FzZTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1PcmRlcmVkTm9kZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PigpOwotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgLy8gV2l0aE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZS50b1N0cmluZygpLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUsIEdyb3VwU2V0IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcFZhbHVlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5Tm9kZSBwcm9wZXJ0eU5vZGUgPSBuZXcgUHJvcGVydHlOb2RlKHByb3BOYW1lLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpOwotICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleHBlY3RlZE5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgICAgICAgICBtT3JkZXJlZE5vZGVNYXAucHV0KHByb3BOYW1lLCBleHBlY3RlZE5vZGVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBleHBlY3RlZE5vZGVMaXN0LmFkZChwcm9wZXJ0eU5vZGUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBXaXRob3V0T3JkZXIKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0LmFkZChuZXcgUHJvcGVydHlOb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlTGlzdCwgcHJvcFZhbHVlX2J5dGVzLCBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgcHJvcEdyb3VwU2V0KSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShWTm9kZSB2bm9kZSkgewotICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlIDogdm5vZGUucHJvcExpc3QpIHsKLSAgICAgICAgICAgIHZlcmlmeU5vZGUoYWN0dWFsTm9kZS5wcm9wTmFtZSwgYWN0dWFsTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtT3JkZXJlZE5vZGVNYXAuaXNFbXB0eSgpIHx8ICFtVW5vcmRlcmVkTm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWRQcm9wcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChMaXN0PFByb3BlcnR5Tm9kZT4gbm9kZXMgOiBtT3JkZXJlZE5vZGVNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBtVW5vcmRlcmVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIHByb3BlcnR5ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRQcm9wcy50b0FycmF5KCkpCi0gICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoZmluYWwgU3RyaW5nIHByb3BOYW1lLCBmaW5hbCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSkgewotICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IChleHBlY3RlZE5vZGVMaXN0ICE9IG51bGwgPyBleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5yZW1vdmUocHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKGV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAiYWN0dWFsTm9kZSIgaXMgbm90IGluIG9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICAvLyBUcnkgbG9va2luZyBvdmVyIHVub3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcHJvcE5hbWUgZXhpc3RzIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZShzKS4KLSAgICAgICAgICAgICAgICAgICAgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KHByb3BOYW1lLCBhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGV4cGVjdGVkIG5vZGUgd2l0aCBzYW1lIHByb3BOYW1lLgotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKExpc3Q8U3RyaW5nPiBhcnJheSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcFZhbHVlRWxlbSA6IGFycmF5KSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByb3BWYWx1ZUVsZW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wTmFtZSA9IGFjdHVhbE5vZGUucHJvcE5hbWU7Ci0gICAgICAgIGludCB1bm9yZGVyZWRMaXN0U2l6ZSA9IG1Vbm9yZGVyZWROb2RlTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5vcmRlcmVkTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlOb2RlIHVub3JkZXJlZEV4cGVjdGVkTm9kZSA9IG1Vbm9yZGVyZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAodW5vcmRlcmVkRXhwZWN0ZWROb2RlLnByb3BOYW1lLmVxdWFscyhwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodW5vcmRlcmVkRXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKHVub3JkZXJlZEV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QoU3RyaW5nIHByb3BOYW1lLCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA6IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJleHBlY3RlZDogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChleHBlY3RlZE5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgaGFzIHdyb25nIHZhbHVlLlxuIgotICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiICBhY3R1YWw6ICIgKyBhY3R1YWxOb2RlLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlMDQ2NC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgY29kZSByZWxhdGVkIHRvIHZDYXJkIGV4cG9ydGVyLCBpbmN1bGRpbmcgdkNhcmQgY29tcG9zZXIuCi0gKiBUaGlzIHRlc3QgY2xhc3MgZGVwZW5kcyBvbiB2Q2FyZCBpbXBvcnRlciBjb2RlLCBzbyBpZiB0ZXN0cyBmb3IgdkNhcmQgaW1wb3J0ZXIgZmFpbCwKLSAqIHRoZSByZXN1bHQgb2YgdGhpcyBjbGFzcyB3aWxsIG5vdCBiZSByZWxpYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRXhwb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5ID0KLSAgICAgICAgVkNhcmRJbXBvcnRlclRlc3RzLnNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlJvaWQgQW5kbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJBbmRvO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0KLSAgICAgICAgaWYgKGlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUgIgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgb25seSAicHJpbWFyeSIgU3RydWN0dXJlZE5hbWUgaXMgZW1pdHRlZCwgc28gdGhhdCBvdXIgdkNhcmQgZmlsZQotICAgICAqIHdpbGwgbm90IGNvbmZ1c2UgdGhlIGV4dGVybmFsIGltcG9ydGVyLCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgc29tZSBpbXBvcnRlcgotICAgICAqIHdoaWNoIHByZXN1bWUgdGhhdCB0aGVyZSdzIG9ubHkgb25lIHByb3BlcnR5IHRvd2FyZCBlYWNoIG9mICAiTiIsICJGTiIsIGV0Yy4KLSAgICAgKiBOb3RlIHRoYXQgbW9yZSB0aGFuIG9uZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcyBhcmUgYWNjZXB0YWJsZSBpbiB2Q2FyZCBzcGVjLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9ICh2Y2FyZFR5cGUgPT0gVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMSIpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIuIFRoaXMgaXMgd2hhdCB3ZSBzaG91bGQgdXNlLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUsIHNpbmNlIHRoaXMgaXMgc2Vjb25kLCBub3QgZmlyc3QuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IG9ubHkgInN1cGVyIHByaW1hcnkiIFN0cnVjdHVyZWROYW1lIGlzIGVtaXR0ZWQuCi0gICAgICogU2VlIGFsc28gdGhlIGNvbW1lbnQgaW4ge0BsaW5rICN0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKGludCl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gKHZjYXJkVHlwZSA9PSBWMzApOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIgotICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVSZWZyYWluRm9ybWF0dGluZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSB8IFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdkNhcmQgY29tcG9zZXIgZW1pdHMgY29ycmVzcG9uZGluZyB0eXBlIHBhcmFtIHdoaWNoIHdlIGV4cGVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjcwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiODAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NQUlOKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX09USEVSX0ZBWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9URUxFWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01NUyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMwIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUwIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNjAiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzAiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiODAiLCBuZXcgVHlwZVNldCgiQ0FSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjkwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMDAiLCBuZXcgVHlwZVNldCgiSVNETiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTAiLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMjAiLCBuZXcgVHlwZVNldCgiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEzMCIsIG5ldyBUeXBlU2V0KCJUTFgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNjAiLCBuZXcgVHlwZVNldCgiTVNHIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0ICJQUkVGInMgYXJlIGVtaXR0ZWQgYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX1dPUkspOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQiLCBuZXcgVHlwZVNldCgiV09SSyIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIkZBWCIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1vZGVtIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNU0ciKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIkJCUyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiX0FVVE9fQ0VMTCIpOyAgLy8gVGhlIG9sZCBpbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG1vYmlsZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjciKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlx1NjQzQVx1NUUyRiIpOyAgLy8gTW9iaWxlIHBob25lIGluIEphcGFuZXNlIEthbmppCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJpbnZhbGlkIik7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJCQlMiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjYiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJYLWludmFsaWQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVHlwZUhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVHlwZUhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbEJhc2ljQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJzYW1wbGVAZXhhbXBsZS5jb20iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbEJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0RW1haWxCYXNpY0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbEJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxCYXNpY0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX3dvcmtAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX09USEVSKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9tb2JpbGVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfb3RoZXJAZXhhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiUG9ib3giKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QsICJOZWlnaGJvcmhvb2QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJTdHJlZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlJlZ2lvbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywgIkZvcm1hdHRlZCBBZGRyZXNzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspOwotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb3VudHJ5IE5hbWUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIE5FSUdIQk9SSE9PRCBmaWVsZCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgQ0lUWSBmaWVsZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIlN0cmVldCIsICJDaXR5IE5laWdoYm9yaG9vZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpb24iLCAiMTAwIiwgIkNvdW50cnkiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJDaXR5IiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJOZWlnaGJvcmhvb2QiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICIiKSAgLy8gTXVzdCBiZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwgIjtGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWU7Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB2Q2FyZCBjb21wb3NlciBob25vcnMgZm9ybWF0dGVkIGRhdGEgd2hlbiBpdCBpcyBhdmFpbGFibGUKLSAgICAgKiBldmVuIHdoZW4gaXQgaXMgcGFydGlhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJDb3VudHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7ICAvLyBTaG91bGQgYmUgaWdub3JlZAotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICJQb2JveDs7Ozs7O0NvdW50cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDb3VudHJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WCIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRZIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uSk9CX0RFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24gUmFtYmRhIikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uT0ZGSUNFX0xPQ0FUSU9OLCAiTW91bnRhaW4gVmlldyIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsICJQaG9uZXRpY05hbWUhIikgIC8vIElnbm9yZWQKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5TWU1CT0wsICIoXm9eKS9+fiIpOyAgLy8gSWdub3JlIGhpbSAoaGVyKS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkNPTVBBTlkpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVYWVpZWCIpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG8gbm90IHVzZSBncm91cCBidXQgZGVwZW5kIG9uIHRoZSBvcmRlci4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVg7RGVwYXJ0bWVudFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQ29tcGFueVgiLCAiRGVwYXJ0bWVudFkiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVhZWllYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYyMSgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX01TTikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJtc24iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ZQUhPTykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJ5YWhvbyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1NLWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInNreXBlIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfUVEpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAicXEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJnb29nbGUgdGFsayIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0lDUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJpY3EiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9KQUJCRVIpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiamFiYmVyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTkVUTUVFVElORykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJuZXRtZWV0aW5nIik7Ci0KLSAgICAgICAgLy8gTm8gZGV0ZXJtaW5lZCB3YXkgdG8gZXhwcmVzcyB1bmtub3duIHR5cGUuLi4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUpBQkJFUiIsICJqYWJiZXIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSUNRIiwgImljcSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1HT09HTEUtVEFMSyIsICJnb29nbGUgdGFsayIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1RUSIsICJxcSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1TS1lQRS1VU0VSTkFNRSIsICJza3lwZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1ZQUhPTyIsICJ5YWhvbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1NU04iLCAibXNuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5FVE1FRVRJTkciLCAibmV0bWVldGluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaVYyMSgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0yIikKLSAgICAgICAgICAgICAgICAucHV0KEltLlRZUEUsIEltLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMiIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0V2Vic2l0ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImh0dHA6Ly93ZWJzaXRlLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9CTE9HKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0ZUUCk7Ci0KLSAgICAgICAgLy8gV2UgZHJvcCBUWVBFIGluZm9ybWF0aW9uIHNpbmNlIHZDYXJkIChlc3BlY2lhbGx5IDMuMCkgZG9lcyBub3QgYWxsb3cgdXMgdG8gZW1pdCBpdC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiZnRwOi8vZnRwLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVVJMIiwgImh0dHA6Ly93ZWJzaXRlLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJzaXRlVjIxKCkgewotICAgICAgICB0ZXN0V2Vic2l0ZUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJzaXRlVjMwKCkgewotICAgICAgICB0ZXN0V2Vic2l0ZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFuZHJvaWRQcm9wVmFsdWUoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdmFsdWUsIEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gZ2V0QW5kcm9pZFByb3BWYWx1ZShtaW1lVHlwZSwgdmFsdWUsIHR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFuZHJvaWRQcm9wVmFsdWUoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBJbnRlZ2VyIHR5cGUsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gKG1pbWVUeXBlICsgIjsiICsgdmFsdWUgKyAiOyIKLSAgICAgICAgICAgICAgICArICh0eXBlICE9IG51bGwgPyB0eXBlIDogIiIpICsgIjsiCi0gICAgICAgICAgICAgICAgKyAobGFiZWwgIT0gbnVsbCA/IGxhYmVsIDogIiIpICsgIjs7Ozs7Ozs7Ozs7OyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RXZlbnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4Mi0wNi0xNiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA4LTEwLTIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMTgtMDMtMTIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuTEFCRUwsICJUaGUgbGFzdCBkYXkiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIldoZW4gdGhlIFRvd2VyIG9mIEhhbm9pIHdpdGggNjQgcmluZ3MgaXMgY29tcGxldGVkLiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA5LTA1LTE5Iik7ICAvLyBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJCREFZIiwgIjIwMDgtMTAtMjIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsICIxOTgyLTA2LTE2IiwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjIwMTgtMDMtMTIiLCBFdmVudC5UWVBFX09USEVSKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuVFlQRV9DVVNUT00sICJUaGUgbGFzdCBkYXkiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjIxKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMzAoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm90ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLklTX1BSSU1BUlksIDEpOyAgLy8gSnVzdCBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYyMSgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYzMCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob3RvQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9IHZjYXJkVHlwZSA9PSBWMzA7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJQaG90b1Rlc3QiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG90by5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob3RvLlBIT1RPLCBzUGhvdG9CeXRlQXJyYXkpOwotCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlc0ZvclBob3RvID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLnB1dCgiRU5DT0RJTkciLCAoaXNWMzAgPyAiYiIgOiAiQkFTRTY0IikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUGhvdG9UZXN0IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlBob3RvVGVzdDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUGhvdG9UZXN0IiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwgbnVsbCwgc1Bob3RvQnl0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLCBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMjEoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YzMCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWxhdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0UmVsYXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBIYW5kbGVFc2NhcGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMzApOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiLCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgIC8vIFZlcmlmaWVzIHRoZSB2Q2FyZCBTdHJpbmcgY29ycmVjdGx5IGVzY2FwZXMgZWFjaCBjaGFyYWN0ZXIgd2hpY2ggbXVzdCBiZSBlc2NhcGVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOlxcXFw7XFw7O1xcLDtcXG47IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJcXCIsICI7IiwgIiwiLCAiXG4iLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZXJlJ3Mgbm8gIk5JQ0tOQU1FIiBwcm9wZXJ0eSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluIHZDYXJkIDMuMC4KLSAgICAgKiBXZSB1c2UgQW5kcm9pZC1zcGVjaWZpYyAiWC1BTkRST0lELUNVU1RPTSIgcHJvcGVydHkuCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUgKyAiO05pY2t5Ozs7Ozs7Ozs7Ozs7OzsiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUJyb2tlblBob25lTnVtYmVyRW50cnlWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTU1LTY2NiAoVG9reW8pOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjc3Ny04ODgtOTk5OSAoQ2hpY2Fnbyk7MTExLTIyMi0zMzMzIChNaWFtaSkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTExLTIyMi0zMzMzIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDQ0LTU1NS01NjY2IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzc3LTg4OC05OTk5IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOyAgLy8gRW1wdHkgbmFtZS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTEiKTsgIC8vIE5vdCBwcmltYXJ5LiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTIiKTsgIC8vIFRoaXMgZW50cnkgaXMgd2hhdCB3ZSB3YW50LgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHk0Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgQXJyYXlzLmFzTGlzdCgiZmFtaWx5MiIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJmYW1pbHkyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YyMSgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWMzAoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjMwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjIyNTQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEltcG9ydGVyVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgLy8gUHVzaCBkYXRhIGludG8gaW50IGFycmF5IGF0IGZpcnN0IHNpbmNlIHZhbHVlcyBsaWtlIDB4ODAgYXJlCi0gICAgLy8gaW50ZXJwcmV0ZWQgYXMgaW50IGJ5IHRoZSBjb21waWxlciBhbmQgY2FzdGluZyBhbGwgb2YgdGhlbSBpcwotICAgIC8vIGN1bWJlcnNvbWUuLi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSA9IHsKLSAgICAgICAgMHhmZiwgMHhkOCwgMHhmZiwgMHhlMSwgMHgwYSwgMHgwZiwgMHg0NSwgMHg3OCwgMHg2OSwgMHg2NiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg0ZCwgMHg0ZCwgMHgwMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwZCwKLSAgICAgICAgMHgwMSwgMHgwZSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhYSwgMHgwMSwgMHgwZiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhiYSwgMHgwMSwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMSwgMHgxMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHgwMSwgMHgxYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkMCwgMHgwMSwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgzMSwgMHgwMCwgMHgwMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOCwgMHgwMSwgMHgzMiwgMHgwMCwKLSAgICAgICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMiwgMHgxMywKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwKLSAgICAgICAgMHg5OCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYSwKLSAgICAgICAgMHg4NywgMHg2OSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHg4NCwgMHhjNCwgMHhhNSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxZSwgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzMSwKLSAgICAgICAgMHgzMCwgMHgzMiwgMHgzOSwgMHgzMSwgMHgzMywgMHgzNSwgMHgzNSwgMHgzMywgMHgzMSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg2ZiwgMHg0MywgMHg2ZiwgMHg0ZCwgMHg2ZiwgMHgwMCwgMHgwMCwgMHg0NCwgMHgzOSwgMHgzMCwKLSAgICAgICAgMHgzNSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NCwgMHgzOSwgMHgzMCwKLSAgICAgICAgMHgzNSwgMHg2OSwgMHgyMCwgMHg1NiwgMHg2NSwgMHg3MiwgMHgzMSwgMHgyZSwgMHgzMCwgMHgzMCwgMHgwMCwKLSAgICAgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwKLSAgICAgICAgMHgzMSwgMHgzMywgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzNCwgMHgzNywgMHgwMCwgMHgyMCwgMHgyMCwKLSAgICAgICAgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKLSAgICAgICAgMHgwMCwgMHg1MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg0OSwgMHg0ZCwgMHgwMCwgMHgzMCwgMHgzMywKLSAgICAgICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxNCwgMHgwMCwKLSAgICAgICAgMHgxNCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgzNCwgMHgwMSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgxMSwgMHgwOSwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHg5NywgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwOCwgMHhiMCwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgxYywKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg1ZSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YiwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHhjYiwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHhlNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgyOCwgMHg4MiwgMHg5YSwgMHgwMCwgMHgwNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHg2YSwgMHg4MiwgMHg5ZCwgMHgwMCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHg3MiwgMHg4OCwgMHgyMiwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg5MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgzMCwgMHgzMiwgMHgzMiwgMHgzMCwgMHg5MCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMywgMHg3YSwKLSAgICAgICAgMHg5MCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMywKLSAgICAgICAgMHg4ZSwgMHg5MSwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMSwgMHgwMiwKLSAgICAgICAgMHgwMywgMHgwMCwgMHg5MSwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHhhMiwgMHg5MiwgMHgwMSwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMywgMHhhYSwgMHg5MiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhiMiwgMHg5MiwgMHgwNCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhiYSwgMHg5MiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMiwgMHg5MiwgMHgwNywgMHgwMCwgMHgwMywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwOCwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwOSwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwKLSAgICAgICAgMHgwYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjYSwKLSAgICAgICAgMHg5MiwgMHg3YywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg5MiwgMHg4NiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMywgMHhkMiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgzMCwKLSAgICAgICAgMHgzMSwgMHgzMCwgMHgzMCwgMHhhMCwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwNSwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhhMiwgMHgwZSwgMHgwMCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwgMHhhMiwgMHgwZiwgMHgwMCwKLSAgICAgICAgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhmMCwgMHhhMiwgMHgxMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHhhMiwKLSAgICAgICAgMHgxNywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhMywgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhhMywgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhmOCwgMHhhNCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxZCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNiwgMHgwMCwgMHgwMywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNywgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwOCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwKLSAgICAgICAgMHgwOSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhNCwgMHgwYSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhhNCwgMHgwYywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwKLSAgICAgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwKLSAgICAgICAgMHgzMSwgMHgzMywgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzMywgMHgzMSwgMHgwMCwgMHgzMiwgMHgzMCwKLSAgICAgICAgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwgMHgzMSwgMHgzMywKLSAgICAgICAgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzNCwgMHgzNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHg4OCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwZSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHgzMCwgMHgzMCwKLSAgICAgICAgMHgzOCwgMHgzMSwgMHgzMCwgMHgzMiwgMHgzOSwgMHgzMSwgMHgzMywgMHgzNSwgMHgzNSwgMHgzMywgMHgzMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgyMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgyYSwKLSAgICAgICAgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNCwgMHg1MiwgMHgzOSwgMHgzOCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNCwgMHgzMCwgMHgzMSwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNCwgMHg2YywgMHgwMSwgMHgxYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwNCwgMHg3NCwgMHgwMSwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNCwgMHg3YywgMHgwMiwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNSwgMHg4YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhkOCwgMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwKLSAgICAgICAgMHgwMCwgMHgyMCwgMHgxNiwgMHgxOCwgMHgxYywgMHgxOCwgMHgxNCwgMHgyMCwgMHgxYywgMHgxYSwgMHgxYywKLSAgICAgICAgMHgyNCwgMHgyMiwgMHgyMCwgMHgyNiwgMHgzMCwgMHg1MCwgMHgzNCwgMHgzMCwgMHgyYywgMHgyYywgMHgzMCwKLSAgICAgICAgMHg2MiwgMHg0NiwgMHg0YSwgMHgzYSwgMHg1MCwgMHg3NCwgMHg2NiwgMHg3YSwgMHg3OCwgMHg3MiwgMHg2NiwKLSAgICAgICAgMHg3MCwgMHg2ZSwgMHg4MCwgMHg5MCwgMHhiOCwgMHg5YywgMHg4MCwgMHg4OCwgMHhhZSwgMHg4YSwgMHg2ZSwKLSAgICAgICAgMHg3MCwgMHhhMCwgMHhkYSwgMHhhMiwgMHhhZSwgMHhiZSwgMHhjNCwgMHhjZSwgMHhkMCwgMHhjZSwgMHg3YywKLSAgICAgICAgMHg5YSwgMHhlMiwgMHhmMiwgMHhlMCwgMHhjOCwgMHhmMCwgMHhiOCwgMHhjYSwgMHhjZSwgMHhjNiwgMHgwMSwKLSAgICAgICAgMHgyMiwgMHgyNCwgMHgyNCwgMHgzMCwgMHgyYSwgMHgzMCwgMHg1ZSwgMHgzNCwgMHgzNCwgMHg1ZSwgMHhjNiwKLSAgICAgICAgMHg4NCwgMHg3MCwgMHg4NCwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhmZiwgMHhjMCwKLSAgICAgICAgMHgwMCwgMHgxMSwgMHgwOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHhhMCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwKLSAgICAgICAgMHgwMiwgMHgxMSwgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKLSAgICAgICAgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywKLSAgICAgICAgMHgwMywgMHgwMiwgMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHg3ZCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwKLSAgICAgICAgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwKLSAgICAgICAgMHg5MSwgMHhhMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKLSAgICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKLSAgICAgICAgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwKLSAgICAgICAgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKLSAgICAgICAgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAgMHg3OSwgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwKLSAgICAgICAgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwKLSAgICAgICAgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKLSAgICAgICAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwKLSAgICAgICAgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwKLSAgICAgICAgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMSwKLSAgICAgICAgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKLSAgICAgICAgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwKLSAgICAgICAgMHgwNCwgMHgwMywgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwKLSAgICAgICAgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwKLSAgICAgICAgMHg0MiwgMHg5MSwgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwKLSAgICAgICAgMHg2MiwgMHg3MiwgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywKLSAgICAgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwKLSAgICAgICAgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKLSAgICAgICAgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAgMHg3OSwgMHg3YSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwKLSAgICAgICAgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywKLSAgICAgICAgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwKLSAgICAgICAgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywKLSAgICAgICAgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwKLSAgICAgICAgMHhkYSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwKLSAgICAgICAgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmZiwgMHhkYSwgMHgwMCwKLSAgICAgICAgMHgwYywgMHgwMywgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMCwKLSAgICAgICAgMHgxNCwgMHg1NCwgMHhhYSwgMHgyYSwgMHg0NiwgMHg0OCwgMHhhMiwgMHhhNCwgMHg1NSwgMHhhNiwgMHgwNCwKLSAgICAgICAgMHg4YSwgMHgyOSwgMHhlMCwgMHg1MywgMHgxMCwgMHhlMCwgMHgyOSwgMHhjMCwgMHg1MCwgMHgwMywgMHhiMSwKLSAgICAgICAgMHg0NiwgMHgyOSwgMHg4MCwgMHg4NCwgMHg1MiwgMHgxMSwgMHg0MCwgMHgwZCwgMHgyMiwgMHg5YSwgMHg0NSwKLSAgICAgICAgMHgyMCwgMHgyMywgMHg2MSwgMHg1MSwgMHgzMCwgMHhhMCwgMHgwOCwgMHhjOCwgMHhhOCwgMHhkOCwgMHg1MiwKLSAgICAgICAgMHgwMiwgMHgyNiwgMHgxNSwgMHgwYiwgMHgwYSwgMHgwMCwgMHhiNCwgMHhhMiwgMHhhNSwgMHg1YSwgMHgwMCwKLSAgICAgICAgMHg5MSwgMHg0NSwgMHg0YSwgMHhhMiwgMHg4MSwgMHg5MiwgMHgwMSwgMHg0ZSwgMHgwMiwgMHg5OCwgMHg4NywKLSAgICAgICAgMHgwYSwgMHg3MCwgMHhhMCwgMHgwNywgMHg2MiwgMHg4YywgMHg1MCwgMHgyMSwgMHgwZCwgMHgyNSwgMHgwMCwKLSAgICAgICAgMHgzNCwgMHg4YSwgMHg2MSwgMHgxNCwgMHgwYywgMHg2MywgMHgwYSwgMHg4OSwgMHg4NSwgMHgwMCwgMHg0NiwKLSAgICAgICAgMHhkNSwgMHgxYiwgMHg1MiwgMHgwMiwgMHgxNiwgMHhhOCwgMHg5OCwgMHg1MCwgMHgwNSwgMHg5NCwgMHhhOSwKLSAgICAgICAgMHgxNiwgMHg4MCwgMHgyNSwgMHg1YSwgMHg5NSwgMHg2OCwgMHgxOCwgMHhmMSwgMHg0ZiwgMHgxNCwgMHhjNCwKLSAgICAgICAgMHgzYiwgMHhiNSwgMHgyMiwgMHhiNiwgMHgzOCwgMHgzNCwgMHgwMCwgMHhlMywgMHgyMiwgMHg4ZSwgMHhmNCwKLSAgICAgICAgMHg3OSwgMHg4YSwgMHg3YiwgMHhkMSwgMHg3MSwgMHgwMywgMHgzMCwgMHhjNywgMHgxNCwgMHg4MywgMHhhNSwKLSAgICAgICAgMHgwMCwgMHgwNiwgMHg5OCwgMHg2OCwgMHgwMSwgMHg4ZCwgMHg1MSwgMHgzNSwgMHgwMywgMHgyMiwgMHg2YSwKLSAgICAgICAgMHg4ZCwgMHhhOSwgMHgwMSwgMHgxMywgMHg1NCwgMHg0ZCwgMHg0MCwgMHgxMywgMHhhNSwgMHg0YSwgMHgyOCwKLSAgICAgICAgMHgwMiwgMHg0NSwgMHgzNSwgMHgyYSwgMHg5YSwgMHgwMCwgMHg3OCwgMHgzNCwgMHhmMCwgMHg2OSwgMHg4MCwKLSAgICAgICAgMHgzNCwgMHg4MSwgMHg0NSwgMHg0MCwgMHhjZSwgMHg1OCwgMHhlNiwgMHhhMiwgMHg0YywgMHgwNiwgMHhlNCwKLSAgICAgICAgMHhmYSwgMHhkMSwgMHg5MywgMHg1MCwgMHgyMSwgMHhjYSwgMHhlNCwgMHg1NSwgMHg4NCwgMHg5MCwgMHgzMCwKLSAgICAgICAgMHhhYiwgMHg4YiwgMHgxOCwgMHhhNiwgMHg5YSwgMHg2YSwgMHhjNCwgMHgzMSwgMHhhYSwgMHgyNiwgMHhhMCwKLSAgICAgICAgMHg2NCwgMHg0ZCwgMHg1MSwgMHhiNSwgMHgyMCwgMHgyMywgMHg2YSwgMHg4OSwgMHhhOCwgMHgwMiwgMHg0NCwKLSAgICAgICAgMHgzNSwgMHgyYSwgMHg5YSwgMHgwMCwgMHg5NSwgMHg0ZCwgMHg0OCwgMHhhNiwgMHg4MCwgMHgyNCwgMHg1MywKLSAgICAgICAgMHg0ZSwgMHhjZSwgMHgwNSwgMHgzMCwgMHgyYiwgMHgzYiwgMHhlZSwgMHg2YSwgMHg5MSwgMHg1ZCwgMHg3NiwKLSAgICAgICAgMHg2MywgMHhiZCwgMHg2NSwgMHg3ZCwgMHg0MCwgMHg2NiwgMHg2OCwgMHhhOSwgMHgwMiwgMHg0NSwgMHgyYiwKLSAgICAgICAgMHhiMywgMHg5ZSwgMHhiNCwgMHhjNSwgMHg2ZCwgMHhhZCwgMHg5YSwgMHhhMCwgMHgyYywgMHgwNiwgMHhjOCwKLSAgICAgICAgMHhjZCwgMHgwNCwgMHhkNiwgMHhhMiwgMHgyMywgMHg2MywgMHg1MSwgMHhiMSwgMHhhMCwgMHg2NCwgMHg0ZCwKLSAgICAgICAgMHg1MSwgMHg5MywgMHg0OCwgMHgwOCwgMHhkYSwgMHhhMiwgMHg2YSwgMHgwMCwgMHg3MiwgMHgxYSwgMHg5OSwKLSAgICAgICAgMHg0ZCwgMHgwMCwgMHg0OCwgMHhhNiwgMHhhNCwgMHg1MywgMHg0YywgMHgwNywgMHg4NiwgMHgwMywgMHhiZCwKLSAgICAgICAgMHgyYiwgMHg5YywgMHhhNywgMHgxNCwgMHg5OCwgMHgxMCwgMHg4NSwgMHgzNCwgMHhlMCwgMHhhNiwgMHhiMywKLSAgICAgICAgMHhiMCwgMHgwYiwgMHhiNSwgMHhhOCwgMHgwYSwgMHhkNCwgMHg1OCwgMHg0MiwgMHhlZCwgMHgzZSwgMHg5NCwKLSAgICAgICAgMHhkMiwgMHhhNiwgMHg4YiwgMHgwMSwgMHgzNCwgMHg0NCwgMHhlZCwgMHhlNiwgMHg5YywgMHg0ZCwgMHg2YSwKLSAgICAgICAgMHg4MCwgMHg4ZCwgMHg4ZCwgMHg0NiwgMHhjNiwgMHg4MCwgMHgyMywgMHg2MywgMHg1MSwgMHg5YSwgMHgwNiwKLSAgICAgICAgMHg0NiwgMHhkNSwgMHgxMywgMHg1MiwgMHgwMSwgMHg1NCwgMHhkNCwgMHhhYSwgMHg2OCwgMHgwMiwgMHg0MCwKLSAgICAgICAgMHg2YSwgMHg0MCwgMHg3OCwgMHhhMCwgMHgwOCwgMHg1OSwgMHhjZSwgMHhlZSwgMHhiNSwgMHgyYSwgMHgzOSwKLSAgICAgICAgMHhkOSwgMHg1OSwgMHhhNywgMHhhOCwgMHgwMCwgMHg3MywgMHhlYiwgMHg0ZSwgMHgwZSwgMHg3ZCwgMHg2OSwKLSAgICAgICAgMHg1YywgMHgwNSwgMHhmMywgMHgwZiwgMHhhZCwgMHgxZSwgMHg2MSwgMHhmNSwgMHhhNywgMHg3MSwgMHgwYiwKLSAgICAgICAgMHhlNiwgMHgzNSwgMHgyMSwgMHg5MCwgMHhkMywgMHhiOCwgMHgwZSwgMHgzMiwgMHgxMCwgMHg5NSwgMHgxMCwKLSAgICAgICAgMHg5MSwgMHhiMywgMHhkNiwgMHg5YiwgMHg2MCwgMHg0YiwgMHg5YywgMHg4YSwgMHg2MywgMHgxYSwgMHhiMCwKLSAgICAgICAgMHgxOCwgMHg0ZCwgMHg0NiwgMHhjNiwgMHg4MCwgMHgyMiwgMHg2YSwgMHg2MSwgMHhhNCwgMHgzMSwgMHhhYSwKLSAgICAgICAgMHg2YSwgMHg1NSwgMHgzNCwgMHgwMSwgMHgyYSwgMHg5YSwgMHg3ZSwgMHg3OCwgMHhhMCwgMHgwOCwgMHgwOSwKLSAgICAgICAgMHhmOSwgMHhhYSwgMHg1OCwgMHhjZiwgMHhjYSwgMHg2YiwgMHgzZSwgMHhhMCwgMHgwMCwgMHhkMywgMHg4MSwKLSAgICAgICAgMHhhOSwgMHgwMSwgMHg3MywgMHg0NiwgMHg2OSwgMHg4MCwgMHhiOSwgMHhhNCwgMHhjZCwgMHgwMCwgMHgyYiwKLSAgICAgICAgMHgxZiwgMHg5MiwgMHhhMywgMHgwNywgMHg5YSwgMHg2ZiwgMHg3MCwgMHgyNiwgMHhjZiwgMHgxNCwgMHhkMiwKLSAgICAgICAgMHg2YiwgMHg1MSwgMHgwYywgMHg2MywgMHg1MSwgMHhiMSwgMHhhMCwgMHgwOCwgMHhkYSwgMHg5OCwgMHg2OSwKLSAgICAgICAgMHgwYywgMHg4ZCwgMHg0ZCwgMHg0YSwgMHhhNiwgMHg4MCwgMHgyNCwgMHg1MywgMHg1MiwgMHgwMywgMHhjNSwKLSAgICAgICAgMHgwMiwgMHgyMSwgMHgyNywgMHhlNiwgMHhhOSwgMHgyMywgMHgzZiwgMHgyOSwgMHhhYywgMHhmYSwgMHg4YywKLSAgICAgICAgMHgwMSwgMHhlNiwgMHg5YywgMHgwZCwgMHg0OCwgMHgwYSwgMHgwZCwgMHgyZSwgMHg2OCwgMHgwMSwgMHg3MywKLSAgICAgICAgMHg0OSwgMHg5YSwgMHg2MCwgMHgyYiwgMHgxZiwgMHg5MiwgMHg5OCwgMHgzYSwgMHhkMywgMHg3YiwgMHg4MSwKLSAgICAgICAgMHgzNiwgMHg3OCwgMHhhNiwgMHg5MywgMHg1YSwgMHg4OCwgMHg4YywgMHg5YSwgMHg2MywgMHgxYSwgMHgwMCwKLSAgICAgICAgMHg4YywgMHhkMywgMHgwZCwgMHgyMSwgMHg5MSwgMHgyOSwgMHhhOSwgMHgxNCwgMHhkMCwgMHgwNCwgMHg4YSwKLSAgICAgICAgMHg2OSwgMHhlMCwgMHhkMywgMHgxMSwgMHgxYiwgMHgxZSwgMHg2YSwgMHg0OCwgMHhjZiwgMHhjYSwgMHg2YiwKLSAgICAgICAgMHgzZSwgMHhhMywgMHgxMCwgMHgxYSwgMHg3MCwgMHgzNSwgMHgyMCwgMHgzOCwgMHgxYSwgMHg1YywgMHhkMiwKLSAgICAgICAgMHgwMSwgMHg3MywgMHg0OSwgMHg5YSwgMHg2MCwgMHgzOSwgMHg4ZiwgMHhjYSwgMHgyOSwgMHg4YiwgMHhmNywKLSAgICAgICAgMHhhYSwgMHhiYSwgMHg4OCwgMHg5NiwgMHg5YSwgMHg2YiwgMHg0MCwgMHgxOCwgMHhjNiwgMHhhMywgMHgyNiwKLSAgICAgICAgMHg4MCwgMHgxOCwgMHg2OSwgMHhhNiwgMHg5MCwgMHhjOCwgMHgxNCwgMHhkNCwgMHg4YSwgMHg2OSwgMHg4MCwKLSAgICAgICAgMHhmMCwgMHg2YSwgMHg0MCwgMHg2OCwgMHgxMCwgMHhiYiwgMHg0MSwgMHhhNywgMHhlMywgMHgwYiwgMHhjNSwKLSAgICAgICAgMHgyYiwgMHgwMSwgMHgxMCwgMHhhNywgMHgwMywgMHg1OSwgMHgwYywgMHg3NiwgMHg2OSwgMHg3MywgMHg0MCwKLSAgICAgICAgMHgwYiwgMHg5YSwgMHgyOCwgMHgxMSwgMHgyOCwgMHgxOSwgMHg1ZSwgMHg2OSwgMHgwMiwgMHg4MSwgMHg1YSwKLSAgICAgICAgMHhkOCwgMHgwMCwgMHhkMywgMHg0ZCwgMHg1MCwgMHgwYywgMHg2YSwgMHg4YywgMHhkMiwgMHgwMSwgMHhhNiwKLSAgICAgICAgMHg5OCwgMHg2OSwgMHgwYywgMHhhZSwgMHhhNiwgMHhhNCwgMHgwNiwgMHg4MCwgMHgxZSwgMHhhNiwgMHg5ZSwKLSAgICAgICAgMHgwZCwgMHgzMSwgMHgxMiwgMHgwMywgMHg0ZiwgMHgwNiwgMHg4MCwgMHgxMywgMHg2MCwgMHgzNCwgMHhkMywKLSAgICAgICAgMHhjMSwgMHhhOCwgMHg5MiwgMHgwMSwgMHhmMSwgMHg4ZCwgMHhkZCwgMHg2OSwgMHhjYywgMHhhMSwgMHg2OSwKLSAgICAgICAgMHg1YiwgMHg0YiwgMHg4MCwgMHg4MywgMHg5MywgMHg1MiwgMHgwNCwgMHgxNCwgMHhlMiwgMHhhZSwgMHgwMywKLSAgICAgICAgMHhhOSwgMHgwZCwgMHg2OCwgMHgwMywgMHg0ZCwgMHgzNCwgMHhkMCwgMHgwMywgMHgwZCwgMHgzMCwgMHhkMiwKLSAgICAgICAgMHgwMSwgMHg4NiwgMHg5YSwgMHg2OCwgMHgxOSwgMHg1OCwgMHgxYSwgMHg3OCwgMHhhNCwgMHgwNCwgMHg4YSwKLSAgICAgICAgMHg2OSwgMHhlMCwgMHhkMywgMHgxMCwgMHhlMCwgMHg2OSwgMHhlMCwgMHhkMCwgMHgwMywgMHhjMSwgMHhhOCwKLSAgICAgICAgMHhkYiwgMHhhZCwgMHg0YywgMHg4MSwgMHgxMiwgMHg0NSwgMHhkNiwgMHg5ZCwgMHgyNSwgMHgxZCwgMHgwMCwKLSAgICAgICAgMHg2YSwgMHhmNSwgMHhhOSwgMHhlOCwgMHg4MCwgMHgzMSwgMHgyOSwgMHgwZCwgMHg1OCwgMHgwOCwgMHg2OSwKLSAgICAgICAgMHg4NiwgMHg4MCwgMHgxYSwgMHg2OSwgMHg4NiwgMHg5MCwgMHgwYywgMHgzNCwgMHhkMywgMHg0OCwgMHg2NSwKLSAgICAgICAgMHg1MSwgMHg0ZiwgMHgwNiwgMHg5OCwgMHgwZiwgMHgxNCwgMHhmMCwgMHg2OCwgMHgxMCwgMHhmMCwgMHg2OSwKLSAgICAgICAgMHhlMCwgMHhkMCwgMHgwMywgMHg4MSwgMHhhNSwgMHgyYiwgMHg5YSwgMHgxYSwgMHhiOCwgMHg4NywgMHhhOCwKLSAgICAgICAgMHhkYiwgMHg0YSwgMHg0NiwgMHg2OCwgMHhiNiwgMHg4MCwgMHgyYSwgMHhhOCwgMHgxNCwgMHhlYSwgMHgxMiwKLSAgICAgICAgMHhiMCwgMHgwNSwgMHgyMSwgMHhhNiwgMHgwMiwgMHgxYSwgMHg2MSwgMHhhMCwgMHgwNiwgMHg5YSwgMHg2MSwKLSAgICAgICAgMHhhNCwgMHgzMSwgMHg4NiwgMHg5YSwgMHg2OSwgMHgwYywgMHhhOCwgMHgwZCwgMHgzYywgMHg1MywgMHgwMSwKLSAgICAgICAgMHhlMiwgMHg5ZSwgMHgyOCwgMHgxMCwgMHhmMSwgMHg0ZSwgMHgwNiwgMHg5OCwgMHgwZiwgMHgwNiwgMHg5ZSwKLSAgICAgICAgMHgwZCwgMHgwMiwgMHgxYywgMHgyOSwgMHhjMiwgMHg4MCwgMHgxNiwgMHg5NiwgMHg4MCwgMHgwYSwgMHg0YSwKLSAgICAgICAgMHgwMCwgMHg0MywgMHg0ZCwgMHgzNCwgMHgwYywgMHg2MSwgMHhhNiwgMHgxYSwgMHg0MCwgMHgzNCwgMHhkMywKLSAgICAgICAgMHg0ZCwgMHgyMSwgMHg4MCwgMHhmZiwgMHhkOSwgMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwYSwKLSAgICAgICAgMHgwNywgMHgwNywgMHgwOCwgMHgwNywgMHgwNiwgMHgwYSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwYiwgMHgwYSwKLSAgICAgICAgMHgwYSwgMHgwYiwgMHgwZSwgMHgxOCwgMHgxMCwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZSwgMHgxZCwgMHgxNSwKLSAgICAgICAgMHgxNiwgMHgxMSwgMHgxOCwgMHgyMywgMHgxZiwgMHgyNSwgMHgyNCwgMHgyMiwgMHgxZiwgMHgyMiwgMHgyMSwKLSAgICAgICAgMHgyNiwgMHgyYiwgMHgzNywgMHgyZiwgMHgyNiwgMHgyOSwgMHgzNCwgMHgyOSwgMHgyMSwgMHgyMiwgMHgzMCwKLSAgICAgICAgMHg0MSwgMHgzMSwgMHgzNCwgMHgzOSwgMHgzYiwgMHgzZSwgMHgzZSwgMHgzZSwgMHgyNSwgMHgyZSwgMHg0NCwKLSAgICAgICAgMHg0OSwgMHg0MywgMHgzYywgMHg0OCwgMHgzNywgMHgzZCwgMHgzZSwgMHgzYiwgMHgwMSwgMHgwYSwgMHgwYiwKLSAgICAgICAgMHgwYiwgMHgwZSwgMHgwZCwgMHgwZSwgMHgxYywgMHgxMCwgMHgxMCwgMHgxYywgMHgzYiwgMHgyOCwgMHgyMiwKLSAgICAgICAgMHgyOCwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHhmZiwgMHhjMCwgMHgwMCwgMHgxMSwKLSAgICAgICAgMHgwOCwgMHgwMCwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwgMHgwMiwgMHgxMSwKLSAgICAgICAgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwMywgMHgwMiwKLSAgICAgICAgMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwgMHgwMSwKLSAgICAgICAgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwKLSAgICAgICAgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwKLSAgICAgICAgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwgMHgyNCwgMHgzMywKLSAgICAgICAgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwKLSAgICAgICAgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwKLSAgICAgICAgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKLSAgICAgICAgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwKLSAgICAgICAgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwKLSAgICAgICAgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwKLSAgICAgICAgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwKLSAgICAgICAgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwKLSAgICAgICAgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKLSAgICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMSwgMHhmMiwgMHhmMywKLSAgICAgICAgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMSwKLSAgICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKLSAgICAgICAgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNCwgMHgwMywKLSAgICAgICAgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwKLSAgICAgICAgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKLSAgICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwgMHg2MiwgMHg3MiwKLSAgICAgICAgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywgMHgxOCwgMHgxOSwKLSAgICAgICAgMHgxYSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwKLSAgICAgICAgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKLSAgICAgICAgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwKLSAgICAgICAgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywKLSAgICAgICAgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwKLSAgICAgICAgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywKLSAgICAgICAgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwKLSAgICAgICAgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMiwKLSAgICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwgMHhmMywgMHhmNCwKLSAgICAgICAgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmZiwgMHhkYSwgMHgwMCwgMHgwYywgMHgwMywKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMCwgMHg5ZSwgMHhkMiwKLSAgICAgICAgMHgyZSwgMHgwNywgMHgxNSwgMHhhZiwgMHg2ZCwgMHgwOCwgMHhlMiwgMHhiMywgMHg0NSwgMHgxYSwgMHhmNiwKLSAgICAgICAgMHhkMCwgMHgwMCwgMHgwMSwgMHhjNSwgMHg2OCwgMHg0NSwgMHgxNywgMHg0YSwgMHhiNCwgMHgyMiwgMHhlNCwKLSAgICAgICAgMHg3MCwgMHg4YywgMHg3NCwgMHhhOSwgMHgzYywgMHhhMSwgMHg4ZSwgMHg5NSwgMHg0OCwgMHg5NiwgMHgzMSwKLSAgICAgICAgMHhlMiwgMHgxOCwgMHhlOSwgMHg1NSwgMHhhNSwgMHg4YywgMHg3YSwgMHg1MCwgMHgwNSwgMHgwYiwgMHg4OCwKLSAgICAgICAgMHg4NiwgMHgwZiwgMHgxNSwgMHg4ZiwgMHg3NSwgMHgxZiwgMHgyNiwgMHg5MywgMHgxOSwgMHg5MSwgMHg3NywKLSAgICAgICAgMHgxOCwgMHhjMSwgMHhhYywgMHg0YiwgMHhjOCwgMHhmYSwgMHhkNiwgMHg2MywgMHgzNywgMHg2ZCwgMHgzMSwKLSAgICAgICAgMHhiNCwgMHg3MywgMHg1YiwgMHgzNiwgMHhhMCwgMHgxYywgMHg1MCwgMHg4MCwgMHhkNywgMHg4MywgMHhhMCwKLSAgICAgICAgMHhhYiwgMHhkMSwgMHg2MiwgMHhhZCwgMHgwOSwgMHg4ZiwgMHgxNywgMHgyOSwgMHgwMywgMHhiMiwgMHhjYywKLSAgICAgICAgMHhlMCwgMHg3NywgMHgxNCwgMHhhMywgMHg1NiwgMHhiMywgMHgyNywgMHgxZSwgMHg2NywgMHhlOSwgMHg1MiwKLSAgICAgICAgMHhlYSwgMHhjNiwgMHgzYSwgMHgzNiwgMHg0OCwgMHhlZiwgMHgzZCwgMHgyNywgMHg3MCwgMHgyMiwgMHg2MCwKLSAgICAgICAgMHg0NywgMHg1MiwgMHg2OSwgMHhiMiwgMHhlMiwgMHhhZCwgMHgzYiwgMHhlYSwgMHg4MCwgMHhhMywgMHgzOCwKLSAgICAgICAgMHhlMCwgMHhkNiwgMHgzZCwgMHhkOCwgMHgxYywgMHhkMCwgMHhjYSwgMHg0NiwgMHgzZCwgMHhkMCwgMHgxOCwKLSAgICAgICAgMHgzNSwgMHg4OSwgMHg3OCwgMHhhMywgMHg5YSwgMHhjZCwgMHg4YywgMHhkMiwgMHhiMywgMHg5MywgMHgyYSwKLSAgICAgICAgMHgyYiwgMHg2NiwgMHhkNSwgMHhmMSwgMHg4YSwgMHgxMCwgMHgxYSwgMHhkNiwgMHhmMiwgMHgwMywgMHg4YSwKLSAgICAgICAgMHg5ZSwgMHhlNiwgMHhmNCwgMHg1YSwgMHhkYiwgMHhlZiwgMHhmZSwgMHgyMywgMHhjMCwgMHhhNywgMHgyNywKLSAgICAgICAgMHhjYiwgMHgxNiwgMHhjNCwgMHhjYywgMHhkZCwgMHhlMiwgMHg3OCwgMHg5YSwgMHg2OSwgMHg2NiwgMHhjYywKLSAgICAgICAgMHg5OSwgMHhlMSwgMHg0ZCwgMHg0NywgMHhiYSwgMHhiYywgMHhkOSwgMHg2YSwgMHhlZSwgMHgyNiwgMHg1OSwKLSAgICAgICAgMHg1OSwgMHg0ZCwgMHhhYywgMHg2OSwgMHgzNCwgMHg1MiwgMHhlNSwgMHg4ZiwgMHg1NSwgMHhhZCwgMHg1OCwKLSAgICAgICAgMHhhZSwgMHg4NSwgMHhjNCwgMHgyMiwgMHg0MSwgMHhkZiwgMHhhZCwgMHg3NiwgMHg2MSwgMHhlNSwgMHg2ZiwKLSAgICAgICAgMHg3NCwgMHg0NSwgMHg2OSwgMHhkYywgMHgwMCwgMHg3OSwgMHhhYywgMHg4YiwgMHhhNiwgMHhjOSwgMHgzNSwKLSAgICAgICAgMHhkNCwgMHgzNCwgMHg2NCwgMHhkYywgMHgzNywgMHgwNiwgMHhiMSwgMHhhZSwgMHg4OCwgMHhjMSwgMHhhYywKLSAgICAgICAgMHhkOCwgMHhjOSwgMHgyYywgMHhhNiwgMHhlMCwgMHg3MywgMHg1YiwgMHgzNiwgMHhmMywgMHg3NCwgMHhlNiwKLSAgICAgICAgMHg4NCwgMHgwNSwgMHhlMywgMHhhOSwgMHg0NywgMHg2YSwgMHgxNCwgMHhiNiwgMHg0OSwgMHgzZCwgMHg4NSwKLSAgICAgICAgMHgzYSwgMHhlZSwgMHhlZSwgMHgyYiwgMHhhOCwgMHhlMiwgMHg2ZiwgMHgzMCwgMHg4MSwgMHhlOSwgMHg4YSwKLSAgICAgICAgMHhjYSwgMHhhNCwgMHhlMiwgMHhkMywgMHg4YiwgMHgwMSwgMHhiMSwgMHhmOSwgMHgwNCwgMHg3ZiwgMHhhZiwKLSAgICAgICAgMHgyMywgMHhmMCwgMHhhOSwgMHg1NCwgMHg0MSwgMHg5YywgMHhmZCwgMHhhMywgMHhmNCwgMHhhZSwgMHg2NSwKLSAgICAgICAgMHgxOCwgMHhmNywgMHgyNSwgMHg4YSwgMHhlMiwgMHgwMiwgMHgzOCwgMHhiOCwgMHhmZCwgMHgyYSwgMHg3YiwKLSAgICAgICAgMHg1YiwgMHhhOCwgMHg2ZCwgMHg2ZCwgMHg1ZCwgMHg5YSwgMHg1ZCwgMHhjYiwgMHhiYiwgMHhkMiwgMHhiNiwKLSAgICAgICAgMHhhNiwgMHhhMywgMHgxOSwgMHg1ZSwgMHhlMiwgMHgwMywgMHg3YiwgMHgxZCwgMHhjMiwgMHgxNywgMHg4ZCwKLSAgICAgICAgMHhiOCwgMHhhYywgMHhmYiwgMHg4OSwgMHgzOSwgMHgzNSwgMHhkNiwgMHg5YSwgMHg2YSwgMHhlOCwgMHg2NiwKLSAgICAgICAgMHg1NSwgMHhjYiwgMHhmNSwgMHhhYywgMHg3YiwgMHg5NiwgMHhlYiwgMHg1MCwgMHhjNiwgMHg4OCwgMHg2ZCwKLSAgICAgICAgMHg2NiwgMHhlOSwgMHhjZCwgMHg2YywgMHhkYiwgMHg0ZiwgMHhkMywgMHg5YSwgMHgwMCwgMHgyZiwgMHhlNiwKLSAgICAgICAgMHhmOSwgMHhhMywgMHhlNywgMHhiNSwgMHg0YSwgMHg5MywgMHg3ZiwgMHhhMiwgMHhjNiwgMHg3MywgMHhkYywKLSAgICAgICAgMHhkNywgMHgxNSwgMHg1NSwgMHhlZiwgMHg0OCwgMHg3ZCwgMHgwOSwgMHg1MiwgMHg2ZSwgMHgzYSwgMHhkNCwKLSAgICAgICAgMHhhYiwgMHgyZiwgMHhiZCwgMHg2MSwgMHgxNiwgMHgwYywgMHg3MywgMHg0OSwgMHhjNSwgMHgyNCwgMHg5MiwKLSAgICAgICAgMHg3ZiwgMHhhMiwgMHg2MywgMHhmZCwgMHhhYSwgMHhkNiwgMHgyZiwgMHg3MSwgMHgwZSwgMHhiMSwgMHg5MywKLSAgICAgICAgMHhmNywgMHgyZCwgMHhmNSwgMHhhNCwgMHg5ZSwgMHg0ZSwgMHhiNSwgMHhkZCwgMHg0YiwgMHhmOCwgMHg2OCwKLSAgICAgICAgMHg0YywgMHhjYiwgMHhiOSwgMHg5MywgMHhhZCwgMHg2NSwgMHhjZSwgMHhkOSwgMHgyNiwgMHhhOSwgMHg4ZCwKLSAgICAgICAgMHgxOSwgMHhmNiwgMHhmMiwgMHhmNCwgMHhlNiwgMHhiNSwgMHhhZCwgMHhlNywgMHhjNiwgMHgzOSwgMHhhMCwKLSAgICAgICAgMHgxOCwgMHhlYiwgMHhjOSwgMHg3NywgMHg2YywgMHgzNSwgMHgyYSwgMHg0YiwgMHhmZSwgMHg4YSwgMHg5YywKLSAgICAgICAgMHhmZiwgMHgwMCwgMHgxMSwgMHhhZSwgMHgzYSwgMHg4YiwgMHhkZSwgMHg2MSwgMHhkMCwgMHg5ZSwgMHgzOSwKLSAgICAgICAgMHhiOCwgMHhlYiwgMHg1MywgMHhhYywgMHhiOSwgMHhhZSwgMHg1YiwgMHgwMCwgMHhmMywgMHgyNywgMHgxNCwKLSAgICAgICAgMHg5MiwgMHhjOSwgMHhmZSwgMHg4YSwgMHgzZiwgMHhkZSwgMHgzNSwgMHhhYywgMHgzYSwgMHg4OCwgMHg5MiwKLSAgICAgICAgMHhjZCwgMHhiMSwgMHg2ZSwgMHg3ZCwgMHhjZCwgMHgzMiwgMHg2NywgMHhlYiwgMHhjZCwgMHg3YSwgMHgxNCwKLSAgICAgICAgMHhmZSwgMHgwNCwgMHgyNiwgMHg2NiwgMHhjZSwgMHhmOSwgMHgyNiwgMHhiMywgMHhlNiwgMHg2ZSwgMHhiNCwKLSAgICAgICAgMHhkOSwgMHg0OCwgMHhjOCwgMHg4MiwgMHg0ZSwgMHgwNywgMHgzNSwgMHhhNywgMHg2ZiwgMHgyZiwgMHgwMiwKLSAgICAgICAgMHg5YSwgMHgwNiwgMHg1ZiwgMHg4YywgMHhhNCwgMHg4MywgMHgwZSwgMHgzMiwgMHgyYSwgMHg2OSwgMHhlMywKLSAgICAgICAgMHhkZCwgMHgxMiwgMHgwOCwgMHg5NywgMHg4NSwgMHhlYywgMHgyYSwgMHgyYSwgMHg0MiwgMHhmMSwgMHg3NiwKLSAgICAgICAgMHgyNiwgMHhlNCwgMHg2YSwgMHg1OSwgMHgwZSwgMHgxOCwgMHgxMCwgMHg2YSwgMHhkMiwgMHg4OSwgMHgwMiwKLSAgICAgICAgMHg2ZSwgMHgyYSwgMHg3MSwgMHhlYiwgMHg1YywgMHgxYywgMHg4YywgMHhhNiwgMHg0OCwgMHhiYiwgMHhkYywKLSAgICAgICAgMHg2MSwgMHg0MSwgMHgzNSwgMHg3MiwgMHgyOCwgMHg4NywgMHhkOSwgMHhmNiwgMHg0YSwgMHhiOSwgMHhlNywKLSAgICAgICAgMHgzOCwgMHhhZSwgMHg4YywgMHgzZCwgMHgzNiwgMHhkZCwgMHhkZSwgMHhjNCwgMHhiMCwgMHgyMSwgMHg1MSwKLSAgICAgICAgMHg3NiwgMHhhOCwgMHhjMCwgMHhhYSwgMHg5MywgMHgzMSwgMHhlNiwgMHhiYiwgMHgyZCwgMHg2NSwgMHg2MSwKLSAgICAgICAgMHgxOSwgMHhkMywgMHgxZSwgMHhiNSwgMHg0NiwgMHg1YSwgMHg5NiwgMHg1YSwgMHgzMCwgMHhhMCwgMHg3ZSwKLSAgICAgICAgMHgwNSwgMHg2OSwgMHg1YiwgMHhjOSwgMHhjNiwgMHgyOCwgMHg0MCwgMHhjZCwgMHgwOCwgMHg2NCwgMHgzYywKLSAgICAgICAgMHg3MywgMHg1NywgMHhlMSwgMHg5NCwgMHhmMSwgMHhjZCwgMHg1YSwgMHgyMSwgMHg4YywgMHhiOSwgMHg2MywKLSAgICAgICAgMHhlNywgMHg2NywgMHgxZCwgMHhhYiwgMHg0MCwgMHhiMSwgMHhmYiwgMHgwMCwgMHgxZCwgMHhmMCwgMHgyYiwKLSAgICAgICAgMHg5OSwgMHgyZCwgMHg2NiwgMHgzZSwgMHg4OCwgMHg3NSwgMHg4MSwgMHgzZiwgMHgzMSwgMHhmNiwgMHhhYiwKLSAgICAgICAgMHg2NCwgMHhkNiwgMHhiNCwgMHgxNywgMHhlZSwgMHhkMCwgMHg5ZSwgMHhlNCwgMHgzMiwgMHgxYSwgMHhhNywKLSAgICAgICAgMHgzMSwgMHhhZCwgMHgxOCwgMHgxNCwgMHgyNiwgMHhlZiwgMHg1NCwgMHhhNSwgMHhhOCwgMHg2NSwgMHhhMywKLSAgICAgICAgMHg5YywgMHg4MSwgMHhmYSwgMHg1NiwgMHg4YywgMHgyZCwgMHhjZSwgMHg2OCwgMHg0MCwgMHhjYiwgMHhmMSwKLSAgICAgICAgMHgzNywgMHhiZCwgMHg1ZSwgMHg4NSwgMHhlYSwgMHhkMSwgMHgwYywgMHhiYiwgMHgxOSwgMHg1NiwgMHgyMywKLSAgICAgICAgMHgyMCwgMHgxZiwgMHhhZCwgMHg1YywgMHg0MiwgMHgwOCwgMHgwMywgMHhiNSwgMHg1NSwgMHg5MSwgMHgwNCwKLSAgICAgICAgMHhjOSwgMHg4MCwgMHgzOCwgMHgwMCwgMHgwYSwgMHg3MSwgMHgzNCwgMHg2YywgMHgzMiwgMHgyNywgMHhlOSwKLSAgICAgICAgMHg1NSwgMHgyNSwgMHgxNSwgMHgyYywgMHg2OCwgMHhhMywgMHgzMCwgMHhlYiwgMHg1NCwgMHhhNSwgMHgxNSwKLSAgICAgICAgMHgwYywgMHhkMSwgMHgwMCwgMHhmZiwgMHhkOX07Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlLmxlbmd0aDsKLSAgICAgICAgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlW2ldID0gKGJ5dGUpc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kbztSb2lkOyIsIEFycmF5cy5hc0xpc3QoIkFuZG8iLCAiUm9pZCIsICIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfR2VuZXJpYygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfVHlwZV9KYXBhbmVzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5hbWUtcmVsYXRlZCBzdHJpbmdzIG9ubHkgY29udGFpbnMgcHJpbnRhYmxlIEFzY2lpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIGlzIHJlbWFpbmVkIHRvIGJlIFVTJ3M6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLCBSLnJhdy52MjFfc2ltcGxlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJGTiIgZmllbGQgc2hvdWxkIGJlIHByZWZlcmVkIHNpbmNlIGl0IHNob3VsZCBjb250YWluIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaW50ZW5kZWQgYnkgdGhlIGF1dGhvciBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgJzsnIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgVkNhcmRQYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2VfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICI7QTtCXFw7Q1xcOztEOzpFO1xcXFw7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGlnbm9yZXMgcmVkdW5kYW50IGZpZWxkcyBpbiAiTiIgcHJvcGVydHkgdmFsdWVzIGFuZAotICAgICAqIGluc2VydHMgbmFtZSByZWxhdGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkFNSUxZX05BTUUgaXMgZW1wdHkgYW5kIHJlbW92ZWQgaW4gdGhpcyB0ZXN0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQ1xcOyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnQmVmb3JUaXRsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX29yZ19iZWZvcmVfdGl0bGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTm9ybWFsIEd1eSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIk9yZ2FuaXphdGlvbiBEZXZpc2lvbiBSb29tIFNoZWV0IE5vLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFeGNlbGxlbnQgSmFuaXRvciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpdGxlQmVmb3JPcmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV90aXRsZV9iZWZvcmVfb3JnKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIk5pY2UgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNYXJ2ZXJvdXMiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJQZXJmZWN0IEdyZWF0IEdvb2QgQmFkIFBvb3IiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiQ29vbCBUaXRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW50ZXJwcmV0ICJQUkVGIiBhdHRyaWJ1dGUgdG8gSVNfUFJJTUFSWS4KLSAgICAgKiBUaGUgZGF0YSBjb250YWluIHRocmVlIGNhc2VzOiBvbmUgIlBSRUYiLCBubyAiUFJFRiIgYW5kIG11bHRpcGxlICJQUkVGIiwgaW4gZWFjaCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFQcmVmVG9Jc1ByaW1hcnkoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9wcmVmX2hhbmRsaW5nKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiU21pdGgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidGVzdEBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0MkBleGFtaW5hdGlvbi5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiRW5naW5lZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiTXlzdGVyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJCbG9nZ2VyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIlBvZXRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJQb2V0IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBhbGwgdGhlIHByb3BlcnRpZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZCBhcmUgY29ycmVjdGx5IHBhcnNlZCBieSB0aGUgVkNhcmRQYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiR3VtcDtGb3JyZXN0O0hvZ2U7UG9zO1RhbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJHdW1wIiwgIkZvcnJlc3QiLCAiSG9nZSIsICJQb3MiLCAiVGFvIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiSm9lIER1ZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0LjtNYW5hZ2VyO0Zpc2gga2VlcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAgU2hyaW1wIENvLiIsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIiwgIkZpc2gga2VlcGVyIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUk9MRSIsICJGaXNoIENha2UgS2VlcGVyISIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiU2hyaW1wIE1hbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIoMTExKSA1NTUtMTIxMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIig0MDQpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMxMTExMTExMSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMjIyMjIyMjIiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMzMzMzMzMzMyIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICIxMDAgV2F0ZXJzIEVkZ2UiLCAiQmF5dG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQSIsICIzMDMxNCIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJMQUJFTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICI0MiBQbGFudGF0aW9uIFN0LiIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LlxyXG5CYXl0b3duLCBMQSAzMDMxNFxyXG5Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkVNQUlMIiwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIklOVEVSTkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiY2VsbEBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UsIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUFUVFJJQlVURSIsICJTb21lIFN0cmluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQkRBWSIsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiR0VPIiwgIjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlVSTCIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgwNDI0VDE5NTI0M1oiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaW5zZXJ0cyB2YWx1ZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZAotICAgICAqIGludG8gQ29udGVudFJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFDb21wbGljYXRlZENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkd1bXAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkZvcnJlc3QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJIb2dlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlBvcyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJUYW8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiSm9lIER1ZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJHdW1wIFNocmltcCBDby4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIEZpc2gga2VlcGVyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlNocmltcCBNYW4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gYmUgZm9ybWF0ZWQgd2l0aCBOQU1QIGZvcm1hdCBpbiBkZWZhdWx0LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MDQtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxLTExMS0xMTExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMyLTIyMi0yMjIyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMzLTMzMy0zMzMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjEwMCBXYXRlcnMgRWRnZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEwMCBXYXRlcnMgRWRnZSBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICI0MiBQbGFudGF0aW9uIFN0LiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gIlRZUEU9SU5URVJORVQiIC0+IFRZUEVfQ1VTVE9NICsgdGhlIGxhYmVsICJJTlRFUk5FVCIKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJjZWxsQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIE5vIGluZm9ybWF0aW9uIGFib3V0IGl0cyBpbWFnZSBmb3JtYXQgY2FuIGJlIGluc2VydGVkLgotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfSE9NRVBBR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGVfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kO1JvaWQ7OzsiLCBBcnJheXMuYXNMaXN0KCJBbmQiLCAiUm9pZCIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIk9wZW4iLCAiSGFuZHNldCIsICIgQWxsaWFuY2UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1JULVNUUklORyIsICJhbmRyb2lkIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG5ldyBUeXBlU2V0KCJQUkVGIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOTyIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOIiwgImdyb3VwMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgxMDMxVDA2NTg1NFoiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZCBSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJhbmRyb2lkIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJPcGVuIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiSGFuZHNldCAgQWxsaWFuY2UiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMC0wMDAtMDAwMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIC8vIFRob3VnaCBKYXBhbmVzZSBjYXJlZXJzIGFwcGVuZCAiOzs7OyIgYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgIlNPVU5EIiwKLSAgICAgICAgLy8gdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gaGFuZGxlIGl0IGFzIG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMDAwMDAwMDAiLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlZPSUNFIiwgIlBSRUYiKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlLCBib29sZWFuIGphcGFuZXNlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdCh2Y2FyZFR5cGUsIHJlc0lkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLy8gV2hpbGUgdkNhcmQgcGFyc2VyIGRvZXMgbm90IHNwbGl0ICJTT1VORCIgcHJvcGVydHkgdmFsdWVzLAotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3QgY2FyZSBpdC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gUGhvbmUgbnVtYmVyIGZvcm1hdHRpbmcgaXMgZGlmZmVyZW50LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAoamFwYW5lc2UgPyAiMDMtMDAwMC0wMDAwIiA6ICIwMzAtMDAwLTAwMDAiKSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1NqaXMoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4fS4KLSAgICAgKiBzaW5jZSB2Q2FyZCAyLjEgc3BlY2lmaWVzIHRoZSBjaGFyc2V0IG9mIGVhY2ggbGluZSBpZiBpdCBjb250YWlucyBub24tQXNjaWkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTJfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0O1x1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczO1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjtcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkNcdTAwMzYiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2OEU7Ozs7MTUwLTg1MTI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiLCAiIiwgIiIsICIiLCAiMTUwLTg1MTIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbmV3IFR5cGVTZXQoIkhPTUUiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlx1MzBFMVx1MzBFMiIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9UeXBlX0dlbmVyaWNfVXRmOCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIikKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IHNob3VsZCBjb3JyZWN0bHkgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSBpbnRvIHNldmVyYWwgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggVkNhcmRQYXJzZXIgc2lkZSBkb2VzIG5vdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIDE1MC04NTEyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJcdTMwRTFcdTMwRTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2VfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9tdWx0aXBsZV9lbnRyeSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TRUNSRVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiWC1ORUMtSE9URUwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTEiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0NIT09MIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEyIiwgbmV3IFR5cGVTZXQoIkZBWCIsICJIT01FIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEzIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE0IiwgbmV3IFR5cGVTZXQoIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE1IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZBTUlMWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNiIsIG5ldyBUeXBlU2V0KCJYLU5FQy1HSVJMIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE3IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUJPWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1GUklFTkQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTkiLCBuZXcgVHlwZVNldCgiWC1ORUMtUEhTIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjIwIiwgbmV3IFR5cGVTZXQoIlgtTkVDLVJFU1RBVVJBTlQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMU11bHRpcGxlRW50cnlDYXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNFQ1JFVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUhPVEVMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNDSE9PTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyIik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNT0RFTSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9QQUdFUikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZBTUlMWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1HSVJMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2Iik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtQk9ZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE3Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZSSUVORCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1QSFMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUkVTVEFVUkFOVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yVmFsdWUgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yVmFsdWUucHV0KCJWQUxVRSIsICJEQVRFIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkV4YW1wbGUiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRXhhbXBsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQU5OSVZFUlNBUlkiLCAiMjAwOTEwMTAiLCBjb250ZW50VmFsdWVzRm9yVmFsdWUpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQUdFTlQiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLU5PIiwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkV4YW1wbGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9sZXJhdGVJbnZhbGlkQ29tbWVudExpa2VMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9jb21tZW50X2xpbmUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJDb25mZXJlbmNlIENhbGwiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhpcyBpcyBhbiAoc2hhcnAgLT4jPC0gc2hhcnApIGV4YW1wbGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIldPUksiLCAiTVNHIiwgIlBBR0VSIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MDM0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEphcGFuaXphdGlvblRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgdm9pZCB0ZXN0TmFtZVV0ZjhDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG51bGwgOiBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlx1MzA3NVx1MzA4Qlx1MzA2OTtcdTMwOTFcdTMwOEFcdTMwNEI7QjtEci47UGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDc1XHUzMDhCXHUzMDY5IiwgIlx1MzA5MVx1MzA4QVx1MzA0QiIsICJCIiwgIkRyLiIsICJQaC5EIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYyMSgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYzMCgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lU2hpZnRKaXMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJcdTMwNzVcdTMwOEJcdTMwNjk7XHUzMDkxXHUzMDhBXHUzMDRCO0I7RHIuO1BoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA3NVx1MzA4Qlx1MzA2OSIsICJcdTMwOTFcdTMwOEFcdTMwNEIiLCAiQiIsICJEci4iLCAiUGguRCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvQ29NbyBwaG9uZXMgcmVxdWlyZSBhbGwgbmFtZSBlbGVtZW50cyBzaG91bGQgYmUgaW4gImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCI7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgZnVsbE5hbWUgKyAiOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGZ1bGxOYW1lLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCBmdWxsTmFtZSwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlNPVU5EIiwgIjs7OzsiLCBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25ldGljTmFtZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSkgPwotICAgICAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMpIDoKLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBudWxsIDogbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpKTsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJcdTMwODRcdTMwN0VcdTMwNjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIlx1MzA4NFx1MzA3RVx1MzA2MCBcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAgXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwODRcdTMwN0VcdTMwNjAgXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYyMVV0ZjgoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxU2ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMzBVdGY4KCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFNKaXMoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvck1vYmlsZVYyMV8xKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdUZGODBcdUZGOUJcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJcdTk2REJcdTg5OEJcdTZDQTJcdTY3NTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiXHU5RTdGXHU5QUE4XHU1RTAyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICI0OTQtMTMxMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJcdTY1RTVcdTY3MkMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNTNcdTMwOTNcdTMwNkFcdTMwNjhcdTMwNTNcdTMwOERcdTMwOTJcdTg5OEIiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcdTMwOEJcdTMwNkFcdTMwOTNcdTMwNjZcdTY2ODdcdTRFQkFcdTMwNjdcdTMwNTlcdTMwNEJcdUZGMUYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgIlx1MzA0QVx1MzA4Mlx1MzA2MVx1MzA0Qlx1MzA0OFx1MzA4QSIpOwotCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKSA/Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclNKaXMgOgotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcykgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JVdGY4IDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgLy8gTEFCRUwgbXVzdCBiZSBpZ25vcmVkIGluIHZDYXJkIDIuMS4gQXMgZm9yIHZDYXJkIDMuMCwgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMKLSAgICAgICAgLy8gc2FtZSBhcyB0aGF0IGluIHZDYXJkIDMuMCwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIlx1NzlDMVx1NjZGOFx1N0JCMTA3IiwKLSAgICAgICAgICAgICAgICAiIiwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIsICJcdTlFN0ZcdTlBQThcdTVFMDIiLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIiwKLSAgICAgICAgICAgICAgICAiNDk0LTEzMTMiLCAiXHU2NUU1XHU2NzJDIiksCi0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVFNVx1NjcyQyA0OTQtMTMxMyBcdTAwRDdcdTAwRDdcdTc3MEMgXHU5RTdGXHU5QUE4XHU1RTAyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSAiICsgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc3dpdGhKYXBhbmVzZVYyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCBvbmx5IG9uZSBhZGRyZXNzIGZpZWxkIGlzIGVtaXR0ZWQgdG93YXJkIERvQ29NbyBwaG9uZXMuCi0gICAgICogUHJlZmVyZWQgdHlwZSBtdXN0IChzaG91bGQ/KSBiZTogSE9NRSA+IFdPUksgPiBPVEhFUiA+IENVU1RPTQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCBBcnJheXMuYXNMaXN0KCIyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoZSB2Q2FyZCBleHBvcnRlciB0b2xlcmF0ZXMgbnVsbCBUWVBFLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzQoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDMtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDkwLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjIxXzEoKSB7Ci0gICAgICAgIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjMwKCkgewotICAgICAgICB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckRvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUzIik7Ci0KLSAgICAgICAgLy8gTW9yZSB0aGFuIG9uZSBub3RlIGZpZWxkcyBtdXN0IGJlIGFnZ3JlZ2F0ZWQgaW50byBvbmUgbm90ZS4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk5PVEUiLCAibm90ZTFcbm5vdGUyXG5ub3RlMyIsIG1Db250ZW50VmFsdWVzRm9yUVApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkQ3VzdG9tVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIlx1MzA0RFx1MzA4M1x1MzBGQ1x1MzBBOFx1MzBDM1x1MzBDMVx1MzBGQyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA0RFx1MzA4M1x1MzBGQ1x1MzBBOFx1MzBDM1x1MzBDMVx1MzBGQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdHNCYXNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1N2UwYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5JQnVsa0N1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQWxtb3N0IGEgZGVhZCBjb3B5IG9mIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXIsIGJ1dCBkaWZmZXJlbnQgaW4gdGhhdCB0aGlzCi0gKiBjbGFzcyBleHRlbmRzIENvbnRlbnRQcm92aWRlciwgbm90IGltcGxlbWVudGluZyBJQ29udGVudFByb3ZpZGVyLAotICogc28gdGhhdCBNb2NrQ29udGVudFJlc29sdmVyIGlzIGFibGUgdG8gYWNjZXB0IHRoaXMgY2xhc3MgOigKLSAqLwotY2xhc3MgTW9ja0NvbnRlbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgYnVsa0luc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzW10gaW5pdGlhbFZhbHVlcykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwdWJsaWMgSUJ1bGtDdXJzb3IgYnVsa1F1ZXJ5KFVyaSB1cmwsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLCBJQ29udGVudE9ic2VydmVyIG9ic2VydmVyLAotICAgICAgICAgICAgQ3Vyc29yV2luZG93IHdpbmRvdykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmwsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJsLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJsLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotfQotCi0vKioKLSAqIEJhc2VDbGFzcyBmb3IgdkNhcmQgdW5pdCB0ZXN0cyB3aXRoIHV0aWxpdHkgY2xhc3Nlcy4KLSAqIFBsZWFzZSBkbyBub3QgYWRkIGVhY2ggdW5pdCB0ZXN0IGhlcmUuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgVkNhcmRUZXN0c0Jhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFYyMSA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMzAgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjg7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHRoZXNlIGR1cmluZyB0ZXN0cy4KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzA7Ci0KLSAgICBwcm90ZWN0ZWQgVkNhcmRWZXJpZmllciBtVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwVmVyaWZpY2F0aW9uOwotCi0gICAgcHVibGljIFZDYXJkVGVzdHNCYXNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcy5wdXQoIkNIQVJTRVQiLCAiU0hJRlRfSklTIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLnB1dCgiRU5DT0RJTkciLCAiQkFTRTY0Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAucHV0KCJFTkNPRElORyIsICJiIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKSB7Ci0gICAgICAgIHN1cGVyLnRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1WZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICBtU2tpcFZlcmlmaWNhdGlvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlmICghbVNraXBWZXJpZmljYXRpb24pIHsKLSAgICAgICAgICAgIG1WZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyOTlmOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkVXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDIwOyBpIDwgMHg3RjsgaSsrKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcilpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHJcbiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHUwMDE5IikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcciIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxuIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiMDEyMzQ1Njc4OS0iKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMHgzMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAweDJEKSB7ICAvLyAtCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHgzQTsgaSA8IDB4NDE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4NUI7IGkgPCAweDYxOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDdCOyBpIDwgMHgxMDA7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjMzE1OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBDdXN0b21Nb2NrQ29udGV4dCBleHRlbmRzIE1vY2tDb250ZXh0IHsKLSAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOwotICAgIHB1YmxpYyBDdXN0b21Nb2NrQ29udGV4dChDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtUmVzb2x2ZXI7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIFZDYXJkVmVyaWZpZXIgewotICAgIHByaXZhdGUgY2xhc3MgVkNhcmRWZXJpZmllckludGVybmFsIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgICAgIHZlcmlmeU9uZVZDYXJkKHZjYXJkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGVybWluYXRlKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgVkNhcmRWZXJpZmllckludGVybmFsIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWw7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVjMwOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEb0NvTW87Ci0KLSAgICAvLyBPbmx5IG9uZSBvZiB0aGVtIG11c3QgYmUgbm9uLWVtcHR5LgotICAgIHByaXZhdGUgRXhwb3J0VGVzdFJlc29sdmVyIG1FeHBvcnRUZXN0UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07Ci0KLSAgICAvLyBUbyBhbGxvdyBkdXBsaWNhdGlvbiwgdXNlIGxpc3QgaW5zdGVhZCBvZiBzZXQuCi0gICAgLy8gV2hlbiBudWxsLCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSB2ZXJpZmljYXRpb24uCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIExpbmVWZXJpZmllciBtTGluZVZlcmlmaWVyOwotICAgIHByaXZhdGUgQ29udGVudFZhbHVlc1ZlcmlmaWVyIG1Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcmlmaWVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVkNhcmRWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbCA9IG5ldyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwoKTsKLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICBtVmVyaWZpZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9yRXhwb3J0VGVzdChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG5ldyBFeHBvcnRUZXN0UmVzb2x2ZXIobVRlc3RDYXNlKTsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzVjMwID0gVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9ySW1wb3J0VGVzdChpbnQgdmNhcmRUeXBlLCBpbnQgcmVzSWQpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBzZXRJbnB1dFJlc291cmNlSWQocmVzSWQpOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFJlc291cmNlSWQoaW50IHJlc0lkKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIldyb25nIHJlc0lkOiAiICsgcmVzSWQpOwotICAgICAgICB9Ci0gICAgICAgIHNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoImFkZElucHV0RW50cnkoKSBpcyBjYWxsZWQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJJbnB1dFN0cmVhbSBpcyBhbHJlYWR5IHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJzZXRJbnB1dFN0cmVhbSBpcyBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUV4cG9ydFRlc3RSZXNvbHZlci5hZGRJbnB1dENvbnRhY3RFbnRyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIobVRlc3RDYXNlKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPQotICAgICAgICAgICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsIChtSXNWMzAgPyAiMy4wIiA6ICIyLjEiKSk7Ci0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUxpbmVWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllcihtVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGluZVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllci5hZGRFbGVtKG1UZXN0Q2FzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU9uZVZDYXJkKGZpbmFsIFN0cmluZyB2Y2FyZCkgewotICAgICAgICAvLyBMb2cuZCgiQEBAIiwgdmNhcmQpOwotICAgICAgICBmaW5hbCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXI7Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFZOb2RlQnVpbGRlciB2bm9kZUJ1aWxkZXIgPSBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgICAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIHZjYXJkRGF0YUJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgdmNhcmREYXRhQnVpbGRlci5hZGRFbnRyeUhhbmRsZXIobUNvbnRlbnRWYWx1ZXNWZXJpZmllcik7Ci0gICAgICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciwgdmNhcmREYXRhQnVpbGRlcikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gdm5vZGVCdWlsZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIgPQotICAgICAgICAgICAgICAgIChtSXNWMzAgPyBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpIDogbmV3IFZDYXJkUGFyc2VyX1YyMSgpKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQgPQotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXMobVZDYXJkVHlwZSkgPyAiU0hJRlRfSklTIiA6ICJVVEYtOCIpOwotICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmNhcmQuZ2V0Qnl0ZXMoY2hhcnNldCkpOwotICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscyh0cnVlLCBwYXJzZXIucGFyc2UoaXMsIG51bGwsIGJ1aWxkZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIFZDYXJkRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmVyaWZpZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJ2ZXJpZnkoKSB3YXMgY2FsbGVkIHR3aWNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2ZXJpZnlGb3JJbXBvcnRUZXN0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIklPRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlZDYXJkRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKXsKLSAgICAgICAgICAgIHZlcmlmeUZvckV4cG9ydFRlc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJObyBpbnB1dCBpcyBkZXRlcm1pbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZlcmlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobUxpbmVWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllci52ZXJpZnkobUlucHV0U3RyZWFtLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKAotICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyLAotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgIHJlc29sdmVyLmFjcXVpcmVDb250ZW50UHJvdmlkZXJDbGllbnQodXJpKS5nZXRMb2NhbENvbnRlbnRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gKChFeHBvcnRUZXN0UHJvdmlkZXIpcHJvdmlkZXIpLnF1ZXJ5RW50aXRpZXMoCi0gICAgICAgICAgICAgICAgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCkKLSAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIm1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCIsCi0gICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLmNsYXNzLCBVcmkuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3MsIFN0cmluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvckV4cG9ydFRlc3QoKSB7Ci0gICAgICAgZmluYWwgVkNhcmRDb21wb3NlciBjb21wb3NlciA9Ci0gICAgICAgICAgICBuZXcgVkNhcmRDb21wb3NlcihuZXcgQ3VzdG9tTW9ja0NvbnRleHQobUV4cG9ydFRlc3RSZXNvbHZlciksIG1WQ2FyZFR5cGUpOwotICAgICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKG1MaW5lVmVyaWZpZXIpOwotICAgICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKG1WQ2FyZFZlcmlmaWVySW50ZXJuYWwpOwotICAgICAgICBpZiAoIWNvbXBvc2VyLmluaXQoVkNhcmRDb21wb3Nlci5DT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLCBudWxsLCBudWxsLCBudWxsKSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoImluaXQoKSBmYWlsZWQuIFJlYXNvbjogIiArIGNvbXBvc2VyLmdldEVycm9yUmVhc29uKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRGYWxzZShjb21wb3Nlci5pc0FmdGVyTGFzdCgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICghY29tcG9zZXIuaXNBZnRlckxhc3QoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QgPSBnZXRNb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zZXIuY3JlYXRlT25lRW50cnkoZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmMTBkYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogUHJldmlvdXNseSB1c2VkIGluIG1haW4gdkNhcmQgaGFuZGxpbmcgY29kZSBidXQgbm93IGV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgVk5hbWU7Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLQotICAgIC8qKiAwOnBhcnNlIG92ZXIuIDE6cGFyc2luZy4gKi8KLSAgICBwdWJsaWMgaW50IHBhcnNlU3RhdHVzID0gMTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YzMyNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuRGVjb2RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubmV0LlF1b3RlZFByaW50YWJsZUNvZGVjOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU3RvcmUgdGhlIHBhcnNlIHJlc3VsdCB0byBjdXN0b20gZGF0YXN0cnVjdDogVk5vZGUsIFByb3BlcnR5Tm9kZQotICogTWF5YmUgc2V2ZXJhbCB2Y2FyZCBpbnN0YW5jZSwgc28gdXNlIHZOb2RlTGlzdCB0byBzdG9yZS4KLSAqIFZOb2RlOiBzdGFuZHkgYnkgYSB2Y2FyZCBpbnN0YW5jZS4KLSAqIFByb3BlcnR5Tm9kZTogc3RhbmR5IGJ5IGEgcHJvcGVydHkgbGluZSBvZiBhIGNhcmQuCi0gKgotICogUHJldmlvdXNseSB1c2VkIGluIG1haW4gdkNhcmQgaGFuZGxpbmcgY29kZSBidXQgbm93IGV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGVCdWlsZGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIExPR19UQUcgPSAiVk5vZGVCdWlsZGVyIjsgCi0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlcmUncyBubyBvdGhlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUsIHRoaXMgY2xhc3MgdXNlcyB0aGlzIGNoYXJzZXQgZm9yIGVuY29kaW5nCi0gICAgICogYnl0ZSBhcnJheXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgVEFSR0VUX0NIQVJTRVQgPSAiVVRGLTgiOyAKLSAgICAKLSAgICAvKiogdHlwZT1WTm9kZSAqLwotICAgIHB1YmxpYyBMaXN0PFZOb2RlPiB2Tm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFZOb2RlPigpOwotICAgIHByaXZhdGUgaW50IG1Ob2RlTGlzdFBvcyA9IDA7Ci0gICAgcHJpdmF0ZSBWTm9kZSBtQ3VycmVudFZOb2RlOwotICAgIHByaXZhdGUgUHJvcGVydHlOb2RlIG1DdXJyZW50UHJvcE5vZGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRQYXJhbVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2ggVlBhcnNlciBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNvdXJjZUNoYXJzZXQ7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRDaGFyc2V0OwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICAKLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVCwgVEFSR0VUX0NIQVJTRVQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyBjaGFyc2V0LCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgdGhpcyhudWxsLCBjaGFyc2V0LCBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGhpZGUgc291cmNlQ2hhcnNldCBpcyB0ZW1wb3JhbC4gCi0gICAgICovCi0gICAgcHVibGljIFZOb2RlQnVpbGRlcihTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBzb3VyY2VDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRhcmdldENoYXJzZXQgPSB0YXJnZXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRhcmdldENoYXJzZXQgPSBUQVJHRVRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIC8vIE5vdGU6IEkgZ3Vlc3MgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgUmVjb3JkIG1heSBuZXN0IGxpa2UgdGhpczoKLSAgICAvLyBTVEFSVDpWUE9TCi0gICAgLy8gLi4uCi0gICAgLy8gU1RBUlQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUwotICAgIC8vCi0gICAgLy8gSG93ZXZlciB0aGUgZm9sbG93aW5nIGNvZGUgaGFzIGEgYnVnLgotICAgIC8vIFdoZW4gZXJyb3Igb2NjdXJzIGFmdGVyIGNhbGxpbmcgc3RhcnRSZWNvcmQoKSwgdGhlIGVudHJ5IHdoaWNoIGlzIHByb2JhYmx5Ci0gICAgLy8gdGhlIGNhdXNlIG9mIHRoZSBlcnJvciByZW1haW5zIHRvIGJlIGluIHZOb2RlTGlzdCwgd2hpbGUgZW5kUmVjb3JkKCkgaXMgbm90IGNhbGxlZC4KLSAgICAvLwotICAgIC8vIEkgbGVhdmUgdGhpcyBjb2RlIGFzIGlzIHNpbmNlIEknbSBub3QgZmFtaWxpYXIgd2l0aCB2Y2FsZW5kYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBCdXQgSSBiZWxpZXZlIHdlIHNob3VsZCByZWZhY3RvciB0aGlzIGNvZGUgaW4gdGhlIGZ1dHVyZS4KLSAgICAvLyBVbnRpbCB0aGlzLCB0aGUgbGFzdCBlbnRyeSBoYXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHNvbWUgZXJyb3Igb2NjdXJzLgotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIHZub2RlID0gbmV3IFZOb2RlKCk7Ci0gICAgICAgIHZub2RlLnBhcnNlU3RhdHVzID0gMTsKLSAgICAgICAgdm5vZGUuVk5hbWUgPSAiVkNBUkQiOwotICAgICAgICAvLyBJIGZlZWwgdGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlbmRSZWNvcmQoKSwgYnV0IGl0IGNhbm5vdCBiZSBkb25lIGJlY2F1c2Ugb2YKLSAgICAgICAgLy8gdGhlIHJlYXNvbiBhYm92ZS4KLSAgICAgICAgdk5vZGVMaXN0LmFkZCh2bm9kZSk7Ci0gICAgICAgIG1Ob2RlTGlzdFBvcyA9IHZOb2RlTGlzdC5zaXplKCkgLSAxOwotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBWTm9kZSBlbmROb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgICAgICBlbmROb2RlLnBhcnNlU3RhdHVzID0gMDsKLSAgICAgICAgd2hpbGUobU5vZGVMaXN0UG9zID4gMCl7Ci0gICAgICAgICAgICBtTm9kZUxpc3RQb3MtLTsKLSAgICAgICAgICAgIGlmKCh2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcykpLnBhcnNlU3RhdHVzID09IDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlID0gbmV3IFByb3BlcnR5Tm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFZOb2RlLnByb3BMaXN0LmFkZChtQ3VycmVudFByb3BOb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vIFVzZWQgb25seSBpbiBWQ2FyZC4KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BHcm91cFNldC5hZGQoZ3JvdXApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobUN1cnJlbnRQYXJhbVR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIG1DdXJyZW50UGFyYW1UeXBlLmVxdWFsc0lnbm9yZUNhc2UoIlRZUEUiKSkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcF9UWVBFLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwLnB1dChtQ3VycmVudFBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVN0cmluZyhTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtU291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZU9uZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQkFTRTY0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEuCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPQotICAgICAgICAgICAgICAgICAgICBCYXNlNjQuZGVjb2RlQmFzZTY0KHZhbHVlLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcXVvdGVkUHJpbnRhYmxlID0gdmFsdWUKLSAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiPSAiLCAiICIpLnJlcGxhY2VBbGwoIj1cdCIsICJcdCIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICAgICAgICAgIGlmIChtU3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaW5hbExpbmUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbExpbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChmaW5hbExpbmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBRdW90ZWRQcmludGFibGVDb2RlYy5kZWNvZGVRdW90ZWRQcmludGFibGUoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERlY29kZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZSBxdW90ZWQtcHJpbnRhYmxlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcodmFsdWUsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX2J5dGVzID0gbnVsbDsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgiIik7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwID0gbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKHBhcmFtTWFwLmdldEFzU3RyaW5nKCJDSEFSU0VUIikpOyAKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkVOQ09ESU5HIik7IAotICAgICAgICAKLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgPT0gbnVsbCB8fCB0YXJnZXRDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRhcmdldENoYXJzZXQgPSBtVGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCB0YXJnZXRDaGFyc2V0LCBlbmNvZGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcobUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpewotICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdHlwZUxpc3RCID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpc3RCLmFwcGVuZCh0eXBlKS5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0eXBlTGlzdEIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0eXBlTGlzdEIuY2hhckF0KGxlbiAtIDEpID09ICc7JykgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTGlzdEIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDM3MGFlNzguLmI4MmU2OTggMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQpAQCAtMTQ0LDQgKzE0NCw1MSBAQAogCiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBTZXR0aW5ncy5Cb29rbWFya3MuZ2V0SW50ZW50Rm9yU2hvcnRjdXQociwgJyonKSk7CiAgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQcm92aWRlckxpc3QoKSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgb3V0IHdoYXQgd2UgcHV0IGluLgorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICIiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHNlY29uZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdGhpcmQgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBmaXJzdCB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QxIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDIsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgbWlkZGxlIHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgbGFzdCB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKaW5kZXggOGU3ZTYzZS4uZmIwZjBjMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogLyoqCi0gKiBUZXN0cyBTdGF0aWNMYXlvdXQgYmlkaSBpbXBsZW1lbnRhdGlvbi4KKyAqIFF1aWNrIGNoZWNrIG9mIG5hdGl2ZSBiaWRpIGltcGxlbWVudGF0aW9uLgogICovCiBwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0QmlkaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCkBAIC00MSw3MyArNDEsNDcgQEAKICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhIHRlc3QiLCAiMDAwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMdHJSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAwMTExIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAwMTExIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMDAwIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UkFsbEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImEgdGVzdCIsICIwMDAwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfUiwgImEgdGVzdCIsICIyMjIyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJMdHJSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX1IsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDExMTEiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMjIyMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfTCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExSdGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleHBlY3RCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZExldmVscywgaW50IGV4cGVjdGVkRGlyKSB7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGludCBuID0gY2hzLmxlbmd0aDsKLSAgICAgICAgYnl0ZVtdIGNoSW5mbyA9IG5ldyBieXRlW25dOwotICAgICAgICAKLSAgICAgICAgaW50IHJlc3VsdERpciA9IFN0YXRpY0xheW91dC5iaWRpKGRpciwgY2hzLCBjaEluZm8sIG4sIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiaW5mbzoiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIikuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGNoSW5mb1tpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmkoIkJJREkiLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2hhcltdIHJlc3VsdExldmVsQ2hhcnMgPSBuZXcgY2hhcltuXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdExldmVsQ2hhcnNbaV0gPSAoY2hhcikoJzAnICsgY2hJbmZvW2ldKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcmVzdWx0TGV2ZWxzID0gbmV3IFN0cmluZyhyZXN1bHRMZXZlbENoYXJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXJlY3Rpb24iLCBleHBlY3RlZERpciwgcmVzdWx0RGlyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZXZlbHMiLCBleHBlY3RlZExldmVscywgcmVzdWx0TGV2ZWxzKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVCaWRpKCkgewotICAgICAgICAvLyBuYXRpdmUgYmlkaSByZXR1cm5zIGxldmVscywgbm90IHNpbXBseSBkaXJlY3Rpb25zCi0gICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMDAwMCIsIEwpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgZXhwZWN0TmF0aXZlQmlkaShpbnQgZGlyLCBTdHJpbmcgdGV4dCwgCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0VGVzdC5MYXlvdXRCdWlsZGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBTEVGID0gJ1x1MDVkMCc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zIGRpcnMoaW50IC4uLiBkaXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0aW9ucyhkaXJzKTsKKyAgICB9CisKKyAgICAvLyBjb25zdGFudHMgZnJvbSBMYXlvdXQgdGhhdCBhcmUgcGFja2FnZS1wcm90ZWN0ZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX0xFRlRfVE9fUklHSFQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDFfMSA9IDEgfCAoMSA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzEgPSAxIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMl8yID0gMiB8ICgyIDw8IFJVTl9MRVZFTF9TSElGVCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXh0cyA9IHsKKyAgICAgICAgIiIsCisgICAgICAgICIgIiwKKyAgICAgICAgImEiLAorICAgICAgICAiYTEiLAorICAgICAgICAiYUEiLAorICAgICAgICAiYTFiIiwKKyAgICAgICAgImExQSIsCisgICAgICAgICJhQTEiLAorICAgICAgICAiYUFiIiwKKyAgICAgICAgImFBMUIiLAorICAgICAgICAiYUExQjIiLAorCisgICAgICAgIC8vIHJ0bAorICAgICAgICAiQSIsCisgICAgICAgICJBMSIsCisgICAgICAgICJBYSIsCisgICAgICAgICJBMUIiLAorICAgICAgICAiQTFhIiwKKyAgICAgICAgIkFhMSIsCisgICAgICAgICJBYUIiCisgICAgfTsKKworICAgIC8vIEV4cGVjdGVkIGRpcmVjdGlvbnMgYXJlIGFuIGFycmF5IG9mIHN0YXJ0L2xlbmd0aCtsZXZlbCBwYWlycywKKyAgICAvLyBpbiB2aXN1YWwgb3JkZXIgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4uCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlyZWN0aW9uc1tdIGV4cGVjdGVkID0geworICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBkaXJzKDAsIDEsIDEsIExWTDFfMSksCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMiwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xLCAyLCAxKSwKKyAgICAgICAgZGlycygwLCAxLCAzLCBMVkwxXzEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCA0LCBMVkwyXzEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorCisgICAgICAgIC8vIHJ0bAorICAgICAgICBESVJTX0FMTF9SSUdIVF9UT19MRUZULAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8yKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBzZXVkb0JpZGlUb1JlYWwoU3RyaW5nIHNyYykgeworICAgICAgICBjaGFyW10gY2hhcnMgPSBzcmMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgY2hhciBjID0gY2hhcnNbal07CisgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRCcpIHsKKyAgICAgICAgICAgICAgICBjaGFyc1tqXSA9IChjaGFyKShBTEVGICsgYyAtICdBJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycywgMCwgY2hhcnMubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdGlvbnMoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxuIik7CisgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcihidWYpOworCisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0c1tpXSkpOworICAgICAgICAgICAgY2hlY2tEaXJlY3Rpb25zKGIuYnVpbGQoKSwgaSwgYi50ZXh0LCBleHBlY3RlZCwgZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgIGZhaWwoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFpbGluZ1doaXRlc3BhY2UoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiQWIgICBjIikpOworICAgICAgICBmbG9hdCB3aWR0aCA9IGIucGFpbnQubWVhc3VyZVRleHQoYi50ZXh0LCAwLCA1KTsgIC8vIGV4Y2x1ZGUgJ2MnCisgICAgICAgIGIuc2V0V2lkdGgoTWF0aC5yb3VuZCh3aWR0aCkpOworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaWYgKGwuZ2V0TGluZUNvdW50KCkgIT0gMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImV4cGVjdGVkIDIgbGluZXMsIGdvdDogIiArIGwuZ2V0TGluZUNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgRGlyZWN0aW9ucyBleHBlY3RlZCA9IGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIDMgfCAoMSA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKSk7CisgICAgICAgIGV4cGVjdERpcmVjdGlvbnMoInNwbGl0IGxpbmUiLCBleHBlY3RlZCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFRvUmlnaHRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgLy8gdmlzdWFsIGEyQjFBIHBvc2l0aW9ucyAwNDMyMQorICAgICAgICAvLyAwOiB8YTJCMUEsIHN0cm9uZyBpcyBzb2wsIGFmdGVyIC0+IDAKKyAgICAgICAgLy8gMTogYXwyQjFBLCBzdHJvbmcgaXMgYSwgYWZ0ZXIgLT4sIDEKKyAgICAgICAgLy8gMjogYTJ8QjFBLCBzdHJvbmcgaXMgQiwgYWZ0ZXIgLT4gNAorICAgICAgICAvLyAzOiBhMkJ8MUEsIHN0cm9uZyBpcyBCLCBiZWZvcmUgLT4gMworICAgICAgICAvLyA0OiBhMkIxfEEsIHN0cm9uZyBpcyBBLCBhZnRlciAtPiAyCisgICAgICAgIC8vIDU6IGEyQjFBfCwgc3Ryb25nIGlzIGVvbCwgYmVmb3JlIC0+IDUKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBleHBlY3RlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvUmlnaHRPZihuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IGV4cGVjdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib2Zmc2V0WyIgKyBpICsgIl0gdG8gcmlnaHQgb2Y6ICIgKyBuICsgIiBleHBlY3RlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSArICIgZ290OiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9MZWZ0T2YoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiYUExQjIiKSk7CisgICAgICAgIGludFtdIGV4cGVjdGVkID0geyAwLCAxLCA0LCAzLCAyLCA1IH07CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpbnQgbiA9IDU7CisgICAgICAgIGZvciAoaW50IGkgPSBleHBlY3RlZC5sZW5ndGggLSAxOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgIGludCB0ID0gbC5nZXRPZmZzZXRUb0xlZnRPZihuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IGV4cGVjdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib2Zmc2V0WyIgKyBpICsgIl0gdG8gbGVmdCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXRpbGl0eSwgbm90IHJlYWxseSBhIHRlc3QKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWFzdXJlVGV4dDEoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBTdHJpbmcgdGV4dCA9ICJBQkMiOyAvLyAiYWJBQiIKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwodGV4dCkpOworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKworICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgICAgIGludCBkaXIgPSAtMTsgLy8gTEVGVF9UT19SSUdIVAorICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBhbHQgPSB0cnVlOworICAgICAgICBkbyB7CisgICAgICAgICAgICBkaXIgPSAtZGlyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOworICAgICAgICAgICAgICAgIGZvciAoaW50IG9mZnNldCA9IDAsIGVuZCA9IGIudGV4dC5sZW5ndGgoKTsgb2Zmc2V0IDw9IGVuZDsgKytvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBMYXlvdXQubWVhc3VyZVRleHQoYi5wYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG9mZnNldCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgZGlyZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJCSURJIiwgImRpcjogIiArIGRpciArICIgdHJhaWw6ICIgKyB0cmFpbGluZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZmZzZXQ6ICIgKyBvZmZzZXQgKyAiIHdpZHRoOiAiICsgd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKCF0cmFpbGluZyk7CisgICAgICAgIH0gd2hpbGUgKGRpciA+IDApOworICAgIH0KKyAgICAqLworCisgICAgLy8gdXRpbGl0eSBmb3IgZGlzcGxheWluZyBhcnJheXMgaW4gaGV4CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhleEFycmF5KGludFtdIGFycmF5KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoJ3snKTsKKyAgICAgICAgZm9yIChpbnQgaSA6IGFycmF5KSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoaSkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXJlY3Rpb25zKExheW91dCBsLCBpbnQgaSwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBEaXJlY3Rpb25zW10gZXhwZWN0ZWREaXJzLCBGb3JtYXR0ZXIgZikgeworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZXhwZWN0ZWREaXJzW2ldOworICAgICAgICBEaXJlY3Rpb25zIHJlc3VsdCA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhleHBlY3RlZC5tRGlyZWN0aW9ucywgcmVzdWx0Lm1EaXJlY3Rpb25zKSkgeworICAgICAgICAgICAgZi5mb3JtYXQoIiVuWyUyZF0gJyVzJywgJXMgIT0gJXMiLCBpLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBoZXhBcnJheShleHBlY3RlZC5tRGlyZWN0aW9ucyksCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KHJlc3VsdC5tRGlyZWN0aW9ucykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdERpcmVjdGlvbnMoU3RyaW5nIG1zZywgRGlyZWN0aW9ucyBleHBlY3RlZCwgRGlyZWN0aW9ucyByZXN1bHQpIHsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZDogIiArIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSArCisgICAgICAgICAgICAgICAgICAgICIgZ290OiAiICsgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCmluZGV4IDFmNThhMmMuLmQ1NTRhNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgeworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIExheW91dEJ1aWxkZXIgYnVpbGRlcigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRCdWlsZGVyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGF5b3V0QnVpbGRlciB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgTGF5b3V0QnVpbGRlciB7CiAgICAgICAgIFN0cmluZyB0ZXh0ID0gIlRoaXMgaXMgYSB0ZXN0IjsKICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOyAvLyBkZWZhdWx0CiAgICAgICAgIGludCB3aWR0aCA9IDEwMDsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTJiMGQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIFV0aWxpdHkgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdmFyaW91cyBFeHBhbmRhYmxlIExpc3Qgc2NlbmFyaW9zLgotICogPHA+Ci0gKiBXQVJOSU5HOiBBIGxvdCBvZiB0aGUgZmVhdHVyZXMgYXJlIG1peGVkIGJldHdlZW4gTGlzdFZpZXcncyBleHBlY3RlZCBwb3NpdGlvbgotICogKGZsYXQgbGlzdCBwb3NpdGlvbikgYW5kIGFuIEV4cGFuZGFibGVMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uLiAgWW91IG11c3QgYWRkL2NoYW5nZQotICogZmVhdHVyZXMgYXMgeW91IG5lZWQgdGhlbS4KLSAqIAotICogQHNlZSBMaXN0U2NlbmFyaW8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gZXh0ZW5kcyBMaXN0U2NlbmFyaW8gewotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7IAotICAgIHByb3RlY3RlZCBMaXN0PE15R3JvdXA+IG1Hcm91cHM7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3RWaWV3IGNyZWF0ZUxpc3RWaWV3KCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVMaXN0Vmlldyh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHBhbmRhYmxlUGFyYW1zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QWRhcHRlcihMaXN0VmlldyBsaXN0VmlldykgewotICAgICAgICAoKEV4cGFuZGFibGVMaXN0VmlldykgbGlzdFZpZXcpLnNldEFkYXB0ZXIobUFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXlBZGFwdGVyKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIEV4cGFuZGFibGVQYXJhbXMgZXhwYW5kYWJsZVBhcmFtcyA9IChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXM7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBudW1DaGlsZHJlbiA9IGV4cGFuZGFibGVQYXJhbXMubU51bUNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgbUdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8TXlHcm91cD4obnVtQ2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbUdyb3Vwcy5hZGQobmV3IE15R3JvdXAobnVtQ2hpbGRyZW5baV0pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXhwYW5kYWJsZVBhcmFtcy5zdXBlclNldE51bUl0ZW1zKCk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5yZWFkQW5kVmFsaWRhdGVQYXJhbXMocGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEV4cGFuZGFibGVMaXN0VmlldyB3aWRnZXQuCi0gICAgICogQHJldHVybiBUaGUgbWFpbiB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0VmlldyBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiAoRXhwYW5kYWJsZUxpc3RWaWV3KSBzdXBlci5nZXRMaXN0VmlldygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwYW5kYWJsZVBhcmFtcyBleHRlbmRzIFBhcmFtcyB7Ci0gICAgICAgIHByaXZhdGUgaW50W10gbU51bUNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQHBhcmFtIG51bUNoaWxkcmVuUGVyR3JvdXAgVGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXROdW1DaGlsZHJlbihpbnRbXSBudW1DaGlsZHJlbikgewotICAgICAgICAgICAgbU51bUNoaWxkcmVuID0gbnVtQ2hpbGRyZW47Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgb24gdGhlIHN1cGVyY2xhc3MgYmFzZWQgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgKiBncm91cHMgYW5kIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgRXhwYW5kYWJsZVBhcmFtcyBzdXBlclNldE51bUl0ZW1zKCkgewotICAgICAgICAgICAgaW50IG51bUl0ZW1zID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1OdW1DaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1OdW1DaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyArPSBtTnVtQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdXBlci5zZXROdW1JdGVtcyhudW1JdGVtcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFBhcmFtcyBzZXROdW1JdGVtcyhpbnQgbnVtSXRlbXMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzZSBzZXROdW1Hcm91cHMgYW5kIHNldE51bUNoaWxkcmVuIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZG91YmxlIGZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKGZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRJdGVtU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgaXRlbVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoaXRlbVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1zRm9jdXNhYmxlKGJvb2xlYW4gaXRlbXNGb2N1c2FibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0SXRlbXNGb2N1c2FibGUoaXRlbXNGb2N1c2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE11c3RGaWxsU2NyZWVuKGJvb2xlYW4gZmlsbFNjcmVlbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRNdXN0RmlsbFNjcmVlbihmaWxsU2NyZWVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRQb3NpdGlvblNjcmVlblNpemVGYWN0b3JPdmVycmlkZShpbnQgcG9zaXRpb24sIGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRQb3NpdGlvblNjcmVlblNpemVGYWN0b3JPdmVycmlkZShwb3NpdGlvbiwgaXRlbVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRQb3NpdGlvblVuc2VsZWN0YWJsZShwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhY2tGcm9tQm90dG9tKGJvb2xlYW4gc3RhY2tGcm9tQm90dG9tKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFN0YWNrRnJvbUJvdHRvbShzdGFja0Zyb21Cb3R0b20pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oaW50IHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihzdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRDb25uZWN0QWRhcHRlcihib29sZWFuIGNvbm5lY3RBZGFwdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldENvbm5lY3RBZGFwdGVyKGNvbm5lY3RBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzdHJpbmcgZm9yIHRoZSB2YWx1ZSBvZiBzb21lIGl0ZW0uCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZUF0UG9zaXRpb24obG9uZyBwYWNrZWRQb3NpdGlvbikgewotICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4uZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5uYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIGEgcGFydGljdWxhciBwb3NpdGlvbiBpcyBvdXQgb2YgYm91bmRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcGFja2VkIHBvc2l0aW9uLgotICAgICAqIEByZXR1cm4gV2hldGhlciBpdCdzIG91dCBvZiBib3VuZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3V0T2ZCb3VuZHMobG9uZyBwYWNrZWRQb3NpdGlvbikgewotICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX05VTEwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhY2tlZFBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHBvc2l0aW9uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGdyb3VwID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgaWYgKGdyb3VwID49IG1Hcm91cHMuc2l6ZSgpIHx8IGdyb3VwIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgICAgIGlmIChjaGlsZCA+PSBtR3JvdXBzLmdldChncm91cCkuY2hpbGRyZW4uc2l6ZSgpIHx8IGNoaWxkIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgYSB2aWV3IGZvciB0aGUgcGFja2VkIHBvc2l0aW9uLCBwb3NzaWJseSByZXVzaW5nIHRoZSBjb252ZXJ0Vmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGdldCBhIHZpZXcgZm9yLgotICAgICAqIEBwYXJhbSBjb252ZXJ0VmlldyBPcHRpb25hbCB2aWV3IHRvIGNvbnZlcnQuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgZnV0dXJlIHBhcmVudC4KLSAgICAgKiBAcmV0dXJuIEEgdmlldy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZpZXcgZ2V0Vmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIGlmIChpc091dE9mQm91bmRzKHBhY2tlZFBvc2l0aW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicG9zaXRpb24gb3V0IG9mIHJhbmdlIGZvciBhZGFwdGVyISIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZWx2ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGZpbmFsIGludCBmbFBvcyA9IGVsdi5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgIAotICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgKChUZXh0VmlldykgY29udmVydFZpZXcpLnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBjb252ZXJ0Vmlldy5zZXRJZChmbFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydFZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGVzaXJlZEhlaWdodCA9IGdldEhlaWdodEZvclBvc2l0aW9uKGZsUG9zKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVZpZXcocGFja2VkUG9zaXRpb24sIGZsUG9zLCBwYXJlbnQsIGRlc2lyZWRIZWlnaHQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB2aWV3IGZvciBhIGdyb3VwIG9yIGNoaWxkIHBvc2l0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcGFja2VkIHBvc2l0aW9uIChoYXMgdHlwZSwgZ3JvdXAgcG9zLCBhbmQgb3B0aW9uYWxseSBjaGlsZCBwb3MpLgotICAgICAqIEBwYXJhbSBmbFBvcyBUaGUgZmxhdCBsaXN0IHBvc2l0aW9uICh0aGUgcG9zaXRpb24gdGhhdCB0aGUgTGlzdFZpZXcgZ29lcyBieSkuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHZpZXcuCi0gICAgICogQHBhcmFtIGRlc2lyZWRIZWlnaHQgVGhlIGRlc2lyZWQgaGVpZ2h0LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3IGNyZWF0ZVZpZXcobG9uZyBwYWNrZWRQb3NpdGlvbiwgaW50IGZsUG9zLCBWaWV3R3JvdXAgcGFyZW50LCBpbnQgZGVzaXJlZEhlaWdodCkgewotICAgICAgICBUZXh0VmlldyByZXN1bHQgPSBuZXcgVGV4dFZpZXcocGFyZW50LmdldENvbnRleHQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRIZWlnaHQoZGVzaXJlZEhlaWdodCk7Ci0gICAgICAgIHJlc3VsdC5zZXRUZXh0KGdldFZhbHVlQXRQb3NpdGlvbihwYWNrZWRQb3NpdGlvbikpOwotICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIHJlc3VsdC5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICByZXN1bHQuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgIHJlc3VsdC5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgcmVzdWx0LnNldElkKGZsUG9zKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdyb3VwIGluZGV4IGNvbnRhaW5pbmcgZWl0aGVyIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb3IgYXQKLSAgICAgKiBsZWFzdCBvbmUgY2hpbGQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bUNoaWxkcmVuIFRoZSBncm91cCBtdXN0IGhhdmUgdGhpcyBhbW91bnQsIG9yIC0xIGlmIHVzaW5nCi0gICAgICogICAgICAgICAgICBhdExlYXN0T25lQ2hpbGQuCi0gICAgICogQHBhcmFtIGF0TGVhc3RPbmVDaGlsZCBUaGUgZ3JvdXAgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGlsZCwgb3IgZmFsc2UKLSAgICAgKiAgICAgICAgICAgIGlmIHVzaW5nIG51bUNoaWxkcmVuLgotICAgICAqIEByZXR1cm4gQSBncm91cCBpbmRleCB3aXRoIHRoZSByZXF1aXJlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBmaW5kR3JvdXBXaXRoTnVtQ2hpbGRyZW4oaW50IG51bUNoaWxkcmVuLCBib29sZWFuIGF0TGVhc3RPbmVDaGlsZCkgewotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IGFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjdXJOdW1DaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG51bUNoaWxkcmVuID09IGN1ck51bUNoaWxkcmVuIHx8IGF0TGVhc3RPbmVDaGlsZCAmJiBjdXJOdW1DaGlsZHJlbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxNeUdyb3VwPiBnZXRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiBtR3JvdXBzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgZXhwYW5kYWJsZSBsaXN0IGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIE15QWRhcHRlciBleHRlbmRzIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENoaWxkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXRQb3NpdGlvbihFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmNoaWxkcmVuLmdldChjaGlsZFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5Db3VudChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldENoaWxkVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24sIGJvb2xlYW4gaXNMYXN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFZpZXcoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQb3NpdGlvbiksIGNvbnZlcnRWaWV3LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXRQb3NpdGlvbihFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRHcm91cElkKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cFBvc2l0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoaWxkU2VsZWN0YWJsZShpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUdyb3VwIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtTmV4dElkID0gMTAwMDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBsb25nIGlkID0gbU5leHRJZCsrOwotICAgICAgICBMaXN0PE15Q2hpbGQ+IGNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE15R3JvdXAoaW50IG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBuYW1lID0gIkdyb3VwICIgKyBpZDsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxNeUNoaWxkPihudW1DaGlsZHJlbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQobmV3IE15Q2hpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNoaWxkIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtTmV4dElkID0gMjAwMDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBsb25nIGlkID0gbU5leHRJZCsrOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE15Q2hpbGQoKSB7Ci0gICAgICAgICAgICBuYW1lID0gIkNoaWxkICIgKyBpZDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0KFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgaW5pdCgoRXhwYW5kYWJsZVBhcmFtcykgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIExpc3RTY2VuYXJpbyNpbml0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQppbmRleCBiOTBjOTdiLi5hYWQzZmUxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKQEAgLTY4LDYgKzY4LDEzIEBACiAgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS1mc3F1MDBhLnhuLS0wendtNTZkIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKIAorICAgICAgICAvLyBVcmwgZm9yIHRlc3RpbmcgdG9wIGxldmVsIEFyYWJpYyBjb3VudHJ5IGNvZGUgZG9tYWluIGluIFB1bnljb2RlOgorICAgICAgICAvLyAgIGh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigieG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgVVJMLgogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8vXHVENjA0XHVBRTA4XHVDNjAxXHVDMjE4XHVDOTlELmtyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigibWFpbC5leGFtcGxlLmNvbSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKLSAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOworICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBkb21haW4iLCB0KTsKIAogICAgICAgICAvLyBJbnRlcm5hdGlvbmFsaXplZCBkb21haW5zLgpAQCAtMTE4LDYgKzEyNSwxNCBAQAogCiAgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJfXysmNDIueGVyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRGYWxzZSgiSW52YWxpZCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBPYnNvbGV0ZSBkb21haW4gLnl1CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ0ZXN0Lnl1IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRGYWxzZSgiT2Jzb2xldGUgY291bnRyeSBjb2RlIHRvcCBsZXZlbCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBUZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYyIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNiNTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLk15R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFNpbXBsZT4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBtQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0U2ltcGxlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IG1BY3Rpdml0eS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGV4cGFuZEdyb3VwKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gbUFjdGl2aXR5LmZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihudW1DaGlsZHJlbiwgYXRMZWFzdE9uZUNoaWxkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZ3JvdXAgdG8gZXhwYW5kIiwgZ3JvdXBQb3MgPj0gMCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ3JvdXBQb3MpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwUG9zOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEdyb3VwKCkgewotICAgICAgICBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbGxhcHNlR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGRpZCBub3QgY29sbGFwc2UiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRlZEdyb3VwTW92ZW1lbnQoKSB7Ci0gICAgICAgIC8vIEV4cGFuZCB0aGUgZmlyc3QgZ3JvdXAKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGF0J3MgYWxsIGdvb2QKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgYSBjb2xsYXBzZWQgZ3JvdXAgaW4gZnJvbnQgb2YgdGhlIG9uZSBqdXN0IGV4cGFuZGVkCi0gICAgICAgIExpc3Q8TXlHcm91cD4gZ3JvdXBzID0gbUFjdGl2aXR5LmdldEdyb3VwcygpOwotICAgICAgICBNeUdyb3VwIGluc2VydGVkR3JvdXAgPSBuZXcgTXlHcm91cCgxKTsKLSAgICAgICAgZ3JvdXBzLmFkZCgwLCBpbnNlcnRlZEdyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGlmeSBkYXRhIGNoYW5nZQotICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBhZGFwdGVyIiwKLSAgICAgICAgICAgICAgICBtQWRhcHRlciBpbnN0YW5jZW9mIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpOwotICAgICAgICBmaW5hbCBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSAoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXI7Ci0gICAgIAotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJpZ2h0IGdyb3VwIGlzIGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBleHBhbmRlZCBzdGF0ZSBkaWRuJ3Qgc3RheSB3aXRoIHRoZSBwcm9wZXIgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBleHBhbmRlZCBzdGF0ZSB3YXMgZ2l2ZW4gdG8gdGhlIGluc2VydGVkIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiMjhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RTaW1wbGUgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOVU1fQ0hJTERSRU4gPSB7NCwgMywgMiwgMSwgMH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXROdW1DaGlsZHJlbihOVU1fQ0hJTERSRU4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0KLSAgICAgICAgbWVudS5hZGQoIkFkZCBpdGVtIikuc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBzLmFkZCgwLCBuZXcgTXlHcm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgKChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcikubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjEwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0VGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgZmluYWwgTGlzdFV0aWwgbUxpc3RVdGlsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RUZXN0ZXIoCi0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3LAotICAgICAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgICAgICBhY3Rpdml0eUluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZXhwYW5kYWJsZUxpc3RWaWV3OwotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRHcm91cChmaW5hbCBpbnQgZ3JvdXBJbmRleCwgaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgLmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihmbGF0UG9zaXRpb24pOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kICIgKyBncm91cEluZGV4LCAKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICAvLyBBZGQgYSBwb3NpdGlvbiB0ZXN0ZXIgQ29udGV4dE1lbnUgbGlzdGVuZXIgdG8gdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lcigpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBoZWFkZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGhlYWRlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEV4cGFuZCBncm91cAotICAgICAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgaW5kZXgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RHcm91cENvbnRleHRNZW51KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGdyb3VwQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChncm91cENoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNoaWxkIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdENoaWxkQ29udGV4dE1lbnUoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBmb290ZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGZvb3RlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHRoZSBsaXN0ZW5lciB3ZSBhZGRlZC4KLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kQUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBncm91cHMiLCBncm91cEluZGV4IDwgbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpKTsKLSAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgZ3JvdXBJbmRleCArIGhlYWRlckNvdW50KTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxoZWFkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGFsbCAobm9uIGV4cGFuZGVkKSBncm91cHMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXg7Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIG5vdCBmb3VuZCBhdCBmbGF0IHBvc2l0aW9uICIgKyBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGFja2VkUG9zaXRpb25Gb3JHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGdyb3VwICIgKyBncm91cEluZGV4LAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uRm9yR3JvdXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihoZWFkZXJDb3VudCArIGdyb3VwQ291bnQgKyBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBsb25nIGNoaWxkUG9zID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihjaGlsZFBvcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVhZGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gb24gZ3JvdXAgaXRlbXMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9vdGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBjaGlsZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGNoaWxkRmxhdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTFjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNOdW1DaGlsZHJlbiA9IHsxLCA0LCAzLCAyLCA2fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc051bU9mSGVhZGVyc0FuZEZvb3RlcnMgPSAxMjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXRTdGFja0Zyb21Cb3R0b20oZmFsc2UpCi0gICAgICAgICAgICAgICAgLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oLTEpCi0gICAgICAgICAgICAgICAgLnNldE51bUNoaWxkcmVuKHNOdW1DaGlsZHJlbikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdEFkYXB0ZXIoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5zZXRJdGVtc0NhbkZvY3VzKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGhlYWRlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBoZWFkZXIuc2V0VGV4dCgiSGVhZGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEhlYWRlclZpZXcoaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGZvb3RlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBmb290ZXIuc2V0VGV4dCgiRm9vdGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEZvb3RlclZpZXcoZm9vdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IGFkYXB0ZXIgaGVyZSBBRlRFUiB3ZSBzZXQgaGVhZGVyIGFuZCBmb290ZXIgdmlld3MKLSAgICAgICAgc2V0QWRhcHRlcihleHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVycyAoYW5kIHRoZSBzYW1lIG51bWJlciBvZiBmb290ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGEwZmZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QgZXh0ZW5kcwotICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdFBvc2l0aW9uKCkgewotICAgICAgICAvLyBTaG91bGQgYmUgYSBoZWFkZXIsIGFuZCBoZW5jZSB0aGUgZmlyc3QgZ3JvdXAgc2hvdWxkIE5PVCBoYXZlIGV4cGFuZGVkCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0R3JvdXAoKSB7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihnZXRBY3Rpdml0eSgpLmdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotcHVibGljIGNsYXNzIEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuaW5mbGF0ZWRfZXhwYW5kYWJsZWxpc3R2aWV3KTsKLSAgICAgICAgCi0gICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSAoRXhwYW5kYWJsZUxpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbHYpOwotICAgICAgICBlbHYuc2V0QWRhcHRlcihuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIC8vIFNhbXBsZSBkYXRhIHNldC4gIGNoaWxkcmVuW2ldIGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAoU3RyaW5nW10pIGZvciBncm91cHNbaV0uCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ3JvdXBzID0geyAiUGVvcGxlIE5hbWVzIiwgIkRvZyBOYW1lcyIsICJDYXQgTmFtZXMiLCAiRmlzaCBOYW1lcyIgfTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXVtdIGNoaWxkcmVuID0gewotICAgICAgICAgICAgICAgIHsgIkFybm9sZCIsICJCYXJyeSIsICJDaHVjayIsICJEYXZpZCIgfSwKLSAgICAgICAgICAgICAgICB7ICJBY2UiLCAiQmFuZGl0IiwgIkNoYS1DaGEiLCAiRGV1Y2UiIH0sCi0gICAgICAgICAgICAgICAgeyAiRmx1ZmZ5IiwgIlNudWdnbGVzIiB9LAotICAgICAgICAgICAgICAgIHsgIkdvbGR5IiwgIkJ1YmJsZXMiIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl1bY2hpbGRQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZ2V0R2VuZXJpY1ZpZXcoKSB7Ci0gICAgICAgICAgICAvLyBMYXlvdXQgcGFyYW1ldGVycyBmb3IgdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDY0KTsKLQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcudGhpcyk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSB0ZXh0IHZlcnRpY2FsbHkKLSAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldENoaWxkKGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc1tncm91cFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldEdyb3VwKGdyb3VwUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbzsKLQotcHVibGljIGNsYXNzIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uOwotCi0gICAgLy8gRmFrZSBjb25zdGFudCB0byBzdG9yZSBpbiB0ZXN0VHlwZSBhIHRlc3QgdHlwZSBzcGVjaWZpYyB0byBoZWFkZXJzIGFuZCBmb290ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfVFlQRSA9IC0xOwotICAgIHByaXZhdGUgaW50IHRlc3RUeXBlOyAvLyBhcyByZXR1cm5lZCBieSBnZXRQYWNrZWRQb3NpdGlvblR5cGUKLQotICAgIC8vIFdpbGwgYmUgc2V0IHRvIG51bGwgYnkgZWFjaCBjYWxsIHRvIG9uQ3JlYXRlQ29udGV4dE1lbnUsIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC4gCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R3JvdXBDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDaGlsZENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0aGlzLmNoaWxkUG9zaXRpb24gPSBjaGlsZFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBmbGF0UG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gQURBUFRFUl9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlc3RUeXBlID09IEFEQVBURVJfVFlQRSkgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkYXB0ZXJDb250ZXh0TWVudUluZm8gYWRhcHRlckNvbnRleHRNZW51SW5mbyA9IChBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGZsYXQgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBhZGFwdGVyQ29udGV4dE1lbnVJbmZvLnBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8gZWx2TWVudUluZm8gPQotICAgICAgICAgICAgICAgIChFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbiA9IGVsdk1lbnVJbmZvLnBhY2tlZFBvc2l0aW9uOwotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25UeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBwYWNrZWQgcG9zaXRpb24gdHlwZSIsIHRlc3RUeXBlLCBwYWNrZWRQb3NpdGlvblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25Hcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGdyb3VwIHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25Hcm91cCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZXN0VHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25DaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBjaGlsZCBwb3NpdGlvbiIsIGNoaWxkUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UgKyAiICglZCB2cyAlZCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKCF2YWx1ZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCA5MWNiZTJmLi4xOWM5ZDI2IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTEyNCw3ICsxMjQsMTEgQEAKICAgICAgICAgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9IG5ldyBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcigKICAgICAgICAgICAgICAgICBwa2dOYW1lLCBtRGV2aWNlKTsKICAgICAgICAgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyKCk7Ci0gICAgICAgIHRlc3RSdW5uZXIucnVuKGxpc3RlbmVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RSdW5uZXIucnVuKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiZW5jb3VudGVyZWQgSU9FeGNlcHRpb24gIiArIGlvZSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCmluZGV4IDczMjJlNmMuLjBlNWRmOGMgMTAwNjQ0Ci0tLSBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAorKysgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKQEAgLTU4LDYgKzU4LDEwIEBACiAgICAgICAgIDxncm91cCBnaWQ9InNkY2FyZF9ydyIgLz4KICAgICA8L3Blcm1pc3Npb24+CiAKKyAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VTQiIgPgorICAgICAgICA8Z3JvdXAgZ2lkPSJ1c2IiIC8+CisgICAgPC9wZXJtaXNzaW9uPgorCiAgICAgPCEtLSBUaGUgZ3JvdXAgdGhhdCAvY2FjaGUgYmVsb25ncyB0bywgbGlua2VkIHRvIHRoZSBwZXJtaXNzaW9uCiAgICAgICAgICBzZXQgb24gdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBhY2Nlc3MgL2NhY2hlIC0tPgogICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ0FDSEVfRklMRVNZU1RFTSIgPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKaW5kZXggNDZiYTc2OS4uOWFjZTFjYiAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCkBAIC0yMyw5ICsyMyw5IEBACiAgICAgICAgIDxsaT4KICAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvYT4KLSAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPgorICAgICAgICA8L2xpPgogICAgICAgPC9vbD4KICAgICA8L2xpPgogICAgIDxsaT4KQEAgLTY0LDcgKzY0LDggQEAKICAgPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgpAQCAtNzMsMTAgKzc0LDEyIEBACiAgIDxoMj5TZWUgQWxzbzwvaDI+CiAgICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogICA8L2Rpdj4KQEAgLTExOCw0NSArMTIxLDU1IEBACiBpbiB0aGUgc2FtZSBwcm9jZXNzLiA8L3A+CiAKIDxwPllvdXIgdGVzdCBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgbWVhbnMgb2YgYW4KLTxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPjxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4KLWVsZW1lbnQgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudAotc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIHRlbGwgQW5kcm9pZCBob3cKLXRvIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSW5zdHJ1bWVudGF0aW9uIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUKLXNlY3Rpb24gPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0Ci1SdW5uZXI8L2E+LjwvcD4KKyAgICA8YQorICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9pbnN0cnVtZW50YXRpb24tZWxlbWVudC5odG1sIj4KKyAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIAorICAgICAgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIAorICAgICAgdGVsbCBBbmRyb2lkIGhvdyB0byBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24uIEluc3RydW1lbnRhdGlvbiBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgCisgICAgICBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPi4KKzwvcD4KIAogPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHN1bW1hcml6ZXMgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudDo8L3A+CiAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmciLz4KIAotPHA+SW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQotd3JpdGUgdGhlbSBpbiBtdWNoIHRoZSBzYW1lIHdheSBhcyB0aGUgYXBwbGljYXRpb24geW91IGFyZSB0ZXN0aW5nLiBUaGUgU0RLCi10b29scyBoZWxwIHlvdSBjcmVhdGUgYSBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kIGl0cyB0ZXN0IHByb2plY3QgYXQgdGhlIHNhbWUKLXRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAotbGluZS4gRWNsaXBzZSB3aXRoIEFEVCBwcm92aWRlcyBhbiBleHRlbnNpdmUgc2V0IG9mIHRvb2xzIGZvciBjcmVhdGluZyB0ZXN0cywKLXJ1bm5pbmcgdGhlbSwgYW5kIHZpZXdpbmcgdGhlaXIgcmVzdWx0cy4gWW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+YWRiPC9jb2RlPgotdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuPC9wPgorPHA+CisgICAgSW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQorICAgIHdyaXRlIHRoZW0gaW4gbXVjaCB0aGUgc2FtZSB3YXkgYXMgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgdGVzdGluZy4gVGhlIFNESworICAgIHRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQorICAgIHRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAorICAgIGxpbmUuIEVjbGlwc2Ugd2l0aCBBRFQgcHJvdmlkZXMgYW4gZXh0ZW5zaXZlIHNldCBvZiB0b29scyBmb3IgY3JlYXRpbmcgdGVzdHMsCisgICAgcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+CisgICAgdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuCis8L3A+CiAKLTxwPlRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KLUVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotSURFczwvYT4uPC9wPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCis8L3A+CiAKLTxwPklmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSBvbmUgb2YgdGhlCi10ZXN0aW5nIHR1dG9yaWFsczo8L3A+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgb25lIG9mIHRoZQorICAgIHRlc3RpbmcgdHV0b3JpYWxzOgorPC9wPgogCiA8dWw+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCi1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCi1jb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5Ci1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KLUl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCi1tb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi48L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgogPC91bD4KIAogPGgyIGlkPSJUZXN0QVBJIj5UaGUgVGVzdGluZyBBUEk8L2gyPgpAQCAtMTY2LDEyMCArMTc5LDE1NiBAQAogICAgIGEgcG93ZXJmdWwgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgeW91ciB0ZXN0cyBhY2Nlc3MgdGhlIHN0YXRlIGFuZCBydW50aW1lIG9iamVjdHMKICAgICBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdHMuCiA8L3A+Ci08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgdGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIHRlc3RpbmcgQVBJIGF2YWlsYWJsZSBpbiBBbmRyb2lkLjwvcD4KKzxwPgorICAgIFRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuCis8L3A+CiA8aDMgaWQ9IkV4dGVuc2lvbnMiPkpVbml0IHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICBTb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSB0ZXN0aW5nIEFQSSBleHRlbmQgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGJ1dCBkbyBub3QgdXNlIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLiBUaGVzZSBjbGFzc2VzCi0gIGNvbnRhaW4gbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgdGhlIENvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdpdGggdGhpcyBDb250ZXh0LCB5b3UgY2FuIGxvb2sgYXQgaXRzIHJlc291cmNlcywgZmlsZXMsIGRhdGFiYXNlcywKLSAgYW5kIHNvIGZvcnRoLiBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sIGJ1dCB5b3UgdXN1YWxseSB1c2UgYSBzdWJjbGFzcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGNvbXBvbmVudC4KKyAgU29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgdGVzdGluZyBBUEkgZXh0ZW5kIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSAKKyAgYnV0IGRvIG5vdCB1c2UgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFRoZXNlIGNsYXNzZXMgY29udGFpbiBtZXRob2RzIGZvciBhY2Nlc3Npbmcgc3lzdGVtIAorICBvYmplY3RzIHN1Y2ggYXMgdGhlIENvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdpdGggdGhpcyBDb250ZXh0LCB5b3UgY2FuIGxvb2sgYXQgaXRzIAorICByZXNvdXJjZXMsIGZpbGVzLCBkYXRhYmFzZXMsIGFuZCBzbyBmb3J0aC4gVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LAorICBidXQgeW91IHVzdWFsbHkgdXNlIGEgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQuCiA8cD4KICAgVGhlIHN1YmNsYXNzZXMgYXJlOgogPC9wPgogICA8dWw+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiBJdCBhbGxvd3MgeW91IHRvIGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwKLSAgICAgIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiAKKyAgICAgIEl0IGFsbG93cyB5b3UgdG8gaW5qZWN0IGEgbW9jayBDb250ZXh0IGludG8gdGhlIGFwcGxpY2F0aW9uLCBzZXQgdXAgaW5pdGlhbCB0ZXN0IHBhcmFtZXRlcnMgCisgICAgICBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgCisgICAgICBpcyBkZXN0cm95ZWQuCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSAtIEEgY2xhc3MgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBTaW5jZSBpdCBpcyByZXN0cmljdGVkIHRvIHVzaW5nIGEKLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSBmb3IgdGhlIHByb3ZpZGVyLCBhbmQgaXQgaW5qZWN0cyBhbiB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0sIHlvdXIgcHJvdmlkZXIgdGVzdGluZyBpcyBpc29sYXRlZAorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gLSBBIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIAorICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBTaW5jZSBpdCBpcyByZXN0cmljdGVkIHRvIHVzaW5nIGEKKyAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gZm9yIHRoZSBwcm92aWRlciwgYW5kIGl0IGluamVjdHMgYW4gCisgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCB5b3VyIHByb3ZpZGVyIHRlc3RpbmcgaXMgaXNvbGF0ZWQKICAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIE9TLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IC0gYSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yCi0gICAgICBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgbGV0IEFuZHJvaWQgcHJvdmlkZSB5b3UgYSBmdWxsIENvbnRleHQgYW5kIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gLSBhIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIAorICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBZb3UgY2FuIGluamVjdCBhIG1vY2sgQ29udGV4dCBvciBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgCisgICAgICBsZXQgQW5kcm9pZCBwcm92aWRlIHlvdSBhIGZ1bGwgQ29udGV4dCBhbmQgYSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufS4KICAgICA8L2xpPgogICA8L3VsPgogPGgzIGlkPSJJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbiB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+CiA8cD4KLSAgVGhlIEFQSSBmb3IgdGVzdGluZyBhY3Rpdml0aWVzIGV4dGVuZHMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzIGFuZCBhbHNvIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFdpdGggaW5zdHJ1bWVudGF0aW9uLAotICBBbmRyb2lkIGNhbiBhdXRvbWF0ZSBVSSB0ZXN0aW5nIGJ5IHNlbmRpbmcgZXZlbnRzIHRvIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBwcmVjaXNlbHkgY29udHJvbCB0aGUgc3RhcnQgb2YgYW4gYWN0aXZpdHksIGFuZCBtb25pdG9yIHRoZSBzdGF0ZSBvZiB0aGUKLSAgYWN0aXZpdHkgZHVyaW5nIGl0cyBsaWZlIGN5Y2xlLgorICBUaGUgQVBJIGZvciB0ZXN0aW5nIGFjdGl2aXRpZXMgZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgCisgIGFuZCBhbHNvIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFdpdGggaW5zdHJ1bWVudGF0aW9uLCBBbmRyb2lkIGNhbiBhdXRvbWF0ZSBVSSAKKyAgdGVzdGluZyBieSBzZW5kaW5nIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcHJlY2lzZWx5IGNvbnRyb2wgdGhlIHN0YXJ0IG9mIGFuIAorICBhY3Rpdml0eSwgYW5kIG1vbml0b3IgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpdml0eSBkdXJpbmcgaXRzIGxpZmUgY3ljbGUuCiA8L3A+CiA8cD4KLSAgVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uIEFsbCBvZiBpdHMgc3ViY2xhc3NlcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgotICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgorICBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfS4gQWxsIG9mIGl0cyBzdWJjbGFzc2VzIGhhdmUgCisgIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgorICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4gVGhlIHN1YmNsYXNzZXMgYXJlOgogPC9wPgogICA8dWw+CiAgICAgPGxpPgogICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVRlc3RDYXNlfSAtIEEgYmFzZSBjbGFzcyBmb3IgYWN0aXZpdHkgdGVzdCBjbGFzc2VzLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfSAtIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkuCi0gICAgICBJdCBpbnZva2VzIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBhbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkKLSAgICAgIG9uY2UsIGluc3RlYWQgb2Ygb25jZSBwZXIgbWV0aG9kIGNhbGwuIFVzZSBpdCB3aGVuIGFsbCBvZiB5b3VyIHRlc3QgbWV0aG9kcyBydW4gYWdhaW5zdCB0aGUgc2FtZSBhY3Rpdml0eS4KKyAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciAKKyAgICAgIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkuIEl0IGludm9rZXMge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9IGFuZCAKKyAgICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBvbmx5IG9uY2UsIGluc3RlYWQgb2Ygb25jZSBwZXIgCisgICAgICBtZXRob2QgY2FsbC4gVXNlIGl0IHdoZW4gYWxsIG9mIHlvdXIgdGVzdCBtZXRob2RzIHJ1biBhZ2FpbnN0IHRoZSBzYW1lIGFjdGl2aXR5LgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TeW5jQmFzZUluc3RydW1lbnRhdGlvbn0gLSBBIGNsYXNzIHRoYXQgdGVzdHMgc3luY2hyb25pemF0aW9uIG9mIGEgY29udGVudCBwcm92aWRlci4gSXQgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gY2FuY2VsIGFuZCBkaXNhYmxlCi0gICAgICBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIGJlZm9yZSBzdGFydGluZyB0aGUgdGVzdCBzeW5jaHJvbml6YXRpb24uCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSAKKyAgICAgIGNvbnRlbnQgcHJvdmlkZXIuIEl0IHVzZXMgaW5zdHJ1bWVudGF0aW9uIHRvIGNhbmNlbCBhbmQgZGlzYWJsZSBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIAorICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IC0gVGhpcyBjbGFzcyBkb2VzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYSBzaW5nbGUgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgotICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgotICAgICAgPHA+IFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuPC9wPgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gLSBUaGlzIGNsYXNzIGRvZXMgYW4gaXNvbGF0ZWQgdGVzdCBvZiBhIHNpbmdsZSAKKyAgICAgIGFjdGl2aXR5LiBXaXRoIGl0LCB5b3UgY2FuIGluamVjdCBhIG1vY2sgY29udGV4dCBvciBhcHBsaWNhdGlvbiwgb3IgYm90aC4KKyAgICAgIEl0IGlzIGludGVuZGVkIGZvciBkb2luZyB1bml0IHRlc3RzIG9mIGFuIGFjdGl2aXR5LCBhbmQgaXMgdGhlIGFjdGl2aXR5IGVxdWl2YWxlbnQgb2YgdGhlIAorICAgICAgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgorICAgICAgPHA+CisgICAgICAgIFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuCisgICAgICA8L3A+CiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSAtIFRoaXMgY2xhc3MgdGVzdHMgYSBzaW5nbGUgYWN0aXZpdHkgd2l0aGluIHRoZSBub3JtYWwgc3lzdGVtIGVudmlyb25tZW50LgotICAgICAgWW91IGNhbm5vdCBpbmplY3QgYSBtb2NrIENvbnRleHQsIGJ1dCB5b3UgY2FuIGluamVjdCBtb2NrIEludGVudHMuIEFsc28sIHlvdSBjYW4gcnVuIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCAodGhlIG1haW4gdGhyZWFkIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSwKLSAgICAgIHdoaWNoIGFsbG93cyB5b3UgdG8gc2VuZCBrZXkgYW5kIHRvdWNoIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gVUkuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IC0gVGhpcyBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSAKKyAgICAgICAgd2l0aGluIHRoZSBub3JtYWwgc3lzdGVtIGVudmlyb25tZW50LiBZb3UgY2Fubm90IGluamVjdCBhIG1vY2sgQ29udGV4dCwgYnV0IHlvdSBjYW4gaW5qZWN0IAorICAgICAgICBtb2NrIEludGVudHMuIEFsc28sIHlvdSBjYW4gcnVuIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCAodGhlIG1haW4gdGhyZWFkIG9mIHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCksIHdoaWNoIGFsbG93cyB5b3UgdG8gc2VuZCBrZXkgYW5kIHRvdWNoIGV2ZW50cyB0byB0aGUgCisgICAgICAgIGFwcGxpY2F0aW9uIFVJLgogICAgIDwvbGk+CiAgIDwvdWw+CiA8aDMgaWQ9IkFzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2gzPgogPHA+Ci0gIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgPGNvZGU+YXNzZXJ0KCk8L2NvZGU+IGNhbGxzIGluIHRlc3RzLgotICBUaGVyZSBhcmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcywge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgorICBBbmRyb2lkIGFsc28gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IGNsYXNzIHRoYXQgaXMgdGhlIGJhc2lzIG9mIAorICA8Y29kZT5hc3NlcnQoKTwvY29kZT4gY2FsbHMgaW4gdGVzdHMuIFRoZXJlIGFyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGlzIGNsYXNzLCAKKyAge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgogPC9wPgogPHVsPgogICA8bGk+Ci0gICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCisgICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCiAgIDwvbGk+CiAgIDxsaT4KLSAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSBwYXJ0aWN1bGFyIFggYW5kIFkKLSAgICBwb3NpdGlvbiBvbiB0aGUgdmlzaWJsZSBzY3JlZW4uIFRoZXNlIGFzc2VydHMgc2ltcGxpZnkgdGVzdGluZyBvZiBnZW9tZXRyeSBhbmQgYWxpZ25tZW50IGluIHRoZSBVSS4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgCisgICAgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSAKKyAgICBwYXJ0aWN1bGFyIFggYW5kIFkgcG9zaXRpb24gb24gdGhlIHZpc2libGUgc2NyZWVuLiBUaGVzZSBhc3NlcnRzIHNpbXBsaWZ5IHRlc3Rpbmcgb2YgZ2VvbWV0cnkgCisgICAgYW5kIGFsaWdubWVudCBpbiB0aGUgVUkuCiAgIDwvbGk+CiA8L3VsPgogPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+CiAgIDxwPgotICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLCBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzCi0gICAgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyCi0gICAgcmVhbCBjb3VudGVycGFydHMuIFRoZXNlIGNvbnZlbmllbmNlIGNsYXNzZXMgYXJlIGZvdW5kIGluIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LiBUaGV5IGFyZToKKyAgICBBbmRyb2lkIGhhcyBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBjcmVhdGluZyBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgYXBwbGljYXRpb25zLCBjb250ZXh0cywKKyAgICBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgaW4gc29tZSB0ZXN0IGNsYXNzZXMgZm9yIAorICAgIGNyZWF0aW5nIG1vY2sgSW50ZW50cy4gVXNlIHRoZXNlIG1vY2tzIHRvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24sIHNpbmNlIHRoZXkgYXJlIAorICAgIGVhc2llciB0byB1c2UgdGhhbiBjcmVhdGluZyB0aGVpciByZWFsIGNvdW50ZXJwYXJ0cy4gVGhlc2UgY29udmVuaWVuY2UgY2xhc3NlcyBhcmUgZm91bmQgaW4gCisgICAge0BsaW5rIGFuZHJvaWQudGVzdH0gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9ja30uIFRoZXkgYXJlOgogICA8L3A+CiAgICAgPHVsPgogICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgcnVucyBpbiBpc29sYXRpb24uCi0gICAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHNhdGlzZnkgT1MgY29kZSB0aGF0IHRyaWVzIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9IC0gTW9ja3MgYSBDb250ZXh0IHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGl0IAorICAgICAgICBydW5zIGluIGlzb2xhdGlvbi4gQXQgdGhlIHNhbWUgdGltZSwgaXQgaGFzIGVub3VnaCBzdHViIGNvZGUgdG8gc2F0aXNmeSBPUyBjb2RlIHRoYXQgdHJpZXMgCisgICAgICAgIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KICAgICAgIDwvbGk+CiAgICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZywgbm9ybWFsIGNvbnRleHQgd2hpbGUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZmlsZSBhbmQgZGF0YWJhc2UKLSAgICAgICAgbmFtZXMgaW4gdGhlIGNvbnRleHQuIFVzZSB0aGlzIHRvIHRlc3QgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIGEgbm9ybWFsIHN5c3RlbSBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9IC0gRGVsZWdhdGVzIG1vc3QgY29udGV4dCBmdW5jdGlvbnMgdG8gYW4gCisgICAgICAgIGV4aXN0aW5nLCBub3JtYWwgY29udGV4dCB3aGlsZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBmaWxlIGFuZCBkYXRhYmFzZQorICAgICAgICBuYW1lcyBpbiB0aGUgY29udGV4dC4gVXNlIHRoaXMgdG8gdGVzdCBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHdpdGggYSBub3JtYWwgc3lzdGVtIAorICAgICAgICBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgogICAgICAgPC9saT4KICAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tEaWFsb2dJbnRlcmZhY2V9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgdXNlZnVsIGluIG1hbmFnaW5nIHRoZSBvYmplY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSB0aHJvdyBhbiBFeGNlcHRpb24uIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXh0ZW5kIHRoZSBjbGFzc2VzIGFuZAotICAgICAgICBvdmVycmlkZSBhbnkgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0sIAorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0RpYWxvZ0ludGVyZmFjZX0sIAorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gCisgICAgICAgIENsYXNzZXMgdGhhdCBjcmVhdGUgbW9jayBBbmRyb2lkIHN5c3RlbSBvYmplY3RzIGZvciB1c2UgaW4gdGVzdGluZy4gVGhleSBleHBvc2Ugb25seSB0aG9zZSAKKyAgICAgICAgbWV0aG9kcyB0aGF0IGFyZSB1c2VmdWwgaW4gbWFuYWdpbmcgdGhlIG9iamVjdC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIG1ldGhvZHMKKyAgICAgICAgc2ltcGx5IHRocm93IGFuIEV4Y2VwdGlvbi4gWW91IGFyZSBleHBlY3RlZCB0byBleHRlbmQgdGhlIGNsYXNzZXMgYW5kIG92ZXJyaWRlIGFueSBtZXRob2RzICcKKyAgICAgICAgdGhhdCBhcmUgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgogICAgICAgPC9saT4KICAgICA8L3VsPgogPGgzIGlkPSJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2gzPgogPHA+CiAgIEFuZHJvaWQgcHJvdmlkZXMgYSBjdXN0b20gY2xhc3MgZm9yIHJ1bm5pbmcgdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24gY2FsbGVkIGNhbGxlZAogICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGlzIGNsYXNzCi0gIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzCi0gIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAotICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgaXRzZWxmIHVzZSBpbnN0cnVtZW50YXRpb24uCisgIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgCisgIHNhbWUgcHJvY2VzcywgYW5kIHJvdXRlcyB0ZXN0IG91dHB1dCB0byB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuIFVzaW5nIGluc3RydW1lbnRhdGlvbiBpcyBrZXkgdG8gdGhlCisgIGFiaWxpdHkgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gdG8gY29udHJvbCB0aGUgZW50aXJlIHRlc3QKKyAgZW52aXJvbm1lbnQgYXQgcnVudGltZS4gTm90aWNlIHRoYXQgeW91IHVzZSB0aGlzIHRlc3QgcnVubmVyIGV2ZW4gaWYgeW91ciB0ZXN0IGNsYXNzIGRvZXMgbm90IAorICBpdHNlbGYgdXNlIGluc3RydW1lbnRhdGlvbi4KIDwvcD4KIDxwPgotICBXaGVuIHlvdSBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB5b3UgZmlyc3QgcnVuIGEgc3lzdGVtIHV0aWxpdHkgY2FsbGVkIEFjdGl2aXR5IE1hbmFnZXIuIEFjdGl2aXR5IE1hbmFnZXIgdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0byBzdGFydCBhbmQgY29udHJvbCB0aGUgdGVzdCBydW5uZXIsIHdoaWNoIGluIHR1cm4gdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gc2h1dCBkb3duIGFueSBydW5uaW5nIGluc3RhbmNlcwotICBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiwgc3RhcnRzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBzdGFydHMgdGhlIG1haW4gYXBwbGljYXRpb24gaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHRvIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgbWFpbiBhcHBsaWNhdGlvbi4KKyAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiwgeW91IGZpcnN0IHJ1biBhIHN5c3RlbSB1dGlsaXR5IGNhbGxlZCBBY3Rpdml0eSBNYW5hZ2VyLiBBY3Rpdml0eSAKKyAgTWFuYWdlciB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRvIHN0YXJ0IGFuZCBjb250cm9sIHRoZSB0ZXN0IHJ1bm5lciwgd2hpY2ggaW4gdHVybiAKKyAgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gc2h1dCBkb3duIGFueSBydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiwgc3RhcnRzIHRoZSB0ZXN0IAorICBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gc3RhcnRzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHZhcmlvdXMgCisgIGFzcGVjdHMgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24gdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBtYWluIGFwcGxpY2F0aW9uLgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3Igb3RoZXIgdGVzdCBydW5uZXJzLgotICBUaGUgcGx1Z2luIFVJIHByb21wdHMgeW91IHRvIHNwZWNpZnkgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCi0gIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBjb250cm9sIG9mIEFjdGl2aXR5IE1hbmFnZXIgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLAotICBhbmQgcmVkaXJlY3RzIHRoZSB0ZXN0IG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgorICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSwgdGhlIEFEVCBwbHVnaW4gYXNzaXN0cyB5b3UgaW4gdGhlIHNldHVwIG9mIAorICA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBvdGhlciB0ZXN0IHJ1bm5lcnMuIFRoZSBwbHVnaW4gVUkgcHJvbXB0cyB5b3UgdG8gc3BlY2lmeSAKKyAgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgorICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgCisgIHRvIHRoZSBtYW5pZmVzdCBmaWxlIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBFY2xpcHNlIHdpdGggQURUIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGEgdGVzdCAKKyAgYXBwbGljYXRpb24gdW5kZXIgdGhlIGNvbnRyb2wgb2YgQWN0aXZpdHkgTWFuYWdlciB1c2luZyBpbnN0cnVtZW50YXRpb24sIGFuZCByZWRpcmVjdHMgdGhlIHRlc3QgCisgIG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgogPC9wPgogPHA+CiAgIElmIHlvdSBwcmVmZXIgd29ya2luZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBjYW4gdXNlIEFudCBhbmQgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+CkBAIC0yODksNjggKzMzOCwxMDUgQEAKIDwvcD4KIDxoMiBpZD0iVGVzdEVudmlyb21lbnQiPldvcmtpbmcgaW4gdGhlIFRlc3QgRW52aXJvbm1lbnQ8L2gyPgogPHA+Ci0gICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCi0gICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cwotICAgIChrbm93biBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCkgYnkgaXRzIG1hbmlmZXN0IGZpbGUuCisgICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gCisgICAgQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCisgICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSAKKyAgICBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cyAoa25vd24gYXMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QpIGJ5IGl0cyBtYW5pZmVzdCBmaWxlLgogPC9wPgogPHA+CiAgICAgRWFjaCB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIGJhc2VkIG9uIGFuIEFuZHJvaWQgY2xhc3MgZm9yIGEKLSAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgdGVzdCBjYXNlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBkZWZpbmUgdGVzdHMgb24gc29tZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaGVuIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIEFuZHJvaWQKLSAgICBzdGFydHMgaXQsIGxvYWRzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHRoZW4gaW52b2tlcyBlYWNoIG1ldGhvZCBpbiB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgIHBhcnRpY3VsYXIgdHlwZSBvZiBjb21wb25lbnQuIFRoZSB0ZXN0IGNhc2UgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0aGF0IGRlZmluZSB0ZXN0cyBvbiBzb21lIAorICAgIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdoZW4geW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgQW5kcm9pZAorICAgIHN0YXJ0cyBpdCwgbG9hZHMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgdGhlbiBpbnZva2VzIGVhY2ggbWV0aG9kIAorICAgIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MuCiA8L3A+CiA8cD4KLSAgICBUaGUgdG9vbHMgYW5kIHByb2NlZHVyZXMgeW91IHVzZSB3aXRoIHRlc3RpbmcgZGVwZW5kIG9uIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB5b3UgYXJlIHVzaW5nLiBJZiB5b3UgdXNlIEVjbGlwc2UsIHRoZW4gdGhlIEFEVCBwbHVnIGluIGZvciBFY2xpcHNlIHByb3ZpZGVzIHRvb2xzIHRoYXQKLSAgICBhbGxvdyB5b3UgdG8gZGV2ZWxvcCBhbmQgcnVuIHRlc3RzIGVudGlyZWx5IHdpdGhpbiBFY2xpcHNlLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgotICAgIElmIHlvdSB1c2UgYW5vdGhlciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgdGhlbiB5b3UgdXNlIEFuZHJvaWQncyBjb21tYW5kLWxpbmUgdG9vbHMsIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgorICAgIFRoZSB0b29scyBhbmQgcHJvY2VkdXJlcyB5b3UgdXNlIHdpdGggdGVzdGluZyBkZXBlbmQgb24gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBhcmUgCisgICAgdXNpbmcuIElmIHlvdSB1c2UgRWNsaXBzZSwgdGhlbiB0aGUgQURUIHBsdWcgaW4gZm9yIEVjbGlwc2UgcHJvdmlkZXMgdG9vbHMgdGhhdCBhbGxvdyB5b3UgdG8gCisgICAgZGV2ZWxvcCBhbmQgcnVuIHRlc3RzIGVudGlyZWx5IHdpdGhpbiBFY2xpcHNlLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBJZiB5b3UgdXNlIGFub3RoZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHRoZW4geW91IHVzZSAKKyAgICBBbmRyb2lkJ3MgY29tbWFuZC1saW5lIHRvb2xzLCBhcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyAKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KIDwvcD4KIDxoMyBpZD0iVGVzdFByb2plY3RzIj5Xb3JraW5nIHdpdGggdGVzdCBwcm9qZWN0czwvaDM+CiA8cD4KLSAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KLSAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aAotICAgIEFEVCBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBUaGUgcHJvY2VkdXJlIGZvciBjcmVhdGluZyBhIHRlc3QgcHJvamVjdCBmb3IgdXNlIHdpdGggZGV2ZWxvcG1lbnQKLSAgICB0b29scyBvdGhlciB0aGFuIEVjbGlwc2UgaXMgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIAorICAgIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KKyAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIAorICAgIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQgaXMgCisgICAgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgZm9yIHVzZSB3aXRoIAorICAgIGRldmVsb3BtZW50IHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgogPC9wPgogPGgzIGlkPSJUZXN0Q2xhc3NlcyI+V29ya2luZyB3aXRoIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIHRoZQotICAgIHRlc3RzIHlvdSBhcmUgZG9pbmcuIEEgdGVzdCBhcHBsaWNhdGlvbiBjYW4gdGVzdCBkaWZmZXJlbnQgY29tcG9uZW50cywgYnV0IGVhY2ggdGVzdCBjYXNlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRlc3QgYSBzaW5nbGUgdHlwZSBvZiBjb21wb25lbnQuCi0gICAgVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KKyAgICBBIHRlc3QgYXBwbGljYXRpb24gY29udGFpbnMgb25lIG9yIG1vcmUgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQgYW4gQW5kcm9pZCB0ZXN0IGNhc2UgCisgICAgY2xhc3MuIFlvdSBjaG9vc2UgYSB0ZXN0IGNhc2UgY2xhc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgQW5kcm9pZCBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nIGFuZCAKKyAgICB0aGUgdGVzdHMgeW91IGFyZSBkb2luZy4gQSB0ZXN0IGFwcGxpY2F0aW9uIGNhbiB0ZXN0IGRpZmZlcmVudCBjb21wb25lbnRzLCBidXQgZWFjaCB0ZXN0IGNhc2UgCisgICAgY2xhc3MgaXMgZGVzaWduZWQgdG8gdGVzdCBhIHNpbmdsZSB0eXBlIG9mIGNvbXBvbmVudC4gVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIAorICAgIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KIDwvcD4KIDxwPgotICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsCi0gICAgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgorICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIAorICAgIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsIGZvciAKKyAgICBleGFtcGxlLCB5b3UgaGF2ZSB0aGUgY2hvaWNlIG9mIGVpdGhlciB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSBvciAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfS4KIDxwPgotICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAorICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIAorICAgIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAogICAgIG1vY2tlZCBDb250ZXh0cy4gSW4gZ2VuZXJhbCwgeW91IGNhbid0IG1vY2sgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KIDwvcD4KIDxwPgotICAgIEluIGNvbXBhcmlzb24sIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiBpcyBkZXNpZ25lZCBmb3IgdW5pdCB0ZXN0aW5nLCBzbyBpdCB0ZXN0cyBhY3Rpdml0aWVzIGluIGFuIGlzb2xhdGVkIHN5c3RlbSBpbmZyYXN0cnVjdHVyZS4gWW91IGNhbiBpbmplY3QgbW9ja2VkIG9yIHdyYXBwZXJlZCBkZXBlbmRlbmNpZXMgZm9yCi0gICAgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QsIHBhcnRpY3VsYXJseSBtb2NrZWQgQ29udGV4dHMuIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHlvdSB1c2UgdGhpcyB0ZXN0IGNhc2UgY2xhc3MgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QgcnVucyBpbiBpc29sYXRpb24gYW5kIGNhbid0IGludGVyYWN0IHdpdGggb3RoZXIgYWN0aXZpdGllcy4KKyAgICBJbiBjb21wYXJpc29uLCA8Y29kZT5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvY29kZT4gaXMgZGVzaWduZWQgZm9yIHVuaXQgdGVzdGluZywgc28gaXQgdGVzdHMgCisgICAgYWN0aXZpdGllcyBpbiBhbiBpc29sYXRlZCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBvciB3cmFwcGVyZWQgCisgICAgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIAorICAgIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3QgCisgICAgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgogPC9wPgogPHA+Ci0gICAgQXMgYSBydWxlIG9mIHRodW1iLCBpZiB5b3Ugd2FudGVkIHRvIHRlc3QgYW4gYWN0aXZpdHkncyBpbnRlcmFjdGlvbiB3aXRoIHRoZSByZXN0IG9mIEFuZHJvaWQsIHlvdSB3b3VsZCB1c2UgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+LiBJZiB5b3Ugd2FudGVkIHRvIGRvIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgIG9uIGFuIGFjdGl2aXR5LCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPi4KKyAgICBBcyBhIHJ1bGUgb2YgdGh1bWIsIGlmIHlvdSB3YW50ZWQgdG8gdGVzdCBhbiBhY3Rpdml0eSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHJlc3Qgb2YgQW5kcm9pZCwgCisgICAgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwvY29kZT4uIElmIHlvdSB3YW50ZWQgdG8gZG8gcmVncmVzc2lvbiAKKyAgICB0ZXN0aW5nIG9uIGFuIGFjdGl2aXR5LCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPi4KIDwvcD4KIDxoMyBpZD0iVGVzdHMiPldvcmtpbmcgd2l0aCB0ZXN0IG1ldGhvZHM8L2gzPgogPHA+Ci0gICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfQotICAgIG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91IGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgotICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiB5b3VyIG1ldGhvZHMuCisgICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIAorICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBtZXRob2QgdGhhdCB5b3UgY2FuIG92ZXJyaWRlIHRvIHNldCB1cCAKKyAgICBmaXh0dXJlcy4gSW4gYWRkaXRpb24sIHlvdSBhZGQgbWV0aG9kcyB0byB0aGUgY2xhc3MgdG8gZGVmaW5lIGluZGl2aWR1YWwgdGVzdHMuIEVhY2ggbWV0aG9kIHlvdQorICAgIGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgorICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiAKKyAgICB5b3VyIG1ldGhvZHMuCiA8L3A+CiA8cD4KLSAgICBUaGUgdGVzdCBjYXNlIGNsYXNzZXMgZ2l2ZSB5b3Ugc3Vic3RhbnRpYWwgY29udHJvbCBvdmVyIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBjb21wb25lbnRzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBoYXZlIHRvIHNwZWNpZmljYWxseSB0ZWxsIEFuZHJvaWQgdG8gc3RhcnQgYSBjb21wb25lbnQgYmVmb3JlIHlvdSBydW4gdGVzdHMgYWdhaW5zdCBpdC4gRm9yIGV4YW1wbGUsIHlvdSB1c2UgdGhlCi0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiNnZXRBY3Rpdml0eSgpfSBtZXRob2QgdG8gc3RhcnQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlCi0gICAgYWN0aXZpdHkgdW5kZXIgdGVzdCBieSBjYWxsaW5nIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluaXNoKCl9IG1ldGhvZCBhbmQgdGhlbiByZXN0YXJ0IGl0IHdpdGggPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gd2l0aGluIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgorICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3NlcyBnaXZlIHlvdSBzdWJzdGFudGlhbCBjb250cm9sIG92ZXIgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIGNvbXBvbmVudHMuIEZvciAKKyAgICB0aGlzIHJlYXNvbiwgeW91IGhhdmUgdG8gc3BlY2lmaWNhbGx5IHRlbGwgQW5kcm9pZCB0byBzdGFydCBhIGNvbXBvbmVudCBiZWZvcmUgeW91IHJ1biB0ZXN0cyAKKyAgICBhZ2FpbnN0IGl0LiBGb3IgZXhhbXBsZSwgeW91IHVzZSB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyI2dldEFjdGl2aXR5KCl9IG1ldGhvZCB0byBzdGFydCB0aGUgYWN0aXZpdHkKKyAgICB1bmRlciB0ZXN0LiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2Qgb25jZSBkdXJpbmcgdGhlIGVudGlyZSB0ZXN0IGNhc2UsIG9yIG9uY2UgZm9yIGVhY2ggdGVzdCAKKyAgICBtZXRob2QuIFlvdSBjYW4gZXZlbiBkZXN0cm95IHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0IGJ5IGNhbGxpbmcgaXRzIAorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2goKX0gbWV0aG9kIGFuZCB0aGVuIHJlc3RhcnQgaXQgd2l0aCAKKyAgICA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB3aXRoaW4gYSBzaW5nbGUgdGVzdCBtZXRob2QuCiA8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzIj5SdW5uaW5nIHRlc3RzIGFuZCBzZWVpbmcgdGhlIHJlc3VsdHM8L2gzPgogPHA+Ci0gICAgVG8gcnVuIHlvdXIgdGVzdHMsIHlvdSBidWlsZCB5b3VyIHRlc3QgcHJvamVjdCBhbmQgdGhlbiBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24gdXNpbmcgdGhlIHN5c3RlbSB1dGlsaXR5IEFjdGl2aXR5IE1hbmFnZXIgd2l0aCBpbnN0cnVtZW50YXRpb24uIFlvdSBwcm92aWRlIHRvIEFjdGl2aXR5IE1hbmFnZXIgdGhlIG5hbWUgb2YgdGhlIHRlc3QgcnVubmVyICh1c3VhbGx5Ci0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSkgeW91IHNwZWNpZmllZCBmb3IgeW91ciBhcHBsaWNhdGlvbjsgdGhlIG5hbWUgaW5jbHVkZXMgYm90aCB5b3VyIHRlc3QgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0ZXN0IHJ1bm5lciBjbGFzcyBuYW1lLiBBY3Rpdml0eSBNYW5hZ2VyIGxvYWRzIGFuZCBzdGFydHMgeW91cgotICAgIHRlc3QgYXBwbGljYXRpb24sIGtpbGxzIGFueSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGxvYWRzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gcGFzc2VzIGNvbnRyb2wgdG8gdGhlIGZpcnN0IHRlc3QgY2FzZQotICAgIGNsYXNzIGluIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcnVubmVyIHRoZW4gdGFrZXMgY29udHJvbCBvZiB0aGUgdGVzdHMsIHJ1bm5pbmcgZWFjaCBvZiB5b3VyIHRlc3QgbWV0aG9kcyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHVudGlsIGFsbCB0aGUgbWV0aG9kcyBpbiBhbGwgdGhlIGNsYXNzZXMgaGF2ZSBiZWVuIHJ1bi4KKyAgICBUbyBydW4geW91ciB0ZXN0cywgeW91IGJ1aWxkIHlvdXIgdGVzdCBwcm9qZWN0IGFuZCB0aGVuIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgCisgICAgc3lzdGVtIHV0aWxpdHkgQWN0aXZpdHkgTWFuYWdlciB3aXRoIGluc3RydW1lbnRhdGlvbi4gWW91IHByb3ZpZGUgdG8gQWN0aXZpdHkgTWFuYWdlciB0aGUgbmFtZSAKKyAgICBvZiB0aGUgdGVzdCBydW5uZXIgKHVzdWFsbHkge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSkgeW91IHNwZWNpZmllZCBmb3IgCisgICAgeW91ciBhcHBsaWNhdGlvbjsgdGhlIG5hbWUgaW5jbHVkZXMgYm90aCB5b3VyIHRlc3QgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0ZXN0IAorICAgIHJ1bm5lciBjbGFzcyBuYW1lLiBBY3Rpdml0eSBNYW5hZ2VyIGxvYWRzIGFuZCBzdGFydHMgeW91ciB0ZXN0IGFwcGxpY2F0aW9uLCBraWxscyBhbnkgaW5zdGFuY2VzCisgICAgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGxvYWRzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgCisgICAgcHJvY2VzcyBhcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gcGFzc2VzIGNvbnRyb2wgdG8gdGhlIGZpcnN0IHRlc3QgY2FzZSBjbGFzcyBpbiB5b3VyIAorICAgIHRlc3QgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHJ1bm5lciB0aGVuIHRha2VzIGNvbnRyb2wgb2YgdGhlIHRlc3RzLCBydW5uaW5nIGVhY2ggb2YgeW91ciB0ZXN0IAorICAgIG1ldGhvZHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB1bnRpbCBhbGwgdGhlIG1ldGhvZHMgaW4gYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiAKKyAgICBydW4uCiA8L3A+CiA8cD4KLSAgICBJZiB5b3UgcnVuIGEgdGVzdCB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgb3V0cHV0IGdvZXMgdG8gU1RET1VULgorICAgIElmIHlvdSBydW4gYSB0ZXN0IHdpdGhpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4gYSBuZXcgSlVuaXQgdmlldyBwYW5lLiBJZiB5b3UgCisgICAgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBvdXRwdXQgZ29lcyB0byBTVERPVVQuCiA8L3A+CiA8aDIgaWQ9IlRlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9oMj4KIDxwPgpAQCAtMzU5LDU4ICs0NDUsNjQgQEAKIDwvcD4KICAgPHVsPgogICAgIDxsaT4KLSAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBjb3JyZWN0bHkuIEZvciBleGFtcGxlCi0gICAgICBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCisgICAgICBBY3Rpdml0eSBsaWZlY3ljbGUgZXZlbnRzOiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIGFjdGl2aXRpZXMgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgCisgICAgICBjb3JyZWN0bHkuIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIAorICAgICAgc3RhdGUuIFJlbWVtYmVyIHRoYXQgZXZlbiBhIGNoYW5nZSBpbiBzY3JlZW4gb3JpZW50YXRpb24gY2F1c2VzIHRoZSBjdXJyZW50IGFjdGl2aXR5IHRvIGJlIAorICAgICAgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCiAgICAgICBhcHBsaWNhdGlvbiBzdGF0ZS4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3RhdGUuCi0gICAgICBUbyBkbyB0aGlzLCB1c2UgbW9jayBvYmplY3RzIGZyb20gdGhlIHBhY2thZ2Uge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KKyAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gCisgICAgICB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4gVG8gZG8gdGhpcywgdXNlIG1vY2sgb2JqZWN0cyBmcm9tIHRoZSBwYWNrYWdlIAorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIGFsbCBvZiB0aGUKLSAgICAgICAgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIGFwcGxpY2F0aW9uIG9uIG11bHRpcGxlIHNpemVzIGFuZCBkZW5zaXRpZXMgdXNpbmcKLSAgICAgICAgQVZEcywgb3IgeW91IGNhbiB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgICAgICB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KKyAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIAorICAgICAgICBhbGwgb2YgdGhlIHNjcmVlbiBzaXplcyBhbmQgZGVuc2l0aWVzIG9uIHdoaWNoIHlvdSB3YW50IGl0IHRvIHJ1bi4gWW91IGNhbiB0ZXN0IHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZyBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbiAKKyAgICAgICAgZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgdG9waWMgCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT4uCiAgICAgPC9saT4KICAgPC91bD4KIDxwPgotICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgotICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgotICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgorICAgIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCisgICAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgorICAgIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCiA8L3A+CiA8aDIgaWQ9IlVJVGVzdGluZyI+QXBwZW5kaXg6IFVJIFRlc3RpbmcgTm90ZXM8L2gyPgogPHA+Ci0gIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgaGF2ZSB0aXBzIGZvciB0ZXN0aW5nIHRoZSBVSSBvZiB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHNwZWNpZmljYWxseQotICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKLSAgc2NyZWVuIHVubG9jayBkdXJpbmcgdGVzdGluZy4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKKyAgICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKKyAgICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgogPC9wPgogPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgogPHA+Ci0gIEFuIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBydW4gb24gdGhlIGFwcGxpY2F0aW9uJ3MgPHN0cm9uZz5VSSB0aHJlYWQ8L3N0cm9uZz4uIE9uY2UgdGhlCi0gIFVJIGlzIGluc3RhbnRpYXRlZCwgZm9yIGV4YW1wbGUgaW4gdGhlIGFjdGl2aXR5J3MgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLCB0aGVuIGFsbAotICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKLSAgaGFzIGFjY2VzcyB0byB0aGUgdGhyZWFkIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKKyAgICBVSSBpcyBpbnN0YW50aWF0ZWQsIGZvciBleGFtcGxlIGluIHRoZSBhY3Rpdml0eSdzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCwgdGhlbiBhbGwKKyAgICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKKyAgICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KIDwvcD4KIDxwPgotICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAotICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIGRvbid0IGFsbG93IHRoaXMuCi0gIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uCi0gIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSQotICBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCisgICAgVGhpcyBjaGFuZ2VzIHdoZW4geW91IHJ1biB0ZXN0cyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbi4gV2l0aCBpbnN0cnVtZW50YXRpb24tYmFzZWQgY2xhc3NlcywKKyAgICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIAorICAgIGRvbid0IGFsbG93IHRoaXMuIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIAorICAgIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyAKKyAgICBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSSBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgCisgICAgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCiA8L3A+CiA8cD4KLSAgVG8gcnVuIGEgc3Vic2V0IG9mIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBvZiB0eXBlCi0gIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgaW5zdGFudGlhdGUgYSBuZXcKLSAgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUKLSAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KKyAgICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKKyAgICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kIAorICAgIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBhcyBhIHBhcmFtZXRlciB0byB0aGUgbWV0aG9kIAorICAgIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+LnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4sIHdoZXJlIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+PC9jb2RlPiBpcyAKKyAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcCB5b3UgYXJlIHRlc3RpbmcuCiA8L3A+CiA8cD4KLSAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YW50aWF0ZXMgYW4gYWN0aXZpdHkgdG8gdGVzdCwgcmVxdWVzdHMgZm9jdXMgKGEgVUkgYWN0aW9uKSBmb3IgdGhlIFNwaW5uZXIgZGlzcGxheWVkCi0gIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0byA8Y29kZT53YWl0Rm9ySWRsZVN5bmM8L2NvZGU+IGFuZCA8Y29kZT5zZW5kS2V5czwvY29kZT4KLSAgYXJlbid0IGFsbG93ZWQgdG8gcnVuIG9uIHRoZSBVSSB0aHJlYWQ6PC9wPgorICAgIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgaW5zdGFudGlhdGVzIGFuIGFjdGl2aXR5IHRvIHRlc3QsIHJlcXVlc3RzIGZvY3VzIChhIFVJIGFjdGlvbikgZm9yIHRoZSAKKyAgICBTcGlubmVyIGRpc3BsYXllZCBieSB0aGUgYWN0aXZpdHksIGFuZCB0aGVuIHNlbmRzIGEga2V5IHRvIGl0LiBOb3RpY2UgdGhhdCB0aGUgY2FsbHMgdG8gCisgICAgPGNvZGU+d2FpdEZvcklkbGVTeW5jPC9jb2RlPiBhbmQgPGNvZGU+c2VuZEtleXM8L2NvZGU+IGFyZW4ndCBhbGxvd2VkIHRvIHJ1biBvbiB0aGUgVUkgdGhyZWFkOgorPC9wPgogPHByZT4KICAgcHJpdmF0ZSBNeUFjdGl2aXR5IG1BY3Rpdml0eTsgLy8gTXlBY3Rpdml0eSBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYXBwIHVuZGVyIHRlc3QKICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOwpAQCAtNDQ5LDMxICs1NDEsMzYgQEAKIAogPGgzIGlkPSJOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvaDM+CiA8cD4KLSAgVG8gY29udHJvbCB0aGUgZW11bGF0b3Igb3IgYSBkZXZpY2Ugd2l0aCBrZXkgZXZlbnRzIHlvdSBzZW5kIGZyb20geW91ciB0ZXN0cywgeW91IG11c3QgdHVybiBvZmYKLSAgdG91Y2ggbW9kZS4gSWYgeW91IGRvIG5vdCBkbyB0aGlzLCB0aGUga2V5IGV2ZW50cyBhcmUgaWdub3JlZC4KKyAgICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgorICAgIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCiA8L3A+CiA8cD4KLSAgVG8gdHVybiBvZmYgdG91Y2ggbW9kZSwgeW91IGludm9rZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+Ci0gIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QKLSAgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kCi0gIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KKyAgICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlIAorICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyLnNldEFjdGl2aXR5VG91Y2hNb2RlKGZhbHNlKTwvY29kZT4KKyAgICA8ZW0+YmVmb3JlPC9lbT4geW91IGNhbGwgPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gdG8gc3RhcnQgdGhlIGFjdGl2aXR5LiBZb3UgbXVzdCBpbnZva2UgdGhlIAorICAgIG1ldGhvZCBpbiBhIHRlc3QgbWV0aG9kIHRoYXQgaXMgPGVtPm5vdDwvZW0+IHJ1bm5pbmcgb24gdGhlIFVJIHRocmVhZC4gRm9yIHRoaXMgcmVhc29uLCB5b3UgCisgICAgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCAKKyAgICA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+LiBJbnN0ZWFkLCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kIGZyb20gPGNvZGU+c2V0VXAoKTwvY29kZT4uCiA8L3A+CiA8aDMgaWQ9IlVubG9ja0RldmljZSI+VW5sb2NraW5nIHRoZSBlbXVsYXRvciBvciBkZXZpY2U8L2gzPgogPHA+Ci0gIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCB0aGUga2V5Z3VhcmQgcGF0dGVybi4KLSAgVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50IGJ5IDxjb2RlPnNlbmRLZXlzKCk8L2NvZGU+LiBUaGUgYmVzdAotICB3YXkgdG8gYXZvaWQgdGhpcyBpcyB0byBzdGFydCB5b3VyIGVtdWxhdG9yIG9yIGRldmljZSBmaXJzdCBhbmQgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBmb3IgdGhlIGhvbWUgc2NyZWVuLgorICAgIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCAKKyAgICB0aGUga2V5Z3VhcmQgcGF0dGVybi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50ICcKKyAgICBieSA8Y29kZT5zZW5kS2V5cygpPC9jb2RlPi4gVGhlIGJlc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gc3RhcnQgeW91ciBlbXVsYXRvciBvciBkZXZpY2UgCisgICAgZmlyc3QgYW5kIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgZm9yIHRoZSBob21lIHNjcmVlbi4KIDwvcD4KIDxwPgotICBZb3UgY2FuIGFsc28gZXhwbGljaXRseSBkaXNhYmxlIHRoZSBrZXlndWFyZC4gVG8gZG8gdGhpcywKLSAgeW91IG5lZWQgdG8gYWRkIGEgcGVybWlzc2lvbiBpbiB0aGUgbWFuaWZlc3QgZmlsZSAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIGFuZAotICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0byByZW1vdmUgdGhpcyBiZWZvcmUKLSAgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGhhdmUgdG8gZGlzYWJsZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGluIHRoZSBwdWJsaXNoZWQgYXBwLgorICAgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAorICAgIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKKyAgICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0byAKKyAgICByZW1vdmUgdGhpcyBiZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGhhdmUgdG8gZGlzYWJsZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGluIAorICAgIHRoZSBwdWJsaXNoZWQgYXBwLgogPC9wPgogPHA+Ci0gIFRvIGFkZCB0aGUgdGhlIHBlcm1pc3Npb24sIGFkZCB0aGUgZWxlbWVudCA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiLyZndDs8L2NvZGU+Ci0gIGFzIGEgY2hpbGQgb2YgdGhlIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQuIFRvIGRpc2FibGUgdGhlIEtleUd1YXJkLCBhZGQgdGhlIGZvbGxvd2luZyBjb2RlCi0gIHRvIHRoZSA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgYWN0aXZpdGllcyB5b3UgaW50ZW5kIHRvIHRlc3Q6CisgICAgVG8gYWRkIHRoZSB0aGUgcGVybWlzc2lvbiwgYWRkIHRoZSBlbGVtZW50IAorICAgIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIvJmd0OzwvY29kZT4KKyAgICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZSAKKyAgICBmb2xsb3dpbmcgY29kZSB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgogPC9wPgogPHByZT4KICAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7CkBAIC00ODMsNyArNTgwLDggQEAKIDxwPndoZXJlIDxjb2RlPjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPjwvY29kZT4gaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2aXR5LjwvcD4KIDxoMyBpZD0iVUlUZXN0VHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3RpbmcgVUkgdGVzdHM8L2gzPgogPHA+Ci0gIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgY2F1c2VzOgorICAgIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgCisgICAgY2F1c2VzOgogPC9wPgogPGRsPgogICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgpAQCAtNDkxLDI3ICs1ODksMzMgQEAKICAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CiAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgogICAgICAgPGNvZGU+Ci0gICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgorICAgICAgICBhbmRyb2lkLnZpZXcuVmlld1Jvb3QkQ2FsbGVkRnJvbVdyb25nVGhyZWFkRXhjZXB0aW9uOiBPbmx5IHRoZSBvcmlnaW5hbCB0aHJlYWQgdGhhdCBjcmVhdGVkIAorICAgICAgICBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCiAgICAgICA8L2NvZGU+CiAgICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMKLSAgICAgICAgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndCB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZSB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkgCisgICAgICAgIHRocmVhZC4gVGhpcyBjb21tb25seSBoYXBwZW5zIGlmIHlvdSBzZW5kIFVJIGV2ZW50cyBmcm9tIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBidXQgeW91IGRvbid0CisgICAgICAgIHVzZSB0aGUgPGNvZGU+QFVJVGhyZWFkPC9jb2RlPiBhbm5vdGF0aW9uIG9yIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IG1ldGhvZC4gVGhlIAorICAgICAgICB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCiAgICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KKyAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgCisgICAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+CiAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgPC9kZD4KICAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KICAgICA8ZGQ+CiAgICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgotICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKKyAgICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKICAgICAgIDxjb2RlPgogICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQKICAgICAgIDwvY29kZT4KICAgICAgIDxwPjxzdHJvbmc+UHJvYmFibGUgQ2F1c2U6PC9zdHJvbmc+PC9wPgotICAgICAgICBUaGlzIGVycm9yIGlzIGNvbW1vbiBpZiB5b3VyIHRlc3QgbWV0aG9kIGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGJ1dCB0aGVuIHRyaWVzIHRvCi0gICAgICAgIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4uCisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IAorICAgICAgICB0aGVuIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIAorICAgICAgICA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LgogICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFJlbW92ZSB0aGUgPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYW5ub3RhdGlvbiwgcmVtb3ZlIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IGNhbGwsIG9yIHJlLWZhY3RvciB5b3VyIHRlc3RzLgorICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiAKKyAgICAgICAgY2FsbCwgb3IgcmUtZmFjdG9yIHlvdXIgdGVzdHMuCiAgICAgPC9kZD4KIDwvZGw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkCkBAIC0wLDAgKzEsNDkgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAge0BsaXRlcmFsIEBpbXBvcnR9ICJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuY3NzIjsKKzwvc3R5bGU+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IntAZG9jUm9vdH1hc3NldHMvYW5kcm9pZC1kZXZlbG9wZXItcmVzb3VyY2UtYnJvd3Nlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL21pY3JvdGVtcGxhdGUuanMiPjwvc2NyaXB0PgorCis8ZGl2PgorICA8cCBzdHlsZT0iZGlzcGxheTogbm9uZTsgZmxvYXQ6IHJpZ2h0Ij5GaWx0ZXI6IDxpbnB1dCBpZD0icmVzb3VyY2UtYnJvd3Nlci1rZXl3b3JkLWZpbHRlciIvPjwvcD4KKyAgPHAgaWQ9InJlc291cmNlLWJyb3dzZXItc2VhcmNoLXBhcmFtcyI+U2hvd2luZyBhbGwgdGVjaG5pY2FsIHJlc291cmNlczo8L3A+Cis8L2Rpdj4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPGRpdiBpZD0icmVzb3VyY2UtYnJvd3Nlci1yZXN1bHRzIj4KKyAgPGRpdiBjbGFzcz0ibm8tcmVzdWx0cyI+Tm8gcmVzdWx0cy48L2Rpdj4KKzwvZGl2PgorCis8c2NyaXB0IHR5cGU9InRleHQvaHRtbCIgaWQ9InRtcGxfcmVzb3VyY2VfYnJvd3Nlcl9yZXN1bHQiPgorPGRpdiBjbGFzcz0icmVzdWx0Ij4KKyAgPGgzPgorICAgIDwlIGlmICgnZXh0ZXJuYWwnIGluIHRhZ3NIYXNoKSB7ICU+PHN0cm9uZz5FeHRlcm5hbDogPC9zdHJvbmc+IDwlIH0gJT4KKyAgICA8YSBocmVmPSI8JT0gcGF0aCAlPiI+PCU9IHRpdGxlLmVuICU+PC9hPgorICAgIDwlIGlmICgnbmV3JyBpbiB0YWdzSGFzaCkgeyAlPjxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+IDwlIH0gJT4KKyAgPC9oMz4KKyAgPHAgY2xhc3M9InJlc291cmNlLW1ldGEiPjwlCisgICAgdmFyIF9fZyA9IFsnJywgJyddOworICAgIGlmICgnYXJ0aWNsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnQXJ0aWNsZScsICdhYm91dCddOworICAgIH0gZWxzZSBpZiAoJ3R1dG9yaWFsJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydUdXRvcmlhbCcsICdvbiddOworICAgIH0gZWxzZSBpZiAoJ3NhbXBsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnU2FtcGxlJywgJ2ZvciddOworICAgIH0gZWxzZSBpZiAoJ3ZpZGVvJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydWaWRlbycsICdhYm91dCddOworICAgIH0KKyAgJT4KKyAgPCU9IF9fZ1swXSAlPjwlIGlmICh0b3BpY3NIdG1sKSB7ICU+IDwlPSBfX2dbMV0gJT48JSB9ICU+IDwlPSB0b3BpY3NIdG1sICU+PC9wPgorICA8cD48JT0gZGVzY3JpcHRpb24uZW4gJT48L3A+Cis8L2Rpdj4KKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKaW5kZXggMTY2ODcyMS4uOTA1NTg2OCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCkBAIC0xLDM4ICsxLDkwIEBACiBwYWdlLnRpdGxlPURldmVsb3BlciBSZXNvdXJjZXMKIEBqZDpib2R5CiAKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgcGFkZGluZzogMCAyNHB4OworICAgIHdpZHRoOiAzMyU7CisgICAgbWF4LXdpZHRoOiAyNTBweDsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOworICB9CisKKyAgI3Jlc291cmNlLWxpc3QtdGFibGUgdGQubGFzdCB7CisgICAgYm9yZGVyLXJpZ2h0OiAwOworICAgIHBhZGRpbmctcmlnaHQ6IDA7CisgIH0KKzwvc3R5bGU+CisKIDxwPgotVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRlY2huaWNhbCBhcnRpY2xlcywgdHV0b3JpYWxzLCBzYW1wbGUgY29kZSwgYW5kIG90aGVyCitUaGlzIHNlY3Rpb24gcHJvdmlkZXMgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgogaW5mb3JtYXRpb24gdG8gaGVscCB5b3UgcXVpY2tseSBpbXBsZW1lbnQgdGhlIGZlYXR1cmVzIHlvdSB3YW50IGluIHlvdXIKLWFwcGxpY2F0aW9uLgorYXBwbGljYXRpb24uIFRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiCit0YWIgd2hpbGUgYW55IFJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4KIDwvcD4KIAorPGgyPlRlY2huaWNhbCBSZXNvdXJjZXM8L2gyPgorCis8dGFibGUgaWQ9InJlc291cmNlLWxpc3QtdGFibGUiPgorPHRyPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXNhbXBsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgU2FtcGxlIENvZGUKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5GdWxseS1mdW5jdGlvbmluZyBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgeW91IGNhbiBidWlsZCBhbmQgcnVuCisgICAgdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKKyAgICB0ZWNobmlxdWVzIGluIHRoZSBzYW1wbGVzLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctYXJ0aWNsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIEFydGljbGVzCisgICAgPC9hPjwvaDM+CisgICAgPHA+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKKyAgICBvcHRpbWl6YXRpb25zLCB0aXBzLCBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbnMsICJob3ctdG9zIiwKKyAgICBhbmQgc28gb24uPC9wPgorICA8L3RkPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgVHV0b3JpYWxzCisgICAgPC9hPjwvaDM+CisgICAgPHA+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCisgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmljIGZlYXR1cmVzIHlvdSB3YW50LjwvcD4KKyAgPC90ZD4KKyAgPCEtLSA8dGQgY2xhc3M9Imxhc3QiPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXZpZGVvIj4KKyAgICAgIFZpZGVvcyAmYW1wOyBTY3JlZW5jYXN0cworICAgIDwvYT48L2gzPgorICAgIDxwPlZpZGVvcyBhbmQgcHJlc2VudGF0aW9uIHNsaWRlcyBmcm9tIGRldmVsb3BlciBldmVudHMsIGFsb25nIHdpdGgKKyAgICBzY3JlZW5jYXN0cyB0byB3YWxrIHlvdSB0aHJvdWdoIGNvbW1vbiBBbmRyb2lkIGRldmVsb3BtZW50CisgICAgd29ya2Zsb3dzLjwvcD4KKyAgPC90ZD4gLS0+Cis8L3RyPgorPC90YWJsZT4KKworPGgyPk90aGVyIFJlc291cmNlczwvaDI+CisKIDxkbD4KLTxkdD48Yj5UZWNobmljYWwgQXJ0aWNsZXM8L2I+PC9kdD4KLTxkZD5Gb2N1c2VkIGRpc2N1c3Npb25zIGFib3V0IEFuZHJvaWQgZGV2ZWxvcG1lbnQgc3ViamVjdHMsIGluY2x1ZGluZwotb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLAotYW5kIHNvIG9uLiBNb3N0IG9mIHRoZSBhcnRpY2xlcyBwcm92aWRlICJob3ctdG8iIGluc3RydWN0aW9ucyBmb3IgYWRkaW5nCi1mZWF0dXJlcyBvciBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgYXBwLiBUaGUgYXJ0aWNsZXMgYXJlIGRyYXduIGZyb20gcG9zdHMgdG8gdGhlCi1BbmRyb2lkIERldmVsb3BlcnMgQmxvZy4KLTwvZGQ+Ci0KLTxkdD48Yj5UdXRvcmlhbHM8L2I+PC9kdD4KLTxkZD5TdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zIGRlbW9uc3RyYXRpbmcgaG93IHRvIGJ1aWxkIGFuIEFuZHJvaWQgYXBwbGljYXRpb24KLXRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC4gPC9kZD4KLQotPGR0PjxiPlNhbXBsZSBDb2RlPC9iPjwvZHQ+Ci08ZGQ+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gbG9vayBhdCBvciBidWlsZCBhbmQgcnVuLAotdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKLXRlY2huaXF1ZXMgdGhhdCB5b3UgZmluZCBpbiB0aGUgc2FtcGxlcyE8L2RkPgotCiA8ZHQ+PGI+Q29tbXVuaXR5PC9iPjwvZHQ+CiA8ZGQ+TGlua3MgdG8gdGhlIEFuZHJvaWQgZGlzY3Vzc2lvbiBncm91cHMgYW5kIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIHdheXMgdG8KIGNvbGxhYm9yYXRlIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4gPC9kZD4KIAorPGR0PjxiPkRldmljZSBEYXNoYm9hcmQ8L2I+PC9kdD4KKzxkZD5EZXZpY2UgZGlzdHJpYnV0aW9uIGRhdGEsIGdyb3VwZWQgYnkgdmFyaW91cyBkaW1lbnNpb25zIHN1Y2ggYXMgc2NyZWVuIHNpemUKK2FuZCBBbmRyb2lkIHBsYXRmb3JtIHZlcnNpb24uIDwvZGQ+CisKIDxkdD48Yj5Nb3JlPC9iPjwvZHQ+CiA8ZGQ+UXVpY2sgZGV2ZWxvcG1lbnQgdGlwcywgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uLCBhbmQgZnJlcXVlbnRseSBhc2tlZAogcXVlc3Rpb25zIChGQVFzKS4gPC9kZD4KIDwvZGw+Ci0KLTxwPlRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiIHRhYiB3aGlsZSBhbnkKLVJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4gPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmUwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCkBAIC0wLDAgKzEsNjIyIEBACit2YXIgQU5EUk9JRF9UQUdTID0geworICB0eXBlOiB7CisgICAgJ2FydGljbGUnOiAnQXJ0aWNsZScsCisgICAgJ3R1dG9yaWFsJzogJ1R1dG9yaWFsJywKKyAgICAnc2FtcGxlJzogJ1NhbXBsZScsCisgICAgJ3ZpZGVvJzogJ1ZpZGVvJywKKyAgICAnbGlicmFyeSc6ICdDb2RlIExpYnJhcnknCisgIH0sCisgIHRvcGljOiB7CisgICAgJ2FjY2Vzc2liaWxpdHknOiAnQWNjZXNzaWJpbGl0eScsCisgICAgJ2FjY291bnRzeW5jJzogJ0FjY291bnRzICZhbXA7IFN5bmMnLAorICAgICdiZXN0cHJhY3RpY2UnOiAnQmVzdCBQcmFjdGljZXMnLAorICAgICdjb21tdW5pY2F0aW9uJzogJ0NvbW11bmljYXRpb24nLAorICAgICdjb21wYXRpYmlsaXR5JzogJ0NvbXBhdGliaWxpdHknLAorICAgICdkYXRhJzogJ0RhdGEgQWNjZXNzJywKKyAgICAnZHJhd2luZyc6ICdDYW52YXMgRHJhd2luZycsCisgICAgJ2dhbWVkZXYnOiAnR2FtZSBEZXZlbG9wbWVudCcsCisgICAgJ2dsJzogJ09wZW5HTCBFUycsCisgICAgJ2lucHV0JzogJ0lucHV0IE1ldGhvZHMnLAorICAgICdpbnRlbnQnOiAnSW50ZW50cycsCisgICAgJ2xheW91dCc6ICdMYXlvdXRzL1ZpZXdzJywKKyAgICAnbWVkaWEnOiAnTXVsdGltZWRpYScsCisgICAgJ25ld2ZlYXR1cmUnOiAnTmV3IEZlYXR1cmVzJywKKyAgICAncGVyZm9ybWFuY2UnOiAnUGVyZm9ybWFuY2UnLAorICAgICdzZWFyY2gnOiAnU2VhcmNoJywKKyAgICAndGVzdGluZyc6ICdUZXN0aW5nJywKKyAgICAndWknOiAnVXNlciBJbnRlcmZhY2UnLAorICAgICd3ZWInOiAnV2ViIENvbnRlbnQnCisgIH0sCisgIG1pc2M6IHsKKyAgICAnZXh0ZXJuYWwnOiAnRXh0ZXJuYWwnLAorICAgICduZXcnOiAnTmV3JworICB9Cit9OworCit2YXIgQU5EUk9JRF9SRVNPVVJDRVMgPSBbCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVEVDSE5JQ0FMIEFSVElDTEVTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQXZvaWRpbmcgTWVtb3J5IExlYWtzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTW9iaWxlIGRldmljZXMgb2Z0ZW4gaGF2ZSBsaW1pdGVkIG1lbW9yeSwgYW5kIG1lbW9yeSBsZWFrcyBjYW4gY2F1c2UgeW91ciBhcHBsaWNhdGlvbiB0byB3YXN0ZSB0aGlzIHZhbHVhYmxlIHJlc291cmNlIHdpdGhvdXQgeW91ciBrbm93bGVkZ2UuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyB0aXBzIHRvIGhlbHAgeW91IGF2b2lkIGNvbW1vbiBjYXVzZXMgb2YgbWVtb3J5IGxlYWtzIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0JhY2t3YXJkIENvbXBhdGliaWxpdHknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgQW5kcm9pZCBwbGF0Zm9ybSBzdHJpdmVzIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSG93ZXZlciwgc29tZXRpbWVzIHlvdSB3YW50IHRvIHVzZSBuZXcgZmVhdHVyZXMgd2hpY2ggYXJlblwndCBzdXBwb3J0ZWQgb24gb2xkZXIgcGxhdGZvcm1zLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIHN0cmF0ZWdpZXMgZm9yIHNlbGVjdGl2ZWx5IHVzaW5nIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIGF2YWlsYWJpbGl0eSwgYWxsb3dpbmcgeW91IHRvIGtlZXAgeW91ciBhcHBsaWNhdGlvbnMgcG9ydGFibGUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDYW4gSSBVc2UgdGhpcyBJbnRlbnQ/JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW5kcm9pZCBvZmZlcnMgYSB2ZXJ5IHBvd2VyZnVsIGFuZCB5ZXQgZWFzeS10by11c2UgbWVzc2FnZSB0eXBlIGNhbGxlZCBhbiBpbnRlbnQuIFlvdSBjYW4gdXNlIGludGVudHMgdG8gdHVybiBhcHBsaWNhdGlvbnMgaW50byBoaWdoLWxldmVsIGxpYnJhcmllcyBhbmQgbWFrZSBjb2RlIG1vZHVsYXIgYW5kIHJldXNhYmxlLiBXaGlsZSBpdCBpcyBuaWNlIHRvIGJlIGFibGUgdG8gbWFrZSB1c2Ugb2YgYSBsb29zZWx5IGNvdXBsZWQgQVBJLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgaW50ZW50IHlvdSBzZW5kIHdpbGwgYmUgcmVjZWl2ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBhIHRlY2huaXF1ZSB5b3UgY2FuIHVzZSB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBzeXN0ZW0gY29udGFpbnMgYW55IGFwcGxpY2F0aW9uIGNhcGFibGUgb2YgcmVzcG9uZGluZyB0byB0aGUgaW50ZW50IHlvdSB3YW50IHRvIHVzZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDcmVhdGluZyBhbiBJbnB1dCBNZXRob2QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbnB1dCBNZXRob2QgRWRpdG9ycyAoSU1FcykgcHJvdmlkZSB0aGUgbWVjaGFuaXNtIGZvciBlbnRlcmluZyB0ZXh0IGludG8gdGV4dCBmaWVsZHMgYW5kIG90aGVyIFZpZXdzLiBBbmRyb2lkIGRldmljZXMgY29tZSBidW5kbGVkIHdpdGggYXQgbGVhc3Qgb25lIElNRSwgYnV0IHVzZXJzIGNhbiBpbnN0YWxsIGFkZGl0aW9uYWwgSU1Fcy4gVGhpcyBhcnRpY2xlIGNvdmVycyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYW4gSU1FIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2RyYXdpbmcnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0RyYXdhYmxlIE11dGF0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RyYXdhYmxlcyBhcmUgcGx1Z2dhYmxlIGRyYXdpbmcgY29udGFpbmVycyB0aGF0IGFsbG93IGFwcGxpY2F0aW9ucyB0byBkaXNwbGF5IGdyYXBoaWNzLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgc29tZSBjb21tb24gcGl0ZmFsbHMgd2hlbiB0cnlpbmcgdG8gbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlIERyYXdhYmxlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2Jlc3RwcmFjdGljZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mYXN0ZXItc2NyZWVuLW9yaWVudGF0aW9uLWNoYW5nZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdGYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1doZW4gYW4gQW5kcm9pZCBkZXZpY2UgY2hhbmdlcyBpdHMgb3JpZW50YXRpb24sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGF1dG9tYXRpY2FsbHkgcmVzdGFydCB0aGUgY3VycmVudCBhY3Rpdml0eSB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIHRoaXMgY2FuIGJlY29tZSBhIGJvdHRsZW5lY2sgaW4gYXBwbGljYXRpb25zIHRoYXQgYWNjZXNzIGEgbGFyZ2UgYW1vdW50IG9mIGV4dGVybmFsIGRhdGEuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGdyYWNlZnVsbHkgaGFuZGxlIHRoaXMgc2l0dWF0aW9uIHdpdGhvdXQgcmVzb3J0aW5nIHRvIG1hbnVhbGx5IHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRnV0dXJlLVByb29maW5nIFlvdXIgQXBwcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgY29sbGVjdGlvbiBvZiBjb21tb24gc2Vuc2UgYWR2aWNlIHRvIGhlbHAgeW91IGVuc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb25zIGRvblwndCBicmVhayB3aGVuIG5ldyB2ZXJzaW9ucyBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhcmUgcmVsZWFzZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nZXN0dXJlcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdHZXN0dXJlcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RvdWNoIHNjcmVlbnMgYWxsb3cgdXNlcnMgdG8gcGVyZm9ybSBnZXN0dXJlcywgc3VjaCBhcyB0YXBwaW5nLCBkcmFnZ2luZywgZmxpbmdpbmcsIG9yIHNsaWRpbmcsIHRvIHBlcmZvcm0gdmFyaW91cyBhY3Rpb25zLiBUaGUgZ2VzdHVyZXMgQVBJIGVuYWJsZXMgeW91ciBhcHBsaWNhdGlvbiB0byByZWNvZ25pemUgZXZlbiBjb21wbGljYXRlZCBnZXN0dXJlcyB3aXRoIGVhc2UuIFRoaXMgYXJ0aWNsZSBleHBsYWlucyBob3cgdG8gaW50ZWdyYXRlIHRoaXMgQVBJIGludG8gYW4gYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdnYW1lZGV2JywgJ2dsJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSW50cm9kdWNpbmcgR0xTdXJmYWNlVmlldycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBHTFN1cmZhY2VWaWV3LCBhIGNsYXNzIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgMkQgb3IgM0QgT3BlbkdMIHJlbmRlcmluZyBpbnNpZGUgb2YgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXJldXNlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIFJldXNhYmxlIFVJIENvbXBvbmVudHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gY29tYmluZSBtdWx0aXBsZSBzdGFuZGFyZCBVSSB3aWRnZXRzIGludG8gYSBzaW5nbGUgaGlnaC1sZXZlbCBjb21wb25lbnQsIHdoaWNoIGNhbiBiZSByZXVzZWQgdGhyb3VnaG91dCB5b3VyIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogQ3JlYXRpbmcgRWZmaWNpZW50IExheW91dHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gb3B0aW1pemUgYXBwbGljYXRpb24gbGF5b3V0cyBhcyB0aGlzIGFydGljbGUgd2Fsa3MgeW91IHRocm91Z2ggY29udmVydGluZyBhIExpbmVhckxheW91dCBpbnRvIGEgUmVsYXRpdmVMYXlvdXQsIGFuZCBhbmFseXplcyB0aGUgcmVzdWx0aW5nIGltcGxpY2F0aW9ucyBvbiBwZXJmb3JtYW5jZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBVc2luZyBWaWV3U3R1YnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCB1c2luZyBWaWV3U3R1YnMgaW5zaWRlIGFuIGFwcGxpY2F0aW9uXCdzIGxheW91dCBpbiBvcmRlciB0byBpbmZsYXRlIHJhcmVseSB1c2VkIFVJIGVsZW1lbnRzLCB3aXRob3V0IHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSB1c2luZyB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiB0YWcuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogTWVyZ2luZyBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIHVzZSB0aGUgPGNvZGU+Jmx0O21lcmdlJmd0OzwvY29kZT4gdGFnIGluIHlvdXIgWE1MIGxheW91dHMgaW4gb3JkZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbGV2ZWxzIG9mIGhpZXJhcmNoeSB3aXRoaW4gYW4gYXBwbGljYXRpb25cJ3MgdmlldyB0cmVlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGlzdHZpZXctYmFja2dyb3VuZHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGlzdFZpZXcgQmFja2dyb3VuZHM6IEFuIE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpc3RWaWV3cyBhcmUgdmVyeSBwb3B1bGFyIHdpZGdldHMgd2l0aGluIHRoZSBBbmRyb2lkIGZyYW1ld29yay4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBvcHRpbWl6YXRpb25zIHVzZWQgYnkgdGhlIExpc3RWaWV3IHdpZGdldCwgYW5kIGhvdyB0byBhdm9pZCBzb21lIGNvbW1vbiBpc3N1ZXMgdGhhdCB0aGlzIGNhdXNlcyB3aGVuIHRyeWluZyB0byB1c2UgYSBjdXN0b20gYmFja2dyb3VuZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycyBhbGxvdyB1c2VycyB0byBkaXNwbGF5IGFueSBzb3VyY2Ugb2YgZGF0YSBvbiB0aGVpciBob21lIHNjcmVlbiB3aXRob3V0IGxhdW5jaGluZyBhbiBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gZXhwb3J0IGFuIGFwcGxpY2F0aW9uXCdzIGRhdGEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRpc3BsYXkgaW5zaWRlIG9mIGEgbGl2ZSBmb2xkZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIHdhbGxwYXBlcnMgYXJlIHJpY2hlciwgYW5pbWF0ZWQsIGludGVyYWN0aXZlIGJhY2tncm91bmRzIHRoYXQgdXNlcnMgY2FuIGRpc3BsYXkgaW4gdGhlaXIgaG9tZSBzY3JlZW5zLiBMZWFybiBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ09uc2NyZWVuIElucHV0IE1ldGhvZHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgSW5wdXQgTWV0aG9kIEZyYW1ld29yayAoSU1GKSBhbGxvd3MgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygb24tc2NyZWVuIGlucHV0IG1ldGhvZHMsIHN1Y2ggYXMgc29mdHdhcmUga2V5Ym9hcmRzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIGFuZCBob3cgYXBwbGljYXRpb25zIGludGVyYWN0IHdpdGggdGhlbS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUGFpbmxlc3MgVGhyZWFkaW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyB0aGUgdGhyZWFkaW5nIG1vZGVsIHVzZWQgYnkgQW5kcm9pZCBhcHBsaWNhdGlvbnMgYW5kIGhvdyBhcHBsaWNhdGlvbnMgY2FuIGVuc3VyZSBiZXN0IFVJIHBlcmZvcm1hbmNlIGJ5IHNwYXduaW5nIHdvcmtlciB0aHJlYWRzIHRvIGhhbmRsZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucywgcmF0aGVyIHRoYW4gaGFuZGxpbmcgdGhlbSBpbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBhcnRpY2xlIGFsc28gZXhwbGFpbnMgdGhlIEFQSSB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIEFuZHJvaWQgVUkgdG9vbGtpdCBjb21wb25lbnRzIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBzcGF3biBtYW5hZ2VkIHdvcmtlciB0aHJlYWRzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnc2VhcmNoJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3FzYi5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdRdWljayBTZWFyY2ggQm94JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCAoUVNCKSBpcyBhIHBvd2VyZnVsLCBzeXN0ZW0td2lkZSBzZWFyY2ggZnJhbWV3b3JrLiBRU0IgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzIHRvIHF1aWNrbHkgYW5kIGVhc2lseSBmaW5kIHdoYXQgdGhleVwncmUgbG9va2luZyBmb3IsIGJvdGggb24gdGhlaXIgZGV2aWNlcyBhbmQgb24gdGhlIHdlYi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gd29yayB3aXRoIHRoZSBRU0IgZnJhbWV3b3JrIHRvIGFkZCBuZXcgc2VhcmNoIHJlc3VsdHMgZm9yIGFuIGluc3RhbGxlZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVG91Y2ggTW9kZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgdG91Y2ggbW9kZSwgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwcmluY2lwbGVzIG9mIEFuZHJvaWRcJ3MgVUkgdG9vbGtpdC4gV2hlbmV2ZXIgYSB1c2VyIGludGVyYWN0cyB3aXRoIGEgZGV2aWNlXCdzIHRvdWNoIHNjcmVlbiwgdGhlIHN5c3RlbSBlbnRlcnMgdG91Y2ggbW9kZS4gV2hpbGUgc2ltcGxlIGluIGNvbmNlcHQsIHRoZXJlIGFyZSBpbXBvcnRhbnQgaW1wbGljYXRpb25zIHRvdWNoIG1vZGUgdGhhdCBhcmUgb2Z0ZW4gb3Zlcmxvb2tlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90cmFjay1tZW0uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gdXNlIHRoZSBBbGxvY2F0aW9uIFRyYWNrZXIgdG9vbCB0byBvYnNlcnZlIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgYXZvaWQgcGVyZm9ybWFuY2UgcHJvYmxlbXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgY2F1c2VkIGJ5IGlnbm9yaW5nIHRoZSBlZmZlY3Qgb2YgRGFsdmlrXCdzIGdhcmJhZ2UgY29sbGVjdG9yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS41LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuMCBhbmQgMS4xLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjYuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjYnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS42LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuNS4gSW4gcGFydGljdWxhciwgdGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBjaGFuZ2VzIHRvIFJlbGF0aXZlTGF5b3V0cyBhbmQgY2xpY2sgbGlzdGVuZXJzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGFib3V0IGhvdyB0byB1c2UgSGFuZGxlcnMgYXMgYSBtb3JlIGVmZmljaWVudCByZXBsYWNlbWVudCBmb3IgamF2YS51dGlsLlRpbWVyIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYWNjZXNzaWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90dHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgVGV4dC10by1TcGVlY2gnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGV4dC10by1zcGVlY2ggQVBJIGxldHMgeW91ciBhcHBsaWNhdGlvbiAic3BlYWsiIHRvIHVzZXJzLCBpbiBhbnkgb2Ygc2V2ZXJhbCBsYW5ndWFnZXMuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgVFRTIEFQSSBhbmQgaG93IHlvdSB1c2UgdG8gYWRkIHNwZWVjaCBjYXBhYmlsaXRpZXMgdG8geW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3dlYiddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVc2luZyBXZWJWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1dlYlZpZXdzIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGR5bmFtaWNhbGx5IGRpc3BsYXkgSFRNTCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LCB3aXRob3V0IHJlbGlucXVpc2hpbmcgY29udHJvbCB0byBhIHNlcGFyYXRlIGJyb3dzZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIHRoZSBXZWJWaWV3IGNsYXNzZXMgYW5kIHByb3ZpZGVzIGEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IExpbmtpZnkgeW91ciBUZXh0IScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIFdpa2lOb3RlcyBmb3IgQW5kcm9pZCwgcGFydCBvZiB0aGUgQXBwcyBmb3IgQW5kcm9pZCBwcm9qZWN0LiBJdCBjb3ZlcnMgdGhlIHVzZSBvZiBMaW5raWZ5IHRvIHR1cm4gb3JkaW5hcnkgdGV4dCB2aWV3cyBpbnRvIHJpY2hlciwgbGluay1vcmllbnRlZCBjb250ZW50IHRoYXQgY2F1c2VzIEFuZHJvaWQgaW50ZW50cyB0byBmaXJlIHdoZW4gYSBsaW5rIGlzIHNlbGVjdGVkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa2lOb3RlczogUm91dGluZyBJbnRlbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGlsbHVzdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiwgaW4gdGhpcyBjYXNlIHRoZSBXaWtpTm90ZXMgc2FtcGxlIGFwcCwgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIHZhcmlvdXMgdHlwZXMgb2YgbGlua2VkIHRleHQgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgaGFuZGxlcyB0aGF0IHR5cGUgb2YgZGF0YS4gRm9yIGV4YW1wbGUsIGFuIGFwcCBjYW4gdXNlIGludGVudHMgdG8gcm91dGUgYSBsaW5rZWQgdGVsZXBob25lIG51bWJlciB0byBhIGRpYWxlciBhcHAgYW5kIGEgd2ViIFVSTCB0byBhIGJyb3dzZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdwZXJmb3JtYW5jZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2luZG93IEJhY2tncm91bmRzICYgVUkgU3BlZWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdTb21lIEFuZHJvaWQgYXBwbGljYXRpb25zIG5lZWQgdG8gc3F1ZWV6ZSBldmVyeSBiaXQgb2YgcGVyZm9ybWFuY2Ugb3V0IG9mIHRoZSBVSSB0b29sa2l0IGFuZCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIGRvIHNvLiBJbiB0aGlzIGFydGljbGUsIHlvdSB3aWxsIGRpc2NvdmVyIGhvdyB0byBzcGVlZCB1cCB0aGUgZHJhd2luZyBhbmQgdGhlIHBlcmNlaXZlZCBzdGFydHVwIHRpbWUgb2YgeW91ciBhY3Rpdml0aWVzLiBCb3RoIG9mIHRoZXNlIHRlY2huaXF1ZXMgcmVseSBvbiBhIHNpbmdsZSBmZWF0dXJlLCB0aGUgd2luZG93XCdzIGJhY2tncm91bmQgZHJhd2FibGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWmlwYWxpZ246IGFuIEVhc3kgT3B0aW1pemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgU0RLIGluY2x1ZGVzIGEgdG9vbCBjYWxsZWQgemlwYWxpZ24gdGhhdCBvcHRpbWl6ZXMgdGhlIHdheSBhbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZC4gUnVubmluZyB6aXBhbGlnbiBhZ2FpbnN0IHlvdXIgYXBwbGljYXRpb24gZW5hYmxlcyBBbmRyb2lkIHRvIGludGVyYWN0IHdpdGggaXQgbW9yZSBlZmZpY2llbnRseSBhdCBydW4gdGltZSBhbmQgdGh1cyBoYXMgdGhlIHBvdGVudGlhbCB0byBtYWtlIGl0IGFuZCB0aGUgb3ZlcmFsbCBzeXN0ZW0gcnVuIGZhc3Rlci4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiB0aGUgemlwYWxpZ24gdG9vbCBhbmQgaXRzIHVzZS4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gU0FNUExFIENPREUgLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FQSSBEZW1vcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkZW1vbnN0cmF0ZSBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZiBmcmFtZXdvcmsgdG9waWNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJywgJ25ld2ZlYXR1cmUnLCAnYWNjb3VudHN5bmMnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrdXAgYW5kIFJlc3RvcmUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbGx1c3RyYXRlcyBhIGZldyBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGRldmVsb3BlciBjYW4gdGFrZSB3aGVuIGludGVncmF0aW5nIHdpdGggdGhlIEFuZHJvaWQgQmFja3VwIE1hbmFnZXIgdXNpbmcgdGhlIEJhY2t1cEFnZW50IEFQSSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdjb21tdW5pY2F0aW9uJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCbHVldG9vdGggQ2hhdCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciB0d28td2F5IHRleHQgbWVzc2FnaW5nIG92ZXIgQmx1ZXRvb3RoLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCdXNpbmVzc0NhcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gbGF1bmNoIHRoZSBidWlsdC1pbiBjb250YWN0IHBpY2tlciBmcm9tIHdpdGhpbiBhbiBhY3Rpdml0eS4gVGhpcyBzYW1wbGUgYWxzbyB1c2VzIHJlZmxlY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgY29udGFjdHMgQVBJIGlzIHVzZWQsIGRlcGVuZGluZyBvbiB3aGljaCBBUEkgbGV2ZWwgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ29udGFjdCBNYW5hZ2VyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHF1ZXJ5IHRoZSBzeXN0ZW0gY29udGFjdHMgcHJvdmlkZXIgIHVzaW5nIHRoZSA8Y29kZT5Db250YWN0c0NvbnRyYWN0PC9jb2RlPiBBUEksIGFzIHdlbGwgYXMgaW5zZXJ0IGNvbnRhY3RzIGludG8gYSBzcGVjaWZpYyBhY2NvdW50LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0hvbWUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSG9tZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgaG9tZSBzY3JlZW4gcmVwbGFjZW1lbnQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9KZXRCb3kvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSmV0Qm95JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBnYW1lIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBTT05pVk9YIEpFVCBpbnRlcmFjdGl2ZSBtdXNpYyB0ZWNobm9sb2d5LCB3aXRoIDxjb2RlPjxhIGhyZWY9Ii9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9KZXRQbGF5ZXIuaHRtbCI+SmV0UGxheWVyPC9hPjwvY29kZT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYSBsaXZlIHdhbGxwYXBlciBhbmQgIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMdW5hciBMYW5kZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNsYXNzaWMgTHVuYXIgTGFuZGVyIGdhbWUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTXVsdGlwbGUgUmVzb2x1dGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IHNob3dzIGhvdyB0byB1c2UgcmVzb3VyY2UgZGlyZWN0b3J5IHF1YWxpZmllcnMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVzb3VyY2VzIGZvciBkaWZmZXJlbnQgc2NyZWVuIGNvbmZpZ3VyYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTm90ZVBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlIFBhZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciBzYXZpbmcgbm90ZXMuIFNpbWlsYXIgKGJ1dCBub3QgaWRlbnRpY2FsKSB0byB0aGUgPGEgaHJlZj0iL3Jlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sIj5Ob3RlcGFkIHR1dG9yaWFsPC9hPi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTYW1wbGVTeW5jQWRhcHRlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIGNvbW11bmljYXRlIHdpdGggYSBjbG91ZC1iYXNlZCBzZXJ2aWNlIGFuZCBzeW5jaHJvbml6ZSBpdHMgZGF0YSB3aXRoIGRhdGEgc3RvcmVkIGxvY2FsbHkgaW4gYSBjb250ZW50IHByb3ZpZGVyLiBUaGUgc2FtcGxlIHVzZXMgdHdvIHJlbGF0ZWQgcGFydHMgb2YgdGhlIEFuZHJvaWQgZnJhbWV3b3JrICZtZGFzaDsgdGhlIGFjY291bnQgbWFuYWdlciBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBtYW5hZ2VyICh0aHJvdWdoIGEgc3luYyBhZGFwdGVyKS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknLCAnc2VhcmNoJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NlYXJjaGFibGUgRGljdGlvbmFyeSB2MicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIEFuZHJvaWRcJ3Mgc2VhcmNoIGZyYW1ld29yaywgaW5jbHVkaW5nIGhvdyB0byBwcm92aWRlIHNlYXJjaCBzdWdnZXN0aW9ucyBmb3IgUXVpY2sgU2VhcmNoIEJveC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU25ha2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xhc3NpYyBnYW1lICJTbmFrZS4iJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTcGlubmVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgYW4gYXBwbGljYXRpb24gdW5kZXIgdGVzdCBmb3IgdGhlIFNwaW5uZXJUZXN0IGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lclRlc3QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IFRlc3RpbmcgdHV0b3JpYWwuIEl0IHRlc3RzIHRoZSBTcGlubmVyIGV4YW1wbGUgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RpY1RhY1RvZUxpYicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QsIGEgdHlwZSBvZiBwcm9qZWN0IHRoYXQgbGV0cyB5b3Ugc3RvcmUgYW5kIG1hbmFnZSBzaGFyZWQgY29kZSBhbmQgcmVzb3VyY2VzIGluIG9uZSBwbGFjZSwgdGhlbiBtYWtlIHRoZW0gYXZhaWxhYmxlIHRvIHlvdXIgb3RoZXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VNYWluJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRGVtb25zdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiBjYW4gbWFrZSB1c2Ugb2Ygc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBzdG9yZWQgaW4gYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU29mdEtleWJvYXJkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NvZnQgS2V5Ym9hcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gaW5wdXQgbWV0aG9kIGZvciBhIHNvZnR3YXJlIGtleWJvYXJkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lrdGlvbmFyeScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgY3JlYXRpbmcgaW50ZXJhY3RpdmUgd2lkZ2V0cyBmb3IgZGlzcGxheSBvbiB0aGUgQW5kcm9pZCBob21lIHNjcmVlbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnkgKFNpbXBsaWZpZWQpJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgQW5kcm9pZCBob21lIHNjcmVlbiB3aWRnZXRzIGV4YW1wbGUuJworICAgIH0KKyAgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyBUVVRPUklBTFMgLy8vCisvLy8vLy8vLy8vLy8vLy8vLworCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBXb3JsZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0JlZ2lubmluZyBiYXNpYyBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB3aXRoIHRoZSBBbmRyb2lkIFNESy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd1aScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3ZpZXdzL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFZpZXdzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSB3YWxrLXRocm91Z2ggb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGF5b3V0cyBhbmQgdmlld3MgYXZhaWxhYmxlIGluIHRoZSBBbmRyb2lkIFNESy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd1aScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL2xvY2FsaXphdGlvbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBMb2NhbGl6YXRpb24nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgYmFzaWNzIG9mIGxvY2FsaXppbmcgeW91ciBhcHBsaWNhdGlvbnMgZm9yIG11bHRpcGxlIGxhbmd1YWdlcyBhbmQgbG9jYWxlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICdkYXRhJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9ub3RlcGFkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ05vdGVwYWQgVHV0b3JpYWwnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIG11bHRpLXBhcnQgdHV0b3JpYWwgZGlzY3Vzc2luZyBpbnRlcm1lZGlhdGUtbGV2ZWwgY29uY2VwdHMgc3VjaCBhcyBkYXRhIGFjY2Vzcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBUZXN0aW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBiYXNpYyBpbnRyb2R1Y3Rpb24gdG8gdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdBY3Rpdml0eSBUZXN0aW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBtb3JlIGFkdmFuY2VkIGRlbW9uc3RyYXRpb24gb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsgYW5kIHRvb2xzLicKKyAgICB9CisgIH0KK107CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKaW5kZXggNTI2ODliNi4uYTE3MTFiNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcwpAQCAtMSw1ICsxLDU2IEBACiA8dWw+CiAgIDxsaT4KKyAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UZWNobmljYWwgUmVzb3VyY2VzPC9zcGFuPgorICAgIDwvaDI+CisgICAgPHVsPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9c2FtcGxlIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIENvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkJlaXNwaWVsY29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q8OzZGlnbyBkZSBlamVtcGxvPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5FeGVtcGxlIGRlIGNvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkNvZGljZSBkaSBlc2VtcGlvPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jgrXjg7Pjg5fjg6sg44Kz44O844OJPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi1zYW1wbGUtbGlzdCI+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2dldC5odG1sIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdldHRpbmcgdGhlIFNhbXBsZXM8L3NwYW4+CisgICAgICAgICAgICAgIDwvYT48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPWFydGljbGUiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BcnRpY2xlczwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi1hcnRpY2xlLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VHV0b3JpYWxzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5MZXJucHJvZ3JhbW1lPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5UdXRvcmlhbGVzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5EaWRhY3RpY2llbHM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkVzZXJjaXRhemlvbmk8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuODgeODpeODvOODiOODquOCouODqzwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtdHV0b3JpYWwtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3RvcGljcy5odG1sIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VG9waWNzPC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXRvcGljLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+CiAgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+Q29tbXVuaXR5PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImRlIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iZXMiPkNvbXVuaWRhZDwvc3Bhbj4KQEAgLTM0LDI0MSArODUsNiBAQAogICA8L2xpPjw/Y3MKICAgL2lmCiA/PgotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UZWNobmljYWwgQXJ0aWNsZXM8L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KLSAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3Qgb2YgQXJ0aWNsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgPC9hPjwvZGl2PgotICAgICAgICA8dWw+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvYXZvaWRpbmctbWVtb3J5LWxlYWtzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QXZvaWRpbmcgTWVtb3J5IExlYWtzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2JhY2t3YXJkLWNvbXBhdGliaWxpdHkuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CYWNrd2FyZCBDb21wYXRpYmlsaXR5PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNhbiBJIFVzZSB0aGlzIEludGVudD88L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY3JlYXRpbmctaW5wdXQtbWV0aG9kLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q3JlYXRpbmcgYW4gSW5wdXQgTWV0aG9kPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2RyYXdhYmxlLW11dGF0aW9ucy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkRyYXdhYmxlIE11dGF0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9mYXN0ZXItc2NyZWVuLW9yaWVudGF0aW9uLWNoYW5nZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkZhc3RlciBTY3JlZW4gT3JpZW50YXRpb24gQ2hhbmdlPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Z1dHVyZS1wcm9vZmluZy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkZ1dHVyZS1Qcm9vZmluZyBZb3VyIEFwcHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZ2VzdHVyZXMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXN0dXJlczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9nbHN1cmZhY2V2aWV3Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SW50cm9kdWNpbmcgR0xTdXJmYWNlVmlldzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXJldXNlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogUmV1c2luZyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1lZmZpY2llbmN5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogRWZmaWNpZW5jeTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXN0dWJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogVmlld1N0dWJzIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLW1lcmdlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogTWVyZ2luZyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGlzdHZpZXctYmFja2dyb3VuZHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0VmlldyBCYWNrZ3JvdW5kczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXZlLWZvbGRlcnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIEZvbGRlcnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBXYWxscGFwZXJzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL29uLXNjcmVlbi1pbnB1dHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5PbnNjcmVlbiBJbnB1dCBNZXRob2RzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlBhaW5sZXNzIFRocmVhZGluZzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9xc2IuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5RdWljayBTZWFyY2ggQm94PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3NwZWVjaC1pbnB1dC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwZWVjaCBJbnB1dDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90b3VjaC1tb2RlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VG91Y2ggTW9kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90cmFjay1tZW0uaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UcmFja2luZyBNZW1vcnkgQWxsb2NhdGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS41Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjU8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS42Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjY8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdGltZWQtdWktdXBkYXRlcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVwZGF0aW5nIHRoZSBVSSBmcm9tIGEgVGltZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdHRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgVGV4dC10by1TcGVlY2g8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY29udGFjdHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyB0aGUgQ29udGFjdHMgQVBJPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VzaW5nLXdlYnZpZXdzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgV2ViVmlld3M8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2lraW5vdGVzLWxpbmtpZnkuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWtpTm90ZXM6IExpbmtpZnkgeW91ciBUZXh0ITwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aWtpbm90ZXMtaW50ZW50cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa2lOb3RlczogUm91dGluZyBJbnRlbnRzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpbmRvdy1iZy1zcGVlZC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpbmRvdyBCYWNrZ3JvdW5kcyAmYW1wOyBVSSBTcGVlZDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy96aXBhbGlnbi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlppcGFsaWduOiBBbiBFYXN5IE9wdGltaXphdGlvbjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgIDwvbGk+Ci0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlR1dG9yaWFsczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+TGVybnByb2dyYW1tZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+VHV0b3JpYWxlczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RGlkYWN0aWNpZWxzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Fc2VyY2l0YXppb25pPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jg4Hjg6Xjg7zjg4jjg6rjgqLjg6s8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFdvcmxkPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFZpZXdzPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvbG9jYWxpemF0aW9uL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBMb2NhbGl6YXRpb248L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBUZXN0aW5nPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+Ci0gICAgICA8L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Tm90ZXBhZCBUdXRvcmlhbDwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QWN0aXZpdHkgVGVzdGluZzwvc3Bhbj48L2E+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotCi0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBDb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5CZWlzcGllbGNvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkPDs2RpZ28gZGUgZWplbXBsbzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXhlbXBsZSBkZSBjb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Db2RpY2UgZGkgZXNlbXBpbzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44K144Oz44OX44OrIOOCs+ODvOODiTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvZ2V0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXR0aW5nIHRoZSBTYW1wbGVzPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+Ci0gICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3Qgb2YgU2FtcGxlczwvc3Bhbj4KLSAgICAgICAgICAgICA8L2E+PC9kaXY+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQXBpRGVtb3MvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BUEkgRGVtb3M8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CYWNrdXBSZXN0b3JlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QmFja3VwIGFuZCBSZXN0b3JlPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJsdWV0b290aCBDaGF0PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQnVzaW5lc3NDYXJkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QnVzaW5lc3MgQ2FyZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0NvbnRhY3RNYW5hZ2VyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q29udGFjdCBNYW5hZ2VyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvSG9tZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhvbWU8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9KZXRCb3kvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5KZXRCb3k8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgV2FsbHBhcGVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkx1bmFyIExhbmRlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL011bHRpUmVzb2x1dGlvbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk11bHRpcGxlIFJlc29sdXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTm90ZVBhZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk5vdGUgUGFkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgU3luYyBBZGFwdGVyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TZWFyY2hhYmxlIERpY3Rpb25hcnkgdjI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TbmFrZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNuYWtlPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU29mdEtleWJvYXJkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U29mdCBLZXlib2FyZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NwaW5uZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGlubmVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TcGlubmVyVGVzdC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwaW5uZXJUZXN0PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VMaWIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UaWNUYWNUb2VMaWI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1RpY1RhY1RvZU1haW4vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UaWNUYWNUb2VNYWluPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9XaWt0aW9uYXJ5L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lrdGlvbmFyeTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnlTaW1wbGUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWt0aW9uYXJ5IChTaW1wbGlmaWVkKTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0KLQotCiAgIDxsaT4KICAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5Nb3JlPC9zcGFuPgogICAgIDwvaDI+CkBAIC0yOTcsOCArMTEzLDYgQEAKICAgICAgPC9saT4KICAgICA8L3VsPgogICA8L2xpPgotCi0KIDwvdWw+CiAKIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5NjBmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkCkBAIC0wLDAgKzEsNzIgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlIFRvcGljcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZy1sZWZ0OiAxZW07CisgICAgd2lkdGg6IDE4ZW07CisgIH0KKworICAjcmVzb3VyY2UtdG9waWMtdGFibGUgdWwgeworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwOworICB9CisKKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIGxpIHsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICB9Cis8L3N0eWxlPgorCis8cD4KK1lvdSBjYW4gYnJvd3NlIHRoZSBsaXN0IG9mIHRlY2huaWNhbCByZXNvdXJjZXMgYnkgdG9waWMgYnkgY2xpY2tpbmcgb24gdGhlCitsaW5rcyBiZWxvdy4gT3ZlciB0aW1lLCBhcyBtb3JlIHRvcGljcyBhcmUgYWRkZWQsIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUKK2xpc3QgYmVsb3cuCis8L3A+CisKKzxub3NjcmlwdD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+CisgICAgWW91IG11c3QgaGF2ZSBKYXZhU2NyaXB0IGVuYWJsZWQgdG8gdmlldyB0aGlzIHBhZ2UuIFJlc291cmNlcyBhcmUgYWxzbworICAgIGF2YWlsYWJsZSBvZmZsaW5lIGluIHRoZSBTREsuCisgIDwvcD4KKzwvbm9zY3JpcHQ+CisKKzx0YWJsZSBpZD0icmVzb3VyY2UtdG9waWMtdGFibGUiPgorICA8dHI+PC90cj4KKzwvdGFibGU+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKzwhLS0gCisoZnVuY3Rpb24oKSB7CisgIHZhciB0b3BpY3MgPSBbXTsKKyAgZm9yICh2YXIgdG9waWMgaW4gQU5EUk9JRF9UQUdTWyd0b3BpYyddKSB7CisgICAgdG9waWNzLnB1c2goe25hbWU6dG9waWMsdGl0bGU6QU5EUk9JRF9UQUdTWyd0b3BpYyddW3RvcGljXX0pOworICB9CisgIHRvcGljcy5zb3J0KGZ1bmN0aW9uKHgseSl7IHJldHVybiAoeC50aXRsZSA8IHkudGl0bGUpID8gLTEgOiAxOyB9KTsKKyAgdmFyIHRvcGljUGFyZW50ID0gbnVsbDsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3BpY3MubGVuZ3RoOyBpKyspIHsKKyAgICBpZiAodG9waWNQYXJlbnQgPT0gbnVsbCB8fCBpICUgMTAgPT0gMCkgeworICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbHVtbgorICAgICAgdG9waWNQYXJlbnQgPSAkKCd1bCcsICQoJzx0ZD48dWw+JykuYXBwZW5kVG8oJyNyZXNvdXJjZS10b3BpYy10YWJsZSB0cicpKTsKKyAgICB9CisKKyAgICB0b3BpY1BhcmVudC5hcHBlbmQoCisgICAgICAgICQoJzxsaT4nKS5hcHBlbmQoCisgICAgICAgICAgJCgnPGgzPicpLmFwcGVuZCgKKyAgICAgICAgICAgICQoJzxhPicpCisgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgdG9Sb290ICsgInJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPSIgKyB0b3BpY3NbaV0ubmFtZSkKKyAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKQorICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZW4nKQorICAgICAgICAgICAgICAgIC5odG1sKHRvcGljc1tpXS50aXRsZSkKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgfQorfSkoKTsKKy8vLS0+Cis8L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKaW5kZXggN2NhMzc0MS4uZTI2MWNmYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQpAQCAtMTcyLDYgKzE3MiwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gSUQgb2YgdGhpcyBiaXRtYXAuIFRoZSBnZW5lcmF0aW9uIElEIGNoYW5nZXMKKyAgICAgKiB3aGVuZXZlciB0aGUgYml0bWFwIGlzIG1vZGlmaWVkLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGVmZmljaWVudCB3YXkgdG8KKyAgICAgKiBjaGVjayBpZiBhIGJpdG1hcCBoYXMgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGdlbmVyYXRpb24gSUQgZm9yIHRoaXMgYml0bWFwLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRHZW5lcmF0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVHZW5lcmF0aW9uSWQobU5hdGl2ZUJpdG1hcCk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IG1ldGhvZHMgdGhhdCB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgYml0bWFwCiAgICAgICogaGFzIGFscmVhZHkgYmVlbiByZWN5Y2xlZC4KICAgICAgKi8KQEAgLTEwNDEsNiArMTA1NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCAyMzEzZjRjLi41Mzk0NTMwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSl9LiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQppbmRleCA3NmNkZTczLi4zYTBjMThjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC0xNiwxMSArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOwogCkBAIC01OSw2ICs1OCwxOCBAQAogICAgIHByaXZhdGUgaW50ICAgICAgICAgbVN1cmZhY2VGb3JtYXQ7CiAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRyYXdUZXh0UnVuIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisgICAgCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGFuIGVtcHR5IHJhc3RlciBjYW52YXMuIFVzZSBzZXRCaXRtYXAoKSB0byBzcGVjaWZ5IGEgYml0bWFwIHRvCiAgICAgICogZHJhdyBpbnRvLiAgVGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgaXMge0BsaW5rIEJpdG1hcCNERU5TSVRZX05PTkV9OwogICAgICAqIHRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgcmVwbGFjZWQgd2hlbiBhIHRhcmdldCBiaXRtYXAgaXMgc2V0IGZvciB0aGUKQEAgLTEwNiwxNiArMTE3LDMzIEBACiAgICAgICogCiAgICAgICogPHA+VGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgb2YgdGhlIGNhbnZhcyBpcyB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbAogICAgICAqIGRlbnNpdHkgb2YgYml0bWFwcyBhcyBwZXIge0BsaW5rIEJpdG1hcCNnZXREZW5zaXR5KCkgQml0bWFwLmdldERlbnNpdHkoKX0uCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdHJ1Y3RvciBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCiAgICAgcHVibGljIENhbnZhcyhHTCBnbCkgewogICAgICAgICBtTmF0aXZlQ2FudmFzID0gaW5pdEdMKCk7CiAgICAgICAgIG1HTCA9IGdsOwogICAgICAgICBtRGVuc2l0eSA9IEJpdG1hcC5nZXREZWZhdWx0RGVuc2l0eSgpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgQ2FudmFzIHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgd2hhdCB0eXBlIG9mIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgorICAgICAqIG1heSBvciBtYXkgbm90IGJlIHVzZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGRyYXdpbmcgb3BlcmF0aW9ucyBhcmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gbUdMICE9IG51bGw7CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgR0wgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbnZhcywgb3IgbnVsbCBpZiBpdCBpcyBub3QKICAgICAgKiBiYWNrZWQgYnkgR0wuCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIG5vdCBiZSBpbnZva2VkLgogICAgICAqLwogICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKICAgICAgICAgcmV0dXJuIG1HTDsKQEAgLTEyNSw2ICsxNTMsOCBAQAogICAgICAqIENhbGwgdGhpcyB0byBmcmVlIHVwIE9wZW5HTCByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIG9yIGFsbG9jYXRlZAogICAgICAqIG9uIGJlaGFsZiBvZiB0aGUgQ2FudmFzLiBBbnkgc3Vic2VxdWVudCBkcmF3aW5nIHdpdGggYSBHTC1iYWNrZWQgQ2FudmFzCiAgICAgICogd2lsbCBoYXZlIHRvIHJlY3JlYXRlIHRob3NlIHJlc291cmNlcy4KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZyZWVHbENhY2hlcygpIHsKICAgICAgICAgZnJlZUNhY2hlcygpOwpAQCAtMTU3LDggKzE4NywxMCBAQAogICAgICAqIFNldCB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBpZiB0aGlzIGNhbnZhcyBpcyBHTCBiYXNlZC4gSWYgaXQgaXMgbm90LAogICAgICAqIHRoaXMgbWV0aG9kIGlzIGlnbm9yZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICoKLSAgICAgKiAgQHBhcmFtIHdpZHRoICAgIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQKLSAgICAgKiAgQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0CisgICAgICogIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0CisgICAgICogIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIGlmIChtR0wgIT0gbnVsbCkgewpAQCAtNjIxLDcgKzY1MywxMSBAQAogICAgICAgICBFZGdlVHlwZShpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjQ2LDggKzEyODIsOCBAQAogICAgICAgICAgICAgKHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1OSw3ICsxMjk1LDEwIEBACiAgICAgICogQHBhcmFtIHkgICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGV4dCBiZWluZyBkcmF3bgogICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdXNlZCBmb3IgdGhlIHRleHQgKGUuZy4gY29sb3IsIHNpemUsIHN0eWxlKQogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpOworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIERyYXcgdGhlIHRleHQsIHdpdGggb3JpZ2luIGF0ICh4LHkpLCB1c2luZyB0aGUgc3BlY2lmaWVkIHBhaW50LgpAQCAtMTI3Nyw4ICsxMzE2LDggQEAKICAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjk5LDE2ICsxMzM4LDEwOCBAQAogICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAogICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKICAgICAgICAgICAgICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5kcmF3VGV4dCh0aGlzLCBzdGFydCwgZW5kLCB4LCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7CiAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgICAgIGRyYXdUZXh0KGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCAKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBydW4gb2YgYWxsIExUUiBvciBhbGwgUlRMIHRleHQsIHdpdGggc2hhcGluZy4gVGhpcyBkb2VzIG5vdCBydW4KKyAgICAgKiBiaWRpIG9uIHRoZSBwcm92aWRlZCB0ZXh0LCBidXQgcmVuZGVycyBpdCBhcyBhIHVuaWZvcm0gcmlnaHQtdG8tbGVmdCBvcgorICAgICAqIGxlZnQtdG8tcmlnaHQgcnVuLCBhcyBpbmRpY2F0ZWQgYnkgZGlyLiBBbGlnbm1lbnQgb2YgdGhlIHRleHQgaXMgYXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBQYWludCdzIFRleHRBbGlnbiB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBjb3VudCB0aGUgY291bnQgb2YgY2hhcnMgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGNvbnRleHRJbmRleCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuICBNdXN0IGJlCisgICAgICogICAgICAgICBubyBncmVhdGVyIHRoYW4gaW5kZXguCisgICAgICogQHBhcmFtIGNvbnRleHRDb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuCisgICAgICogICAgICAgICBDb250ZXhJbmRleCArIGNvbnRleHRDb3VudCBtdXN0IGJlIG5vIGxlc3MgdGhhbiBpbmRleAorICAgICAqICAgICAgICAgKyBjb3VudC4KKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJ1biBkaXJlY3Rpb24sIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9IG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0RJUkVDVElPTl9SVEx9LgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4dCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFpbnQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXI6ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICBjb250ZXh0SW5kZXgsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHJ1biBvZiBhbGwgTFRSIG9yIGFsbCBSVEwgdGV4dCwgd2l0aCBzaGFwaW5nLiBUaGlzIGRvZXMgbm90IHJ1bgorICAgICAqIGJpZGkgb24gdGhlIHByb3ZpZGVkIHRleHQsIGJ1dCByZW5kZXJzIGl0IGFzIGEgdW5pZm9ybSByaWdodC10by1sZWZ0IG9yCisgICAgICogbGVmdC10by1yaWdodCBydW4sIGFzIGluZGljYXRlZCBieSBkaXIuIEFsaWdubWVudCBvZiB0aGUgdGV4dCBpcyBhcworICAgICAqIGRldGVybWluZWQgYnkgdGhlIFBhaW50J3MgVGV4dEFsaWduIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIuIERhdGEgYmVmb3JlIHRoaXMgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGNvbnRleHQuCisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlbmRlci4gRGF0YSBhdCBvciBhZnRlciB0aGlzCisgICAgICogICAgICAgICAgICBwb3NpdGlvbiBjYW4gYmUgdXNlZCBmb3Igc2hhcGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcnVuIGRpcmVjdGlvbiwgZWl0aGVyIDAgZm9yIExUUiBvciAxIGZvciBSVEwuCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleHQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhaW50IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU1NSwxMCArMTY4NiwxOSBAQAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dChpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHQoaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0UnVuKGludCBuYXRpdmVDYW52YXMsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dFJ1bihpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQb3NUZXh0KGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgZmxvYXRbXSBwb3MsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKaW5kZXggZjU0OTkwMC4uYjMzNjk5NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQpAQCAtMzcsNyArMzcsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMSA9IDc7ICAgLy8hPCB1c2Ugd2l0aCBnZXRWYWx1ZXMvc2V0VmFsdWVzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFUlNQXzIgPSA4OyAgIC8vITwgdXNlIHdpdGggZ2V0VmFsdWVzL3NldFZhbHVlcwogCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWF0cml4CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDNlM2Y4N2IuLjg4ZmYwZTYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiAvKioKICAqIFRoZSBQYWludCBjbGFzcyBob2xkcyB0aGUgc3R5bGUgYW5kIGNvbG9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkcmF3CkBAIC0yNyw3ICsyNywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFpbnQgewogCi0gICAgLypwYWNrYWdlKi8gaW50ICAgICBtTmF0aXZlUGFpbnQ7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG1OYXRpdmVQYWludDsKKwogICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOwogICAgIHByaXZhdGUgTWFza0ZpbHRlciAgbU1hc2tGaWx0ZXI7CiAgICAgcHJpdmF0ZSBQYXRoRWZmZWN0ICBtUGF0aEVmZmVjdDsKQEAgLTM5LDYgKzQzLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgIG1IYXNDb21wYXRTY2FsaW5nOwogICAgIHByaXZhdGUgZmxvYXQgICAgICAgbUNvbXBhdFNjYWxpbmc7CiAgICAgcHJpdmF0ZSBmbG9hdCAgICAgICBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAvKiBwYWNrYWdlICovIGludCAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlW10gc1N0eWxlQXJyYXkgPSB7CiAgICAgICAgIFN0eWxlLkZJTEwsIFN0eWxlLlNUUk9LRSwgU3R5bGUuRklMTF9BTkRfU1RST0tFCkBAIC03Niw4ICs4MSwxMTYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QQUlOVF9GTEFHUyA9IERFVl9LRVJOX1RFWFRfRkxBRzsKIAogICAgIC8qKgotICAgICAqIFRoZSBTdHlsZSBzcGVjaWZpZXMgaWYgdGhlIHByaW1pdGl2ZSBiZWluZyBkcmF3biBpcyBmaWxsZWQsCi0gICAgICogc3Ryb2tlZCwgb3IgYm90aCAoaW4gdGhlIHNhbWUgY29sb3IpLiBUaGUgZGVmYXVsdCBpcyBGSUxMLgorICAgICAqIEJpZGkgZmxhZyB0byBzZXQgTFRSIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0xUUiA9IDB4MDsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBzZXQgUlRMIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX1JUTCA9IDB4MTsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBkZXRlY3QgcGFyYWdyYXBoIGRpcmVjdGlvbiB2aWEgaGV1cmlzdGljcywgZGVmYXVsdGluZyB0bworICAgICAqIExUUi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfREVGQVVMVF9MVFIgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gZGV0ZWN0IHBhcmFncmFwaCBkaXJlY3Rpb24gdmlhIGhldXJpc3RpY3MsIGRlZmF1bHRpbmcgdG8KKyAgICAgKiBSVEwuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0RFRkFVTFRfUlRMID0gMHgzOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIG92ZXJyaWRlIGRpcmVjdGlvbiB0byBhbGwgTFRSIChpZ25vcmUgYmlkaSkuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0ZPUkNFX0xUUiA9IDB4NDsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBvdmVycmlkZSBkaXJlY3Rpb24gdG8gYWxsIFJUTCAoaWdub3JlIGJpZGkpLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GT1JDRV9SVEwgPSAweDU7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIEJpZGkgZmxhZyB2YWx1ZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSURJX01BWF9GTEFHX1ZBTFVFID0gQklESV9GT1JDRV9SVEw7CisKKyAgICAvKioKKyAgICAgKiBNYXNrIGZvciBiaWRpIGZsYWdzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJRElfRkxBR19NQVNLID0gMHg3OworCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZ2V0VGV4dFJ1bkFkdmFuY2VzIGluZGljYXRpbmcgbGVmdC10by1yaWdodCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0xUUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBnZXRUZXh0UnVuQWR2YW5jZXMgaW5kaWNhdGluZyByaWdodC10by1sZWZ0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUlRMID0gMTsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYWZ0ZXIKKyAgICAgKiBvZmZzZXQgb3IgdGhlIGxpbWl0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BRlRFUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGF0IG9yIGFmdGVyCisgICAgICogdGhlIG9mZnNldCBvciB0aGUgbGltaXQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUX09SX0FGVEVSID0gMTsKKworICAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGJlZm9yZQorICAgICAqIG9mZnNldCBvciB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0JFRk9SRSA9IDI7CisKKyAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYXQgb3IgYmVmb3JlCisgICAgICogb2Zmc2V0IG9yIHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGdyZWF0ZXIuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVRfT1JfQkVGT1JFID0gMzsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byByZXR1cm4gb2Zmc2V0IGlmIHRoZSBjdXJzb3IgYXQgb2Zmc2V0CisgICAgICogaXMgdmFsaWQsIG9yIC0xIGlmIGl0IGlzbid0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUID0gNDsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gY3Vyc29yIG9wdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX09QVF9NQVhfVkFMVUUgPSBDVVJTT1JfQVQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU3R5bGUgc3BlY2lmaWVzIGlmIHRoZSBwcmltaXRpdmUgYmVpbmcgZHJhd24gaXMgZmlsbGVkLCBzdHJva2VkLCBvcgorICAgICAqIGJvdGggKGluIHRoZSBzYW1lIGNvbG9yKS4gVGhlIGRlZmF1bHQgaXMgRklMTC4KICAgICAgKi8KICAgICBwdWJsaWMgZW51bSBTdHlsZSB7CiAgICAgICAgIC8qKgpAQCAtOTMsNyArMjA2LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdlb21ldHJ5IGFuZCB0ZXh0IGRyYXduIHdpdGggdGhpcyBzdHlsZSB3aWxsIGJlIGJvdGggZmlsbGVkIGFuZAogICAgICAgICAgKiBzdHJva2VkIGF0IHRoZSBzYW1lIHRpbWUsIHJlc3BlY3RpbmcgdGhlIHN0cm9rZS1yZWxhdGVkIGZpZWxkcyBvbgotICAgICAgICAgKiB0aGUgcGFpbnQuCisgICAgICAgICAqIHRoZSBwYWludC4gVGhpcyBtb2RlIGNhbiBnaXZlIHVuZXhwZWN0ZWQgcmVzdWx0cyBpZiB0aGUgZ2VvbWV0cnkKKyAgICAgICAgICogaXMgb3JpZW50ZWQgY291bnRlci1jbG9ja3dpc2UuIFRoaXMgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkgdG8KKyAgICAgICAgICogZWl0aGVyIEZJTEwgb3IgU1RST0tFLgogICAgICAgICAgKi8KICAgICAgICAgRklMTF9BTkRfU1RST0tFICgyKTsKICAgICAgICAgCkBAIC0yMDgsNiArMzIzLDcgQEAKICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBwYWludC5tSGFzQ29tcGF0U2NhbGluZzsKICAgICAgICAgbUNvbXBhdFNjYWxpbmcgPSBwYWludC5tQ29tcGF0U2NhbGluZzsKICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSBwYWludC5tSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgbUJpZGlGbGFncyA9IHBhaW50Lm1CaWRpRmxhZ3M7CiAgICAgfQogCiAgICAgLyoqIFJlc3RvcmVzIHRoZSBwYWludCB0byBpdHMgZGVmYXVsdCBzZXR0aW5ncy4gKi8KQEAgLTIxNiw2ICszMzIsNyBAQAogICAgICAgICBzZXRGbGFncyhERUZBVUxUX1BBSU5UX0ZMQUdTKTsKICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBmYWxzZTsKICAgICAgICAgbUNvbXBhdFNjYWxpbmcgPSBtSW52Q29tcGF0U2NhbGluZyA9IDE7CisgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTIzOCw2ICszNTUsNyBAQAogICAgICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBzcmMubUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgICAgICAgICBtQ29tcGF0U2NhbGluZyAgICA9IHNyYy5tQ29tcGF0U2NhbGluZzsKICAgICAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gc3JjLm1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgbUJpZGlGbGFncyAgICAgID0gc3JjLm1CaWRpRmxhZ3M7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MiwxMCArMzcwLDMzIEBACiAgICAgICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IDEuMGYvZmFjdG9yOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCaWRpRmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtQmlkaUZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaWRpRmxhZ3MoaW50IGZsYWdzKSB7CisgICAgICAgIC8vIG9ubHkgZmxhZyB2YWx1ZSBpcyB0aGUgMy1iaXQgQklESSBjb250cm9sIHNldHRpbmcKKyAgICAgICAgZmxhZ3MgJj0gQklESV9GTEFHX01BU0s7CisgICAgICAgIGlmIChmbGFncyA+IEJJRElfTUFYX0ZMQUdfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYmlkaSBmbGFnOiAiICsgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIG1CaWRpRmxhZ3MgPSBmbGFnczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhaW50J3MgZmxhZ3MuIFVzZSB0aGUgRmxhZyBlbnVtIHRvIHRlc3QgZmxhZyB2YWx1ZXMuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwYWludCdzIGZsYWdzIChzZWUgZW51bXMgZW5kaW5nIGluIF9GbGFnIGZvciBiaXQgbWFza3MpCiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0RmxhZ3MoKTsKQEAgLTEyMzIsMTAgKzEzNzMsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAJVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgCWludCByZXN1bHQgPSBnZXRUZXh0V2lkdGhzKGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwotICAgIAlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4Miw2ICsxNDIzLDI4NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBjaGFyIGFycmF5IGluc3RlYWQgb2YgYQorICAgICAqIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRleHRSdW5BZHZhbmNlcyhTdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBmbG9hdFtdLCBpbnQpCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGNoYXJbXSBjaGFycywgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IGNvbnRleHRJbmRleCB8IGNvbnRleHRDb3VudCB8IGFkdmFuY2VzSW5kZXgKKyAgICAgICAgICAgICAgICB8IChpbmRleCAtIGNvbnRleHRJbmRleCkKKyAgICAgICAgICAgICAgICB8ICgoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSAtIChpbmRleCArIGNvdW50KSkKKyAgICAgICAgICAgICAgICB8IChjaGFycy5sZW5ndGggLSAoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSAoYWR2YW5jZXNJbmRleCArIGNvdW50KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgY2hhcnMsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgcmVzID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYWR2YW5jZXNJbmRleCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXMgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgbm90IHNpZ25pZmljYW50CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWQgdGhhdCB0YWtlcyBhIENoYXJTZXF1ZW5jZSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywKKyAgICAgICAgICAgIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXMoKFN0cmluZykgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHRSdW5BZHZhbmNlcyh0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQWR2YW5jZXMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgZmxvYXQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBydW4KKyAgICAgKiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQsIGFuZCBpZiBhZHZhbmNlcyBpcyBub3QgbnVsbCwgdGhlIGFkdmFuY2UKKyAgICAgKiBhc3NpZ25lZCB0byBlYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGphdmEgY2hhcnMpLgorICAgICAqCisgICAgICogPHA+VGhlIHRyYWlsaW5nIHN1cnJvZ2F0ZSBpbiBhIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyIGlzIGFzc2lnbmVkCisgICAgICogYW4gYWR2YW5jZSBvZiAwLiAgVGh1cyB0aGUgbnVtYmVyIG9mIHJldHVybmVkIGFkdmFuY2VzIGlzCisgICAgICogYWx3YXlzIGVxdWFsIHRvIGNvdW50LCBub3QgdG8gdGhlIG51bWJlciBvZiB1bmljb2RlIGNvZGVwb2ludHMKKyAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcnVuLgorICAgICAqCisgICAgICogPHA+SW4gdGhlIGNhc2Ugb2YgY29uanVuY3RzIG9yIGNvbWJpbmluZyBtYXJrcywgdGhlIHRvdGFsCisgICAgICogYWR2YW5jZSBpcyBhc3NpZ25lZCB0byB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIsIGFuZCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgYXNzaWduZWQgYW4gYWR2YW5jZSBvZiAwLgorICAgICAqCisgICAgICogPHA+VGhpcyBnZW5lcmF0ZXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZXMgb2YgZ2x5cGhzIGZvcgorICAgICAqIGNoYXJhY3RlcnMgaW4gYSByZW9yZGVyZWQgY2x1c3RlciBhcyB0aGUgd2lkdGggb2YgdGhlIGZpcnN0CisgICAgICogbG9naWNhbCBjaGFyYWN0ZXIgaW4gdGhlIGNsdXN0ZXIsIGFuZCAwIGZvciB0aGUgd2lkdGhzIG9mIGFsbAorICAgICAqIG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIGNsdXN0ZXIuICBJbiBlZmZlY3QsIHN1Y2ggY2x1c3RlcnMgYXJlCisgICAgICogdHJlYXRlZCBsaWtlIGNvbmp1bmN0cy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzaGFwaW5nIGJvdW5kcyBsaW1pdCB0aGUgYW1vdW50IG9mIGNvbnRleHQgYXZhaWxhYmxlCisgICAgICogb3V0c2lkZSBzdGFydCBhbmQgZW5kIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgYW5hbHlzaXMuCisgICAgICogVGhlc2UgYm91bmRzIHR5cGljYWxseSByZWZsZWN0IGNoYW5nZXMgaW4gYmlkaSBsZXZlbCBvciBmb250CisgICAgICogbWV0cmljcyBhY3Jvc3Mgd2hpY2ggc2hhcGluZyBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbWVhc3VyZQorICAgICAqIEBwYXJhbSBlbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPD0gc3RhcnQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBzaGFwaW5nIGNvbnRleHQsCisgICAgICogbXVzdCBiZSA+PSBlbmQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIGFkdmFuY2VzLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfQorICAgICAqIG9yIHtAbGluayAjRElSRUNUSU9OX1JUTH0KKyAgICAgKiBAcGFyYW0gYWR2YW5jZXMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZXMsIG11c3QgaGF2ZSByb29tIGZvciBhbGwgYWR2YW5jZXMsCisgICAgICogY2FuIGJlIG51bGwgaWYgb25seSB0b3RhbCBhZHZhbmNlIGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBhZHZhbmNlc0luZGV4IHRoZSBwb3NpdGlvbiBpbiBhZHZhbmNlcyBhdCB3aGljaCB0byBwdXQgdGhlCisgICAgICogYWR2YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgYXQgc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBhZHZhbmNlCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBhZHZhbmNlc0luZGV4IHwgKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKHN0YXJ0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gZW5kKQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKQorICAgICAgICAgICAgICAgIHwgKGFkdmFuY2VzID09IG51bGwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2VzLmxlbmd0aCAtIGFkdmFuY2VzSW5kZXggLSAoZW5kIC0gc3RhcnQpKSkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgIT0gRElSRUNUSU9OX0xUUiAmJiBmbGFncyAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZsYWdzIHZhbHVlOiAiICsgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSGFzQ29tcGF0U2NhbGluZykgeworICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgKGVuZCAtIHN0YXJ0KTsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2UgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgaW5zaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBydW4uICBUaGlzIGF2b2lkcyBwbGFjaW5nIHRoZQorICAgICAqIGN1cnNvciBiZXR3ZWVuIHN1cnJvZ2F0ZXMsIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGZvcm0gY29uanVuY3RzLAorICAgICAqIGJldHdlZW4gYmFzZSBjaGFyYWN0ZXJzIGFuZCBjb21iaW5pbmcgbWFya3MsIG9yIHdpdGhpbiBhIHJlb3JkZXJpbmcKKyAgICAgKiBjbHVzdGVyLgorICAgICAqCisgICAgICogPHA+Q29udGV4dFN0YXJ0IGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0ZXh0LgorICAgICAqIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dExlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoY2hhcltdIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGludCBjb250ZXh0RW5kID0gY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aDsKKyAgICAgICAgaWYgKCgoY29udGV4dFN0YXJ0IHwgY29udGV4dEVuZCB8IG9mZnNldCB8IChjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKG9mZnNldCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIG9mZnNldCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbmd0aCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoQ2hhclNlcXVlbmNlIHRleHQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpIHsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQ3Vyc29yKHRleHQudG9TdHJpbmcoKSwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmdldFRleHRSdW5DdXJzb3IoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgIGludCByZXN1bHQgPSBnZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoU3RyaW5nIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGgoKSAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhdGggKG91dGxpbmUpIGZvciB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICogTm90ZToganVzdCBsaWtlIENhbnZhcy5kcmF3VGV4dCwgdGhpcyB3aWxsIHJlc3BlY3QgdGhlIEFsaWduIHNldHRpbmcgaW4KICAgICAgKiB0aGUgcGFpbnQuCkBAIC0xNDA0LDYgKzE4MjMsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gd2lkdGhzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0V2lkdGhzKGludCBuYXRpdmVfb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBuYXRpdmVfb2JqZWN0LAorICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZsb2F0IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMoaW50IG5hdGl2ZV9vYmplY3QsCisgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKGludCBuYXRpdmVfb2JqZWN0LCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvcihpbnQgbmF0aXZlX29iamVjdCwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KTsKKwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwKICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBwYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsCkBAIC0xNDE0LDQgKzE4NDYsMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFJlY3QgYm91bmRzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZVBhaW50KTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKaW5kZXggMzkwNDIzNC4uMmVmMTY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCkBAIC01MywxMSArNTMsMTggQEAKICAgICAgICAgLyoqIFtTYSAqIERhLCBTYyAqIERjXSAqLwogICAgICAgICBNVUxUSVBMWSAgICAoMTQpLAogICAgICAgICAvKiogW1NhICsgRGEgLSBTYSAqIERhLCBTYyArIERjIC0gU2MgKiBEY10gKi8KLSAgICAgICAgU0NSRUVOICAgICAgKDE1KTsKKyAgICAgICAgU0NSRUVOICAgICAgKDE1KSwKKyAgICAgICAgLyoqIFNhdHVyYXRlKFMgKyBEKSAqLworICAgICAgICBBREQgICAgICAgICAoMTYpLAorICAgICAgICBPVkVSTEFZICAgICAoMTcpOwogCiAgICAgICAgIE1vZGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKaW5kZXggNmE3YjJkMS4uNGMxZDI0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKQEAgLTE2LDIxICsxNiwzMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CiAKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5OaW5lUGF0Y2g7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogLyoqCiAgKiBBIERyYXdhYmxlIGlzIGEgZ2VuZXJhbCBhYnN0cmFjdGlvbiBmb3IgInNvbWV0aGluZyB0aGF0IGNhbiBiZSBkcmF3bi4iICBNb3N0CkBAIC02NDUsNiArNjU0LDggQEAKICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgbXV0YWJsZSBEcmF3YWJsZSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGlzIGRyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgI2dldENvbnN0YW50U3RhdGUoKQogICAgICAqLwogICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzOwpAQCAtNzUwLDYgKzc2MSw4IEBACiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBTdGF0ZUxpc3REcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsZXZlbC1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExldmVsTGlzdERyYXdhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIm1pcG1hcCIpKSB7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBNaXBtYXBEcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsYXllci1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExheWVyRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidHJhbnNpdGlvbiIpKSB7CkBAIC03NzEsNyArNzg0LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiaW5zZXQiKSkgewogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgSW5zZXREcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJiaXRtYXAiKSkgewotICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoKTsKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKHIpOwogICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgKChCaXRtYXBEcmF3YWJsZSkgZHJhd2FibGUpLnNldFRhcmdldERlbnNpdHkoci5nZXREaXNwbGF5TWV0cmljcygpKTsKICAgICAgICAgICAgIH0KQEAgLTgwNiw2ICs4MTksOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlIHRoaXMgRHJhd2FibGUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKQEAgLTgxNCw2ICs4MzAsMTIgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSBhIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLwogICAgIHZvaWQgaW5mbGF0ZVdpdGhBdHRyaWJ1dGVzKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIFR5cGVkQXJyYXkgYXR0cnMsIGludCB2aXNpYmxlQXR0cikKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC04MjEsMTIgKzg0MywyNyBAQAogICAgICAgICBtVmlzaWJsZSA9IGF0dHJzLmdldEJvb2xlYW4odmlzaWJsZUF0dHIsIG1WaXNpYmxlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIERyYXdhYmxlfXMgdG8gc3RvcmUgc2hhcmVkIGNvbnN0YW50IHN0YXRlIGFuZCBkYXRhCisgICAgICogYmV0d2VlbiBEcmF3YWJsZXMuIHtAbGluayBCaXRtYXBEcmF3YWJsZX1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSByZXNvdXJjZSB3aWxsIGZvciBpbnN0YW5jZQorICAgICAqIHNoYXJlIGEgdW5pcXVlIGJpdG1hcCBzdG9yZWQgaW4gdGhlaXIgQ29uc3RhbnRTdGF0ZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0gY2FuIGJlIHVzZWQgYXMgYSBmYWN0b3J5IHRvIGNyZWF0ZSBuZXcgRHJhd2FibGUgaW5zdGFuY2VzCisgICAgICogZnJvbSB0aGlzIENvbnN0YW50U3RhdGUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogVXNlIHtAbGluayBEcmF3YWJsZSNnZXRDb25zdGFudFN0YXRlKCl9IHRvIHJldHJpZXZlIHRoZSBDb25zdGFudFN0YXRlIG9mIGEgRHJhd2FibGUuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgRHJhd2FibGUjbXV0YXRlKCl9IG9uIGEgRHJhd2FibGUgc2hvdWxkIHR5cGljYWxseSBjcmVhdGUgYSBuZXcgQ29uc3RhbnRTdGF0ZSBmb3IgdGhhdAorICAgICAqIERyYXdhYmxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRTdGF0ZSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZHJhd2FibGUgd2l0aG91dCBzdXBwbHlpbmcgcmVzb3VyY2VzIHRoZSBjYWxsZXIKICAgICAgICAgICogaXMgcnVubmluZyBpbi4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1lYW5zIHRoZSBkZW5zaXR5LWRlcGVuZGVudAogICAgICAgICAgKiBkcmF3YWJsZXMgKGxpa2UgYml0bWFwcykgd2lsbCBub3QgYmUgYWJsZSB0byB1cGRhdGUgdGhlaXIgdGFyZ2V0Ci0gICAgICAgICAqIGRlbnNpdHkgY29ycmVjdGx5LgorICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4gT25lIHNob3VsZCB1c2Uge0BsaW5rICNuZXdEcmF3YWJsZShSZXNvdXJjZXMpfQorICAgICAgICAgKiBpbnN0ZWFkIHRvIHByb3ZpZGUgYSByZXNvdXJjZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpOwogICAgICAgICAvKioKQEAgLTg0NSw2ICs4ODIsMTMgQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJuIGEge0BsaW5rIENvbnN0YW50U3RhdGV9IGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHNoYXJlZCBzdGF0ZSBvZiB0aGlzIERyYXdhYmxlLgorICAgICAqcQorICAgICAqIEByZXR1cm4gVGhlIENvbnN0YW50U3RhdGUgYXNzb2NpYXRlZCB0byB0aGF0IERyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgRHJhd2FibGUjbXV0YXRlKCkKKyAgICAgKi8KICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCmluZGV4IGM2ZjU3ZDQuLjEyNGQ5MDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCkBAIC0xNyw4ICsxNywxNiBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiAKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdGhhdCBjb250YWlucyBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zIGFuZCBzZWxlY3RzIHdoaWNoIG9uZSB0byB1c2UuCisgKgorICogWW91IGNhbiBzdWJjbGFzcyBpdCB0byBjcmVhdGUgeW91ciBvd24gRHJhd2FibGVDb250YWluZXJzIG9yIGRpcmVjdGx5IHVzZSBvbmUgaXRzIGNoaWxkIGNsYXNzZXMuCisgKi8KIHB1YmxpYyBjbGFzcyBEcmF3YWJsZUNvbnRhaW5lciBleHRlbmRzIERyYXdhYmxlIGltcGxlbWVudHMgRHJhd2FibGUuQ2FsbGJhY2sgewogCiAgICAgLyoqCkBAIC0xOTYsOCArMjA0LDcgQEAKICAgICAgICAgICAgICAgICBtRHJhd2FibGVDb250YWluZXJTdGF0ZS5nZXRPcGFjaXR5KCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkgewogICAgICAgICBpZiAoaWR4ID09IG1DdXJJbmRleCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yNTUsNiArMjYyLDEyIEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEEgQ29uc3RhbnRTdGF0ZSB0aGF0IGNhbiBjb250YWluIHNldmVyYWwge0BsaW5rIERyYXdhYmxlfXMuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIHdhcyBtYWRlIHB1YmxpYyB0byBlbmFibGUgdGVzdGluZywgYW5kIGl0cyB2aXNpYmlsaXR5IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUKKyAgICAgKiByZWxlYXNlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRHJhd2FibGVDb250YWluZXJTdGF0ZSBleHRlbmRzIENvbnN0YW50U3RhdGUgewogICAgICAgICBmaW5hbCBEcmF3YWJsZUNvbnRhaW5lciBtT3duZXI7CiAKQEAgLTQ0MywxMiArNDU2LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50TWluaW11bUhlaWdodDsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgewogICAgICAgICAgICAgbUNvbXB1dGVkQ29uc3RhbnRTaXplID0gdHJ1ZTsKIAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CiAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZVtdIGRyYXdhYmxlcyA9IG1EcmF3YWJsZXM7Ci0gICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IDA7CisgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IC0xOwogICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyID0gZHJhd2FibGVzW2ldOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKaW5kZXggMzg5ZmQ0MC4uYjcyN2Q0NyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCkBAIC0yNjUsNiArMjY1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzZXREcmF3YWJsZUJ5TGF5ZXJJZChpbnQgaWQsIERyYXdhYmxlIGRyYXdhYmxlKSB7CiAgICAgICAgIGZpbmFsIENoaWxkRHJhd2FibGVbXSBsYXllcnMgPSBtTGF5ZXJTdGF0ZS5tQ2hpbGRyZW47CisgICAgICAgIGRyYXdhYmxlLnNldENhbGxiYWNrKHRoaXMpOwogICAgICAgICAKICAgICAgICAgZm9yIChpbnQgaSA9IG1MYXllclN0YXRlLm1OdW0gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgaWYgKGxheWVyc1tpXS5tSWQgPT0gaWQpIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIHJlc291cmNlIHRoYXQgbWFuYWdlcyBhIG51bWJlciBvZiBhbHRlcm5hdGUgRHJhd2FibGVzLCBhbmQgd2hpY2ggYWN0dWFsbHkgZHJhd3MgdGhlIG9uZSB3aGljaAorICogc2l6ZSBtYXRjaGVzIHRoZSBtb3N0IGNsb3NlbHkgdGhlIGRyYXdpbmcgYm91bmRzLiBQcm92aWRpbmcgc2V2ZXJhbCBwcmUtc2NhbGVkIHZlcnNpb24gb2YgdGhlCisgKiBkcmF3YWJsZSBoZWxwcyBtaW5pbWl6aW5nIHRoZSBhbGlhc2luZyBhcnRpZmFjdHMgdGhhdCBjYW4gYmUgaW50cm9kdWNlZCBieSB0aGUgc2NhbGluZy4KKyAqCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2FkZERyYXdhYmxlKERyYXdhYmxlKX0gdG8gZGVmaW5lIHRoZSBkaWZmZXJlbnQgRHJhd2FibGVzIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlCisgKiBtaXBtYXAgbGV2ZWxzIG9mIHRoaXMgTWlwbWFwRHJhd2FibGUuIFRoZSBtaXBtYXAgRHJhd2FibGUgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgd2hlbiB0aGlzCisgKiBNaXBtYXBEcmF3YWJsZSBpcyBkcmF3biBpcyB0aGUgb25lIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgaW50cmluc2ljIGhlaWdodCBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAqIHRoZSBib3VuZHMnIGhlaWdodC4gVGhpcyBzZWxlY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBiZXN0IGF2YWlsYWJsZSBtaXBtYXAgbGV2ZWwgaXMgc2NhbGVkIGRvd24gdG8KKyAqIGRyYXcgdGhpcyBNaXBtYXBEcmF3YWJsZS4KKyAqIDwvcD4KKyAqCisgKiBJZiB0aGUgYm91bmRzJyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgbWlwbWFwLCB0aGUgbGFyZ2VzdCBtaXBtYXAgd2lsbCBiZSBzY2FsZWQgdXAuCisgKiBOb3RlIHRoYXQgRHJhd2FibGVzIHdpdGhvdXQgaW50cmluc2ljIGhlaWdodCAoaS5lLiB3aXRoIGEgbmVnYXRpdmUgdmFsdWUsIHN1Y2ggYXMgQ29sb3IpIHdpbGwKKyAqIG9ubHkgYmUgdXNlZCBpZiBubyBvdGhlciBtaXBtYXAgRHJhd2FibGUgYXJlIHByb3ZpZGVkLiBUaGUgRHJhd2FibGVzJyBpbnRyaW5zaWMgaGVpZ2h0cyBzaG91bGQKKyAqIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBEcmF3YWJsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIE1pcG1hcERyYXdhYmxlLgorICoKKyAqIDxwPgorICogVGhlIGRpZmZlcmVudCBtaXBtYXBzJyBwYXJhbWV0ZXJzIChvcGFjaXR5LCBwYWRkaW5nLCBjb2xvciBmaWx0ZXIsIGdyYXZpdHkuLi4pIHNob3VsZCB0eXBpY2FsbHkKKyAqIGJlIHNpbWlsYXIgdG8gZW5zdXJlIGEgY29udGludW91cyB2aXN1YWwgYXBwZWFyYW5jZSB3aGVuIHRoZSBNaXBtYXBEcmF3YWJsZSBpcyBzY2FsZWQuIFRoZSBhc3BlY3QKKyAqIHJhdGlvIG9mIHRoZSBkaWZmZXJlbnQgbWlwbWFwcyBzaG91bGQgZXNwZWNpYWxseSBiZSBlcXVhbC4KKyAqIDwvcD4KKyAqCisgKiBBIHR5cGljYWwgZXhhbXBsZSB1c2Ugb2YgYSBNaXBtYXBEcmF3YWJsZSB3b3VsZCBiZSBmb3IgYW4gaW1hZ2Ugd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgc2NhbGVkIGF0CisgKiB2YXJpb3VzIHNpemVzLCBhbmQgZm9yIHdoaWNoIG9uZSB3YW50cyB0byBwcm92aWRlIHByZS1zY2FsZWQgdmVyc2lvbnMgdG8gcHJlY2lzZWx5IGNvbnRyb2wgaXRzCisgKiBhcHBlYXJhbmNlLgorICoKKyAqIDxwPgorICogVGhlIGludHJpbnNpYyBzaXplIG9mIGEgTWlwbWFwRHJhd2FibGUgYXJlIGluZmVycmVkIGZyb20gdGhvc2Ugb2YgdGhlIGxhcmdlc3QgbWlwbWFwIChpbiB0ZXJtcyBvZgorICoge0BsaW5rIERyYXdhYmxlI2dldEludHJpbnNpY0hlaWdodCgpfSkuIE9uIHRoZSBvcHBvc2l0ZSwgaXRzIG1pbmltdW0KKyAqIHNpemUgaXMgZGVmaW5lZCBieSB0aGUgc21hbGxlc3QgcHJvdmlkZWQgbWlwbWFwLgorICogPC9wPgorCisgKiBJdCBjYW4gYmUgZGVmaW5lZCBpbiBhbiBYTUwgZmlsZSB3aXRoIHRoZSA8Y29kZT4mbHQ7bWlwbWFwPjwvY29kZT4gZWxlbWVudC4KKyAqIEVhY2ggbWlwbWFwIERyYXdhYmxlIGlzIGRlZmluZWQgaW4gYSBuZXN0ZWQgPGNvZGU+Jmx0O2l0ZW0+PC9jb2RlPi4gRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogJmx0O21pcG1hcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV84IiAvPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV8zMiIgLz4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfMTI4IiAvPgorICogJmx0Oy9taXBtYXA+CisgKjwvcHJlPgorICogPHA+CisgKiBXaXRoIHRoaXMgWE1MIHNhdmVkIGludG8gdGhlIHJlcy9kcmF3YWJsZS8gZm9sZGVyIG9mIHRoZSBwcm9qZWN0LCBpdCBjYW4gYmUgcmVmZXJlbmNlZCBhcworICogdGhlIGRyYXdhYmxlIGZvciBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fS4gQXNzdW1pbmcgdGhhdCB0aGUgaGVpZ2h0cyBvZiB0aGUgcHJvdmlkZWQKKyAqIGRyYXdhYmxlcyBhcmUgcmVzcGVjdGl2ZWx5IDgsIDMyIGFuZCAxMjggcGl4ZWxzLCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgc2NhbGVkIGRvd24gd2hlbiB0aGUKKyAqIGJvdW5kcycgaGVpZ2h0IGlzIGxvd2VyIG9yIGVxdWFsIHRoYW4gOCBwaXhlbHMuIFRoZSBzZWNvbmQgZHJhd2FibGUgd2lsbCB0aGVuIGJlIHVzZWQgdXAgdG8gYQorICogaGVpZ2h0IG9mIDMyIHBpeGVscyBhbmQgdGhlIGxhcmdlc3QgZHJhd2FibGUgd2lsbCBiZSB1c2VkIGZvciBncmVhdGVyIGhlaWdodHMuCisgKiA8L3A+CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNaXBtYXBEcmF3YWJsZUl0ZW1fZHJhd2FibGUKKyAqLworcHVibGljIGNsYXNzIE1pcG1hcERyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGVDb250YWluZXIgeworICAgIHByaXZhdGUgZmluYWwgTWlwbWFwQ29udGFpbmVyU3RhdGUgbU1pcG1hcENvbnRhaW5lclN0YXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBtTXV0YXRlZDsKKworICAgIHB1YmxpYyBNaXBtYXBEcmF3YWJsZSgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgRHJhd2FibGUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuIFRoZSBEcmF3YWJsZSBhY3R1YWxseSB1c2VkIHdoZW4KKyAgICAgKiB0aGlzIE1pcG1hcERyYXdhYmxlIGlzIGRyYXduIGlzIGRldGVybWluZWQgZnJvbSBpdHMgYm91bmRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBkcmF3YWJsZSBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRyYXdhYmxlIFRoZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZERyYXdhYmxlKERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUuYWRkRHJhd2FibGUoZHJhd2FibGUpOworICAgICAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25EcmF3YWJsZUFkZGVkKCkgeworICAgICAgICAvLyBzZWxlY3REcmF3YWJsZSBhc3N1bWVzIHRoYXQgdGhlIGNvbnRhaW5lciBjb250ZW50IGRvZXMgbm90IGNoYW5nZS4KKyAgICAgICAgLy8gV2hlbiBhIERyYXdhYmxlIGlzIGFkZGVkLCB0aGUgc2FtZSBpbmRleCBjYW4gY29ycmVzcG9uZCB0byBhIG5ldyBEcmF3YWJsZSwgYW5kIHNpbmNlCisgICAgICAgIC8vIHNlbGVjdERyYXdhYmxlIGhhcyBhIGZhc3QgZXhpdCBjYXNlIHdoZW4gb2xkSW5kZXg9PW5ld0luZGV4LCB0aGUgbmV3IGRyYXdhYmxlIGNvdWxkIGVuZAorICAgICAgICAvLyB1cCBub3QgYmVpbmcgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcHJldmlvdXMgb25lIGlmIHRoZXkgaGFwcGVuIHRvIHNoYXJlIHRoZSBzYW1lIGluZGV4LgorICAgICAgICAvLyBUaGlzIG1ha2Ugc3VyZSB0aGUgbmV3IGNvbXB1dGVkIGluZGV4IGNhbiBhY3R1YWxseSByZXBsYWNlIHRoZSBwcmV2aW91cyBvbmUuCisgICAgICAgIHNlbGVjdERyYXdhYmxlKC0xKTsKKyAgICAgICAgb25Cb3VuZHNDaGFuZ2UoZ2V0Qm91bmRzKCkpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlcyBmcm9tIERyYXdhYmxlCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZShSZWN0IGJvdW5kcykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtTWlwbWFwQ29udGFpbmVyU3RhdGUuaW5kZXhGb3JCb3VuZHMoYm91bmRzKTsKKworICAgICAgICAvLyBXaWxsIGNhbGwgaW52YWxpZGF0ZVNlbGYoKSBpZiBuZWVkZWQKKyAgICAgICAgc2VsZWN0RHJhd2FibGUoaW5kZXgpOworCisgICAgICAgIHN1cGVyLm9uQm91bmRzQ2hhbmdlKGJvdW5kcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKKyAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmluZmxhdGUociwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgaW50IHR5cGU7CisKKyAgICAgICAgZmluYWwgaW50IGlubmVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKSArIDE7CisgICAgICAgIGludCBkZXB0aDsKKyAgICAgICAgd2hpbGUgKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAmJiAoKGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCkpID49IGlubmVyRGVwdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlcHRoID4gaW5uZXJEZXB0aCB8fCAhcGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoIml0ZW0iKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByLm9idGFpbkF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1pcG1hcERyYXdhYmxlSXRlbSk7CisKKyAgICAgICAgICAgIGludCBkcmF3YWJsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWlwbWFwRHJhd2FibGVJdGVtX2RyYXdhYmxlLCAwKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIERyYXdhYmxlIGRyOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBkciA9IHIuZ2V0RHJhd2FibGUoZHJhd2FibGVSZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogPGl0ZW0+IHRhZyByZXF1aXJlcyBhICdkcmF3YWJsZScgYXR0cmlidXRlIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjaGlsZCB0YWcgZGVmaW5pbmcgYSBkcmF3YWJsZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkciA9IERyYXdhYmxlLmNyZWF0ZUZyb21YbWxJbm5lcihyLCBwYXJzZXIsIGF0dHJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLmFkZERyYXdhYmxlKGRyKTsKKyAgICAgICAgfQorCisgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CisgICAgICAgIGlmICghbU11dGF0ZWQgJiYgc3VwZXIubXV0YXRlKCkgPT0gdGhpcykgeworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLm1NaXBtYXBIZWlnaHRzID0gbU1pcG1hcENvbnRhaW5lclN0YXRlLm1NaXBtYXBIZWlnaHRzLmNsb25lKCk7CisgICAgICAgICAgICBtTXV0YXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTWlwbWFwQ29udGFpbmVyU3RhdGUgZXh0ZW5kcyBEcmF3YWJsZUNvbnRhaW5lclN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTWlwbWFwSGVpZ2h0czsKKworICAgICAgICBNaXBtYXBDb250YWluZXJTdGF0ZShNaXBtYXBDb250YWluZXJTdGF0ZSBvcmlnLCBNaXBtYXBEcmF3YWJsZSBvd25lciwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICAgICAgc3VwZXIob3JpZywgb3duZXIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChvcmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG9yaWcubU1pcG1hcEhlaWdodHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gbmV3IGludFtnZXRDaGlsZHJlbigpLmxlbmd0aF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgc2V0Q29uc3RhbnRTaXplKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCBtaXBtYXAgZHJhd2FibGUgdGhhdCB3aWxsIGJlc3QgZml0IHRoZSBwcm92aWRlZCBib3VuZHMuCisgICAgICAgICAqIFRoaXMgaW5kZXggaXMgZGV0ZXJtaW5lZCBieSBjb21wYXJpbmcgYm91bmRzJyBoZWlnaHQgYW5kIGNoaWxkcmVuIGludHJpbnNpYyBoZWlnaHRzLgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgbWlwbWFwIGluZGV4IGlzIHRoZSBzbWFsbGVzdCBtaXBtYXAgd2hpY2ggaGVpZ2h0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbgorICAgICAgICAgKiB0aGUgYm91bmRzJyBoZWlnaHQuIElmIHRoZSBib3VuZHMnIGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtaXBtYXAsIHRoZSBsYXJnZXN0CisgICAgICAgICAqIG1pcG1hcCBpbmRleCBpcyByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJvdW5kcyBUaGUgYm91bmRzIG9mIHRoZSBNaXBNYXBEcmF3YWJsZS4KKyAgICAgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIERyYXdhYmxlIHRoYXQgd2lsbCBiZXN0IGZpdCB0aGVzZSBib3VuZHMsIG9yIC0xIGlmIHRoZXJlCisgICAgICAgICAqIGFyZSBubyBjaGlsZHJlbiBtaXBtYXBzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBpbmRleEZvckJvdW5kcyhSZWN0IGJvdW5kcykgeworICAgICAgICAgICAgZmluYWwgaW50IGJvdW5kc0hlaWdodCA9IGJvdW5kcy5oZWlnaHQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYm91bmRzSGVpZ2h0IDw9IG1NaXBtYXBIZWlnaHRzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm8gbWlwbWFwIGxhcmdlciB0aGFuIGJvdW5kcyBmb3VuZC4gVXNlIGxhcmdlc3Qgb25lIHdoaWNoIHdpbGwgYmUgc2NhbGVkIHVwLgorICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE4gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm8gRHJhd2FibGUgbWlwbWFwIGF0IGFsbAorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBEcmF3YWJsZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4gVGhpcyBsaXN0IGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICogdXNpbmcge0BsaW5rIERyYXdhYmxlQ29udGFpbmVyLkRyYXdhYmxlQ29udGFpbmVyU3RhdGUjZ2V0Q2hpbGRyZW4oKX0gYW5kIHRoaXMgbWV0aG9kCisgICAgICAgICAqIGVuc3VyZXMgdGhhdCBpdCBpcyBhbHdheXMgc29ydGVkIGJ5IGluY3JlYXNpbmcge0BsaW5rIERyYXdhYmxlI2dldEludHJpbnNpY0hlaWdodCgpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRyYXdhYmxlIFRoZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gY2hpbGRyZW4gbGlzdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRHJhd2FibGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBkcmF3YWJsZSBpbiBsYXN0IHBvc2l0aW9uLCBjb3JyZWN0bHkgcmVzZXR0aW5nIGNhY2hlZCB2YWx1ZXMgYW5kCisgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IG1Db21wdXRlZENvbnN0YW50U2l6ZQorICAgICAgICAgICAgaW50IHBvcyA9IGFkZENoaWxkKGRyYXdhYmxlKTsKKworICAgICAgICAgICAgLy8gQnViYmxlIHNvcnQgdGhlIGxhc3QgZHJhd2FibGUgdG8gcmVzdG9yZSB0aGUgc29ydCBieSBpbnRyaW5zaWMgaGVpZ2h0CisgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVIZWlnaHQgPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKworICAgICAgICAgICAgd2hpbGUgKHBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBwcmV2aW91c0RyYXdhYmxlID0gbURyYXdhYmxlc1twb3MtMV07CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0ID0gcHJldmlvdXNEcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZUhlaWdodCA8IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbcG9zXSA9IHByZXZpb3VzRHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzW3Bvc10gPSBwcmV2aW91c0ludHJpbnNpY0hlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVzW3Bvcy0xXSA9IGRyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0c1twb3MtMV0gPSBkcmF3YWJsZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludHJpbnNpYyBzaXplcyBhcmUgdGhvc2Ugb2YgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIG1pcG1hcC4KKyAgICAgICAgICogTWluaW11bSBzaXplcyBhcmUgdGhvc2Ugb2YgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSBtaXBtYXAuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgc21hbGxlc3REcmF3YWJsZSA9IG1EcmF3YWJsZXNbMF07CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gc21hbGxlc3REcmF3YWJsZS5nZXRNaW5pbXVtV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gc21hbGxlc3REcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBsYXJnZXN0RHJhd2FibGUgPSBtRHJhd2FibGVzW04tMV07CisgICAgICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBsYXJnZXN0RHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRIZWlnaHQgPSBsYXJnZXN0RHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbUNvbnN0YW50SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29tcHV0ZWRDb25zdGFudFNpemUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlwbWFwRHJhd2FibGUodGhpcywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIG5ld0RyYXdhYmxlKFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlwbWFwRHJhd2FibGUodGhpcywgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBncm93QXJyYXkoaW50IG9sZFNpemUsIGludCBuZXdTaXplKSB7CisgICAgICAgICAgICBzdXBlci5ncm93QXJyYXkob2xkU2l6ZSwgbmV3U2l6ZSk7CisgICAgICAgICAgICBpbnRbXSBuZXdJbnRzID0gbmV3IGludFtuZXdTaXplXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1pcG1hcEhlaWdodHMsIDAsIG5ld0ludHMsIDAsIG9sZFNpemUpOworICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBuZXdJbnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNaXBtYXBEcmF3YWJsZShNaXBtYXBDb250YWluZXJTdGF0ZSBzdGF0ZSwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBNaXBtYXBDb250YWluZXJTdGF0ZSBhcyA9IG5ldyBNaXBtYXBDb250YWluZXJTdGF0ZShzdGF0ZSwgdGhpcywgcmVzKTsKKyAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlID0gYXM7CisgICAgICAgIHNldENvbnN0YW50U3RhdGUoYXMpOworICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCmluZGV4IDE3YzA3NzguLmRkYjJhYmYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCkBAIC03NiwxMCArNzYsMzAgQEAKICAgICAgICAgc3ViRGF0YTFEKDAsIG1UeXBlLmdldEVsZW1lbnRDb3VudCgpLCBkKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzdWJEYXRhKGludCBvZmYsIEZpZWxkUGFja2VyIGZwKSB7CisgICAgICAgIGludCBlU2l6ZSA9IG1UeXBlLm1FbGVtZW50LmdldFNpemVCeXRlcygpOworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGZwLmdldERhdGEoKTsKKworICAgICAgICBpbnQgY291bnQgPSBkYXRhLmxlbmd0aCAvIGVTaXplOworICAgICAgICBpZiAoKGVTaXplICogY291bnQpICE9IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBwYWNrZXIgbGVuZ3RoICIgKyBkYXRhLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IGRpdmlzaWJsZSBieSBlbGVtZW50IHNpemUgIiArIGVTaXplICsgIi4iKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhMURDaGVja3Mob2ZmLCBjb3VudCwgZGF0YS5sZW5ndGgsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YTFEKG1JRCwgb2ZmLCBjb3VudCwgZGF0YSwgZGF0YS5sZW5ndGgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkYXRhMURDaGVja3MoaW50IG9mZiwgaW50IGNvdW50LCBpbnQgbGVuLCBpbnQgZGF0YVNpemUpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIGlmKChvZmYgPCAwKSB8fCAoY291bnQgPCAxKSB8fCAoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG9yIENvdW50IG91dCBvZiBib3VuZHMuIik7CisgICAgICAgIGlmKG9mZiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBtdXN0IGJlID49IDAuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VudCBtdXN0IGJlID49IDEuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdmVyZmxvdywgQXZhaWxhYmxlIGNvdW50ICIgKyBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGdvdCAiICsgY291bnQgKyAiIGF0IG9mZnNldCAiICsgb2ZmICsgIi4iKTsKICAgICAgICAgfQogICAgICAgICBpZigobGVuKSA8IGRhdGFTaXplKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSB0b28gc21hbGwgZm9yIGFsbG9jYXRpb24gdHlwZS4iKTsKQEAgLTM2Niw2ICszODYsMjEgQEAKICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgaWQsIG1CaXRtYXBPcHRpb25zKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21CaXRtYXBCb3hlZChycywgYiwgZHN0Rm10LCBnZW5NaXBzKTsKICAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlRnJvbVN0cmluZyhSZW5kZXJTY3JpcHQgcnMsIFN0cmluZyBzdHIpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWxsb2NBcnJheSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY0FycmF5ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuVTgocnMpLCBhbGxvY0FycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvYy5kYXRhKGFsbG9jQXJyYXkpOworICAgICAgICAgICAgcmV0dXJuIGFsbG9jOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byB1dGYtOCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEKc2ltaWxhcml0eSBpbmRleCA4OSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQppbmRleCA1NjdkNTdmYS4uOTVjZjg4YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpAQCAtMjQsMTIgKzI0LDEyIEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIEJ5dGUyIHsKKyAgICBwdWJsaWMgQnl0ZTIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OwogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCmluZGV4IDU2N2Q1N2ZhLi5hNmMwY2E5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCkBAIC0yNCwxMiArMjQsMTMgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgQnl0ZTMgeworICAgIHB1YmxpYyBCeXRlMygpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQppbmRleCA1NjdkNTdmYS4uYTViZmM2MSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQpAQCAtMjQsMTQgKzI0LDE1IEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIEJ5dGU0IHsKKyAgICBwdWJsaWMgQnl0ZTQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworICAgIHB1YmxpYyBieXRlIHo7CisgICAgcHVibGljIGJ5dGUgdzsKIH0KIAogCiAKLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQppbmRleCAxMGVmMDVhLi4zMDhkNjYzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQpAQCAtNDcsMjAgKzQ3LDIyIEBACiAgICAgICAgIFVOU0lHTkVEXzMyICgxMCwgNCksCiAgICAgICAgIC8vVU5TSUdORURfNjQgKDExLCA4KSwKIAotICAgICAgICBVTlNJR05FRF81XzZfNSAoMTIsIDIpLAotICAgICAgICBVTlNJR05FRF81XzVfNV8xICgxMywgMiksCi0gICAgICAgIFVOU0lHTkVEXzRfNF80XzQgKDE0LCAyKSwKKyAgICAgICAgQk9PTEVBTigxMiwgMSksCiAKLSAgICAgICAgUlNfRUxFTUVOVCAoMTUsIDQpLAotICAgICAgICBSU19UWVBFICgxNiwgNCksCi0gICAgICAgIFJTX0FMTE9DQVRJT04gKDE3LCA0KSwKLSAgICAgICAgUlNfU0FNUExFUiAoMTgsIDQpLAotICAgICAgICBSU19TQ1JJUFQgKDE5LCA0KSwKLSAgICAgICAgUlNfTUVTSCAoMjAsIDQpLAotICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMSwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMiwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyMywgNCksCi0gICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI0LCA0KTsKKyAgICAgICAgVU5TSUdORURfNV82XzUgKDEzLCAyKSwKKyAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTQsIDIpLAorICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNSwgMiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTYsIDQpLAorICAgICAgICBSU19UWVBFICgxNywgNCksCisgICAgICAgIFJTX0FMTE9DQVRJT04gKDE4LCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTksIDQpLAorICAgICAgICBSU19TQ1JJUFQgKDIwLCA0KSwKKyAgICAgICAgUlNfTUVTSCAoMjEsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMiwgNCksCisgICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMywgNCksCisgICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyNCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI1LCA0KTsKIAogICAgICAgICBpbnQgbUlEOwogICAgICAgICBpbnQgbVNpemU7CkBAIC03MiwxMiArNzQsNiBAQAogCiAgICAgcHVibGljIGVudW0gRGF0YUtpbmQgewogICAgICAgICBVU0VSICgwKSwKLSAgICAgICAgQ09MT1IgKDEpLAotICAgICAgICBQT1NJVElPTiAoMiksCi0gICAgICAgIFRFWFRVUkUgKDMpLAotICAgICAgICBOT1JNQUwgKDQpLAotICAgICAgICBJTkRFWCAoNSksCi0gICAgICAgIFBPSU5UX1NJWkUoNiksCiAKICAgICAgICAgUElYRUxfTCAoNyksCiAgICAgICAgIFBJWEVMX0EgKDgpLApAQCAtOTEsNDEgKzg3LDEzMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfVTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBCT09MRUFOKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9CT09MRUFOID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0JPT0xFQU4gPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5CT09MRUFOKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0JPT0xFQU47CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1U4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfSTg7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfVTMyOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0kzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUxNihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTE2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UxNiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMTY7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfRjMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0YzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9GMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMTY7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVTMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRjMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRjMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBFTEVNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9FTEVNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0VMRU1FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19FTEVNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRUxFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVFlQRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVFlQRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9UWVBFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfVFlQRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RZUEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFMTE9DQVRJT04oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0FMTE9DQVRJT04gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQUxMT0NBVElPTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0FMTE9DQVRJT04pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9BTExPQ0FUSU9OOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQU1QTEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQU1QTEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1NBTVBMRVIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQU1QTEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0FNUExFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgU0NSSVBUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQ1JJUFQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0NSSVBUID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfU0NSSVBUKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0NSSVBUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNRVNIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NRVNIID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01FU0ggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19NRVNIKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTUVTSDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9GUkFHTUVOVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9GUkFHTUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fVkVSVEVYKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fVkVSVEVYKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9WRVJURVg7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fUkFTVEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fUkFTVEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fU1RPUkUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkUgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fU1RPUkUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFfOChSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgaWYocnMubUVsZW1lbnRfQV84ID09IG51bGwpIHsKICAgICAgICAgICAgIHJzLm1FbGVtZW50X0FfOCA9IGNyZWF0ZVBpeGVsKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5QSVhFTF9BKTsKQEAgLTE2OCw1NCArMjU2LDM0IEBACiAgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9SR0JBXzg4ODg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IElOREVYXzE2KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9JTkRFWF8xNiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9JTkRFWF8xNiA9IGNyZWF0ZUluZGV4KHJzKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyXzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0ZMT0FUXzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRkxPQVRfMiA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuRkxPQVRfMzIsIDIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JTkRFWF8xNjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8zKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzMgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl80KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF80ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzQgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMzsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9URVhUVVJFXzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1RFWFRVUkVfMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9URVhUVVJFXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5URVhUVVJFLCAyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVUNIQVJfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VQ0hBUl80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVEVYVFVSRV8yOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVUNIQVJfNDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX05PUk1BTF8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9OT1JNQUxfMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9OT1JNQUxfMyA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLk5PUk1BTCwgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X05PUk1BTF8zOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfVThfNCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9DT0xPUl9VOF80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5DT0xPUiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9GMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5DT0xPUiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80OwotICAgIH0KIAogICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewogICAgICAgICBzdXBlcihycyk7CkBAIC0yNDQsMjkgKzMxMiw2IEBACiAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYykgewotICAgICAgICBycy52YWxpZGF0ZSgpOwotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKLQotICAgICAgICBmb3IoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiLmNyZWF0ZSgpOwotICAgIH0KLQotCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlVXNlcihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0KSB7CiAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCAxKTsKQEAgLTI3OSw1OSArMzI0LDYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgRGF0YUtpbmQuVVNFUiwgZmFsc2UsIHNpemUpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVJbmRleChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBEYXRhVHlwZS5VTlNJR05FRF8xNiwgRGF0YUtpbmQuSU5ERVgsIGZhbHNlLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQXR0cmliKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBpbnQgc2l6ZSkgewotICAgICAgICBpZiAoIShkdCA9PSBEYXRhVHlwZS5GTE9BVF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzE2IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzMyIHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMzIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBEYXRhVHlwZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoZGsgPT0gRGF0YUtpbmQuQ09MT1IgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9TSVRJT04gfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5OT1JNQUwgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9JTlRfU0laRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5VU0VSKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YUtpbmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5DT0xPUiAmJgotICAgICAgICAgICAgKChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiAmJiBkdCAhPSBEYXRhVHlwZS5VTlNJR05FRF84KSB8fAotICAgICAgICAgICAgIHNpemUgPCAzIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPU0lUSU9OICYmIChzaXplIDwgMSB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5URVhUVVJFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuTk9STUFMICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgJiYKLSAgICAgICAgICAgIChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiB8fCBzaXplICE9IDEpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbm9ybSA9IGZhbHNlOwotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCkgewotICAgICAgICAgICAgbm9ybSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVBpeGVsKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrKSB7CiAgICAgICAgIGlmICghKGRrID09IERhdGFLaW5kLlBJWEVMX0wgfHwKICAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUElYRUxfQSB8fApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGIyNmU0N2QuLmYwM2I1MWMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTMzLDIxICszMywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIG1Qb3MgPSBpOworICAgIH0KIAotICAgIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgaSkgeworICAgICAgICBtUG9zICs9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSB2OwogICAgIH0KIAotICAgIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoc2hvcnQgdikgewogICAgICAgICBhbGlnbigyKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkzMihpbnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihpbnQgdikgewogICAgICAgICBhbGlnbig0KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTU1LDcgKzYyLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEk2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJNjQobG9uZyB2KSB7CiAgICAgICAgIGFsaWduKDgpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNjcsMTQgKzc0LDE0IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gNTYpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVOChzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTgoc2hvcnQgdikgewogICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmYpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKXY7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVMTYoaW50IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoaW50IHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmYpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KQEAgLTgzLDcgKzkwLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ID4+IDgpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTMyKGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihsb25nIHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CkBAIC05NCw3ICsxMDEsNyBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDI0KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTY0KGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFU2NChsb25nIHYpIHsKICAgICAgICAgaWYgKHYgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KQEAgLTEwOSwxNSArMTE2LDEzOSBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDU2KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoZmxvYXQgdikgewogICAgICAgICBhZGRJMzIoRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHModikpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGNjQoZmxvYXQgdikgewogICAgICAgICBhZGRJNjQoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModikpOwogICAgIH0KIAotICAgIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgeworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihCYXNlT2JqIG9iaikgeworICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZEkzMihvYmouZ2V0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRJMzIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQyIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQzIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgICAgICBhZGRGMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0NCB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgICAgIGFkZEYzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUyIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTMgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlNCB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgICAgIGFkZEk4KHYueik7CisgICAgICAgIGFkZEk4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQ0IHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICAgICAgYWRkVTgodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgICAgICBhZGRJMTYodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0NCB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgICAgIGFkZEkxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQyIHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MyB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQ0IHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgICAgICBhZGRVMTYodi56KTsKKyAgICAgICAgYWRkVTE2KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDIgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDQgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgICAgIGFkZEkzMih2LnopOworICAgICAgICBhZGRJMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50MiB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDMgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50NCB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICAgICAgYWRkVTMyKHYueik7CisgICAgICAgIGFkZFUzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJvb2xlYW4oYm9vbGVhbiB2KSB7CisgICAgICAgIGFkZEk4KChieXRlKSh2ID8gMSA6IDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldERhdGEoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzNmYxZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZpbGVBM0QgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIENsYXNzSUQgeworCisgICAgICAgIFVOS05PV04sCisgICAgICAgIE1FU0gsCisgICAgICAgIFNJTVBMRV9NRVNILAorICAgICAgICBUWVBFLAorICAgICAgICBFTEVNRU5ULAorICAgICAgICBBTExPQ0FUSU9OLAorICAgICAgICBQUk9HUkFNX1ZFUlRFWCwKKyAgICAgICAgUFJPR1JBTV9SQVNURVIsCisgICAgICAgIFBST0dSQU1fRlJBR01FTlQsCisgICAgICAgIFBST0dSQU1fU1RPUkUsCisgICAgICAgIFNBTVBMRVIsCisgICAgICAgIEFOSU1BVElPTiwKKyAgICAgICAgTElHSFQsCisgICAgICAgIEFEQVBURVJfMUQsCisgICAgICAgIEFEQVBURVJfMkQsCisgICAgICAgIFNDUklQVF9DOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NJRCB0b0NsYXNzSUQoaW50IGludElEKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NJRC52YWx1ZXMoKVtpbnRJRF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWFkIG9ubHkgY2xhc3Mgd2l0aCBpbmRleCBlbnRyaWVzCisgICAgcHVibGljIGNsYXNzIEluZGV4RW50cnkgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBpbnQgbUluZGV4OworICAgICAgICBpbnQgbUlEOworICAgICAgICBTdHJpbmcgbU5hbWU7CisgICAgICAgIENsYXNzSUQgbUNsYXNzSUQ7CisgICAgICAgIEJhc2VPYmogbUxvYWRlZE9iajsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NJRCBnZXRDbGFzc0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DbGFzc0lEOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VPYmogZ2V0T2JqZWN0KCkgeworICAgICAgICAgICAgaWYobUxvYWRlZE9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZWRPYmo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1DbGFzc0lEID09IENsYXNzSUQuVU5LTk9XTikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2JqZWN0SUQgPSBtUlMubkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgobUlELCBtSW5kZXgpOworICAgICAgICAgICAgaWYob2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1DbGFzc0lEKSB7CisgICAgICAgICAgICBjYXNlIE1FU0g6CisgICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJTVBMRV9NRVNIOgorICAgICAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBuZXcgU2ltcGxlTWVzaChvYmplY3RJRCwgbVJTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgICAgICBtTG9hZGVkT2JqID0gbmV3IFR5cGUob2JqZWN0SUQsIG1SUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVMRU1FTlQ6CisgICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMTE9DQVRJT046CisgICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBuZXcgUHJvZ3JhbVZlcnRleChvYmplY3RJRCwgbVJTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9SQVNURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fU1RPUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTVBMRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFOSU1BVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTElHSFQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNDUklQVF9DOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbUxvYWRlZE9iajsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4RW50cnkoUmVuZGVyU2NyaXB0IHJzLCBpbnQgaW5kZXgsIGludCBpZCwgU3RyaW5nIG5hbWUsIENsYXNzSUQgY2xhc3NJRCkgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbUNsYXNzSUQgPSBjbGFzc0lEOworICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleEVudHJ5W10gbUZpbGVFbnRyaWVzOworCisgICAgRmlsZUEzRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RW50cmllcygpIHsKKyAgICAgICAgaW50IG51bUZpbGVFbnRyaWVzID0gbVJTLm5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1JRCk7CisgICAgICAgIGlmKG51bUZpbGVFbnRyaWVzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1GaWxlRW50cmllcyA9IG5ldyBJbmRleEVudHJ5W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtudW1GaWxlRW50cmllc107CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tudW1GaWxlRW50cmllc107CisKKyAgICAgICAgbVJTLm5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1JRCwgbnVtRmlsZUVudHJpZXMsIGlkcywgbmFtZXMpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICAgICAgbUZpbGVFbnRyaWVzW2ldID0gbmV3IEluZGV4RW50cnkobVJTLCBpLCBtSUQsIG5hbWVzW2ldLCBDbGFzc0lELnRvQ2xhc3NJRChpZHNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgeworICAgICAgICBpZihtRmlsZUVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIEluZGV4RW50cnkgZ2V0SW5kZXhFbnRyeShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYoZ2V0TnVtSW5kZXhFbnRyaWVzKCkgPT0gMCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbUZpbGVFbnRyaWVzLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllc1tpbmRleF07CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBGaWxlQTNEIGNyZWF0ZUZyb21SZXNvdXJjZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIGludCBpZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICBpcyA9IHJlcy5vcGVuUmF3UmVzb3VyY2UoaWQsIHZhbHVlKTsKKworICAgICAgICAgICAgaW50IGFzc2V0ID0gKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCk7CisKKyAgICAgICAgICAgIGludCBmaWxlSWQgPSBycy5uRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShhc3NldCk7CisKKyAgICAgICAgICAgIGlmKGZpbGVJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTG9hZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlQTNEIGZhM2QgPSBuZXcgRmlsZUEzRChmaWxlSWQsIHJzKTsKKyAgICAgICAgICAgIGZhM2QuaW5pdEVudHJpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYTNkOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCnJlbmFtZSB0byBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCmluZGV4IDU2N2Q1N2ZhLi44ZmVhOTFmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBGbG9hdDIgeworICAgIHB1YmxpYyBGbG9hdDIoKSB7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHg7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQpyZW5hbWUgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQppbmRleCBmMjg0MmYzLi45ZDllNDA2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yM2YgewotICAgIHB1YmxpYyBWZWN0b3IzZigpIHsKK3B1YmxpYyBjbGFzcyBGbG9hdDMgeworICAgIHB1YmxpYyBGbG9hdDMoKSB7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHg7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpyZW5hbWUgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQppbmRleCBmYWJkOTU5Li5hNzAzZTgwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yNGYgewotICAgIHB1YmxpYyBWZWN0b3I0ZigpIHsKK3B1YmxpYyBjbGFzcyBGbG9hdDQgeworICAgIHB1YmxpYyBGbG9hdDQoKSB7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHg7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjg4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRm9udCBleHRlbmRzIEJhc2VPYmogeworCisgICAgRm9udChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmlsZU5hbWUsIGludCBzaXplKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGRwaSA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICBpbnQgZm9udElkID0gcnMubkZvbnRDcmVhdGVGcm9tRmlsZShmaWxlTmFtZSwgc2l6ZSwgZHBpKTsKKworICAgICAgICAgICAgaWYoZm9udElkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJMb2FkIGxvYWRpbmcgYSBmb250Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb250IHJzRm9udCA9IG5ldyBGb250KGZvbnRJZCwgcnMpOworCisgICAgICAgICAgICByZXR1cm4gcnNGb250OworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODklCmNvcHkgZnJvbSBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKY29weSB0byBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YQppbmRleCA1NjdkNTdmYS4uNTZlMmZlOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCkBAIC0yNCwxMiArMjQsMTIgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgSW50MiB7CisgICAgcHVibGljIEludDIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKaW5kZXggNTY3ZDU3ZmEuLjFiMjc1MDkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpAQCAtMjQsMTIgKzI0LDEzIEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIEludDMgeworICAgIHB1YmxpYyBJbnQzKCkgewogICAgIH0KIAotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OwogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCmNvcHkgZnJvbSBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKY29weSB0byBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQppbmRleCA1NjdkNTdmYS4uM2Q2ZjNmNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCkBAIC0yNCwxNCArMjQsMTUgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgSW50NCB7CisgICAgcHVibGljIEludDQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKKyAgICBwdWJsaWMgaW50IHo7CisgICAgcHVibGljIGludCB3OwogfQogCiAKIAotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKc2ltaWxhcml0eSBpbmRleCA4OSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQppbmRleCA1NjdkNTdmYS4uMTFlYWQyZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpAQCAtMjQsMTIgKzI0LDEyIEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIExvbmcyIHsKKyAgICBwdWJsaWMgTG9uZzIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OwogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCmluZGV4IDU2N2Q1N2ZhLi4xNjA0NTMyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCkBAIC0yNCwxMiArMjQsMTMgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgTG9uZzMgeworICAgIHB1YmxpYyBMb25nMygpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQppbmRleCA1NjdkNTdmYS4uMmZkMjc0NyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQpAQCAtMjQsMTQgKzI0LDE1IEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIExvbmc0IHsKKyAgICBwdWJsaWMgTG9uZzQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworICAgIHB1YmxpYyBsb25nIHo7CisgICAgcHVibGljIGxvbmcgdzsKIH0KIAogCiAKLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKaW5kZXggNjliZTI0NS4uZjU1ODExNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCkBAIC0xNDcsMTcgKzE0NywxNyBAQAogICAgICAgICAgICAgaWYgKGIubU91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgb3V0SUQgPSBiLm1PdXQubUlEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCZWdpbihpbklELCBvdXRJRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tBKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURpdGhlcihiLm1EaXRoZXIpOwogCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtU3RvcmVDcmVhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbVN0b3JlKGlkLCBycyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYTkzNTI0My4uYjJlNWIwMiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC02OCwxMCArNjgsMTEgQEAKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cik7CiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRQcmlvcml0eShpbnQgcCk7CiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHREdW1wKGludCBiaXRzKTsKKyAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEZpbmlzaCgpOwogCiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KTsKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRTYW1wbGVyKGludCBzYW1wbGVyLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoaW50IHBmcyk7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBwZnMpOwogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChpbnQgcGYpOwogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IHBmKTsKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBwcik7CkBAIC0xMTcsNiArMTE4LDEzIEBACiAgICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pOwogICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKIAorICAgIG5hdGl2ZSBpbnQgIG5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBhc3NldFN0cmVhbSk7CisgICAgbmF0aXZlIGludCAgbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGZpbGVBM0QpOworICAgIG5hdGl2ZSB2b2lkIG5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgbmF0aXZlIGludCAgbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoaW50IGZpbGVBM0QsIGludCBpbmRleCk7CisKKyAgICBuYXRpdmUgaW50ICBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpOworCiAgICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKICAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CiAgICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKQEAgLTEzNCwzMiArMTQyLDI4IEBACiAgICAgbmF0aXZlIGludCAgbkFkYXB0ZXIyRENyZWF0ZSgpOwogCiAgICAgbmF0aXZlIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckNvbG9yKGludCBzY3JpcHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckRlcHRoKGludCBzY3JpcHQsIGZsb2F0IGRlcHRoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGludCBzY3JpcHQsIGludCBzdGVuY2lsKTsKICAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VGltZVpvbmUoaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VHlwZShpbnQgdHlwZSwgYm9vbGVhbiB3cml0YWJsZSwgU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Um9vdChib29sZWFuIGlzUm9vdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldEludm9rYWJsZShTdHJpbmcgbmFtZSwgaW50IHNsb3QpOwogICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRJbnZva2UoaW50IGlkLCBpbnQgc2xvdCk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdEludm9rZVYoaW50IGlkLCBpbnQgc2xvdCwgYnl0ZVtdIHBhcmFtcyk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFZhckYoaW50IGlkLCBpbnQgc2xvdCwgZmxvYXQgdmFsKTsKKyAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VmFyVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKTsKIAogICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQmVnaW4oKTsKICAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q1NldFNjcmlwdChieXRlW10gc2NyaXB0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKICAgICBuYXRpdmUgaW50ICBuU2NyaXB0Q0NyZWF0ZSgpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lSTMyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lRihTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOwogCiAgICAgbmF0aXZlIHZvaWQgblNhbXBsZXJCZWdpbigpOwogICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyU2V0KGludCBwYXJhbSwgaW50IHZhbHVlKTsKICAgICBuYXRpdmUgaW50ICBuU2FtcGxlckNyZWF0ZSgpOwogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW50IGluLCBpbnQgb3V0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGludCBzcmMsIGludCBkc3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYyk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZUNvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpOworICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IHNyYywgaW50IGRzdCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7CisgICAgbmF0aXZlIGludCAgblByb2dyYW1TdG9yZUNyZWF0ZSgpOwogCiAgICAgbmF0aXZlIGludCAgblByb2dyYW1SYXN0ZXJDcmVhdGUoaW50IGluLCBpbnQgb3V0LCBib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpOwogICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGludCBwciwgZmxvYXQgdik7CkBAIC0xOTUsMTMgKzE5OSwyNSBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VUaHJlYWQgbU1lc3NhZ2VUaHJlYWQ7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0k4OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTMyOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9JMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1U4OworICAgIEVsZW1lbnQgbUVsZW1lbnRfSTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9CT09MRUFOOworCisgICAgRWxlbWVudCBtRWxlbWVudF9FTEVNRU5UOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVFlQRTsKKyAgICBFbGVtZW50IG1FbGVtZW50X0FMTE9DQVRJT047CisgICAgRWxlbWVudCBtRWxlbWVudF9TQU1QTEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfU0NSSVBUOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUVTSDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fUkFTVEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9TVE9SRTsKIAogICAgIEVsZW1lbnQgbUVsZW1lbnRfQV84OwogICAgIEVsZW1lbnQgbUVsZW1lbnRfUkdCXzU2NTsKQEAgLTIxMCwxMyArMjI2LDE3IEBACiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzQ0NDQ7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzg4ODg7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X0lOREVYXzE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1BPU0lUSU9OXzM7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9URVhUVVJFXzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9OT1JNQUxfMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9DT0xPUl9GMzJfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF8zOworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1VDSEFSXzQ7CisKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8KQEAgLTI4Miw3ICszMDIsNiBAQAogICAgICAgICAgICAgICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjay5tSUQgPSBtc2c7CiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLnJ1bigpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0xvZy5kKExPR19UQUcsICJNZXNzYWdlVGhyZWFkIG1zZyAiICsgbXNnICsgIiB2MSAiICsgcmJ1ZlswXSArICIgdjIgIiArIHJidWZbMV0gKyAiIHYzICIgK3JidWZbMl0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgZXhpdGluZy4iKTsKICAgICAgICAgfQpAQCAtMzA3LDYgKzMyNiwxMCBAQAogICAgICAgICBuQ29udGV4dER1bXAoYml0cyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBuQ29udGV4dEZpbmlzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQppbmRleCBkMWRmMjNkLi5lOTBiNGZjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCkBAIC03NCw5ICs3NCw5IEBACiAgICAgICAgIG5Db250ZXh0QmluZFJvb3RTY3JpcHQoc2FmZUlEKHMpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CisgICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtU3RvcmUoUHJvZ3JhbVN0b3JlIHApIHsKICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoc2FmZUlEKHApKTsKKyAgICAgICAgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKHNhZmVJRChwKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoUHJvZ3JhbUZyYWdtZW50IHApIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKaW5kZXggNDBiYTcyMi4uZGE4M2QwNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKQEAgLTUxLDYgKzUxLDg2IEBACiAgICAgICAgIG1JRCA9IGlkOwogICAgIH0KIAorICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVA7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTElORUFSX01JUDsKKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9ORUFSRVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVCA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSX01JUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLldSQVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKICAgICAgICAgVmFsdWUgbU1pbjsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCmluZGV4IDU3Y2NmYTMuLmJlYWM5OTcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQpAQCAtNDIsNiArNDIsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCkgeworICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZVYobUlELCBzbG90LCB2LmdldERhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgICAgICB9CisgICAgfQorCisKICAgICBTY3JpcHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgc3VwZXIocnMpOwogICAgICAgICBtSUQgPSBpZDsKQEAgLTQ5LDIyICs2MiwyMyBAQAogCiAgICAgcHVibGljIHZvaWQgYmluZEFsbG9jYXRpb24oQWxsb2NhdGlvbiB2YSwgaW50IHNsb3QpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCB2YS5tSUQsIHNsb3QpOworICAgICAgICBpZiAodmEgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIHZhLm1JRCwgc2xvdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgMCwgc2xvdCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJDb2xvcihtSUQsIHIsIGcsIGIsIGEpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGZsb2F0IHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJGKG1JRCwgaW5kZXgsIHYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyRGVwdGgoZmxvYXQgZCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhckRlcHRoKG1JRCwgZCk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgaW50IHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyU3RlbmNpbChpbnQgc3RlbmNpbCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhclN0ZW5jaWwobUlELCBzdGVuY2lsKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBGaWVsZFBhY2tlciB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFyVihtSUQsIGluZGV4LCB2LmdldERhdGEoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoU3RyaW5nIHRpbWVab25lKSB7CkBAIC03OCw3MiArOTIsNTQgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIGJvb2xlYW4gbUlzUm9vdCA9IGZhbHNlOwotICAgICAgICBUeXBlW10gbVR5cGVzOwotICAgICAgICBTdHJpbmdbXSBtTmFtZXM7Ci0gICAgICAgIGJvb2xlYW5bXSBtV3JpdGFibGU7Ci0gICAgICAgIGludCBtSW52b2thYmxlQ291bnQgPSAwOwotICAgICAgICBJbnZva2FibGVbXSBtSW52b2thYmxlczsKIAogICAgICAgICBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVHlwZXMgPSBuZXcgVHlwZVtNQVhfU0xPVF07Ci0gICAgICAgICAgICBtTmFtZXMgPSBuZXcgU3RyaW5nW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1Xcml0YWJsZSA9IG5ldyBib29sZWFuW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1JbnZva2FibGVzID0gbmV3IEludm9rYWJsZVtNQVhfU0xPVF07CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdCwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1UeXBlc1tzbG90XSA9IHQ7Ci0gICAgICAgICAgICBtTmFtZXNbc2xvdF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHQsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVR5cGVzW3Nsb3RdID0gdDsKLSAgICAgICAgICAgIG1OYW1lc1tzbG90XSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2thYmxlIGFkZEludm9rYWJsZShTdHJpbmcgZnVuYykgewotICAgICAgICAgICAgSW52b2thYmxlIGkgPSBuZXcgSW52b2thYmxlKCk7Ci0gICAgICAgICAgICBpLm1OYW1lID0gZnVuYzsKLSAgICAgICAgICAgIGkubVJTID0gbVJTOwotICAgICAgICAgICAgaS5tU2xvdCA9IG1JbnZva2FibGVDb3VudDsKLSAgICAgICAgICAgIG1JbnZva2FibGVzW21JbnZva2FibGVDb3VudCsrXSA9IGk7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoYm9vbGVhbiB3cml0YWJsZSwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1Xcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0cmFuc2ZlckNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0Um9vdChtSXNSb290KTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtVHlwZXMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYobVR5cGVzW2N0XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0VHlwZShtVHlwZXNbY3RdLm1JRCwgbVdyaXRhYmxlW2N0XSwgbU5hbWVzW2N0XSwgY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW52b2thYmxlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBtUlMublNjcmlwdFNldEludm9rYWJsZShtSW52b2thYmxlc1tjdF0ubU5hbWUsIGN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdHJhbnNmZXJPYmplY3QoU2NyaXB0IHMpIHsKLSAgICAgICAgICAgIHMubUlzUm9vdCA9IG1Jc1Jvb3Q7Ci0gICAgICAgICAgICBzLm1UeXBlcyA9IG1UeXBlczsKLSAgICAgICAgICAgIHMubUludm9rYWJsZXMgPSBuZXcgSW52b2thYmxlW21JbnZva2FibGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUludm9rYWJsZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgcy5tSW52b2thYmxlc1tjdF0gPSBtSW52b2thYmxlc1tjdF07Ci0gICAgICAgICAgICAgICAgcy5tSW52b2thYmxlc1tjdF0ubVNjcmlwdCA9IHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLm1JbnZva2FibGVzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJvb3QoYm9vbGVhbiByKSB7Ci0gICAgICAgICAgICBtSXNSb290ID0gcjsKLSAgICAgICAgfQotCiAgICAgfQogCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpZWxkQmFzZSB7CisgICAgICAgIHByb3RlY3RlZCBFbGVtZW50IG1FbGVtZW50OworICAgICAgICBwcm90ZWN0ZWQgVHlwZSBtVHlwZTsKKyAgICAgICAgcHJvdGVjdGVkIEFsbG9jYXRpb24gbUFsbG9jYXRpb247CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdChSZW5kZXJTY3JpcHQgcnMsIGludCBkaW14KSB7CisgICAgICAgICAgICBtQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIG1FbGVtZW50LCBkaW14KTsKKyAgICAgICAgICAgIG1UeXBlID0gbUFsbG9jYXRpb24uZ2V0VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEZpZWxkQmFzZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFsbG9jYXRpb24oKSB7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8qCisgICAgICAgIHB1YmxpYyBjbGFzcyBTY3JpcHRGaWVsZF9Vc2VyRmllbGQKKyAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2NyaXB0LkZpZWxkQmFzZSB7CisKKyAgICAgICAgICAgIHByb3RlY3RlZAorCisgICAgICAgIH0KKworICAgICAgICAqLworCisgICAgfQogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCmluZGV4IGJiOTllMjMuLjU5NTliZTQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCkBAIC0zNywxMSArMzcsNDkgQEAKICAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgU2NyaXB0QyhSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCByZXNvdXJjZUlELCBib29sZWFuIGlzUm9vdCkgeworICAgICAgICBzdXBlcigwLCBycyk7CisgICAgICAgIG1JRCA9IGludGVybmFsQ3JlYXRlKHJzLCByZXNvdXJjZXMsIHJlc291cmNlSUQpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGludCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCByZXNvdXJjZUlEKSB7CisgICAgICAgIGJ5dGVbXSBwZ207CisgICAgICAgIGludCBwZ21MZW5ndGg7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gcmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZShyZXNvdXJjZUlEKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGdtID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgcGdtTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc0xlZnQgPSBwZ20ubGVuZ3RoIC0gcGdtTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbcGdtLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZ20sIDAsIGJ1ZjIsIDAsIHBnbS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGdtID0gYnVmMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IHBnbS5sZW5ndGggLSBwZ21MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQocGdtLCBwZ21MZW5ndGgsIGJ5dGVzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGdtTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcnMublNjcmlwdENCZWdpbigpOworICAgICAgICBycy5uU2NyaXB0Q1NldFNjcmlwdChwZ20sIDAsIHBnbUxlbmd0aCk7CisgICAgICAgIHJldHVybiBycy5uU2NyaXB0Q0NyZWF0ZSgpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNjcmlwdC5CdWlsZGVyIHsKICAgICAgICAgYnl0ZVtdIG1Qcm9ncmFtOwogICAgICAgICBpbnQgbVByb2dyYW1MZW5ndGg7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLEludGVnZXI+IG1JbnREZWZpbmVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsRmxvYXQ+IG1GbG9hdERlZmluZXMgPSBuZXcgSGFzaE1hcCgpOwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgc3VwZXIocnMpOwpAQCAtOTIsNjYgKzEzMCwyMCBAQAogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2NyaXB0QyBpbnRlcm5hbENyZWF0ZShCdWlsZGVyIGIpIHsKICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQmVnaW4oKTsKLSAgICAgICAgICAgIGIudHJhbnNmZXJDcmVhdGUoKTsKIAotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsSW50ZWdlcj4gZTogYi5tSW50RGVmaW5lcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYi5tUlMublNjcmlwdENBZGREZWZpbmVJMzIoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsRmxvYXQ+IGU6IGIubUZsb2F0RGVmaW5lcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYi5tUlMublNjcmlwdENBZGREZWZpbmVGKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5mbG9hdFZhbHVlKCkpOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgImxlbiA9ICIgKyBiLm1Qcm9ncmFtTGVuZ3RoKTsKICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDU2V0U2NyaXB0KGIubVByb2dyYW0sIDAsIGIubVByb2dyYW1MZW5ndGgpOwogCiAgICAgICAgICAgICBpbnQgaWQgPSBiLm1SUy5uU2NyaXB0Q0NyZWF0ZSgpOwogICAgICAgICAgICAgU2NyaXB0QyBvYmogPSBuZXcgU2NyaXB0QyhpZCwgYi5tUlMpOwotICAgICAgICAgICAgYi50cmFuc2Zlck9iamVjdChvYmopOwotCiAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1JbnREZWZpbmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBtRmxvYXREZWZpbmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGFrZXMgdGhlIGFsbCBwdWJsaWMgc3RhdGljIGZpbmFsIGZpZWxkcyBmb3IgYSBjbGFzcywgYW5kIGFkZHMgZGVmaW5lcwotICAgICAgICAgKiBmb3IgdGhlbSwgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKENsYXNzIGNsKSB7Ci0gICAgICAgICAgICBhZGREZWZpbmVzKGNsLmdldEZpZWxkcygpLCAoTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5QVUJMSUMpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWtlcyB0aGUgYWxsIHB1YmxpYyBmaWVsZHMgZm9yIGFuIG9iamVjdCwgYW5kIGFkZHMgZGVmaW5lcwotICAgICAgICAgKiBmb3IgdGhlbSwgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBhZGREZWZpbmVzKG8uZ2V0Q2xhc3MoKS5nZXRGaWVsZHMoKSwgTW9kaWZpZXIuUFVCTElDLCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkRGVmaW5lcyhGaWVsZFtdIGZpZWxkcywgaW50IG1hc2ssIE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBmb3IgKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZi5nZXRNb2RpZmllcnMoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHQgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnREZWZpbmVzLnB1dChmLmdldE5hbWUoKSwgZi5nZXRJbnQobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbG9hdERlZmluZXMucHV0KGYuZ2V0TmFtZSgpLCBmLmdldEZsb2F0KG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugd2FudCB0aGlzIGxvZz8KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkRGVmaW5lcyBza2lwcGluZyBmaWVsZCAiICsgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhDbGFzcyBjbCkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhPYmplY3Qgbykge30KKyAgICAgICAgdm9pZCBhZGREZWZpbmVzKEZpZWxkW10gZmllbGRzLCBpbnQgbWFzaywgT2JqZWN0IG8pIHt9CiAKICAgICAgICAgcHVibGljIFNjcmlwdEMgY3JlYXRlKCkgewogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlKHRoaXMpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg5JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQppbmRleCA1NjdkNTdmYS4uNDI2ODAxZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEKQEAgLTI0LDEyICsyNCwxMiBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBTaG9ydDIgeworICAgIHB1YmxpYyBTaG9ydDIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YQppbmRleCA1NjdkNTdmYS4uN2I5YzMwNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKQEAgLTI0LDEyICsyNCwxMyBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBTaG9ydDMgeworICAgIHB1YmxpYyBTaG9ydDMoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg1JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQppbmRleCA1NjdkNTdmYS4uOWE0NzRlMiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKQEAgLTI0LDE0ICsyNCwxNSBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBTaG9ydDQgeworICAgIHB1YmxpYyBTaG9ydDQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CisgICAgcHVibGljIHNob3J0IHc7CiB9CiAKIAogCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKaW5kZXggNGEyMTdhOS4uMzhkMDczNiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKQEAgLTMxMywzNiArMzEzLDI2IEBACiAgICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKICAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwogICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKLSAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKG1SUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKICAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSwgImNvbG9yIik7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSwgInRleHR1cmUiKTsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKICAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDM7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyksICJub3JtYWwiKTsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8zKG1SUyksICJub3JtYWwiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKIAogICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOwogICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOwotICAgICAgICAgICAgc21iLnNldEluZGV4VHlwZShFbGVtZW50LmNyZWF0ZUluZGV4KG1SUyksIG1JbmRleENvdW50KTsKKyAgICAgICAgICAgIHNtYi5zZXRJbmRleFR5cGUoRWxlbWVudC5VMTYobVJTKSwgbUluZGV4Q291bnQpOwogICAgICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuVFJJQU5HTEUpOwogICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQppbmRleCA2MmQzODY3Li4xNDQyMmIyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQpAQCAtMTA4LDQ4ICsxMDgsOSBAQAogICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjLCBpbnQgc2l6ZSkgewotICAgICAgICBFbGVtZW50IGUgPSBFbGVtZW50LmNyZWF0ZUZyb21DbGFzcyhycywgYyk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzLCBlKTsKLSAgICAgICAgYi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICBUeXBlIHQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBlLmRlc3Ryb3koKTsKLQotICAgICAgICAvLyBuYXRpdmUgZmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGludFtdIGFyVHlwZXMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICAgICAgaW50W10gYXJCaXRzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKLQotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGZpZWxkcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBGaWVsZCBmID0gZmllbGRzW2N0XTsKLSAgICAgICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyLm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDMyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzE2Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDE2OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfOC5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSA4OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBycy5uVHlwZVNldHVwRmllbGRzKHQsIGFyVHlwZXMsIGFyQml0cywgZmllbGRzKTsKLSAgICAgICAgfQotICAgICAgICB0Lm1KYXZhQ2xhc3MgPSBjOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUsIFN0cmluZyBzY3JpcHROYW1lKSB7Ci0gICAgICAgIFR5cGUgdCA9IGNyZWF0ZUZyb21DbGFzcyhycywgYywgc2l6ZSk7Ci0gICAgICAgIHQuc2V0TmFtZShzY3JpcHROYW1lKTsKLSAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgiUmVuZGVyU2NyaXB0IiwgIkNhbGxpbmcgZGVwcmljYXRlZCBjcmVhdGVGcm9tQ2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKaW5kZXggNDVjYzcyZS4uYzYxYTIxNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKKysrIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKQEAgLTg1LDYgKzg1LDE0IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKK25Db250ZXh0RmluaXNoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CisKK3N0YXRpYyB2b2lkCiBuQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKQEAgLTcwMCw2ICs3MDgsNzIgQEAKICAgICBmcmVlKGJ1ZkFsbG9jKTsKIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZpbGVBM0QpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworCisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gMDsKKyAgICByc0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoY29uLCAmbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCBOdW1FbnRyaWVzICV1IiwgKHVpbnQzMl90KSBudW1FbnRyaWVzKTsKKyAgICByZXR1cm4gbnVtRW50cmllczsKK30KKworc3RhdGljIHZvaWQKK25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmaWxlQTNELCBqaW50IG51bUVudHJpZXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX2VudHJpZXMpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworCisgICAgUnNGaWxlSW5kZXhFbnRyeSAqZmlsZUVudHJpZXMgPSAoUnNGaWxlSW5kZXhFbnRyeSopbWFsbG9jKCh1aW50MzJfdCludW1FbnRyaWVzICogc2l6ZW9mKFJzRmlsZUluZGV4RW50cnkpKTsKKworICAgIHJzRmlsZUEzREdldEluZGV4RW50cmllcyhjb24sIGZpbGVFbnRyaWVzLCAodWludDMyX3QpbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoX2VudHJpZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihmaWxlRW50cmllc1tpXS5vYmplY3ROYW1lKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9pZHMsIGksIDEsIChjb25zdCBqaW50KikmZmlsZUVudHJpZXNbaV0uY2xhc3NJRCk7CisgICAgfQorCisgICAgZnJlZShmaWxlRW50cmllcyk7Cit9CisKK3N0YXRpYyBpbnQKK25GaWxlQTNER2V0RW50cnlCeUluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmaWxlQTNELCBqaW50IGluZGV4KQoreworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBmaWxlQTNEKTsKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoY29uLCAodWludDMyX3QpaW5kZXgsIChSc0ZpbGUpZmlsZUEzRCk7CisgICAgcmV0dXJuIGlkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50CituRm9udENyZWF0ZUZyb21GaWxlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBmaWxlTmFtZSwgamludCBmb250U2l6ZSwgamludCBkcGkpCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgY29uc3QgY2hhciogZmlsZU5hbWVVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhmaWxlTmFtZSwgTlVMTCk7CisKKyAgICBqaW50IGlkID0gKGppbnQpcnNGb250Q3JlYXRlRnJvbUZpbGUoY29uLCBmaWxlTmFtZVVURiwgZm9udFNpemUsIGRwaSk7CisgICAgcmV0dXJuIGlkOworfQorCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTg1NCwyOSArOTI4LDMzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Q2xlYXJDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqZmxvYXQgciwgamZsb2F0IGcsIGpmbG9hdCBiLCBqZmxvYXQgYSkKK25TY3JpcHRTZXRWYXJJKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamludCB2YWwpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldENsZWFyQ29sb3IsIGNvbiglcCksIHMoJXApLCByKCVmKSwgZyglZiksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHIsIGcsIGIsIGEpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJDb2xvcihjb24sIChSc1NjcmlwdClzY3JpcHQsIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJJLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSksIHZhbCglaSksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QsIHZhbCk7CisgICAgcnNTY3JpcHRTZXRWYXJJKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRDbGVhckRlcHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGpmbG9hdCBkKQorblNjcmlwdFNldFZhckYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBmbG9hdCB2YWwpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhckRlcHRoLCBjb24oJXApLCBzKCVwKSwgZGVwdGgoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgZCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhckRlcHRoKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgZCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckksIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVpKSwgYiglZiksIGEoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyU3RlbmNpbCwgY29uKCVwKSwgcyglcCksIHN0ZW5jaWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc3RlbmNpbCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhclN0ZW5jaWwoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzdGVuY2lsKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRTZXRWYXJWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogc3RhdGljIHZvaWQKIG5TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQogewpAQCAtODk1LDM2ICs5NzMsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZFR5cGUsIGNvbiglcCksIHR5cGUoJXApLCB3cml0YWJsZSglaSksIHNsb3QoJWkpIiwgY29uLCAoUnNUeXBlKXR5cGUsIHdyaXRhYmxlLCBzbG90KTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0VHlwZShjb24sIChSc1R5cGUpdHlwZSwgc2xvdCwgd3JpdGFibGUsIG4pOwotICAgIGlmIChuKSB7Ci0gICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhfc3RyLCBuKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBfc3RyLCBqaW50IHNsb3QpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldEludm9rZSwgY29uKCVwKSIsIGNvbik7Ci0gICAgY29uc3QgY2hhciogbiA9IE5VTEw7Ci0gICAgaWYgKF9zdHIpIHsKLSAgICAgICAgbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKF9zdHIsIE5VTEwpOwotICAgIH0KLSAgICByc1NjcmlwdFNldEludm9rZShjb24sIG4sIHNsb3QpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhfc3RyLCBuKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCiBuU2NyaXB0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmosIGppbnQgc2xvdCkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKQEAgLTkzMywxMyArOTgxLDE3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Um9vdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzUm9vdCkKK25TY3JpcHRJbnZva2VWKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamJ5dGVBcnJheSBkYXRhKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDU2V0Um9vdCwgY29uKCVwKSwgaXNSb290KCVpKSIsIGNvbiwgaXNSb290KTsKLSAgICByc1NjcmlwdFNldFJvb3QoY29uLCBpc1Jvb3QpOworICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2VWLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSkiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90KTsKKyAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc1NjcmlwdEludm9rZVYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCBwdHIsIGxlbik7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKIH0KIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZApAQCAtMTAwMiw4MyArMTA1NCw2MyBAQAogICAgIHJldHVybiAoamludClyc1NjcmlwdENDcmVhdGUoY29uKTsKIH0KIAotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lSTMyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBuYW1lLCBqaW50IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUkzMiwgY29uKCVwKSBuYW1lKCVzKSB2YWx1ZSglZCkiLCBjb24sIG4sIHZhbHVlKTsKLSAgICByc1NjcmlwdENTZXREZWZpbmVJMzIoY29uLCBuLCB2YWx1ZSk7Ci0gICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG4pOwotfQotCi1zdGF0aWMgdm9pZAotblNjcmlwdENBZGREZWZpbmVGKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBuYW1lLCBqZmxvYXQgdmFsdWUpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgY29uc3QgY2hhciogbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkRGVmaW5lRiwgY29uKCVwKSBuYW1lKCVzKSB2YWx1ZSglZikiLCBjb24sIG4sIHZhbHVlKTsKLSAgICByc1NjcmlwdENTZXREZWZpbmVGKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgaW4sIGppbnQgb3V0KQorblByb2dyYW1TdG9yZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4sIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSIsIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQmVnaW4sIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSIsIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOworICAgIHJzUHJvZ3JhbVN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZ1bmMpCituUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmdW5jKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYywgY29uKCVwKSwgZnVuYyglaSkiLCBjb24sIGZ1bmMpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoY29uLCAoUnNEZXB0aEZ1bmMpZnVuYyk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURlcHRoRnVuYywgY29uKCVwKSwgZnVuYyglaSkiLCBjb24sIGZ1bmMpOworICAgIHJzUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gZW5hYmxlKQorblByb2dyYW1TdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhjb24sIGVuYWJsZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURlcHRoTWFzaywgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoTWFzayhjb24sIGVuYWJsZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQorblByb2dyYW1TdG9yZUNvbG9yTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHIsIGpib29sZWFuIGcsIGpib29sZWFuIGIsIGpib29sZWFuIGEpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhjb24sIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVDb2xvck1hc2ssIGNvbiglcCksIHIoJWkpLCBnKCVpKSwgYiglaSksIGEoJWkpIiwgY29uLCByLCBnLCBiLCBhKTsKKyAgICByc1Byb2dyYW1TdG9yZUNvbG9yTWFzayhjb24sIHIsIGcsIGIsIGEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgaW50IHNyYywgaW50IGRzdCkKK25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBpbnQgc3JjLCBpbnQgZHN0KQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoY29uLCAoUnNCbGVuZFNyY0Z1bmMpc3JjLCAoUnNCbGVuZERzdEZ1bmMpZHN0KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQmxlbmRGdW5jLCBjb24oJXApLCBzcmMoJWkpLCBkc3QoJWkpIiwgY29uLCBzcmMsIGRzdCk7CisgICAgcnNQcm9ncmFtU3RvcmVCbGVuZEZ1bmMoY29uLCAoUnNCbGVuZFNyY0Z1bmMpc3JjLCAoUnNCbGVuZERzdEZ1bmMpZHN0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEaXRoZXIsIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEaXRoZXIoY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Qcm9ncmFtU3RvcmVDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShjb24pOworICAgIHJldHVybiAoamludClyc1Byb2dyYW1TdG9yZUNyZWF0ZShjb24pOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyMDgsMTEgKzEyNDAsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwZnMpCituQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUpcGZzKTsKLSAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOworICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1TdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CisgICAgcnNDb250ZXh0QmluZFByb2dyYW1TdG9yZShjb24sIChSc1Byb2dyYW1TdG9yZSlwZnMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTM2MSw2ICsxMzkzLDcgQEAKIHsibkRldmljZVNldENvbmZpZyIsICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRGV2aWNlU2V0Q29uZmlnIH0sCiB7Im5Db250ZXh0Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGUgfSwKIHsibkNvbnRleHRDcmVhdGVHTCIsICAgICAgICAgICAgICAgIihJSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZUdMIH0sCit7Im5Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRGaW5pc2ggfSwKIHsibkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFByaW9yaXR5IH0sCiB7Im5Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlMYW5kcm9pZC92aWV3L1N1cmZhY2U7KVYiLCAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRTdXJmYWNlIH0sCiB7Im5Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCkBAIC0xMzc1LDYgKzE0MDgsMTIgQEAKIHsibkNvbnRleHREZWluaXRUb0NsaWVudCIsICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCiAKIHsibkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKK3sibkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIH0sCit7Im5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIiwgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMgfSwKK3sibkZpbGVBM0RHZXRJbmRleEVudHJpZXMiLCAgICAgICAgIihJSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0SW5kZXhFbnRyaWVzIH0sCit7Im5GaWxlQTNER2V0RW50cnlCeUluZGV4IiwgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggfSwKKworeyJuRm9udENyZWF0ZUZyb21GaWxlIiwgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICh2b2lkKiluRm9udENyZWF0ZUZyb21GaWxlIH0sCiAKIHsibkVsZW1lbnRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZSB9LAogeyJuRWxlbWVudENyZWF0ZTIiLCAgICAgICAgICAgICAgICAiKFtJW0xqYXZhL2xhbmcvU3RyaW5nOylJIiwgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlMiB9LApAQCAtMTQyMCwyOCArMTQ1OSwyNCBAQAogeyJuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKIAogeyJuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoteyJuU2NyaXB0U2V0Q2xlYXJDb2xvciIsICAgICAgICAgICAiKElGRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckNvbG9yIH0sCi17Im5TY3JpcHRTZXRDbGVhckRlcHRoIiwgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyRGVwdGggfSwKLXsiblNjcmlwdFNldENsZWFyU3RlbmNpbCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIH0sCiB7Im5TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCi17Im5TY3JpcHRTZXRUeXBlIiwgICAgICAgICAgICAgICAgICIoSVpMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFR5cGUgfSwKLXsiblNjcmlwdFNldFJvb3QiLCAgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Um9vdCB9LAoteyJuU2NyaXB0U2V0SW52b2thYmxlIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRJbnZva2UgfSwKIHsiblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7Im5TY3JpcHRJbnZva2VWIiwgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3siblNjcmlwdFNldFZhckkiLCAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJuU2NyaXB0U2V0VmFyRiIsICAgICAgICAgICAgICAgICAiKElJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7Im5TY3JpcHRTZXRWYXJWIiwgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhclYgfSwKIAogeyJuU2NyaXB0Q0JlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQmVnaW4gfSwKIHsiblNjcmlwdENTZXRTY3JpcHQiLCAgICAgICAgICAgICAgIihbQklJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q1NldFNjcmlwdCB9LAogeyJuU2NyaXB0Q0NyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQ3JlYXRlIH0sCi17Im5TY3JpcHRDQWRkRGVmaW5lSTMyIiwgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENBZGREZWZpbmVJMzIgfSwKLXsiblNjcmlwdENBZGREZWZpbmVGIiwgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztGKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUYgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7Im5Qcm9ncmFtU3RvcmVCZWdpbiIsICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJlZ2luIH0sCit7Im5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURlcHRoRnVuYyB9LAoreyJuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIiwgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aE1hc2sgfSwKK3siblByb2dyYW1TdG9yZUNvbG9yTWFzayIsICAgICAgICAgIihaWlpaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIH0sCit7Im5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJsZW5kRnVuYyB9LAoreyJuUHJvZ3JhbVN0b3JlRGl0aGVyIiwgICAgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEaXRoZXIgfSwKK3siblByb2dyYW1TdG9yZUNyZWF0ZSIsICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ3JlYXRlIH0sCiAKIHsiblByb2dyYW1CaW5kQ29uc3RhbnRzIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKIHsiblByb2dyYW1CaW5kVGV4dHVyZSIsICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCkBAIC0xNDY1LDcgKzE1MDAsNyBAQAogeyJuTGlnaHRTZXRQb3NpdGlvbiIsICAgICAgICAgICAgICAiKElGRkYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldFBvc2l0aW9uIH0sCiAKIHsibkNvbnRleHRCaW5kUm9vdFNjcmlwdCIsICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRSb290U2NyaXB0IH0sCi17Im5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUgfSwKK3sibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIiwgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1TdG9yZSB9LAogeyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAogeyJuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKIHsibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCmRpZmYgLS1naXQgYS9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhIGIvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UyMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YQpAQCAtMCwwICsxLDE5NDcgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgKiBQb3J0ZWQgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zIGZyb20gSUNVNEogNC4yJ3MKKyAqIGNvbS5pYm0uaWN1LnRleHQuQXJhYmljU2hhcGluZyBjbGFzcy4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaWN1LnRleHQ7CisKKworLyoqCisgKiBTaGFwZSBBcmFiaWMgdGV4dCBvbiBhIGNoYXJhY3RlciBiYXNpcy4KKyAqCisgKiA8cD5BcmFiaWNTaGFwaW5nIHBlcmZvcm1zIGJhc2ljIG9wZXJhdGlvbnMgZm9yICJzaGFwaW5nIiBBcmFiaWMgdGV4dC4gSXQgaXMgbW9zdAorICogdXNlZnVsIGZvciB1c2Ugd2l0aCBsZWdhY3kgZGF0YSBmb3JtYXRzIGFuZCBsZWdhY3kgZGlzcGxheSB0ZWNobm9sb2d5CisgKiAoc2ltcGxlIHRlcm1pbmFscykuIEFsbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gVW5pY29kZSBjaGFyYWN0ZXJzLjwvcD4KKyAqCisgKiA8cD5UZXh0LWJhc2VkIHNoYXBpbmcgbWVhbnMgdGhhdCBzb21lIGNoYXJhY3RlciBjb2RlIHBvaW50cyBpbiB0aGUgdGV4dCBhcmUKKyAqIHJlcGxhY2VkIGJ5IG90aGVycyBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQuIEl0IHRyYW5zZm9ybXMgb25lIGtpbmQgb2YgdGV4dAorICogaW50byBhbm90aGVyLiBJbiBjb21wYXJpc29uLCBtb2Rlcm4gZGlzcGxheXMgZm9yIEFyYWJpYyB0ZXh0IHNlbGVjdAorICogYXBwcm9wcmlhdGUsIGNvbnRleHQtZGVwZW5kZW50IGZvbnQgZ2x5cGhzIGZvciBlYWNoIHRleHQgZWxlbWVudCwgd2hpY2ggbWVhbnMKKyAqIHRoYXQgdGhleSB0cmFuc2Zvcm0gdGV4dCBpbnRvIGEgZ2x5cGggdmVjdG9yLjwvcD4KKyAqCisgKiA8cD5UZXh0IHRyYW5zZm9ybWF0aW9ucyBhcmUgbmVjZXNzYXJ5IHdoZW4gbW9kZXJuIGRpc3BsYXkgdGVjaG5vbG9neSBpcyBub3QKKyAqIGF2YWlsYWJsZSBvciB3aGVuIHRleHQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQgdG8gb3IgZnJvbSBsZWdhY3kgZm9ybWF0cyB0aGF0CisgKiB1c2UgInNoYXBlZCIgY2hhcmFjdGVycy4gU2luY2UgdGhlIEFyYWJpYyBzY3JpcHQgaXMgY3Vyc2l2ZSwgY29ubmVjdGluZworICogYWRqYWNlbnQgbGV0dGVycyB0byBlYWNoIG90aGVyLCBjb21wdXRlcnMgc2VsZWN0IGltYWdlcyBmb3IgZWFjaCBsZXR0ZXIgYmFzZWQKKyAqIG9uIHRoZSBzdXJyb3VuZGluZyBsZXR0ZXJzLiBUaGlzIHVzdWFsbHkgcmVzdWx0cyBpbiBmb3VyIGltYWdlcyBwZXIgQXJhYmljCisgKiBsZXR0ZXI6IGluaXRpYWwsIG1pZGRsZSwgZmluYWwsIGFuZCBpc29sYXRlZCBmb3Jtcy4gSW4gVW5pY29kZSwgb24gdGhlIG90aGVyCisgKiBoYW5kLCBsZXR0ZXJzIGFyZSBub3JtYWxseSBzdG9yZWQgYWJzdHJhY3QsIGFuZCBhIGRpc3BsYXkgc3lzdGVtIGlzIGV4cGVjdGVkCisgKiB0byBzZWxlY3QgdGhlIG5lY2Vzc2FyeSBnbHlwaHMuIChUaGlzIG1ha2VzIHNlYXJjaGluZyBhbmQgb3RoZXIgdGV4dAorICogcHJvY2Vzc2luZyBlYXNpZXIgYmVjYXVzZSB0aGUgc2FtZSBsZXR0ZXIgaGFzIG9ubHkgb25lIGNvZGUuKSBJdCBpcyBwb3NzaWJsZQorICogdG8gbWltaWMgdGhpcyB3aXRoIHRleHQgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgdGhlcmUgYXJlIGNoYXJhY3RlcnMgaW4KKyAqIFVuaWNvZGUgdGhhdCBhcmUgcmVuZGVyZWQgYXMgbGV0dGVycyB3aXRoIGEgc3BlY2lmaWMgc2hhcGUKKyAqIChvciBjdXJzaXZlIGNvbm5lY3Rpdml0eSkuIFRoZXkgd2VyZSBpbmNsdWRlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCisgKiBsZWdhY3kgc3lzdGVtcyBhbmQgY29kZXBhZ2VzLCBhbmQgZm9yIHVuc29waGlzdGljYXRlZCBkaXNwbGF5IHN5c3RlbXMuPC9wPgorICoKKyAqIDxwPkEgc2Vjb25kIGtpbmQgb2YgdGV4dCB0cmFuc2Zvcm1hdGlvbnMgaXMgc3VwcG9ydGVkIGZvciBBcmFiaWMgZGlnaXRzOgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY29kZXBhZ2VzIHRoYXQgb25seSBpbmNsdWRlIEV1cm9wZWFuIGRpZ2l0cywKKyAqIGl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2Ugb25lIHNldCBvZiBkaWdpdHMgYnkgYW5vdGhlciwgY2hhbmdpbmcgdGhlCisgKiBjaGFyYWN0ZXIgY29kZSBwb2ludHMuIFRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBmb3IgZWl0aGVyCisgKiBBcmFiaWMtSW5kaWMgRGlnaXRzIChVKzA2NjAuLi5VKzA2NjkpIG9yIEVhc3Rlcm4gKEV4dGVuZGVkKSBBcmFiaWMtSW5kaWMKKyAqIGRpZ2l0cyAoVSswNmYwLi4uVSswNmY5KS48L3A+CisgKgorICogPHA+U29tZSByZXBsYWNlbWVudHMgbWF5IHJlc3VsdCBpbiBtb3JlIG9yIGZld2VyIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzKS4KKyAqIEJ5IGRlZmF1bHQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIG1heSByZWNlaXZlIHRleHQgd2l0aCBhCisgKiBsZW5ndGggZGlmZmVyZW50IGZyb20gdGhlIHNvdXJjZSBsZW5ndGguIFNvbWUgbGVnYWN5IHN5c3RlbXMgcmVseSBvbiB0aGUKKyAqIGxlbmd0aCBvZiB0aGUgdGV4dCB0byBiZSBjb25zdGFudC4gVGhleSBleHBlY3QgZXh0cmEgc3BhY2VzIHRvIGJlIGFkZGVkCisgKiBvciBjb25zdW1lZCBlaXRoZXIgbmV4dCB0byB0aGUgYWZmZWN0ZWQgY2hhcmFjdGVyIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgKiB0ZXh0LjwvcD4KKyAqIEBzdGFibGUgSUNVIDIuMAorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBcmFiaWNTaGFwaW5nIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBvcHRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvZ2ljYWw7IC8vIGNvbnZlbmllbmNlCisgICAgcHJpdmF0ZSBib29sZWFuIHNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQ7CisgICAgcHJpdmF0ZSBjaGFyIHRhaWxDaGFyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcmFiaWNTaGFwaW5nIFNIQVBFUiA9IG5ldyBBcmFiaWNTaGFwaW5nKAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkRJR0lUU19OT09QKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSByYW5nZSBvZiB0ZXh0IGluIHRoZSBzb3VyY2UgYXJyYXksIHB1dHRpbmcgdGhlIHJlc3VsdAorICAgICAqIGludG8gYSByYW5nZSBvZiB0ZXh0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSwgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICogb2YgY2hhcmFjdGVycyB3cml0dGVuLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBpbnB1dCB0ZXh0CisgICAgICogQHBhcmFtIHNvdXJjZVN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdC4KKyAgICAgKiAgIEl0IG1heSBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvbmx5IGlmICA8Y29kZT5kZXN0U2l6ZTwvY29kZT4gaXMgMC4KKyAgICAgKiBAcGFyYW0gZGVzdFN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byB1c2UuCisgICAgICogQHBhcmFtIGRlc3RTaXplIFRoZSBzaXplIChjYXBhY2l0eSkgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgKiAgIElmIDxjb2RlPmRlc3RTaXplPC9jb2RlPiBpcyAwLCB0aGVuIG5vIG91dHB1dCBpcyBwcm9kdWNlZCwKKyAgICAgKiAgIGJ1dCB0aGUgbmVjZXNzYXJ5IGJ1ZmZlciBzaXplIGlzIHJldHVybmVkICgicHJlZmxpZ2h0aW5nIikuICBUaGlzCisgICAgICogICBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgdGV4dCBhZ2FpbnN0IHRoZSBvcHRpb25zLCBmb3IgZXhhbXBsZSwKKyAgICAgKiAgIGlmIGxldHRlcnMgYXJlIGJlaW5nIHVuc2hhcGVkLCBhbmQgc3BhY2VzIGFyZSBiZWluZyBjb25zdW1lZAorICAgICAqICAgZm9sbG93aW5nIGxhbWFsZWYsIHRoaXMgd2lsbCBub3QgZGV0ZWN0IGEgbGFtYWxlZiB3aXRob3V0IGEKKyAgICAgKiAgIGNvcnJlc3BvbmRpbmcgc3BhY2UuICBBbiBlcnJvciB3aWxsIGJlIHRocm93biB3aGVuIHRoZSBhY3R1YWwKKyAgICAgKiAgIGNvbnZlcnNpb24gaXMgYXR0ZW1wdGVkLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgICAgICogICBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gbm8gb3V0cHV0IHdhcyB3cml0dGVuLCBvciBpdCBtYXkgYmUKKyAgICAgKiAgIGluY29tcGxldGUuCisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2hhcGUoY2hhcltdIHNvdXJjZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGRlc3QsIGludCBkZXN0U3RhcnQsIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBjYW4gbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlU3RhcnQgPCAwIHx8IHNvdXJjZUxlbmd0aCA8IDAgfHwgc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGggPiBzb3VyY2UubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgc291cmNlIHN0YXJ0ICgiICsgc291cmNlU3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciBsZW5ndGggKCIgKyBzb3VyY2VMZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3IgYnVmZmVyIG9mIGxlbmd0aCAiICsgc291cmNlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCAmJiBkZXN0U2l6ZSAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGRlc3QgcmVxdWlyZXMgZGVzdFNpemUgPT0gMCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzdFNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChkZXN0U3RhcnQgPCAwIHx8IGRlc3RTaXplIDwgMCB8fCBkZXN0U3RhcnQgKyBkZXN0U2l6ZSA+IGRlc3QubGVuZ3RoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIGRlc3Qgc3RhcnQgKCIgKyBkZXN0U3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciBzaXplICgiICsgZGVzdFNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3IgYnVmZmVyIG9mIGxlbmd0aCAiICsgZGVzdC5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIC8qIFZhbGlkYXRlIGlucHV0IG9wdGlvbnMgKi8KKyAgICAgICAgaWYgKCAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPiAwKSAmJgorICAgICAgICAgICAgICEoKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX0JFR0lOKSAgfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9FTkQgKSAgIHx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfUkVTSVpFICl8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCkpICl7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcm9uZyBUYXNoa2VlbCBhcmd1bWVudCIpOworICAgICAgICB9CisKKyAgICAgICAvLy9DTE9WRVI6T0ZGCisgICAgICAgLy9BY2NvcmRpbmcgdG8gU3RldmVuIExvb21pcywgdGhlIGNvZGUgaXMgdW5yZWFjaGFibGUgd2hlbiB5b3UgT1IgYWxsIHRoZSBjb25zdGFudHMgd2l0aGluIHRoZSBpZiBzdGF0ZW1lbnRzCisgICAgICAgaWYoKChvcHRpb25zJkxBTUFMRUZfTUFTSykgPiAwKSYmCisgICAgICAgICAgICAgICEoKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9CRUdJTikgIHx8CisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9FTkQgKSAgIHx8CisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9SRVNJWkUgKXx8CisgICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfQVVUTykgIHx8CisgICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfTkVBUikpKXsKKyAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgTGFtIEFsZWYgYXJndW1lbnQiKTsKKyAgICAgICB9CisgICAgICAgLy8vQ0xPVkVSOk9OCisKKyAgICAgICAvKiBWYWxpZGF0ZSBUYXNoa2VlbCAoVGFzaGtlZWwgcmVwbGFjZW1lbnQgb3B0aW9ucyBzaG91bGQgYmUgZW5hYmxlZCBpbiBzaGFwaW5nIG1vZGUgb25seSkqLworICAgICAgIGlmKCgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA+IDApICYmIChvcHRpb25zJkxFVFRFUlNfTUFTSykgPT0gTEVUVEVSU19VTlNIQVBFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXNoa2VlbCByZXBsYWNlbWVudCBzaG91bGQgbm90IGJlIGVuYWJsZWQgaW4gZGVzaGFwaW5nIG1vZGUgIik7CisgICAgICAgfQorICAgICAgIHJldHVybiBpbnRlcm5hbFNoYXBlKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCwgZGVzdCwgZGVzdFN0YXJ0LCBkZXN0U2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHJhbmdlIG9mIHRleHQgaW4gcGxhY2UuICBUaGlzIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIExlbmd0aCBvcHRpb24KKyAgICAgKiBkb2VzIG5vdCBncm93IG9yIHNocmluayB0aGUgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNoYXBlKGNoYXJbXSBzb3VyY2UsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiQ2Fubm90IHNoYXBlIGluIHBsYWNlIHdpdGggbGVuZ3RoIG9wdGlvbiByZXNpemUuIik7CisgICAgICAgIH0KKyAgICAgICAgc2hhcGUoc291cmNlLCBzdGFydCwgbGVuZ3RoLCBzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBzdHJpbmcsIHJldHVybmluZyB0aGUgbmV3IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNoYXBlKFN0cmluZyB0ZXh0KSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBzcmMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJbXSBkZXN0ID0gc3JjOworICAgICAgICBpZiAoKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkgJiYKKyAgICAgICAgICAgICgob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgPT0gTEVUVEVSU19VTlNIQVBFKSkgeworCisgICAgICAgICAgICBkZXN0ID0gbmV3IGNoYXJbc3JjLmxlbmd0aCAqIDJdOyAvLyBtYXgKKyAgICAgICAgfQorICAgICAgICBpbnQgbGVuID0gc2hhcGUoc3JjLCAwLCBzcmMubGVuZ3RoLCBkZXN0LCAwLCBkZXN0Lmxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGVzdCwgMCwgbGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgQXJhYmljU2hhcGluZyB1c2luZyB0aGUgb3B0aW9ucyBmbGFncy4KKyAgICAgKiBUaGUgZmxhZ3MgYXJlIGFzIGZvbGxvd3M6PGJyPgorICAgICAqICdMRU5HVEgnIGZsYWdzIGNvbnRyb2wgd2hldGhlciB0aGUgdGV4dCBjYW4gY2hhbmdlIHNpemUsIGFuZCBpZiBub3QsCisgICAgICogaG93IHRvIG1haW50YWluIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHdoZW4gTGFtQWxlZiBsaWdhdHVyZXMgYXJlCisgICAgICogZm9ybWVkIG9yIGJyb2tlbi48YnI+CisgICAgICogJ1RFWFRfRElSRUNUSU9OJyBmbGFncyBjb250cm9sIHdoZXRoZXIgdGhlIHRleHQgaXMgcmVhZCBhbmQgd3JpdHRlbgorICAgICAqIGluIHZpc3VhbCBvcmRlciBvciBpbiBsb2dpY2FsIG9yZGVyLjxicj4KKyAgICAgKiAnTEVUVEVSU19TSEFQRScgZmxhZ3MgY29udHJvbCB3aGV0aGVyIGNvbnZlcnNpb24gaXMgdG8gb3IgZnJvbQorICAgICAqIHByZXNlbnRhdGlvbiBmb3Jtcy48YnI+CisgICAgICogJ0RJR0lUUycgZmxhZ3MgY29udHJvbCB3aGV0aGVyIGRpZ2l0cyBhcmUgc2hhcGVkLCBhbmQgd2hldGhlciBmcm9tCisgICAgICogRXVyb3BlYW4gdG8gQXJhYmljLUluZGljIG9yIHZpY2UtdmVyc2EuPGJyPgorICAgICAqICdESUdJVF9UWVBFJyBmbGFncyBjb250cm9sIHdoZXRoZXIgc3RhbmRhcmQgb3IgZXh0ZW5kZWQgQXJhYmljLUluZGljCisgICAgICogZGlnaXRzIGFyZSB1c2VkIHdoZW4gcGVyZm9ybWluZyBkaWdpdCBjb252ZXJzaW9uLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBBcmFiaWNTaGFwaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIGlmICgob3B0aW9ucyAmIERJR0lUU19NQVNLKSA+IDB4ODApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBESUdJVFMgb3B0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgaXNMb2dpY2FsID0gKCAob3B0aW9ucyAmIFRFWFRfRElSRUNUSU9OX01BU0spID09IFRFWFRfRElSRUNUSU9OX0xPR0lDQUwgKTsKKyAgICAgICAgLyogVmFsaWRhdGUgb3B0aW9ucyAqLworICAgICAgICBzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kID0gKCAob3B0aW9ucyAmIFNQQUNFU19SRUxBVElWRV9UT19URVhUX01BU0spID09IFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCApOworICAgICAgICBpZiAoIChvcHRpb25zJlNIQVBFX1RBSUxfVFlQRV9NQVNLKSA9PSBTSEFQRV9UQUlMX05FV19VTklDT0RFKXsKKyAgICAgICAgICAgIHRhaWxDaGFyID0gTkVXX1RBSUxfQ0hBUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhaWxDaGFyID0gT0xEX1RBSUxfQ0hBUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlZW4gVGFpbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUaGUgU0VFTiBmYW1pbHkgY2hhcmFjdGVyIHdpbGwgZXhwYW5kIGludG8gdHdvIGNoYXJhY3RlcnMgdXNpbmcgc3BhY2UgbmVhcgorICAgICAqICAgICAgICAgICAgICAgdGhlIFNFRU4gZmFtaWx5IGNoYXJhY3RlcihpLmUuIHRoZSBzcGFjZSBhZnRlciB0aGUgY2hhcmFjdGVyKS4KKyAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBzcGFjZXMgZm91bmQsIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogQW55IFNlZW4gY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IFRhaWwgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IG9uZSBjZWxsIFNlZW4gYW5kIGEgc3BhY2Ugd2lsbCByZXBsYWNlIHRoZSBUYWlsLgorICAgICAqIEFmZmVjdHM6IFNlZW4gb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRU5fVFdPQ0VMTF9ORUFSID0gMHgyMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIFNlZW4gbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9NQVNLID0gMHg3MDAwMDA7CisKKyAgICAvKiBZZWhIYW16YSBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUaGUgWUVISEFNWkEgY2hhcmFjdGVyIHdpbGwgZXhwYW5kIGludG8gdHdvIGNoYXJhY3RlcnMgdXNpbmcgc3BhY2UgbmVhciBpdAorICAgICAqICAgICAgICAgICAgICAoaS5lLiB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlcikKKyAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBzcGFjZXMgZm91bmQsIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogQW55IFllaCAoZmluYWwgb3IgaXNvbGF0ZWQpIGNoYXJhY3RlciBmb2xsb3dlZCBieSBIYW16YSBjaGFyYWN0ZXIgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgYnkgb25lIGNlbGwgWWVoSGFtemEgYW5kIHNwYWNlIHdpbGwgcmVwbGFjZSB0aGUgSGFtemEuCisgICAgICogQWZmZWN0czogWWVoSGFtemEgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFSEhBTVpBX1RXT0NFTExfTkVBUiAgPSAweDEwMDAwMDA7CisKKworICAgIC8qKiBCaXQgbWFzayBmb3IgWWVoSGFtemEgbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVISEFNWkFfTUFTSyA9IDB4MzgwMDAwMDsKKworICAgIC8qIE5ldyBUYXNoa2VlbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgICAqICAgICAgICAgICAgICAgU3BhY2VzIHdpbGwgYmUgcGxhY2VkIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9CRUdJTiA9IDB4NDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBzcGFjZXMuCisgICAgICogICAgICAgICAgICAgICBTcGFjZXMgd2lsbCBiZSBwbGFjZWQgYXQgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX0VORCA9IDB4NjAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZW1vdmVkLCBidWZmZXIgbGVuZ3RoIHdpbGwgc2hyaW5rLgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICoKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfUkVTSVpFID0gMHg4MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IFRhdHdlZWwgaWYgaXQgaXMgY29ubmVjdGVkIHRvIGFkamFjZW50CisgICAgICogICAgICAgICAgICAgICBjaGFyYWN0ZXJzIChpLmUuIHNoYXBlZCBvbiBUYXR3ZWVsKSBvciByZXBsYWNlZCBieSBzcGFjZSBpZiBpdCBpcyBub3QgY29ubmVjdGVkLgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBZZWhIYW16YSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMID0gMHhDMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgVGFzaGtlZWwgcmVwbGFjZW1lbnQgd2l0aCBTcGFjZSBvciBUYXR3ZWVsIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX01BU0sgID0gMHhFMDAwMDsKKworICAgIC8qIFNwYWNlIGxvY2F0aW9uIENvbnRyb2wgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGVmZmVjdHMgdGhlIG1lYW5pbmcgb2YgQkVHSU4gYW5kIEVORCBvcHRpb25zLiBpZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCB0aGUgZGVmYXVsdAorICAgICAqIGZvciBCRUdJTiBhbmQgRU5EIHdpbGwgYmUgYXMgZm9sbG93aW5nOgorICAgICAqIFRoZSBEZWZhdWx0IChmb3IgYm90aCBWaXN1YWwgTFRSLCBWaXN1YWwgUlRMIGFuZCBMb2dpY2FsIFRleHQpCisgICAgICogICAgICAgICAgIDEuIEJFR0lOIGFsd2F5cyByZWZlcnMgdG8gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5LgorICAgICAqICAgICAgICAgICAyLiBFTkQgYWx3YXlzIHJlZmVycyB0byB0aGUgZW5kIGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5LgorICAgICAqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgdXNlZCBpdCB3aWxsIHN3YXAgdGhlIG1lYW5pbmcgb2YgQkVHSU4gYW5kIEVORCBvbmx5IGZvciBWaXN1YWwgTFRSIHRleHQuCisgICAgICoKKyAgICAgKiBUaGUgYWZmZWN0IG9uIEJFR0lOIGFuZCBFTkQgTWVtb3J5IE9wdGlvbnMgd2lsbCBiZSBhcyBmb2xsb3dpbmc6CisgICAgICogICAgQS4gQkVHSU4gRm9yIFZpc3VhbCBMVFIgdGV4dDogVGhpcyB3aWxsIGJlIHRoZSBiZWdpbm5pbmcgKHJpZ2h0IHNpZGUpIG9mIHRoZSB2aXN1YWwgdGV4dAorICAgICAqICAgICAgIChjb3JyZXNwb25kaW5nIHRvIHRoZSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBlbmQsIHNhbWUgYXMgRU5EIGluIGRlZmF1bHQgYmVoYXZpb3IpCisgICAgICogICAgQi4gQkVHSU4gRm9yIExvZ2ljYWwgdGV4dDogU2FtZSBhcyBCRUdJTiBpbiBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAqICAgIEMuIEVORCBGb3IgVmlzdWFsIExUUiB0ZXh0OiBUaGlzIHdpbGwgYmUgdGhlIGVuZCAobGVmdCBzaWRlKSBvZiB0aGUgdmlzdWFsIHRleHQuIChjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgYmVnaW5uaW5nLCBzYW1lIGFzIEJFR0lOIGluIGRlZmF1bHQgYmVoYXZpb3IpCisgICAgICogICAgRC4gRU5EIEZvciBMb2dpY2FsIHRleHQ6IFNhbWUgYXMgRU5EIGluIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICogQWZmZWN0czogQWxsIExhbUFsZWYgQkVHSU4sIEVORCBhbmQgQVVUTyBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCA9IDB4NDAwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3Igc3dhcHBpbmcgQkVHSU4gYW5kIEVORCBmb3IgVmlzdWFsIExUUiB0ZXh0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfTUFTSyA9IDB4NDAwMDAwMDsKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHNoYXBpbmcgd2lsbCB1c2UgdGhlIG5ldyBVbmljb2RlIGNvZGUgcG9pbnQgZm9yIFRBSUwgKGkuZS4gMHhGRTczKS4KKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkIChEZWZhdWx0KSwgb2xkIHVub2ZmaWNpYWwgVW5pY29kZSBUQUlMIGNvZGUgcG9pbnQgaXMgdXNlZCAoaS5lLiAweDIwMEIpCisgICAgICogRGUtc2hhcGluZyB3aWxsIG5vdCB1c2UgdGhpcyBvcHRpb24gYXMgaXQgd2lsbCBhbHdheXMgc2VhcmNoIGZvciBib3RoIHRoZSBuZXcgVW5pY29kZSBjb2RlIHBvaW50IGZvciB0aGUKKyAgICAgKiBUQUlMIChpLmUuIDB4RkU3Mykgb3IgdGhlIG9sZCB1bm9mZmljaWFsIFVuaWNvZGUgVEFJTCBjb2RlIHBvaW50IChpLmUuIDB4MjAwQikgYW5kIGRlLXNoYXBlIHRoZQorICAgICAqIFNlZW4tRmFtaWx5IGxldHRlciBhY2NvcmRpbmdseS4KKyAgICAgKgorICAgICAqIFNoYXBpbmcgTW9kZTogT25seSBzaGFwaW5nLgorICAgICAqIERlLXNoYXBpbmcgTW9kZTogTi9BLgorICAgICAqIEFmZmVjdHM6IEFsbCBTZWVuIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9UQUlMX05FV19VTklDT0RFID0gMHg4MDAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBuZXcgVW5pY29kZSBUYWlsIG9wdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVBFX1RBSUxfVFlQRV9NQVNLID0gMHg4MDAwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0dST1dfU0hSSU5LID0gMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9HUk9XX1NIUklOSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfUkVTSVpFICAgPSAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgbmV4dCB0byBtb2RpZmllZCBjaGFyYWN0ZXJzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBuZXh0IHRvIG1vZGlmaWVkIGNoYXJhY3RlcnMuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9ORUFSID0gMSA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfRU5EID0gMjsKKworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0VORAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfRU5EID0gMjsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9CRUdJTk5JTkcgPSAzOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0JFR0lOTklORworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfQkVHSU4gPSAzOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBNb2RlOiBGb3IgZWFjaCBMQU1BTEVGIGNoYXJhY3RlciBmb3VuZCwgZXhwYW5kIExBTUFMRUYgdXNpbmcgc3BhY2UgYXQgZW5kLgorICAgICAqICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gc3BhY2UgYXQgZW5kLCB1c2Ugc3BhY2VzIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBJZiB0aGVyZQorICAgICAqICAgICAgICAgICAgICAgaXMgbm8gc3BhY2UgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIHVzZSBzcGFjZXMgYXQgdGhlIG5lYXIgKGkuZS4gdGhlIHNwYWNlCisgICAgICogICAgICAgICAgICAgICBhZnRlciB0aGUgTEFNQUxFRiBjaGFyYWN0ZXIpLgorICAgICAqCisgICAgICogRGVzaGFwaW5nIE1vZGU6IFBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIGZsYWcgZXF1YWxzIExBTUFMRUZfRU5ELgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfQVVUTyAgPSAweDEwMDAwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIG1lbW9yeSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9NQVNLID0gMHgxMDAwMzsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgTGFtQWxlZiBtZW1vcnkgb3B0aW9ucy4gKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfTUFTSyAgPSAweDEwMDAzOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjogdGhlIHNvdXJjZSBpcyBpbiBsb2dpY2FsIChrZXlib2FyZCkgb3JkZXIuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOnRoZSBzb3VyY2UgaXMgaW4gdmlzdWFsIFJUTCBvcmRlciwKKyAgICAgKiB0aGUgcmlnaHRtb3N0IGRpc3BsYXllZCBjaGFyYWN0ZXIgc3RvcmVkIGZpcnN0LgorICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9SVEwgPSAwOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjogdGhlIHNvdXJjZSBpcyBpbiB2aXN1YWwgKGRpc3BsYXkpIG9yZGVyLCB0aGF0IGlzLAorICAgICAqIHRoZSBsZWZ0bW9zdCBkaXNwbGF5ZWQgY2hhcmFjdGVyIGlzIHN0b3JlZCBmaXJzdC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9WSVNVQUxfTFRSID0gNDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaXJlY3Rpb24gaW5kaWNhdG9ycy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9NQVNLID0gNDsKKworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiBkbyBub3QgcGVyZm9ybSBsZXR0ZXIgc2hhcGluZy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX05PT1AgPSAwOworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIG5vcm1hdGl2ZSBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLAorICAgICAqIGJ5IHNoYXBlZCBvbmVzIGluIHRoZSBVK0ZFNzAgKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jay4gUGVyZm9ybXMgTGFtLUFsZWYgbGlnYXR1cmUKKyAgICAgKiBzdWJzdGl0dXRpb24uCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19TSEFQRSA9IDg7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugc2hhcGVkIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVK0ZFNzAgKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jaworICAgICAqIGJ5IG5vcm1hdGl2ZSBvbmVzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2suICBDb252ZXJ0cyBMYW0tQWxlZiBsaWdhdHVyZXMgdG8gcGFpcnMgb2YgTGFtIGFuZAorICAgICAqIEFsZWYgY2hhcmFjdGVycywgY29uc3VtaW5nIHNwYWNlcyBpZiByZXF1aXJlZC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1VOU0hBUEUgPSAweDEwOworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIG5vcm1hdGl2ZSBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLAorICAgICAqIGV4Y2VwdCBmb3IgdGhlIFRBU0hLRUVMIGNoYXJhY3RlcnMgYXQgVSswNjRCLi4uVSswNjUyLCBieSBzaGFwZWQgb25lcyBpbiB0aGUgVStGZTcwCisgICAgICogKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jay4gIFRoZSBUQVNIS0VFTCBjaGFyYWN0ZXJzIHdpbGwgYWx3YXlzIGJlIGNvbnZlcnRlZCB0bworICAgICAqIHRoZSBpc29sYXRlZCBmb3JtcyByYXRoZXIgdGhhbiB0byB0aGVpciBjb3JyZWN0IHNoYXBlLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQgPSAweDE4OworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGxldHRlciBzaGFwaW5nIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19NQVNLID0gMHgxODsKKworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IGRvIG5vdCBwZXJmb3JtIGRpZ2l0IHNoYXBpbmcuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX05PT1AgPSAwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOID0gMHgyMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBSZXBsYWNlIEFyYWJpYy1JbmRpYyBkaWdpdHMgYnkgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19BTjJFTiA9IDB4NDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjoKKyAgICAgKiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaWYgdGhlIG1vc3QgcmVjZW50IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNoYXJhY3RlcgorICAgICAqIGlzIGFuIEFyYWJpYyBsZXR0ZXIgKGl0cyBCaWRpIGRpcmVjdGlvbiB2YWx1ZSBpcyBSSUdIVF9UT19MRUZUX0FSQUJJQykuCisgICAgICogVGhlIGluaXRpYWwgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgbm90IGFuIEFyYWJpYywKKyAgICAgKiBsZXR0ZXIsIHNvIEV1cm9wZWFuIGRpZ2l0cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgd2lsbCBub3QgY2hhbmdlLgorICAgICAqIENvbXBhcmUgdG8gRElHSVRTX0FMRU4yQU5fSU5JVF9BTC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU5fSU5JVF9MUiA9IDB4NjA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjoKKyAgICAgKiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaWYgdGhlIG1vc3QgcmVjZW50IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNoYXJhY3RlcgorICAgICAqIGlzIGFuIEFyYWJpYyBsZXR0ZXIgKGl0cyBCaWRpIGRpcmVjdGlvbiB2YWx1ZSBpcyBSSUdIVF9UT19MRUZUX0FSQUJJQykuCisgICAgICogVGhlIGluaXRpYWwgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgYW4gQXJhYmljLAorICAgICAqIGxldHRlciwgc28gRXVyb3BlYW4gZGlnaXRzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB3aWxsIGNoYW5nZS4KKyAgICAgKiBDb21wYXJlIHRvIERJR0lUU19BTEVOMkFOX0lOVF9MUi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU5fSU5JVF9BTCA9IDB4ODA7CisKKyAgICAvKiogTm90IGEgdmFsaWQgb3B0aW9uIHZhbHVlLiAqLworICAgIC8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0lUU19SRVNFUlZFRCA9IDB4YTA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlnaXQgc2hhcGluZyBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19NQVNLID0gMHhlMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHR5cGUgb3B0aW9uOiBVc2UgQXJhYmljLUluZGljIGRpZ2l0cyAoVSswNjYwLi4uVSswNjY5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX0FOID0gMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHR5cGUgb3B0aW9uOiBVc2UgRWFzdGVybiAoRXh0ZW5kZWQpIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFUrMDZmMC4uLlUrMDZmOSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9BTl9FWFRFTkRFRCA9IDB4MTAwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpZ2l0IHR5cGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX01BU0sgPSAweDAxMDA7IC8vIDB4M2YwMD8KKworICAgIC8qKgorICAgICAqIHNvbWUgY29uc3RhbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBIQU1aQUZFX0NIQVIgICAgICAgPSAnXHVmZTgwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEhBTVpBMDZfQ0hBUiAgICAgICA9ICdcdTA2MjEnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgWUVIX0hBTVpBX0NIQVIgICAgID0gJ1x1MDYyNic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBZRUhfSEFNWkFGRV9DSEFSICAgPSAnXHVGRTg5JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTUFMRUZfU1BBQ0VfU1VCICA9ICdcdWZmZmYnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVEFTSEtFRUxfU1BBQ0VfU1VCID0gJ1x1ZmZmZSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU1fQ0hBUiAgICAgID0gJ1x1MDY0NCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUEFDRV9DSEFSICAgID0gJ1x1MDAyMCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUEFDRV9DSEFSX0ZPUl9MQU1BTEVGID0gJ1x1ZmVmZic7IC8vIFhYWDogdHdlYWsgZm9yIFRleHRMaW5lIHVzZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0hBRERBX0NIQVIgICA9ICdcdUZFN0MnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVEFUV0VFTF9DSEFSICA9ICdcdTA2NDAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0hBRERBX1RBVFdFRUxfQ0hBUiA9ICdcdUZFN0QnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTkVXX1RBSUxfQ0hBUiA9ICdcdUZFNzMnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgT0xEX1RBSUxfQ0hBUiA9ICdcdTIwMEInOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSEFQRV9NT0RFICAgICAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNIQVBFX01PREUgICAgPSAxOworCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCByaHMpIHsKKyAgICAgICAgcmV0dXJuIHJocyAhPSBudWxsICYmCisgICAgICAgICAgICByaHMuZ2V0Q2xhc3MoKSA9PSBBcmFiaWNTaGFwaW5nLmNsYXNzICYmCisgICAgICAgICAgICBvcHRpb25zID09ICgoQXJhYmljU2hhcGluZylyaHMpLm9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgIC8vL0NMT1ZFUjpPRkYKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnWycpOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgeworICAgICAgICBjYXNlIExBTUFMRUZfUkVTSVpFOiBidWYuYXBwZW5kKCJMYW1BbGVmIHJlc2l6ZSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX05FQVI6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgYmVnaW4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IGVuZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0FVVE86IGJ1Zi5hcHBlbmQoImxhbUFsZWYgYXV0byIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBURVhUX0RJUkVDVElPTl9NQVNLKSB7CisgICAgICAgIGNhc2UgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTDogYnVmLmFwcGVuZCgiLCBsb2dpY2FsIik7IGJyZWFrOworICAgICAgICBjYXNlIFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9MVFI6IGJ1Zi5hcHBlbmQoIiwgdmlzdWFsIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfTk9PUDogYnVmLmFwcGVuZCgiLCBubyBsZXR0ZXIgc2hhcGluZyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOiBidWYuYXBwZW5kKCIsIHNoYXBlIGxldHRlcnMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDogYnVmLmFwcGVuZCgiLCBzaGFwZSBsZXR0ZXJzIHRhc2hrZWVsIGlzb2xhdGVkIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRTogYnVmLmFwcGVuZCgiLCB1bnNoYXBlIGxldHRlcnMiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgU0VFTl9NQVNLKSB7CisgICAgICAgIGNhc2UgU0VFTl9UV09DRUxMX05FQVI6IGJ1Zi5hcHBlbmQoIiwgU2VlbiBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFlFSEhBTVpBX01BU0spIHsKKyAgICAgICAgY2FzZSBZRUhIQU1aQV9UV09DRUxMX05FQVI6IGJ1Zi5hcHBlbmQoIiwgWWVoIEhhbXphIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgVEFTSEtFRUxfTUFTSykgeworICAgICAgICBjYXNlIFRBU0hLRUVMX0JFR0lOOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIGF0IGJlZ2luIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX0VORDogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCBhdCBlbmQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIHJlcGxhY2Ugd2l0aCB0YXR3ZWVsIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX1JFU0laRTogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCByZXNpemUiKTsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgeworICAgICAgICBjYXNlIERJR0lUU19OT09QOiBidWYuYXBwZW5kKCIsIG5vIGRpZ2l0IHNoYXBpbmciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfQU4yRU46IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEVOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0xSOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiBjb250ZXh0dWFsbHk6IGRlZmF1bHQgRU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfQUw6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIGNvbnRleHR1YWxseTogZGVmYXVsdCBBTCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVF9UWVBFX01BU0spIHsKKyAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOOiBidWYuYXBwZW5kKCIsIHN0YW5kYXJkIEFyYWJpYy1JbmRpYyBkaWdpdHMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTl9FWFRFTkRFRDogYnVmLmFwcGVuZCgiLCBleHRlbmRlZCBBcmFiaWMtSW5kaWMgZGlnaXRzIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIC8vL0NMT1ZFUjpPTgorCisgICAgLy8KKyAgICAvLyBwb3J0ZWQgYXBpCisgICAgLy8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJUlJFTEVWQU5UID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFNVFlQRSA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTEVGVFlQRSA9IDMyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktSID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS0wgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX01BU0sgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGlycmVsZXZhbnRQb3NbXSA9IHsKKyAgICAgICAgMHgwLCAweDIsIDB4NCwgMHg2LCAweDgsIDB4QSwgMHhDLCAweEUKKyAgICB9OworCisvKgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgY29udmVydExhbUFsZWZbXSA9ICB7CisgICAgICAgICdcdTA2MjInLCAvLyBGRUY1CisgICAgICAgICdcdTA2MjInLCAvLyBGRUY2CisgICAgICAgICdcdTA2MjMnLCAvLyBGRUY3CisgICAgICAgICdcdTA2MjMnLCAvLyBGRUY4CisgICAgICAgICdcdTA2MjUnLCAvLyBGRUY5CisgICAgICAgICdcdTA2MjUnLCAvLyBGRUZBCisgICAgICAgICdcdTA2MjcnLCAvLyBGRUZCCisgICAgICAgICdcdTA2MjcnICAvLyBGRUZDCisgICAgfTsKKyovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdGFpbEZhbWlseUlzb2xhdGVkRmluYWxbXSA9IHsKKyAgICAgICAgLyogRkVCMSAqLyAxLAorICAgICAgICAvKiBGRUIyICovIDEsCisgICAgICAgIC8qIEZFQjMgKi8gMCwKKyAgICAgICAgLyogRkVCNCAqLyAwLAorICAgICAgICAvKiBGRUI1ICovIDEsCisgICAgICAgIC8qIEZFQjYgKi8gMSwKKyAgICAgICAgLyogRkVCNyAqLyAwLAorICAgICAgICAvKiBGRUI4ICovIDAsCisgICAgICAgIC8qIEZFQjkgKi8gMSwKKyAgICAgICAgLyogRkVCQSAqLyAxLAorICAgICAgICAvKiBGRUJCICovIDAsCisgICAgICAgIC8qIEZFQkMgKi8gMCwKKyAgICAgICAgLyogRkVCRCAqLyAxLAorICAgICAgICAvKiBGRUJFICovIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRhc2hrZWVsTWVkaWFsW10gPSB7CisgICAgICAgIC8qIEZFNzAgKi8gMCwKKyAgICAgICAgLyogRkU3MSAqLyAxLAorICAgICAgICAvKiBGRTcyICovIDAsCisgICAgICAgIC8qIEZFNzMgKi8gMCwKKyAgICAgICAgLyogRkU3NCAqLyAwLAorICAgICAgICAvKiBGRTc1ICovIDAsCisgICAgICAgIC8qIEZFNzYgKi8gMCwKKyAgICAgICAgLyogRkU3NyAqLyAxLAorICAgICAgICAvKiBGRTc4ICovIDAsCisgICAgICAgIC8qIEZFNzkgKi8gMSwKKyAgICAgICAgLyogRkU3QSAqLyAwLAorICAgICAgICAvKiBGRTdCICovIDEsCisgICAgICAgIC8qIEZFN0MgKi8gMCwKKyAgICAgICAgLyogRkU3RCAqLyAxLAorICAgICAgICAvKiBGRTdFICovIDAsCisgICAgICAgIC8qIEZFN0YgKi8gMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIHllaEhhbXphVG9ZZWhbXSA9CisgICAgeworICAgIC8qIGlzb2xhdGVkKi8gMHhGRUVGLAorICAgIC8qIGZpbmFsICAgKi8gMHhGRUYwCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW10gPSB7CisgICAgICAgICdcdTA2MjInLCAvLyAwNjVDCisgICAgICAgICdcdTA2MjMnLCAvLyAwNjVECisgICAgICAgICdcdTA2MjUnLCAvLyAwNjVFCisgICAgICAgICdcdTA2MjcnLCAvLyAwNjVGCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGFyYUxpbmsgPSB7CisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDExLCAgLyoweDA2MjIqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxMywgIC8qMHgwNjIzKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MTUsICAvKjB4MDYyNCovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDE3LCAgLyoweDA2MjUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgxOSwgIC8qMHgwNjI2Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MUQsICAvKjB4MDYyNyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDFGLCAgLyoweDA2MjgqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgyMywgIC8qMHgwNjI5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MjUsICAvKjB4MDYyQSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDI5LCAgLyoweDA2MkIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyRCwgIC8qMHgwNjJDKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MzEsICAvKjB4MDYyRCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDM1LCAgLyoweDA2MkUqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzOSwgIC8qMHgwNjJGKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0IsICAvKjB4MDYzMCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNELCAgLyoweDA2MzEqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzRiwgIC8qMHgwNjMyKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDEsICAvKjB4MDYzMyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQ1LCAgLyoweDA2MzQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0OSwgIC8qMHgwNjM1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NEQsICAvKjB4MDYzNiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDUxLCAgLyoweDA2MzcqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1NSwgIC8qMHgwNjM4Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTksICAvKjB4MDYzOSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDVELCAgLyoweDA2M0EqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjNCLTB4MDYzRiovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NDAqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2MSwgIC8qMHgwNjQxKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjUsICAvKjB4MDY0MiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDY5LCAgLyoweDA2NDMqLworICAgICAgICAxICsgMiAgICAgICArIDE2ICsgMjU2ICogMHg2RCwgIC8qMHgwNjQ0Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzEsICAvKjB4MDY0NSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDc1LCAgLyoweDA2NDYqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3OSwgIC8qMHgwNjQ3Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4N0QsICAvKjB4MDY0OCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDdGLCAgLyoweDA2NDkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg4MSwgIC8qMHgwNjRBKi8KKyAgICAgICAgNCwgNCwgNCwgNCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0Qi0weDA2NEUqLworICAgICAgICA0LCA0LCA0LCA0LCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjRGLTB4MDY1MiovCisgICAgICAgIDQsIDQsIDQsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NTMtMHgwNjU3Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY1OC0weDA2NUIqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4NSwgIC8qMHgwNjVDKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODcsICAvKjB4MDY1RCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg5LCAgLyoweDA2NUUqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4QiwgIC8qMHgwNjVGKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY2MC0weDA2NjQqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjY1LTB4MDY2OSovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyoweDA2NkEtMHgwNjZGKi8KKyAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3MCovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzEqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjcyKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3MyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzQqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjc1Ki8KKyAgICAgICAgMSwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3Ni0weDA2NzcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjc4LTB4MDY3RCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2N0UtMHgwNjgzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDY4NC0weDA2ODcqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgIC8qMHgwNjg4LTB4MDY5MSovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgICAgICAgLyoweDA2OTItMHgwNjk5Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY5QS0weDA2QTMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNjlBLTB4MDZBMyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QTQtMHgwNkFEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZBNC0weDA2QUQqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkFFLTB4MDZCNyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2QUUtMHgwNkI3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZCOC0weDA2QkYqLworICAgICAgICAxKzIsIDErMiwgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkI4LTB4MDZCRiovCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QzAqLworICAgICAgICAxKzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkMxKi8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAvKjB4MDZDMi0weDA2Q0IqLworICAgICAgICAxKzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkNDKi8KKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2Q0UtMHgwNkQxKi8KKyAgICAgICAgMSwgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZEMi0weDA2RDMqLworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBwcmVzTGluayA9IHsKKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzAqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3MSovCisgICAgICAgIDEgKyAyLCAwLCAxKyAyLCAwLCAxKyAyLCAgICAgIC8qMHhGRTcyLTB4RkU3NiovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTc3Ki8KKyAgICAgICAgMSsgMiwgMSArIDIsIDErMiwgMSArIDIsICAgICAgLyoweEZFNzgtMHhGRTgxKi8KKyAgICAgICAgMSsgMiwgMSArIDIsIDErMiwgMSArIDIsICAgICAgLyoweEZFODItMHhGRTg1Ki8KKyAgICAgICAgMCwgMCArIDMyLCAxICsgMzIsIDAgKyAzMiwgICAgLyoweEZFODYtMHhGRTg5Ki8KKyAgICAgICAgMSArIDMyLCAwLCAxLCAgMCArIDMyLCAgICAgICAgLyoweEZFOEEtMHhGRThEKi8KKyAgICAgICAgMSArIDMyLCAwLCAyLCAgMSArIDIsICAgICAgICAgLyoweEZFOEUtMHhGRTkxKi8KKyAgICAgICAgMSwgMCArIDMyLCAxICsgMzIsIDAsICAgICAgICAgLyoweEZFOTItMHhGRTk1Ki8KKyAgICAgICAgMiwgMSArIDIsIDEsIDAsICAgICAgICAgICAgICAgLyoweEZFOTYtMHhGRTk5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFOUEtMHhGRTlEKi8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFOUUtMHhGRUExKi8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQTItMHhGRUE1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQTYtMHhGRUE5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQUEtMHhGRUFEKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFQUUtMHhGRUIxKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFQjItMHhGRUI1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQjYtMHhGRUI5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQkEtMHhGRUJEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQkUtMHhGRUMxKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQzItMHhGRUM1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQzYtMHhGRUM5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQ0EtMHhGRUNEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQ0UtMHhGRUQxKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRDItMHhGRUQ1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRDYtMHhGRUQ5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFREEtMHhGRUREKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFREUtMHhGRUUxKi8KKyAgICAgICAgMSwgMCArIDE2LCAyICsgMTYsIDEgKyAyICsxNiwgLyoweEZFRTItMHhGRUU1Ki8KKyAgICAgICAgMSArIDE2LCAwLCAyLCAxKzIsICAgICAgICAgICAgLyoweEZFRTYtMHhGRUU5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRUEtMHhGRUVEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRUUtMHhGRUYxKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFRjItMHhGRUY1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRjYtMHhGRUY5Ki8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFRkEtMHhGRUZEKi8KKyAgICAgICAgMSwgMCwgMSwgMCwKKyAgICAgICAgMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjb252ZXJ0RkV0bzA2ID0geworICAgICAgICAvKioqKioqKioqKiowKioqKioqMSoqKioqKjIqKioqKiozKioqKioqNCoqKioqKjUqKioqKio2KioqKioqNyoqKioqKjgqKioqKio5KioqKioqQSoqKioqKkIqKioqKipDKioqKioqRCoqKioqKkUqKioqKipGKioqLworICAgICAgICAvKkZFNyovICAgMHg2NEIsIDB4NjRCLCAweDY0QywgMHg2NEMsIDB4NjRELCAweDY0RCwgMHg2NEUsIDB4NjRFLCAweDY0RiwgMHg2NEYsIDB4NjUwLCAweDY1MCwgMHg2NTEsIDB4NjUxLCAweDY1MiwgMHg2NTIsCisgICAgICAgIC8qRkU4Ki8gICAweDYyMSwgMHg2MjIsIDB4NjIyLCAweDYyMywgMHg2MjMsIDB4NjI0LCAweDYyNCwgMHg2MjUsIDB4NjI1LCAweDYyNiwgMHg2MjYsIDB4NjI2LCAweDYyNiwgMHg2MjcsIDB4NjI3LCAweDYyOCwKKyAgICAgICAgLypGRTkqLyAgIDB4NjI4LCAweDYyOCwgMHg2MjgsIDB4NjI5LCAweDYyOSwgMHg2MkEsIDB4NjJBLCAweDYyQSwgMHg2MkEsIDB4NjJCLCAweDYyQiwgMHg2MkIsIDB4NjJCLCAweDYyQywgMHg2MkMsIDB4NjJDLAorICAgICAgICAvKkZFQSovICAgMHg2MkMsIDB4NjJELCAweDYyRCwgMHg2MkQsIDB4NjJELCAweDYyRSwgMHg2MkUsIDB4NjJFLCAweDYyRSwgMHg2MkYsIDB4NjJGLCAweDYzMCwgMHg2MzAsIDB4NjMxLCAweDYzMSwgMHg2MzIsCisgICAgICAgIC8qRkVCKi8gICAweDYzMiwgMHg2MzMsIDB4NjMzLCAweDYzMywgMHg2MzMsIDB4NjM0LCAweDYzNCwgMHg2MzQsIDB4NjM0LCAweDYzNSwgMHg2MzUsIDB4NjM1LCAweDYzNSwgMHg2MzYsIDB4NjM2LCAweDYzNiwKKyAgICAgICAgLypGRUMqLyAgIDB4NjM2LCAweDYzNywgMHg2MzcsIDB4NjM3LCAweDYzNywgMHg2MzgsIDB4NjM4LCAweDYzOCwgMHg2MzgsIDB4NjM5LCAweDYzOSwgMHg2MzksIDB4NjM5LCAweDYzQSwgMHg2M0EsIDB4NjNBLAorICAgICAgICAvKkZFRCovICAgMHg2M0EsIDB4NjQxLCAweDY0MSwgMHg2NDEsIDB4NjQxLCAweDY0MiwgMHg2NDIsIDB4NjQyLCAweDY0MiwgMHg2NDMsIDB4NjQzLCAweDY0MywgMHg2NDMsIDB4NjQ0LCAweDY0NCwgMHg2NDQsCisgICAgICAgIC8qRkVFKi8gICAweDY0NCwgMHg2NDUsIDB4NjQ1LCAweDY0NSwgMHg2NDUsIDB4NjQ2LCAweDY0NiwgMHg2NDYsIDB4NjQ2LCAweDY0NywgMHg2NDcsIDB4NjQ3LCAweDY0NywgMHg2NDgsIDB4NjQ4LCAweDY0OSwKKyAgICAgICAgLypGRUYqLyAgIDB4NjQ5LCAweDY0QSwgMHg2NEEsIDB4NjRBLCAweDY0QSwgMHg2NUMsIDB4NjVDLCAweDY1RCwgMHg2NUQsIDB4NjVFLCAweDY1RSwgMHg2NUYsIDB4NjVGCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzaGFwZVRhYmxlW11bXVtdID0geworICAgICAgICB7IHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwxLDAsM30sIHswLDEsMCwxfSB9LAorICAgICAgICB7IHswLDAsMiwyfSwgezAsMCwxLDJ9LCB7MCwxLDEsMn0sIHswLDEsMSwzfSB9LAorICAgICAgICB7IHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwxLDAsM30sIHswLDEsMCwzfSB9LAorICAgICAgICB7IHswLDAsMSwyfSwgezAsMCwxLDJ9LCB7MCwxLDEsMn0sIHswLDEsMSwzfSB9CisgICAgfTsKKworICAgIC8qCisgICAgICogVGhpcyBmdW5jdGlvbiBzaGFwZXMgRXVyb3BlYW4gZGlnaXRzIHRvIEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpbi1wbGFjZSwgd3JpdGluZyBvdmVyIHRoZSBpbnB1dCBjaGFyYWN0ZXJzLiAgRGF0YSBpcyBpbiB2aXN1YWwKKyAgICAgKiBvcmRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlnaXRCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsYXN0U3Ryb25nV2FzQUwpIHsKKyAgICAgICAgZGlnaXRCYXNlIC09ICcwJzsgLy8gbW92ZSBjb21tb24gYWRqdXN0bWVudCBvdXQgb2YgbG9vcAorCisgICAgICAgIGZvcihpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoOyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICAgIHN3aXRjaCAoQ2hhcmFjdGVyLmdldERpcmVjdGlvbmFsaXR5KGNoKSkgeworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDoKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ6CisgICAgICAgICAgICAgICAgbGFzdFN0cm9uZ1dhc0FMID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQzoKKyAgICAgICAgICAgICAgICBsYXN0U3Ryb25nV2FzQUwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOgorICAgICAgICAgICAgICAgIGlmIChsYXN0U3Ryb25nV2FzQUwgJiYgY2ggPD0gJ1x1MDAzOScpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKShjaCArIGRpZ2l0QmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGludmVydEJ1ZmZlcgorICAgICAqIEZ1bmN0aW9uOiBUaGlzIGZ1bmN0aW9uIGludmVydHMgdGhlIGJ1ZmZlciwgaXQncyB1c2VkCisgICAgICogICAgICAgICAgIGluIGNhc2UgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZSBidWZmZXIgdG8gYmUKKyAgICAgKiAgICAgICAgICAgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW52ZXJ0QnVmZmVyKGNoYXJbXSBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKworICAgICAgICBmb3IoaW50IGkgPSBzdGFydCwgaiA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsgaSA8IGo7IGkrKywgLS1qKSB7CisgICAgICAgICAgICBjaGFyIHRlbXAgPSBidWZmZXJbaV07CisgICAgICAgICAgICBidWZmZXJbaV0gPSBidWZmZXJbal07CisgICAgICAgICAgICBidWZmZXJbal0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY2hhbmdlTGFtQWxlZgorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyB0aGUgQWxlZiBjaGFyYWN0ZXJzIGludG8gYW4gZXF1aXZhbGVudAorICAgICAqICAgICAgICAgICBMYW1BbGVmIGxvY2F0aW9uIGluIHRoZSAweDA2eHggUmFuZ2UsIHRoaXMgaXMgYW4KKyAgICAgKiAgICAgICAgICAgaW50ZXJtZWRpYXRlIHN0YWdlIGluIHRoZSBvcGVyYXRpb24gb2YgdGhlIHByb2dyYW0KKyAgICAgKiAgICAgICAgICAgbGF0ZXIgaXQnbGwgYmUgY29udmVydGVkIGludG8gdGhlIDB4RkV4eCBMYW1BbGVmcworICAgICAqICAgICAgICAgICBpbiB0aGUgc2hhcGluZyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjaGFyIGNoYW5nZUxhbUFsZWYoY2hhciBjaCkgeworICAgICAgICBzd2l0Y2goY2gpIHsKKyAgICAgICAgY2FzZSAnXHUwNjIyJzogcmV0dXJuICdcdTA2NUMnOworICAgICAgICBjYXNlICdcdTA2MjMnOiByZXR1cm4gJ1x1MDY1RCc7CisgICAgICAgIGNhc2UgJ1x1MDYyNSc6IHJldHVybiAnXHUwNjVFJzsKKyAgICAgICAgY2FzZSAnXHUwNjI3JzogcmV0dXJuICdcdTA2NUYnOworICAgICAgICBkZWZhdWx0OiAgcmV0dXJuICdcdTAwMDAnOyAvLyBub3QgYSBsYW1hbGVmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzcGVjaWFsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBTcGVjaWFsIEFyYWJpYyBjaGFyYWN0ZXJzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgc2hhcGVVbmljb2RlCisgICAgICogICAgICAgICAgIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMSBvciAyIGZvciB0aGVzZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3BlY2lhbENoYXIoY2hhciBjaCkgeworICAgICAgICBpZiAoKGNoID4gJ1x1MDYyMScgJiYgY2ggPCAnXHUwNjI2JykgfHwKKyAgICAgICAgICAgIChjaCA9PSAnXHUwNjI3JykgfHwKKyAgICAgICAgICAgIChjaCA+ICdcdTA2MkUnICYmIGNoIDwgJ1x1MDYzMycpIHx8CisgICAgICAgICAgICAoY2ggPiAnXHUwNjQ3JyAmJiBjaCA8ICdcdTA2NEEnKSB8fAorICAgICAgICAgICAgKGNoID09ICdcdTA2MjknKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1MDY0QicgJiYgY2g8PSAnXHUwNjUyJykgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgwNjUzICYmIGNoIDw9IDB4MDY1NSB8fAorICAgICAgICAgICAgICAgICAgIGNoID09IDB4MDY3MCB8fAorICAgICAgICAgICAgICAgICAgIGNoID49IDB4RkU3MCAmJiBjaCA8PSAweEZFN0YpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBnZXRMaW5rCisgICAgICogRnVuY3Rpb246IFJlc29sdmVzIHRoZSBsaW5rIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMgYXMKKyAgICAgKiAgICAgICAgICAgQXJhYmljIGNoYXJhY3RlcnMgaGF2ZSBmb3VyIGZvcm1zIDoKKyAgICAgKiAgICAgICAgICAgSXNvbGF0ZWQsIEluaXRpYWwsIE1pZGRsZSBhbmQgRmluYWwgRm9ybQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMaW5rKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKGNoID49ICdcdTA2MjInICYmIGNoIDw9ICdcdTA2RDMnKSB7CisgICAgICAgICAgICByZXR1cm4gYXJhTGlua1tjaCAtICdcdTA2MjInXTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHUyMDBEJykgeworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1MjA2RCcgJiYgY2ggPD0gJ1x1MjA2RicpIHsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlc0xpbmtbY2ggLSAnXHVGRTcwJ107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNvdW50U3BhY2VzCisgICAgICogRnVuY3Rpb246IENvdW50cyB0aGUgbnVtYmVyIG9mIHNwYWNlcworICAgICAqICAgICAgICAgICBhdCBlYWNoIGVuZCBvZiB0aGUgbG9naWNhbCBidWZmZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRTcGFjZXNMZWZ0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IHN0YXJ0ICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZXN0W2ldICE9IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRTcGFjZXNSaWdodChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgY291bnQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgIGlmIChkZXN0W2ldICE9IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBjb3VudCAtIDEgLSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc1Rhc2hrZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIHRydWUgZm9yIFRhc2hrZWVsIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFzaGtlZWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggY2ggPj0nXHUwNjRCJyAmJiBjaCA8PSAnXHUwNjUyJyApOworICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzU2VlblRhaWxGYW1pbHlDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc2VlbiBmYW1pbHkgaXNvbGF0ZWQgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgIGluIHRoZSBGRSByYW5nZSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNTZWVuVGFpbEZhbWlseUNoYXIoY2hhciBjaCkgeworICAgICAgICBpZiAoY2ggPj0gMHhmZWIxICYmIGNoIDwgMHhmZWJmKXsKKyAgICAgICAgICAgICByZXR1cm4gdGFpbEZhbWlseUlzb2xhdGVkRmluYWwgW2NoIC0gMHhGRUIxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICAvKiBOYW1lICAgICA6IGlzU2VlbkZhbWlseUNoYXIKKyAgICAgICogRnVuY3Rpb24gOiByZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNlZW4gZmFtaWx5IGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZQorICAgICAgKiAgICAgICAgICAgIDA2IHJhbmdlIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1NlZW5GYW1pbHlDaGFyKGNoYXIgIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4NjMzICYmIGNoIDw9IDB4NjM2KXsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzVGFpbENoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgbWF0Y2hlcyBvbmUgb2YgdGhlIHRhaWwgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAoMHhmZTczIG9yIDB4MjAwYikgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWlsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmKGNoID09IE9MRF9UQUlMX0NIQVIgfHwgY2ggPT0gTkVXX1RBSUxfQ0hBUil7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzQWxlZk1ha3NvdXJhQ2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIEFsZWYgTWFrc291cmEgRmluYWwgb3IgaXNvbGF0ZWQKKyAgICAgKiAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxlZk1ha3NvdXJhQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIChjaCA9PSAweEZFRUYpIHx8ICggY2ggPT0gMHhGRUYwKSB8fCAoY2ggPT0gMHgwNjQ5KSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgICA6IGlzWWVoSGFtemFDaGFyCisgICAgICogRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHllaEhhbXphIGlzb2xhdGVkIG9yIHllaGhhbXphCisgICAgICogICAgICAgICAgICBmaW5hbCBpcyBmb3VuZCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNZZWhIYW16YUNoYXIoY2hhciBjaCkgeworICAgICAgICBpZigoY2g9PTB4RkU4OSl8fChjaD09MHhGRThBKSl7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1Rhc2hrZWVsQ2hhckZFCisgICAgICpGdW5jdGlvbiA6IFJldHVybnMgdHJ1ZSBmb3IgVGFzaGtlZWwgY2hhcmFjdGVycyBpbiBGRSByYW5nZSBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rhc2hrZWVsQ2hhckZFKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggY2ghPTB4RkU3NSAmJihjaD49MHhGRTcwICYmIGNoPD0gMHhGRTdGKSApOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZTogaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogQ2hlY2tzIGlmIHRoZSBUYXNoa2VlbCBDaGFyYWN0ZXIgaXMgb24gVGF0d2VlbCBvciBub3QsaWYgdGhlCisgICAgICogICAgICAgICAgIFRhc2hrZWVsIG9uIHRhdHdlZWwgKEZFIHJhbmdlKSwgaXQgcmV0dXJucyAxIGVsc2UgaWYgdGhlCisgICAgICogICAgICAgICAgIFRhc2hrZWVsIHdpdGggc2hhZGRhIG9uIHRhdHdlZWwgKEZDIHJhbmdlKXJldHVybiAyIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICByZXR1cm5zIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoY2hhciBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweGZlNzAgJiYgY2ggPD0gMHhmZTdmICYmIGNoICE9IE5FV19UQUlMX0NIQVIgJiYgY2ggIT0gMHhGRTc1ICYmIGNoICE9IFNIQUREQV9UQVRXRUVMX0NIQVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YXNoa2VlbE1lZGlhbCBbY2ggLSAweEZFNzBdOworICAgICAgICB9IGVsc2UgaWYoIChjaCA+PSAweGZjZjIgJiYgY2ggPD0gMHhmY2Y0KSB8fCAoY2ggPT0gU0hBRERBX1RBVFdFRUxfQ0hBUikpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWU6IGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogQ2hlY2tzIGlmIHRoZSBUYXNoa2VlbCBDaGFyYWN0ZXIgaXMgaW4gdGhlIGlzb2xhdGVkIGZvcm0KKyAgICAgKiAgICAgICAgICAgKGkuZS4gVW5pY29kZSBGRSByYW5nZSkgcmV0dXJucyAxIGVsc2UgaWYgdGhlIFRhc2hrZWVsCisgICAgICogICAgICAgICAgIHdpdGggc2hhZGRhIGlzIGluIHRoZSBpc29sYXRlZCBmb3JtIChpLmUuIFVuaWNvZGUgRkMgcmFuZ2UpCisgICAgICogICAgICAgICAgIHJldHVybnMgMSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIoY2hhciBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweGZlNzAgJiYgY2ggPD0gMHhmZTdmICYmIGNoICE9IE5FV19UQUlMX0NIQVIgJiYgY2ggIT0gMHhGRTc1KXsKKyAgICAgICAgICAgIHJldHVybiAoMSAtIHRhc2hrZWVsTWVkaWFsIFtjaCAtIDB4RkU3MF0pOworICAgICAgICB9IGVsc2UgaWYoY2ggPj0gMHhmYzVlICYmIGNoIDw9IDB4ZmM2Myl7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNleworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc0FsZWZDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgMSBmb3IgQWxlZiBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPT0gJ1x1MDYyMicgfHwgY2ggPT0gJ1x1MDYyMycgfHwgY2ggPT0gJ1x1MDYyNScgfHwgY2ggPT0gJ1x1MDYyNyc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNMYW1BbGVmQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIHRydWUgZm9yIExhbUFsZWYgY2hhcmFjdGVycyBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYW1BbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA+PSAnXHVGRUY1JyAmJiBjaCA8PSAnXHVGRUZDJzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICdcdTA2NUMnICYmIGNoIDw9ICdcdTA2NUYnOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNhbGN1bGF0ZVNpemUKKyAgICAgKiBGdW5jdGlvbjogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBkZXN0U2l6ZSB0byBiZSB1c2VkIGluIHByZWZsaWdodGluZworICAgICAqICAgICAgICAgICB3aGVuIHRoZSBkZXN0U2l6ZSBpcyBlcXVhbCB0byAwCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU2l6ZShjaGFyW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCkgeworCisgICAgICAgIGludCBkZXN0U2l6ZSA9IHNvdXJjZUxlbmd0aDsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOgorICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6CisgICAgICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNvdXJjZVN0YXJ0LCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGggLSAxOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc291cmNlW2ldID09IExBTV9DSEFSICYmIGlzQWxlZkNoYXIoc291cmNlW2krMV0pKSB8fCBpc1Rhc2hrZWVsQ2hhckZFKHNvdXJjZVtpXSkpeworICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXN0U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHZpc3VhbAorICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IHNvdXJjZVN0YXJ0ICsgMSwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc291cmNlW2ldID09IExBTV9DSEFSICYmIGlzQWxlZkNoYXIoc291cmNlW2ktMV0pKSB8fCBpc1Rhc2hrZWVsQ2hhckZFKHNvdXJjZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVzdFNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRToKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IHNvdXJjZVN0YXJ0LCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihzb3VyY2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RTaXplKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY291bnRTcGFjZVN1YgorICAgICAqIEZ1bmN0aW9uOiBDb3VudHMgbnVtYmVyIG9mIHRpbWVzIHRoZSBzdWJDaGFyIGFwcGVhcnMgaW4gdGhlIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY291bnRTcGFjZVN1YihjaGFyIFtdIGRlc3QsaW50IGxlbmd0aCwgY2hhciBzdWJDaGFyKXsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgICAgIGlmIChkZXN0W2ldID09IHN1YkNoYXIpIHsKKyAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc2hpZnRBcnJheQorICAgICAqIEZ1bmN0aW9uOiBTaGlmdHMgY2hhcmFjdGVycyB0byByZXBsYWNlIHNwYWNlIHN1YiBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNoaWZ0QXJyYXkoY2hhciBbXSBkZXN0LGludCBzdGFydCwgaW50IGUsIGNoYXIgc3ViQ2hhcil7CisgICAgICAgIGludCB3ID0gZTsKKyAgICAgICAgaW50IHIgPSBlOworICAgICAgICB3aGlsZSAoLS1yID49IHN0YXJ0KSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgaWYgKGNoICE9IHN1YkNoYXIpIHsKKyAgICAgICAgICAgIC0tdzsKKyAgICAgICAgICAgIGlmICh3ICE9IHIpIHsKKyAgICAgICAgICAgICAgZGVzdFt3XSA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZmxpcEFycmF5CisgICAgICogRnVuY3Rpb246IGludmVydHMgYXJyYXksIHNvIHRoYXQgc3RhcnQgYmVjb21lcyBlbmQgYW5kIHZpY2UgdmVyc2EKKyAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGZsaXBBcnJheShjaGFyIFtdIGRlc3QsIGludCBzdGFydCwgaW50IGUsIGludCB3KXsKKyAgICAgICAgaW50IHI7CisgICAgICAgIGlmICh3ID4gc3RhcnQpIHsKKyAgICAgICAgLy8gc2hpZnQsIGFzc3VtZSBzbWFsbCBidWZmZXIgc2l6ZSBzbyBkb24ndCB1c2UgYXJyYXljb3B5CisgICAgICAgICAgciA9IHc7CisgICAgICAgICAgdyA9IHN0YXJ0OworICAgICAgICAgIHdoaWxlIChyIDwgZSkgeworICAgICAgICAgICAgZGVzdFt3KytdID0gZGVzdFtyKytdOworICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHcgPSBlOworICAgICAgICAgfQorICAgICAgICByZXR1cm4gdzsKKyAgICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICAgOiBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsCisgICAgICogRnVuY3Rpb24gOiBSZXBsYWNlcyBUYXNoa2VlbCBhcyBmb2xsb3dpbmc6CisgICAgICogICAgICAgICAgICBDYXNlIDEgOmlmIHRoZSBUYXNoa2VlbCBvbiB0YXR3ZWVsLCByZXBsYWNlIGl0IHdpdGggVGF0d2VlbC4KKyAgICAgKiAgICAgICAgICAgIENhc2UgMiA6aWYgdGhlIFRhc2hrZWVsIGFnZ3JlZ2F0ZWQgd2l0aCBTaGFkZGEgb24gVGF0d2VlbCwgcmVwbGFjZQorICAgICAqICAgICAgICAgICAgICAgICAgIGl0IHdpdGggU2hhZGRhIG9uIFRhdHdlZWwuCisgICAgICogICAgICAgICAgICBDYXNlIDM6IGlmIHRoZSBUYXNoa2VlbCBpcyBpc29sYXRlZCByZXBsYWNlIGl0IHdpdGggU3BhY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbChjaGFyW10gZGVzdCwgaW50IHNvdXJjZUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGRlc3RbaV0pID09IDEpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFRBVFdFRUxfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKChpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihkZXN0W2ldKSA9PSAyKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTSEFEREFfVEFUV0VFTF9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoKGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIoZGVzdFtpXSk9PTEpICYmIGRlc3RbaV0gIT0gU0hBRERBX0NIQVIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMZW5ndGg7CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaGFuZGxlR2VuZXJhdGVkU3BhY2VzCisgICAgICpGdW5jdGlvbiA6IFRoZSBzaGFwZVVuaWNvZGUgZnVuY3Rpb24gY29udmVydHMgTGFtICsgQWxlZiBpbnRvIExhbUFsZWYgKyBzcGFjZSwKKyAgICAgKiAgICAgICAgICAgYW5kIFRhc2hrZWVsIHRvIHNwYWNlLgorICAgICAqICAgICAgICAgICBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMgZnVuY3Rpb24gcHV0cyB0aGVzZSBnZW5lcmF0ZWQgc3BhY2VzCisgICAgICogICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlciBzcGVjaWZpZXMuIExhbUFsZWYgYW5kIFRhc2hrZWVsCisgICAgICogICAgICAgICAgIHNwYWNlcyBjYW4gYmUgcmVwbGFjZWQgYXQgYmVnaW4sIGF0IGVuZCwgYXQgbmVhciBvciBkZWNyZWFzZSB0aGUKKyAgICAgKiAgICAgICAgICAgYnVmZmVyIHNpemUuCisgICAgICoKKyAgICAgKiAgICAgICAgICAgVGhlcmUgaXMgYWxzbyBBdXRvIG9wdGlvbiBmb3IgTGFtQWxlZiBhbmQgdGFzaGtlZWwsIHdoaWNoIHdpbGwgcHV0CisgICAgICogICAgICAgICAgIHRoZSBzcGFjZXMgYXQgZW5kIG9mIHRoZSBidWZmZXIgKG9yIGVuZCBvZiB0ZXh0IGlmIHRoZSB1c2VyIHVzZWQKKyAgICAgKiAgICAgICAgICAgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQpLgorICAgICAqCisgICAgICogICAgICAgICAgIElmIHRoZSB0ZXh0IHR5cGUgd2FzIHZpc3VhbF9MVFIgYW5kIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EIHdhcyBzZWxlY3RlZCB0aGUgRU5ECisgICAgICogICAgICAgICAgIG9wdGlvbiB3aWxsIHBsYWNlIHRoZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kCisgICAgICogICAgICAgICAgIEJFR0lOIHdpbGwgcGxhY2UgdGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgcHJpdmF0ZSBpbnQgaGFuZGxlR2VuZXJhdGVkU3BhY2VzKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IGxlbmd0aCkgeworCisgICAgICBpbnQgbGVuT3B0aW9uc0xhbUFsZWYgPSBvcHRpb25zICYgTEFNQUxFRl9NQVNLOworICAgICAgaW50IGxlbk9wdGlvbnNUYXNoa2VlbCA9IG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLOworICAgICAgYm9vbGVhbiBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICBpZiAoIWlzTG9naWNhbCAmICFzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kKSB7CisgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zTGFtQWxlZikgeworICAgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0VORDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0JFR0lOOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNUYXNoa2VlbCl7CisgICAgICAgICAgY2FzZSBUQVNIS0VFTF9CRUdJTjogbGVuT3B0aW9uc1Rhc2hrZWVsID0gVEFTSEtFRUxfRU5EOyBicmVhazsKKyAgICAgICAgICBjYXNlIFRBU0hLRUVMX0VORDogbGVuT3B0aW9uc1Rhc2hrZWVsID0gVEFTSEtFRUxfQkVHSU47IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX05FQVIpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChkZXN0W2ldID09IExBTUFMRUZfU1BBQ0VfU1VCKSB7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUl9GT1JfTEFNQUxFRjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKworICAgICAgICAgIGZpbmFsIGludCBlID0gc3RhcnQgKyBsZW5ndGg7CisgICAgICAgICAgaW50IHdMID0gY291bnRTcGFjZVN1YihkZXN0LCBsZW5ndGgsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICBpbnQgd1QgPSBjb3VudFNwYWNlU3ViKGRlc3QsIGxlbmd0aCwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKworICAgICAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCl7CisgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0VORCl7CisgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKSkgeworICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgd2hpbGUgKHdMID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBkZXN0Wy0td0xdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0VORCkpeworICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgIHdoaWxlICh3VCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgIGRlc3RbLS13VF0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgICAgIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSl7CisgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX1JFU0laRSl7CisgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSkpeworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgIHdMID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd0wpOworICAgICAgICAgICAgICBsZW5ndGggPSB3TCAtIHN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX1JFU0laRSkpIHsKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgd1QgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3VCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHdUIC0gc3RhcnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICAgICAgdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICAgICAgaWYgKChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKSB8fAorICAgICAgICAgICAgICAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKSl7CisgICAgICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9CRUdJTil7CisgICAgICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAoKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4pfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKSkpIHsgLy8gc3BhY2VzIGF0IGJlZ2lubmluZworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgICB3TCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdMKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICh3TCA8IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0W3dMKytdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZih0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfQkVHSU4pKXsKKyAgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgICB3VCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdUKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICh3VCA8IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0W3dUKytdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgIHJldHVybiBsZW5ndGg7CisgIH0KKworCisgIC8qCisgICAqTmFtZSAgICAgOmV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4KKyAgICpGdW5jdGlvbiA6RXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgdG8gTGFtIGFuZCBBbGVmIGNvbnN1bWluZyB0aGUgcmVxdWlyZWQKKyAgICogICAgICAgICBzcGFjZSBmcm9tIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgdGV4dCB0eXBlIHdhcyB2aXN1YWxfTFRSCisgICAqICAgICAgICAgYW5kIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EIHdhcyBzZWxlY3RlZAorICAgKiAgICAgICAgIHRoZSBzcGFjZXMgd2lsbCBiZSBsb2NhdGVkIGF0IGVuZCBvZiBidWZmZXIuCisgICAqICAgICAgICAgSWYgdGhlcmUgYXJlIG5vIHNwYWNlcyB0byBleHBhbmQgdGhlIExhbUFsZWYsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisqLworIHByaXZhdGUgYm9vbGVhbiBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCkgeworICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICBpZiAobGFjb3VudCA+IGNvdW50U3BhY2VzUmlnaHQoZGVzdCwgc3RhcnQsIGxlbmd0aCkpIHsKKyAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgIH0KKyAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGVuZ3RoIC0gbGFjb3VudCwgdyA9IHN0YXJ0ICsgbGVuZ3RoOyAtLXIgPj0gc3RhcnQ7KSB7CisgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBMQU1fQ0hBUjsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNoOworICAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworCisgIH0KKworICAvKgorICAgKk5hbWUgICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQKKyAgICpGdW5jdGlvbiA6IEV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIHRvIExhbSBhbmQgQWxlZiBjb25zdW1pbmcgdGhlCisgICAqICAgICAgICAgICByZXF1aXJlZCBzcGFjZSBmcm9tIGVuZCBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgdGV4dCB0eXBlIHdhcworICAgKiAgICAgICAgICAgVmlzdWFsIExUUiBhbmQgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQKKyAgICogICAgICAgICAgIHdhcyB1c2VkLCB0aGUgc3BhY2VzIHdpbGwgYmUgY29uc3VtZWQgZnJvbSBiZWdpbiBvZiBidWZmZXIuIElmCisgICAqICAgICAgICAgICB0aGVyZSBhcmUgbm8gc3BhY2VzIHRvIGV4cGFuZCB0aGUgTGFtQWxlZiwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisKKyAgcHJpdmF0ZSBib29sZWFuICBleHBhbmRDb21wb3NpdENoYXJBdEVuZChjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50KXsKKyAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICBpZiAobGFjb3VudCA+IGNvdW50U3BhY2VzTGVmdChkZXN0LCBzdGFydCwgbGVuZ3RoKSkgeworICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgfQorICAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGFjb3VudCwgdyA9IHN0YXJ0LCBlID0gc3RhcnQgKyBsZW5ndGg7IHIgPCBlOyArK3IpIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gTEFNX0NIQVI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gY2g7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgIH0KKworICAvKgorICAgKk5hbWUgICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyCisgICAqRnVuY3Rpb24gOiBFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciBpbnRvIExhbSArIEFsZWYsIFllaEhhbXphIGNoYXJhY3RlcgorICAgKiAgICAgICAgICAgaW50byBZZWggKyBIYW16YSwgU2VlbkZhbWlseSBjaGFyYWN0ZXIgaW50byBTZWVuRmFtaWx5IGNoYXJhY3RlcgorICAgKiAgICAgICAgICAgKyBUYWlsLCB3aGlsZSBjb25zdW1pbmcgdGhlIHNwYWNlIG5leHQgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICovCisKKyAgcHJpdmF0ZSBib29sZWFuIGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWVoSGFtemFPcHRpb24sIGludCBzZWVuVGFpbE9wdGlvbiwgaW50IGxhbUFsZWZPcHRpb24peworCisgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworCisKKyAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihkZXN0W3N0YXJ0XSkpIHsKKyAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGxlbmd0aDsgLS1pID49c3RhcnQ7KSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgaWYgKGxhbUFsZWZPcHRpb24gPT0gMSAmJiBpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgaWYgKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IExBTV9DSEFSOworICAgICAgICAgICAgICAgICAgZGVzdFstLWldID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH1lbHNlIGlmKHNlZW5UYWlsT3B0aW9uID09IDEgJiYgaXNTZWVuVGFpbEZhbWlseUNoYXIoY2gpID09IDEpeworICAgICAgICAgICAgICBpZihpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpeworICAgICAgICAgICAgICAgICAgZGVzdFtpLTFdID0gdGFpbENoYXI7CisgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ZWxzZSBpZih5ZWhIYW16YU9wdGlvbiA9PSAxICYmIGlzWWVoSGFtemFDaGFyKGNoKSl7CisKKyAgICAgICAgICAgICAgIGlmKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUil7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0geWVoSGFtemFUb1llaFtjaCAtIFlFSF9IQU1aQUZFX0NIQVJdOworICAgICAgICAgICAgICAgICAgZGVzdFtpLTFdID0gSEFNWkFGRV9DSEFSOworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyCisgICAgICogRnVuY3Rpb246IExhbUFsZWYgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBhcyB0aGUgTGFtQWxlZiBpcworICAgICAqICAgICAgICAgICBvbmUgY2hhcmFjdGVyIHdoaWxlIGV4cGFuZGluZyBpdCB3aWxsIGdpdmUgdHdvCisgICAgICogICAgICAgICAgIGNoYXJhY3RlcnMgTGFtICsgQWxlZiwgc28gd2UgbmVlZCB0byBleHBhbmQgdGhlIExhbUFsZWYKKyAgICAgKiAgICAgICAgICAgaW4gbmVhciBvciBmYXIgc3BhY2VzIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlcgorICAgICAqICAgICAgICAgICBzcGVjaWZpZXMgb3IgaW5jcmVhc2UgdGhlIGJ1ZmZlciBzaXplLgorICAgICAqICAgICAgICAgICBEZXN0IGhhcyBlbm91Z2ggcm9vbSBmb3IgdGhlIGV4cGFuc2lvbiBpZiB3ZSBhcmUgZ3Jvd2luZy4KKyAgICAgKiAgICAgICAgICAgbGFtYWxlZiBhcmUgbm9ybWFsaXplZCB0byB0aGUgJ3NwZWNpYWwgY2hhcmFjdGVycycKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBleHBhbmRDb21wb3NpdENoYXIoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhcGluZ01vZGUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGVuT3B0aW9uc0xhbUFsZWYgPSBvcHRpb25zICYgTEFNQUxFRl9NQVNLOworICAgICAgICBpbnQgbGVuT3B0aW9uc1NlZW4gPSBvcHRpb25zICYgU0VFTl9NQVNLOworICAgICAgICBpbnQgbGVuT3B0aW9uc1llaEhhbXphID0gb3B0aW9ucyAmIFlFSEhBTVpBX01BU0s7CisgICAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICAgIGlmICghaXNMb2dpY2FsICYmICFzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNMYW1BbGVmKSB7CisgICAgICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9FTkQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0JFR0lOOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc2hhcGluZ01vZGUgPT0gMSl7CisgICAgICAgICAgICBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8peworICAgICAgICAgICAgICAgIGlmKGlzTG9naWNhbCl7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGVuZ3RoLCB3ID0gciArIGxhY291bnQ7IC0tciA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9ICdcdTA2NDQnOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IGxhY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZihsZW5PcHRpb25zU2VlbiA9PSBTRUVOX1RXT0NFTExfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMSwwKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlIGZvciBTZWVuIHRhaWwgZXhwYW5zaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobGVuT3B0aW9uc1llaEhhbXphID09IFlFSEhBTVpBX1RXT0NFTExfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDEsMCwwKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlIGZvciBZZWhIYW16YSBleHBhbnNpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisKKyAgICAvKiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgZnJvbSBGRXh4IFJhbmdlIGludG8gMDZ4eCBSYW5nZQorICAgICAqIHRvIHB1dCBhbGwgY2hhcmFjdGVycyBpbnRvIHRoZSAwNnh4IHJhbmdlCisgICAgICogZXZlbiB0aGUgbGFtYWxlZiBpcyBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpYWwgcmVnaW9uIGluCisgICAgICogdGhlIDA2eHggcmFuZ2UuICBSZXR1cm4gdGhlIG51bWJlciBvZiBsYW1hbGVmIGNoYXJzIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5vcm1hbGl6ZShjaGFyW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBsYWNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgICBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsYWNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpY29udmVydEZFdG8wNltjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBkZXNoYXBlTm9ybWFsaXplCisgICAgICogRnVuY3Rpb246IENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBmcm9tIEZFeHggUmFuZ2UgaW50byAwNnh4IFJhbmdlCisgICAgICogICAgICAgICAgIGV2ZW4gdGhlIGxhbWFsZWYgaXMgY29udmVydGVkIHRvIHRoZSBzcGVjaWFsIHJlZ2lvbiBpbiB0aGUgMDZ4eCByYW5nZS4KKyAgICAgKiAgICAgICAgICAgQWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyIGVudGVycywgYWxsIHNlZW4gZmFtaWx5IGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgZm9sbG93ZWQgYnkgYSB0YWlsIGNoYXJhY3RlciBhcmUgbWVyZ2VkIHRvIHNlZW4gdGFpbCBmYW1pbHkgY2hhcmFjdGVyIGFuZAorICAgICAqICAgICAgICAgICBhbnkgeWVoIGZvbGxvd2VkIGJ5IGEgaGFtemEgY2hhcmFjdGVyIGFyZSBtZXJnZWQgdG8geWVoaGFtemEgY2hhcmFjdGVyLgorICAgICAqICAgICAgICAgICBNZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxhbWFsZWYgY2hhcnMgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVzaGFwZU5vcm1hbGl6ZShjaGFyW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBsYWNvdW50ID0gMDsKKyAgICAgICAgaW50IHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPSAwOworICAgICAgICBpbnQgc2VlbkNvbXBvc2VFbmFibGVkID0gMDsKKworICAgICAgICB5ZWhIYW16YUNvbXBvc2VFbmFibGVkID0gKChvcHRpb25zJllFSEhBTVpBX01BU0spID09IFlFSEhBTVpBX1RXT0NFTExfTkVBUikgPyAxIDogMDsKKyAgICAgICAgc2VlbkNvbXBvc2VFbmFibGVkID0gKChvcHRpb25zJlNFRU5fTUFTSykgPT0gU0VFTl9UV09DRUxMX05FQVIpPyAxIDogMDsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKworICAgICAgICBpZiggKHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPT0gMSkgJiYgKChjaCA9PSBIQU1aQTA2X0NIQVIpIHx8IChjaCA9PSBIQU1aQUZFX0NIQVIpKQorICAgICAgICAgICAgICAgJiYgKGkgPCAobGVuZ3RoIC0gMSkpICYmIGlzQWxlZk1ha3NvdXJhQ2hhcihkZXN0W2krMV0gKSkgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgIGRlc3RbaSsxXSA9IFlFSF9IQU1aQV9DSEFSOworICAgICAgIH0gZWxzZSBpZiAoIChzZWVuQ29tcG9zZUVuYWJsZWQgPT0gMSkgJiYgKGlzVGFpbENoYXIoY2gpKSAmJiAoaTwgKGxlbmd0aCAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAmJiAoaXNTZWVuVGFpbEZhbWlseUNoYXIoZGVzdFtpKzFdKT09MSkgKSB7CisgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsYWNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpY29udmVydEZFdG8wNltjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzaGFwZVVuaWNvZGUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgYW4gQXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIDA2eHggUmFuZ2UgaW50byBhIHNoYXBlZAorICAgICAqICAgICAgICAgICBhcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gRkV4eCBSYW5nZQorICAgICAqLworICAgIHByaXZhdGUgaW50IHNoYXBlVW5pY29kZShjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXNoa2VlbEZsYWcpdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsYW1hbGVmX2NvdW50ID0gbm9ybWFsaXplKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAgIC8vIHJlc29sdmUgdGhlIGxpbmsgYmV0d2VlbiB0aGUgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gQXJhYmljIGNoYXJhY3RlcnMgaGF2ZSBmb3VyIGZvcm1zOiBJc29sYXRlZCwgSW5pdGlhbCwgTWVkaWFsIGFuZCBGaW5hbC4KKyAgICAgICAgLy8gVGFzaGtlZWwgY2hhcmFjdGVycyBoYXZlIHR3bywgaXNvbGF0ZWQgb3IgbWVkaWFsLCBhbmQgc29tZXRpbWVzIG9ubHkgaXNvbGF0ZWQuCisgICAgICAgIC8vIHRhc2hrZWVsRmxhZyA9PSAwOiBzaGFwZSBub3JtYWxseSwgMTogc2hhcGUgaXNvbGF0ZWQsIDI6IGRvbid0IHNoYXBlCisKKyAgICAgICAgYm9vbGVhbiBsYW1hbGVmX2ZvdW5kID0gZmFsc2UsIHNlZW5mYW1fZm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiB5ZWhoYW16YV9mb3VuZCA9IGZhbHNlLCB0YXNoa2VlbF9mb3VuZCA9IGZhbHNlOworICAgICAgICBpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKKyAgICAgICAgaW50IGN1cnJMaW5rID0gZ2V0TGluayhkZXN0W2ldKTsKKyAgICAgICAgaW50IG5leHRMaW5rID0gMDsKKyAgICAgICAgaW50IHByZXZMaW5rID0gMDsKKyAgICAgICAgaW50IGxhc3RMaW5rID0gMDsKKyAgICAgICAgLy9pbnQgcHJldlBvcyA9IGk7CisgICAgICAgIGludCBsYXN0UG9zID0gaTsKKyAgICAgICAgaW50IG54ID0gLTI7CisgICAgICAgIGludCBudyA9IDA7CisKKyAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICAgICAgLy8gSWYgaGlnaCBieXRlIG9mIGN1cnJMaW5rID4gMCB0aGVuIHRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiBvbmUgc2hhcGUKKyAgICAgICAgICAgIGlmICgoY3VyckxpbmsgJiAnXHVGRjAwJykgPiAwIHx8IGlzVGFzaGtlZWxDaGFyKGRlc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgbncgPSBpIC0gMTsKKyAgICAgICAgICAgICAgICBueCA9IC0yOworICAgICAgICAgICAgICAgIHdoaWxlIChueCA8IDApIHsgLy8gd2UgbmVlZCB0byBrbm93IGFib3V0IG5leHQgY2hhcgorICAgICAgICAgICAgICAgICAgICBpZiAobncgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5rID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9IGdldExpbmsoZGVzdFtud10pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXh0TGluayAmIElSUkVMRVZBTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBueCA9IG53OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW53OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoY3VyckxpbmsgJiBBTEVGVFlQRSkgPiAwKSAmJiAoKGxhc3RMaW5rICYgTEFNVFlQRSkgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICBsYW1hbGVmX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciB3TGFtYWxlZiA9IGNoYW5nZUxhbUFsZWYoZGVzdFtpXSk7IC8vIGdldCBmcm9tIDB4MDY1Qy0weDA2NWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdMYW1hbGVmICE9ICdcdTAwMDAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGFsZWYgYnkgbWFya2VyLCBpdCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAnXHVmZmZmJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbbGFzdFBvc10gPSB3TGFtYWxlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBsYXN0UG9zOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdExpbmsgPSBwcmV2TGluazsKKyAgICAgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBnZXRMaW5rKHdMYW1hbGVmKTsgLy8gcmVxdWlyZXMgJ1x1MDAwMCcsIHVuZm9ydHVuYXRlbHkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChpID4gMCkgJiYgKGRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNTZWVuRmFtaWx5Q2hhcihkZXN0W2ldKSA9PSAxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5mYW1fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RbaV0gPT0gWUVIX0hBTVpBX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHllaGhhbXphX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGk9PTApeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlzU2VlbkZhbWlseUNoYXIoZGVzdFtpXSkgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuZmFtX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0W2ldID09IFlFSF9IQU1aQV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ZWhoYW16YV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvcGVyIHNoYXBlIGFjY29yZGluZyB0byBsaW5rIGFiaWxpdHkgb2YgbmVpZ2hib3JzCisgICAgICAgICAgICAgICAgLy8gYW5kIG9mIGNoYXJhY3RlcjsgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIHNoYXBlcworICAgICAgICAgICAgICAgIC8vIChpc29sYXRlZCwgaW5pdGlhbCwgbWlkZGxlLCBmaW5hbCkgaW4gdGhlIGNvbXBhdGliaWxpdHkgYXJlYQorCisgICAgICAgICAgICAgICAgaW50IGZsYWcgPSBzcGVjaWFsQ2hhcihkZXN0W2ldKTsKKworICAgICAgICAgICAgICAgIGludCBzaGFwZSA9IHNoYXBlVGFibGVbbmV4dExpbmsgJiBMSU5LX01BU0tdCisgICAgICAgICAgICAgICAgICAgIFtsYXN0TGluayAmIExJTktfTUFTS10KKyAgICAgICAgICAgICAgICAgICAgW2N1cnJMaW5rICYgTElOS19NQVNLXTsKKworICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhcGUgJj0gMHgxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXNoa2VlbEZsYWcgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluayAmIExJTktMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChuZXh0TGluayAmIExJTktSKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSAhPSAnXHUwNjRDJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSAhPSAnXHUwNjREJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgISgobmV4dExpbmsgJiBBTEVGVFlQRSkgPT0gQUxFRlRZUEUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RMaW5rICYgTEFNVFlQRSkgPT0gTEFNVFlQRSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2hrZWVsRmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gVEFTSEtFRUxfU1BBQ0VfU1VCOworICAgICAgICAgICAgICAgICAgICAgICAgdGFzaGtlZWxfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKCdcdUZFNzAnICsgaXJyZWxldmFudFBvc1tkZXN0W2ldIC0gJ1x1MDY0QiddICsgc2hhcGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgbGVhdmUgdGFzaGtlZWwgYWxvbmUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKCdcdUZFNzAnICsgKGN1cnJMaW5rID4+IDgpICsgc2hhcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbW92ZSBvbmUgbm90Y2ggZm9yd2FyZAorICAgICAgICAgICAgaWYgKChjdXJyTGluayAmIElSUkVMRVZBTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmV2TGluayA9IGxhc3RMaW5rOworICAgICAgICAgICAgICAgIGxhc3RMaW5rID0gY3Vyckxpbms7CisgICAgICAgICAgICAgICAgLy9wcmV2UG9zID0gbGFzdFBvczsKKyAgICAgICAgICAgICAgICBsYXN0UG9zID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgaWYgKGkgPT0gbngpIHsKKyAgICAgICAgICAgICAgICBjdXJyTGluayA9IG5leHRMaW5rOworICAgICAgICAgICAgICAgIG54ID0gLTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjdXJyTGluayA9IGdldExpbmsoZGVzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGxhbS9hbGVmIHBhaXIgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAvLyBjYWxsIGhhbmRsZUdlbmVyYXRlZFNwYWNlcyB0byByZW1vdmUgdGhlIHNwYWNlcyB0aGF0IHdlcmUgYWRkZWQKKworICAgICAgICBkZXN0U2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgaWYgKGxhbWFsZWZfZm91bmQgfHwgdGFzaGtlZWxfZm91bmQpIHsKKyAgICAgICAgICAgIGRlc3RTaXplID0gaGFuZGxlR2VuZXJhdGVkU3BhY2VzKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWVuZmFtX2ZvdW5kIHx8IHllaGhhbXphX2ZvdW5kKXsKKyAgICAgICAgICAgIGRlc3RTaXplID0gZXhwYW5kQ29tcG9zaXRDaGFyKGRlc3QsIHN0YXJ0LCBkZXN0U2l6ZSwgbGFtYWxlZl9jb3VudCwgU0hBUEVfTU9ERSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGRlU2hhcGVVbmljb2RlCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIGFuIEFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiBGRXh4IFJhbmdlIGludG8gdW5zaGFwZWQKKyAgICAgKiAgICAgICAgICAgYXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIDA2eHggUmFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZVNoYXBlVW5pY29kZShjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGFtYWxlZl9jb3VudCA9IGRlc2hhcGVOb3JtYWxpemUoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgbGFtYWxlZiBpbiB0aGUgYnVmZmVyIGNhbGwgZXhwYW5kTGFtQWxlZgorICAgICAgICBpZiAobGFtYWxlZl9jb3VudCAhPSAwKSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGFkanVzdCBkZXN0IHRvIGZpdCBleHBhbmRlZCBidWZmZXIuLi4gISEhCisgICAgICAgICAgICBkZXN0U2l6ZSA9IGV4cGFuZENvbXBvc2l0Q2hhcihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYW1hbGVmX2NvdW50LERFU0hBUEVfTU9ERSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBpbnRlcm5hbFNoYXBlKGNoYXJbXSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHNvdXJjZUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKChvcHRpb25zICYgTEVUVEVSU19NQVNLKSAhPSBMRVRURVJTX05PT1ApICYmCisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVTaXplKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMZW5ndGg7IC8vIGJ5IGRlZmluaXRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsd2F5cyB1c2UgdGVtcCBidWZmZXIKKyAgICAgICAgY2hhcltdIHRlbXAgPSBuZXcgY2hhcltzb3VyY2VMZW5ndGggKiAyXTsgLy8gYWxsIGxhbWFsZWZzIHJlcXVpcmluZyBleHBhbnNpb24KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHNvdXJjZVN0YXJ0LCB0ZW1wLCAwLCBzb3VyY2VMZW5ndGgpOworCisgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgIGludmVydEJ1ZmZlcih0ZW1wLCAwLCBzb3VyY2VMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG91dHB1dFNpemUgPSBzb3VyY2VMZW5ndGg7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDoKKyAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6CisgICAgICAgICAgICBpZiggKChvcHRpb25zJlRBU0hLRUVMX01BU0spPiAwKSAmJgorICAgICAgICAgICAgICAgICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSAhPVRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCkpIHsKKyAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBzaGFwaW5nIGZ1bmN0aW9uIHdpdGggdGFzaGtlZWwgZmxhZyA9PSAyIGZvciByZW1vdmFsIG9mIHRhc2hrZWVsICovCisgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAyKTsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgLy9kZWZhdWx0IENhbGwgdGhlIHNoYXBpbmcgZnVuY3Rpb24gd2l0aCB0YXNoa2VlbCBmbGFnID09IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAwKTsKKworICAgICAgICAgICAgICAgICAgIC8qQWZ0ZXIgc2hhcGluZyB0ZXh0IGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gcmVtb3ZlIHRhc2hrZWVsIGFuZCByZXBsYWNlIGl0IHdpdGggdGF0d2VlbCovCisgICAgICAgICAgICAgICAgICAgaWYoIChvcHRpb25zJlRBU0hLRUVMX01BU0spID09IFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCl7CisgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsKHRlbXAsc291cmNlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRToKKyAgICAgICAgICAgIG91dHB1dFNpemUgPSBkZVNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTaXplID4gZGVzdFNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJub3QgZW5vdWdoIHJvb20gZm9yIHJlc3VsdCBkYXRhIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgIT0gRElHSVRTX05PT1ApIHsKKyAgICAgICAgICAgIGNoYXIgZGlnaXRCYXNlID0gJ1x1MDAzMCc7IC8vIEV1cm9wZWFuIGRpZ2l0cworICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRfVFlQRV9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU46CisgICAgICAgICAgICAgICAgZGlnaXRCYXNlID0gJ1x1MDY2MCc7ICAvLyBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTl9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBkaWdpdEJhc2UgPSAnXHUwNmYwJzsgIC8vIEVhc3Rlcm4gQXJhYmljLUluZGljIGRpZ2l0cyAoUGVyc2lhbiBhbmQgVXJkdSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRTX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0RGVsdGEgPSBkaWdpdEJhc2UgLSAnXHUwMDMwJzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZW1wW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDw9ICdcdTAwMzknICYmIGNoID49ICdcdTAwMzAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSArPSBkaWdpdERlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19BTjJFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlnaXRUb3AgPSAoY2hhcikoZGlnaXRCYXNlICsgOSk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWdpdERlbHRhID0gJ1x1MDAzMCcgLSBkaWdpdEJhc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGVtcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSBkaWdpdFRvcCAmJiBjaCA+PSBkaWdpdEJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldICs9IGRpZ2l0RGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfTFI6CisgICAgICAgICAgICAgICAgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KHRlbXAsIDAsIG91dHB1dFNpemUsIGRpZ2l0QmFzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0FMOgorICAgICAgICAgICAgICAgIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dCh0ZW1wLCAwLCBvdXRwdXRTaXplLCBkaWdpdEJhc2UsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgaW52ZXJ0QnVmZmVyKHRlbXAsIDAsIG91dHB1dFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBkZXN0LCBkZXN0U3RhcnQsIG91dHB1dFNpemUpOworCisgICAgICAgIHJldHVybiBvdXRwdXRTaXplOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgICAgICBzdXBlcihtc2cpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaWN1NGovbGljZW5zZS5odG1sIGIvaWN1NGovbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDVkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY3U0ai9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPjwvbWV0YT4KKzx0aXRsZT5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KKzxoMj5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDA2IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHA+PHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKcmVuYW1lIHRvIGluY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCmluZGV4IDNmY2I1NjAuLjRmYmZmMmEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oCisrKyBiL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCkBAIC0xLDE2ICsxLDE2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKQEAgLTI0LDggKzI0LDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAotI2luY2x1ZGUgPGpuaS5oPgotCiAjZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgogI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQogI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKQEAgLTgyLDExICs4MCwxMSBAQAogICAgIH0gZGF0YTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZmllbGRfc2xvdF90OwogCisjZGVmaW5lIEZJRUxEX1RZUEVfTlVMTCAwCiAjZGVmaW5lIEZJRUxEX1RZUEVfSU5URUdFUiAxCiAjZGVmaW5lIEZJRUxEX1RZUEVfRkxPQVQgMgogI2RlZmluZSBGSUVMRF9UWVBFX1NUUklORyAzCiAjZGVmaW5lIEZJRUxEX1RZUEVfQkxPQiA0Ci0jZGVmaW5lIEZJRUxEX1RZUEVfTlVMTCA1CiAKIC8qKgogICogVGhpcyBjbGFzcyBzdG9yZXMgYSBzZXQgb2Ygcm93cyBmcm9tIGEgZGF0YWJhc2UgaW4gYSBidWZmZXIuIFRoZSBiZWdpbmluZyBvZiB0aGUKQEAgLTE3Miw3ICsxNzAsNyBAQAogICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7CiAKICAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7Ci0gICAgCisKICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCmluZGV4IDM4MWE5NTguLjU0OWQ2NjEgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCkBAIC05MDIsNyArOTAyLDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLCBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksCisgICAgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZikKIHsKICAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKIApAQCAtMTcxMywyOSArMTcxNCwzOCBAQAogICAgIH0KIAogICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOwotICAgIC8vIGRvIG5vdCBzZXQgdm9sdW1lIGlmIHRoZSBmbG9hdCB2YWx1ZSBkaWQgbm90IGNoYW5nZQotICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7CisgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CisgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKKyAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAorICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8CisgICAgICAgICAgICBmb3JjZSkgewogICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CiAgICAgICAgIExPR1YoInNldFN0cmVhbVZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7CiAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6RFRNRiB8fAogICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZSA9IC0xLjA7CiAgICAgICAgICAgICAvLyBvZmZzZXQgdmFsdWUgdG8gcmVmbGVjdCBhY3R1YWwgaGFyZHdhcmUgdm9sdW1lIHRoYXQgbmV2ZXIgcmVhY2hlcyAwCiAgICAgICAgICAgICAvLyAxJSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGZpcnN0IHN0ZXAgaW4gVk9JQ0VfQ0FMTCBzdHJlYW0gdm9sdW1lIHNldHRpbmcgKHNlZSBBdWRpb1NlcnZpY2UuamF2YSkKICAgICAgICAgICAgIHZvbHVtZSA9IDAuMDEgKyAwLjk5ICogdm9sdW1lOwotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9pY2VWb2x1bWUgPj0gMCAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CiAgICAgfQogCisgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAorICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKKyAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CisgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZvaWNlVm9sdW1lICE9IG1MYXN0Vm9pY2VWb2x1bWUgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQW5kcm9pZC5tayBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKaW5kZXggMTNkYzUwMC4uZjlkOWYyNSAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvQW5kcm9pZC5taworKysgYi9saWJzL2JpbmRlci9BbmRyb2lkLm1rCkBAIC0xNiw2ICsxNiw3IEBACiBzb3VyY2VzIDo9IFwKICAgICBCaW5kZXIuY3BwIFwKICAgICBCcEJpbmRlci5jcHAgXAorICAgIEN1cnNvcldpbmRvdy5jcHAgXAogICAgIElJbnRlcmZhY2UuY3BwIFwKICAgICBJTWVtb3J5LmNwcCBcCiAgICAgSVBDVGhyZWFkU3RhdGUuY3BwIFwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAKcmVuYW1lIHRvIGxpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKaW5kZXggNzg3NzkyMS4uMjBiMjdjOSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmNwcAorKysgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkN1cnNvcldpbmRvdyIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9DdXJzb3JXaW5kb3cuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogCkBAIC0yNSwxMiArMjYsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgotCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCi0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBDdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0FuZHJvaWQubWsgYi9saWJzL2h3dWkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDgyOWEyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlNYXRyaXguY3BwIFwKKwlPcGVuR0xSZW5kZXJlci5jcHAKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi9pbmNsdWRlL3V0aWxzIFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCisJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXAorCWV4dGVybmFsL3NraWEvc3JjL3BvcnRzIFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNIQVJFRF9MSUJSQVJJRVMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCitMT0NBTF9NT0RVTEU6PSBsaWJod3VpCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5jcHAgYi9saWJzL2h3dWkvTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM3NzkxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5jcHAKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1hdHJpeCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3ZvaWQgTWF0cml4NDo6bG9hZElkZW50aXR5KCkgeworICAgIGRhdGFbMF0gID0gMS4wZjsKKyAgICBkYXRhWzFdICA9IDAuMGY7CisgICAgZGF0YVsyXSAgPSAwLjBmOworICAgIGRhdGFbM10gID0gMC4wZjsKKworICAgIGRhdGFbNF0gID0gMC4wZjsKKyAgICBkYXRhWzVdICA9IDEuMGY7CisgICAgZGF0YVs2XSAgPSAwLjBmOworICAgIGRhdGFbN10gID0gMC4wZjsKKworICAgIGRhdGFbOF0gID0gMC4wZjsKKyAgICBkYXRhWzldICA9IDAuMGY7CisgICAgZGF0YVsxMF0gPSAxLjBmOworICAgIGRhdGFbMTFdID0gMC4wZjsKKworICAgIGRhdGFbMTJdID0gMC4wZjsKKyAgICBkYXRhWzEzXSA9IDAuMGY7CisgICAgZGF0YVsxNF0gPSAwLjBmOworICAgIGRhdGFbMTVdID0gMS4wZjsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IGZsb2F0KiB2KSB7CisgICAgbWVtY3B5KGRhdGEsIHYsIHNpemVvZihkYXRhKSk7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgbWVtY3B5KGRhdGEsIHYuZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IFNrTWF0cml4JiB2KSB7CisgICAgbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKyAgICBkYXRhWzBdICA9IHZbU2tNYXRyaXg6OmtNU2NhbGVYXTsKKyAgICBkYXRhWzRdICA9IHZbU2tNYXRyaXg6OmtNU2tld1hdOworICAgIGRhdGFbMTJdID0gdltTa01hdHJpeDo6a01UcmFuc1hdOworCisgICAgZGF0YVsxXSAgPSB2W1NrTWF0cml4OjprTVNrZXdZXTsKKyAgICBkYXRhWzVdICA9IHZbU2tNYXRyaXg6OmtNU2NhbGVZXTsKKyAgICBkYXRhWzEzXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNZXTsKKworICAgIGRhdGFbM10gID0gdltTa01hdHJpeDo6a01QZXJzcDBdOworICAgIGRhdGFbN10gID0gdltTa01hdHJpeDo6a01QZXJzcDFdOworICAgIGRhdGFbMTVdID0gdltTa01hdHJpeDo6a01QZXJzcDJdOworCisgICAgZGF0YVsxMF0gPSAxLjBmOworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhTa01hdHJpeCYgdikgY29uc3QgeworICAgIHYucmVzZXQoKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWCwgZGF0YVswXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1gsICBkYXRhWzRdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01UcmFuc1gsIGRhdGFbMTJdKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVNrZXdZLCAgZGF0YVsxXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2NhbGVZLCBkYXRhWzVdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01UcmFuc1ksIGRhdGFbMTNdKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMCwgZGF0YVszXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AxLCBkYXRhWzddKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDIsIGRhdGFbMTVdKTsKK30KKwordm9pZCBNYXRyaXg0Ojpjb3B5VG8oZmxvYXQqIHYpIGNvbnN0IHsKKyAgICBtZW1jcHkodiwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKworZmxvYXQgTWF0cml4NDo6Z2V0VHJhbnNsYXRlWCgpIHsKKyAgICByZXR1cm4gZGF0YVsxMl07Cit9CisKK2Zsb2F0IE1hdHJpeDQ6OmdldFRyYW5zbGF0ZVkoKSB7CisgICAgcmV0dXJuIGRhdGFbMTNdOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFbMTJdID0geDsKKyAgICBkYXRhWzEzXSA9IHk7CisgICAgZGF0YVsxNF0gPSB6OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVswXSAgPSBzeDsKKyAgICBkYXRhWzVdICA9IHN5OworICAgIGRhdGFbMTBdID0gc3o7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGRhdGFbM10gID0gMC4wZjsKKyAgICBkYXRhWzddICA9IDAuMGY7CisgICAgZGF0YVsxMV0gPSAwLjBmOworICAgIGRhdGFbMTJdID0gMC4wZjsKKyAgICBkYXRhWzEzXSA9IDAuMGY7CisgICAgZGF0YVsxNF0gPSAwLjBmOworICAgIGRhdGFbMTVdID0gMS4wZjsKKworICAgIGFuZ2xlICo9IGZsb2F0KE1fUEkgLyAxODAuMGYpOworICAgIGZsb2F0IGMgPSBjb3NmKGFuZ2xlKTsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisKKyAgICBjb25zdCBmbG9hdCBsZW5ndGggPSBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOworICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisKKyAgICBkYXRhWzBdICA9IHggKiB4ICogbmMgKyAgYzsKKyAgICBkYXRhWzRdICA9ICAgIHh5ICogbmMgLSB6czsKKyAgICBkYXRhWzhdICA9ICAgIHp4ICogbmMgKyB5czsKKyAgICBkYXRhWzFdICA9ICAgIHh5ICogbmMgKyB6czsKKyAgICBkYXRhWzVdICA9IHkgKiB5ICogbmMgKyAgYzsKKyAgICBkYXRhWzldICA9ICAgIHl6ICogbmMgLSB4czsKKyAgICBkYXRhWzJdICA9ICAgIHp4ICogbmMgLSB5czsKKyAgICBkYXRhWzZdICA9ICAgIHl6ICogbmMgKyB4czsKKyAgICBkYXRhWzEwXSA9IHogKiB6ICogbmMgKyAgYzsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkTXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdSwgY29uc3QgTWF0cml4NCYgdikgeworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgeCA9IDA7CisgICAgICAgIGZsb2F0IHkgPSAwOworICAgICAgICBmbG9hdCB6ID0gMDsKKyAgICAgICAgZmxvYXQgdyA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgNCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZSA9IHYuZ2V0KGksIGopOworICAgICAgICAgICAgeCArPSB1LmdldChqLCAwKSAqIGU7CisgICAgICAgICAgICB5ICs9IHUuZ2V0KGosIDEpICogZTsKKyAgICAgICAgICAgIHogKz0gdS5nZXQoaiwgMikgKiBlOworICAgICAgICAgICAgdyArPSB1LmdldChqLCAzKSAqIGU7CisgICAgICAgIH0KKworICAgICAgICBzZXQoaSwgMCwgeCk7CisgICAgICAgIHNldChpLCAxLCB5KTsKKyAgICAgICAgc2V0KGksIDIsIHopOworICAgICAgICBzZXQoaSwgMywgdyk7CisgICAgfQorfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRPcnRobyhmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFbMF0gID0gMi4wZiAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFbNV0gID0gMi4wZiAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFbMTBdID0gLTIuMGYgLyAoZmFyIC0gbmVhcik7CisgICAgZGF0YVsxMl0gPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBkYXRhWzEzXSA9IC0odG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFbMTRdID0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKK30KKworI2RlZmluZSBNVUxfQUREX1NUT1JFKGEsIGIsIGMpIGEgPSAoYSkgKiAoYikgKyAoYykKKwordm9pZCBNYXRyaXg0OjptYXBSZWN0KFJlY3QmIHIpIGNvbnN0IHsKKyAgICBjb25zdCBmbG9hdCBzeCA9IGRhdGFbMF07CisgICAgY29uc3QgZmxvYXQgc3kgPSBkYXRhWzVdOworCisgICAgY29uc3QgZmxvYXQgdHggPSBkYXRhWzEyXTsKKyAgICBjb25zdCBmbG9hdCB0eSA9IGRhdGFbMTNdOworCisgICAgTVVMX0FERF9TVE9SRShyLmxlZnQsIHN4LCB0eCk7CisgICAgTVVMX0FERF9TVE9SRShyLnJpZ2h0LCBzeCwgdHgpOworICAgIE1VTF9BRERfU1RPUkUoci50b3AsIHN5LCB0eSk7CisgICAgTVVMX0FERF9TVE9SRShyLmJvdHRvbSwgc3ksIHR5KTsKK30KKwordm9pZCBNYXRyaXg0OjpkdW1wKCkgY29uc3QgeworICAgIExPR0QoIk1hdHJpeDRbIik7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFbMF0sIGRhdGFbNF0sIGRhdGFbIDhdLCBkYXRhWzEyXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFbMV0sIGRhdGFbNV0sIGRhdGFbIDldLCBkYXRhWzEzXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFbMl0sIGRhdGFbNl0sIGRhdGFbMTBdLCBkYXRhWzE0XSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFbM10sIGRhdGFbN10sIGRhdGFbMTFdLCBkYXRhWzE1XSk7CisgICAgTE9HRCgiXSIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NYXRyaXguaCBiL2xpYnMvaHd1aS9NYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM4MGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX01BVFJJWF9ICisjZGVmaW5lIEFORFJPSURfVUlfTUFUUklYX0gKKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJSZWN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3NlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBNYXRyaXg0IHsKK3B1YmxpYzoKKyAgICBmbG9hdCBkYXRhWzE2XTsKKworICAgIE1hdHJpeDQoKSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgZmxvYXQqIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IFNrTWF0cml4JiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgdm9pZCBsb2FkSWRlbnRpdHkoKTsKKworICAgIHZvaWQgbG9hZChjb25zdCBmbG9hdCogdik7CisgICAgdm9pZCBsb2FkKGNvbnN0IE1hdHJpeDQmIHYpOworICAgIHZvaWQgbG9hZChjb25zdCBTa01hdHJpeCYgdik7CisKKyAgICB2b2lkIGxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisgICAgdm9pZCBsb2FkU2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeik7CisgICAgdm9pZCBsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKTsKKworICAgIHZvaWQgbXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZE11bHRpcGx5KCp0aGlzLCB2KTsKKyAgICAgICAgbG9hZCh1KTsKKyAgICB9CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkVHJhbnNsYXRlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRTY2FsZShzeCwgc3ksIHN6KTsKKyAgICAgICAgbXVsdGlwbHkodSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRSb3RhdGUoYW5nbGUsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIGNvcHlUbyhmbG9hdCogdikgY29uc3Q7CisgICAgdm9pZCBjb3B5VG8oU2tNYXRyaXgmIHYpIGNvbnN0OworCisgICAgdm9pZCBtYXBSZWN0KFJlY3QmIHIpIGNvbnN0OworCisgICAgZmxvYXQgZ2V0VHJhbnNsYXRlWCgpOworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVkoKTsKKworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGlubGluZSBmbG9hdCBnZXQoaW50IGksIGludCBqKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkYXRhW2kgKiA0ICsgal07CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgdikgeworICAgICAgICBkYXRhW2kgKiA0ICsgal0gPSB2OworICAgIH0KK307IC8vIGNsYXNzIE1hdHJpeDQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBNYXRyaXg0IG1hdDQ7CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL05PVElDRSBiL2xpYnMvaHd1aS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZiOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tQYWludC5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgIk9wZW5HTFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNWKHgsIHkpIHsgeyB4LCB5IH0gfQorI2RlZmluZSBGVih4LCB5LCB1LCB2KSB7IHsgeCwgeSB9LCB7IHUsIHYgfSB9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdsb2JhbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgU2ltcGxlVmVydGV4IGdEcmF3Q29sb3JWZXJ0aWNlc1tdID0geworICAgICAgICBTVigwLjBmLCAwLjBmKSwKKyAgICAgICAgU1YoMS4wZiwgMC4wZiksCisgICAgICAgIFNWKDAuMGYsIDEuMGYpLAorICAgICAgICBTVigxLjBmLCAxLjBmKQorfTsKK2NvbnN0IEdMc2l6ZWkgZ0RyYXdDb2xvclZlcnRleFN0cmlkZSA9IHNpemVvZihTaW1wbGVWZXJ0ZXgpOworY29uc3QgR0xzaXplaSBnRHJhd0NvbG9yVmVydGV4Q291bnQgPSA0OworCitjb25zdCBUZXh0dXJlVmVydGV4IGdEcmF3VGV4dHVyZVZlcnRpY2VzW10gPSB7CisgICAgICAgIEZWKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAorICAgICAgICBGVigxLjBmLCAwLjBmLCAxLjBmLCAxLjBmKSwKKyAgICAgICAgRlYoMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiksCisgICAgICAgIEZWKDEuMGYsIDEuMGYsIDEuMGYsIDAuMGYpCit9OworY29uc3QgR0xzaXplaSBnRHJhd1RleHR1cmVWZXJ0ZXhTdHJpZGUgPSBzaXplb2YoVGV4dHVyZVZlcnRleCk7Citjb25zdCBHTHNpemVpIGdEcmF3VGV4dHVyZVZlcnRleENvdW50ID0gNDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2hhZGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNIQURFUl9TT1VSQ0UobmFtZSwgc291cmNlKSBjb25zdCBjaGFyKiBuYW1lID0gI3NvdXJjZQorCisjaW5jbHVkZSAic2hhZGVycy9kcmF3Q29sb3IudmVydCIKKyNpbmNsdWRlICJzaGFkZXJzL2RyYXdDb2xvci5mcmFnIgorCisjaW5jbHVkZSAic2hhZGVycy9kcmF3VGV4dHVyZS52ZXJ0IgorI2luY2x1ZGUgInNoYWRlcnMvZHJhd1RleHR1cmUuZnJhZyIKKworUHJvZ3JhbTo6UHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KSB7CisgICAgdmVydGV4U2hhZGVyID0gYnVpbGRTaGFkZXIodmVydGV4LCBHTF9WRVJURVhfU0hBREVSKTsKKyAgICBmcmFnbWVudFNoYWRlciA9IGJ1aWxkU2hhZGVyKGZyYWdtZW50LCBHTF9GUkFHTUVOVF9TSEFERVIpOworCisgICAgaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgdmVydGV4U2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgZnJhZ21lbnRTaGFkZXIpOworICAgIGdsTGlua1Byb2dyYW0oaWQpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0UHJvZ3JhbWl2KGlkLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgIGlmIChpbmZvTGVuID4gMSkgeworICAgICAgICAgICAgY2hhciogbG9nID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogaW5mb0xlbik7CisgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKGlkLCBpbmZvTGVuLCAwLCBsb2cpOworICAgICAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgbGlua2luZyBzaGFkZXJzOiAlcyIsIGxvZyk7CisgICAgICAgICAgICBkZWxldGUgbG9nOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7CisgICAgfQorfQorCitQcm9ncmFtOjp+UHJvZ3JhbSgpIHsKKyAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbERlbGV0ZVByb2dyYW0oaWQpOworfQorCit2b2lkIFByb2dyYW06OnVzZSgpIHsKKyAgICBnbFVzZVByb2dyYW0oaWQpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0QXR0cmliTG9jYXRpb24oaWQsIG5hbWUpOworICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gYXR0cmlidXRlcy52YWx1ZUZvcihuYW1lKTsKK30KKworaW50IFByb2dyYW06OmFkZFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBzbG90ID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24oaWQsIG5hbWUpOworICAgIHVuaWZvcm1zLmFkZChuYW1lLCBzbG90KTsKKyAgICByZXR1cm4gc2xvdDsKK30KKworaW50IFByb2dyYW06OmdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiB1bmlmb3Jtcy52YWx1ZUZvcihuYW1lKTsKK30KKworR0x1aW50IFByb2dyYW06OmJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAvLyBTb21lIGRyaXZlcnMgcmV0dXJuIHdyb25nIHZhbHVlcyBmb3IgR0xfSU5GT19MT0dfTEVOR1RICisgICAgICAgIC8vIHVzZSBhIGZpeGVkIHNpemUgaW5zdGVhZAorICAgICAgICBHTGNoYXIgbG9nWzUxMl07CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIHNpemVvZihsb2cpLCAwLCAmbG9nWzBdKTsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHNoYWRlcjogJXMiLCBsb2cpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK0RyYXdDb2xvclByb2dyYW06OkRyYXdDb2xvclByb2dyYW0oKToKKyAgICAgICAgUHJvZ3JhbShnRHJhd0NvbG9yVmVydGV4U2hhZGVyLCBnRHJhd0NvbG9yRnJhZ21lbnRTaGFkZXIpIHsKKyAgICBnZXRBdHRyaWJzQW5kVW5pZm9ybXMoKTsKK30KKworRHJhd0NvbG9yUHJvZ3JhbTo6RHJhd0NvbG9yUHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KToKKyAgICAgICAgUHJvZ3JhbSh2ZXJ0ZXgsIGZyYWdtZW50KSB7CisgICAgZ2V0QXR0cmlic0FuZFVuaWZvcm1zKCk7Cit9CisKK3ZvaWQgRHJhd0NvbG9yUHJvZ3JhbTo6Z2V0QXR0cmlic0FuZFVuaWZvcm1zKCkgeworICAgIHBvc2l0aW9uID0gYWRkQXR0cmliKCJwb3NpdGlvbiIpOworICAgIGNvbG9yID0gYWRkQXR0cmliKCJjb2xvciIpOworICAgIHByb2plY3Rpb24gPSBhZGRVbmlmb3JtKCJwcm9qZWN0aW9uIik7CisgICAgbW9kZWxWaWV3ID0gYWRkVW5pZm9ybSgibW9kZWxWaWV3Iik7CisgICAgdHJhbnNmb3JtID0gYWRkVW5pZm9ybSgidHJhbnNmb3JtIik7Cit9CisKK3ZvaWQgRHJhd0NvbG9yUHJvZ3JhbTo6dXNlKGNvbnN0IEdMZmxvYXQqIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IEdMZmxvYXQqIG1vZGVsVmlld01hdHJpeCwKKyAgICAgICAgY29uc3QgR0xmbG9hdCogdHJhbnNmb3JtTWF0cml4KSB7CisgICAgUHJvZ3JhbTo6dXNlKCk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2plY3Rpb24sIDEsIEdMX0ZBTFNFLCBwcm9qZWN0aW9uTWF0cml4KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobW9kZWxWaWV3LCAxLCBHTF9GQUxTRSwgbW9kZWxWaWV3TWF0cml4KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYodHJhbnNmb3JtLCAxLCBHTF9GQUxTRSwgdHJhbnNmb3JtTWF0cml4KTsKK30KKworRHJhd1RleHR1cmVQcm9ncmFtOjpEcmF3VGV4dHVyZVByb2dyYW0oKToKKyAgICAgICAgRHJhd0NvbG9yUHJvZ3JhbShnRHJhd1RleHR1cmVWZXJ0ZXhTaGFkZXIsIGdEcmF3VGV4dHVyZUZyYWdtZW50U2hhZGVyKSB7CisgICAgdGV4Q29vcmRzID0gYWRkQXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICBzYW1wbGVyID0gYWRkVW5pZm9ybSgic2FtcGxlciIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdXBwb3J0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IFJlY3QmIFNuYXBzaG90OjpnZXRNYXBwZWRDbGlwKCkgeworICAgIGlmIChmbGFncyAmIGtGbGFnRGlydHlUcmFuc2Zvcm0pIHsKKyAgICAgICAgZmxhZ3MgJj0gfmtGbGFnRGlydHlUcmFuc2Zvcm07CisgICAgICAgIG1hcHBlZENsaXAuc2V0KGNsaXBSZWN0KTsKKyAgICAgICAgdHJhbnNmb3JtLm1hcFJlY3QobWFwcGVkQ2xpcCk7CisgICAgfQorICAgIHJldHVybiBtYXBwZWRDbGlwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitPcGVuR0xSZW5kZXJlcjo6T3BlbkdMUmVuZGVyZXIoKSB7CisgICAgTE9HRCgiQ3JlYXRlIE9wZW5HTFJlbmRlcmVyIik7CisKKyAgICBtRHJhd0NvbG9yU2hhZGVyID0gbmV3IERyYXdDb2xvclByb2dyYW07CisgICAgbURyYXdUZXh0dXJlU2hhZGVyID0gbmV3IERyYXdUZXh0dXJlUHJvZ3JhbTsKK30KKworT3BlbkdMUmVuZGVyZXI6On5PcGVuR0xSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJEZXN0cm95IE9wZW5HTFJlbmRlcmVyIik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldHVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBtYXQ0IG9ydGhvOworICAgIG9ydGhvLmxvYWRPcnRobygwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisgICAgb3J0aG8uY29weVRvKG1PcnRob01hdHJpeCk7CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpwcmVwYXJlKCkgeworICAgIG1TbmFwc2hvdCA9ICZtRmlyc3RTbmFwc2hvdDsKKyAgICBtU2F2ZUNvdW50ID0gMDsKKworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworCisgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGdsU2Npc3NvcigwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgbVNuYXBzaG90LT5jbGlwUmVjdC5zZXQoMC4wZiwgMC4wZiwgbVdpZHRoLCBtSGVpZ2h0KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3RhdGUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgT3BlbkdMUmVuZGVyZXI6OmdldFNhdmVDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNhdmVDb3VudDsKK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlKGludCBmbGFncykgeworICAgIHJldHVybiBzYXZlU25hcHNob3QoKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZSgpIHsKKyAgICBpZiAobVNhdmVDb3VudCA9PSAwKSByZXR1cm47CisKKyAgICBpZiAocmVzdG9yZVNuYXBzaG90KCkpIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgaWYgKHNhdmVDb3VudCA8PSAwIHx8IHNhdmVDb3VudCA+IG1TYXZlQ291bnQpIHJldHVybjsKKworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBmYWxzZTsKKworICAgIHdoaWxlIChtU2F2ZUNvdW50ICE9IHNhdmVDb3VudCAtIDEpIHsKKyAgICAgICAgcmVzdG9yZUNsaXAgfD0gcmVzdG9yZVNuYXBzaG90KCk7CisgICAgfQorCisgICAgaWYgKHJlc3RvcmVDbGlwKSB7CisgICAgICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworICAgIH0KK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlU25hcHNob3QoKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1TbmFwc2hvdCk7CisgICAgcmV0dXJuICsrbVNhdmVDb3VudDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVNuYXBzaG90KCkgeworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBib29sIHJlc3RvcmVMYXllciA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworCisgICAgc3A8U25hcHNob3Q+IGN1cnJlbnQgPSBtU25hcHNob3Q7CisgICAgc3A8U25hcHNob3Q+IHByZXZpb3VzID0gbVNuYXBzaG90LT5wcmV2aW91czsKKworICAgIGlmIChyZXN0b3JlTGF5ZXIpIHsKKyAgICAgICAgLy8gVW5iaW5kIGN1cnJlbnQgRkJPIGFuZCByZXN0b3JlIHByZXZpb3VzIG9uZQorICAgICAgICAvLyBNb3N0IG9mIHRoZSB0aW1lLCBwcmV2aW91cy0+ZmJvIHdpbGwgYmUgMCB0byBiaW5kIHRoZSBkZWZhdWx0IGJ1ZmZlcgorICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgcHJldmlvdXMtPmZibyk7CisKKyAgICAgICAgY29uc3QgUmVjdCYgbGF5ZXIgPSBjdXJyZW50LT5sYXllcjsKKyAgICAgICAgY2xpcFJlY3QobGF5ZXIubGVmdCwgbGF5ZXIudG9wLCBsYXllci5yaWdodCwgbGF5ZXIuYm90dG9tKTsKKyAgICAgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7CisKKyAgICAgICAgZHJhd1RleHR1cmVSZWN0KDAuMGYsIDAuMGYsIG1XaWR0aCwgbUhlaWdodCwgY3VycmVudC0+dGV4dHVyZSwgY3VycmVudC0+YWxwaGEpOworCisgICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZjdXJyZW50LT5mYm8pOworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZjdXJyZW50LT50ZXh0dXJlKTsKKyAgICB9CisKKyAgICBtU25hcHNob3QgPSBwcmV2aW91czsKKyAgICBtU2F2ZUNvdW50LS07CisKKyAgICByZXR1cm4gcmVzdG9yZUNsaXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExheWVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncykgeworICAgIC8vIFRPRE8gSW1wbGVtZW50CisgICAgcmV0dXJuIHNhdmVTbmFwc2hvdCgpOworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGFscGhhLCBpbnQgZmxhZ3MpIHsKKyAgICBpbnQgY291bnQgPSBzYXZlU25hcHNob3QoKTsKKworICAgIG1TbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnSXNMYXllcjsKKyAgICBtU25hcHNob3QtPmFscGhhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgbVNuYXBzaG90LT5sYXllci5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBGQk8gYW5kIGF0dGFjaCB0aGUgdGV4dHVyZQorICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZtU25hcHNob3QtPmZibyk7CisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1TbmFwc2hvdC0+ZmJvKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSB0ZXh0dXJlIGluIHdoaWNoIHRoZSBGQk8gd2lsbCBkcmF3CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmbVNuYXBzaG90LT50ZXh0dXJlKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1TbmFwc2hvdC0+dGV4dHVyZSk7CisKKyAgICAvLyBUaGUgRkJPIHdpbGwgbm90IGJlIHNjYWxlZCwgc28gd2UgY2FuIHVzZSBsb3dlciBxdWFsaXR5IGZpbHRlcmluZworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworCisgICAgLy8gVE9ETyAqKioqKiBJTVBPUlRBTlQgKioqKioKKyAgICAvLyBDcmVhdGluZyBhIHRleHR1cmUtYmFja2VkIEZCTyB3b3JrcyBvbmx5IGlmIHRoZSB0ZXh0dXJlIGlzIHRoZSBzYW1lIHNpemUKKyAgICAvLyBhcyB0aGUgb3JpZ2luYWwgcmVuZGVyaW5nIGJ1ZmZlciAoaW4gdGhpcyBjYXNlLCBtV2lkdGggYW5kIG1IZWlnaHQuKQorICAgIC8vIFRoaXMgaXMgZXhwZW5zaXZlIGFuZCB3YXN0ZWZ1bCBhbmQgbXVzdCBiZSBmaXhlZC4KKworICAgIGNvbnN0IEdMc2l6ZWkgd2lkdGggPSBtV2lkdGg7IC8vcmlnaHQgLSBsZWZ0OworICAgIGNvbnN0IEdMc2l6ZWkgaGVpZ2h0ID0gbUhlaWdodDsgLy9ib3R0b20gLSByaWdodDsKKworICAgIGNvbnN0IEdMaW50IGZvcm1hdCA9IChmbGFncyAmIFNrQ2FudmFzOjprSGFzQWxwaGFMYXllcl9TYXZlRmxhZykgPyBHTF9SR0JBIDogR0xfUkdCOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGZvcm1hdCwgR0xfVU5TSUdORURfQllURSwgTlVMTCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKworICAgIC8vIEJpbmQgdGV4dHVyZSB0byBGQk8KKyAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgIG1TbmFwc2hvdC0+dGV4dHVyZSwgMCk7CisKKyAgICBHTGVudW0gc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgIExPR0QoIkZyYW1lYnVmZmVyIGluY29tcGxldGUgJWQiLCBzdGF0dXMpOworCisgICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZtU25hcHNob3QtPmZibyk7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1TbmFwc2hvdC0+dGV4dHVyZSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUcmFuc2Zvcm1zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS50cmFuc2xhdGUoZHgsIGR5LCAwLjBmKTsKKyAgICBtU25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5VHJhbnNmb3JtOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLnJvdGF0ZShkZWdyZWVzLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBtU25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5VHJhbnNmb3JtOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5zY2FsZShzeCwgc3ksIDEuMGYpOworICAgIG1TbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnRGlydHlUcmFuc2Zvcm07Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubG9hZCgqbWF0cml4KTsKKyAgICBtU25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5VHJhbnNmb3JtOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpnZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLmNvcHlUbygqbWF0cml4KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtYXQ0IG0oKm1hdHJpeCk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubXVsdGlwbHkobSk7CisgICAgbVNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eVRyYW5zZm9ybTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xpcHBpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0U2Npc3NvckZyb21DbGlwKCkgeworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldE1hcHBlZENsaXAoKTsKKyAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBtSGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7Cit9CisKK2NvbnN0IFJlY3QmIE9wZW5HTFJlbmRlcmVyOjpnZXRDbGlwQm91bmRzKCkgeworICAgIHJldHVybiBtU25hcHNob3QtPmNsaXBSZWN0OworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAvKgorICAgICAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIHF1aWNrUmVqZWN0KCkgaW5kaWNhdGVzIHRoYXQgdGhlIHNwZWNpZmllZCByZWN0CisgICAgICogaXMgdHJhbnNmb3JtZWQgYmVmb3JlIGJlaW5nIGNvbXBhcmVkIHRvIHRoZSBjbGlwIHJlY3QuIEhvd2V2ZXIsIHRoZQorICAgICAqIGNsaXAgcmVjdCBpcyBub3Qgc3RvcmVkIHRyYW5zZm9ybWVkIGluIHRoZSBzbmFwc2hvdCBhbmQgY2FuIHRodXMgYmUKKyAgICAgKiBjb21wYXJlZCBkaXJlY3RseQorICAgICAqCisgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkIGluc3RlYWQgdG8gcGVyZm9ybWVkIGEgbWFwcGVkIGNvbXBhcmlzb246CisgICAgICoKKyAgICAgKiAgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubWFwUmVjdChyKTsKKyAgICAgKiAgICAgY29uc3QgUmVjdCYgY2xpcCA9IG1TbmFwc2hvdC0+Z2V0TWFwcGVkQ2xpcCgpOworICAgICAqICAgICByZXR1cm4gIWNsaXAuaW50ZXJzZWN0cyhyKTsKKyAgICAgKi8KKworICAgIFJlY3QgcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC5pbnRlcnNlY3RzKHIpOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICBib29sIGNsaXBwZWQgPSBtU25hcHNob3QtPmNsaXBSZWN0LmludGVyc2VjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIGlmIChjbGlwcGVkKSB7CisgICAgICAgIG1TbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorICAgIHJldHVybiBjbGlwcGVkOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIC8vIFRPRE86IFNldCB0aGUgdHJhbnNmZXIgbW9kZQorICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmNsaXBSZWN0OworICAgIGRyYXdDb2xvclJlY3QoY2xpcC5sZWZ0LCBjbGlwLnRvcCwgY2xpcC5yaWdodCwgY2xpcC5ib3R0b20sIGNvbG9yKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwKSB7CisgICAgLy8gVE9ETyBTdXBwb3J0IG1vcmUgdGhhbiAganVzdCBjb2xvcgorICAgIC8vIFRPRE86IFNldCB0aGUgdHJhbnNmZXIgbW9kZQorICAgIGRyYXdDb2xvclJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwLT5nZXRDb2xvcigpKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0NvbG9yUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBjb2xvcikgeworICAgIEdMZmxvYXQgYSA9ICgoY29sb3IgPj4gMjQpICYgMHhGRikgLyAyNTUuMGY7CisgICAgR0xmbG9hdCByID0gKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBHTGZsb2F0IGcgPSAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIEdMZmxvYXQgYiA9ICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKKyAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKKworICAgIG1EcmF3Q29sb3JTaGFkZXItPnVzZSgmbU9ydGhvTWF0cml4WzBdLCAmbU1vZGVsVmlldy5kYXRhWzBdLCAmbVNuYXBzaG90LT50cmFuc2Zvcm0uZGF0YVswXSk7CisKKyAgICBjb25zdCBHTHZvaWQqIHAgPSAmZ0RyYXdDb2xvclZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdOworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtRHJhd0NvbG9yU2hhZGVyLT5wb3NpdGlvbik7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1EcmF3Q29sb3JTaGFkZXItPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICBnRHJhd0NvbG9yVmVydGV4U3RyaWRlLCBwKTsKKyAgICBnbFZlcnRleEF0dHJpYjRmKG1EcmF3Q29sb3JTaGFkZXItPmNvbG9yLCByLCBnLCBiLCBhKTsKKworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ0RyYXdDb2xvclZlcnRleENvdW50KTsKKworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3Q29sb3JTaGFkZXItPnBvc2l0aW9uKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgR0x1aW50IHRleHR1cmUsIGZsb2F0IGFscGhhKSB7CisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisKKyAgICBtRHJhd1RleHR1cmVTaGFkZXItPnVzZSgmbU9ydGhvTWF0cml4WzBdLCAmbU1vZGVsVmlldy5kYXRhWzBdLCAmbVNuYXBzaG90LT50cmFuc2Zvcm0uZGF0YVswXSk7CisKKyAgICAvLyBUT0RPIENvcnJlY3RseSBzZXQgdGhlIGJsZW5kIGZ1bmN0aW9uCisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSxHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGdsVW5pZm9ybTFpKG1EcmF3VGV4dHVyZVNoYWRlci0+c2FtcGxlciwgMCk7CisKKyAgICBjb25zdCBHTHZvaWQqIHAgPSAmZ0RyYXdUZXh0dXJlVmVydGljZXNbMF0ucG9zaXRpb25bMF07CisgICAgY29uc3QgR0x2b2lkKiB0ID0gJmdEcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnRleHR1cmVbMF07CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3VGV4dHVyZVNoYWRlci0+cG9zaXRpb24pOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtRHJhd1RleHR1cmVTaGFkZXItPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICBnRHJhd1RleHR1cmVWZXJ0ZXhTdHJpZGUsIHApOworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtRHJhd1RleHR1cmVTaGFkZXItPnRleENvb3Jkcyk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1EcmF3VGV4dHVyZVNoYWRlci0+dGV4Q29vcmRzLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICBnRHJhd1RleHR1cmVWZXJ0ZXhTdHJpZGUsIHQpOworCisgICAgZ2xWZXJ0ZXhBdHRyaWI0ZihtRHJhd1RleHR1cmVTaGFkZXItPmNvbG9yLCAxLjBmLCAxLjBmLCAxLjBmLCBhbHBoYSk7CisKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdEcmF3VGV4dHVyZVZlcnRleENvdW50KTsKKworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3VGV4dHVyZVNoYWRlci0+cG9zaXRpb24pOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3VGV4dHVyZVNoYWRlci0+dGV4Q29vcmRzKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2JmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJNYXRyaXguaCIKKyNpbmNsdWRlICJSZWN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3VwcG9ydAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBTbmFwc2hvdDogcHVibGljIExpZ2h0UmVmQmFzZTxTbmFwc2hvdD4geworcHVibGljOgorICAgIFNuYXBzaG90KCkgeworICAgIH0KKworICAgIFNuYXBzaG90KGNvbnN0IHNwPFNuYXBzaG90PiBzKToKKyAgICAgICAgICAgIHRyYW5zZm9ybShzLT50cmFuc2Zvcm0pLAorICAgICAgICAgICAgY2xpcFJlY3Qocy0+Y2xpcFJlY3QpLAorICAgICAgICAgICAgZmxhZ3Moa0ZsYWdEaXJ0eVRyYW5zZm9ybSksCisgICAgICAgICAgICBwcmV2aW91cyhzKSwKKyAgICAgICAgICAgIGxheWVyKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICAgICAgdGV4dHVyZSgwKSwKKyAgICAgICAgICAgIGZibygwKSwKKyAgICAgICAgICAgIGFscGhhKDI1NSkgeworICAgIH0KKworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBrRmxhZ0NsaXBTZXQgPSAweDEsCisgICAgICAgIGtGbGFnRGlydHlUcmFuc2Zvcm0gPSAweDIsCisgICAgICAgIGtGbGFnSXNMYXllciA9IDB4NCwKKyAgICB9OworCisgICAgY29uc3QgUmVjdCYgZ2V0TWFwcGVkQ2xpcCgpOworCisgICAgLy8gTG9jYWwgdHJhbnNmb3JtYXRpb25zCisgICAgbWF0NCB0cmFuc2Zvcm07CisKKyAgICAvLyBDbGlwcGluZyByZWN0YW5nbGUgYXQgdGhlIHRpbWUgb2YgdGhpcyBzbmFwc2hvdAorICAgIFJlY3QgY2xpcFJlY3Q7CisKKyAgICAvLyBEaXJ0eSBmbGFncworICAgIGludCBmbGFnczsKKworICAgIC8vIFByZXZpb3VzIHNuYXBzaG90IGluIHRoZSBmcmFtZXMgc3RhY2sKKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXM7CisKKyAgICAvLyBMYXllciwgb25seSBzZXQgaWYga0ZsYWdJc0xheWVyIGlzIHNldAorICAgIFJlY3QgbGF5ZXI7CisgICAgR0x1aW50IHRleHR1cmU7CisgICAgR0x1aW50IGZibzsKKyAgICBmbG9hdCBhbHBoYTsKKworcHJpdmF0ZToKKyAgICAvLyBDbGlwcGluZyByZWN0YW5nbGUgbWFwcGVkIHdpdGggdGhlIHRyYW5zZm9ybQorICAgIFJlY3QgbWFwcGVkQ2xpcDsKK307IC8vIGNsYXNzIFNuYXBzaG90CisKK3N0cnVjdCBTaW1wbGVWZXJ0ZXggeworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworfTsgLy8gc3RydWN0IFNpbXBsZVZlcnRleAorCitzdHJ1Y3QgVGV4dHVyZVZlcnRleCB7CisgICAgZmxvYXQgcG9zaXRpb25bMl07CisgICAgZmxvYXQgdGV4dHVyZVsyXTsKK307IC8vIHN0cnVjdCBUZXh0dXJlVmVydGV4CisKK2NsYXNzIFByb2dyYW06IHB1YmxpYyBMaWdodFJlZkJhc2U8UHJvZ3JhbT4geworcHVibGljOgorICAgIFByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCk7CisgICAgflByb2dyYW0oKTsKKworICAgIHZvaWQgdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQgYWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIGludCBnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICBpbnQgYWRkVW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKyAgICBpbnQgZ2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKworcHJpdmF0ZToKKyAgICBHTHVpbnQgYnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSk7CisKKyAgICAvLyBIYW5kbGUgb2YgdGhlIE9wZW5HTCBwcm9ncmFtCisgICAgR0x1aW50IGlkOworCisgICAgLy8gSGFuZGxlcyBvZiB0aGUgc2hhZGVycworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXI7CisgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgc2xvdHMKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiBhdHRyaWJ1dGVzOworICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IHVuaWZvcm1zOworfTsgLy8gY2xhc3MgUHJvZ3JhbQorCitjbGFzcyBEcmF3Q29sb3JQcm9ncmFtOiBwdWJsaWMgUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgRHJhd0NvbG9yUHJvZ3JhbSgpOworICAgIERyYXdDb2xvclByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCk7CisKKyAgICB2b2lkIHVzZShjb25zdCBHTGZsb2F0KiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBHTGZsb2F0KiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdHJhbnNmb3JtTWF0cml4KTsKKworICAgIGludCBwb3NpdGlvbjsKKyAgICBpbnQgY29sb3I7CisKKyAgICBpbnQgcHJvamVjdGlvbjsKKyAgICBpbnQgbW9kZWxWaWV3OworICAgIGludCB0cmFuc2Zvcm07CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdldEF0dHJpYnNBbmRVbmlmb3JtcygpOworfTsKKworY2xhc3MgRHJhd1RleHR1cmVQcm9ncmFtOiBwdWJsaWMgRHJhd0NvbG9yUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgRHJhd1RleHR1cmVQcm9ncmFtKCk7CisKKyAgICBpbnQgc2FtcGxlcjsKKyAgICBpbnQgdGV4Q29vcmRzOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVuZGVyZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgT3BlbkdMUmVuZGVyZXIgeworcHVibGljOgorICAgIE9wZW5HTFJlbmRlcmVyKCk7CisgICAgfk9wZW5HTFJlbmRlcmVyKCk7CisKKyAgICB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgdm9pZCBwcmVwYXJlKCk7CisKKyAgICBpbnQgZ2V0U2F2ZUNvdW50KCkgY29uc3Q7CisgICAgaW50IHNhdmUoaW50IGZsYWdzKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsKKyAgICB2b2lkIHJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpOworCisgICAgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncyk7CisgICAgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgZmxhZ3MpOworCisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKTsKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSk7CisKKyAgICB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKyAgICB2b2lkIGdldE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKyAgICB2b2lkIGNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKworICAgIGNvbnN0IFJlY3QmIGdldENsaXBCb3VuZHMoKTsKKyAgICBib29sIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk7CisgICAgYm9vbCBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOworCisgICAgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworICAgIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisKK3ByaXZhdGU6CisgICAgaW50IHNhdmVTbmFwc2hvdCgpOworICAgIGJvb2wgcmVzdG9yZVNuYXBzaG90KCk7CisKKyAgICB2b2lkIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgdm9pZCBkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGNvbG9yKTsKKyAgICB2b2lkIGRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEpOworCisgICAgLy8gRGltZW5zaW9ucyBvZiB0aGUgZHJhd2luZyBzdXJmYWNlCisgICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKworICAgIC8vIE1hdHJpeCB1c2VkIGZvciBvcnRobyBwcm9qZWN0aW9uIGluIHNoYWRlcnMKKyAgICBmbG9hdCBtT3J0aG9NYXRyaXhbMTZdOworCisgICAgLy8gTW9kZWwtdmlldyBtYXRyaXggdXNlZCB0byBwb3NpdGlvbi9zaXplIG9iamVjdHMKKyAgICBtYXQ0IG1Nb2RlbFZpZXc7CisKKyAgICAvLyBOdW1iZXIgb2Ygc2F2ZWQgc3RhdGVzCisgICAgaW50IG1TYXZlQ291bnQ7CisgICAgLy8gQmFzZSBzdGF0ZQorICAgIFNuYXBzaG90IG1GaXJzdFNuYXBzaG90OworICAgIC8vIEN1cnJlbnQgc3RhdGUKKyAgICBzcDxTbmFwc2hvdD4gbVNuYXBzaG90OworCisgICAgLy8gU2hhZGVycworICAgIHNwPERyYXdDb2xvclByb2dyYW0+IG1EcmF3Q29sb3JTaGFkZXI7CisgICAgc3A8RHJhd1RleHR1cmVQcm9ncmFtPiBtRHJhd1RleHR1cmVTaGFkZXI7Cit9OyAvLyBjbGFzcyBPcGVuR0xSZW5kZXJlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9SZWN0LmggYi9saWJzL2h3dWkvUmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODJkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUmVjdC5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1JFQ1RfSAorI2RlZmluZSBBTkRST0lEX1VJX1JFQ1RfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0cnVjdHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IFJlY3QgeworICAgIGZsb2F0IGxlZnQ7CisgICAgZmxvYXQgdG9wOworICAgIGZsb2F0IHJpZ2h0OworICAgIGZsb2F0IGJvdHRvbTsKKworICAgIFJlY3QoKToKKyAgICAgICAgICAgIGxlZnQoMCksCisgICAgICAgICAgICB0b3AoMCksCisgICAgICAgICAgICByaWdodCgwKSwKKyAgICAgICAgICAgIGJvdHRvbSgwKSB7CisgICAgfQorCisgICAgUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOgorICAgICAgICAgICAgbGVmdChsZWZ0KSwKKyAgICAgICAgICAgIHRvcCh0b3ApLAorICAgICAgICAgICAgcmlnaHQocmlnaHQpLAorICAgICAgICAgICAgYm90dG9tKGJvdHRvbSkgeworICAgIH0KKworICAgIFJlY3QoY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdChSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICB9CisKKyAgICBSZWN0JiBvcGVyYXRvcj0oY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBSZWN0JiBvcGVyYXRvcj0oUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBmcmllbmQgaW50IG9wZXJhdG9yPT0oY29uc3QgUmVjdCYgYSwgY29uc3QgUmVjdCYgYikgeworICAgICAgICByZXR1cm4gIW1lbWNtcCgmYSwgJmIsIHNpemVvZihhKSk7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvciE9KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuIG1lbWNtcCgmYSwgJmIsIHNpemVvZihhKSk7CisgICAgfQorCisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodCB8fCB0b3AgPj0gYm90dG9tOworICAgIH0KKworICAgIHZvaWQgc2V0RW1wdHkoKSB7CisgICAgICAgIG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgdGhpcy0+bGVmdCA9IGxlZnQ7CisgICAgICAgIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgIHRoaXMtPnRvcCA9IHRvcDsKKyAgICAgICAgdGhpcy0+Ym90dG9tID0gYm90dG9tOworICAgIH0KKworICAgIHZvaWQgc2V0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gbGVmdDsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRIZWlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBib3R0b20gLSB0b3A7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCB0aGlzLT5yaWdodCAmJiB0aGlzLT50b3AgPCB0aGlzLT5ib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdHMoY29uc3QgUmVjdCYgcikgY29uc3QgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0cyhyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tICYmICF0aGlzLT5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbSkgeworCisgICAgICAgICAgICBpZiAodGhpcy0+bGVmdCA8IGxlZnQpIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICAgICAgaWYgKHRoaXMtPnRvcCA8IHRvcCkgdGhpcy0+dG9wID0gdG9wOworICAgICAgICAgICAgaWYgKHRoaXMtPnJpZ2h0ID4gcmlnaHQpIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICBpZiAodGhpcy0+Ym90dG9tID4gYm90dG9tKSB0aGlzLT5ib3R0b20gPSBib3R0b207CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgTE9HRCgiUmVjdFtsPSVmIHQ9JWYgcj0lZiBiPSVmXSIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorCit9OyAvLyBzdHJ1Y3QgUmVjdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfUkVDVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZyBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci5mcmFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGM0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZwpAQCAtMCwwICsxLDkgQEAKK1NIQURFUl9TT1VSQ0UoZ0RyYXdDb2xvckZyYWdtZW50U2hhZGVyLAorCit2YXJ5aW5nIGxvd3AgdmVjNCBvdXRDb2xvcjsKKwordm9pZCBtYWluKHZvaWQpIHsKKyAgICBnbF9GcmFnQ29sb3IgPSBvdXRDb2xvcjsKK30KKworKTsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci52ZXJ0IGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd0NvbG9yLnZlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNmU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci52ZXJ0CkBAIC0wLDAgKzEsMTcgQEAKK1NIQURFUl9TT1VSQ0UoZ0RyYXdDb2xvclZlcnRleFNoYWRlciwKKworYXR0cmlidXRlIHZlYzQgcG9zaXRpb247CithdHRyaWJ1dGUgdmVjNCBjb2xvcjsKKwordW5pZm9ybSBtYXQ0IHByb2plY3Rpb247Cit1bmlmb3JtIG1hdDQgbW9kZWxWaWV3OwordW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTsKKwordmFyeWluZyB2ZWM0IG91dENvbG9yOworCit2b2lkIG1haW4odm9pZCkgeworICAgIG91dENvbG9yID0gY29sb3I7CisgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdHJhbnNmb3JtICogbW9kZWxWaWV3ICogcG9zaXRpb247Cit9CisKKyk7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvc2hhZGVycy9kcmF3VGV4dHVyZS5mcmFnIGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUuZnJhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ0MjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUuZnJhZwpAQCAtMCwwICsxLDEyIEBACitTSEFERVJfU09VUkNFKGdEcmF3VGV4dHVyZUZyYWdtZW50U2hhZGVyLAorCit2YXJ5aW5nIGxvd3AgdmVjNCBvdXRDb2xvcjsKK3ZhcnlpbmcgbWVkaXVtcCB2ZWMyIG91dFRleENvb3JkczsKKwordW5pZm9ybSBzYW1wbGVyMkQgc2FtcGxlcjsKKwordm9pZCBtYWluKHZvaWQpIHsKKyAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKSAqIG91dENvbG9yOworfQorCispOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUudmVydCBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLnZlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwYTgxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLnZlcnQKQEAgLTAsMCArMSwyMCBAQAorU0hBREVSX1NPVVJDRShnRHJhd1RleHR1cmVWZXJ0ZXhTaGFkZXIsCisKK2F0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uOworYXR0cmlidXRlIHZlYzIgdGV4Q29vcmRzOworYXR0cmlidXRlIHZlYzQgY29sb3I7CisKK3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uOwordW5pZm9ybSBtYXQ0IG1vZGVsVmlldzsKK3VuaWZvcm0gbWF0NCB0cmFuc2Zvcm07CisKK3ZhcnlpbmcgdmVjNCBvdXRDb2xvcjsKK3ZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7CisKK3ZvaWQgbWFpbih2b2lkKSB7CisgICAgb3V0Q29sb3IgPSBjb2xvcjsKKyAgICBvdXRUZXhDb29yZHMgPSB0ZXhDb29yZHM7CisgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdHJhbnNmb3JtICogbW9kZWxWaWV3ICogcG9zaXRpb247Cit9CisKKyk7CmRpZmYgLS1naXQgYS9saWJzL3JzL0FuZHJvaWQubWsgYi9saWJzL3JzL0FuZHJvaWQubWsKaW5kZXggOTg0NjRhMC4uN2FmYzRmMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvQW5kcm9pZC5tawpAQCAtNzYsMzQgKzc2LDQ1IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJcnNBZGFwdGVyLmNwcCBcCiAJcnNBbGxvY2F0aW9uLmNwcCBcCisJcnNBbmltYXRpb24uY3BwIFwKIAlyc0NvbXBvbmVudC5jcHAgXAogCXJzQ29udGV4dC5jcHAgXAogCXJzRGV2aWNlLmNwcCBcCiAJcnNFbGVtZW50LmNwcCBcCi0gICAgICAgIHJzRmlsZUEzRC5jcHAgXAorCXJzRmlsZUEzRC5jcHAgXAorCXJzRm9udC5jcHAgXAogCXJzTGlnaHQuY3BwIFwKIAlyc0xvY2tsZXNzRmlmby5jcHAgXAogCXJzT2JqZWN0QmFzZS5jcHAgXAogCXJzTWF0cml4LmNwcCBcCi0gICAgICAgIHJzTWVzaC5jcHAgXAotCXJzTm9pc2UuY3BwIFwKKwlyc01lc2guY3BwIFwKKwlyc011dGV4LmNwcCBcCiAJcnNQcm9ncmFtLmNwcCBcCiAJcnNQcm9ncmFtRnJhZ21lbnQuY3BwIFwKLQlyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBcCisJcnNQcm9ncmFtU3RvcmUuY3BwIFwKIAlyc1Byb2dyYW1SYXN0ZXIuY3BwIFwKIAlyc1Byb2dyYW1WZXJ0ZXguY3BwIFwKIAlyc1NhbXBsZXIuY3BwIFwKIAlyc1NjcmlwdC5jcHAgXAogCXJzU2NyaXB0Qy5jcHAgXAogCXJzU2NyaXB0Q19MaWIuY3BwIFwKLSAgICAgICAgcnNTaGFkZXJDYWNoZS5jcHAgXAorCXJzU2NyaXB0Q19MaWJDTC5jcHAgXAorCXJzU2NyaXB0Q19MaWJHTC5jcHAgXAorCXJzU2hhZGVyQ2FjaGUuY3BwIFwKKwlyc1NpZ25hbC5jcHAgXAogCXJzU2ltcGxlTWVzaC5jcHAgXAorCXJzU3RyZWFtLmNwcCBcCiAJcnNUaHJlYWRJTy5jcHAgXAogCXJzVHlwZS5jcHAgXAogCXJzVmVydGV4QXJyYXkuY3BwCiAKIAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYWNjCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYkdMRVN2MiBsaWJ1aSBsaWJiY2MKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmdDIKKworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlCisKIExPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAogTE9DQUxfTU9EVUxFOj0gbGliUlMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAppbmRleCBkMjgwZjUwLi4xNDI4MzE4IDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKQEAgLTMwLDIwICszMCwyMyBAQAogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMUQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FkYXB0ZXIyRDsKIHR5cGVkZWYgdm9pZCAqIFJzQWxsb2NhdGlvbjsKK3R5cGVkZWYgdm9pZCAqIFJzQW5pbWF0aW9uOwogdHlwZWRlZiB2b2lkICogUnNDb250ZXh0OwogdHlwZWRlZiB2b2lkICogUnNEZXZpY2U7CiB0eXBlZGVmIHZvaWQgKiBSc0VsZW1lbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc0ZpbGU7Cit0eXBlZGVmIHZvaWQgKiBSc0ZvbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc1NhbXBsZXI7CiB0eXBlZGVmIHZvaWQgKiBSc1NjcmlwdDsKIHR5cGVkZWYgdm9pZCAqIFJzU2ltcGxlTWVzaDsKIHR5cGVkZWYgdm9pZCAqIFJzVHlwZTsKIHR5cGVkZWYgdm9pZCAqIFJzTGlnaHQ7Cit0eXBlZGVmIHZvaWQgKiBSc09iamVjdEJhc2U7CiAKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVZlcnRleDsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50OwotdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnRTdG9yZTsKK3R5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVN0b3JlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtUmFzdGVyOwogCiB0eXBlZGVmIHZvaWQgKCogUnNCaXRtYXBDYWxsYmFja190KSh2b2lkICopOwpAQCAtODMsNiArODYsOCBAQAogICAgIFJTX1RZUEVfVU5TSUdORURfMzIsCiAgICAgUlNfVFlQRV9VTlNJR05FRF82NCwKIAorICAgIFJTX1RZUEVfQk9PTEVBTiwKKwogICAgIFJTX1RZUEVfVU5TSUdORURfNV82XzUsCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzVfNV8xLAogICAgIFJTX1RZUEVfVU5TSUdORURfNF80XzRfNCwKQEAgLTEwMSwxOSArMTA2LDEyIEBACiAKIGVudW0gUnNEYXRhS2luZCB7CiAgICAgUlNfS0lORF9VU0VSLAotICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgUlNfS0lORF9OT1JNQUwsCi0gICAgUlNfS0lORF9JTkRFWCwKLSAgICBSU19LSU5EX1BPSU5UX1NJWkUsCiAKLSAgICBSU19LSU5EX1BJWEVMX0wsCisgICAgUlNfS0lORF9QSVhFTF9MID0gNywKICAgICBSU19LSU5EX1BJWEVMX0EsCiAgICAgUlNfS0lORF9QSVhFTF9MQSwKICAgICBSU19LSU5EX1BJWEVMX1JHQiwKICAgICBSU19LSU5EX1BJWEVMX1JHQkEsCi0KIH07CiAKIGVudW0gUnNTYW1wbGVyUGFyYW0gewpAQCAtMjA1LDkgKzIwMyw1MyBAQAogZW51bSBSc0Vycm9yIHsKICAgICBSU19FUlJPUl9OT05FLAogICAgIFJTX0VSUk9SX0JBRF9TSEFERVIsCi0gICAgUlNfRVJST1JfQkFEX1NDUklQVAorICAgIFJTX0VSUk9SX0JBRF9TQ1JJUFQsCisgICAgUlNfRVJST1JfQkFEX1ZBTFVFLAorICAgIFJTX0VSUk9SX09VVF9PRl9NRU1PUlkKIH07CiAKK2VudW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIHsKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0xJTkVBUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CRVpJRVIsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQ0FSRElOQUwsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fSEVSTUlURSwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CU1BMSU5FCit9OworCitlbnVtIFJzQW5pbWF0aW9uRWRnZSB7CisgICAgUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVELAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NPTlNUQU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0dSQURJRU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZQ0xFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX09TQ0lMTEFURSwKKyAgICBSU19BTklNQVRJT05fRURHRV9DWUxFX1JFTEFUSVZFCit9OworCitlbnVtIFJzQTNEQ2xhc3NJRCB7CisgICAgUlNfQTNEX0NMQVNTX0lEX1VOS05PV04sCisgICAgUlNfQTNEX0NMQVNTX0lEX01FU0gsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNILAorICAgIFJTX0EzRF9DTEFTU19JRF9UWVBFLAorICAgIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWCwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fU1RPUkUsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTElHSFQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQ7CisgICAgY29uc3QgY2hhciogb2JqZWN0TmFtZTsKK30gUnNGaWxlSW5kZXhFbnRyeTsKKwogI2lmbmRlZiBOT19SU19GVU5DUwogI2luY2x1ZGUgInJzZ0FwaUZ1bmNEZWNsLmgiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCmluZGV4IDk5YjhjMDQuLjE0NGU1MzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaApAQCAtMTIsNyArMTIsNyBAQAogdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhIGIvbGlicy9ycy9TY3JpcHRDX01vZGVsdmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZmI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFNjcmlwdENfTW9kZWx2aWV3ZXIgZXh0ZW5kcyBTY3JpcHRDIHsKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyAgU2NyaXB0Q19Nb2RlbHZpZXdlcihSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCBpZCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIocnMsIHJlc291cmNlcywgaWQsIGlzUm9vdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BWQmFja2dyb3VuZCA9IDA7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1BWQmFja2dyb3VuZChQcm9ncmFtVmVydGV4IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nUFZCYWNrZ3JvdW5kID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BWQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBnZXRfZ1BWQmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nUEZCYWNrZ3JvdW5kID0gMTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtRXhwb3J0VmFyX2dQRkJhY2tncm91bmQ7CisgICAgcHVibGljIHZvaWQgc2V0X2dQRkJhY2tncm91bmQoUHJvZ3JhbUZyYWdtZW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BGQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvZ3JhbUZyYWdtZW50IGdldF9nUEZCYWNrZ3JvdW5kKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dUR3JpZCA9IDI7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RHcmlkOworICAgIHB1YmxpYyB2b2lkIHNldF9nVEdyaWQoQWxsb2NhdGlvbiB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1RHcmlkID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RHcmlkLCAodiA9PSBudWxsKSA/IDAgOiB2LmdldElEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldF9nVEdyaWQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dUR3JpZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nVGVzdE1lc2ggPSAzOworICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX2dUZXN0TWVzaDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1Rlc3RNZXNoKFNpbXBsZU1lc2ggdikgeworICAgICAgICBtRXhwb3J0VmFyX2dUZXN0TWVzaCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dUZXN0TWVzaCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2ltcGxlTWVzaCBnZXRfZ1Rlc3RNZXNoKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nVGVzdE1lc2g7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BGU0JhY2tncm91bmQgPSA0OworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQ7CisgICAgcHVibGljIHZvaWQgc2V0X2dQRlNCYWNrZ3JvdW5kKFByb2dyYW1TdG9yZSB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nUEZTQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvZ3JhbVN0b3JlIGdldF9nUEZTQmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1JvdGF0ZSA9IDU7CisgICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX2dSb3RhdGU7CisgICAgcHVibGljIHZvaWQgc2V0X2dSb3RhdGUoZmxvYXQgdikgeworICAgICAgICBtRXhwb3J0VmFyX2dSb3RhdGUgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nUm90YXRlLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X2dSb3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dSb3RhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ0l0YWxpYyA9IDY7CisgICAgcHJpdmF0ZSBGb250IG1FeHBvcnRWYXJfZ0l0YWxpYzsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ0l0YWxpYyhGb250IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nSXRhbGljID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ0l0YWxpYywgdik7CisgICAgfQorCisgICAgcHVibGljIEZvbnQgZ2V0X2dJdGFsaWMoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dJdGFsaWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYyA9IDc7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1RleHRBbGxvYyhBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nVGV4dEFsbG9jID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYywgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RleHRBbGxvYygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliOWJkYi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjJjODIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2UyNmMwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTYwMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzUyNDguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUxMjYxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZDkzOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTc1ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYzODc0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ODI3ZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODlmNzEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmMTZhNC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGJjYmUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NGM2OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChvcnRob1dpbmRvdykKLSNwcmFnbWEgc3RhdGVSYXN0ZXIoZmxhdCkKLSNwcmFnbWEgc3RhdGVGcmFnbWVudChQZ21GcmFnQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShNeUJsZW5kKQotCi0KLWludCBtYWluKHZvaWQqIGNvbiwgaW50IGZ0LCBpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY291bnQsIHRvdWNoLCB4LCB5LCByYXRlLCBtYXhMaWZlLCBsaWZlU2hpZnQ7Ci0gICAgaW50IGxpZmU7Ci0gICAgaW50IGN0LCBjdDI7Ci0gICAgaW50IG5ld1BhcnQ7Ci0gICAgaW50IGRyYXdDb3VudDsKLSAgICBpbnQgZHgsIGR5LCBpZHg7Ci0gICAgaW50IHBvc3gscG9zeTsKLSAgICBpbnQgYzsKLSAgICBpbnQgc3JjSWR4OwotICAgIGludCBkc3RJZHg7Ci0KLSAgICBjb3VudCA9IGxvYWRJMzIoY29uLCAwLCAxKTsKLSAgICB0b3VjaCA9IGxvYWRJMzIoY29uLCAwLCAyKTsKLSAgICB4ID0gbG9hZEkzMihjb24sIDAsIDMpOwotICAgIHkgPSBsb2FkSTMyKGNvbiwgMCwgNCk7Ci0KLSAgICByYXRlID0gNDsKLSAgICBtYXhMaWZlID0gKGNvdW50IC8gcmF0ZSkgLSAxOwotICAgIGxpZmVTaGlmdCA9IDA7Ci0gICAgewotICAgICAgICBsaWZlID0gbWF4TGlmZTsKLSAgICAgICAgd2hpbGUgKGxpZmUgPiAyNTUpIHsKLSAgICAgICAgICAgIGxpZmUgPSBsaWZlID4+IDE7Ci0gICAgICAgICAgICBsaWZlU2hpZnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcmF3UmVjdChjb24sIDAsIDI1NiwgMCwgNTEyKTsKLSAgICBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChjb24sIE5BTUVEX1BnbUZyYWdQYXJ0cyk7Ci0KLSAgICBpZiAodG91Y2gpIHsKLSAgICAgICAgbmV3UGFydCA9IGxvYWRJMzIoY29uLCAyLCAwKTsKLSAgICAgICAgZm9yIChjdDI9MDsgY3QyPHJhdGU7IGN0MisrKSB7Ci0gICAgICAgICAgICBkeCA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLSAgICAgICAgICAgIGR5ID0gc2NyaXB0UmFuZChjb24sIDB4MTAwMDApIC0gMHg4MDAwOwotCi0gICAgICAgICAgICBpZHggPSBuZXdQYXJ0ICogNSArIDE7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCwgZHgpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAxLCBkeSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDIsIG1heExpZmUpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAzLCB4IDw8IDE2KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgNCwgeSA8PCAxNik7Ci0KLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcmVJMzIoY29uLCAyLCAwLCBuZXdQYXJ0KTsKLSAgICB9Ci0KLSAgICBkcmF3Q291bnQgPSAwOwotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBzcmNJZHggPSBjdCAqIDUgKyAxOwotCi0gICAgICAgIGR4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCk7Ci0gICAgICAgIGR5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDEpOwotICAgICAgICBsaWZlID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDIpOwotICAgICAgICBwb3N4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDMpOwotICAgICAgICBwb3N5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDQpOwotCi0gICAgICAgIGlmIChsaWZlKSB7Ci0gICAgICAgICAgICBpZiAocG9zeSA8ICg0ODAgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgZHN0SWR4ID0gZHJhd0NvdW50ICogOTsKLSAgICAgICAgICAgICAgICBjID0gMHhmZmFmY2YgfCAoKGxpZmUgPj4gbGlmZVNoaWZ0KSA8PCAyNCk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAxLCBwb3N4KTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDIsIHBvc3kpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyAzLCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDQsIHBvc3ggKyAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDUsIHBvc3kgKyBkeSAqIDQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyA2LCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDcsIHBvc3ggLSAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDgsIHBvc3kgKyBkeSAqIDQpOwotICAgICAgICAgICAgICAgIGRyYXdDb3VudCArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGR5ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkeSA9ICgtZHkpID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3N4ID0gcG9zeCArIGR4OwotICAgICAgICAgICAgcG9zeSA9IHBvc3kgKyBkeTsKLSAgICAgICAgICAgIGR5ID0gZHkgKyAweDQwMDsKLSAgICAgICAgICAgIGxpZmUgLS07Ci0KLSAgICAgICAgICAgIC8vc3RvcmVJMzIoY29uLCAyLCBzcmNJZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAyLCBsaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMywgcG9zeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDQsIHBvc3kpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1RyaWFuZ2xlQXJyYXkoY29uLCBOQU1FRF9QYXJ0QnVmZmVyLCBkcmF3Q291bnQpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzU2NzUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChQVkJhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUEZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKFBTQmFja2dyb3VuZCkKLQotI2RlZmluZSBTVEFURV9UUklBTkdMRV9PRkZTRVRfQ09VTlQgMAotI2RlZmluZSBTVEFURV9MQVNUX0ZPQ1VTIDEKLQotCi0vLyBUaGUgc2NyaXB0IGVudmlyb21lbnQgaGFzIDMgZW52IGFsbG9jYXRpb25zLgotLy8gYmFuazA6IChyKSBUaGUgZW52aXJvbWVudCBzdHJ1Y3R1cmUKLS8vIGJhbmsxOiAocikgVGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uCi0vLyBiYW5rMjogKHJ3KSBUaGUgdGVtcG9yYXJ5IHRleHR1cmUgc3RhdGUKLQotaW50IGxhc3RGb2N1czsKLQotaW50IG1haW4oaW50IGluZGV4KQotewotICAgIGZsb2F0IG1hdDFbMTZdOwotCi0gICAgZmxvYXQgdHJhbnMgPSBQb3MtPnRyYW5zbGF0ZTsKLSAgICBmbG9hdCByb3QgPSBQb3MtPnJvdGF0ZTsKLQotICAgIG1hdHJpeExvYWRTY2FsZShtYXQxLCAyLmYsIDIuZiwgMi5mKTsKLSAgICBtYXRyaXhUcmFuc2xhdGUobWF0MSwgMC5mLCAwLmYsIHRyYW5zKTsKLSAgICBtYXRyaXhSb3RhdGUobWF0MSwgOTAuZiwgMC5mLCAwLmYsIDEuZik7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIHJvdCwgMS5mLCAwLmYsIDAuZik7Ci0gICAgdnBMb2FkTW9kZWxNYXRyaXgobWF0MSk7Ci0KLSAgICAvLyBEcmF3IHRoZSBsaWdodGluZyBlZmZlY3QgaW4gdGhlIHN0cmlwIGFuZCBmaWxsIHRoZSBaIGJ1ZmZlci4KLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9tZXNoKTsKLQotICAgIC8vIFN0YXJ0IG9mIGltYWdlcy4KLSAgICBiaW5kUHJvZ3JhbVN0b3JlKE5BTUVEX1BTSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbUZyYWdtZW50KE5BTUVEX1BGSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbVZlcnRleChOQU1FRF9QVkltYWdlcyk7Ci0KLSAgICBmbG9hdCBmb2N1c1BvcyA9IFBvcy0+Zm9jdXM7Ci0gICAgaW50IGZvY3VzSUQgPSAwOwotICAgIGludCBsYXN0Rm9jdXNJRCA9IGxvYWRJMzIoMiwgU1RBVEVfTEFTVF9GT0NVUyk7Ci0gICAgaW50IGltZ0NvdW50ID0gMTM7Ci0KLSAgICBpZiAodHJhbnMgPiAoLS4zZikpIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xLjBmIC0gZm9jdXNQb3M7Ci0gICAgICAgIGlmIChmb2N1c0lEID49IGltZ0NvdW50KSB7Ci0gICAgICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgfQotCi0gICAgLyoKLSAgICBpZiAoZm9jdXNJRCAhPSBsYXN0Rm9jdXNJRCkgewotICAgICAgICBpZiAobGFzdEZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbbGFzdEZvY3VzSURdLCAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNJRCA+PSAwKSB7Ci0gICAgICAgICAgICB1cGxvYWRUb1RleHR1cmUoY29uLCBlbnYtPnRleFtmb2N1c0lEXSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICBsYXN0Rm9jdXMgPSBmb2N1c0lEOwotCi0gICAgaW50IHRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gUG9zLT50cmlhbmdsZU9mZnNldENvdW50OwotCi0gICAgaW50IGltZ0lkID0gMDsKLSAgICBmb3IgKGltZ0lkPTE7IGltZ0lkIDw9IGltZ0NvdW50OyBpbWdJZCsrKSB7Ci0gICAgICAgIGZsb2F0IHBvcyA9IGZvY3VzUG9zICsgaW1nSWQgKyAwLjRmOwotICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClmbG9vcmYocG9zICogMi5mKTsKLSAgICAgICAgcG9zID0gcG9zIC0gMC43NWY7Ci0KLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdHJpYW5nbGVPZmZzZXRzQ291bnQgLyAyOwotICAgICAgICBpZiAoISgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSB0cmlhbmdsZU9mZnNldHNDb3VudCkpKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvZmZzZXQgLTI7Ci0gICAgICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB0cmlhbmdsZU9mZnNldHNDb3VudC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiaW5kVGV4dHVyZShOQU1FRF9QRkltYWdlcywgMCwgbG9hZEkzMigwLCBpbWdJZCAtIDEpKTsKLSAgICAgICAgICAgIG1hdHJpeExvYWRUcmFuc2xhdGUobWF0MSwgLXBvcyAtIGxvYWRGKDUsIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMiksIDAsIDApOwotICAgICAgICAgICAgdnBMb2FkVGV4dHVyZU1hdHJpeChtYXQxKTsKLSAgICAgICAgICAgIGRyYXdTaW1wbGVNZXNoUmFuZ2UoTkFNRURfbWVzaCwgbG9hZEkzMig0LCBzdGFydCksIChsb2FkSTMyKDQsIGVuZCkgLSBsb2FkSTMyKDQsIHN0YXJ0KSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA0NTAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOwotCi1wdWJsaWMgY2xhc3MgRmlsbVJTIHsKLSAgICBjbGFzcyBTdHJpcFBvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGZsb2F0IHRyYW5zbGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IHJvdGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IGZvY3VzOwotICAgICAgICBwdWJsaWMgaW50IHRyaWFuZ2xlT2Zmc2V0Q291bnQ7Ci0gICAgfQotICAgIFN0cmlwUG9zaXRpb24gbVBvcyA9IG5ldyBTdHJpcFBvc2l0aW9uKCk7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOwotCi0gICAgcHVibGljIEZpbG1SUygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbG1TdHJpcFBvc2l0aW9uKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmICh4IDwgNTApIHsKLSAgICAgICAgICAgIHggPSA1MDsKLSAgICAgICAgfQotICAgICAgICBpZiAoeCA+IDI3MCkgewotICAgICAgICAgICAgeCA9IDI3MDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGFuaW0gPSAoKGZsb2F0KXgtNTApIC8gMjcwLmY7Ci0gICAgICAgIG1Qb3MudHJhbnNsYXRlID0gMmYgKiBhbmltICsgMC41ZjsgICAvLyB0cmFuc2xhdGlvbgotICAgICAgICBtUG9zLnJvdGF0ZSA9IChhbmltICogNDApOyAgLy8gcm90YXRpb24KLSAgICAgICAgbVBvcy5mb2N1cyA9ICgoZmxvYXQpeSkgLyAxNi5mIC0gMTAuZjsgIC8vIGZvY3VzUG9zCi0gICAgICAgIG1Qb3MudHJpYW5nbGVPZmZzZXRDb3VudCA9IG1GU00ubVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotICAgICAgICBtQWxsb2NQb3MuZGF0YShtUG9zKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgbVNjcmlwdFN0cmlwOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRJbWFnZTsKLSAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOwotICAgIHByaXZhdGUgVHlwZSBtU3RyaXBQb3NpdGlvblR5cGU7Ci0KLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUltYWdlc1tdOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NJRHM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BvczsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jU3RhdGU7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzVGV4OwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzOwotCi0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1NZXNoOwotICAgIHByaXZhdGUgTGlnaHQgbUxpZ2h0OwotCi0gICAgcHJpdmF0ZSBGaWxtU3RyaXBNZXNoIG1GU007Ci0KLSAgICBwcml2YXRlIGludFtdIG1CdWZmZXJJRHM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1CdWZmZXJQb3MgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVyU3RhdGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKLSAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKHRydWUpOwotICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKLSAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQuc2V0TmFtZSgiUFNCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5FUVVBTCk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2soZmFsc2UpOwotICAgICAgICBiLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkUpOwotICAgICAgICBtUFNJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNJbWFnZXMuc2V0TmFtZSgiUFNJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgewotICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ly9fTUlQX0xJTkVBUik7Ci0gICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ci0gICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOwotICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOwotICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOwotCi0gICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQuc2V0TmFtZSgiUEZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAotICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOwotICAgICAgICBtUEZJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZJbWFnZXMuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOwotICAgICAgICBtUEZJbWFnZXMuc2V0TmFtZSgiUEZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgewotICAgICAgICBtTGlnaHQgPSAobmV3IExpZ2h0LkJ1aWxkZXIobVJTKSkuY3JlYXRlKCk7Ci0gICAgICAgIG1MaWdodC5zZXRQb3NpdGlvbigwLCAtMC41ZiwgLTEuMGYpOwotCi0gICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vcHZiLmFkZExpZ2h0KG1MaWdodCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuc2V0TmFtZSgiUFZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICBwdmIuc2V0VGV4dHVyZU1hdHJpeEVuYWJsZSh0cnVlKTsKLSAgICAgICAgbVBWSW1hZ2VzID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZJbWFnZXMuc2V0TmFtZSgiUFZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLSAgICAgICAgbUJ1ZmZlcklEcyA9IG5ldyBpbnRbMTNdOwotICAgICAgICBtSW1hZ2VzID0gbmV3IEFsbG9jYXRpb25bMTNdOwotICAgICAgICBtQWxsb2NJRHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlcklEcy5sZW5ndGgpOwotCi0gICAgICAgIEVsZW1lbnQgaWUgPSBFbGVtZW50LmNyZWF0ZVBpeGVsKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF81XzZfNSwgRWxlbWVudC5EYXRhS2luZC5QSVhFTF9SR0IpOwotICAgICAgICBtSW1hZ2VzWzBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAxLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDIsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1syXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzNdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA0LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDUsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s1XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzZdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA3LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbN10gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDgsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s4XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwOSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzldID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEwLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDExLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTJdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEzLCBpZSwgdHJ1ZSk7Ci0KLSAgICAgICAgaW50IGJsYWNrW10gPSBuZXcgaW50WzEwMjRdOwotICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUltYWdlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgIEFsbG9jYXRpb24uQWRhcHRlcjJEIGEgPSBtSW1hZ2VzW2N0XS5jcmVhdGVBZGFwdGVyMkQoKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSA1MTI7Ci0gICAgICAgICAgICBpbnQgbWlwID0gMDsKLSAgICAgICAgICAgIHdoaWxlKHNpemUgPj0gMikgewotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCAyLCBzaXplLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKHNpemUtMiwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCBzaXplLCAyLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIHNpemUtMiwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIHNpemUgPj49IDE7Ci0gICAgICAgICAgICAgICAgbWlwKys7Ci0gICAgICAgICAgICAgICAgYS5zZXRDb25zdHJhaW50KERpbWVuc2lvbi5MT0QsIG1pcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbWFnZXNbY3RdLnVwbG9hZFRvVGV4dHVyZSgxKTsKLSAgICAgICAgICAgIG1CdWZmZXJJRHNbY3RdID0gbUltYWdlc1tjdF0uZ2V0SUQoKTsKLSAgICAgICAgfQotICAgICAgICBtQWxsb2NJRHMuZGF0YShtQnVmZmVySURzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRlKCkKLSAgICB7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZSA9IG5ldyBpbnRbMTBdOwotICAgICAgICBtQWxsb2NTdGF0ZSA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksCi0gICAgICAgICAgICBtQnVmZmVyU3RhdGUubGVuZ3RoKTsKLSAgICAgICAgbUJ1ZmZlclN0YXRlW1NUQVRFX0xBU1RfRk9DVVNdID0gLTE7Ci0gICAgICAgIG1BbGxvY1N0YXRlLmRhdGEobUJ1ZmZlclN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtRlNNID0gbmV3IEZpbG1TdHJpcE1lc2goKTsKLSAgICAgICAgbU1lc2ggPSBtRlNNLmluaXQobVJTKTsKLSAgICAgICAgbU1lc2guc2V0TmFtZSgibWVzaCIpOwotCi0gICAgICAgIGluaXRQRlMoKTsKLSAgICAgICAgaW5pdFBGKCk7Ci0gICAgICAgIGluaXRQVigpOwotCi0gICAgICAgIExvZy5lKCJycyIsICJEb25lIGxvYWRpbmcgbmFtZWQiKTsKLQotICAgICAgICBtU3RyaXBQb3NpdGlvblR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFN0cmlwUG9zaXRpb24uY2xhc3MsIDEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZpbG1zdHJpcCk7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVN0cmlwUG9zaXRpb25UeXBlLCAiUG9zIiwgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBtU2NyaXB0U3RyaXAuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBtQWxsb2NQb3MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVN0cmlwUG9zaXRpb25UeXBlKTsKLQotICAgICAgICBsb2FkSW1hZ2VzKCk7Ci0gICAgICAgIGluaXRTdGF0ZSgpOwotCi0gICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkltYWdlcy5iaW5kQWxsb2NhdGlvbihtUFZBKTsKLSAgICAgICAgbVBWQS5zZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKDMyMCwgNDgwKTsKLQotCi0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NJRHMsIDApOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jUG9zLCAxKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1N0YXRlLCAyKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1QVkEubUFsbG9jLCAzKTsKLQotCi0gICAgICAgIG1BbGxvY09mZnNldHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwgbUZTTS5tVHJpYW5nbGVPZmZzZXRzLmxlbmd0aCk7Ci0gICAgICAgIG1BbGxvY09mZnNldHMuZGF0YShtRlNNLm1UcmlhbmdsZU9mZnNldHMpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jT2Zmc2V0cywgNCk7Ci0KLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleCA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleC5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzVGV4LmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzVGV4KTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHNUZXgsIDUpOwotCi0gICAgICAgIHNldEZpbG1TdHJpcFBvc2l0aW9uKDAsIDApOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHRTdHJpcCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhjY2UwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNpbXBsZU1lc2g7Ci0KLQotY2xhc3MgRmlsbVN0cmlwTWVzaCB7Ci0KLSAgICBjbGFzcyBWZXJ0ZXggewotICAgICAgICBmbG9hdCBueDsKLSAgICAgICAgZmxvYXQgbnk7Ci0gICAgICAgIGZsb2F0IG56OwotICAgICAgICBmbG9hdCBzOwotICAgICAgICBmbG9hdCB0OwotICAgICAgICBmbG9hdCB4OwotICAgICAgICBmbG9hdCB5OwotICAgICAgICBmbG9hdCB6OwotCi0gICAgICAgIFZlcnRleCgpIHsKLSAgICAgICAgICAgIG54ID0gMDsKLSAgICAgICAgICAgIG55ID0gMDsKLSAgICAgICAgICAgIG56ID0gMDsKLSAgICAgICAgICAgIHMgPSAwOwotICAgICAgICAgICAgdCA9IDA7Ci0gICAgICAgICAgICB4ID0gMDsKLSAgICAgICAgICAgIHkgPSAwOwotICAgICAgICAgICAgeiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHh5eihmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF96KSB7Ci0gICAgICAgICAgICB4ID0gX3g7Ci0gICAgICAgICAgICB5ID0gX3k7Ci0gICAgICAgICAgICB6ID0gX3o7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG54eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgbnggPSBfeDsKLSAgICAgICAgICAgIG55ID0gX3k7Ci0gICAgICAgICAgICBueiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdChmbG9hdCBfcywgZmxvYXQgX3QpIHsKLSAgICAgICAgICAgIHMgPSBfczsKLSAgICAgICAgICAgIHQgPSBfdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tcHV0ZU5vcm0oVmVydGV4IHYxLCBWZXJ0ZXggdjIpIHsKLSAgICAgICAgICAgIGZsb2F0IGR4ID0gdjEueCAtIHYyLng7Ci0gICAgICAgICAgICBmbG9hdCBkeSA9IHYxLnkgLSB2Mi55OwotICAgICAgICAgICAgZmxvYXQgZHogPSB2MS56IC0gdjIuejsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkgKyBkeipkeik7Ci0gICAgICAgICAgICBkeCAvPSBsZW47Ci0gICAgICAgICAgICBkeSAvPSBsZW47Ci0gICAgICAgICAgICBkeiAvPSBsZW47Ci0KLSAgICAgICAgICAgIG54ID0gZHggKiBkejsKLSAgICAgICAgICAgIG55ID0gZHkgKiBkejsKLSAgICAgICAgICAgIG56ID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoZHgqZHggKyBkeSpkeSk7Ci0KLSAgICAgICAgICAgIGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KG54Km54ICsgbnkqbnkgKyBueipueik7Ci0gICAgICAgICAgICBueCAvPSBsZW47Ci0gICAgICAgICAgICBueSAvPSBsZW47Ci0gICAgICAgICAgICBueiAvPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRbXSBtVHJpYW5nbGVPZmZzZXRzOwotICAgIGZsb2F0W10gbVRyaWFuZ2xlT2Zmc2V0c1RleDsKLSAgICBpbnQgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotCi0gICAgU2ltcGxlTWVzaCBpbml0KFJlbmRlclNjcmlwdCBycykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHZ0eFtdID0gbmV3IGZsb2F0W10gewotICAgICAgICAgICAgNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYsCi0gICAgICAgICAgICA2MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgIDYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICA2NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgIDY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICA3MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgIDc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgIDgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICA4NC4zNzE3NzNmLCA5NS43NzEwMjNmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxMjIuOTQ5ODQ5ZiwKLSAgICAgICAgICAgIDEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxNTQuNzk3NDM5ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgIDEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgIDI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgIDM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICA0NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgNTcuNjc4OTIwZiwgNjkuODMyMzkwZiwKLSAgICAgICAgICAgIDcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAxMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAxNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgIDE2NC4xOTUyODNmLCAtMC4xNDUyNjlmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIC0xOC45MjQwODRmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIC02MC42OTk1OTRmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA4MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAyMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTIwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC02MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTgwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgLTEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgLTUwLjQ4NjkxNGYsCi0gICAgICAgICAgICAtMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgLTE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIC0xNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgICAtMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAgLTE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgICAtMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDY1LjYwNDczMWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICAgLTQ0LjY2ODEzNWYsIDc4LjE0MjMyN2YsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEwMy44MjQ2MzFmLAotICAgICAgICAgICAgIC0yNS45MDE1NTdmLCAxMTkuMTA0NzMxZiwKLSAgICAgICAgICAgICAtMjguMTA0NzY3ZiwgMTM0LjM4NDgzMWYsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDE0OC40MjAxMDRmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCAxNjAuMDY3MTM0ZiwKLSAgICAgICAgICAgICAtNTcuNjc4OTIwZiwgMTY4LjM3NzA3MWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDE3Mi42NzI5MjdmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCAxNzIuNjA0NzMxZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgMTcyLjQ0MjM2NGYsCi0gICAgICAgICAgICAgLTEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDE2My4xNzAwOTZmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAgLTEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgICAtMTMxLjk0NTI4M2YsIDEzMy44NTQ3MzFmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAgLTEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDEwNC41MzkzNjZmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgOTUuMjY3MDk4ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgICAtODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgICAtODAuODk4NTc0ZiwgOTYuODQzNzgxZiwKLSAgICAgICAgICAgICAtNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgICAtNzQuNDM1NDUyZiwgMTAwLjE0NjU3N2YsCi0gICAgICAgICAgICAgLTcxLjUzMTI1OWYsIDEwMi4zMzI4MDNmLAotICAgICAgICAgICAgIC02OC44OTc3MDNmLCAxMDQuODM4NDU3ZiwKLSAgICAgICAgICAgICAtNjYuNTY5NzE2ZiwgMTA3LjYzMDMwMmYsCi0gICAgICAgICAgICAgLTY0LjU3ODE3N2YsIDExMC42NzEzMDRmLAotICAgICAgICAgICAgIC02Mi45NDk1MDVmLCAxMTMuOTIxMTI3ZiwKLSAgICAgICAgICAgICAtNjEuNzA1MzAzZiwgMTE3LjMzNjY2MmYsCi0gICAgICAgICAgICAgLTYwLjg2MjA3NGYsIDEyMC44NzI2MDRmLAotICAgICAgICAgICAgIC02MC40MzEwMDNmLCAxMjQuNDgyMDUwZgotICAgICAgICB9OwotCi0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0cyA9IG5ldyBpbnRbNjRdOwotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4ID0gbmV3IGZsb2F0WzY0XTsKLQotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzWzBdID0gMDsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gMTsKLQotICAgICAgICBWZXJ0ZXggdCA9IG5ldyBWZXJ0ZXgoKTsKLSAgICAgICAgdC5ueHl6KDEsIDAsIDApOwotICAgICAgICBpbnQgY291bnQgPSB2dHgubGVuZ3RoIC8gMjsKLQotICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG0gPSBuZXcgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKAotICAgICAgICAgICAgcnMsIDMsCi0gICAgICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuTk9STUFMIHwgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7Ci0KLSAgICAgICAgZmxvYXQgcnVubmluZ1MgPSAwOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0xKTsgY3QrKykgewotICAgICAgICAgICAgdC54ID0gLXZ0eFtjdCoyXSAvIDEwMC5mOwotICAgICAgICAgICAgdC56ID0gdnR4W2N0KjIrMV0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQucyA9IHJ1bm5pbmdTOwotICAgICAgICAgICAgdC5ueCA9ICAodnR4W2N0KjIrM10gLSB2dHhbY3QqMiArMV0pOwotICAgICAgICAgICAgdC5ueSA9ICAodnR4W2N0KjIrMl0gLSB2dHhbY3QqMiAgIF0pOwotICAgICAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQodC5ueCAqIHQubnggKyB0Lm55ICogdC5ueSk7Ci0gICAgICAgICAgICBydW5uaW5nUyArPSBsZW4gLyAxMDA7Ci0gICAgICAgICAgICB0Lm54IC89IGxlbjsKLSAgICAgICAgICAgIHQubnkgLz0gbGVuOwotICAgICAgICAgICAgdC55ID0gLTAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAwOwotICAgICAgICAgICAgdG0uc2V0Tm9ybWFsKHQubngsIHQubnksIHQubnopOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLSAgICAgICAgICAgIHQueSA9IC41ZjsKLSAgICAgICAgICAgIHQudCA9IDE7Ci0gICAgICAgICAgICB0bS5zZXRUZXh0dXJlKHQucywgdC50KTsKLSAgICAgICAgICAgIHRtLmFkZFZlcnRleCh0LngsIHQueSwgdC56KTsKLSAgICAgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJ2dHggeD0iK3QueCsiIHk9Iit0LnkrIiB6PSIrdC56KyIgcz0iK3QucysiIHQ9Iit0LnQpOwotCi0gICAgICAgICAgICBpZigocnVubmluZ1MqMikgPiBtVHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzW21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSBjdCoyICogMzsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4W21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSB0LnM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSAoY291bnQgKiAyIC0gMik7Ci0gICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgKGNvdW50LTIpOyBjdCs9IDIpIHsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0LCBjdCsxLCBjdCsyKTsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0KzEsIGN0KzMsIGN0KzIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bS5jcmVhdGUoKTsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiODE5Yi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLSNwcmFnbWEgdmVyc2lvbigxKQotCi1pbnQgbmV3UGFydCA9IDA7Ci0KLWludCBtYWluKGludCBsYXVuY2hJRCkgewotICAgIGludCBjdDsKLSAgICBpbnQgY291bnQgPSBDb250cm9sLT5jb3VudDsKLSAgICBpbnQgcmF0ZSA9IENvbnRyb2wtPnJhdGU7Ci0gICAgZmxvYXQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgc3RydWN0IHBvaW50X3MgKiBwID0gKHN0cnVjdCBwb2ludF9zICopcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBzdHJ1Y3QgcG9pbnRfcyAqIG5wID0gJnBbbmV3UGFydF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdGUtLSkgewotICAgICAgICAgICAgdmVjMlJhbmQoKGZsb2F0ICopJm5wLT5kZWx0YS54LCByTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoTkFNRURfUGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goTkFNRURfUGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4ucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjEyZDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4ucnMKQEAgLTAsMCArMSw3MSBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLmZvdW50YWluKQorCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc190eXBlcy5yc2giCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc19tYXRoLnJzaCIKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCIKKworc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKK3N0YXRpYyBmbG9hdDQgcGFydENvbG9yOworcnNfbWVzaCBwYXJ0TWVzaDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgUG9pbnQgeworICAgIGZsb2F0MiBkZWx0YTsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgdWNoYXI0IGNvbG9yOworfSBQb2ludF90OworUG9pbnRfdCAqcG9pbnQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3Zhcihwb2ludCwgcGFydE1lc2gpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGFkZFBhcnRpY2xlcykKKworaW50IHJvb3QoKSB7CisgICAgcnNnQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAxLmYpOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGNvbnN0IGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKworICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7CisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBzaXplOyBjdCsrKSB7CisgICAgICAgIHAtPmRlbHRhLnkgKz0gMC4xNWY7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdTaW1wbGVNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGJvb2wgbmV3Q29sb3IpCit7CisgICAgaWYgKG5ld0NvbG9yKSB7CisgICAgICAgIHBhcnRDb2xvci54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3IueSA9IHJzUmFuZCgxLjBmKTsKKyAgICAgICAgcGFydENvbG9yLnogPSByc1JhbmQoMS4wZik7CisgICAgfQorICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOworICAgIGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICB1Y2hhcjQgYyA9IHJzUGFja0NvbG9yVG84ODg4KHBhcnRDb2xvcik7CisKKyAgICBQb2ludF90ICogbnAgPSAmcG9pbnRbbmV3UGFydF07CisgICAgZmxvYXQyIHAgPSB7eCwgeX07CisgICAgd2hpbGUgKHJhdGUtLSkgeworICAgICAgICBmbG9hdCBhbmdsZSA9IHJzUmFuZCgzLjE0ZiAqIDIuZik7CisgICAgICAgIGZsb2F0IGxlbiA9IHJzUmFuZChyTWF4KTsKKyAgICAgICAgbnAtPmRlbHRhLnggPSBsZW4gKiBzaW4oYW5nbGUpOworICAgICAgICBucC0+ZGVsdGEueSA9IGxlbiAqIGNvcyhhbmdsZSk7CisgICAgICAgIG5wLT5wb3NpdGlvbiA9IHA7CisgICAgICAgIG5wLT5jb2xvciA9IGM7CisgICAgICAgIG5ld1BhcnQrKzsKKyAgICAgICAgbnArKzsKKyAgICAgICAgaWYgKG5ld1BhcnQgPj0gc2l6ZSkgeworICAgICAgICAgICAgbmV3UGFydCA9IDA7CisgICAgICAgICAgICBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAxMTQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotI2luY2x1ZGUgInJzX3R5cGVzLnJzaCIKLSNpbmNsdWRlICJyc19tYXRoLnJzaCIKLSNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCi0KLXN0YXRpYyBpbnQgbmV3UGFydCA9IDA7Ci0KLXR5cGVkZWYgc3RydWN0IENvbnRyb2xfcyB7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IHJhdGU7Ci0gICAgaW50IGNvdW50OwotICAgIGZsb2F0IHIsIGcsIGI7Ci0gICAgcnNfYWxsb2NhdGlvbiBwYXJ0QnVmZmVyOwotICAgIHJzX21lc2ggcGFydE1lc2g7Ci19IENvbnRyb2xfdDsKLUNvbnRyb2xfdCAqQ29udHJvbDsKLQotdHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3sKLSAgICBmbG9hdDIgZGVsdGE7Ci0gICAgZmxvYXQyIHBvc2l0aW9uOwotICAgIHVuc2lnbmVkIGludCBjb2xvcjsKLX0gUG9pbnRfdDsKLVBvaW50X3QgKnBvaW50OwotCi1pbnQgbWFpbihpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY3Q7Ci0gICAgaW50IGNvdW50ID0gQ29udHJvbC0+Y291bnQ7Ci0gICAgaW50IHJhdGUgPSBDb250cm9sLT5yYXRlOwotICAgIGZsb2F0IGhlaWdodCA9IGdldEhlaWdodCgpOwotICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBQb2ludF90ICogbnAgPSAmcFtuZXdQYXJ0XTsKLQotICAgICAgICB3aGlsZSAocmF0ZS0tKSB7Ci0gICAgICAgICAgICBucC0+ZGVsdGEgPSB2ZWMyUmFuZChyTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoQ29udHJvbC0+cGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goQ29udHJvbC0+cGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW5fYmMuYmMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbl9iYy5iYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZiN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW5fYmMuYmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQppbmRleCA5MzU2NTc5Li5mZmUyZmFkIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQpAQCAtMjQsOTIgKzI0LDQwIEBACiBwdWJsaWMgY2xhc3MgRm91bnRhaW5SUyB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDIwMDAwOwogCi0gICAgc3RhdGljIGNsYXNzIFNvbWVEYXRhIHsKLSAgICAgICAgcHVibGljIGludCB4OwotICAgICAgICBwdWJsaWMgaW50IHk7Ci0gICAgICAgIHB1YmxpYyBpbnQgcmF0ZTsKLSAgICAgICAgcHVibGljIGludCBjb3VudDsKLSAgICAgICAgcHVibGljIGZsb2F0IHI7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBnOwotICAgICAgICBwdWJsaWMgZmxvYXQgYjsKLSAgICB9Ci0KICAgICBwdWJsaWMgRm91bnRhaW5SUygpIHsKICAgICB9CiAKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NyaXB0Q19Gb3VudGFpbiBtU2NyaXB0OwogICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBtUlMgPSByczsKICAgICAgICAgbVJlcyA9IHJlczsKLSAgICAgICAgaW5pdFJTKCk7Ci0gICAgfQogCi0gICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihpbnQgeCwgaW50IHksIGludCByYXRlKSB7Ci0gICAgICAgIGlmIChtU0QucmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICBtU0QuciA9ICgoeCAmIDB4MSkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuZyA9ICgoeCAmIDB4MikgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuYiA9ICgoeCAmIDB4NCkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBpZiAoKG1TRC5yICsgbVNELmcgKyBtU0QuYikgPCAwLjlmKSB7Ci0gICAgICAgICAgICAgICAgbVNELnIgPSAwLjhmOwotICAgICAgICAgICAgICAgIG1TRC5nID0gMC41ZjsKLSAgICAgICAgICAgICAgICBtU0QuYiA9IDEuZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU0QucmF0ZSA9IHJhdGU7Ci0gICAgICAgIG1TRC54ID0geDsKLSAgICAgICAgbVNELnkgPSB5OwotICAgICAgICBtSW50QWxsb2MuZGF0YShtU0QpOwotICAgIH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0KLSAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUludEFsbG9jOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtU007Ci0gICAgcHJpdmF0ZSBTb21lRGF0YSBtU0Q7Ci0gICAgcHJpdmF0ZSBUeXBlIG1TRFR5cGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtU0QgPSBuZXcgU29tZURhdGEoKTsKLSAgICAgICAgbVNEVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgU29tZURhdGEuY2xhc3MsIDEsICJTb21lRGF0YSIpOwotICAgICAgICBtSW50QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVNEVHlwZSk7Ci0gICAgICAgIG1TRC5jb3VudCA9IFBBUlRfQ09VTlQ7Ci0gICAgICAgIG1JbnRBbGxvYy5kYXRhKG1TRCk7Ci0KLSAgICAgICAgRWxlbWVudC5CdWlsZGVyIGViID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLCAyKSwgImRlbHRhIik7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sIDIpLCAicG9zaXRpb24iKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF84LCBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLCA0KSwgImNvbG9yIik7Ci0gICAgICAgIEVsZW1lbnQgcHJpbUVsZW1lbnQgPSBlYi5jcmVhdGUoKTsKLQorICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKIAogICAgICAgICBTaW1wbGVNZXNoLkJ1aWxkZXIgc21iID0gbmV3IFNpbXBsZU1lc2guQnVpbGRlcihtUlMpOwotICAgICAgICBpbnQgdnR4U2xvdCA9IHNtYi5hZGRWZXJ0ZXhUeXBlKHByaW1FbGVtZW50LCBQQVJUX0NPVU5UKTsKKyAgICAgICAgaW50IHZ0eFNsb3QgPSBzbWIuYWRkVmVydGV4VHlwZShwb2ludHMuZ2V0VHlwZSgpKTsKICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuUE9JTlQpOwotICAgICAgICBtU00gPSBzbWIuY3JlYXRlKCk7Ci0gICAgICAgIG1TTS5zZXROYW1lKCJQYXJ0TWVzaCIpOworICAgICAgICBTaW1wbGVNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworICAgICAgICBzbS5iaW5kVmVydGV4QWxsb2NhdGlvbihwb2ludHMuZ2V0QWxsb2NhdGlvbigpLCB2dHhTbG90KTsKIAotICAgICAgICBBbGxvY2F0aW9uIHBhcnRBbGxvYyA9IG1TTS5jcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKHZ0eFNsb3QpOwotICAgICAgICBwYXJ0QWxsb2Muc2V0TmFtZSgiUGFydEJ1ZmZlciIpOwotICAgICAgICBtU00uYmluZFZlcnRleEFsbG9jYXRpb24ocGFydEFsbG9jLCAwKTsKLQotICAgICAgICAvLyBBbGwgc2V0dXAgb2YgbmFtZWQgb2JqZWN0cyBzaG91bGQgYmUgZG9uZSBieSB0aGlzIHBvaW50Ci0gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXJlIGFib3V0IHRvIGNvbXBpbGUgdGhlIHNjcmlwdC4KLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRTY3JpcHQobVJlcywgUi5yYXcuZm91bnRhaW4pOwotICAgICAgICBzYi5zZXRSb290KHRydWUpOwotICAgICAgICBzYi5zZXRUeXBlKG1TRFR5cGUsICJDb250cm9sIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVNNLmdldFZlcnRleFR5cGUoMCksICJwb2ludCIsIDEpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5zZXRDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW50QWxsb2MsIDApOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24ocGFydEFsbG9jLCAxKTsKLSAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChzY3JpcHQpOworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfRm91bnRhaW4obVJTLCBtUmVzLCBSLnJhdy5mb3VudGFpbl9iYywgdHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KHBvaW50cyk7CisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CiAgICAgfQogCisgICAgYm9vbGVhbiBob2xkaW5nQ29sb3IgPSBmYWxzZTsKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGludCB4LCBpbnQgeSwgaW50IHJhdGUpIHsKKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9hZGRQYXJ0aWNsZXMocmF0ZSwgeCwgeSwgIWhvbGRpbmdDb2xvcik7CisgICAgICAgICAgICBob2xkaW5nQ29sb3IgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaG9sZGluZ0NvbG9yID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vU2NyaXB0Q19Gb3VudGFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzU5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mb3VudGFpbjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFNjcmlwdENfRm91bnRhaW4gZXh0ZW5kcyBTY3JpcHRDIHsKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyAgU2NyaXB0Q19Gb3VudGFpbihSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCBpZCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIocnMsIHJlc291cmNlcywgaWQsIGlzUm9vdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfcGFydE1lc2ggPSAwOworICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX3BhcnRNZXNoOworICAgIHB1YmxpYyB2b2lkIHNldF9wYXJ0TWVzaChTaW1wbGVNZXNoIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9wYXJ0TWVzaCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X3BhcnRNZXNoLCAodiA9PSBudWxsKSA/IDAgOiB2LmdldElEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTaW1wbGVNZXNoIGdldF9wYXJ0TWVzaCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfcGFydE1lc2g7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfcG9pbnQgPSAxOworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfUG9pbnQgbUV4cG9ydFZhcl9wb2ludDsKKyAgICBwdWJsaWMgdm9pZCBiaW5kX3BvaW50KFNjcmlwdEZpZWxkX1BvaW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9wb2ludCA9IHY7CisgICAgICAgIGlmKHYgPT0gbnVsbCkgYmluZEFsbG9jYXRpb24obnVsbCwgbUV4cG9ydFZhcklkeF9wb2ludCk7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odi5nZXRBbGxvY2F0aW9uKCksIG1FeHBvcnRWYXJJZHhfcG9pbnQpOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9Qb2ludCBnZXRfcG9pbnQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX3BvaW50OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0RnVuY0lkeF9hZGRQYXJ0aWNsZXMgPSAwOworICAgIHB1YmxpYyB2b2lkIGludm9rZV9hZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGJvb2xlYW4gbmV3Q29sb3IpIHsKKyAgICAgICAgRmllbGRQYWNrZXIgYWRkUGFydGljbGVzX2ZwID0gbmV3IEZpZWxkUGFja2VyKDE2KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEkzMihyYXRlKTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEYzMih4KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEYzMih5KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEJvb2xlYW4obmV3Q29sb3IpOworICAgICAgICBhZGRQYXJ0aWNsZXNfZnAuc2tpcCgzKTsKKyAgICAgICAgaW52b2tlKG1FeHBvcnRGdW5jSWR4X2FkZFBhcnRpY2xlcywgYWRkUGFydGljbGVzX2ZwKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9TY3JpcHRGaWVsZF9Qb2ludC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9TY3JpcHRGaWVsZF9Qb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGY0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdEZpZWxkX1BvaW50LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZm91bnRhaW47CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBTY3JpcHRGaWVsZF9Qb2ludCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdC5GaWVsZEJhc2UgeworICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgSXRlbSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDIwOworCisgICAgICAgIEZsb2F0MiBkZWx0YTsKKyAgICAgICAgRmxvYXQyIHBvc2l0aW9uOworICAgICAgICBTaG9ydDQgY29sb3I7CisKKyAgICAgICAgSXRlbSgpIHsKKyAgICAgICAgICAgIGRlbHRhID0gbmV3IEZsb2F0MigpOworICAgICAgICAgICAgcG9zaXRpb24gPSBuZXcgRmxvYXQyKCk7CisgICAgICAgICAgICBjb2xvciA9IG5ldyBTaG9ydDQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBJdGVtIG1JdGVtQXJyYXlbXTsKKyAgICBwcml2YXRlIEZpZWxkUGFja2VyIG1JT0J1ZmZlcjsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgRWxlbWVudC5CdWlsZGVyIGViID0gbmV3IEVsZW1lbnQuQnVpbGRlcihycyk7CisgICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihycywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwgMiksICJkZWx0YSIpOworICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IocnMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIDIpLCAicG9zaXRpb24iKTsKKyAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKHJzLCBFbGVtZW50LkRhdGFUeXBlLlVOU0lHTkVEXzgsIDQpLCAiY29sb3IiKTsKKyAgICAgICAgcmV0dXJuIGViLmNyZWF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyAgU2NyaXB0RmllbGRfUG9pbnQoUmVuZGVyU2NyaXB0IHJzLCBpbnQgY291bnQpIHsKKyAgICAgICAgbUl0ZW1BcnJheSA9IG51bGw7CisgICAgICAgIG1JT0J1ZmZlciA9IG51bGw7CisgICAgICAgIG1FbGVtZW50ID0gY3JlYXRlRWxlbWVudChycyk7CisgICAgICAgIGluaXQocnMsIGNvdW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weVRvQXJyYXkoSXRlbSBpLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1JT0J1ZmZlciA9PSBudWxsKSBtSU9CdWZmZXIgPSBuZXcgRmllbGRQYWNrZXIoSXRlbS5zaXplb2YgKiBtVHlwZS5nZXRYKCkgLyogY291bnQgKi8pOworICAgICAgICBtSU9CdWZmZXIucmVzZXQoaW5kZXggKiBJdGVtLnNpemVvZik7CisgICAgICAgIG1JT0J1ZmZlci5hZGRGMzIoaS5kZWx0YSk7CisgICAgICAgIG1JT0J1ZmZlci5hZGRGMzIoaS5wb3NpdGlvbik7CisgICAgICAgIG1JT0J1ZmZlci5hZGRVOChpLmNvbG9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoSXRlbSBpLCBpbnQgaW5kZXgsIGJvb2xlYW4gY29weU5vdykgeworICAgICAgICBpZiAobUl0ZW1BcnJheSA9PSBudWxsKSBtSXRlbUFycmF5ID0gbmV3IEl0ZW1bbVR5cGUuZ2V0WCgpIC8qIGNvdW50ICovXTsKKyAgICAgICAgbUl0ZW1BcnJheVtpbmRleF0gPSBpOworICAgICAgICBpZiAoY29weU5vdykgIHsKKyAgICAgICAgICAgIGNvcHlUb0FycmF5KGksIGluZGV4KTsKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uLnN1YkRhdGExRChpbmRleCwgMSwgbUlPQnVmZmVyLmdldERhdGEoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlBbGwoKSB7CisgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgbUl0ZW1BcnJheS5sZW5ndGg7IGN0KyspIGNvcHlUb0FycmF5KG1JdGVtQXJyYXlbY3RdLCBjdCk7CisgICAgICAgIG1BbGxvY2F0aW9uLmRhdGEobUlPQnVmZmVyLmdldERhdGEoKSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiNDhkMjA4Li5kNmEyZGI0IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC02LDcgKzYsOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJJbWFnZSBQcm9jZXNzaW5nIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAppbmRleCA2NzcwYzE4Li5jNmVjNzI5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0yNSw5ICsyNSwxNDcgQEAKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5IgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KLSAgICAKKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYmVuY2htYXJrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JlbmNobWFya1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTc1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisKKyAgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5TYXR1cmF0aW9uVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE0MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKwogICAgIDxTZWVrQmFyCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGhyZXNob2xkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luR2FtbWEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nYW1tYSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5XaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2tUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvb3V0X2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luQmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luX2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGl1cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKQEAgLTM1LDQgKzE3MywxNSBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgogCisgICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JsdXJUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ibHVyX2Rlc2NyaXB0aW9uIi8+CisKIDwvbWVyZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMKaW5kZXggODg4ZjBjZC4uOTU4NWU5MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycworKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzCkBAIC0xLDYyICsxLDMxNCBAQAotLyoKLS8vIGJsb2NrIG9mIGRlZmluZXMgbWF0Y2hpbmcgd2hhdCBSUyB3aWxsIGluc2VydCBhdCBydW50aW1lLgotc3RydWN0IFBhcmFtc19zewotICAgIGludCBpbkhlaWdodDsKLSAgICBpbnQgaW5XaWR0aDsKLSAgICBpbnQgb3V0SGVpZ2h0OwotICAgIGludCBvdXRXaWR0aDsKLSAgICBmbG9hdCB0aHJlc2hvbGQ7Ci19Owotc3RydWN0IFBhcmFtc19zICogUGFyYW1zOwotc3RydWN0IEluUGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IEluUGl4ZWxfcyAqIEluUGl4ZWw7Ci1zdHJ1Y3QgT3V0UGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IE91dFBpeGVsX3MgKiBPdXRQaXhlbDsKLSovCisjcHJhZ21hIHZlcnNpb24oMSkKIAotc3RydWN0IGNvbG9yX3MgewotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotICAgIGNoYXIgYTsKLX07CisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc190eXBlcy5yc2giCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc19tYXRoLnJzaCIKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCIKIAotdm9pZCBtYWluKCkgewotICAgIGludCB0ID0gdXB0aW1lTWlsbGlzKCk7CisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmltYWdlKQogCi0gICAgc3RydWN0IGNvbG9yX3MgKmluID0gKHN0cnVjdCBjb2xvcl9zICopIEluUGl4ZWw7Ci0gICAgc3RydWN0IGNvbG9yX3MgKm91dCA9IChzdHJ1Y3QgY29sb3JfcyAqKSBPdXRQaXhlbDsKIAotICAgIGludCBjb3VudCA9IFBhcmFtcy0+aW5XaWR0aCAqIFBhcmFtcy0+aW5IZWlnaHQ7Ci0gICAgaW50IGk7Ci0gICAgZmxvYXQgdGhyZXNob2xkID0gKFBhcmFtcy0+dGhyZXNob2xkICogMjU1LmYpOworI2RlZmluZSBNQVhfUkFESVVTIDI1CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogaW4tPnIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogaW4tPmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogaW4tPmI7Ci0gICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKChpbnQgKilvdXQpID0gKigoaW50ICopaW4pICYgMHhmZjAwMDAwMDsKLSAgICAgICAgfQoraW50IGhlaWdodDsKK2ludCB3aWR0aDsKK2ludCByYWRpdXM7CiAKLSAgICAgICAgaW4rKzsKLSAgICAgICAgb3V0Kys7Cit1Y2hhcjQgKiBJblBpeGVsOwordWNoYXI0ICogT3V0UGl4ZWw7Cit1Y2hhcjQgKiBTY3JhdGNoUGl4ZWw7CisKK2Zsb2F0IGluQmxhY2s7CitmbG9hdCBvdXRCbGFjazsKK2Zsb2F0IGluV2hpdGU7CitmbG9hdCBvdXRXaGl0ZTsKK2Zsb2F0IGdhbW1hOworCitmbG9hdCBzYXR1cmF0aW9uOworCitzdGF0aWMgZmxvYXQgaW5XTWluSW5COworc3RhdGljIGZsb2F0IG91dFdNaW5PdXRCOworc3RhdGljIGZsb2F0IG92ZXJJbldNaW5JbkI7CisvL3N0YXRpYyBmbG9hdDMgZ2FtbWFWOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoaGVpZ2h0LCB3aWR0aCwgcmFkaXVzLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsLCBpbkJsYWNrLCBvdXRCbGFjaywgaW5XaGl0ZSwgb3V0V2hpdGUsIGdhbW1hLCBzYXR1cmF0aW9uLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhmaWx0ZXIsIGZpbHRlckJlbmNobWFyayk7CisKKy8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorc3RhdGljIGZsb2F0IGdhdXNzaWFuW01BWF9SQURJVVMgKiAyICsgMV07CitzdGF0aWMgcnNfbWF0cml4M3gzIGNvbG9yTWF0OworCitzdGF0aWMgdm9pZCBjb21wdXRlQ29sb3JNYXRyaXgoKSB7CisgICAgLy8gU2F0dXJhdGlvbgorICAgIC8vIExpbmVhciB3ZWlnaHRzCisgICAgLy9mbG9hdCByV2VpZ2h0ID0gMC4zMDg2ZjsKKyAgICAvL2Zsb2F0IGdXZWlnaHQgPSAwLjYwOTRmOworICAgIC8vZmxvYXQgYldlaWdodCA9IDAuMDgyMGY7CisKKyAgICAvLyBHYW1tYSAyLjIgd2VpZ2h0cyAod2UgaGF2ZW4ndCBjb252ZXJ0ZWQgb3VyIGltYWdlIHRvIGxpbmVhciBzcGFjZSB5ZXQgZm9yIHBlcmYgcmVhc29ucykKKyAgICBmbG9hdCByV2VpZ2h0ID0gMC4yOTlmOworICAgIGZsb2F0IGdXZWlnaHQgPSAwLjU4N2Y7CisgICAgZmxvYXQgYldlaWdodCA9IDAuMTE0ZjsKKworICAgIGZsb2F0IG9uZU1pbnVzUyA9IDEuMGYgLSBzYXR1cmF0aW9uOworCisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAwLCBvbmVNaW51c1MgKiByV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAxLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDIsIG9uZU1pbnVzUyAqIHJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMCwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAxLCBvbmVNaW51c1MgKiBnV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAyLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDAsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMSwgb25lTWludXNTICogYldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAyLCBvbmVNaW51c1MgKiBiV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisKKyAgICBpbldNaW5JbkIgPSBpbldoaXRlIC0gaW5CbGFjazsKKyAgICBvdXRXTWluT3V0QiA9IG91dFdoaXRlIC0gb3V0QmxhY2s7CisgICAgb3ZlckluV01pbkluQiA9IDEuZiAvIGluV01pbkluQjsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpIHsKKyAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiAoZmxvYXQpcmFkaXVzICsgMC42ZjsKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKHNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisKKyAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgaW50IHI7CisgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiBwb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgbm9ybWFsaXplRmFjdG9yICs9IGdhdXNzaWFuW3IgKyByYWRpdXNdOwogICAgIH0KIAotICAgIHQ9IHVwdGltZU1pbGxpcygpIC0gdDsKLSAgICBkZWJ1Z0kzMigiRmlsdGVyIHRpbWUiLCB0KTsKLQotICAgIHNlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQogfQorCisvLyBUaGlzIG5lZWRzIHRvIGJlIGlubGluZQorc3RhdGljIGZsb2F0NCBsZXZlbHNTYXR1cmF0aW9uKGZsb2F0NCBjdXJyZW50UGl4ZWwpIHsKKyAgICBmbG9hdDMgdGVtcCA9IHJzTWF0cml4TXVsdGlwbHkoJmNvbG9yTWF0LCBjdXJyZW50UGl4ZWwueHl6KTsKKyAgICB0ZW1wID0gKGNsYW1wKHRlbXAsIDAuMWYsIDI1NS5mKSAtIGluQmxhY2spICogb3ZlckluV01pbkluQjsKKyAgICB0ZW1wID0gcG93KHRlbXAsIChmbG9hdDMpZ2FtbWEpOworICAgIGN1cnJlbnRQaXhlbC54eXogPSBjbGFtcCh0ZW1wICogb3V0V01pbk91dEIgKyBvdXRCbGFjaywgMC4xZiwgMjU1LmYpOworICAgIHJldHVybiBjdXJyZW50UGl4ZWw7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NOb0JsdXIoKSB7CisgICAgaW50IHcsIGgsIHI7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIGZsb2F0IGluV01pbkluQiA9IGluV2hpdGUgLSBpbkJsYWNrOworICAgIGZsb2F0IG91dFdNaW5PdXRCID0gb3V0V2hpdGUgLSBvdXRCbGFjazsKKyAgICBmbG9hdDQgY3VycmVudFBpeGVsID0gMDsKKworICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IEluUGl4ZWwgKyBoKndpZHRoICsgdzsKKworICAgICAgICAgICAgLy9jdXJyZW50UGl4ZWwueHl6ID0gY29udmVydF9mbG9hdDMoaW5wdXQueHl6KTsKKyAgICAgICAgICAgIGN1cnJlbnRQaXhlbC54ID0gKGZsb2F0KShpbnB1dC0+eCk7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXQtPnkpOworICAgICAgICAgICAgY3VycmVudFBpeGVsLnogPSAoZmxvYXQpKGlucHV0LT56KTsKKworICAgICAgICAgICAgY3VycmVudFBpeGVsID0gbGV2ZWxzU2F0dXJhdGlvbihjdXJyZW50UGl4ZWwpOworCisgICAgICAgICAgICB1Y2hhcjQgKm91dHB1dCA9IE91dFBpeGVsICsgaCp3aWR0aCArIHc7CisgICAgICAgICAgICAvL291dHB1dC54eXogPSBjb252ZXJ0X3VjaGFyMyhjdXJyZW50UGl4ZWwueHl6KTsKKyAgICAgICAgICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWN1cnJlbnRQaXhlbC54OworICAgICAgICAgICAgb3V0cHV0LT55ID0gKHVpbnQ4X3QpY3VycmVudFBpeGVsLnk7CisgICAgICAgICAgICBvdXRwdXQtPnogPSAodWludDhfdCljdXJyZW50UGl4ZWwuejsKKyAgICAgICAgICAgIG91dHB1dC0+dyA9IGlucHV0LT53OworICAgICAgICB9CisgICAgfQorICAgIHJzU2VuZFRvQ2xpZW50KCZjb3VudCwgMSwgNCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhvcml6b250YWxCbHVyKCkgeworICAgIGZsb2F0NCBibHVycmVkUGl4ZWwgPSAwOworICAgIGZsb2F0NCBjdXJyZW50UGl4ZWwgPSAwOworICAgIC8vIEhvcml6b250YWwgYmx1cgorICAgIGludCB3LCBoLCByOworICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICB1Y2hhcjQgKmlucHV0ID0gSW5QaXhlbCArIGgqd2lkdGg7CisgICAgICAgIHVjaGFyNCAqb3V0cHV0ID0gU2NyYXRjaFBpeGVsICsgaCp3aWR0aDsKKworICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsID0gMDsKKworICAgICAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0gdyArIHI7CisgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGggbWF4KCkgaXNuJ3QgZXhwb3NlZCBmb3IgaW50cyB5ZXQKKyAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vaW50IHZhbGlkVyA9IHJzQ2xhbXAodyArIHIsIDAsIHdpZHRoIC0gMSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueCA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS54KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS55KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueiA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS56KTsKKyAgICAgICAgICAgICAgICAvL2N1cnJlbnRQaXhlbC53ID0gKGZsb2F0KShpbnB1dC0+YSk7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsKndlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0cHV0LT54ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLng7CisgICAgICAgICAgICBvdXRwdXQtPnkgPSAodWludDhfdClibHVycmVkUGl4ZWwueTsKKyAgICAgICAgICAgIG91dHB1dC0+eiA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC56OworICAgICAgICAgICAgLy9vdXRwdXQtPmEgPSAodWludDhfdClibHVycmVkUGl4ZWwudzsKKyAgICAgICAgICAgIG91dHB1dCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBob3Jpem9udGFsQmx1ckxldmVscygpIHsKKyAgICBmbG9hdDQgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBmbG9hdDQgY3VycmVudFBpeGVsID0gMDsKKyAgICAvLyBIb3Jpem9udGFsIGJsdXIKKyAgICBpbnQgdywgaCwgcjsKKyAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgdWNoYXI0ICpvdXRwdXQgPSBPdXRQaXhlbCArIGgqd2lkdGg7CisKKyAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCA9IDA7CisKKyAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoIG1heCgpIGlzbid0IGV4cG9zZWQgZm9yIGludHMgeWV0CisgICAgICAgICAgICAgICAgaWYodmFsaWRXIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih2YWxpZFcgPiB3aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL2ludCB2YWxpZFcgPSByc0NsYW1wKHcgKyByLCAwLCB3aWR0aCAtIDEpOworCisgICAgICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IEluUGl4ZWwgKyBoKndpZHRoICsgdmFsaWRXOworCisgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0ID0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsLnggPSAoZmxvYXQpKGlucHV0LT54KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXQtPnkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbC56ID0gKGZsb2F0KShpbnB1dC0+eik7CisgICAgICAgICAgICAgICAgLy9jdXJyZW50UGl4ZWwudyA9IChmbG9hdCkoaW5wdXQtPmEpOworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsLnh5eiArPSBjdXJyZW50UGl4ZWwueHl6ICogd2VpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSBsZXZlbHNTYXR1cmF0aW9uKGJsdXJyZWRQaXhlbCk7CisKKyAgICAgICAgICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC54OworICAgICAgICAgICAgb3V0cHV0LT55ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnk7CisgICAgICAgICAgICBvdXRwdXQtPnogPSAodWludDhfdClibHVycmVkUGl4ZWwuejsKKyAgICAgICAgICAgIC8vb3V0cHV0LT5hID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnc7CisgICAgICAgICAgICBvdXRwdXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxCbHVyKCkgeworICAgIGZsb2F0NCBibHVycmVkUGl4ZWwgPSAwOworICAgIGZsb2F0NCBjdXJyZW50UGl4ZWwgPSAwOworICAgIC8vIFZlcnRpY2FsIGJsdXIKKyAgICBpbnQgdywgaCwgcjsKKyAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgdWNoYXI0ICpvdXRwdXQgPSBPdXRQaXhlbCArIGgqd2lkdGg7CisKKyAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKworICAgICAgICAgICAgYmx1cnJlZFBpeGVsID0gMDsKKyAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyNpZiAxCisgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IGggKyByOworICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoCisgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IFNjcmF0Y2hQaXhlbCArIHZhbGlkSCp3aWR0aCArIHc7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbC54ID0gKGZsb2F0KShpbnB1dC0+eCk7CisgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsLnkgPSAoZmxvYXQpKGlucHV0LT55KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueiA9IChmbG9hdCkoaW5wdXQtPnopOworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsLnh5eiArPSBjdXJyZW50UGl4ZWwueHl6ICogd2VpZ2h0OworI2Vsc2UKKyAgICAgICAgICAgICAgICBpbnQgdmFsaWRIID0gcnNDbGFtcChoICsgciwgMCwgaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IFNjcmF0Y2hQaXhlbCArIHZhbGlkSCp3aWR0aCArIHc7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsLnh5eiArPSBjb252ZXJ0X2Zsb2F0MyhpbnB1dC0+eHl6KSAqIGdhdXNzaWFuW3IgKyByYWRpdXNdOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vb3V0cHV0LT54eXogPSBjb252ZXJ0X3VjaGFyMyhibHVycmVkUGl4ZWwueHl6KTsKKyAgICAgICAgICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC54OworICAgICAgICAgICAgb3V0cHV0LT55ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnk7CisgICAgICAgICAgICBvdXRwdXQtPnogPSAodWludDhfdClibHVycmVkUGl4ZWwuejsKKyAgICAgICAgICAgIC8vb3V0cHV0LT5hID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnc7CisgICAgICAgICAgICBvdXRwdXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmaWx0ZXIoKSB7CisgICAgUlNfREVCVUcoaGVpZ2h0KTsKKyAgICBSU19ERUJVRyh3aWR0aCk7CisgICAgUlNfREVCVUcocmFkaXVzKTsKKworICAgIGNvbXB1dGVDb2xvck1hdHJpeCgpOworCisgICAgaWYocmFkaXVzID09IDApIHsKKyAgICAgICAgcHJvY2Vzc05vQmx1cigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpOworCisgICAgaG9yaXpvbnRhbEJsdXJMZXZlbHMoKTsKKyAgICB2ZXJ0aWNhbEJsdXIoKTsKKworICAgIGludCBjb3VudCA9IDA7CisgICAgcnNTZW5kVG9DbGllbnQoJmNvdW50LCAxLCA0LCAwKTsKK30KKwordm9pZCBmaWx0ZXJCZW5jaG1hcmsoKSB7CisKKyAgICBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCk7CisKKyAgICBob3Jpem9udGFsQmx1cigpOworICAgIHZlcnRpY2FsQmx1cigpOworCisgICAgaW50IGNvdW50ID0gMDsKKyAgICByc1NlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkX2JjLmJjIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZF9iYy5iYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWRjZDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZF9iYy5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1Y2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gR2VuZXJhbCAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS1zbGlkZXIgbGFiZWwgLS0+CisgICAgPHN0cmluZyBuYW1lPSJibHVyX2Rlc2NyaXB0aW9uIj5CbHVyIFJhZGl1czwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fd2hpdGUiPkluIFdoaXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfd2hpdGUiPk91dCBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fYmxhY2siPkluIEJsYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfYmxhY2siPk91dCBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtbWEiPkdhbW1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYXR1cmF0aW9uIj5TYXR1cmF0aW9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiZW5jaG1hcmsiPkJlbmNobWFyazwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCmluZGV4IDljZTUzZDguLjdiZjY1OTYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQpAQCAtMzEsNTMgKzMxLDUzIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKLXB1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKLSAgICBwcml2YXRlIFBhcmFtcyBtUGFyYW1zOwotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBtSW52b2thYmxlOwotICAgIHByaXZhdGUgaW50W10gbUluRGF0YTsKLSAgICBwcml2YXRlIGludFtdIG1PdXREYXRhOworcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBJbjsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwT3V0OworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBTY3JhdGNoOworICAgIHByaXZhdGUgU2NyaXB0Q19UaHJlc2hvbGQgbVNjcmlwdDsKKyAgICBwcml2YXRlIGludCBtUmFkaXVzID0gMDsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVJhZGl1c1NlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1JbkJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUluQmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbU91dEJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dEJsYWNrU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1JbldoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5XaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0V2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1PdXRXaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtR2FtbWEgPSAxLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtR2FtbWFTZWVrQmFyOworCisgICAgcHJpdmF0ZSBmbG9hdCBtU2F0dXJhdGlvbiA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1TYXR1cmF0aW9uU2Vla0JhcjsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbUJlbmNobWFya1Jlc3VsdDsKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHQgbVJTOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBUeXBlIG1QYXJhbXNUeXBlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1QYXJhbXNBbGxvY2F0aW9uOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBUeXBlIG1QaXhlbFR5cGU7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIEFsbG9jYXRpb24gbUluUGl4ZWxzQWxsb2NhdGlvbjsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtT3V0UGl4ZWxzQWxsb2NhdGlvbjsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQorICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb247CiAKICAgICBwcml2YXRlIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKICAgICBwcml2YXRlIEltYWdlVmlldyBtRGlzcGxheVZpZXc7CiAKLSAgICBzdGF0aWMgY2xhc3MgUGFyYW1zIHsKLSAgICAgICAgcHVibGljIGludCBpbldpZHRoOwotICAgICAgICBwdWJsaWMgaW50IG91dFdpZHRoOwotICAgICAgICBwdWJsaWMgaW50IGluSGVpZ2h0OwotICAgICAgICBwdWJsaWMgaW50IG91dEhlaWdodDsKLQotICAgICAgICBwdWJsaWMgZmxvYXQgdGhyZXNob2xkOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBQaXhlbCB7Ci0gICAgICAgIHB1YmxpYyBieXRlIGE7Ci0gICAgICAgIHB1YmxpYyBieXRlIHI7Ci0gICAgICAgIHB1YmxpYyBieXRlIGc7Ci0gICAgICAgIHB1YmxpYyBieXRlIGI7Ci0gICAgfQotCiAgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgZXh0ZW5kcyBSZW5kZXJTY3JpcHQuUlNNZXNzYWdlIHsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtQWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLnJlYWREYXRhKG1PdXREYXRhKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtODksMjkgKzg5LDIxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGphdmFGaWx0ZXIoKSB7CisgICAgaW50IGluW107CisgICAgaW50IGludGVybVtdOworICAgIGludCBvdXRbXTsKKyAgICBpbnQgTUFYX1JBRElVUyA9IDI1OworICAgIC8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorICAgIGZsb2F0IGdhdXNzaWFuW107CisKKyAgICBwcml2YXRlIGxvbmcgamF2YUZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gbUJpdG1hcEluLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtQml0bWFwSW4uZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpbiA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgaW50ZXJtID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBvdXQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGdhdXNzaWFuID0gbmV3IGZsb2F0W01BWF9SQURJVVMgKiAyICsgMV07CisgICAgICAgICAgICBtQml0bWFwSW4uZ2V0UGl4ZWxzKGluLCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKwogICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7Ci0gICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IG1QYXJhbXMudGhyZXNob2xkICogMjU1LmY7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCByID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAwKSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZyA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBpbnQgdywgaCwgcjsKIAotICAgICAgICAgICAgZmluYWwgZmxvYXQgbHVtaW5hbmNlID0gMC4yMTI1ZiAqIHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MTU0ZiAqIGcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNzIxZiAqIGI7Ci0gICAgICAgICAgICBpZiAobHVtaW5hbmNlID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV0gJiAweGZmMDAwMDAwOworICAgICAgICBmbG9hdCBmUmFkaXVzID0gKGZsb2F0KW1SYWRpdXM7CisgICAgICAgIGludCByYWRpdXMgPSAoaW50KW1SYWRpdXM7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgICAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgICAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgICAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgICAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgICAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIGZSYWRpdXMgKyAwLjZmOworICAgICAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgICAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoZmxvYXQpKE1hdGguc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiAoZmxvYXQpTWF0aC5wb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aCBtYXgoKSBpc24ndCBleHBvc2VkIGZvciBpbnRzIHlldAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW5baCp3aWR0aCArIHZhbGlkV107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBpbnRlcm1baCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSBoICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW50ZXJtW3ZhbGlkSCp3aWR0aCArIHddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgb3V0W2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIkphdmEgZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgICAgIG1CaXRtYXBPdXQuc2V0UGl4ZWxzKG91dCwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CiAKLSAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgaWYgKGZyb21Vc2VyKSB7CisKKyAgICAgICAgICAgIGlmKHNlZWtCYXIgPT0gbVJhZGl1c1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUmFkaXVzID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgICAgICAgICAgZlJhZGl1cyAqPSAoZmxvYXQpKE1BWF9SQURJVVMpOworICAgICAgICAgICAgICAgIG1SYWRpdXMgPSAoaW50KWZSYWRpdXM7CisKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluQmxhY2tTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluQmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfaW5CbGFjayhtSW5CbGFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dEJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRCbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9vdXRCbGFjayhtT3V0QmxhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1JbldoaXRlU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1JbldoaXRlID0gKGZsb2F0KXByb2dyZXNzICsgMTI3LjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHQuc2V0X2luV2hpdGUobUluV2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1PdXRXaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0V2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfb3V0V2hpdGUobU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtR2FtbWFTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gKGZsb2F0KXByb2dyZXNzLzEwMC4wZjsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSBNYXRoLm1heChtR2FtbWEsIDAuMWYpOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IDEuMGYgLyBtR2FtbWE7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ2FtbWEobUdhbW1hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtU2F0dXJhdGlvblNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtU2F0dXJhdGlvbiA9IChmbG9hdClwcm9ncmVzcyAvIDUwLjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHQuc2V0X3NhdHVyYXRpb24obVNhdHVyYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICAgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworCisgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExOSw0NSArMzA5LDU0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwogCi0gICAgICAgIG1CaXRtYXAgPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBJbiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcFNjcmF0Y2ggPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CiAKICAgICAgICAgbVN1cmZhY2VWaWV3ID0gKFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdXJmYWNlKTsKICAgICAgICAgbVN1cmZhY2VWaWV3LmdldEhvbGRlcigpLmFkZENhbGxiYWNrKHRoaXMpOwogCiAgICAgICAgIG1EaXNwbGF5VmlldyA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRpc3BsYXkpOwotICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcCk7CisgICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwT3V0KTsKIAotICAgICAgICAoKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnRocmVzaG9sZCkpLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy50aHJlc2hvbGQgPSBwcm9ncmVzcyAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucmFkaXVzKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZva2FibGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRQaXhlbHMobU91dERhdGEsIDAsIG1QYXJhbXMub3V0V2lkdGgsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIG1JbkJsYWNrU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluQmxhY2spOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0QmxhY2spOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluV2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5XaGl0ZSk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLm91dFdoaXRlKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgbUdhbW1hU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluR2FtbWEpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE1heCgxNTApOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldFByb2dyZXNzKDEwMCk7CisKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5TYXR1cmF0aW9uKTsKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0UHJvZ3Jlc3MoNTApOworCisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmJlbmNobWFya1RleHQpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIkJlbmNobWFyayBubyB5ZXQgcnVuIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgbVBhcmFtcyA9IGNyZWF0ZVBhcmFtcygpOwotICAgICAgICBtSW52b2thYmxlID0gY3JlYXRlU2NyaXB0KCk7Ci0KLSAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7CisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTE2Niw1NCArMzY1LDI5IEBACiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgIH0KIAotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBjcmVhdGVTY3JpcHQoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKICAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOwogICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG5ldyBGaWx0ZXJDYWxsYmFjaygpOwogCi0gICAgICAgIG1QYXJhbXNUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQYXJhbXMuY2xhc3MsIDEsICJQYXJhbWV0ZXJzIik7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1QYXJhbXNUeXBlKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBPdXQpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBTY3JhdGNoKTsKIAotICAgICAgICBmaW5hbCBpbnQgcGl4ZWxDb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UaHJlc2hvbGQobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkX2JjLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3dpZHRoKG1CaXRtYXBJbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaGVpZ2h0KG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKIAotICAgICAgICBtUGl4ZWxUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQaXhlbC5jbGFzcywgMSwgIlBpeGVsIik7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOworICAgICAgICBtU2NyaXB0LnNldF9pbkJsYWNrKG1JbkJsYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfb3V0QmxhY2sobU91dEJsYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaW5XaGl0ZShtSW5XaGl0ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X291dFdoaXRlKG1PdXRXaGl0ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dhbW1hKG1HYW1tYSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3NhdHVyYXRpb24obVNhdHVyYXRpb24pOwogCi0gICAgICAgIG1JbkRhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtQml0bWFwLmdldFBpeGVscyhtSW5EYXRhLCAwLCBtUGFyYW1zLmluV2lkdGgsIDAsIDAsIG1QYXJhbXMuaW5XaWR0aCwgbVBhcmFtcy5pbkhlaWdodCk7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZGF0YShtSW5EYXRhKTsKLQotICAgICAgICBtT3V0RGF0YSA9IG5ldyBpbnRbcGl4ZWxDb3VudF07Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLmRhdGEobU91dERhdGEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGFyYW1zVHlwZSwgIlBhcmFtcyIsIDApOwotICAgICAgICBzYi5zZXRUeXBlKG1QaXhlbFR5cGUsICJJblBpeGVsIiwgMSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIk91dFBpeGVsIiwgMik7Ci0gICAgICAgIHNiLnNldFR5cGUodHJ1ZSwgMik7Ci0gICAgICAgIFNjcmlwdC5JbnZva2FibGUgaW52b2thYmxlID0gc2IuYWRkSW52b2thYmxlKCJtYWluIik7Ci0gICAgICAgIHNiLnNldFNjcmlwdChnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkKTsKLSAgICAgICAgLy9zYi5zZXRSb290KHRydWUpOwotCi0gICAgICAgIFNjcmlwdEMgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtUGFyYW1zQWxsb2NhdGlvbiwgMCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW5QaXhlbHNBbGxvY2F0aW9uLCAxKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1PdXRQaXhlbHNBbGxvY2F0aW9uLCAyKTsKLQotICAgICAgICByZXR1cm4gaW52b2thYmxlOwotICAgIH0KLQotICAgIHByaXZhdGUgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtcyA9IG5ldyBQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1zLmluV2lkdGggPSBwYXJhbXMub3V0V2lkdGggPSBtQml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgIHBhcmFtcy5pbkhlaWdodCA9IHBhcmFtcy5vdXRIZWlnaHQgPSBtQml0bWFwLmdldEhlaWdodCgpOwotICAgICAgICBwYXJhbXMudGhyZXNob2xkID0gMC41ZjsKLSAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICAgICAgbVNjcmlwdC5iaW5kX0luUGl4ZWwobUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9PdXRQaXhlbChtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9TY3JhdGNoUGl4ZWwobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uKTsKICAgICB9CiAKICAgICBwcml2YXRlIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNvdXJjZSkgewpAQCAtMjI5LDQgKzQwMywzMCBAQAogICAgICAgICBzb3VyY2UucmVjeWNsZSgpOwogICAgICAgICByZXR1cm4gYjsKICAgICB9CisKKyAgICAvLyBidXR0b24gaG9vaworICAgIHB1YmxpYyB2b2lkIGJlbmNobWFyayhWaWV3IHYpIHsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiQmVuY2htYXJraW5nIik7CisgICAgICAgIGludCBvbGRSYWRpdXMgPSBtUmFkaXVzOworICAgICAgICBtUmFkaXVzID0gTUFYX1JBRElVUzsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXJCZW5jaG1hcmsoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworCisgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKworICAgICAgICBsb25nIGphdmFUaW1lID0gamF2YUZpbHRlcigpOworCisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUlM6ICIgKyB0ICsgIiBtcyAgSmF2YTogIiArIGphdmFUaW1lICsgIiBtcyIpOworCisgICAgICAgIG1SYWRpdXMgPSBvbGRSYWRpdXM7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1NjcmlwdENfVGhyZXNob2xkLmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9TY3JpcHRDX1RocmVzaG9sZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzYzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9TY3JpcHRDX1RocmVzaG9sZC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFNjcmlwdENfVGhyZXNob2xkIGV4dGVuZHMgU2NyaXB0QyB7CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgIFNjcmlwdENfVGhyZXNob2xkKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IGlkLCBib29sZWFuIGlzUm9vdCkgeworICAgICAgICBzdXBlcihycywgcmVzb3VyY2VzLCBpZCwgaXNSb290KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9oZWlnaHQgPSAwOworICAgIHByaXZhdGUgaW50IG1FeHBvcnRWYXJfaGVpZ2h0OworICAgIHB1YmxpYyB2b2lkIHNldF9oZWlnaHQoaW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9oZWlnaHQgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9oZWlnaHQsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0X2hlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfaGVpZ2h0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X3dpZHRoID0gMTsKKyAgICBwcml2YXRlIGludCBtRXhwb3J0VmFyX3dpZHRoOworICAgIHB1YmxpYyB2b2lkIHNldF93aWR0aChpbnQgdikgeworICAgICAgICBtRXhwb3J0VmFyX3dpZHRoID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfd2lkdGgsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0X3dpZHRoKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl93aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9yYWRpdXMgPSAyOworICAgIHByaXZhdGUgaW50IG1FeHBvcnRWYXJfcmFkaXVzOworICAgIHB1YmxpYyB2b2lkIHNldF9yYWRpdXMoaW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9yYWRpdXMgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9yYWRpdXMsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0X3JhZGl1cygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfcmFkaXVzOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X0luUGl4ZWwgPSAzOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtRXhwb3J0VmFyX0luUGl4ZWw7CisgICAgcHVibGljIHZvaWQgYmluZF9JblBpeGVsKEFsbG9jYXRpb24gdikgeworICAgICAgICBtRXhwb3J0VmFyX0luUGl4ZWwgPSB2OworICAgICAgICBpZih2ID09IG51bGwpIGJpbmRBbGxvY2F0aW9uKG51bGwsIG1FeHBvcnRWYXJJZHhfSW5QaXhlbCk7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odiwgbUV4cG9ydFZhcklkeF9JblBpeGVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfSW5QaXhlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfSW5QaXhlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9PdXRQaXhlbCA9IDQ7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfT3V0UGl4ZWw7CisgICAgcHVibGljIHZvaWQgYmluZF9PdXRQaXhlbChBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9PdXRQaXhlbCA9IHY7CisgICAgICAgIGlmKHYgPT0gbnVsbCkgYmluZEFsbG9jYXRpb24obnVsbCwgbUV4cG9ydFZhcklkeF9PdXRQaXhlbCk7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odiwgbUV4cG9ydFZhcklkeF9PdXRQaXhlbCk7CisgICAgfQorCisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0X091dFBpeGVsKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9PdXRQaXhlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9TY3JhdGNoUGl4ZWwgPSA1OworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtRXhwb3J0VmFyX1NjcmF0Y2hQaXhlbDsKKyAgICBwdWJsaWMgdm9pZCBiaW5kX1NjcmF0Y2hQaXhlbChBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9TY3JhdGNoUGl4ZWwgPSB2OworICAgICAgICBpZih2ID09IG51bGwpIGJpbmRBbGxvY2F0aW9uKG51bGwsIG1FeHBvcnRWYXJJZHhfU2NyYXRjaFBpeGVsKTsKKyAgICAgICAgZWxzZSBiaW5kQWxsb2NhdGlvbih2LCBtRXhwb3J0VmFySWR4X1NjcmF0Y2hQaXhlbCk7CisgICAgfQorCisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0X1NjcmF0Y2hQaXhlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfU2NyYXRjaFBpeGVsOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2luQmxhY2sgPSA2OworICAgIHByaXZhdGUgZmxvYXQgbUV4cG9ydFZhcl9pbkJsYWNrOworICAgIHB1YmxpYyB2b2lkIHNldF9pbkJsYWNrKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9pbkJsYWNrID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfaW5CbGFjaywgdik7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldF9pbkJsYWNrKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9pbkJsYWNrOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X291dEJsYWNrID0gNzsKKyAgICBwcml2YXRlIGZsb2F0IG1FeHBvcnRWYXJfb3V0QmxhY2s7CisgICAgcHVibGljIHZvaWQgc2V0X291dEJsYWNrKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9vdXRCbGFjayA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X291dEJsYWNrLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X291dEJsYWNrKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9vdXRCbGFjazsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9pbldoaXRlID0gODsKKyAgICBwcml2YXRlIGZsb2F0IG1FeHBvcnRWYXJfaW5XaGl0ZTsKKyAgICBwdWJsaWMgdm9pZCBzZXRfaW5XaGl0ZShmbG9hdCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfaW5XaGl0ZSA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2luV2hpdGUsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRfaW5XaGl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfaW5XaGl0ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9vdXRXaGl0ZSA9IDk7CisgICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX291dFdoaXRlOworICAgIHB1YmxpYyB2b2lkIHNldF9vdXRXaGl0ZShmbG9hdCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfb3V0V2hpdGUgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9vdXRXaGl0ZSwgdik7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldF9vdXRXaGl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfb3V0V2hpdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ2FtbWEgPSAxMDsKKyAgICBwcml2YXRlIGZsb2F0IG1FeHBvcnRWYXJfZ2FtbWE7CisgICAgcHVibGljIHZvaWQgc2V0X2dhbW1hKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nYW1tYSA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dhbW1hLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X2dhbW1hKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nYW1tYTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9zYXR1cmF0aW9uID0gMTE7CisgICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX3NhdHVyYXRpb247CisgICAgcHVibGljIHZvaWQgc2V0X3NhdHVyYXRpb24oZmxvYXQgdikgeworICAgICAgICBtRXhwb3J0VmFyX3NhdHVyYXRpb24gPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9zYXR1cmF0aW9uLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X3NhdHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX3NhdHVyYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRGdW5jSWR4X2ZpbHRlciA9IDA7CisgICAgcHVibGljIHZvaWQgaW52b2tlX2ZpbHRlcigpIHsKKyAgICAgICAgaW52b2tlKG1FeHBvcnRGdW5jSWR4X2ZpbHRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRGdW5jSWR4X2ZpbHRlckJlbmNobWFyayA9IDE7CisgICAgcHVibGljIHZvaWQgaW52b2tlX2ZpbHRlckJlbmNobWFyaygpIHsKKyAgICAgICAgaW52b2tlKG1FeHBvcnRGdW5jSWR4X2ZpbHRlckJlbmNobWFyayk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBsaWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCnJlbmFtZSB0byBsaWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawppbmRleCA5ZTZlZDdlLi44YmVjNmQ2IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCkBAIC0yMiw2ICsyMiw2IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CiAKLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaWxtCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gTW9kZWxWaWV3ZXIKIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbApyZW5hbWUgdG8gbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYTVjZThhMS4uZWJiZTc0MyAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMSw4ICsxLDggQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZpbG0iPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJGaWxtIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRmlsbSIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tb2RlbHZpZXdlciI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1vZGVsVmlld2VyIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTW9kZWxWaWV3ZXIiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlci5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTk0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlci5ycwpAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX3R5cGVzLnJzaCIKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX21hdGgucnNoIgorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKK3JzX21lc2ggZ1Rlc3RNZXNoOworCityc19wcm9ncmFtX3N0b3JlIGdQRlNCYWNrZ3JvdW5kOworCitmbG9hdCBnUm90YXRlOworCityc19mb250IGdJdGFsaWM7Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUFZCYWNrZ3JvdW5kLCBnUEZCYWNrZ3JvdW5kLCBnVEdyaWQsIGdUZXN0TWVzaCwgZ1BGU0JhY2tncm91bmQsIGdSb3RhdGUsIGdJdGFsaWMsIGdUZXh0QWxsb2MpCisKK2Zsb2F0IGdEVDsKK2ludDY0X3QgZ0xhc3RUaW1lOworCit2b2lkIGluaXQoKSB7CisgICAgZ1JvdGF0ZSA9IDAuMGY7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhUcmFuc2xhdGUoJm1hdHJpeCwgMC4wZiwgLTAuM2YsIDEuMmYpOworICAgIHJzTWF0cml4U2NhbGUoJm1hdHJpeCwgMC4yZiwgMC4yZiwgMC4yZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgLTI1LjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnUm90YXRlLCAwLjBmLCAxLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnRHJhd1NpbXBsZU1lc2goZ1Rlc3RNZXNoKTsKKworICAgIGNvbG9yKDAuM2YsIDAuM2YsIDAuM2YsIDEuMGYpOworICAgIHJzZ0RyYXdUZXh0KCJSZW5kZXJzY3JpcHQgbW9kZWwgdGVzdCIsIDMwLCA2OTUpOworCisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgcnNnRHJhd1RleHQoZ1RleHRBbGxvYywgMzAsIDczMCk7CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyX2JjLmJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGU3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NSUKcmVuYW1lIGZyb20gbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCnJlbmFtZSB0byBsaWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyLmphdmEKaW5kZXggNmU5OTgxNi4uNzQ5MTc0NCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXIuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKIAogaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwpAQCAtMzcsMTggKzM3LDkgQEAKIAogaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOwogCi1wdWJsaWMgY2xhc3MgRmlsbSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKK3B1YmxpYyBjbGFzcyBNb2RlbFZpZXdlciBleHRlbmRzIEFjdGl2aXR5IHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwotCi0gICAgcHJpdmF0ZSBGaWxtVmlldyBtVmlldzsKLQotICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCi0KLQorICAgIHByaXZhdGUgTW9kZWxWaWV3ZXJWaWV3IG1WaWV3OwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewpAQCAtNTYsNyArNDcsNyBAQAogCiAgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCiAgICAgICAgIC8vIEFjdGl2aXR5Ci0gICAgICAgIG1WaWV3ID0gbmV3IEZpbG1WaWV3KHRoaXMpOworICAgICAgICBtVmlldyA9IG5ldyBNb2RlbFZpZXdlclZpZXcodGhpcyk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKICAgICB9CiAKQEAgLTc0LDE3ICs2NSw3IEBACiAgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwogICAgICAgICBzdXBlci5vblBhdXNlKCk7CiAgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLQotICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOwogICAgIH0KIAotCi0gICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChMT0dfRU5BQkxFRCkgewotICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDg1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBNb2RlbFZpZXdlclJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIE1vZGVsVmlld2VyUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIFNpbXBsZU1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19Nb2RlbHZpZXdlciBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoLShmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwUHJvamVjdGlvbk5vcm1hbGl6ZWQobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX01vZGVsdmlld2VyKG1SUywgbVJlcywgUi5yYXcubW9kZWx2aWV3ZXJfYmMsIHRydWUpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELlNJTVBMRV9NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNoID0gKFNpbXBsZU1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVGVzdE1lc2gobU1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiIsIDEwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBpbml0VGV4dEFsbG9jYXRpb24oKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyVmlldy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIGxpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEKcmVuYW1lIHRvIGxpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJWaWV3LmphdmEKaW5kZXggNWJjMjgxMS4uMDYxY2Y4ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyVmlldy5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07CitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOwogCiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM5LDE1ICszOSwxNSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiAKLXB1YmxpYyBjbGFzcyBGaWxtVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworcHVibGljIGNsYXNzIE1vZGVsVmlld2VyVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgewogCi0gICAgcHVibGljIEZpbG1WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgIHB1YmxpYyBNb2RlbFZpZXdlclZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKICAgICB9CiAKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEZpbG1SUyBtUmVuZGVyOworICAgIHByaXZhdGUgTW9kZWxWaWV3ZXJSUyBtUmVuZGVyOwogCiAKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CkBAIC01NSw3ICs1NSw3IEBACiAgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewogICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOwogICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGaWxtUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgTW9kZWxWaWV3ZXJSUygpOwogICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOwogICAgICAgICB9CiAgICAgfQpAQCAtODUsNyArODUsOCBAQAogICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgewogICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5zZXRGaWxtU3RyaXBQb3NpdGlvbigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkgLyA1KTsKKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTJhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBTY3JpcHRDX01vZGVsdmlld2VyIGV4dGVuZHMgU2NyaXB0QyB7CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgIFNjcmlwdENfTW9kZWx2aWV3ZXIoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgaWQsIGJvb2xlYW4gaXNSb290KSB7CisgICAgICAgIHN1cGVyKHJzLCByZXNvdXJjZXMsIGlkLCBpc1Jvb3QpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dQVkJhY2tncm91bmQgPSAwOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtRXhwb3J0VmFyX2dQVkJhY2tncm91bmQ7CisgICAgcHVibGljIHZvaWQgc2V0X2dQVkJhY2tncm91bmQoUHJvZ3JhbVZlcnRleCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dQVkJhY2tncm91bmQsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFByb2dyYW1WZXJ0ZXggZ2V0X2dQVkJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dQVkJhY2tncm91bmQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BGQmFja2dyb3VuZCA9IDE7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kOworICAgIHB1YmxpYyB2b2lkIHNldF9nUEZCYWNrZ3JvdW5kKFByb2dyYW1GcmFnbWVudCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1BGQmFja2dyb3VuZCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dQRkJhY2tncm91bmQsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFByb2dyYW1GcmFnbWVudCBnZXRfZ1BGQmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BGQmFja2dyb3VuZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nVEdyaWQgPSAyOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtRXhwb3J0VmFyX2dUR3JpZDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1RHcmlkKEFsbG9jYXRpb24gdikgeworICAgICAgICBtRXhwb3J0VmFyX2dUR3JpZCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dUR3JpZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RHcmlkKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nVEdyaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1Rlc3RNZXNoID0gMzsKKyAgICBwcml2YXRlIFNpbXBsZU1lc2ggbUV4cG9ydFZhcl9nVGVzdE1lc2g7CisgICAgcHVibGljIHZvaWQgc2V0X2dUZXN0TWVzaChTaW1wbGVNZXNoIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nVGVzdE1lc2ggPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nVGVzdE1lc2gsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFNpbXBsZU1lc2ggZ2V0X2dUZXN0TWVzaCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1Rlc3RNZXNoOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dQRlNCYWNrZ3JvdW5kID0gNDsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtRXhwb3J0VmFyX2dQRlNCYWNrZ3JvdW5kOworICAgIHB1YmxpYyB2b2lkIHNldF9nUEZTQmFja2dyb3VuZChQcm9ncmFtU3RvcmUgdikgeworICAgICAgICBtRXhwb3J0VmFyX2dQRlNCYWNrZ3JvdW5kID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BGU0JhY2tncm91bmQsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFByb2dyYW1TdG9yZSBnZXRfZ1BGU0JhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dQRlNCYWNrZ3JvdW5kOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dSb3RhdGUgPSA1OworICAgIHByaXZhdGUgZmxvYXQgbUV4cG9ydFZhcl9nUm90YXRlOworICAgIHB1YmxpYyB2b2lkIHNldF9nUm90YXRlKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nUm90YXRlID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1JvdGF0ZSwgdik7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldF9nUm90YXRlKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nUm90YXRlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dJdGFsaWMgPSA2OworICAgIHByaXZhdGUgRm9udCBtRXhwb3J0VmFyX2dJdGFsaWM7CisgICAgcHVibGljIHZvaWQgc2V0X2dJdGFsaWMoRm9udCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ0l0YWxpYyA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dJdGFsaWMsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIEZvbnQgZ2V0X2dJdGFsaWMoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dJdGFsaWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYyA9IDc7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1RleHRBbGxvYyhBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nVGV4dEFsbG9jID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYywgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RleHRBbGxvYygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9ycy5zcGVjIGIvbGlicy9ycy9ycy5zcGVjCmluZGV4IGNiOTkzN2MuLjBhMTY4ZjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnMuc3BlYworKysgYi9saWJzL3JzL3JzLnNwZWMKQEAgLTEsMTEgKzEsMTQgQEAKIAorQ29udGV4dEZpbmlzaCB7CisJaGFuZGNvZGVBcGkKKwl9CiAKIENvbnRleHRCaW5kUm9vdFNjcmlwdCB7CiAJcGFyYW0gUnNTY3JpcHQgc2FtcGxlcgogCX0KIAotQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB7Ci0JcGFyYW0gUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSBwZ20KK0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIHsKKwlwYXJhbSBSc1Byb2dyYW1TdG9yZSBwZ20KIAl9CiAKIENvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IHsKQEAgLTIwLDYgKzIzLDEwIEBACiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHBnbQogCX0KIAorQ29udGV4dEJpbmRGb250IHsKKwlwYXJhbSBSc0ZvbnQgcGdtCisJfQorCiBDb250ZXh0UGF1c2UgewogCX0KIApAQCAtMjQ4LDEzICsyNTUsNiBAQAogU2NyaXB0Q0JlZ2luIHsKIAl9CiAKLVNjcmlwdFNldENsZWFyQ29sb3IgewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSBmbG9hdCByCi0JcGFyYW0gZmxvYXQgZwotCXBhcmFtIGZsb2F0IGIKLQlwYXJhbSBmbG9hdCBhCi0JfQogCiBTY3JpcHRTZXRUaW1lWm9uZSB7CiAJcGFyYW0gUnNTY3JpcHQgcwpAQCAtMjYyLDM3ICsyNjIsNDEgQEAKIAlwYXJhbSB1aW50MzJfdCBsZW5ndGgKIAl9CiAKLVNjcmlwdFNldENsZWFyRGVwdGggewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSBmbG9hdCBkZXB0aAotCX0KLQotU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gdWludDMyX3Qgc3RlbmNpbAotCX0KLQotU2NyaXB0U2V0VHlwZSB7Ci0JcGFyYW0gUnNUeXBlIHR5cGUKLQlwYXJhbSB1aW50MzJfdCBzbG90Ci0JcGFyYW0gYm9vbCBpc1dyaXRhYmxlCi0JcGFyYW0gY29uc3QgY2hhciAqIG5hbWUKLQl9Ci0KLVNjcmlwdFNldEludm9rZSB7Ci0JcGFyYW0gY29uc3QgY2hhciAqIG5hbWUKLQlwYXJhbSB1aW50MzJfdCBzbG90Ci0JfQogCiBTY3JpcHRJbnZva2UgewogCXBhcmFtIFJzU2NyaXB0IHMKIAlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCi1TY3JpcHRTZXRSb290IHsKLQlwYXJhbSBib29sIGlzUm9vdAorU2NyaXB0SW52b2tlViB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHVpbnQzMl90IGRhdGFMZW4KKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKIAl9CiAKK1NjcmlwdFNldFZhckkgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gaW50IHZhbHVlCisJfQorCitTY3JpcHRTZXRWYXJGIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGZsb2F0IHZhbHVlCisJfQorCitTY3JpcHRTZXRWYXJWIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gdWludDMyX3QgZGF0YUxlbgorCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQorCX0KIAogCiBTY3JpcHRDU2V0U2NyaXB0IHsKQEAgLTMwOCw0NyArMzEyLDM4IEBACiAJcmV0IFJzU2NyaXB0CiAJfQogCi1TY3JpcHRDU2V0RGVmaW5lRiB7Ci0gICAgcGFyYW0gY29uc3QgY2hhciogbmFtZQotICAgIHBhcmFtIGZsb2F0IHZhbHVlCi0gICAgfQogCi1TY3JpcHRDU2V0RGVmaW5lSTMyIHsKLSAgICBwYXJhbSBjb25zdCBjaGFyKiBuYW1lCi0gICAgcGFyYW0gaW50MzJfdCB2YWx1ZQotICAgIH0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiB7CitQcm9ncmFtU3RvcmVCZWdpbiB7CiAJcGFyYW0gUnNFbGVtZW50IGluCiAJcGFyYW0gUnNFbGVtZW50IG91dAogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2sgeworUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIHsKIAlwYXJhbSBib29sIHIKIAlwYXJhbSBib29sIGcKIAlwYXJhbSBib29sIGIKIAlwYXJhbSBib29sIGEKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIHsKK1Byb2dyYW1TdG9yZUJsZW5kRnVuYyB7CiAJcGFyYW0gUnNCbGVuZFNyY0Z1bmMgc3JjRnVuYwogCXBhcmFtIFJzQmxlbmREc3RGdW5jIGRlc3RGdW5jCiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayB7CitQcm9ncmFtU3RvcmVEZXB0aE1hc2sgewogCXBhcmFtIGJvb2wgZW5hYmxlCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIHsKK1Byb2dyYW1TdG9yZURpdGhlciB7CiAJcGFyYW0gYm9vbCBlbmFibGUKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMgeworUHJvZ3JhbVN0b3JlRGVwdGhGdW5jIHsKIAlwYXJhbSBSc0RlcHRoRnVuYyBmdW5jCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIHsKLQlyZXQgUnNQcm9ncmFtRnJhZ21lbnRTdG9yZQorUHJvZ3JhbVN0b3JlQ3JlYXRlIHsKKwlyZXQgUnNQcm9ncmFtU3RvcmUKIAl9CiAKIFByb2dyYW1SYXN0ZXJDcmVhdGUgewpAQCAtNDQ3LDEyICs0NDIsNDEgQEAKIAlwYXJhbSBmbG9hdCBiCiAJfQogCitGaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIHsKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHNpemVfdCBsZW4KKwlyZXQgUnNGaWxlCisJfQorCiBGaWxlT3BlbiB7CiAJcmV0IFJzRmlsZQogCXBhcmFtIGNvbnN0IGNoYXIgKm5hbWUKIAlwYXJhbSBzaXplX3QgbGVuCiAJfQogCitGaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBpbnQzMl90ICogbnVtRW50cmllcworCXBhcmFtIFJzRmlsZSBmaWxlCisJfQorCitGaWxlQTNER2V0SW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBSc0ZpbGVJbmRleEVudHJ5ICogZmlsZUVudHJpZXMKKwlwYXJhbSB1aW50MzJfdCBudW1FbnRyaWVzCisJcGFyYW0gUnNGaWxlIGZpbGVBM0QKKwl9CisKK0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggeworCXBhcmFtIHVpbnQzMl90IGluZGV4CisJcGFyYW0gUnNGaWxlIGZpbGUKKwlyZXQgUnNPYmplY3RCYXNlCisJfQorCitGb250Q3JlYXRlRnJvbUZpbGUgeworCXBhcmFtIGNvbnN0IGNoYXIgKm5hbWUKKwlwYXJhbSB1aW50MzJfdCBmb250U2l6ZQorCXBhcmFtIHVpbnQzMl90IGRwaQorCXJldCBSc0ZvbnQKKwl9CiAKIFNpbXBsZU1lc2hDcmVhdGUgewogCXJldCBSc1NpbXBsZU1lc2gKQEAgLTQ4MCwzICs1MDQsMTMgQEAKIAlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCitBbmltYXRpb25DcmVhdGUgeworCXBhcmFtIGNvbnN0IGZsb2F0ICppblZhbHVlcworCXBhcmFtIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMKKwlwYXJhbSB1aW50MzJfdCB2YWx1ZUNvdW50CisJcGFyYW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycAorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwcmUKKwlwYXJhbSBSc0FuaW1hdGlvbkVkZ2UgcG9zdAorCXJldCBSc0FuaW1hdGlvbgorCX0KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwIGIvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCmluZGV4IDBkMzFmYWMuLmI0ZWMyNTAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBZGFwdGVyLmNwcAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKQEAgLTE1LDcgKzE1LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC03MCw2ICs3NCwxNiBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjFEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMUQgKkFkYXB0ZXIxRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKQEAgLTE4NSw2ICsxOTksMTUgQEAKICAgICAgICAgICAgbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCit2b2lkIEFkYXB0ZXIyRDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworQWRhcHRlcjJEICpBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuaCBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKaW5kZXggY2IyODcyZS4uNDQ5ZTdhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuaAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5oCkBAIC01MCw2ICs1MCwxMCBAQAogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMUQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWTsKQEAgLTgyLDYgKzg2LDEwIEBACiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ7IH0KKyAgICBzdGF0aWMgQWRhcHRlcjJEICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CiAgICAgdWludDMyX3QgbVo7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKaW5kZXggNGU4Mjc4ZC4uZDlkMGJjNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtMTMsMTIgKzEzLDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0xNjcsOSArMTczLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAwLCBmb3JtYXQsIHR5cGUsIHB0cik7CiAgICAgfQogICAgIGlmIChtVGV4dHVyZUdlbk1pcG1hcCkgeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgICAgIGdsR2VuZXJhdGVNaXBtYXAoR0xfVEVYVFVSRV8yRCk7CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfQogCisgICAgcnNjLT5jaGVja0Vycm9yKCJBbGxvY2F0aW9uOjp1cGxvYWRUb1RleHR1cmUiKTsKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjpkZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QoY29uc3QgQ29udGV4dCAqcnNjKQpAQCAtMjAxLDYgKzIxMCw3IEBACiAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUJ1ZmZlcklEKTsKICAgICBnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCksIGdldFB0cigpLCBHTF9EWU5BTUlDX0RSQVcpOwogICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIDApOworICAgIHJzYy0+Y2hlY2tFcnJvcigiQWxsb2NhdGlvbjo6dXBsb2FkVG9CdWZmZXJPYmplY3QiKTsKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjp1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpCkBAIC0yODQsNyArMjk0LDcgQEAKIAogdm9pZCBBbGxvY2F0aW9uOjphZGRQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKQogewotICAgIG1Ub0RpcnR5TGlzdC5hZGQocCk7CisgICAgbVRvRGlydHlMaXN0LnB1c2gocCk7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6cmVtb3ZlUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKQEAgLTMxNiw2ICszMjYsNjAgQEAKIAogfQogCit2b2lkIEFsbG9jYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIEZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gc2VyaWFsaXplIGlzIHRoZSB0eXBlIG9iamVjdCBzaW5jZSBpdCB3aWxsIGJlIG5lZWRlZAorICAgIC8vIHRvIGluaXRpYWxpemUgdGhlIGNsYXNzCisgICAgbVR5cGUtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgdWludDMyX3QgZGF0YVNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgLy8gV3JpdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3RvcmluZworICAgIHN0cmVhbS0+YWRkVTMyKGRhdGFTaXplKTsKKyAgICAvLyBOb3cgd3JpdGUgdGhlIGRhdGEKKyAgICBzdHJlYW0tPmFkZEJ5dGVBcnJheShtUHRyLCBkYXRhU2l6ZSk7Cit9CisKK0FsbG9jYXRpb24gKkFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OKSB7CisgICAgICAgIExPR0UoImFsbG9jYXRpb24gbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBUeXBlICp0eXBlID0gVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgaWYoIXR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHR5cGUtPmNvbXB1dGUoKTsKKworICAgIC8vIE51bWJlciBvZiBieXRlcyB3ZSB3cm90ZSBvdXQgZm9yIHRoaXMgYWxsb2NhdGlvbgorICAgIHVpbnQzMl90IGRhdGFTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoZGF0YVNpemUgIT0gdHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlYWQgYWxsb2NhdGlvbiBiZWNhdXNlIG51bWJ5dGVzIHdyaXR0ZW4gaXMgbm90IHRoZSBzYW1lIGxvYWRlZCB0eXBlIHdhbnRzXG4iKTsKKyAgICAgICAgZGVsZXRlIHR5cGU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCB0eXBlKTsKKyAgICBhbGxvYy0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CisKKyAgICAvLyBSZWFkIGluIGFsbCBvZiBvdXIgYWxsb2NhdGlvbiBkYXRhCisgICAgc3RyZWFtLT5sb2FkQnl0ZUFycmF5KGFsbG9jLT5nZXRQdHIoKSwgZGF0YVNpemUpOworCisgICAgcmV0dXJuIGFsbG9jOworfQorCiB2b2lkIEFsbG9jYXRpb246OnNlbmREaXJ0eSgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtVG9EaXJ0eUxpc3Quc2l6ZSgpOyBjdCsrKSB7CkBAIC00OTUsNyArNTU5LDcgQEAKICAgICBpZiAoc3JjR0xUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYKICAgICAgICAgc3JjR0xGbXQgPT0gR0xfUkdCICYmCiAgICAgICAgIGRzdEdMVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgotICAgICAgICBkc3RHTFR5cGUgPT0gR0xfUkdCKSB7CisgICAgICAgIGRzdEdMRm10ID09IEdMX1JHQikgewogCiAgICAgICAgIHJldHVybiBlbGVtZW50Q29udmVydGVyXzg4OF90b181NjU7CiAgICAgfQpAQCAtNTAzLDE1ICs1NjcsMjEgQEAKICAgICBpZiAoc3JjR0xUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYKICAgICAgICAgc3JjR0xGbXQgPT0gR0xfUkdCQSAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODg4X3RvXzU2NTsKICAgICB9CiAKICAgICBMT0dFKCJwaWNrQ29udmVydGVyLCB1bnN1cG9ydGVkIGNvbWJvLCBzcmMgJXAsICBkc3QgJXAiLCBzcmMsIGRzdCk7CisgICAgTE9HRSgicGlja0NvbnZlcnRlciwgc3JjR0xUeXBlID0gJXgsICBzcmNHTEZtdCA9ICV4Iiwgc3JjR0xUeXBlLCBzcmNHTEZtdCk7CisgICAgTE9HRSgicGlja0NvbnZlcnRlciwgZHN0R0xUeXBlID0gJXgsICBkc3RHTEZtdCA9ICV4IiwgZHN0R0xUeXBlLCBkc3RHTEZtdCk7CisgICAgc3JjLT5kdW1wTE9HVigiU1JDICIpOworICAgIGRzdC0+ZHVtcExPR1YoIkRTVCAiKTsKICAgICByZXR1cm4gMDsKIH0KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKIFJzQWxsb2NhdGlvbiByc2lfQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihDb250ZXh0ICpyc2MsIFJzVHlwZSB2dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpibXAsIHZvaWQgKmNhbGxiYWNrRGF0YSwgUnNCaXRtYXBDYWxsYmFja190IGNhbGxiYWNrKQogewpAQCAtNjEzLDYgKzY4Myw3IEBACiAgICAgYS0+cmVhZChkYXRhKTsKIH0KIAorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaAppbmRleCA1MTZmOGI3Li44MjczMTY1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKQEAgLTcyLDkgKzcyLDE1IEBACiAgICAgdm9pZCByZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICopOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjsgfQorICAgIHN0YXRpYyBBbGxvY2F0aW9uICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgdm9pZCB1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpOwogCisgICAgYm9vbCBnZXRJc1RleHR1cmUoKSBjb25zdCB7cmV0dXJuIG1Jc1RleHR1cmU7fQorICAgIGJvb2wgZ2V0SXNCdWZmZXJPYmplY3QoKSBjb25zdCB7cmV0dXJuIG1Jc1ZlcnRleEJ1ZmZlcjt9CisKIHByb3RlY3RlZDoKICAgICB2b2lkIHNlbmREaXJ0eSgpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK3ZvaWQgQW5pbWF0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBbmltYXRpb24gKkFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKK0FuaW1hdGlvbjo6QW5pbWF0aW9uKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworCisgICAgbVZhbHVlc0lucHV0ID0gTlVMTDsKKyAgICBtVmFsdWVzT3V0cHV0ID0gTlVMTDsKKyAgICBtVmFsdWVDb3VudCA9IDA7CisgICAgbUludGVycG9sYXRpb24gPSBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQOworICAgIG1FZGdlUHJlID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1FZGdlUG9zdCA9IFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRDsKKyAgICBtSW5wdXRNaW4gPSAwOworICAgIG1JbnB1dE1heCA9IDA7Cit9CisKK0FuaW1hdGlvbiAqIEFuaW1hdGlvbjo6Y3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICBpZiAodmFsdWVDb3VudCA8IDIpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJBbmltYXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIDIgdmFsdWVzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQW5pbWF0aW9uICphID0gbmV3IEFuaW1hdGlvbihyc2MpOworICAgIGlmICghYSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbG9hdCAqdmluID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmbG9hdCAqdm91dCA9IChmbG9hdCAqKW1hbGxvYyh2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bVZhbHVlc0lucHV0ID0gdmluOworICAgIGEtPm1WYWx1ZXNPdXRwdXQgPSB2b3V0OworICAgIGlmIChhLT5tVmFsdWVzSW5wdXQgPT0gTlVMTCB8fCBhLT5tVmFsdWVzT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGE7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGEtPm1FZGdlUHJlID0gcHJlOworICAgIGEtPm1FZGdlUG9zdCA9IHBvc3Q7CisgICAgYS0+bUludGVycG9sYXRpb24gPSBpbnRlcnA7CisgICAgYS0+bVZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OworCisgICAgbWVtY3B5KHZpbiwgaW5WYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkodm91dCwgb3V0VmFsdWVzLCB2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bUlucHV0TWluID0gaW5WYWx1ZXNbMF07CisgICAgYS0+bUlucHV0TWF4ID0gaW5WYWx1ZXNbMF07CisKKyAgICBib29sIG5lZWRTb3J0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKGEtPm1JbnB1dE1pbiA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1pbiA9IHZpbltjdF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEtPm1JbnB1dE1heCA8IHZpbltjdF0pIHsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1heCA9IHZpbltjdF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkU29ydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGlmICh2aW5bY3QtMV0gPiB2aW5bY3RdKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IHZpbltjdC0xXTsKKyAgICAgICAgICAgICAgICB2aW5bY3QtMV0gPSB2aW5bY3RdOworICAgICAgICAgICAgICAgIHZpbltjdF0gPSB0OworICAgICAgICAgICAgICAgIHQgPSB2b3V0W2N0LTFdOworICAgICAgICAgICAgICAgIHZvdXRbY3QtMV0gPSB2b3V0W2N0XTsKKyAgICAgICAgICAgICAgICB2b3V0W2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VkKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYTsKK30KKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0FuaW1hdGlvbiByc2lfQW5pbWF0aW9uQ3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlICVpICVpICVpICVpIiwgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKKyAgICBBbmltYXRpb24gKmEgPSBOVUxMOy8vQW5pbWF0aW9uOjpjcmVhdGUocnNjLCBpblZhbHVlcywgb3V0VmFsdWVzLCB2YWx1ZUNvdW50LCBpbnRlcnAsIHByZSwgcG9zdCk7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBhLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiAoUnNBbmltYXRpb24pYTsKK30KKworCit9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uaCBiL2xpYnMvcnMvcnNBbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQU5JTUFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19BTklNQVRJT05fSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisKK2NsYXNzIEFuaW1hdGlvbiA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkFuaW1hdGlvbigpOworCisgICAgc3RhdGljIEFuaW1hdGlvbiAqIGNyZWF0ZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LCBSc0FuaW1hdGlvbkludGVycG9sYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCk7CisKKyAgICBmbG9hdCBldmFsKGZsb2F0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjsgfQorICAgIHN0YXRpYyBBbmltYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9uKENvbnRleHQgKnJzYyk7CisKKworCisgICAgZmxvYXQgZXZhbEluUmFuZ2UoZmxvYXQpIGNvbnN0OworCisKKworICAgIGNvbnN0IGZsb2F0ICptVmFsdWVzSW5wdXQ7CisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNPdXRwdXQ7CisgICAgdWludDMyX3QgbVZhbHVlQ291bnQ7CisgICAgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIG1JbnRlcnBvbGF0aW9uOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVByZTsKKyAgICBSc0FuaW1hdGlvbkVkZ2UgbUVkZ2VQb3N0OworCisgICAgLy8gZGVyaXZlZAorICAgIGZsb2F0IG1JbnB1dE1pbjsKKyAgICBmbG9hdCBtSW5wdXRNYXg7Cit9OworCisKKworCit9Cit9CisjZW5kaWYgLy9BTkRST0lEX1NUUlVDVFVSRURfRUxFTUVOVF9ICisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKaW5kZXggMTVhNTZmNy4uOGU1MDlhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJyc0NvbXBvbmVudC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTE0OCw2ICsxNTIsMTAgQEAKICAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfNjQ6CiAgICAgICAgIG1UeXBlQml0cyA9IDY0OwogICAgICAgICBicmVhazsKKworICAgIGNhc2UgUlNfVFlQRV9CT09MRUFOOgorICAgICAgICBtVHlwZUJpdHMgPSA4OworICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBtQml0cyA9IG1UeXBlQml0cyAqIG1WZWN0b3JTaXplOwpAQCAtMTg4LDgyICsxOTYsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAiZmxvYXQiLAotICAgICJkb3VibGUiLAotICAgICJjaGFyIiwKLSAgICAic2hvcnQiLAotICAgICJpbnQiLAotICAgIDAsLy8iUzY0IiwKLSAgICAiY2hhciIsLy9VOCIsCi0gICAgInNob3J0IiwvL1UxNiIsCi0gICAgImludCIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBnQ1ZlY1R5cGVTdHJpbmdzW10gPSB7Ci0gICAgMCwKLSAgICAwLC8vIkYxNiIsCi0gICAgInZlY0YzMiIsCi0gICAgInZlY0Y2NCIsCi0gICAgInZlY0k4IiwKLSAgICAidmVjSTE2IiwKLSAgICAidmVjSTMyIiwKLSAgICAwLC8vIlM2NCIsCi0gICAgInZlY1U4IiwvL1U4IiwKLSAgICAidmVjVTE2IiwvL1UxNiIsCi0gICAgInZlY1UzMiIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotU3RyaW5nOCBDb21wb25lbnQ6OmdldENUeXBlKCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKG1WZWN0b3JTaXplID09IDEpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoZ0NUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIH0KLQotICAgIC8vIFl1Y2ssIGFjYyBXQVIKLSAgICAvLyBBcHBlYXJzIHRvIGhhdmUgcHJvYmxlbXMgcGFja2luZyBjaGFycwotICAgIGlmIChtVmVjdG9yU2l6ZSA9PSA0ICYmIG1UeXBlID09IFJTX1RZUEVfVU5TSUdORURfOCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiaW50Iik7Ci0gICAgfQotCi0KLSAgICBTdHJpbmc4IHMoZ0NWZWNUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIHNwcmludGYoYnVmLCAiXyVpX3QiLCBtVmVjdG9yU2l6ZSk7Ci0gICAgcy5hcHBlbmQoYnVmKTsKLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBDb21wb25lbnQ6OmdldEdMU0xUeXBlKCkgY29uc3QKIHsKICAgICBpZiAobVR5cGUgPT0gUlNfVFlQRV9TSUdORURfMzIpIHsKQEAgLTI5OCw2ICsyMzAsNyBAQAogICAgICJVMTYiLAogICAgICJVMzIiLAogICAgICJVNjQiLAorICAgICJCT09MRUFOIiwKICAgICAiVVBfNTY1IiwKICAgICAiVVBfNTU1MSIsCiAgICAgIlVQXzQ0NDQiLApAQCAtMzM0LDQgKzI2NywyNSBAQAogICAgICAgICAgcHJlZml4LCBnVHlwZVN0cmluZ3NbbVR5cGVdLCBnS2luZFN0cmluZ3NbbUtpbmRdLCBtVmVjdG9yU2l6ZSwgbUJpdHMpOwogfQogCit2b2lkIENvbXBvbmVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1UeXBlKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1LaW5kKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtTm9ybWFsaXplZCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVMzIobVZlY3RvclNpemUpOworfQorCit2b2lkIENvbXBvbmVudDo6bG9hZEZyb21TdHJlYW0oSVN0cmVhbSAqc3RyZWFtKQoreworICAgIG1UeXBlID0gKFJzRGF0YVR5cGUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtS2luZCA9IChSc0RhdGFLaW5kKXN0cmVhbS0+bG9hZFU4KCk7CisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtTm9ybWFsaXplZCA9IHRlbXAgIT0gMDsKKyAgICBtVmVjdG9yU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgc2V0KG1UeXBlLCBtS2luZCwgbU5vcm1hbGl6ZWQsIG1WZWN0b3JTaXplKTsKK30KKworCisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5oIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCmluZGV4IDcxZGUzMjQuLjE1ZmQ1ZGQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuaAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogICAgIHVpbnQzMl90IGdldEdMVHlwZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEdMRm9ybWF0KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDVHlwZSgpIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUoKSBjb25zdDsKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CiAKQEAgLTQ4LDYgKzQ3LDEwIEBACiAgICAgYm9vbCBnZXRJc1NpZ25lZCgpIGNvbnN0IHtyZXR1cm4gbUlzU2lnbmVkO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKKyAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIC8gd3JpdGluZyB0aGlzIGNsYXNzIG91dAorICAgIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdm9pZCBsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgUnNEYXRhVHlwZSBtVHlwZTsKICAgICBSc0RhdGFLaW5kIG1LaW5kOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuY3BwIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCmluZGV4IGQ4YTlhOTkuLmQ4YzM4NjEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKQEAgLTEyNywxOSArMTI3LDIxIEBACiB9CiAKIAotdWludDMyX3QgQ29udGV4dDo6cnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpCit1aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzKQogewogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBmcmFnKG1GcmFnbWVudCk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiB2dHgobVZlcnRleCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gc3RvcmUobUZyYWdtZW50U3RvcmUpOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiByYXN0ZXIobVJhc3Rlcik7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBmb250KG1Gb250KTsKIAotICAgIHVpbnQzMl90IHJldCA9IHMtPnJ1bih0aGlzLCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMpOwogCiAgICAgbUZyYWdtZW50LnNldChmcmFnKTsKICAgICBtVmVydGV4LnNldCh2dHgpOwogICAgIG1GcmFnbWVudFN0b3JlLnNldChzdG9yZSk7CiAgICAgbVJhc3Rlci5zZXQocmFzdGVyKTsKKyAgICBtRm9udC5zZXQoZm9udCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTUzLDI5ICsxNTUsMTEgQEAKIAogdWludDMyX3QgQ29udGV4dDo6cnVuUm9vdFNjcmlwdCgpCiB7Ci0gICAgdGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7Ci0gICAgcnNBc3NlcnQobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0KTsKLSAgICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLQotICAgIGdsQ2xlYXJDb2xvcihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10pOwotICAgIGlmIChtVXNlRGVwdGgpIHsKLSAgICAgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgdGltZXJTZXQoUlNfVElNRVJfU0NSSVBUKTsKICAgICBtU3RhdGVGcmFnbWVudFN0b3JlLm1MYXN0LmNsZWFyKCk7Ci0gICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpLCAwKTsKKyAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCkpOwogCiAgICAgY2hlY2tFcnJvcigicnVuUm9vdFNjcmlwdCIpOwogICAgIGlmIChtRXJyb3IgIT0gUlNfRVJST1JfTk9ORSkgewpAQCAtMzAwLDE0ICsyODQsMTYgQEAKICAgICAgfQogCiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewotICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0UmFzdGVyKE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXguaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0VmVydGV4KE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldEZyYWdtZW50KE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKE5VTEwpOworICAgICAgICAgcnNjLT5tU3RhdGVGb250LmluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+c2V0Rm9udChOVUxMKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4QXJyYXkuaW5pdChyc2MpOwogICAgICB9CiAKQEAgLTM0NiwxMSArMzMyLDEzIEBACiAgICAgICAgICByc2MtPm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudFN0b3JlLmNsZWFyKCk7CisgICAgICAgICByc2MtPm1Gb250LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1Sb290U2NyaXB0LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5kZWluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5kZWluaXQocnNjKTsKICAgICAgfQogICAgICBPYmplY3RCYXNlOjp6ZXJvQWxsVXNlclJlZihyc2MpOwogCkBAIC00ODYsMTQgKzQ3NCwxNCBAQAogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xEZXN0cm95U3VyZmFjZSIsIHJldCk7CiAKICAgICAgICAgbUVHTC5tU3VyZmFjZSA9IE5VTEw7Ci0gICAgICAgIG1FR0wubVdpZHRoID0gMDsKLSAgICAgICAgbUVHTC5tSGVpZ2h0ID0gMDsKICAgICAgICAgbVdpZHRoID0gMDsKICAgICAgICAgbUhlaWdodCA9IDA7CiAgICAgfQogCiAgICAgbVduZFN1cmZhY2UgPSBzdXI7CiAgICAgaWYgKG1XbmRTdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgbUhlaWdodCA9IGg7CiAgICAgICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgaWYgKCFtRUdMLm1Db250ZXh0KSB7CiAgICAgICAgICAgICBmaXJzdCA9IHRydWU7CkBAIC01MTEsMTUgKzQ5OSw3IEBACiAgICAgICAgIHJldCA9IGVnbE1ha2VDdXJyZW50KG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIG1FR0wubVN1cmZhY2UsIG1FR0wubUNvbnRleHQpOwogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldCk7CiAKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9IRUlHSFQsICZtRUdMLm1IZWlnaHQpOwotICAgICAgICBtV2lkdGggPSB3OwotICAgICAgICBtSGVpZ2h0ID0gaDsKLSAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcywgdywgaCk7Ci0KLSAgICAgICAgaWYgKChpbnQpbVdpZHRoICE9IG1FR0wubVdpZHRoIHx8IChpbnQpbUhlaWdodCAhPSBtRUdMLm1IZWlnaHQpIHsKLSAgICAgICAgICAgIExPR0UoIkVHTC9TdXJmYWNlIG1pc21hdGNoICBFR0wgKCVpIHggJWkpICBTRiAoJWkgeCAlaSkiLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0ZVZlcnRleC51cGRhdGVTaXplKHRoaXMpOwogCiAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgbUdMLm1WZXJzaW9uID0gZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7CkBAIC01ODMsNyArNTYzLDcgQEAKICAgICBtUm9vdFNjcmlwdC5zZXQocyk7CiB9CiAKLXZvaWQgQ29udGV4dDo6c2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzKQordm9pZCBDb250ZXh0OjpzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSAqcGZzKQogewogICAgIHJzQXNzZXJ0KG1Jc0dyYXBoaWNzQ29udGV4dCk7CiAgICAgaWYgKHBmcyA9PSBOVUxMKSB7CkBAIC02MjMsNiArNjAzLDE2IEBACiAgICAgfQogfQogCit2b2lkIENvbnRleHQ6OnNldEZvbnQoRm9udCAqZikKK3sKKyAgICByc0Fzc2VydChtSXNHcmFwaGljc0NvbnRleHQpOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgbUZvbnQuc2V0KG1TdGF0ZUZvbnQubURlZmF1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Gb250LnNldChmKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6YXNzaWduTmFtZShPYmplY3RCYXNlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKICAgICByc0Fzc2VydCghb2JqLT5nZXROYW1lKCkpOwpAQCAtNjQwLDMyICs2MzAsOSBAQAogICAgIH0KIH0KIAotT2JqZWN0QmFzZSAqIENvbnRleHQ6Omxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKLXsKLSAgICBmb3Ioc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtTmFtZXNbY3RdLT5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWVzW2N0XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDb250ZXh0OjphcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1OYW1lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgTkFNRURfIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1OYW1lc1tjdF0tPmdldE5hbWUoKSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbU5hbWVzW2N0XSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotfQotCiBib29sIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JJbml0KCkKIHsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtT2JqRGVzdHJveS5tTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKKyAgICBpZiAoIW1PYmpEZXN0cm95Lm1NdXRleC5pbml0KCkpIHsKICAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQkluaXQgbXV0ZXggaW5pdCBmYWlsdXJlIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02NzUsOSArNjQyLDggQEAKIHZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQlJ1bigpCiB7CiAgICAgaWYgKG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKKyAgICAgICAgaWYgKCFtT2JqRGVzdHJveS5tTXV0ZXgubG9jaygpKSB7CisgICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciBsb2NraW5nIGZvciBPT0JSdW4uIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjg2LDM1ICs2NTIsMjUgQEAKICAgICAgICAgfQogICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuY2xlYXIoKTsKICAgICAgICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9CisgICAgICAgIG1PYmpEZXN0cm95Lm1NdXRleC51bmxvY2soKTsKICAgICB9CiB9CiAKIHZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQkRlc3Ryb3koKQogewogICAgIHJzQXNzZXJ0KCFtT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkpOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU9iakRlc3Ryb3kubU11dGV4KTsKIH0KIAogdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95QWRkKE9iamVjdEJhc2UgKm9iaikKIHsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQlJ1bjogZXJyb3IgJWkgbG9ja2luZyBmb3IgT09CUnVuLiIsIHN0YXR1cyk7CisgICAgaWYgKCFtT2JqRGVzdHJveS5tTXV0ZXgubG9jaygpKSB7CisgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yIGxvY2tpbmcgZm9yIE9PQlJ1bi4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7CiAgICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmFkZChvYmopOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9CisgICAgbU9iakRlc3Ryb3kubU11dGV4LnVubG9jaygpOwogfQogCiB1aW50MzJfdCBDb250ZXh0OjpnZXRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpCkBAIC03OTksOCArNzU1LDcgQEAKICAgICBMT0dFKCJSUyBDb250ZXh0IGRlYnVnIik7CiAKICAgICBMT0dFKCIgRUdMIHZlciAlaSAlaSIsIG1FR0wubU1ham9yVmVyc2lvbiwgbUVHTC5tTWlub3JWZXJzaW9uKTsKLSAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICB3PSVpIGg9JWkgIERpc3BsYXk9JXAiLCBtRUdMLm1Db250ZXh0LAotICAgICAgICAgbUVHTC5tU3VyZmFjZSwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbUVHTC5tRGlzcGxheSk7CisgICAgTE9HRSgiIEVHTCBjb250ZXh0ICVwICBzdXJmYWNlICVwLCAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsIG1FR0wubVN1cmZhY2UsIG1FR0wubURpc3BsYXkpOwogICAgIExPR0UoIiBHTCB2ZW5kb3I6ICVzIiwgbUdMLm1WZW5kb3IpOwogICAgIExPR0UoIiBHTCByZW5kZXJlcjogJXMiLCBtR0wubVJlbmRlcmVyKTsKICAgICBMT0dFKCIgR0wgVmVyc2lvbjogJXMiLCBtR0wubVZlcnNpb24pOwpAQCAtODIyLDYgKzc3Nyw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfQ29udGV4dEZpbmlzaChDb250ZXh0ICpyc2MpCit7Cit9CiAKIHZvaWQgcnNpX0NvbnRleHRCaW5kUm9vdFNjcmlwdChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzKQogewpAQCAtODQxLDkgKzc5OSw5IEBACiAgICAgcy0+YmluZFRvQ29udGV4dCgmcnNjLT5tU3RhdGVTYW1wbGVyLCBzbG90KTsKIH0KIAotdm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgdnBmcykKK3ZvaWQgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtU3RvcmUgdnBmcykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50U3RvcmUgKj4odnBmcyk7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtU3RvcmUgKj4odnBmcyk7CiAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKHBmcyk7CiB9CiAKQEAgLTg2NSw2ICs4MjMsMTMgQEAKICAgICByc2MtPnNldFZlcnRleChwdik7CiB9CiAKK3ZvaWQgcnNpX0NvbnRleHRCaW5kRm9udChDb250ZXh0ICpyc2MsIFJzRm9udCB2Zm9udCkKK3sKKyAgICBGb250ICpmb250ID0gc3RhdGljX2Nhc3Q8Rm9udCAqPih2Zm9udCk7CisgICAgcnNjLT5zZXRGb250KGZvbnQpOworfQorCisKIHZvaWQgcnNpX0Fzc2lnbk5hbWUoQ29udGV4dCAqcnNjLCB2b2lkICogb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7CiAgICAgT2JqZWN0QmFzZSAqb2IgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KG9iaik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5oIGIvbGlicy9ycy9yc0NvbnRleHQuaAppbmRleCA4MmMzNjg3Li4xNDg1ZDhhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dC5oCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0gKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc011dGV4LmgiCiAKICNpbmNsdWRlICJyc1RocmVhZElPLmgiCiAjaW5jbHVkZSAicnNUeXBlLmgiCkBAIC0zMSw4ICszMiw5IEBACiAjaW5jbHVkZSAicnNBZGFwdGVyLmgiCiAjaW5jbHVkZSAicnNTYW1wbGVyLmgiCiAjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzRm9udC5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAjaW5jbHVkZSAicnNTaGFkZXJDYWNoZS5oIgpAQCAtNzAsMTEgKzcyLDEyIEBACiAgICAgVHlwZVN0YXRlIG1TdGF0ZVR5cGU7CiAgICAgU2FtcGxlclN0YXRlIG1TdGF0ZVNhbXBsZXI7CiAgICAgUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOworICAgIFByb2dyYW1TdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlIG1TdGF0ZVJhc3RlcjsKICAgICBQcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OwogICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CiAgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKyAgICBGb250U3RhdGUgbVN0YXRlRm9udDsKIAogICAgIFNjcmlwdENTdGF0ZSBtU2NyaXB0QzsKICAgICBTaGFkZXJDYWNoZSBtU2hhZGVyQ2FjaGU7CkBAIC04NCwxNCArODcsMTYgQEAKICAgICB2b2lkIHNldFJhc3RlcihQcm9ncmFtUmFzdGVyICopOwogICAgIHZvaWQgc2V0VmVydGV4KFByb2dyYW1WZXJ0ZXggKik7CiAgICAgdm9pZCBzZXRGcmFnbWVudChQcm9ncmFtRnJhZ21lbnQgKik7Ci0gICAgdm9pZCBzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICopOworICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKik7CisgICAgdm9pZCBzZXRGb250KEZvbnQgKik7CiAKICAgICB2b2lkIHVwZGF0ZVN1cmZhY2Uodm9pZCAqc3VyKTsKIAogICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudCAqIGdldEZyYWdtZW50KCkge3JldHVybiBtRnJhZ21lbnQuZ2V0KCk7fQotICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RnJhZ21lbnRTdG9yZSgpIHtyZXR1cm4gbUZyYWdtZW50U3RvcmUuZ2V0KCk7fQorICAgIGNvbnN0IFByb2dyYW1TdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtUmFzdGVyICogZ2V0UmFzdGVyKCkge3JldHVybiBtUmFzdGVyLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtVmVydGV4ICogZ2V0VmVydGV4KCkge3JldHVybiBtVmVydGV4LmdldCgpO30KKyAgICBGb250ICogZ2V0Rm9udCgpIHtyZXR1cm4gbUZvbnQuZ2V0KCk7fQogCiAgICAgYm9vbCBzZXR1cENoZWNrKCk7CiAgICAgYm9vbCBjaGVja0RyaXZlcigpIGNvbnN0IHtyZXR1cm4gbUVHTC5tU3VyZmFjZSAhPSAwO30KQEAgLTEwMywxMiArMTA4LDEwIEBACiAKICAgICB2b2lkIGFzc2lnbk5hbWUoT2JqZWN0QmFzZSAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pOwogICAgIHZvaWQgcmVtb3ZlTmFtZShPYmplY3RCYXNlICpvYmopOwotICAgIE9iamVjdEJhc2UgKiBsb29rdXBOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwotICAgIHZvaWQgYXBwZW5kTmFtZURlZmluZXMoU3RyaW5nOCAqc3RyKSBjb25zdDsKIAogICAgIHVpbnQzMl90IGdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCk7CiAgICAgYm9vbCBzZW5kTWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHVpbnQzMl90IGNtZElELCBzaXplX3QgbGVuLCBib29sIHdhaXRGb3JTcGFjZSk7Ci0gICAgdWludDMyX3QgcnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpOworICAgIHVpbnQzMl90IHJ1blNjcmlwdChTY3JpcHQgKnMpOwogCiAgICAgdm9pZCBpbml0VG9DbGllbnQoKTsKICAgICB2b2lkIGRlaW5pdFRvQ2xpZW50KCk7CkBAIC0xMTksMTUgKzEyMiwxOCBAQAogICAgIFByb2dyYW1WZXJ0ZXggKiBnZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZVZlcnRleC5tRGVmYXVsdC5nZXQoKTsKICAgICB9Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSBjb25zdCB7CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZUZyYWdtZW50U3RvcmUubURlZmF1bHQuZ2V0KCk7CiAgICAgfQogICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZVJhc3Rlci5tRGVmYXVsdC5nZXQoKTsKICAgICB9CisgICAgRm9udCogZ2V0RGVmYXVsdEZvbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RhdGVGb250Lm1EZWZhdWx0LmdldCgpOworICAgIH0KIAotICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiBtRUdMLm1XaWR0aDt9Ci0gICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiBtRUdMLm1IZWlnaHQ7fQorICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiBtV2lkdGg7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUhlaWdodDt9CiAKIAogICAgIFRocmVhZElPIG1JTzsKQEAgLTE2MSw3ICsxNjcsNyBAQAogICAgIHZvaWQgZHVtcERlYnVnKCkgY29uc3Q7CiAgICAgdm9pZCBjaGVja0Vycm9yKGNvbnN0IGNoYXIgKikgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqIGdldEVycm9yKFJzRXJyb3IgKik7Ci0gICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyk7CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpOwogCiAgICAgbXV0YWJsZSBjb25zdCBPYmplY3RCYXNlICogbU9iakhlYWQ7CiAKQEAgLTE3Nyw4ICsxODMsNiBAQAogICAgICAgICBFR0xDb25maWcgbUNvbmZpZzsKICAgICAgICAgRUdMQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgRUdMU3VyZmFjZSBtU3VyZmFjZTsKLSAgICAgICAgRUdMaW50IG1XaWR0aDsKLSAgICAgICAgRUdMaW50IG1IZWlnaHQ7CiAgICAgICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CiAgICAgfSBtRUdMOwogCkBAIC0yMjIsMTIgKzIyNiwxMiBAQAogICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0PiBtUm9vdFNjcmlwdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZyYWdtZW50OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOwotCisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtRm9udDsKIAogICAgIHN0cnVjdCBPYmpEZXN0cm95T09CIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKyAgICAgICAgTXV0ZXggbU11dGV4OwogICAgICAgICBWZWN0b3I8T2JqZWN0QmFzZSAqPiBtRGVzdHJveUxpc3Q7CiAgICAgICAgIGJvb2wgbU5lZWRUb0VtcHR5OwogICAgIH07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmggYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxZmZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorLy8jaW5jbHVkZSAicnNNdXRleC5oIgorCisvLyNpbmNsdWRlICJyc1RocmVhZElPLmgiCisjaW5jbHVkZSAicnNUeXBlLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc1NpbXBsZU1lc2guaCIKKyNpbmNsdWRlICJyc01lc2guaCIKKy8vI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNBZGFwdGVyLmgiCisjaW5jbHVkZSAicnNTYW1wbGVyLmgiCisjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKKyNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCisjaW5jbHVkZSAicnNWZXJ0ZXhBcnJheS5oIgorCisvLyNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCisvLyNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgorCisvLyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRGV2aWNlOworCitjbGFzcyBDb250ZXh0Cit7CitwdWJsaWM6CisgICAgQ29udGV4dChEZXZpY2UgKiwgYm9vbCBpc0dyYXBoaWNzLCBib29sIHVzZURlcHRoKSB7CisgICAgICAgIG1PYmpIZWFkID0gTlVMTDsKKyAgICB9CisgICAgfkNvbnRleHQoKSB7CisgICAgfQorCisKKyAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOworICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OworICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOworICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOworICAgIC8vUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICAvL1Byb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CisgICAgLy9Qcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OworICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CisgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKworICAgIC8vU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOworICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKKworCisgICAgLy9ib29sIHNldHVwQ2hlY2soKTsKKyAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBmYWxzZTt9CisKKyAgICBQcm9ncmFtRnJhZ21lbnQgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gMDt9CisKKyAgICAvLyBUaW1lcnMKKyAgICBlbnVtIFRpbWVycyB7CisgICAgICAgIFJTX1RJTUVSX0lETEUsCisgICAgICAgIFJTX1RJTUVSX0lOVEVSTkFMLAorICAgICAgICBSU19USU1FUl9TQ1JJUFQsCisgICAgICAgIFJTX1RJTUVSX0NMRUFSX1NXQVAsCisgICAgICAgIF9SU19USU1FUl9UT1RBTAorICAgIH07CisKKyAgICBib29sIGNoZWNrVmVyc2lvbjFfMSgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGNoZWNrVmVyc2lvbjJfMCgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKworICAgIHN0cnVjdCB7CisgICAgICAgIGJvb2wgbUxvZ1RpbWVzOworICAgICAgICBib29sIG1Mb2dTY3JpcHRzOworICAgICAgICBib29sIG1Mb2dPYmplY3RzOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgIH0gcHJvcHM7CisKKyAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0IHsgICAgfQorICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0IHsgIH07CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpIHsgIH0KKworICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOworCisgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorCitwcm90ZWN0ZWQ6CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlbmRvcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1SZW5kZXJlcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZXJzaW9uOworICAgICAgICBjb25zdCB1aW50OF90ICogbUV4dGVuc2lvbnM7CisKKyAgICAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKKyAgICAgICAgdWludDMyX3QgbU1pbm9yVmVyc2lvbjsKKworICAgICAgICBpbnQzMl90IG1NYXhWYXJ5aW5nVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czsKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9yczsKKworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhBdHRyaWJzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VGV4dHVyZVVuaXRzOworCisgICAgICAgIGJvb2wgT0VTX3RleHR1cmVfbnBvdDsKKyAgICB9IG1HTDsKKworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRGV2aWNlLmNwcCBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCmluZGV4IGI2NzBhZDQuLmE5NmIxMTQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwCisrKyBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCkBAIC0xNSw3ICsxNSwxMSBAQAogICovCiAKICNpbmNsdWRlICJyc0RldmljZS5oIgorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzMsNyArMzcsNyBAQAogCiB2b2lkIERldmljZTo6YWRkQ29udGV4dChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbUNvbnRleHRzLmFkZChyc2MpOworICAgIG1Db250ZXh0cy5wdXNoKHJzYyk7CiB9CiAKIHZvaWQgRGV2aWNlOjpyZW1vdmVDb250ZXh0KENvbnRleHQgKnJzYykKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcCBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcAppbmRleCA2Mjg4YmM0Li5hYTIwMjc1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5jcHAKKysrIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCkBAIC0xNCw5ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODMsNiArODgsOTAgQEAKICAgICB9CiB9CiAKK3ZvaWQgRWxlbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUNvbXBvbmVudC5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIC8vIE5vdyBzZXJpYWxpemUgYWxsIHRoZSBmaWVsZHMKKyAgICBzdHJlYW0tPmFkZFUzMihtRmllbGRDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBzdHJlYW0tPmFkZFN0cmluZygmbUZpZWxkc1tjdF0ubmFtZSk7CisgICAgICAgIG1GaWVsZHNbY3RdLmUtPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KK30KKworRWxlbWVudCAqRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQpIHsKKyAgICAgICAgTE9HRSgiZWxlbWVudCBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBuZXcgRWxlbWVudChyc2MpOworICAgIGVsZW0tPm1Db21wb25lbnQubG9hZEZyb21TdHJlYW0oc3RyZWFtKTsKKyAgICBlbGVtLT5tQml0cyA9IGVsZW0tPm1Db21wb25lbnQuZ2V0Qml0cygpOworCisgICAgZWxlbS0+bUZpZWxkQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihlbGVtLT5tRmllbGRDb3VudCkgeworICAgICAgICBlbGVtLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtlbGVtLT5tRmllbGRDb3VudF07CisgICAgICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgZWxlbS0+bUZpZWxkQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJmVsZW0tPm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICAgICAgRWxlbWVudCAqZmllbGRFbGVtID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5lLnNldChmaWVsZEVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGFscmVhZHkgZXhpc3RzCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIEVsZW1lbnQgKmVlID0gcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50c1tjdF07CisKKyAgICAgICAgaWYgKCFlZS0+Z2V0RmllbGRDb3VudCgpICkgeworCisgICAgICAgICAgICBpZigoZWUtPmdldENvbXBvbmVudCgpLmdldFR5cGUoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldEtpbmQoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRLaW5kKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSkgeworICAgICAgICAgICAgICAgIC8vIE1hdGNoCisgICAgICAgICAgICAgICAgZGVsZXRlIGVsZW07CisgICAgICAgICAgICAgICAgZWUtPmluY1VzZXJSZWYoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChlZS0+Z2V0RmllbGRDb3VudCgpID09IGVsZW0tPm1GaWVsZENvdW50KSB7CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBlbGVtLT5tRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChlZS0+bUZpZWxkc1tpXS5lLmdldCgpICE9IGVsZW0tPm1GaWVsZHNbaV0uZS5nZXQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUubGVuZ3RoKCkgIT0gZWxlbS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZSAhPSBlbGVtLT5tRmllbGRzW2ldLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZWxlbSk7CisgICAgcmV0dXJuIGVsZW07Cit9CisKIAogY29uc3QgRWxlbWVudCAqIEVsZW1lbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpCkBAIC0xNDMsNDUgKzIzMiw2IEBACiAgICAgcmV0dXJuIGU7CiB9CiAKLVN0cmluZzggRWxlbWVudDo6Z2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50KSBjb25zdAotewotICAgIFN0cmluZzggc2k7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzaS5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHMoc2kpOwotICAgIHMuYXBwZW5kKCJ7XG4iKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZChzaSk7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLmUtPmdldENUeXBlKGluZGVudCs0KSk7Ci0gICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLm5hbWUpOwotICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMuYXBwZW5kKHNpKTsKLSAgICBzLmFwcGVuZCgifSIpOwotICAgIHJldHVybiBzOwotfQotCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHM7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIGlmICghbUZpZWxkQ291bnQpIHsKLSAgICAgICAgLy8gQmFzaWMgY29tcG9uZW50LgotICAgICAgICBzLmFwcGVuZChtQ29tcG9uZW50LmdldENUeXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgIHMuYXBwZW5kKGdldENTdHJ1Y3RCb2R5KGluZGVudCkpOwotICAgIH0KLQotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IEVsZW1lbnQ6OmdldEdMU0xUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHM7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5oIGIvbGlicy9ycy9yc0VsZW1lbnQuaAppbmRleCAwMmExY2EyLi45MGU3Y2M4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5oCisrKyBiL2xpYnMvcnMvcnNFbGVtZW50LmgKQEAgLTU0LDExICs1NCwxMiBAQAogICAgIFJzRGF0YUtpbmQgZ2V0S2luZCgpIGNvbnN0IHtyZXR1cm4gbUNvbXBvbmVudC5nZXRLaW5kKCk7fQogICAgIHVpbnQzMl90IGdldEJpdHMoKSBjb25zdCB7cmV0dXJuIG1CaXRzO30KIAotICAgIFN0cmluZzggZ2V0Q1R5cGUodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwotICAgIFN0cmluZzggZ2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQ7IH0KKyAgICBzdGF0aWMgRWxlbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICBzdGF0aWMgY29uc3QgRWxlbWVudCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpOwpAQCAtOTAsNyArOTEsNyBAQAogICAgIH5FbGVtZW50U3RhdGUoKTsKIAogICAgIC8vIENhY2hlIG9mIGFsbCBleGlzdGluZyBlbGVtZW50cy4KLSAgICBWZWN0b3I8Y29uc3QgRWxlbWVudCAqPiBtRWxlbWVudHM7CisgICAgVmVjdG9yPEVsZW1lbnQgKj4gbUVsZW1lbnRzOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAgYi9saWJzL3JzL3JzRmlsZUEzRC5jcHAKaW5kZXggZTMyNzJjNS4uNGZhYzQyMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCisrKyBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcApAQCAtMTUsMjkgKzE1LDE1NiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgInJzRmlsZUEzRC5oIgogCiAjaW5jbHVkZSAicnNNZXNoLmgiCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLQotCi1GaWxlQTNEOjpGaWxlQTNEKCkKK0ZpbGVBM0Q6OkZpbGVBM0QoQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewotICAgIG1Sc2MgPSBOVUxMOworICAgIG1BbGxvYyA9IE5VTEw7CisgICAgbURhdGEgPSBOVUxMOworICAgIG1Xcml0ZVN0cmVhbSA9IE5VTEw7CisgICAgbVJlYWRTdHJlYW0gPSBOVUxMOworCisgICAgbU1ham9yVmVyc2lvbiA9IDA7CisgICAgbU1pbm9yVmVyc2lvbiA9IDE7CisgICAgbURhdGFTaXplID0gMDsKIH0KIAogRmlsZUEzRDo6fkZpbGVBM0QoKQogeworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXguc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtSW5kZXhbaV07CisgICAgfQorICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtV3JpdGVJbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZUluZGV4W2ldOworICAgIH0KKyAgICBpZihtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZVN0cmVhbTsKKyAgICB9CisgICAgaWYobVJlYWRTdHJlYW0pIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZVN0cmVhbTsKKyAgICB9CisgICAgaWYobUFsbG9jKSB7CisgICAgICAgIGZyZWUobUFsbG9jKTsKKyAgICB9CiB9CiAKLWJvb2wgRmlsZUEzRDo6bG9hZChDb250ZXh0ICpyc2MsIEZJTEUgKmYpCit2b2lkIEZpbGVBM0Q6OnBhcnNlSGVhZGVyKElTdHJlYW0gKmhlYWRlclN0cmVhbSkKK3sKKyAgICBtTWFqb3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgbU1pbm9yVmVyc2lvbiA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIHVpbnQzMl90IGZsYWdzID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgbVVzZTY0Qml0T2Zmc2V0cyA9IChmbGFncyAmIDEpICE9IDA7CisKKyAgICBMT0dFKCJmaWxlIG9wZW4gNjRiaXQgPSAlaSIsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgdWludDMyX3QgbnVtSW5kZXhFbnRyaWVzID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtSW5kZXhFbnRyaWVzOyBpICsrKSB7CisgICAgICAgIEEzREluZGV4RW50cnkgKmVudHJ5ID0gbmV3IEEzREluZGV4RW50cnkoKTsKKyAgICAgICAgaGVhZGVyU3RyZWFtLT5sb2FkU3RyaW5nKCZlbnRyeS0+bU9iamVjdE5hbWUpOworICAgICAgICBMT0dFKCJIZWFkZXIgZGF0YSwgZW50cnkgbmFtZSA9ICVzIiwgZW50cnktPm1PYmplY3ROYW1lLnN0cmluZygpKTsKKyAgICAgICAgZW50cnktPm1UeXBlID0gKFJzQTNEQ2xhc3NJRCloZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgaWYobVVzZTY0Qml0T2Zmc2V0cyl7CisgICAgICAgICAgICBlbnRyeS0+bU9mZnNldCA9IGhlYWRlclN0cmVhbS0+bG9hZE9mZnNldCgpOworICAgICAgICAgICAgZW50cnktPm1MZW5ndGggPSBoZWFkZXJTdHJlYW0tPmxvYWRPZmZzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgICAgICBlbnRyeS0+bUxlbmd0aCA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICB9CisgICAgICAgIGVudHJ5LT5tUnNPYmogPSBOVUxMOworICAgICAgICBtSW5kZXgucHVzaChlbnRyeSk7CisgICAgfQorfQorCitib29sIEZpbGVBM0Q6OmxvYWQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBMT0dFKCJMb2FkaW5nIGRhdGEuIFNpemU6ICV1IiwgbGVuZ3RoKTsKKyAgICBjb25zdCB1aW50OF90ICpsb2NhbERhdGEgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICBzaXplX3QgbGVuZ3RoUmVtYWluaW5nID0gbGVuZ3RoOworICAgIHNpemVfdCBtYWdpY1N0ckxlbiA9IDEyOworICAgIGlmICgobGVuZ3RoIDwgbWFnaWNTdHJMZW4pIHx8CisgICAgICAgIG1lbWNtcChkYXRhLCAiQW5kcm9pZDNEX2ZmIiwgbWFnaWNTdHJMZW4pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsb2NhbERhdGEgKz0gbWFnaWNTdHJMZW47CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IG1hZ2ljU3RyTGVuOworCisgICAgLy8gTmV4dCB3ZSBnZXQgb3VyIGhlYWRlciBzaXplCisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IDA7CisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgc2l6ZW9mKGhlYWRlclNpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1jcHkoJmhlYWRlclNpemUsIGxvY2FsRGF0YSwgc2l6ZW9mKGhlYWRlclNpemUpKTsKKyAgICBsb2NhbERhdGEgKz0gc2l6ZW9mKGhlYWRlclNpemUpOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBzaXplb2YoaGVhZGVyU2l6ZSk7CisKKyAgICBMT0dFKCJMb2FkaW5nIGRhdGEsIGhlYWRlclNpemUgPSAlbGxpIiwgaGVhZGVyU2l6ZSk7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBoZWFkZXJTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90ICpoZWFkZXJEYXRhID0gKHVpbnQ4X3QgKiltYWxsb2MoaGVhZGVyU2l6ZSk7CisgICAgaWYoIWhlYWRlckRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbWNweShoZWFkZXJEYXRhLCBsb2NhbERhdGEsIGhlYWRlclNpemUpOworCisgICAgLy8gTm93IG9wZW4gdGhlIHN0cmVhbSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAgSVN0cmVhbSBoZWFkZXJTdHJlYW0oaGVhZGVyRGF0YSwgZmFsc2UpOworICAgIHBhcnNlSGVhZGVyKCZoZWFkZXJTdHJlYW0pOworCisgICAgZnJlZShoZWFkZXJEYXRhKTsKKworICAgIGxvY2FsRGF0YSArPSBoZWFkZXJTaXplOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBoZWFkZXJTaXplOworCisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgc2l6ZW9mKG1EYXRhU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIGRhdGEKKyAgICBtZW1jcHkoJm1EYXRhU2l6ZSwgbG9jYWxEYXRhLCBzaXplb2YobURhdGFTaXplKSk7CisgICAgbG9jYWxEYXRhICs9IHNpemVvZihtRGF0YVNpemUpOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBzaXplb2YobURhdGFTaXplKTsKKworICAgIExPR0UoIkxvYWRpbmcgZGF0YSwgbURhdGFTaXplID0gJWxsaSIsIG1EYXRhU2l6ZSk7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBtRGF0YVNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBrbm93IGVub3VnaCB0byByZWFkIHRoZSBmaWxlIGluIGF0IHRoaXMgcG9pbnQuCisgICAgbUFsbG9jID0gbWFsbG9jKG1EYXRhU2l6ZSk7CisgICAgaWYgKCFtQWxsb2MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtRGF0YSA9ICh1aW50OF90ICopbUFsbG9jOworICAgIG1lbWNweShtQWxsb2MsIGxvY2FsRGF0YSwgbURhdGFTaXplKTsKKworICAgIG1SZWFkU3RyZWFtID0gbmV3IElTdHJlYW0obURhdGEsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChGSUxFICpmKQogewogICAgIGNoYXIgbWFnaWNTdHJpbmdbMTJdOwogICAgIHNpemVfdCBsZW47CkBAIC00OSw0NyArMTc2LDM5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMiIpOwotICAgIGxlbiA9IGZyZWFkKCZtTWFqb3JWZXJzaW9uLCAxLCBzaXplb2YobU1ham9yVmVyc2lvbiksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1NYWpvclZlcnNpb24pKSB7CisgICAgLy8gTmV4dCB0aGluZyBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IDA7CisgICAgbGVuID0gZnJlYWQoJmhlYWRlclNpemUsIDEsIHNpemVvZihoZWFkZXJTaXplKSwgZik7CisgICAgaWYgKGxlbiAhPSBzaXplb2YoaGVhZGVyU2l6ZSkgfHwgaGVhZGVyU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMyIpOwotICAgIGxlbiA9IGZyZWFkKCZtTWlub3JWZXJzaW9uLCAxLCBzaXplb2YobU1pbm9yVmVyc2lvbiksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1NaW5vclZlcnNpb24pKSB7CisgICAgdWludDhfdCAqaGVhZGVyRGF0YSA9ICh1aW50OF90ICopbWFsbG9jKGhlYWRlclNpemUpOworICAgIGlmKCFoZWFkZXJEYXRhKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gNCIpOwotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGxlbiA9IGZyZWFkKCZmbGFncywgMSwgc2l6ZW9mKGZsYWdzKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YoZmxhZ3MpKSB7CisgICAgbGVuID0gZnJlYWQoaGVhZGVyRGF0YSwgMSwgaGVhZGVyU2l6ZSwgZik7CisgICAgaWYgKGxlbiAhPSBoZWFkZXJTaXplKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbVVzZTY0Qml0T2Zmc2V0cyA9IChmbGFncyAmIDEpICE9IDA7CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gNjRiaXQgPSAlaSIsIG1Vc2U2NEJpdE9mZnNldHMpOworICAgIC8vIE5vdyBvcGVuIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgIElTdHJlYW0gaGVhZGVyU3RyZWFtKGhlYWRlckRhdGEsIGZhbHNlKTsKKyAgICBwYXJzZUhlYWRlcigmaGVhZGVyU3RyZWFtKTsKIAotICAgIGlmIChtVXNlNjRCaXRPZmZzZXRzKSB7Ci0gICAgICAgIGxlbiA9IGZyZWFkKCZtRGF0YVNpemUsIDEsIHNpemVvZihtRGF0YVNpemUpLCBmKTsKLSAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YobURhdGFTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgdG1wOwotICAgICAgICBsZW4gPSBmcmVhZCgmdG1wLCAxLCBzaXplb2YodG1wKSwgZik7Ci0gICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKHRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtRGF0YVNpemUgPSB0bXA7CisgICAgZnJlZShoZWFkZXJEYXRhKTsKKworICAgIC8vIE5leHQgdGhpbmcgaXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcgorICAgIGxlbiA9IGZyZWFkKCZtRGF0YVNpemUsIDEsIHNpemVvZihtRGF0YVNpemUpLCBmKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihtRGF0YVNpemUpIHx8IG1EYXRhU2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBMT0dFKCJmaWxlIG9wZW4gc2l6ZSA9ICVsbGkiLCBtRGF0YVNpemUpOwogCiAgICAgLy8gV2Ugc2hvdWxkIGtub3cgZW5vdWdoIHRvIHJlYWQgdGhlIGZpbGUgaW4gYXQgdGhpcyBwb2ludC4KLSAgICBmc2VlayhmLCBTRUVLX1NFVCwgMCk7Ci0gICAgbUFsbG9jPSBtYWxsb2MobURhdGFTaXplKTsKKyAgICBtQWxsb2MgPSBtYWxsb2MobURhdGFTaXplKTsKICAgICBpZiAoIW1BbGxvYykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTksMjgyICsyMTgsMjU4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIHN0YXJ0IHByb2Nlc3NpbmciKTsKLSAgICByZXR1cm4gcHJvY2Vzcyhyc2MpOworICAgIG1SZWFkU3RyZWFtID0gbmV3IElTdHJlYW0obURhdGEsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgTE9HRSgiSGVhZGVyIGlzIHJlYWQgYW4gc3RyZWFtIGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2Vzc0luZGV4KENvbnRleHQgKnJzYywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKLSAgICBJTyBpbyhtRGF0YSArIGllLT5tT2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKK3NpemVfdCBGaWxlQTNEOjpnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmRleC5zaXplKCk7Cit9CiAKLSAgICBMT0dFKCJwcm9jZXNzIGluZGV4LCB0eXBlICVpIiwgaWUtPm1UeXBlKTsKLQotICAgIHN3aXRjaChpZS0+bVR5cGUpIHsKLSAgICBjYXNlIENIVU5LX0VMRU1FTlQ6Ci0gICAgICAgIHByb2Nlc3NDaHVua19FbGVtZW50KHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfRUxFTUVOVF9TT1VSQ0U6Ci0gICAgICAgIHByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfVkVSVElDSUVTOgotICAgICAgICBwcm9jZXNzQ2h1bmtfVmVydGljaWVzKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfTUVTSDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX01lc2gocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19QUklNSVRJVkU6Ci0gICAgICAgIHByb2Nlc3NDaHVua19QcmltaXRpdmUocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRSgiRmlsZUEzRCBVbmtub3duIGNodW5rIHR5cGUiKTsKLSAgICAgICAgYnJlYWs7Citjb25zdCBGaWxlQTNEOjpBM0RJbmRleEVudHJ5ICpGaWxlQTNEOjpnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmKGluZGV4IDwgbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gbUluZGV4W2luZGV4XTsKICAgICB9Ci0gICAgcmV0dXJuIChpZS0+bVJzT2JqICE9IE5VTEwpOworICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIEZpbGVBM0Q6OnByb2Nlc3MoQ29udGV4dCAqcnNjKQotewotICAgIExPR0UoInByb2Nlc3MiKTsKLSAgICBJTyBpbyhtRGF0YSArIDEyLCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBib29sIHJldCA9IHRydWU7Ci0KLSAgICAvLyBCdWlsZCB0aGUgaW5kZXggZmlyc3QKLSAgICBMT0dFKCJwcm9jZXNzIDEiKTsKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1ham9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgaW8ubG9hZFUzMigpOyAvLyBtaW5vciB2ZXJzaW9uLCBhbHJlYWR5IGxvYWRlZAotICAgIExPR0UoInByb2Nlc3MgMiIpOwotCi0gICAgaW8ubG9hZFUzMigpOyAgLy8gZmxhZ3MKLSAgICBpby5sb2FkT2Zmc2V0KCk7IC8vIGZpbGVzaXplLCBhbHJlYWR5IGxvYWRlZC4KLSAgICBMT0dFKCJwcm9jZXNzIDQiKTsKLSAgICB1aW50NjRfdCBtSW5kZXhPZmZzZXQgPSBpby5sb2FkT2Zmc2V0KCk7Ci0gICAgdWludDY0X3QgbVN0cmluZ09mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLQotICAgIExPR0UoInByb2Nlc3MgbUluZGV4T2Zmc2V0PSAweCUwMTZsbHgiLCBtSW5kZXhPZmZzZXQpOwotICAgIExPR0UoInByb2Nlc3MgbVN0cmluZ09mZnNldD0gMHglMDE2bGx4IiwgbVN0cmluZ09mZnNldCk7Ci0KLSAgICBJTyBpbmRleChtRGF0YSArIG1JbmRleE9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgSU8gc3RyaW5nVGFibGUobURhdGEgKyBtU3RyaW5nT2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLQotICAgIHVpbnQzMl90IHN0cmluZ0VudHJ5Q291bnQgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgTE9HRSgic3RyaW5nRW50cnlDb3VudCAlaSIsIHN0cmluZ0VudHJ5Q291bnQpOwotICAgIG1TdHJpbmdzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIG1TdHJpbmdJbmRleFZhbHVlcy5zZXRDYXBhY2l0eShzdHJpbmdFbnRyeUNvdW50KTsKLSAgICBpZiAoc3RyaW5nRW50cnlDb3VudCkgewotICAgICAgICB1aW50MzJfdCBzdHJpbmdUeXBlID0gc3RyaW5nVGFibGUubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJzdHJpbmdUeXBlICVpIiwgc3RyaW5nVHlwZSk7Ci0gICAgICAgIHJzQXNzZXJ0KHN0cmluZ1R5cGU9PTApOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBzdHJpbmdFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQgPSBzdHJpbmdUYWJsZS5sb2FkT2Zmc2V0KCk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgb2Zmc2V0IDB4JTAxNmxseCIsIG9mZnNldCk7Ci0gICAgICAgICAgICBJTyB0bXAobURhdGEgKyBvZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgdG1wLmxvYWRTdHJpbmcoJnMpOwotICAgICAgICAgICAgTE9HRSgic3RyaW5nICVzIiwgcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBtU3RyaW5ncy5wdXNoKHMpOwotICAgICAgICB9CitPYmplY3RCYXNlICpGaWxlQTNEOjppbml0aWFsaXplRnJvbUVudHJ5KHNpemVfdCBpbmRleCkgeworICAgIGlmKGluZGV4ID49IG1JbmRleC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTE9HRSgic3RyaW5ncyBkb25lIik7Ci0gICAgdWludDMyX3QgaW5kZXhFbnRyeUNvdW50ID0gaW5kZXgubG9hZFUzMigpOwotICAgIExPR0UoImluZGV4IGNvdW50ICVpIiwgaW5kZXhFbnRyeUNvdW50KTsKLSAgICBtSW5kZXguc2V0Q2FwYWNpdHkoaW5kZXhFbnRyeUNvdW50KTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgQTNESW5kZXhFbnRyeSBlOwotICAgICAgICB1aW50MzJfdCBzdHJpbmdJbmRleCA9IGluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiaW5kZXggJWkiLCBjdCk7Ci0gICAgICAgIExPR0UoIiAgc3RyaW5nIGluZGV4ICVpIiwgc3RyaW5nSW5kZXgpOwotICAgICAgICBlLm1UeXBlID0gKEEzRENodW5rVHlwZSlpbmRleC5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoIiAgdHlwZSAlaSIsIGUubVR5cGUpOwotICAgICAgICBlLm1PZmZzZXQgPSBpbmRleC5sb2FkT2Zmc2V0KCk7Ci0gICAgICAgIExPR0UoIiAgb2Zmc2V0IDB4JTAxNmxseCIsIGUubU9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHN0cmluZ0luZGV4ICYmIChzdHJpbmdJbmRleCA8IG1TdHJpbmdzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIGUubUlEID0gbVN0cmluZ3Nbc3RyaW5nSW5kZXhdOwotICAgICAgICAgICAgbVN0cmluZ0luZGV4VmFsdWVzLmVkaXRJdGVtQXQoc3RyaW5nSW5kZXgpID0gY3Q7Ci0gICAgICAgICAgICBMT0dFKCIgIGlkICVzIiwgZS5tSUQuc3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUluZGV4LnB1c2goZSk7Ci0gICAgfQotICAgIExPR0UoImluZGV4IGRvbmUiKTsKLQotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGluZGV4IHNob3VsZCBiZSBmdWxseSBwb3B1bGF0ZWQuCi0gICAgLy8gV2UgY2FuIG5vdyB3YWxrIHRob3VnaCBpdCBhbmQgbG9hZCBhbGwgdGhlIG9iamVjdHMuCi0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgaW5kZXhFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIExPR0UoInByb2Nlc3NpbmcgaW5kZXggZW50cnkgJWkiLCBjdCk7Ci0gICAgICAgIHByb2Nlc3NJbmRleChyc2MsICZtSW5kZXguZWRpdEl0ZW1BdChjdCkpOworICAgIEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKmVudHJ5ID0gbUluZGV4W2luZGV4XTsKKyAgICBpZighZW50cnkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIHJldDsKLX0KLQotCi1GaWxlQTNEOjpJTzo6SU8oY29uc3QgdWludDhfdCAqYnVmLCBib29sIHVzZTY0KQotewotICAgIG1EYXRhID0gYnVmOwotICAgIG1Qb3MgPSAwOwotICAgIG1Vc2U2NCA9IHVzZTY0OwotfQotCi11aW50NjRfdCBGaWxlQTNEOjpJTzo6bG9hZE9mZnNldCgpCi17Ci0gICAgdWludDY0X3QgdG1wOwotICAgIGlmIChtVXNlNjQpIHsKLSAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOwotICAgICAgICB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKLSAgICAgICAgcmV0dXJuIHRtcDsKKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7CiAgICAgfQotICAgIHJldHVybiBsb2FkVTMyKCk7Ci19CiAKLXZvaWQgRmlsZUEzRDo6SU86OmxvYWRTdHJpbmcoU3RyaW5nOCAqcykKLXsKLSAgICBMT0dFKCJsb2FkU3RyaW5nIik7Ci0gICAgdWludDMyX3QgbGVuID0gbG9hZFUzMigpOwotICAgIExPR0UoImxvYWRTdHJpbmcgbGVuICVpIiwgbGVuKTsKLSAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKLSAgICBtUG9zICs9IGxlbjsKLX0KLQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19NZXNoKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBNZXNoICogbSA9IG5ldyBNZXNoKHJzYyk7Ci0KLSAgICBtLT5tUHJpbWl0aXZlc0NvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBtLT5tUHJpbWl0aXZlcyA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdCAqW20tPm1QcmltaXRpdmVzQ291bnRdOwotCi0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbS0+bVByaW1pdGl2ZXNDb3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0KLSAgICAgICAgbS0+bVByaW1pdGl2ZXNbY3RdID0gKE1lc2g6OlByaW1pdGl2ZV90ICopbUluZGV4W2luZGV4XS5tUnNPYmo7Ci0gICAgfQotICAgIGllLT5tUnNPYmogPSBtOwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlByaW1pdGl2ZV90ICogcCA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdDsKLQotICAgIHAtPm1JbmRleENvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICB1aW50MzJfdCB2ZXJ0SWR4ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBwLT5tUmVzdGFydENvdW50cyA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICBwLT5tVHlwZSA9IChSc1ByaW1pdGl2ZSlpby0+bG9hZFU4KCk7Ci0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlIGNvdW50ICVpLCBiaXRzICVpIiwgcC0+bUluZGV4Q291bnQsIGJpdHMpOwotCi0gICAgcC0+bVZlcnRpY2llcyA9IChNZXNoOjpWZXJ0aWNpZXNfdCAqKW1JbmRleFt2ZXJ0SWR4XS5tUnNPYmo7Ci0KLSAgICBwLT5tSW5kaWNpZXMgPSBuZXcgdWludDE2X3RbcC0+bUluZGV4Q291bnRdOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHAtPm1JbmRleENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFU4KCk7CisgICAgLy8gU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIG9iamVjdAorICAgIG1SZWFkU3RyZWFtLT5yZXNldChlbnRyeS0+bU9mZnNldCk7CisgICAgc3dpdGNoIChlbnRyeS0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9NRVNIOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IE1lc2g6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMTYoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0lNUExFX01FU0g6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gU2ltcGxlTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUzMigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9UWVBFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtVmVydGV4OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1JBU1RFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtUmFzdGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1GcmFnbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRToKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtU3RvcmU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVI6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfTElHSFQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTGlnaHQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWRhcHRlcjFEOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzJEOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFkYXB0ZXIyRDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYoZW50cnktPm1Sc09iaikgeworICAgICAgICBlbnRyeS0+bVJzT2JqLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiBlbnRyeS0+bVJzT2JqOworfQorCitib29sIEZpbGVBM0Q6OndyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpZighbVdyaXRlU3RyZWFtKSB7CisgICAgICAgIExPR0UoIk5vIG9iamVjdHMgdG8gd3JpdGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCkgPT0gMCkgeworICAgICAgICBMT0dFKCJObyBvYmplY3RzIHRvIHdyaXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEZJTEUgKndyaXRlSGFuZGxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworICAgIGlmKCF3cml0ZUhhbmRsZSkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE9wZW4gYSBuZXcgc3RyZWFtIHRvIG1ha2Ugd3JpdGluZyB0aGUgaGVhZGVyIGVhc2llcgorICAgIE9TdHJlYW0gaGVhZGVyU3RyZWFtKDUqMTAyNCwgZmFsc2UpOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIobU1ham9yVmVyc2lvbik7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihtTWlub3JWZXJzaW9uKTsKKyAgICB1aW50MzJfdCBpczY0Qml0ID0gMDsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKGlzNjRCaXQpOworCisgICAgdWludDMyX3Qgd3JpdGVJbmRleFNpemUgPSBtV3JpdGVJbmRleC5zaXplKCk7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMih3cml0ZUluZGV4U2l6ZSk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVJbmRleFNpemU7IGkgKyspIHsKKyAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFN0cmluZygmbVdyaXRlSW5kZXhbaV0tPm1PYmplY3ROYW1lKTsKKyAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFUzMigodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1UeXBlKTsKKyAgICAgICAgaWYobVVzZTY0Qml0T2Zmc2V0cyl7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkT2Zmc2V0KG1Xcml0ZUluZGV4W2ldLT5tT2Zmc2V0KTsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRPZmZzZXQobVdyaXRlSW5kZXhbaV0tPm1MZW5ndGgpOwogICAgICAgICB9Ci0gICAgICAgIExPR0UoIiAgaWR4ICVpIiwgcC0+bUluZGljaWVzW2N0XSk7Ci0gICAgfQotCi0gICAgaWYgKHAtPm1SZXN0YXJ0Q291bnRzKSB7Ci0gICAgICAgIHAtPm1SZXN0YXJ0cyA9IG5ldyB1aW50MTZfdFtwLT5tUmVzdGFydENvdW50c107Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHAtPm1SZXN0YXJ0Q291bnRzOyBjdCsrKSB7Ci0gICAgICAgICAgICBzd2l0Y2goYml0cykgewotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFU4KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFUxNigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICBwLT5tUmVzdGFydHNbY3RdID0gaW8tPmxvYWRVMzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR0UoIiAgaWR4ICVpIiwgcC0+bVJlc3RhcnRzW2N0XSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gKHVpbnQzMl90KW1Xcml0ZUluZGV4W2ldLT5tT2Zmc2V0OworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ID0gKHVpbnQzMl90KW1Xcml0ZUluZGV4W2ldLT5tTGVuZ3RoOworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihvZmZzZXQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcC0+bVJlc3RhcnRzID0gTlVMTDsKICAgICB9CiAKLSAgICBpZS0+bVJzT2JqID0gcDsKKyAgICAvLyBXcml0ZSBvdXIgbWFnaWMgc3RyaW5nIHNvIHdlIGtub3cgd2UgYXJlIHJlYWRpbmcgdGhlIHJpZ2h0IGZpbGUKKyAgICBTdHJpbmc4IG1hZ2ljU3RyaW5nKEEzRF9NQUdJQ19LRVkpOworICAgIGZ3cml0ZShtYWdpY1N0cmluZy5zdHJpbmcoKSwgc2l6ZW9mKGNoYXIpLCBtYWdpY1N0cmluZy5zaXplKCksIHdyaXRlSGFuZGxlKTsKKworICAgIC8vIFN0b3JlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcGFyc2Ugd2hlbiB3ZSByZWFkIGl0CisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IGhlYWRlclN0cmVhbS5nZXRQb3MoKTsKKyAgICBmd3JpdGUoJmhlYWRlclNpemUsIHNpemVvZihoZWFkZXJTaXplKSwgMSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gTm93IHdyaXRlIG91ciBoZWFkZXIKKyAgICBmd3JpdGUoaGVhZGVyU3RyZWFtLmdldFB0cigpLCBzaXplb2YodWludDhfdCksIGhlYWRlclN0cmVhbS5nZXRQb3MoKSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gTm93IHdyaXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHBhcnQgb2YgdGhlIGZpbGUgZm9yIGVhc2llciBwYXJzaW5nIGxhdGVyCisgICAgdWludDY0X3QgZmlsZURhdGFTaXplID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKTsKKyAgICBmd3JpdGUoJmZpbGVEYXRhU2l6ZSwgc2l6ZW9mKGZpbGVEYXRhU2l6ZSksIDEsIHdyaXRlSGFuZGxlKTsKKworICAgIGZ3cml0ZShtV3JpdGVTdHJlYW0tPmdldFB0cigpLCBzaXplb2YodWludDhfdCksIG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCksIHdyaXRlSGFuZGxlKTsKKworICAgIGludCBzdGF0dXMgPSBmY2xvc2Uod3JpdGVIYW5kbGUpOworCisgICAgaWYoc3RhdHVzICE9IDApIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3QgY2xvc2UgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfVmVydGljaWVzKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBNZXNoOjpWZXJ0aWNpZXNfdCAqY3YgPSBuZXcgTWVzaDo6VmVydGljaWVzX3Q7Ci0gICAgY3YtPm1BbGxvY2F0aW9uQ291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIGN2LT5tQWxsb2NhdGlvbnMgPSBuZXcgQWxsb2NhdGlvbiAqW2N2LT5tQWxsb2NhdGlvbkNvdW50XTsKLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfVmVydGljaWVzIGNvdW50ICVpIiwgY3YtPm1BbGxvY2F0aW9uQ291bnQpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGN2LT5tQWxsb2NhdGlvbkNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGkgPSBpby0+bG9hZFUzMigpOwotICAgICAgICBjdi0+bUFsbG9jYXRpb25zW2N0XSA9IChBbGxvY2F0aW9uICopbUluZGV4W2ldLm1Sc09iajsKLSAgICAgICAgTE9HRSgiICBpZHggJWkiLCBpKTsKK3ZvaWQgRmlsZUEzRDo6YXBwZW5kVG9GaWxlKE9iamVjdEJhc2UgKm9iaikgeworICAgIGlmKCFvYmopIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZS0+bVJzT2JqID0gY3Y7Ci19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX0VsZW1lbnQoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIC8qCi0gICAgcnNpX0VsZW1lbnRCZWdpbihyc2MpOwotCi0gICAgdWludDMyX3QgY291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIExPR0UoInByb2Nlc3NDaHVua19FbGVtZW50IGNvdW50ICVpIiwgY291bnQpOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0gICAgICAgIFJzRGF0YUtpbmQgZGsgPSAoUnNEYXRhS2luZClpby0+bG9hZFU4KCk7Ci0gICAgICAgIFJzRGF0YVR5cGUgZHQgPSAoUnNEYXRhVHlwZSlpby0+bG9hZFU4KCk7Ci0gICAgICAgIHVpbnQzMl90IGJpdHMgPSBpby0+bG9hZFU4KCk7Ci0gICAgICAgIGJvb2wgaXNOb3JtID0gaW8tPmxvYWRVOCgpICE9IDA7Ci0gICAgICAgIExPR0UoIiAgJWkgJWkgJWkgJWkiLCBkaywgZHQsIGJpdHMsIGlzTm9ybSk7Ci0gICAgICAgIHJzaV9FbGVtZW50QWRkKHJzYywgZGssIGR0LCBpc05vcm0sIGJpdHMsIDApOworICAgIGlmKCFtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgaW5pdGlhbFN0cmVhbVNpemUgPSAyNTYqMTAyNDsKKyAgICAgICAgbVdyaXRlU3RyZWFtID0gbmV3IE9TdHJlYW0oaW5pdGlhbFN0cmVhbVNpemUsIGZhbHNlKTsKICAgICB9Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnQgY3JlYXRlIik7Ci0gICAgaWUtPm1Sc09iaiA9IHJzaV9FbGVtZW50Q3JlYXRlKHJzYyk7Ci0gICAgKi8KLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgdWludDMyX3QgaW5kZXggPSBpby0+bG9hZFUzMigpOwotICAgIHVpbnQzMl90IGNvdW50ID0gaW8tPmxvYWRVMzIoKTsKLQotICAgIExPR0UoInByb2Nlc3NDaHVua19FbGVtZW50U291cmNlIGNvdW50ICVpLCBpbmRleCAlaSIsIGNvdW50LCBpbmRleCk7Ci0KLSAgICBSc0VsZW1lbnQgZSA9IChSc0VsZW1lbnQpbUluZGV4W2luZGV4XS5tUnNPYmo7Ci0KLSAgICBSc0FsbG9jYXRpb24gYSA9IHJzaV9BbGxvY2F0aW9uQ3JlYXRlU2l6ZWQocnNjLCBlLCBjb3VudCk7Ci0gICAgQWxsb2NhdGlvbiAqIGFsbG9jID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihhKTsKLQotICAgIGZsb2F0ICogZGF0YSA9IChmbG9hdCAqKWFsbG9jLT5nZXRQdHIoKTsKLSAgICB3aGlsZShjb3VudC0tKSB7Ci0gICAgICAgICpkYXRhID0gaW8tPmxvYWRGKCk7Ci0gICAgICAgIExPR0UoIiAgJWYiLCAqZGF0YSk7Ci0gICAgICAgIGRhdGErKzsKLSAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IGFsbG9jOworICAgIEEzREluZGV4RW50cnkgKmluZGV4RW50cnkgPSBuZXcgQTNESW5kZXhFbnRyeSgpOworICAgIGluZGV4RW50cnktPm1PYmplY3ROYW1lLnNldFRvKG9iai0+Z2V0TmFtZSgpKTsKKyAgICBpbmRleEVudHJ5LT5tVHlwZSA9IG9iai0+Z2V0Q2xhc3NJZCgpOworICAgIGluZGV4RW50cnktPm1PZmZzZXQgPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpOworICAgIGluZGV4RW50cnktPm1Sc09iaiA9IG9iajsKKyAgICBtV3JpdGVJbmRleC5wdXNoKGluZGV4RW50cnkpOworICAgIG9iai0+c2VyaWFsaXplKG1Xcml0ZVN0cmVhbSk7CisgICAgaW5kZXhFbnRyeS0+bUxlbmd0aCA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCkgLSBpbmRleEVudHJ5LT5tT2Zmc2V0OworICAgIG1Xcml0ZVN0cmVhbS0+YWxpZ24oNCk7CiB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCit2b2lkIHJzaV9GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKENvbnRleHQgKnJzYywgaW50MzJfdCAqbnVtRW50cmllcywgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisKKyAgICBpZihmYTNkKSB7CisgICAgICAgICpudW1FbnRyaWVzID0gZmEzZC0+Z2V0TnVtSW5kZXhFbnRyaWVzKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqbnVtRW50cmllcyA9IDA7CisgICAgfQorfQorCit2b2lkIHJzaV9GaWxlQTNER2V0SW5kZXhFbnRyaWVzKENvbnRleHQgKnJzYywgUnNGaWxlSW5kZXhFbnRyeSAqZmlsZUVudHJpZXMsIHVpbnQzMl90IG51bUVudHJpZXMsIFJzRmlsZSBmaWxlKQoreworICAgIEZpbGVBM0QgKmZhM2QgPSBzdGF0aWNfY2FzdDxGaWxlQTNEICo+KGZpbGUpOworCisgICAgaWYoIWZhM2QpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgbG9hZCBpbmRleCBlbnRyaWVzLiBObyB2YWxpZCBmaWxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1GaWxlRW50cmllcyA9IGZhM2QtPmdldE51bUluZGV4RW50cmllcygpOworICAgIGlmKG51bUZpbGVFbnRyaWVzICE9IG51bUVudHJpZXMgfHwgbnVtRW50cmllcyA9PSAwIHx8IGZpbGVFbnRyaWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgbG9hZCBpbmRleCBlbnRyaWVzLiBJbnZhbGlkIG51bWJlciByZXF1ZXN0ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bUZpbGVFbnRyaWVzOyBpICsrKSB7CisgICAgICAgIGNvbnN0IEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKmVudHJ5ID0gZmEzZC0+Z2V0SW5kZXhFbnRyeShpKTsKKyAgICAgICAgZmlsZUVudHJpZXNbaV0uY2xhc3NJRCA9IGVudHJ5LT5nZXRUeXBlKCk7CisgICAgICAgIGZpbGVFbnRyaWVzW2ldLm9iamVjdE5hbWUgPSBlbnRyeS0+Z2V0T2JqZWN0TmFtZSgpLnN0cmluZygpOworICAgIH0KKworfQorCitSc09iamVjdEJhc2UgcnNpX0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBpbmRleCwgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisgICAgaWYoIWZhM2QpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgbG9hZCBlbnRyeS4gTm8gdmFsaWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBPYmplY3RCYXNlICpvYmogPSBmYTNkLT5pbml0aWFsaXplRnJvbUVudHJ5KGluZGV4KTsKKyAgICBMT0dFKCJSZXR1cm5pbmcgb2JqZWN0IHdpdGggbmFtZSAlcyIsIG9iai0+Z2V0TmFtZSgpKTsKKworICAgIHJldHVybiBvYmo7Cit9CisKK1JzRmlsZSByc2lfRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShDb250ZXh0ICpyc2MsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkZpbGUgbG9hZCBmYWlsZWQuIEFzc2V0IHN0cmVhbSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRChyc2MpOworCisgICAgZmEzZC0+bG9hZChkYXRhLCBsZW4pOworICAgIGZhM2QtPmluY1VzZXJSZWYoKTsKKworICAgIHJldHVybiBmYTNkOworfQorCiAKIFJzRmlsZSByc2lfRmlsZU9wZW4oQ29udGV4dCAqcnNjLCBjaGFyIGNvbnN0ICpwYXRoLCB1bnNpZ25lZCBpbnQgbGVuKQogewotICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRDsKKyAgICBGaWxlQTNEICpmYTNkID0gbmV3IEZpbGVBM0QocnNjKTsKIAogICAgIEZJTEUgKmYgPSBmb3BlbigiL3NkY2FyZC90ZXN0LmEzZCIsICJyYiIpOwogICAgIGlmIChmKSB7Ci0gICAgICAgIGZhM2QtPmxvYWQocnNjLCBmKTsKKyAgICAgICAgZmEzZC0+bG9hZChmKTsKICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICBmYTNkLT5pbmNVc2VyUmVmKCk7CiAgICAgICAgIHJldHVybiBmYTNkOwogICAgIH0KICAgICBkZWxldGUgZmEzZDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNELmggYi9saWJzL3JzL3JzRmlsZUEzRC5oCmluZGV4IDllZTA4ZWMuLmI5ODU5MDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNGaWxlQTNELmgKKysrIGIvbGlicy9ycy9yc0ZpbGVBM0QuaApAQCAtMTgsMjAgKzE4LDIzIEBACiAjZGVmaW5lIEFORFJPSURfUlNfRklMRV9BM0RfSAogCiAjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCi0jaW5jbHVkZSAicnNGaWxlQTNERGVjbHMuaCIKICNpbmNsdWRlICJyc01lc2guaCIKIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlICJyc1N0cmVhbS5oIgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKKyNkZWZpbmUgQTNEX01BR0lDX0tFWSAiQW5kcm9pZDNEX2ZmIgorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKKwogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLWNsYXNzIEZpbGVBM0QKK2NsYXNzIEZpbGVBM0QgOiBwdWJsaWMgT2JqZWN0QmFzZQogewogcHVibGljOgotICAgIEZpbGVBM0QoKTsKKyAgICBGaWxlQTNEKENvbnRleHQgKnJzYyk7CiAgICAgfkZpbGVBM0QoKTsKIAogICAgIHVpbnQzMl90IG1NYWpvclZlcnNpb247CkBAIC00MCw3OCArNDMsNTMgQEAKICAgICB1aW50NjRfdCBtU3RyaW5nVGFibGVPZmZzZXQ7CiAgICAgYm9vbCBtVXNlNjRCaXRPZmZzZXRzOwogCi0gICAgc3RydWN0IEEzREluZGV4RW50cnkgewotICAgICAgICBTdHJpbmc4IG1JRDsKLSAgICAgICAgQTNEQ2h1bmtUeXBlIG1UeXBlOworICAgIGNsYXNzIEEzREluZGV4RW50cnkgeworICAgICAgICBTdHJpbmc4IG1PYmplY3ROYW1lOworICAgICAgICBSc0EzRENsYXNzSUQgbVR5cGU7CiAgICAgICAgIHVpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHZvaWQgKiBtUnNPYmo7CisgICAgICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgICAgIE9iamVjdEJhc2UgKm1Sc09iajsKKyAgICBwdWJsaWM6CisgICAgICAgIGZyaWVuZCBjbGFzcyBGaWxlQTNEOworICAgICAgICBjb25zdCBTdHJpbmc4ICZnZXRPYmplY3ROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PYmplY3ROYW1lOworICAgICAgICB9CisgICAgICAgIFJzQTNEQ2xhc3NJRCBnZXRUeXBlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlOworICAgICAgICB9CiAgICAgfTsKIAotICAgIGJvb2wgbG9hZChDb250ZXh0ICpyc2MsIEZJTEUgKmYpOworICAgIGJvb2wgbG9hZChGSUxFICpmKTsKKyAgICBib29sIGxvYWQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICBzaXplX3QgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgY29uc3Q7CisgICAgY29uc3QgQTNESW5kZXhFbnRyeSogZ2V0SW5kZXhFbnRyeShzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIE9iamVjdEJhc2UgKmluaXRpYWxpemVGcm9tRW50cnkoc2l6ZV90IGluZGV4KTsKKworICAgIHZvaWQgYXBwZW5kVG9GaWxlKE9iamVjdEJhc2UgKm9iaik7CisgICAgYm9vbCB3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisgICAgLy8gQ3VycmVudGx5IGZpbGVzIGRvIG5vdCBnZXQgc2VyaWFsaXplZCwKKyAgICAvLyBidXQgd2UgbmVlZCB0byBpbmhlcml0IGZyb20gT2JqZWN0QmFzZSBmb3IgcmVmIHRyYWNraW5nCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsKKyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOworICAgIH0KIAogcHJvdGVjdGVkOgotICAgIGNsYXNzIElPCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgSU8oY29uc3QgdWludDhfdCAqLCBib29sIHVzZTY0KTsKLSAgICAKLSAgICAgICAgZmxvYXQgbG9hZEYoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7Ci0gICAgICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZihmbG9hdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbG9hZEkzMigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbG9hZFUzMigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDE2X3QgbG9hZFUxNigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDEpICYgKH4xKTsKLSAgICAgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBsb2FkVTgoKSB7Ci0gICAgICAgICAgICB1aW50OF90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDhfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ2NF90IGxvYWRPZmZzZXQoKTsKLSAgICAgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOwotICAgICAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7cmV0dXJuIG1Qb3M7fQotICAgICAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3Q7Ci0gICAgcHJvdGVjdGVkOgotICAgICAgICBjb25zdCB1aW50OF90ICogbURhdGE7Ci0gICAgICAgIHVpbnQ2NF90IG1Qb3M7Ci0gICAgICAgIGJvb2wgbVVzZTY0OwotICAgIH07CiAKLQotICAgIGJvb2wgcHJvY2VzcyhDb250ZXh0ICpyc2MpOwotICAgIGJvb2wgcHJvY2Vzc0luZGV4KENvbnRleHQgKnJzYywgQTNESW5kZXhFbnRyeSAqKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19NZXNoKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfVmVydGljaWVzKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfRWxlbWVudChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKKyAgICB2b2lkIHBhcnNlSGVhZGVyKElTdHJlYW0gKmhlYWRlclN0cmVhbSk7CiAKICAgICBjb25zdCB1aW50OF90ICogbURhdGE7CiAgICAgdm9pZCAqIG1BbGxvYzsKICAgICB1aW50NjRfdCBtRGF0YVNpemU7Ci0gICAgQ29udGV4dCAqIG1Sc2M7CiAKLSAgICBWZWN0b3I8QTNESW5kZXhFbnRyeT4gbUluZGV4OwotICAgIFZlY3RvcjxTdHJpbmc4PiBtU3RyaW5nczsKLSAgICBWZWN0b3I8dWludDMyX3Q+IG1TdHJpbmdJbmRleFZhbHVlczsKKyAgICBPU3RyZWFtICptV3JpdGVTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtV3JpdGVJbmRleDsKIAorICAgIElTdHJlYW0gKm1SZWFkU3RyZWFtOworICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5Kj4gbUluZGV4OwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0MGU2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDY4OSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSBGVF9CSVRNQVBfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitGb250OjpGb250KENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYyksIG1DYWNoZWRHbHlwaHMoTlVMTCkKK3sKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSGFzS2VybmluZyA9IGZhbHNlOworfQorCitib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGZvbnRzRGlyKCIvZm9udHMvIik7CisgICAgU3RyaW5nOCBmdWxsUGF0aChnZXRlbnYoIkFORFJPSURfUk9PVCIpKTsKKyAgICBmdWxsUGF0aCArPSBmb250c0RpcjsKKyAgICBmdWxsUGF0aCArPSBuYW1lOworCisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9OZXdfRmFjZShtUlNDLT5tU3RhdGVGb250Lm1MaWJyYXJ5LCBmdWxsUGF0aC5zdHJpbmcoKSwgMCwgJm1GYWNlKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmb250ICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZvbnROYW1lID0gbmFtZTsKKyAgICBtRm9udFNpemUgPSBmb250U2l6ZTsKKyAgICBtRHBpID0gZHBpOworCisgICAgLy9MT0dFKCJGb250IGluaXRpYWxpemVkOiAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKworICAgIGVycm9yID0gRlRfU2V0X0NoYXJfU2l6ZShtRmFjZSwgZm9udFNpemUgKiA2NCwgMCwgZHBpLCAwKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZvbnQgc2l6ZSBvbiAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1IYXNLZXJuaW5nID0gRlRfSEFTX0tFUk5JTkcobUZhY2UpOworICAgIExPR0UoIktlcm5pbmc6ICVpIiwgbUhhc0tlcm5pbmcpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb250OjppbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSktPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworCisgICAgaW50IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQgblBlblkgPSB5IC0gZ2x5cGgtPm1CaXRtYXBUb3AgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIHN0YXRlLT5hcHBlbmRNZXNoUXVhZChuUGVuWCwgblBlblksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNaW5VLCBnbHlwaC0+bUJpdG1hcE1heFYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCArIChpbnQpZ2x5cGgtPm1CaXRtYXBXaWR0aCwgblBlblksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVLCBnbHlwaC0+bUJpdG1hcE1heFYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCArIChpbnQpZ2x5cGgtPm1CaXRtYXBXaWR0aCwgblBlblkgLSAoaW50KWdseXBoLT5tQml0bWFwSGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tQml0bWFwTWF4VSwgZ2x5cGgtPm1CaXRtYXBNaW5WLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBlblgsIG5QZW5ZIC0gKGludClnbHlwaC0+bUJpdG1hcEhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1pblUsIGdseXBoLT5tQml0bWFwTWluVik7Cit9CisKK3ZvaWQgRm9udDo6cmVuZGVyVVRGKGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnQsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZighbUluaXRpYWxpemVkIHx8IG51bUdseXBocyA9PSAwIHx8IHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHBlblggPSB4LCBwZW5ZID0geTsKKyAgICBpbnQgZ2x5cGhzTGVmdCA9IDE7CisgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIHNpemVfdCBpbmRleCA9IHN0YXJ0OworICAgIHNpemVfdCBuZXh0SW5kZXggPSAwOworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisKKyAgICAgICAgaW50MzJfdCB1dGZDaGFyID0gdXRmMzJfYXQodGV4dCwgbGVuLCBpbmRleCwgJm5leHRJbmRleCk7CisKKyAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgZW5jb3VudGVyZWQKKyAgICAgICAgaWYodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGFycmF5CisgICAgICAgIGluZGV4ID0gbmV4dEluZGV4OworCisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlRm9yKCh1aW50MzJfdCl1dGZDaGFyKTsKKworICAgICAgICBpZihjYWNoZWRHbHlwaCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjYWNoZWRHbHlwaCA9IGNhY2hlR2x5cGgoKHVpbnQzMl90KXV0ZkNoYXIpOworICAgICAgICB9CisgICAgICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgICAgICBpZighY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICB1cGRhdGVHbHlwaENhY2hlKGNhY2hlZEdseXBoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZihjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSk7CisgICAgICAgIH0KKworICAgICAgICBwZW5YICs9IChjYWNoZWRHbHlwaC0+bUFkdmFuY2UueCA+PiA2KTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKQoreworICAgIGlmKCFnbHlwaC0+bUJpdG1hcFZhbGlkKSB7CisKKyAgICAgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBtRmFjZSwgZ2x5cGgtPm1HbHlwaEluZGV4LCBGVF9MT0FEX1JFTkRFUiApOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgTE9HRSgiQ291bGRuJ3QgbG9hZCBnbHlwaC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdseXBoLT5tQWR2YW5jZSA9IG1GYWNlLT5nbHlwaC0+YWR2YW5jZTsKKyAgICAgICAgZ2x5cGgtPm1CaXRtYXBMZWZ0ID0gbUZhY2UtPmdseXBoLT5iaXRtYXBfbGVmdDsKKyAgICAgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF90b3A7CisKKyAgICAgICAgRlRfQml0bWFwICpiaXRtYXAgPSAmbUZhY2UtPmdseXBoLT5iaXRtYXA7CisKKyAgICAgICAgRlRfQml0bWFwX05ldygmZ2x5cGgtPm1CaXRtYXApOworICAgICAgICBGVF9CaXRtYXBfQ29weShtUlNDLT5tU3RhdGVGb250Lm1MaWJyYXJ5LCBiaXRtYXAsICZnbHlwaC0+bUJpdG1hcCk7CisKKyAgICAgICAgZ2x5cGgtPm1CaXRtYXBWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgLy8gTGV0IHRoZSBmb250IHN0YXRlIGZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IHRoZSBiaXRtYXAKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisgICAgZ2x5cGgtPm1Jc1ZhbGlkID0gc3RhdGUtPmNhY2hlQml0bWFwKCZnbHlwaC0+bUJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisKKyAgICBpZighZ2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgZ2x5cGgtPm1CaXRtYXAud2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGdseXBoLT5tQml0bWFwLnJvd3M7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblggPSBzdGFydFg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5ZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBnbHlwaC0+bUJpdG1hcC53aWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcEhlaWdodCA9IGdseXBoLT5tQml0bWFwLnJvd3M7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWSgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KXN0YXJ0WCAvIChmbG9hdCljYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdClzdGFydFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KWVuZFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpZW5kWSAvIChmbG9hdCljYWNoZUhlaWdodDsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvICpGb250OjpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKQoreworICAgIENhY2hlZEdseXBoSW5mbyAqbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KG1GYWNlLCBnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgbmV3R2x5cGgtPm1CaXRtYXBWYWxpZCA9IGZhbHNlOworCisgICAgLy9MT0dFKCJHbHlwaCA9ICVjLCBmYWNlIGluZGV4OiAldSIsICh1bnNpZ25lZCBjaGFyKWdseXBoLCBuZXdHbHlwaC0+bUdseXBoSW5kZXgpOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQgKiBGb250OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gcnNjLT5tU3RhdGVGb250Lm1BY3RpdmVGb250czsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBGb250ICppdGhGb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmKGl0aEZvbnQtPm1Gb250TmFtZSA9PSBuYW1lICYmIGl0aEZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSAmJiBpdGhGb250LT5tRHBpID09IGRwaSkgeworICAgICAgICAgICAgaXRoRm9udC0+aW5jVXNlclJlZigpOworICAgICAgICAgICAgcmV0dXJuIGl0aEZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250ICpuZXdGb250ID0gbmV3IEZvbnQocnNjKTsKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQgPSBuZXdGb250LT5pbml0KG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKGlzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbmV3Rm9udC0+aW5jVXNlclJlZigpOworICAgICAgICBhY3RpdmVGb250cy5wdXNoKG5ld0ZvbnQpOworICAgICAgICByZXR1cm4gbmV3Rm9udDsKKyAgICB9CisKKyAgICBkZWxldGUgbmV3Rm9udDsKKyAgICByZXR1cm4gTlVMTDsKKworfQorCitGb250Ojp+Rm9udCgpCit7CisgICAgaWYobUZhY2UpIHsKKyAgICAgICAgRlRfRG9uZV9GYWNlKG1GYWNlKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgaWYgKG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzW2N0XSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5yZW1vdmVBdChjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmKGdseXBoLT5tQml0bWFwVmFsaWQpIHsKKyAgICAgICAgICAgIEZUX0JpdG1hcF9Eb25lKG1SU0MtPm1TdGF0ZUZvbnQubUxpYnJhcnksICZnbHlwaC0+bUJpdG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKworRm9udFN0YXRlOjpGb250U3RhdGUoKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVJTQyA9IE5VTEw7Cit9CisKK0ZvbnRTdGF0ZTo6fkZvbnRTdGF0ZSgpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisKKyAgICByc0Fzc2VydCghbUFjdGl2ZUZvbnRzLnNpemUoKSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKK3sKKyAgICBGVF9FcnJvciBlcnJvcjsKKworICAgIGlmKCFtTGlicmFyeSkgeworICAgICAgICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoJm1MaWJyYXJ5KTsKKyAgICAgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGZyZWV0eXBlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUlNDID0gcnNjOworCisgICAgbURlZmF1bHQuc2V0KEZvbnQ6OmNyZWF0ZShyc2MsICJEcm9pZFNhbnMudHRmIiwgMTYsIDk2KSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKQoreworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1BY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250U3RhdGU6OmNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpCit7CisgICAgLy8gSWYgdGhlIGdseXBoIGlzIHRvbyB0YWxsLCBkb24ndCBjYWNoZSBpdAorICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCktMV0tPm1NYXhIZWlnaHQpIHsKKyAgICAgICAgTE9HRSgiRm9udCBzaXplIHRvIGxhcmdlIHRvIGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFRyeSB0byBmaXQgaXQgYWdhaW4KKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGZpdCwgc29tZXRoaW5nIGlzIHdyb25nIGFuZCB3ZSBzaG91bGRuJ3QgZHJhdworICAgICAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgICAgICBMT0dFKCJCaXRtYXAgZG9lc24ndCBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLCAoaW50KWJpdG1hcC0+d2lkdGgsIChpbnQpYml0bWFwLT5yb3dzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpyZXRPcmlnaW5YID0gc3RhcnRYOworICAgICpyZXRPcmlnaW5ZID0gc3RhcnRZOworCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIC8vTE9HRSgiQml0bWFwIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLCAoaW50KWJpdG1hcC0+d2lkdGgsIChpbnQpYml0bWFwLT5yb3dzKTsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBnZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKworICAgIHVuc2lnbmVkIGNoYXIgKmNhY2hlQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKW1UZXh0VGV4dHVyZS0+Z2V0UHRyKCk7CisgICAgdW5zaWduZWQgY2hhciAqYml0bWFwQnVmZmVyID0gYml0bWFwLT5idWZmZXI7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBiWCA9IDAsIGNhY2hlWSA9IDAsIGJZID0gMDsKKyAgICBmb3IoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCArKywgYlggKyspIHsKKyAgICAgICAgZm9yKGNhY2hlWSA9IHN0YXJ0WSwgYlkgPSAwOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkgKyssIGJZICsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBiaXRtYXAtPndpZHRoICsgYlhdOworICAgICAgICAgICAgY2FjaGVCdWZmZXJbY2FjaGVZKmNhY2hlV2lkdGggKyBjYWNoZVhdID0gdGVtcENvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBkaXJ0eSB0aGUgdGV4dHVyZSBhbmQgdGhlIHNoYWRlciBzbyBuZXh0IHRpbWUKKyAgICAvLyB3ZSBkcmF3IGl0IHdpbGwgdXBsb2FkIHRoZSBkYXRhCisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKyAgICBtRm9udFNoYWRlckYtPmJpbmRUZXh0dXJlKDAsIG1UZXh0VGV4dHVyZS5nZXQoKSk7CisKKyAgICAvLyBTb21lIGRlYnVnIGNvZGUKKyAgICAvKmZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBMT0dFKCJDYWNoZSBMaW5lOiBIOiAldSBFbXB0eSBTcGFjZTogJWYiLAorICAgICAgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAoMS4wZiAtIChmbG9hdCltQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wvKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGgpKjEwMC4wZik7CisKKyAgICB9Ki8KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFJlbmRlclN0YXRlKCkKK3sKKyAgICB1aW50MzJfdCB0bXBbNV0gPSB7CisgICAgICAgIFJTX1RFWF9FTlZfTU9ERV9SRVBMQUNFLCAxLAorICAgICAgICBSU19URVhfRU5WX01PREVfTk9ORSwgMCwKKyAgICAgICAgMAorICAgIH07CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQobVJTQywgdG1wLCA1KTsKKyAgICBtRm9udFNoYWRlckYuc2V0KHBmKTsKKyAgICBtRm9udFNoYWRlckYtPmluaXQobVJTQyk7CisKKyAgICBTYW1wbGVyICpzYW1wbGVyID0gbmV3IFNhbXBsZXIobVJTQywgUlNfU0FNUExFUl9ORUFSRVNULCBSU19TQU1QTEVSX05FQVJFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVApOworICAgIG1Gb250U2FtcGxlci5zZXQoc2FtcGxlcik7CisgICAgbUZvbnRTaGFkZXJGLT5iaW5kU2FtcGxlcigwLCBzYW1wbGVyKTsKKworICAgIFByb2dyYW1TdG9yZSAqZm9udFN0b3JlID0gbmV3IFByb2dyYW1TdG9yZShtUlNDKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS5zZXQoZm9udFN0b3JlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhGdW5jKFJTX0RFUFRIX0ZVTkNfQUxXQVlTKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0QmxlbmRGdW5jKFJTX0JMRU5EX1NSQ19TUkNfQUxQSEEsIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhNYXNrKGZhbHNlKTsKK30KKwordm9pZCBGb250U3RhdGU6OmluaXRUZXh0VGV4dHVyZSgpCit7CisgICAgY29uc3QgRWxlbWVudCAqYWxwaGFFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfVU5TSUdORURfOCwgUlNfS0lORF9QSVhFTF9BLCB0cnVlLCAxKTsKKworICAgIC8vIFdlIHdpbGwgYWxsb2NhdGUgYSB0ZXh0dXJlIHRvIGluaXRpYWxseSBob2xkIDMyIGNoYXJhY3RlciBiaXRtYXBzCisgICAgVHlwZSAqdGV4VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHRleFR5cGUtPnNldEVsZW1lbnQoYWxwaGFFbGVtKTsKKyAgICB0ZXhUeXBlLT5zZXREaW1YKDEwMjQpOworICAgIHRleFR5cGUtPnNldERpbVkoMjU2KTsKKyAgICB0ZXhUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICpjYWNoZUFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgdGV4VHlwZSk7CisgICAgbVRleHRUZXh0dXJlLnNldChjYWNoZUFsbG9jKTsKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworCisgICAgLy8gU3BsaXQgdXAgb3VyIGNhY2hlIHRleHR1cmUgaW50byBsaW5lcyBvZiBjZXJ0YWluIHdpZHRocworICAgIGludCBuZXh0TGluZSA9IDA7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgxNiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMjQsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgzMiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoNDAsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKHRleFR5cGUtPmdldERpbVkoKSAtIG5leHRMaW5lLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7Cit9CisKKy8vIEF2b2lkIGhhdmluZyB0byByZWFsbG9jYXRlIG1lbW9yeSBhbmQgcmVuZGVyIHF1YWQgYnkgcXVhZAordm9pZCBGb250U3RhdGU6OmluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKQoreworICAgIC8vIE5vdyBsZXRzIHdyaXRlIGluZGV4IGRhdGEKKyAgICBjb25zdCBFbGVtZW50ICppbmRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9VTlNJR05FRF8xNiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgVHlwZSAqaW5kZXhUeXBlID0gbmV3IFR5cGUobVJTQyk7CisgICAgdWludDMyX3QgbnVtSW5kaWNpZXMgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIDY7CisgICAgaW5kZXhUeXBlLT5zZXREaW1YKG51bUluZGljaWVzKTsKKyAgICBpbmRleFR5cGUtPnNldEVsZW1lbnQoaW5kZXhFbGVtKTsKKyAgICBpbmRleFR5cGUtPmNvbXB1dGUoKTsKKworICAgIEFsbG9jYXRpb24gKmluZGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCBpbmRleFR5cGUpOworICAgIHVpbnQxNl90ICppbmRleFB0ciA9ICh1aW50MTZfdCopaW5kZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICAvLyBGb3VyIHZlcnRzLCB0d28gdHJpYW5nbGVzICwgc2l4IGluZGljZXMgcGVyIHF1YWQKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSArKykgeworICAgICAgICBpbnQgaTYgPSBpICogNjsKKyAgICAgICAgaW50IGk0ID0gaSAqIDQ7CisKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAwXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAxXSA9IGk0ICsgMTsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAyXSA9IGk0ICsgMjsKKworICAgICAgICBpbmRleFB0cltpNiArIDNdID0gaTQgKyAwOworICAgICAgICBpbmRleFB0cltpNiArIDRdID0gaTQgKyAyOworICAgICAgICBpbmRleFB0cltpNiArIDVdID0gaTQgKyAzOworICAgIH0KKworICAgIGluZGV4QWxsb2MtPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChtUlNDKTsKKyAgICBtSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworCisgICAgY29uc3QgRWxlbWVudCAqcG9zRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAzKTsKKyAgICBjb25zdCBFbGVtZW50ICp0ZXhFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDIpOworCisgICAgY29uc3QgRWxlbWVudCAqZWxlbUFycmF5WzJdOworICAgIGVsZW1BcnJheVswXSA9IHBvc0VsZW07CisgICAgZWxlbUFycmF5WzFdID0gdGV4RWxlbTsKKworICAgIFN0cmluZzggcG9zTmFtZSgicG9zaXRpb24iKTsKKyAgICBTdHJpbmc4IHRleE5hbWUoInRleHR1cmUwIik7CisKKyAgICBjb25zdCBjaGFyICpuYW1lQXJyYXlbMl07CisgICAgbmFtZUFycmF5WzBdID0gcG9zTmFtZS5zdHJpbmcoKTsKKyAgICBuYW1lQXJyYXlbMV0gPSB0ZXhOYW1lLnN0cmluZygpOworICAgIHNpemVfdCBsZW5ndGhzWzJdOworICAgIGxlbmd0aHNbMF0gPSBwb3NOYW1lLnNpemUoKTsKKyAgICBsZW5ndGhzWzFdID0gdGV4TmFtZS5zaXplKCk7CisKKyAgICBjb25zdCBFbGVtZW50ICp2ZXJ0ZXhEYXRhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCAyLCBlbGVtQXJyYXksIG5hbWVBcnJheSwgbGVuZ3Rocyk7CisKKyAgICBUeXBlICp2ZXJ0ZXhEYXRhVHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXREaW1YKG1NYXhOdW1iZXJPZlF1YWRzICogNCk7CisgICAgdmVydGV4RGF0YVR5cGUtPnNldEVsZW1lbnQodmVydGV4RGF0YUVsZW0pOworICAgIHZlcnRleERhdGFUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHZlcnRleERhdGFUeXBlKTsKKyAgICBtVGV4dE1lc2hQdHIgPSAoZmxvYXQqKXZlcnRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIG1WZXJ0ZXhBcnJheS5zZXQodmVydGV4QWxsb2MpOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFN0YXRlOjpjaGVja0luaXQoKQoreworICAgIGlmKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvKm1UZXh0TWVzaFJlZnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxTaW1wbGVNZXNoPlttTnVtTWVzaGVzXTsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1NZXNoZXM7IGkgKyspeworICAgICAgICBTaW1wbGVNZXNoICp0ZXh0TWVzaCA9IGNyZWF0ZVRleHRNZXNoKCk7CisgICAgICAgIG1UZXh0TWVzaFJlZnNbaV0uc2V0KHRleHRNZXNoKTsKKyAgICB9Ki8KKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppc3N1ZURyYXdDb21tYW5kKCkgeworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXBWKG1SU0MtPmdldFZlcnRleCgpKTsKKyAgICBtUlNDLT5zZXRWZXJ0ZXgobVJTQy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1GcmFnbWVudD4gdG1wRihtUlNDLT5nZXRGcmFnbWVudCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudChtRm9udFNoYWRlckYuZ2V0KCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtU3RvcmU+IHRtcFBTKG1SU0MtPmdldEZyYWdtZW50U3RvcmUoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZShtRm9udFByb2dyYW1TdG9yZS5nZXQoKSk7CisKKyAgICBpZiAoIW1SU0MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCAqdnR4ID0gKGZsb2F0KiltVmVydGV4QXJyYXktPmdldFB0cigpOworICAgIGZsb2F0ICp0ZXggPSB2dHggKyAzOworCisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAzLCAyMCwgZmFsc2UsICh1aW50MzJfdCl2dHgsICJwb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgMjAsIGZhbHNlLCAodWludDMyX3QpdGV4LCAidGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihtUlNDLCAmbVJTQy0+bVN0YXRlVmVydGV4QXJyYXksICZtUlNDLT5tU2hhZGVyQ2FjaGUpOworCisgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhtUlNDKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBtQ3VycmVudFF1YWRJbmRleCAqIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoMCkpOworCisgICAgLy8gUmVzZXQgdGhlIHN0YXRlCisgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKK30KKwordm9pZCBGb250U3RhdGU6OmFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIGNvbnN0IHVpbnQzMl90IHZlcnRzUGVyUXVhZCA9IDQ7CisgICAgY29uc3QgdWludDMyX3QgZmxvYXRzUGVyVmVydCA9IDU7CisgICAgZmxvYXQgKmN1cnJlbnRQb3MgPSBtVGV4dE1lc2hQdHIgKyBtQ3VycmVudFF1YWRJbmRleCAqIHZlcnRzUGVyUXVhZCAqIGZsb2F0c1BlclZlcnQ7CisKKyAgICAvLyBDdWxsIHRoaW5ncyB0aGF0IGFyZSBvZmYgdGhlIHNjcmVlbgorICAgIGZsb2F0IHdpZHRoID0gKGZsb2F0KW1SU0MtPmdldFdpZHRoKCk7CisgICAgZmxvYXQgaGVpZ2h0ID0gKGZsb2F0KW1SU0MtPmdldEhlaWdodCgpOworCisgICAgaWYoeDEgPiB3aWR0aCB8fCB5MSA8IDAuMGYgfHwgeDIgPCAwIHx8IHk0ID4gaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKkxPR0UoIlYwIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDEsIHkxLCB6MSk7CisgICAgTE9HRSgiVjEgeDogJWYgeTogJWYgejogJWYiLCB4MiwgeTIsIHoyKTsKKyAgICBMT0dFKCJWMiB4OiAlZiB5OiAlZiB6OiAlZiIsIHgzLCB5MywgejMpOworICAgIExPR0UoIlYzIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDQsIHk0LCB6NCk7Ki8KKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXggKys7CisKKyAgICBpZihtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnRJbmRleCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nOCB0ZXh0OCh0ZXh0KTsKKworICAgIC8vIFJlbmRlciBjb2RlIGhlcmUKKyAgICBGb250ICpjdXJyZW50Rm9udCA9IG1SU0MtPmdldEZvbnQoKTsKKyAgICBjdXJyZW50Rm9udC0+cmVuZGVyVVRGKHRleHQsIGxlbiwgc3RhcnRJbmRleCwgbnVtR2x5cGhzLCB4LCB5KTsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgc2l6ZV90IHRleHRMZW4gPSBzdHJsZW4odGV4dCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCB0ZXh0TGVuLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYoIWFsbG9jKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJlbmRlclRleHQodGV4dCwgYWxsb2NTaXplLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzdGFydCwgaW50IGxlbiwgaW50IHgsIGludCB5KQoreworICAgIGlmKCFhbGxvYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciAqdGV4dCA9IChjb25zdCBjaGFyICopYWxsb2MtPmdldFB0cigpOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICByZW5kZXJUZXh0KHRleHQsIGFsbG9jU2l6ZSwgc3RhcnQsIGxlbiwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIGlmKG1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIG1MaWJyYXJ5ICk7CisgICAgfQorCisgICAgZGVsZXRlIG1EZWZhdWx0LmdldCgpOworICAgIG1EZWZhdWx0LmNsZWFyKCk7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0ZvbnQgcnNpX0ZvbnRDcmVhdGVGcm9tRmlsZShDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgcmV0dXJuIEZvbnQ6OmNyZWF0ZShyc2MsIG5hbWUsIGZvbnRTaXplLCBkcGkpOworfQorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5oIGIvbGlicy9ycy9yc0ZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE1NTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0ZvbnQuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19GT05UX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19GT05UX0gKKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIEZvbnRTdGF0ZTsKKworY2xhc3MgRm9udCA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkZvbnQoKTsKKworICAgIC8vIFBvaW50ZXIgdG8gdGhlIHV0ZiBkYXRhLCBsZW5ndGggb2YgZGF0YSwgd2hlcmUgdG8gc3RhcnQsIG51bWJlciBvZiBnbHlwaHMgb3QgcmVhZAorICAgIC8vIChlYWNoIGdseXBoIG1heSBiZSBsb25nZXIgdGhhbiBhIGNoYXIgYmVjYXVzZSB3ZSBhcmUgZGVhbGluZyB3aXRoIHV0ZiBkYXRhKQorICAgIC8vIExhc3QgdHdvIHZhcmlhYmxlcyBhcmUgdGhlIGluaXRpYWwgcGVuIHBvc2l0aW9uCisgICAgdm9pZCByZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KTsKKworICAgIC8vIEN1cnJlbnRseSBmaWxlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQsCisgICAgLy8gYnV0IHdlIG5lZWQgdG8gaW5oZXJpdCBmcm9tIE9iamVjdEJhc2UgZm9yIHJlZiB0cmFja2luZworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCB7CisgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzdGF0aWMgRm9udCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpOworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udFN0YXRlOworCisgICAgdm9pZCBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgc3RydWN0IENhY2hlZEdseXBoSW5mbworICAgIHsKKyAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPworICAgICAgICBib29sIG1Jc1ZhbGlkOworICAgICAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2FjaGVkIGdseXBoIGluIHRoZSBiaXRtYXAKKyAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgdGV4dHVyZQorICAgICAgICB1aW50MzJfdCBtQml0bWFwTWluWDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblk7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcEhlaWdodDsKKyAgICAgICAgLy8gQWxzbyBjYWNoZSB0ZXh0dXJlIGNvb3JkcyBmb3IgdGhlIHF1YWQKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5WOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFY7CisgICAgICAgIC8vIE1pbmltaXplIGhvdyBtdWNoIHdlIGNhbGwgZnJlZXR5cGUKKyAgICAgICAgRlRfVUludCBtR2x5cGhJbmRleDsKKyAgICAgICAgRlRfVmVjdG9yIG1BZHZhbmNlOworICAgICAgICAvLyBWYWx1ZXMgYmVsb3cgY29udGFpbiBhIGdseXBoJ3Mgb3JpZ2luIGluIHRoZSBiaXRtYXAKKyAgICAgICAgRlRfSW50IG1CaXRtYXBMZWZ0OworICAgICAgICBGVF9JbnQgbUJpdG1hcFRvcDsKKyAgICAgICAgLy8gSG9sZCBvbiB0byB0aGUgYml0bWFwIGluIGNhc2UgY2FjaGUgaXMgaW52YWxpZGF0ZWQKKyAgICAgICAgRlRfQml0bWFwIG1CaXRtYXA7CisgICAgICAgIGJvb2wgbUJpdG1hcFZhbGlkOworICAgIH07CisKKyAgICBTdHJpbmc4IG1Gb250TmFtZTsKKyAgICB1aW50MzJfdCBtRm9udFNpemU7CisgICAgdWludDMyX3QgbURwaTsKKworICAgIEZvbnQoQ29udGV4dCAqcnNjKTsKKyAgICBib29sIGluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSk7CisKKyAgICBGVF9GYWNlIG1GYWNlOworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUhhc0tlcm5pbmc7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8dWludDMyX3QsIENhY2hlZEdseXBoSW5mbyogPiBtQ2FjaGVkR2x5cGhzOworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5KTsKK307CisKK2NsYXNzIEZvbnRTdGF0ZQoreworcHVibGljOgorICAgIEZvbnRTdGF0ZSgpOworICAgIH5Gb250U3RhdGUoKTsKKworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUxhc3Q7CisKKyAgICB2b2lkIHJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHN0YXJ0LCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpOworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lCisgICAgeworICAgICAgICB1aW50MzJfdCBtTWF4SGVpZ2h0OworICAgICAgICB1aW50MzJfdCBtTWF4V2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Um93OworICAgICAgICB1aW50MzJfdCBtQ3VycmVudENvbDsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQzMl90IG1heEhlaWdodCwgdWludDMyX3QgbWF4V2lkdGgsIHVpbnQzMl90IGN1cnJlbnRSb3csIHVpbnQzMl90IGN1cnJlbnRDb2wpIDoKKyAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwgbU1heFdpZHRoKG1heFdpZHRoKSwgbUN1cnJlbnRSb3coY3VycmVudFJvdyksIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihtQ3VycmVudENvbCArICh1aW50MzJfdCliaXRtYXAtPndpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWCA9IG1DdXJyZW50Q29sOworICAgICAgICAgICAgICAgKnJldE9yaWdpblkgPSBtQ3VycmVudFJvdzsKKyAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGJpdG1hcC0+d2lkdGg7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIFZlY3RvcjxDYWNoZVRleHR1cmVMaW5lKj4gbUNhY2hlTGluZXM7CisKKyAgICBDb250ZXh0ICptUlNDOworCisgICAgLy8gRnJlZSB0eXBlIGxpYnJhcnksIHdlIG9ubHkgbmVlZCBvbmUgY29weQorICAgIEZUX0xpYnJhcnkgbUxpYnJhcnk7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBSZW5kZXIgc3RhdGUgZm9yIHRoZSBmb250CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1Gb250U2hhZGVyRjsKKyAgICBPYmplY3RCYXNlUmVmPFNhbXBsZXI+IG1Gb250U2FtcGxlcjsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZvbnRQcm9ncmFtU3RvcmU7CisgICAgdm9pZCBpbml0UmVuZGVyU3RhdGUoKTsKKworICAgIC8vIFRleHR1cmUgdG8gY2FjaGUgZ2x5cGggYml0bWFwcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVRleHRUZXh0dXJlOworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisKKyAgICBib29sIGNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpOworICAgIGNvbnN0IFR5cGUqIGdldENhY2hlVGV4dHVyZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dFRleHR1cmUtPmdldFR5cGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgLy8gUG9pbnRlciB0byB2ZXJ0ZXggZGF0YSB0byBzcGVlZCB1cCBmcmFtZSB0byBmcmFtZSB3b3JrCisgICAgZmxvYXQgKm1UZXh0TWVzaFB0cjsKKyAgICB1aW50MzJfdCBtQ3VycmVudFF1YWRJbmRleDsKKyAgICB1aW50MzJfdCBtTWF4TnVtYmVyT2ZRdWFkczsKKworICAgIHZvaWQgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVZlcnRleEFycmF5OworCisKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKworICAgIHZvaWQgY2hlY2tJbml0KCk7CisKKyAgICB2b2lkIGlzc3VlRHJhd0NvbW1hbmQoKTsKKworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KTsKKworfTsKKworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0hhbmRjb2RlLmggYi9saWJzL3JzL3JzSGFuZGNvZGUuaAppbmRleCA4MDBlZGRkLi4zNTNiNzNhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzSGFuZGNvZGUuaAorKysgYi9saWJzL3JzL3JzSGFuZGNvZGUuaApAQCAtMSw2ICsxLDU3IEBACiAKICNkZWZpbmUgREFUQV9TWU5DX1NJWkUgMTAyNAogCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9Db250ZXh0RmluaXNoIChSc0NvbnRleHQgcnNjKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfQ29udGV4dEZpbmlzaCk7CisgICAgUlNfQ01EX0NvbnRleHRGaW5pc2ggKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9Db250ZXh0RmluaXNoICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX0NvbnRleHRGaW5pc2gsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9TY3JpcHRJbnZva2VWIChSc0NvbnRleHQgcnNjLCBSc1NjcmlwdCB2YSwgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX1NjcmlwdEludm9rZVYpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfU2NyaXB0SW52b2tlViAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX1NjcmlwdEludm9rZVYgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT5zID0gdmE7CisgICAgY21kLT5zbG90ID0gc2xvdDsKKyAgICBjbWQtPmRhdGFMZW4gPSBzaXplQnl0ZXM7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdFNldFZhclYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0U2V0VmFyVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRTZXRWYXJWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0U2V0VmFyViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0FsbG9jYXRpb25EYXRhIChSc0NvbnRleHQgcnNjLCBSc0FsbG9jYXRpb24gdmEsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMaWdodC5jcHAgYi9saWJzL3JzL3JzTGlnaHQuY3BwCmluZGV4IDZmMmNmM2UuLmVhYjlhMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMaWdodC5jcHAKKysrIGIvbGlicy9ycy9yc0xpZ2h0LmNwcApAQCAtMTQsOSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC02NSw2ICs2OSwxNiBAQAogICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBudW0sIEdMX1BPU0lUSU9OLCBtUG9zaXRpb24pOwogfQogCit2b2lkIExpZ2h0OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitMaWdodCAqTGlnaHQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIExpZ2h0U3RhdGU6OkxpZ2h0U3RhdGUoKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmggYi9saWJzL3JzL3JzTGlnaHQuaAppbmRleCBkODc5NmU2Li5iZDU4OTc5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTGlnaHQuaAorKysgYi9saWJzL3JzL3JzTGlnaHQuaApAQCAtMzcsNiArMzcsOSBAQAogICAgIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CiAKICAgICB2b2lkIHNldHVwR0wodWludDMyX3QgbnVtKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9MSUdIVDsgfQorICAgIHN0YXRpYyBMaWdodCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICBmbG9hdCBtQ29sb3JbNF07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCmluZGV4IGM3OTY1MjAuLjc2Y2EzMmUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKIExvY2tsZXNzQ29tbWFuZEZpZm86OkxvY2tsZXNzQ29tbWFuZEZpZm8oKQogewpAQCAtMTI4LDE1ICsxMjgsMTkgQEAKICAgICAvL2R1bXBTdGF0ZSgiZmx1c2ggMiIpOwogfQogCit2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OndhaXQoKQoreworICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKKyAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLndhaXQoKTsKKyAgICB9Cit9CisKIGNvbnN0IHZvaWQgKiBMb2NrbGVzc0NvbW1hbmRGaWZvOjpnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpCiB7CiAgICAgd2hpbGUoMSkgewogICAgICAgICAvL2R1bXBTdGF0ZSgiZ2V0Iik7Ci0gICAgICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKLSAgICAgICAgICAgIG1TaWduYWxUb0NvbnRyb2wuc2V0KCk7Ci0gICAgICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOwotICAgICAgICB9Ci0KKyAgICAgICAgd2FpdCgpOwogICAgICAgICBpZiAobUluU2h1dGRvd24pIHsKICAgICAgICAgICAgICpjb21tYW5kID0gMDsKICAgICAgICAgICAgICpieXRlc0RhdGEgPSAwOwpAQCAtMTkyLDc5ICsxOTYsMyBAQAogICAgIExPR1YoIiVzICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwogfQogCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OlNpZ25hbCgpCi17Ci0gICAgbVNldCA9IHRydWU7Ci19Ci0KLUxvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6flNpZ25hbCgpCi17Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKLX0KLQotYm9vbCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OmluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOwotICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OnNldCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TZXQgPSB0cnVlOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjp3YWl0KCkKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW1TZXQpIHsKLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1TZXQgPSBmYWxzZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaAppbmRleCBkMGE0MzU2Li5hZTkwNmNhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCkBAIC0xOSw4ICsxOSwxMCBAQAogCiAKICNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNTaWduYWwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIAogLy8gQSBzaW1wbGUgRklGTyB0byBiZSB1c2VkIGFzIGEgcHJvZHVjZXIgLyBjb25zdW1lciBiZXR3ZWVuIHR3bwpAQCAtMzcsMjQgKzM5LDcgQEAKICAgICBMb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAgICAgfkxvY2tsZXNzQ29tbWFuZEZpZm8oKTsKIAotCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgU2lnbmFsIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNpZ25hbCgpOwotICAgICAgICB+U2lnbmFsKCk7Ci0KLSAgICAgICAgYm9vbCBpbml0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXQoKTsKLSAgICAgICAgdm9pZCB3YWl0KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGJvb2wgbVNldDsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSAgICAgICAgcHRocmVhZF9jb25kX3QgbUNvbmRpdGlvbjsKLSAgICB9OwotCiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1QdXQ7CiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1HZXQ7CiAgICAgdWludDhfdCAqIG1CdWZmZXI7CkBAIC02NSwxNCArNTAsMTQgQEAKICAgICBTaWduYWwgbVNpZ25hbFRvV29ya2VyOwogICAgIFNpZ25hbCBtU2lnbmFsVG9Db250cm9sOwogCi0KLQogcHVibGljOgogICAgIHZvaWQgKiByZXNlcnZlKHVpbnQzMl90IGJ5dGVzKTsKICAgICB2b2lkIGNvbW1pdCh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXRTeW5jKHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHdhaXQoKTsKKwogICAgIGNvbnN0IHZvaWQgKiBnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpOwogICAgIHZvaWQgbmV4dCgpOwogCkBAIC04OCw0ICs3Myw1IEBACiAKIAogfQorfQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5jcHAgYi9saWJzL3JzL3JzTWVzaC5jcHAKaW5kZXggZDU5NWI0ZS4uYmQ5Y2QyNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guY3BwCisrKyBiL2xpYnMvcnMvcnNNZXNoLmNwcApAQCAtMTQsMTQgKzE0LDIzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgorCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KIE1lc2g6Ok1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKQEAgLTM2LDYgKzQ1LDE2MiBAQAogewogfQogCit2b2lkIE1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIHN0cmVhbS0+YWRkVTMyKG1WZXJ0aWNpZXNDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRpY2llc0NvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgVmVydGljaWVzX3QgKnZlcnRzID0gbVZlcnRpY2llc1t2Q291bnRdOworCisgICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50KTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGFDb3VudCA9IDA7IGFDb3VudCA8IHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50OyBhQ291bnQrKykgeworICAgICAgICAgICAgdmVydHMtPm1BbGxvY2F0aW9uc1thQ291bnRdLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bVZlcnRleERhdGFTaXplKTsKKworICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bU9mZnNldENvb3JkKTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1PZmZzZXRUZXgpOworICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bU9mZnNldE5vcm0pOworCisgICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tU2l6ZUNvb3JkKTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1TaXplVGV4KTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1TaXplTm9ybSApOworICAgIH0KKworICAgIHN0cmVhbS0+YWRkVTMyKG1QcmltaXRpdmVzQ291bnQpOworICAgIC8vIFN0b3JlIHRoZSBwcmltaXRpdmVzCisgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgUHJpbWl0aXZlX3QgKiBwcmltID0gbVByaW1pdGl2ZXNbcENvdW50XTsKKworICAgICAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KXByaW0tPm1UeXBlKTsKKworICAgICAgICAvLyBXZSBzdG9yZSB0aGUgaW5kZXggdG8gdGhlIHZlcnRpY2VzCisgICAgICAgIC8vIFNvIGl0ZXJhdGUgb3ZlciBvdXIgdmVydGljZXMgdG8gZmluZCB3aGljaCBvbmUgd2UgcG9pbnQgdG8KKyAgICAgICAgdWludDMyX3QgdmVydGV4SW5kZXggPSAwOworICAgICAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRpY2llc0NvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgICAgIGlmKHByaW0tPm1WZXJ0aWNpZXMgPT0gbVZlcnRpY2llc1t2Q291bnRdKSB7CisgICAgICAgICAgICAgICAgdmVydGV4SW5kZXggPSB2Q291bnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydGV4SW5kZXgpOworCisgICAgICAgIHN0cmVhbS0+YWRkVTMyKHByaW0tPm1JbmRleENvdW50KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bUluZGV4Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTE2KHByaW0tPm1JbmRpY2llc1tjdF0pOworICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIocHJpbS0+bVJlc3RhcnRDb3VudHMpOworICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBwcmltLT5tUmVzdGFydENvdW50czsgY3QrKykgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMTYocHJpbS0+bVJlc3RhcnRzW2N0XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lc2ggKk1lc2g6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9NRVNIKSB7CisgICAgICAgIExPR0UoIm1lc2ggbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE1lc2ggKiBtZXNoID0gbmV3IE1lc2gocnNjKTsKKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworICAgIG1lc2gtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgbWVzaC0+bVZlcnRpY2llc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVZlcnRpY2llc0NvdW50KSB7CisgICAgICAgIG1lc2gtPm1WZXJ0aWNpZXMgPSBuZXcgVmVydGljaWVzX3QgKlttZXNoLT5tVmVydGljaWVzQ291bnRdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWVzaC0+bVZlcnRpY2llcyA9IE5VTEw7CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0aWNpZXNDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgIFZlcnRpY2llc190ICp2ZXJ0cyA9IG5ldyBWZXJ0aWNpZXNfdCgpOworICAgICAgICAvLyBTdG9yZSBvdXIgdmVydGljZXMgb25lIHRoZSBtZXNoCisgICAgICAgIG1lc2gtPm1WZXJ0aWNpZXNbdkNvdW50XSA9IHZlcnRzOworCisgICAgICAgIHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIHZlcnRzLT5tQWxsb2NhdGlvbnMgPSBuZXcgQWxsb2NhdGlvbiAqW3ZlcnRzLT5tQWxsb2NhdGlvbkNvdW50XTsKKworICAgICAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfVmVydGljaWVzIGNvdW50ICVpIiwgdmVydHMtPm1BbGxvY2F0aW9uQ291bnQpOworICAgICAgICBmb3IgKHVpbnQzMl90IGFDb3VudCA9IDA7IGFDb3VudCA8IHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50OyBhQ291bnQrKykgeworICAgICAgICAgICAgdmVydHMtPm1BbGxvY2F0aW9uc1thQ291bnRdID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgdmVydHMtPm1WZXJ0ZXhEYXRhU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgICAgIHZlcnRzLT5tT2Zmc2V0Q29vcmQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgdmVydHMtPm1PZmZzZXRUZXggPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgdmVydHMtPm1PZmZzZXROb3JtID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICAgICAgdmVydHMtPm1TaXplQ29vcmQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgdmVydHMtPm1TaXplVGV4ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIHZlcnRzLT5tU2l6ZU5vcm0gPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB9CisKKyAgICBtZXNoLT5tUHJpbWl0aXZlc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBtZXNoLT5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVfdCAqW21lc2gtPm1QcmltaXRpdmVzQ291bnRdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXMgPSBOVUxMOworICAgIH0KKworICAgIC8vIGxvYWQgYWxsIHByaW1pdGl2ZXMKKyAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1lc2gtPm1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgeworICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7CisgICAgICAgIG1lc2gtPm1QcmltaXRpdmVzW3BDb3VudF0gPSBwcmltOworCisgICAgICAgIHByaW0tPm1UeXBlID0gKFJzUHJpbWl0aXZlKXN0cmVhbS0+bG9hZFU4KCk7CisKKyAgICAgICAgLy8gV2Ugc3RvcmUgdGhlIGluZGV4IHRvIHRoZSB2ZXJ0aWNlcworICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhJbmRleCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZih2ZXJ0ZXhJbmRleCA8IG1lc2gtPm1WZXJ0aWNpZXNDb3VudCkgeworICAgICAgICAgICAgcHJpbS0+bVZlcnRpY2llcyA9IG1lc2gtPm1WZXJ0aWNpZXNbdmVydGV4SW5kZXhdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbS0+bVZlcnRpY2llcyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwcmltLT5tSW5kZXhDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZihwcmltLT5tSW5kZXhDb3VudCl7CisgICAgICAgICAgICBwcmltLT5tSW5kaWNpZXMgPSBuZXcgdWludDE2X3RbcHJpbS0+bUluZGV4Q291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bUluZGV4Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgICAgICBwcmltLT5tSW5kaWNpZXNbY3RdID0gc3RyZWFtLT5sb2FkVTE2KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmltLT5tSW5kaWNpZXMgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcHJpbS0+bVJlc3RhcnRDb3VudHMgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgaWYgKHByaW0tPm1SZXN0YXJ0Q291bnRzKSB7CisgICAgICAgICAgICBwcmltLT5tUmVzdGFydHMgPSBuZXcgdWludDE2X3RbcHJpbS0+bVJlc3RhcnRDb3VudHNdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKKyAgICAgICAgICAgICAgICBwcmltLT5tUmVzdGFydHNbY3RdID0gc3RyZWFtLT5sb2FkVTE2KCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW0tPm1SZXN0YXJ0cyA9IE5VTEw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBtZXNoOworfQogCiAKIE1lc2hDb250ZXh0OjpNZXNoQ29udGV4dCgpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5oIGIvbGlicy9ycy9yc01lc2guaAppbmRleCA1MjAxYWJkLi44YzdlOGE0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5oCisrKyBiL2xpYnMvcnMvcnNNZXNoLmgKQEAgLTYyLDE1ICs2MiwxNyBAQAogICAgICAgICB1aW50MTZfdCAqbVJlc3RhcnRzOwogICAgIH07CiAKLSAgICBWZXJ0aWNpZXNfdCAqIG1WZXJ0aWNpZXM7CisgICAgVmVydGljaWVzX3QgKiogbVZlcnRpY2llczsKICAgICB1aW50MzJfdCBtVmVydGljaWVzQ291bnQ7CiAKICAgICBQcmltaXRpdmVfdCAqKiBtUHJpbWl0aXZlczsKICAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OwogCi0KLQogICAgIHZvaWQgYW5hbHl6ZUVsZW1lbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9NRVNIOyB9CisgICAgc3RhdGljIE1lc2ggKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiB9OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTXV0ZXguY3BwIGIvbGlicy9ycy9yc011dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc1MmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzTXV0ZXguaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK011dGV4OjpNdXRleCgpCit7Cit9CisKK011dGV4Ojp+TXV0ZXgoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKK30KKworYm9vbCBNdXRleDo6aW5pdCgpCit7CisgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4OjpNdXRleCBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6bG9jaygpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDogZXJyb3IgJWkgbG9ja2luZy4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE11dGV4Ojp1bmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleCBlcnJvciAlaSB1bmxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9saWJzL3JzL3JzTXV0ZXguaApzaW1pbGFyaXR5IGluZGV4IDY5JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gbGlicy9ycy9yc011dGV4LmgKaW5kZXggNTY3ZDU3ZmEuLjQ3NzI1ZDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgYi9saWJzL3JzL3JzTXV0ZXguaApAQCAtMTQsMjQgKzE0LDMwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKyNpZm5kZWYgQU5EUk9JRF9SU19NVVRFWF9ICisjZGVmaW5lIEFORFJPSURfUlNfTVVURVhfSAogCiAKLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKLSAgICB9CisjaW5jbHVkZSAicnNVdGlscy5oIgogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgTXV0ZXggeworcHVibGljOgorICAgIE11dGV4KCk7CisgICAgfk11dGV4KCk7CisKKyAgICBib29sIGluaXQoKTsKKyAgICBib29sIGxvY2soKTsKKyAgICBib29sIHVubG9jaygpOworCitwcm90ZWN0ZWQ6CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKK307CisKK30KIH0KIAotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuY3BwIGIvbGlicy9ycy9yc05vaXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0ZGMxYS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTm9pc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub2lzZSBmdW5jdGlvbnMgd2FzIHBvcnRlZCBmcm9tIHRoZSBKYXZhCi0gKiBpbXBsZW1lbnRhdGlvbiBieSBKZXJyeSBIdXh0YWJsZSAoaHR0cDovL3d3dy5qaGxhYnMuY29tKSB1bmRlcgotICogQXBhY2hlIExpY2Vuc2UgMi4wIChzZWUgaHR0cDovL2pobGFicy5jb20vaXAvZmlsdGVycy9kb3dubG9hZC5odG1sKQotICoKLSAqIE9yaWdpbmFsIGhlYWRlcjoKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBKZXJyeSBIdXh0YWJsZQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNOb2lzZS5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLSNkZWZpbmUgQiAweDEwMAotI2RlZmluZSBCTSAweGZmCi0jZGVmaW5lIE4gMHgxMDAwCi0KLXN0YXRpYyBpbnQgcFtCICsgQiArIDJdOwotc3RhdGljIGZsb2F0IGczW0IgKyBCICsgMl1bM107Ci1zdGF0aWMgZmxvYXQgZzJbQiArIEIgKyAyXVsyXTsKLXN0YXRpYyBmbG9hdCBnMVtCICsgQiArIDJdOwotc3RhdGljIGJvb2wgbm9pc2Vfc3RhcnQgPSB0cnVlOwotCi0jZGVmaW5lIGxlcnBmKHN0YXJ0LCBzdG9wLCBhbW91bnQpIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQKLQotc3RhdGljIGlubGluZSBmbG9hdCBub2lzZV9zQ3VydmUoZmxvYXQgdCkKLXsKLSAgICByZXR1cm4gdCAqIHQgKiAoMy4wZiAtIDIuMGYgKiB0KTsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSArIHZbMl0gKiB2WzJdKTsKLSAgICB2WzBdID0gdlswXSAvIHM7Ci0gICAgdlsxXSA9IHZbMV0gLyBzOwotICAgIHZbMl0gPSB2WzJdIC8gczsKLX0KLQotc3RhdGljIHZvaWQgbm9pc2VfaW5pdCgpCi17Ci0gICAgaW50IGksIGosIGs7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEI7IGkrKykgewotICAgICAgICBwW2ldID0gaTsKLSAgICAgICAgCi0gICAgICAgIGcxW2ldID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgZzJbaV1bal0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgU0Nfbm9ybWFsaXplZjIoZzJbaV0pOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYzKGczW2ldKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gQi0xOyBpID49IDA7IGktLSkgewotICAgICAgICBrID0gcFtpXTsKLSAgICAgICAgcFtpXSA9IHBbaiA9IHJhbmQoKSAlIEJdOwotICAgICAgICBwW2pdID0gazsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEIgKyAyOyBpKyspIHsKLSAgICAgICAgcFtCICsgaV0gPSBwW2ldOwotICAgICAgICBnMVtCICsgaV0gPSBnMVtpXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW0IgKyBpXVtqXSA9IGcyW2ldW2pdOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgZzNbQiArIGldW2pdID0gZzNbaV1bal07Ci0gICAgfQotfQotCi1mbG9hdCBTQ19ub2lzZWYoZmxvYXQgeCkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHN4LCB0LCB1LCB2OwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICAKLSAgICB1ID0gcngwICogZzFbcFtieDBdXTsKLSAgICB2ID0gcngxICogZzFbcFtieDFdXTsKLSAgICByZXR1cm4gMi4zZiAqIGxlcnBmKHUsIHYsIHN4KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMihmbG9hdCB4LCBmbG9hdCB5KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGIwMCwgYjEwLCBiMDEsIGIxMTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgcnkwLCByeTEsIHN4LCBzeSwgYSwgYiwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotCQotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgaSA9IHBbYngwXTsKLSAgICBqID0gcFtieDFdOwotICAgIAotICAgIGIwMCA9IHBbaSArIGJ5MF07Ci0gICAgYjEwID0gcFtqICsgYnkwXTsKLSAgICBiMDEgPSBwW2kgKyBieTFdOwotICAgIGIxMSA9IHBbaiArIGJ5MV07Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICBzeSA9IG5vaXNlX3NDdXJ2ZShyeTApOwotICAgIAotICAgIHEgPSBnMltiMDBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMF07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXTsKLSAgICBhID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHEgPSBnMltiMDFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXTsKLSAgICBiID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGEsIGIsIHN5KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGJ6MCwgYnoxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCByejAsIHJ6MSwgc3ksIHN6LCBhLCBiLCBjLCBkLCB0LCB1LCB2OwotICAgIGZsb2F0ICpxOwotICAgIGludCBpLCBqOwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgdCA9IHkgKyBOOwotICAgIGJ5MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnkxID0gKGJ5MCsxKSAmIEJNOwotICAgIHJ5MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnkxID0gcnkwIC0gMS4wZjsKLQkKLSAgICB0ID0geiArIE47Ci0gICAgYnowID0gKChpbnQpdCkgJiBCTTsKLSAgICBiejEgPSAoYnowKzEpICYgQk07Ci0gICAgcnowID0gdCAtIChpbnQpdDsKLSAgICByejEgPSByejAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHQgID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICBzeiA9IG5vaXNlX3NDdXJ2ZShyejApOwotICAgIAotICAgIHEgPSBnM1tiMDAgKyBiejBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIHEgPSBnM1tiMTAgKyBiejBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIGEgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBxID0gZzNbYjAxICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjExICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBiID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgYyA9IGxlcnBmKGEsIGIsIHN5KTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnoxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnoxXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGQgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcmV0dXJuIDEuNWYqbGVycGYoYywgZCwgc3opOwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjIoZiAqIHgsIGYgKiB5KSkgLyBmOwotICAgIHJldHVybiB0OwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjMoZiAqIHgsIGYgKiB5LCBmICogeikpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5oIGIvbGlicy9ycy9yc05vaXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDA3NTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX05PSVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19OT0lTRV9ICi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKTsKLXZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKTsKLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KTsKLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSk7Ci1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpOwotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCmluZGV4IDY3NzQxM2UuLjQ4ZjFmZWUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKQEAgLTE1LDcgKzE1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNCw3ICsyOSw2IEBACiB7CiAgICAgbVVzZXJSZWZDb3VudCA9IDA7CiAgICAgbVN5c1JlZkNvdW50ID0gMDsKLSAgICBtTmFtZSA9IE5VTEw7CiAgICAgbVJTQyA9IE5VTEw7CiAgICAgbU5leHQgPSBOVUxMOwogICAgIG1QcmV2ID0gTlVMTDsKQEAgLTM5LDE0ICs0MywxMyBAQAogICAgIHJzQXNzZXJ0KCFtVXNlclJlZkNvdW50KTsKICAgICByc0Fzc2VydCghbVN5c1JlZkNvdW50KTsKICAgICByZW1vdmUoKTsKLSAgICBkZWxldGVbXSBtTmFtZTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpkdW1wTE9HVihjb25zdCBjaGFyICpvcCkgY29uc3QKIHsKLSAgICBpZiAobU5hbWUpIHsKKyAgICBpZiAobU5hbWUuc2l6ZSgpKSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuYW1lICVzLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKLSAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKKyAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUuc3RyaW5nKCksIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbm8tbmFtZSwgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCiAgICAgICAgICAgICAgb3AsIHRoaXMsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKQEAgLTExMywxOCArMTE2LDEyIEBACiAKIHZvaWQgT2JqZWN0QmFzZTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKQogewotICAgIHNldE5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICBtTmFtZS5zZXRUbyhuYW1lKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKLSAgICBkZWxldGUgbU5hbWU7Ci0gICAgbU5hbWUgPSBOVUxMOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgICAgIG1lbWNweShtTmFtZSwgbmFtZSwgbGVuKTsKLSAgICAgICAgbU5hbWVbbGVuXSA9IDA7Ci0gICAgfQorICAgIG1OYW1lLnNldFRvKG5hbWUsIGxlbik7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6YWRkKCkgY29uc3QKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmggYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCmluZGV4IGJiMDNiODcuLmFkOTViODEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIGNsYXNzIENvbnRleHQ7CitjbGFzcyBPU3RyZWFtOwogCiAvLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgogY2xhc3MgT2JqZWN0QmFzZQpAQCAtNDAsNyArNDEsNyBAQAogICAgIGJvb2wgemVyb1VzZXJSZWYoKSBjb25zdDsKIAogICAgIGNvbnN0IGNoYXIgKiBnZXROYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIHJldHVybiBtTmFtZS5zdHJpbmcoKTsKICAgICB9CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKik7CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKiwgdWludDMyX3QgbGVuKTsKQEAgLTUyLDYgKzUzLDggQEAKICAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKENvbnRleHQgKnJzYyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICptQWxsb2NGaWxlOwpAQCAtNjQsNyArNjcsNyBAQAogCiAgICAgYm9vbCBjaGVja0RlbGV0ZSgpIGNvbnN0OwogCi0gICAgY2hhciAqIG1OYW1lOworICAgIFN0cmluZzggbU5hbWU7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1TeXNSZWZDb3VudDsKICAgICBtdXRhYmxlIGludDMyX3QgbVVzZXJSZWZDb3VudDsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCmluZGV4IDcwZTI4NjguLmM0ZjhiMmUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtLmgiCi0KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCmluZGV4IGMxN2I5NGMuLmNiZTMzYzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODMsMTIgKzg5LDE1IEBACiAKICAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CiAgICAgICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjFfMSgpKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QgLy8gVGhlc2UgYXJlIEdMRVMgb25seQogICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewogICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBnbFRleEVudmkoR0xfUE9JTlRfU1BSSVRFX09FUywgR0xfQ09PUkRfUkVQTEFDRV9PRVMsIG1Qb2ludFNwcml0ZUVuYWJsZSk7CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKICAgICAgICAgfQogICAgICAgICBtVGV4dHVyZXNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwogICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlc1tjdF0tPmdldFRleHR1cmVJRCgpKTsKQEAgLTE0NCw3ICsxNTMsNyBAQAogCiAgICAgLy9MT0dFKCJzZ2wyIGZyYWcxICV4IiwgZ2xHZXRFcnJvcigpKTsKICAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIC8vcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAKQEAgLTI4OSw2ICsyOTgsMTYgQEAKICAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAordm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbUZyYWdtZW50ICpQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIFByb2dyYW1GcmFnbWVudFN0YXRlOjpQcm9ncmFtRnJhZ21lbnRTdGF0ZSgpCiB7CiAgICAgbVBGID0gTlVMTDsKQEAgLTMwMCw3ICszMTksNyBAQAogCiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewogICAgIHVpbnQzMl90IHRtcFs1XSA9IHsKICAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCkBAIC0zMjgsNiArMzQ3LDcgQEAKIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApAQCAtMzM3LDYgKzM1Nyw3IEBACiB7CiAgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJUZXh0LCBzaGFkZXJMZW5ndGgsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiAlcCIsIHBmKTsKICAgICByZXR1cm4gcGY7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAppbmRleCA5ZmE1NjVkLi5lNWJiZTFiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCkBAIC00MCw2ICs0MCw5IEBACiAgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNoYWRlcigpOwogICAgIHZpcnR1YWwgdm9pZCBsb2FkU2hhZGVyKENvbnRleHQgKnJzYyk7CiAgICAgdmlydHVhbCB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOyB9CisgICAgc3RhdGljIFByb2dyYW1GcmFnbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICAvLyBIYWNrcyB0byBjcmVhdGUgYSBwcm9ncmFtIGZvciBub3cKQEAgLTU3LDcgKzYwLDcgQEAKICAgICB+UHJvZ3JhbUZyYWdtZW50U3RhdGUoKTsKIAogICAgIFByb2dyYW1GcmFnbWVudCAqbVBGOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxUeXBlPiBtVGV4dHVyZVR5cGVzW1Byb2dyYW1GcmFnbWVudDo6TUFYX1RFWFRVUkVdOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCmluZGV4IDEzODg3ZDEuLjY2ZjZlZjggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTc2LDExICs4MiwxMyBAQAogICAgIH0KIAogICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjFfMSgpKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZSkgewogICAgICAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7CiAgICAgICAgIH0KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICB9CiB9CiAKQEAgLTkyLDcgKzEwMCwxNSBAQAogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiB9CiAKK3ZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KIAorUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzExOCw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaAppbmRleCBjM2E5YzkwLi43OWIxNDc1MyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCkBAIC0zNiw2ICszNiw5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKICAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKQEAgLTU2LDcgKzU5LDcgQEAKIHB1YmxpYzoKICAgICBQcm9ncmFtUmFzdGVyU3RhdGUoKTsKICAgICB+UHJvZ3JhbVJhc3RlclN0YXRlKCk7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CiAKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IG1EZWZhdWx0OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIGxpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKcmVuYW1lIHRvIGxpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCmluZGV4IDhhMjE1N2YuLmU3NDFjMGEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKQEAgLTE0LDE3ICsxNCwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZTo6UHJvZ3JhbUZyYWdtZW50U3RvcmUoQ29udGV4dCAqcnNjKSA6CitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKICAgICBQcm9ncmFtKHJzYykKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CkBAIC00NiwxMSArNTIsMTEgQEAKIAogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZTo6flByb2dyYW1GcmFnbWVudFN0b3JlKCkKK1Byb2dyYW1TdG9yZTo6flByb2dyYW1TdG9yZSgpCiB7CiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVN0b3JlU3RhdGUgKnN0YXRlKQogewogICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgewogICAgICAgICByZXR1cm47CkBAIC04NSw3ICs5MSw3IEBACiAgICAgfQogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKnN0YXRlKQordm9pZCBQcm9ncmFtU3RvcmU6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVN0b3JlU3RhdGUgKnN0YXRlKQogewogICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgewogICAgICAgICByZXR1cm47CkBAIC0xMjEsMTIgKzEyNywyMyBAQAogfQogCiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREaXRoZXJFbmFibGUoYm9vbCBlbmFibGUpCiB7CiAgICAgbURpdGhlckVuYWJsZSA9IGVuYWJsZTsKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jIGZ1bmMpCit2b2lkIFByb2dyYW1TdG9yZTo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtU3RvcmUgKlByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jIGZ1bmMpCiB7CiAgICAgbURlcHRoVGVzdEVuYWJsZSA9IHRydWU7CiAKQEAgLTE1NiwxMiArMTczLDEyIEBACiAgICAgfQogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQordm9pZCBQcm9ncmFtU3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCiB7CiAgICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQogewogICAgIG1CbGVuZEVuYWJsZSA9IHRydWU7CiAgICAgaWYgKChzcmMgPT0gUlNfQkxFTkRfU1JDX09ORSkgJiYKQEAgLTIyNyw3ICsyNDQsNyBAQAogICAgIH0KIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXRDb2xvck1hc2soYm9vbCByLCBib29sIGcsIGJvb2wgYiwgYm9vbCBhKQogewogICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHI7CiAgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gZzsKQEAgLTIzNiwyNCArMjUzLDI0IEBACiB9CiAKIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTo6UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCitQcm9ncmFtU3RvcmVTdGF0ZTo6UHJvZ3JhbVN0b3JlU3RhdGUoKQogewogICAgIG1QRlMgPSBOVUxMOwogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCitQcm9ncmFtU3RvcmVTdGF0ZTo6flByb2dyYW1TdG9yZVN0YXRlKCkKIHsKICAgICBkZWxldGUgbVBGUzsKIAogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKICAgICBtRGVmYXVsdC5zZXQocGZzKTsKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQordm9pZCBQcm9ncmFtU3RvcmVTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKIHsKICAgICBtRGVmYXVsdC5jbGVhcigpOwogICAgIG1MYXN0LmNsZWFyKCk7CkBAIC0yNjMsNDIgKzI4MCw0MiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQogewogICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOwogCiB9CiAKLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKENvbnRleHQgKnJzYywgUnNEZXB0aEZ1bmMgZnVuYykKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCiB7CiAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCiB7CiAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCiB7CiAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZUJsZW5kRnVuYyhDb250ZXh0ICpyc2MsIFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQogewogICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXRCbGVuZEZ1bmMoc3JjLCBkc3QpOwogfQogCi1Sc1Byb2dyYW1GcmFnbWVudFN0b3JlIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShDb250ZXh0ICpyc2MpCitSc1Byb2dyYW1TdG9yZSByc2lfUHJvZ3JhbVN0b3JlQ3JlYXRlKENvbnRleHQgKnJzYykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKICAgICBwZnMtPmluY1VzZXJSZWYoKTsKICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7CiAgICAgcmV0dXJuIHBmczsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQogewogICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIGxpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oCnJlbmFtZSB0byBsaWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKaW5kZXggMzQxMmM5OS4uZmU4ZDc4ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oCkBAIC0xOCwyMSArMTgsMjIgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19QUk9HUkFNX0ZSQUdNRU5UX1NUT1JFX0gKIAogI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU7CitjbGFzcyBQcm9ncmFtU3RvcmVTdGF0ZTsKIAotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQorY2xhc3MgUHJvZ3JhbVN0b3JlIDogcHVibGljIFByb2dyYW0KIHsKIHB1YmxpYzoKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICopOwotICAgIHZpcnR1YWwgflByb2dyYW1GcmFnbWVudFN0b3JlKCk7CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOwogCiAgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwogICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwpAQCAtNDIsNiArNDMsMTAgQEAKIAogICAgIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2wpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRTsgfQorICAgIHN0YXRpYyBQcm9ncmFtU3RvcmUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtRGl0aGVyRW5hYmxlOwogCkBAIC02MCwxOSArNjUsMTkgQEAKICAgICBib29sIG1TdGVuY2lsVGVzdEVuYWJsZTsKIH07CiAKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUKK2NsYXNzIFByb2dyYW1TdG9yZVN0YXRlCiB7CiBwdWJsaWM6Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIH5Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlKCk7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIFByb2dyYW1TdG9yZVN0YXRlKCk7CisgICAgflByb2dyYW1TdG9yZVN0YXRlKCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1EZWZhdWx0OwotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1MYXN0OworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtRGVmYXVsdDsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUxhc3Q7CiAKIAotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOworICAgIFByb2dyYW1TdG9yZSAqbVBGUzsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLjg1ZDkwYzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTgxLDkgKzg3LDEyIEBACiAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICBpZiAobUxpZ2h0Q291bnQpIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVCAvLyBHTEVTIE9ubHkKICAgICAgICAgaW50IHYgPSAwOwogICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisKICAgICAgICAgZ2xMaWdodE1vZGVseHYoR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsICZ2KTsKKwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtTGlnaHRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgTGlnaHQgKmwgPSBtTGlnaHRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUMCArIGN0KTsKQEAgLTkyLDYgKzEwMSw3IEBACiAgICAgICAgIGZvciAodWludDMyX3QgY3QgPSBtTGlnaHRDb3VudDsgY3QgPCBNQVhfTElHSFRTOyBjdCsrKSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfTElHSFQwICsgY3QpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKICAgICB9CkBAIC0xMjgsNiArMTM4LDExIEBACiAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZm5bMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4CiAgICAgICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CkBAIC0xNDAsNyArMTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZm4pOwogICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTUwLDYgKzE2NSwxMSBAQAogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKICAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKQEAgLTE2MiwxNyArMTgyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX0xlZ2FjeU5vcm1hbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9jb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX25vcm1hbDtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9wb2ludFNpemU7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogCiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVW5pZm9ybUNvdW50OyBjdCsrKSB7CiAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQ0ICIpOwpAQCAtMTgxLDE0ICsyMDEsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX3Bvc2l0aW9uO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9wb2ludFNpemU7XG4iKTsKIAotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9jb2xvcjtcbiIpOwogICAgICAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBVTklfVGV4TWF0cml4ICogQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBVTklfVGV4TWF0cml4ICogQVRUUklCX3RleHR1cmUwO1xuIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7XG4iKTsKICAgICAgICAgfQogICAgICAgICAvL21TaGFkZXIuYXBwZW5kKCIgIHBvcy54ID0gcG9zLnggLyA0ODAuMDtcbiIpOwogICAgICAgICAvL21TaGFkZXIuYXBwZW5kKCIgIHBvcy55ID0gcG9zLnkgLyA4MDAuMDtcbiIpOwpAQCAtMjAxLDcgKzIyMSw3IEBACiB7CiAgICAgLy9MT0dFKCJzZ2wyIHZ0eDEgJXgiLCBnbEdldEVycm9yKCkpOwogICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1WZXJ0ZXg6OnNldHVwR0wyIHN0YXJ0Iik7CkBAIC0zNTEsNiArMzcxLDE2IEBACiAgICAgY3JlYXRlU2hhZGVyKCk7CiB9CiAKK3ZvaWQgUHJvZ3JhbVZlcnRleDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtVmVydGV4ICpQcm9ncmFtVmVydGV4OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTM2Miw4ICszOTIsOSBAQAogewogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgUnNFbGVtZW50IGUgPSAoUnNFbGVtZW50KSBFbGVtZW50OjpjcmVhdGUocnNjLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAxKTsKIAogICAgIHJzaV9UeXBlQmVnaW4ocnNjLCBlKTsKQEAgLTM3Miw2ICs0MDMsNyBAQAogCiAgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIGZhbHNlKTsKICAgICBBbGxvY2F0aW9uICphbGxvYyA9IChBbGxvY2F0aW9uICopcnNpX0FsbG9jYXRpb25DcmVhdGVUeXBlZChyc2MsIG1BbGxvY1R5cGUuZ2V0KCkpOworCiAgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwogICAgIG1EZWZhdWx0LnNldChwdik7CiAgICAgcHYtPmluaXQocnNjKTsKQEAgLTM4MiwxMyArNDE0LDE1IEBACiAgICAgY29sb3JbMl0gPSAxLmY7CiAgICAgY29sb3JbM10gPSAxLmY7CiAKLSAgICB1cGRhdGVTaXplKHJzYywgdywgaCk7CisgICAgdXBkYXRlU2l6ZShyc2MpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjp1cGRhdGVTaXplKENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MpCiB7CiAgICAgTWF0cml4IG07Ci0gICAgbS5sb2FkT3J0aG8oMCx3LCBoLDAsIC0xLDEpOworICAgIG0ubG9hZE9ydGhvKDAscnNjLT5nZXRXaWR0aCgpLCByc2MtPmdldEhlaWdodCgpLDAsIC0xLDEpOwogICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEoUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVQsIDE2LCAmbS5tWzBdLCAxNio0KTsKIAogICAgIG0ubG9hZElkZW50aXR5KCk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaAppbmRleCAyODU1NGNjLi5jYjkzZWFmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKQEAgLTUyLDYgKzUyLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgbG9hZFNoYWRlcihDb250ZXh0ICopOwogICAgIHZpcnR1YWwgdm9pZCBpbml0KENvbnRleHQgKik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWDsgfQorICAgIHN0YXRpYyBQcm9ncmFtVmVydGV4ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIHVpbnQzMl90IG1MaWdodENvdW50OwpAQCAtNzEsOSArNzQsOSBAQAogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogICAgIH5Qcm9ncmFtVmVydGV4U3RhdGUoKTsKIAotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIHVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbURlZmF1bHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtTGFzdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmNwcCBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcAppbmRleCA3MWY1MDhmLi5mNDFmMjk1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5jcHAKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuY3BwCkBAIC0xNCwxMCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogCiAKQEAgLTk0LDYgKzEwMCwxNyBAQAogICAgIG1Cb3VuZFNsb3QgPSAtMTsKICAgICBzcy0+bVNhbXBsZXJzW3Nsb3RdLmNsZWFyKCk7CiB9CisKK3ZvaWQgU2FtcGxlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworU2FtcGxlciAqU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLyoKIHZvaWQgU2FtcGxlclN0YXRlOjpzZXR1cEdMKCkKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmggYi9saWJzL3JzL3JzU2FtcGxlci5oCmluZGV4IDA1MDYwODEuLjM3ODY0MzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTYW1wbGVyLmgKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuaApAQCAtNDYsNiArNDYsMTAgQEAKICAgICB2b2lkIGJpbmRUb0NvbnRleHQoU2FtcGxlclN0YXRlICosIHVpbnQzMl90IHNsb3QpOwogICAgIHZvaWQgdW5iaW5kRnJvbUNvbnRleHQoU2FtcGxlclN0YXRlICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjsgfQorICAgIHN0YXRpYyBTYW1wbGVyICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIFJzU2FtcGxlclZhbHVlIG1NYWdGaWx0ZXI7CiAgICAgUnNTYW1wbGVyVmFsdWUgbU1pbkZpbHRlcjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKaW5kZXggYTMzOTMzYi4uZmMyMmZjMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKQEAgLTI0LDE5ICsyNCwyNSBAQAogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CiAgICAgbWVtc2V0KCZtRW52aXJvbWVudCwgMCwgc2l6ZW9mKG1FbnZpcm9tZW50KSk7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSAxOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gMDsKLSAgICBtRW52aXJvbWVudC5tSXNSb290ID0gZmFsc2U7CiB9CiAKIFNjcmlwdDo6flNjcmlwdCgpCiB7CiB9CiAKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCBsZW4pCit7CisgICAgaW50MzJfdCAqZGVzdFB0ciA9ICgoaW50MzJfdCAqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtzbG90XTsKKyAgICBpZiAoZGVzdFB0cikgeworICAgICAgICAvL0xPR0UoInNldFZhciBmMSAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgICAgICAvL0xPR0UoInNldFZhciAlcCAlaSIsIGRlc3RQdHIsIGxlbik7CisgICAgICAgIG1lbWNweShkZXN0UHRyLCB2YWwsIGxlbik7CisgICAgICAgIC8vTE9HRSgic2V0VmFyIGYyICAlZiIsICgoY29uc3QgZmxvYXQgKilkZXN0UHRyKVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2FsbGluZyBzZXRWYXIgb24gc2xvdCA9ICVpIHdoaWNoIGlzIG51bGwiLCBzbG90KTsKKyAgICB9Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCkBAIC00NCwxNiArNTAsOSBAQAogdm9pZCByc2lfU2NyaXB0QmluZEFsbG9jYXRpb24oQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKIHsKICAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1TbG90c1tzbG90XS5zZXQoc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSkpOwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckNvbG9yKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gZzsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KGEpOworICAgIC8vTE9HRSgicnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uICVpICAlcCAgJXAiLCBzbG90LCBhLCBhLT5nZXRQdHIoKSk7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdFNldFRpbWVab25lKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBjb25zdCBjaGFyICogdGltZVpvbmUsIHVpbnQzMl90IGxlbmd0aCkKQEAgLTYyLDUzICs2MSw1MSBAQAogICAgIHMtPm1FbnZpcm9tZW50Lm1UaW1lWm9uZSA9IHRpbWVab25lOwogfQogCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckRlcHRoKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyRGVwdGggPSB2OwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhclN0ZW5jaWwoQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHYpCi17Ci0gICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gdjsKLX0KLQogdm9pZCByc2lfU2NyaXB0U2V0VHlwZShDb250ZXh0ICogcnNjLCBSc1R5cGUgdnQsIHVpbnQzMl90IHNsb3QsIGJvb2wgd3JpdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwogICAgIGNvbnN0IFR5cGUgKnQgPSBzdGF0aWNfY2FzdDxjb25zdCBUeXBlICo+KHZ0KTsKICAgICBzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbc2xvdF0uc2V0KHQpOwogICAgIHNzLT5tU2xvdFdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8obmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8oIiIpOwotICAgIH0KLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0SW52b2tlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3Qgc2xvdCkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnZva2FibGVOYW1lc1tzbG90XSA9IG5hbWU7CisgICAgTE9HRSgicnNpX1NjcmlwdFNldFR5cGUiKTsKIH0KIAogdm9pZCByc2lfU2NyaXB0SW52b2tlKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBpZiAocy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0gPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcy0+c2V0dXBTY3JpcHQoKTsKLSAgICBzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tzbG90XSgpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOwogfQogCiAKLXZvaWQgcnNpX1NjcmlwdFNldFJvb3QoQ29udGV4dCAqIHJzYywgYm9vbCBpc1Jvb3QpCit2b2lkIHJzaV9TY3JpcHRJbnZva2VEYXRhKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIHZvaWQgKmRhdGEpCiB7Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tU2NyaXB0LT5tRW52aXJvbWVudC5tSXNSb290ID0gaXNSb290OworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgTlVMTCwgMCk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdEludm9rZVYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgZGF0YSwgbGVuKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFySShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBpbnQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyRihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCit2b2lkIHJzaV9TY3JpcHRTZXRWYXJWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBjb25zdCBmbG9hdCAqZnAgPSAoY29uc3QgZmxvYXQgKilkYXRhOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsIGRhdGEsIGxlbik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdC5oIGIvbGlicy9ycy9yc1NjcmlwdC5oCmluZGV4IDVmNGE1MzYuLmVhNmFlYzUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0LmgKQEAgLTI3LDkgKzI3LDkgQEAKIGNsYXNzIFByb2dyYW1WZXJ0ZXg7CiBjbGFzcyBQcm9ncmFtRnJhZ21lbnQ7CiBjbGFzcyBQcm9ncmFtUmFzdGVyOwotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmU7CitjbGFzcyBQcm9ncmFtU3RvcmU7CiAKLSNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAxNgorI2RlZmluZSBNQVhfU0NSSVBUX0JBTktTIDMyCiAKIGNsYXNzIFNjcmlwdCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CkBAIC0zOSwzOCArMzksMzggQEAKICAgICBTY3JpcHQoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIH5TY3JpcHQoKTsKIAotCiAgICAgc3RydWN0IEVudmlyb21lbnRfdCB7Ci0gICAgICAgIGJvb2wgbUlzUm9vdDsKLSAgICAgICAgZmxvYXQgbUNsZWFyQ29sb3JbNF07Ci0gICAgICAgIGZsb2F0IG1DbGVhckRlcHRoOwotICAgICAgICB1aW50MzJfdCBtQ2xlYXJTdGVuY2lsOwotCiAgICAgICAgIHVpbnQzMl90IG1TdGFydFRpbWVNaWxsaXM7CiAgICAgICAgIGNvbnN0IGNoYXIqIG1UaW1lWm9uZTsKIAogICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKLSAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7Ci0gICAgICAgIEludm9rZUZ1bmNfdCBtSW52b2thYmxlc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOworCisgICAgICAgIHVpbnQzMl90IG1JbnZva2VGdW5jdGlvbkNvdW50OworICAgICAgICBJbnZva2VGdW5jX3QgKm1JbnZva2VGdW5jdGlvbnM7CisgICAgICAgIHVpbnQzMl90IG1GaWVsZENvdW50OworICAgICAgICB2b2lkICoqIG1GaWVsZEFkZHJlc3M7CisKICAgICAgICAgY2hhciAqIG1TY3JpcHRUZXh0OwogICAgICAgICB1aW50MzJfdCBtU2NyaXB0VGV4dExlbmd0aDsKICAgICB9OwogICAgIEVudmlyb21lbnRfdCBtRW52aXJvbWVudDsKIAotICAgIHVpbnQzMl90IG1Db3Vuc3RhbnRCdWZmZXJDb3VudDsKLQotCiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtU2xvdHNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKIAorICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKTsKIAorICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJ1bkZvckVhY2goQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICphaW4sIEFsbG9jYXRpb24gKmFvdXQsIHVpbnQzMl90IHhTdGFydCwgdWludDMyX3QgeEVuZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0LCB1aW50MzJfdCB4U3RhcnQsIHVpbnQzMl90IHlTdGFydCwgdWludDMyX3QgeEVuZCwgdWludDMyX3QgeUVuZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCkgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgcnVuKENvbnRleHQgKiwgdWludDMyX3QgbGF1bmNoSUQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgSW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KENvbnRleHQgKnJzYykgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgcnVuKENvbnRleHQgKikgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKaW5kZXggZjRkMjQ1MS4uOTc1YjcwNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcApAQCAtMTcsOCArMTcsNyBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0KLSNpbmNsdWRlICJhY2MvYWNjLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZXh0ZXJuYWwvbGx2bS9saWJiY2MvaW5jbHVkZS9iY2MvYmNjLmgiCiAjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCiAKICNpbmNsdWRlIDxHTEVTL2dsLmg+CkBAIC0zNyw0MCArMzYsNzQgQEAKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1BY2NTY3JpcHQgPSBOVUxMOworICAgIG1CY2NTY3JpcHQgPSBOVUxMOwogICAgIG1lbXNldCgmbVByb2dyYW0sIDAsIHNpemVvZihtUHJvZ3JhbSkpOwogfQogCiBTY3JpcHRDOjp+U2NyaXB0QygpCiB7Ci0gICAgaWYgKG1BY2NTY3JpcHQpIHsKLSAgICAgICAgYWNjRGVsZXRlU2NyaXB0KG1BY2NTY3JpcHQpOworICAgIGlmIChtQmNjU2NyaXB0KSB7CisgICAgICAgIGJjY0RlbGV0ZVNjcmlwdChtQmNjU2NyaXB0KTsKICAgICB9CiAgICAgZnJlZShtRW52aXJvbWVudC5tU2NyaXB0VGV4dCk7CiAgICAgbUVudmlyb21lbnQubVNjcmlwdFRleHQgPSBOVUxMOwogfQogCi12b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KCkKK3ZvaWQgU2NyaXB0Qzo6c2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKQogewotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0pIHsKLSAgICAgICAgICAgICptUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSA9IG1TbG90c1tjdF0tPmdldFB0cigpOworICAgIHNldHVwR0xTdGF0ZShyc2MpOworICAgIG1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXMKKyAgICAgICAgICAgICAgICA9IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOworCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIGlmICghbVNsb3RzW2N0XS5nZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB2b2lkICpwdHIgPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICAgICAgdm9pZCAqKmRlc3QgPSAoKHZvaWQgKioqKW1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MpW2N0XTsKKyAgICAgICAgLy9MT0dFKCJzZXR1cFNjcmlwdCAlaSAlcCA9ICVwICAgICVwICVpIiwgY3QsIGRlc3QsIHB0ciwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLCBtU2xvdHNbY3RdLT5nZXRUeXBlKCktPmdldERpbVgoKSk7CisKKyAgICAgICAgLy9jb25zdCB1aW50MzJfdCAqcDMyID0gKGNvbnN0IHVpbnQzMl90ICopcHRyOworICAgICAgICAvL2ZvciAodWludDMyX3QgY3QyPTA7IGN0MiA8IG1TbG90c1tjdF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpOyBjdDIrKykgeworICAgICAgICAgICAgLy9MT0dFKCIgICVpID0gMHglMDh4ICIsIGN0MiwgcDMyW2N0Ml0pOworICAgICAgICAvL30KKworICAgICAgICBpZiAoZGVzdCkgeworICAgICAgICAgICAgKmRlc3QgPSBwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJTY3JpcHRDOjpzZXR1cFNjcmlwdCwgTlVMTCB2YXIgYmluZGluZyBhZGRyZXNzLiIpOwogICAgICAgICB9CiAgICAgfQogfQogCi0KLXVpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MsIHVpbnQzMl90IGxhdW5jaEluZGV4KQorY29uc3QgQWxsb2NhdGlvbiAqU2NyaXB0Qzo6cHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKIHsKLSAgICBpZiAobVByb2dyYW0ubVNjcmlwdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkF0dGVtcHRlZCB0byBydW4gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXB0cikgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIGlmICghbVNsb3RzW2N0XS5nZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobVNsb3RzW2N0XS0+Z2V0UHRyKCkgPT0gcHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVNsb3RzW2N0XS5nZXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJTY3JpcHRDOjpwdHJUb0FsbG9jYXRpb24sIGZhaWxlZCB0byBmaW5kICVwIiwgcHRyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KIAotICAgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9Ci0gICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7CitTY3JpcHQgKiBTY3JpcHRDOjpzZXRUTFMoU2NyaXB0ICpzYykKK3sKKyAgICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsKICAgICByc0Fzc2VydCh0bHMpOworICAgIFNjcmlwdCAqb2xkID0gdGxzLT5tU2NyaXB0OworICAgIHRscy0+bVNjcmlwdCA9IHNjOworICAgIHJldHVybiBvbGQ7Cit9CiAKKwordm9pZCBTY3JpcHRDOjpzZXR1cEdMU3RhdGUoQ29udGV4dCAqcnNjKQorewogICAgIGlmIChtRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5nZXQoKSkgewogICAgICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUobUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuZ2V0KCkpOwogICAgIH0KQEAgLTgzLDIwICsxMTYsOTIgQEAKICAgICBpZiAobUVudmlyb21lbnQubVJhc3Rlci5nZXQoKSkgewogICAgICAgICByc2MtPnNldFJhc3RlcihtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKTsKICAgICB9Cit9CiAKLSAgICBpZiAobGF1bmNoSW5kZXggPT0gMCkgewotICAgICAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCi0gICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK3VpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MpCit7CisgICAgaWYgKG1Qcm9ncmFtLm1Sb290ID09IE5VTEwpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzZXR1cFNjcmlwdCgpOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKIAogICAgIHVpbnQzMl90IHJldCA9IDA7Ci0gICAgdGxzLT5tU2NyaXB0ID0gdGhpczsKLSAgICByZXQgPSBtUHJvZ3JhbS5tU2NyaXB0KGxhdW5jaEluZGV4KTsKLSAgICB0bHMtPm1TY3JpcHQgPSBOVUxMOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKyAgICAvL0xPR0UoIlNjcmlwdEM6OnJ1biAlcCIsIG1Qcm9ncmFtLm1Sb290KTsKKyAgICByZXQgPSBtUHJvZ3JhbS5tUm9vdCgpOworICAgIHNldFRMUyhvbGRUTFMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuIHJldCAlaSIsIHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAordm9pZCBTY3JpcHRDOjpydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHhTdGFydCwgdWludDMyX3QgeVN0YXJ0LCB1aW50MzJfdCB4RW5kLCB1aW50MzJfdCB5RW5kKQoreworICAgIExPR0UoIlNjcmlwdEM6OnJ1bkZvckVhY2ggbm90IGltcGxlbWVudGVkIik7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCwgdWludDMyX3QgeFN0YXJ0LCB1aW50MzJfdCB4RW5kKQoreworICAgIHVpbnQzMl90IGRpbVggPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWCgpOworICAgIHJzQXNzZXJ0KHhTdGFydCA8IGRpbVgpOworICAgIHJzQXNzZXJ0KHhFbmQgPD0gZGltWCk7CisgICAgcnNBc3NlcnQoYWluLT5nZXRUeXBlKCktPmdldERpbVkoKSA9PSAwKTsKKyAgICByc0Fzc2VydChhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpID09IDApOworCisgICAgaWYgKHhTdGFydCA+PSBkaW1YKSB4U3RhcnQgPSBkaW1YIC0gMTsKKyAgICBpZiAoeEVuZCA+PSBkaW1YKSB4RW5kID0gZGltWCAtIDE7CisgICAgaWYgKHhTdGFydCA+IHhFbmQpIHJldHVybjsKKworICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisgICAgdHlwZWRlZiBpbnQgKCpyc190KShjb25zdCB2b2lkICosIHZvaWQgKiwgdWludDMyX3QpOworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ckluID0gKGNvbnN0IHVpbnQ4X3QgKilhaW4tPmdldFB0cigpOworICAgIHVpbnQzMl90IHN0cmlkZUluID0gYWluLT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKworICAgIHVpbnQ4X3QgKnB0ck91dCA9IE5VTEw7CisgICAgdWludDMyX3Qgc3RyaWRlT3V0ID0gMDsKKyAgICBpZiAoYW91dCkgeworICAgICAgICBwdHJPdXQgPSAodWludDhfdCAqKWFvdXQtPmdldFB0cigpOworICAgICAgICBzdHJpZGVPdXQgPSBhb3V0LT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PXhTdGFydDsgY3QgPCB4RW5kOyBjdCsrKSB7CisgICAgICAgICgocnNfdCltUHJvZ3JhbS5tUm9vdCkgKHB0ckluICsgKHN0cmlkZUluICogY3QpLCBwdHJPdXQgKyAoc3RyaWRlT3V0ICogY3QpLCBjdCk7CisgICAgfQorCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCkKK3sKKyAgICBpZiAoYWluLT5nZXRUeXBlKCktPmdldERpbVkoKSkgeworICAgICAgICBydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCAwLCAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCAwLCAweGZmZmZmZmZmKTsKKyAgICB9Cit9CisKKwordm9pZCBTY3JpcHRDOjpJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgLy9MT0dFKCJyc2lfU2NyaXB0SW52b2tlICVpIiwgc2xvdCk7CisgICAgaWYgKChzbG90ID49IG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KSB8fAorICAgICAgICAobUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSA9PSBOVUxMKSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKyAgICAoKHZvaWQgKCopKGNvbnN0IHZvaWQgKiwgdWludDMyX3QpKQorICAgICAgICBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW3Nsb3RdKShkYXRhLCBsZW4pOworCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKIFNjcmlwdENTdGF0ZTo6U2NyaXB0Q1N0YXRlKCkKIHsKICAgICBtU2NyaXB0ID0gTlVMTDsKQEAgLTExMywyMSArMjE4LDI1IEBACiB7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmNsZWFyKCk7Ci0gICAgICAgIG1TbG90TmFtZXNbY3RdLnNldFRvKCIiKTsKLSAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zZXRUbygiIik7CiAgICAgICAgIG1TbG90V3JpdGFibGVbY3RdID0gZmFsc2U7CiAgICAgfQogCiAgICAgZGVsZXRlIG1TY3JpcHQ7CiAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDKE5VTEwpOwotCi0gICAgbUludDMyRGVmaW5lcy5jbGVhcigpOwotICAgIG1GbG9hdERlZmluZXMuY2xlYXIoKTsKIH0KIAotc3RhdGljIEFDQ3ZvaWQqIHN5bWJvbExvb2t1cChBQ0N2b2lkKiBwQ29udGV4dCwgY29uc3QgQUNDY2hhciogbmFtZSkKK3N0YXRpYyBCQ0N2b2lkKiBzeW1ib2xMb29rdXAoQkNDdm9pZCogcENvbnRleHQsIGNvbnN0IEJDQ2NoYXIqIG5hbWUpCiB7Ci0gICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bTsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHN5bSA9IFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sQ0wobmFtZSk7CisgICAgaWYgKHN5bSkgeworICAgICAgICByZXR1cm4gc3ltLT5tUHRyOworICAgIH0KKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKG5hbWUpOwogICAgIGlmIChzeW0pIHsKICAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKICAgICB9CkBAIC0xMzcsNjUgKzI0Niw2MCBAQAogCiB2b2lkIFNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKQogewotICAgIHMtPm1BY2NTY3JpcHQgPSBhY2NDcmVhdGVTY3JpcHQoKTsKLSAgICBTdHJpbmc4IHRtcDsKKyAgICBMT0dFKCJTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyICIpOwogCi0gICAgcnNjLT5hcHBlbmROYW1lRGVmaW5lcygmdG1wKTsKLSAgICBhcHBlbmREZWNscygmdG1wKTsKLSAgICBhcHBlbmRWYXJEZWZpbmVzKHJzYywgJnRtcCk7Ci0gICAgYXBwZW5kVHlwZXMocnNjLCAmdG1wKTsKLSAgICB0bXAuYXBwZW5kKCIjbGluZSAxXG4iKTsKLQotICAgIGNvbnN0IGNoYXIqIHNjcmlwdFNvdXJjZVtdID0ge3RtcC5zdHJpbmcoKSwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHR9OwotICAgIGludCBzY3JpcHRMZW5ndGhbXSA9IHt0bXAubGVuZ3RoKCksIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0TGVuZ3RofSA7Ci0gICAgYWNjU2NyaXB0U291cmNlKHMtPm1BY2NTY3JpcHQsIHNpemVvZihzY3JpcHRMZW5ndGgpIC8gc2l6ZW9mKGludCksIHNjcmlwdFNvdXJjZSwgc2NyaXB0TGVuZ3RoKTsKLSAgICBhY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKHMtPm1BY2NTY3JpcHQsIHN5bWJvbExvb2t1cCwgTlVMTCk7Ci0gICAgYWNjQ29tcGlsZVNjcmlwdChzLT5tQWNjU2NyaXB0KTsKLSAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LCAibWFpbiIsIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tU2NyaXB0KTsKLSAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LCAiaW5pdCIsIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tSW5pdCk7Ci0gICAgcnNBc3NlcnQocy0+bVByb2dyYW0ubVNjcmlwdCk7Ci0KLSAgICBpZiAoIXMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKLSAgICAgICAgQUNDY2hhciBidWZbNDA5Nl07Ci0gICAgICAgIEFDQ3NpemVpIGxlbjsKLSAgICAgICAgYWNjR2V0U2NyaXB0SW5mb0xvZyhzLT5tQWNjU2NyaXB0LCBzaXplb2YoYnVmKSwgJmxlbiwgYnVmKTsKLSAgICAgICAgTE9HRSgiJXMiLCBidWYpOwotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJFcnJvciBjb21waWxpbmcgdXNlciBzY3JpcHQuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgcy0+bUJjY1NjcmlwdCA9IGJjY0NyZWF0ZVNjcmlwdCgpOworICAgIGJjY1NjcmlwdEJpdGNvZGUocy0+bUJjY1NjcmlwdCwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHQsIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0TGVuZ3RoKTsKKyAgICBiY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKHMtPm1CY2NTY3JpcHQsIHN5bWJvbExvb2t1cCwgTlVMTCk7CisgICAgYmNjQ29tcGlsZVNjcmlwdChzLT5tQmNjU2NyaXB0KTsKKyAgICBiY2NHZXRTY3JpcHRMYWJlbChzLT5tQmNjU2NyaXB0LCAicm9vdCIsIChCQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tUm9vdCk7CisgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgImluaXQiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOworICAgIExPR0UoInJvb3QgJXAsICBpbml0ICVwIiwgcy0+bVByb2dyYW0ubVJvb3QsIHMtPm1Qcm9ncmFtLm1Jbml0KTsKIAogICAgIGlmIChzLT5tUHJvZ3JhbS5tSW5pdCkgewogICAgICAgICBzLT5tUHJvZ3JhbS5tSW5pdCgpOwogICAgIH0KIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobVNsb3ROYW1lc1tjdF0ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNsb3ROYW1lc1tjdF0uc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0pOwotICAgICAgICB9CisgICAgYmNjR2V0RXhwb3J0RnVuY3Mocy0+bUJjY1NjcmlwdCwgKEJDQ3NpemVpKikgJnMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCAwLCBOVUxMKTsKKyAgICBpZihzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCA8PSAwKQorICAgICAgICBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IChTY3JpcHQ6Okludm9rZUZ1bmNfdCopIGNhbGxvYyhzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgc2l6ZW9mKFNjcmlwdDo6SW52b2tlRnVuY190KSk7CisgICAgICAgIGJjY0dldEV4cG9ydEZ1bmNzKHMtPm1CY2NTY3JpcHQsIE5VTEwsIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCAoQkNDdm9pZCAqKikgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyk7CiAgICAgfQogCi0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtSW52b2thYmxlTmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZva2FibGVOYW1lc1tjdF0uc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUNDdm9pZCoqKSAmcy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbY3RdKTsKLSAgICAgICAgfQorLy8gICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IChTY3JpcHQ6Okludm9rZUZ1bmNfdCAqKWNhbGxvYygxMDAsIHNpemVvZih2b2lkICopKTsKKy8vICAgIEJDQ2NoYXIgKipsYWJlbHMgPSBuZXcgY2hhcipbMTAwXTsKKy8vICAgIGJjY0dldEZ1bmN0aW9ucyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkgKikmcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsCisvLyAgICAgICAgICAgICAgICAgICAgMTAwLCAoQkNDY2hhciAqKilsYWJlbHMpOworICAgIC8vTE9HRSgiZnVuYyBjb3VudCAlaSIsIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KTsKKy8vICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQ7IGkrKykgeworLy8gICAgICAgIEJDQ3NpemVpIGxlbmd0aDsKKy8vICAgICAgICBiY2NHZXRGdW5jdGlvbkJpbmFyeShzLT5tQmNjU2NyaXB0LCBsYWJlbHNbaV0sIChCQ0N2b2lkICoqKSYocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tpXSksICZsZW5ndGgpOworICAgICAgICAvL0xPR0UoImZ1bmMgJWkgJXAiLCBpLCBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW2ldKTsKKyAgLy8gIH0KKworICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSAodm9pZCAqKiljYWxsb2MoMTAwLCBzaXplb2Yodm9pZCAqKSk7CisgICAgYmNjR2V0RXhwb3J0VmFycyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkgKikmcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAxMDAsIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MpOworICAgIC8vTE9HRSgidmFyIGNvdW50ICVpIiwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAvL0xPR0UoInZhciAlaSAlcCIsIGksIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3NbaV0pOwogICAgIH0KIAogICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkpOwogICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7Ci0gICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkpOworICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpKTsKIAotICAgIGlmIChzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7CisgICAgaWYgKHMtPm1Qcm9ncmFtLm1Sb290KSB7CiAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgcHJhZ21hTWF4ID0gMTY7Ci0gICAgICAgIEFDQ3NpemVpIHByYWdtYUNvdW50OwotICAgICAgICBBQ0NjaGFyICogc3RyW3ByYWdtYU1heF07Ci0gICAgICAgIGFjY0dldFByYWdtYXMocy0+bUFjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOworICAgICAgICBCQ0NzaXplaSBwcmFnbWFDb3VudDsKKyAgICAgICAgQkNDY2hhciAqIHN0cltwcmFnbWFNYXhdOworICAgICAgICBiY2NHZXRQcmFnbWFzKHMtPm1CY2NTY3JpcHQsICZwcmFnbWFDb3VudCwgcHJhZ21hTWF4LCAmc3RyWzBdKTsKIAogICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IHByYWdtYUNvdW50OyBjdCs9MikgeworICAgICAgICAgICAgLy9MT0dFKCJwcmFnbWUgJXMgJXMiLCBzdHJbY3RdLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RyW2N0XSwgInZlcnNpb24iKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjA4LDExICszMTIsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtVmVydGV4ICogcHYgPSAoUHJvZ3JhbVZlcnRleCAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHB2KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVZlcnRleCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIyNCwxMSArMzIzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbVJhc3RlciAqIHByID0gKFByb2dyYW1SYXN0ZXIgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChwcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVSYXN0ZXIiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNDAsMTEgKzMzNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50ICogcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChwZik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVGcmFnbWVudCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI1NiwxMiArMzQ1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogcGZzID0KLSAgICAgICAgICAgICAgICAgICAgKFByb2dyYW1GcmFnbWVudFN0b3JlICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChwZnMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlU3RvcmUiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNzMsMTExICszNTYsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXBwZW5kRWxlbWVudEJvZHkoU3RyaW5nOCAqcywgY29uc3QgRWxlbWVudCAqZSkKLXsKLSAgICBzLT5hcHBlbmQoIiB7XG4iKTsKLSAgICBmb3IgKHNpemVfdCBjdDI9MDsgY3QyIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdDIrKykgewotICAgICAgICBjb25zdCBFbGVtZW50ICpjID0gZS0+Z2V0RmllbGQoY3QyKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgICAgIik7Ci0gICAgICAgIHMtPmFwcGVuZChjLT5nZXRDVHlwZSgpKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHMtPmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QyKSk7Ci0gICAgICAgIHMtPmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMtPmFwcGVuZCgifSIpOwotfQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgIExPR0QoImFwcGVuZFZhckRlZmluZXMgbUludDMyRGVmaW5lcy5zaXplKCk9JWQgbUZsb2F0RGVmaW5lcy5zaXplKCk9JWRcbiIsCi0gICAgICAgICAgICAgICAgbUludDMyRGVmaW5lcy5zaXplKCksIG1GbG9hdERlZmluZXMuc2l6ZSgpKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtSW50MzJEZWZpbmVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobUludDMyRGVmaW5lcy5rZXlBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCAoaW50KW1JbnQzMkRlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1GbG9hdERlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtRmxvYXREZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWZmXG4iLCBtRmxvYXREZWZpbmVzLnZhbHVlQXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpCi17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBTdHJpbmc4IHRtcDsKLQotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzJfcyB7ZmxvYXQgeDsgZmxvYXQgeTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfM19zIHtmbG9hdCB4OyBmbG9hdCB5OyBmbG9hdCB6O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl80X3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7IGZsb2F0IHc7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjVThfNF9zIHtjaGFyIHI7IGNoYXIgZzsgY2hhciBiOyBjaGFyIGE7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8yX3Qgc3RydWN0IHZlY0YzMl8yX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8zX3Qgc3RydWN0IHZlY0YzMl8zX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl80X3Qgc3RydWN0IHZlY0YzMl80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY1U4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLSAgICBzdHItPmFwcGVuZCgiI2RlZmluZSB2ZWNJOF80X3Qgc3RydWN0IHZlY1U4XzRfc1xuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZSAqdCA9IG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKTsKLSAgICAgICAgaWYgKCF0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBFbGVtZW50ICplID0gdC0+Z2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZS0+Z2V0TmFtZSgpICYmIChlLT5nZXRGaWVsZENvdW50KCkgPiAxKSkgewotICAgICAgICAgICAgU3RyaW5nOCBzKCJzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldENTdHJ1Y3RCb2R5KCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotCi0gICAgICAgICAgICBzLmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiX3Qgc3RydWN0IHN0cnVjdF8iKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5cbiIpOwotICAgICAgICAgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCIlcyIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHItPmFwcGVuZChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgIGlmIChlLT5nZXROYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG5hbWVkIHN0cnVjdAotICAgICAgICAgICAgICAgIHMuc2V0VG8oZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIHN0cnVjdCBuYW1lZCBmcm9tIHRoZSBzbG90LgotICAgICAgICAgICAgICAgIHMuc2V0VG8oInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICAgICAgLy9hcHBlbmRFbGVtZW50Qm9keSgmcywgZSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQobVNsb3ROYW1lc1tjdF0pOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJfcyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzLmFwcGVuZCgiICogIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0gICAgfQotfQogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQyMCw3ICszOTgsNiBAQAogICAgIHMtPnNldENvbnRleHQocnNjKTsKICAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgcy0+bVR5cGVzW2N0XS5zZXQoc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKSk7Ci0gICAgICAgIHMtPm1TbG90TmFtZXNbY3RdID0gc3MtPm1TbG90TmFtZXNbY3RdOwogICAgICAgICBzLT5tU2xvdFdyaXRhYmxlW2N0XSA9IHNzLT5tU2xvdFdyaXRhYmxlW2N0XTsKICAgICB9CiAKQEAgLTQyOCwxOCArNDA1LDYgQEAKICAgICByZXR1cm4gczsKIH0KIAotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUYoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1GbG9hdERlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUkzMihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW50MzJEZWZpbmVzLmFkZChTdHJpbmc4KG5hbWUpLCB2YWx1ZSk7Ci19Ci0KIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuaCBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKaW5kZXggMzVhYmFkZi4uNTBlOGE0YyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5oCkBAIC0yMSw5ICsyMSw3IEBACiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHRFbnYuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLXN0cnVjdCBBQ0NzY3JpcHQ7CitzdHJ1Y3QgQkNDc2NyaXB0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0LDcgKzMyLDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0CiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkodWludDMyX3QgbGF1bmNoSW5kZXgpOworICAgIHR5cGVkZWYgaW50ICgqUnVuU2NyaXB0X3QpKCk7CiAgICAgdHlwZWRlZiB2b2lkICgqVm9pZEZ1bmNfdCkoKTsKIAogICAgIFNjcmlwdEMoQ29udGV4dCAqKTsKQEAgLTQ0LDE4ICs0MiwzMyBAQAogICAgICAgICBpbnQgbVZlcnNpb25NYWpvcjsKICAgICAgICAgaW50IG1WZXJzaW9uTWlub3I7CiAKLSAgICAgICAgUnVuU2NyaXB0X3QgbVNjcmlwdDsKKyAgICAgICAgUnVuU2NyaXB0X3QgbVJvb3Q7CiAgICAgICAgIFZvaWRGdW5jX3QgbUluaXQ7Ci0KLSAgICAgICAgdm9pZCAqKiBtU2xvdFBvaW50ZXJzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIH07CiAKICAgICBQcm9ncmFtX3QgbVByb2dyYW07CiAKLSAgICBBQ0NzY3JpcHQqICAgIG1BY2NTY3JpcHQ7CisgICAgQkNDc2NyaXB0KiAgICBtQmNjU2NyaXB0OwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqcHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKikgY29uc3Q7CisKKworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKTsKKworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0KTsKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCwgdWludDMyX3QgeFN0YXJ0LCB1aW50MzJfdCB4RW5kKTsKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCwgdWludDMyX3QgeFN0YXJ0LCB1aW50MzJfdCB5U3RhcnQsIHVpbnQzMl90IHhFbmQsIHVpbnQzMl90IHlFbmQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkgeyByZXR1cm4gTlVMTDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICopOworICAgIHZvaWQgc2V0dXBHTFN0YXRlKENvbnRleHQgKik7CisgICAgU2NyaXB0ICogc2V0VExTKFNjcmlwdCAqKTsKIH07CiAKIGNsYXNzIFNjcmlwdENTdGF0ZQpAQCAtNjcsMjcgKzgwLDIxIEBACiAgICAgU2NyaXB0QyAqbVNjcmlwdDsKIAogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUNvbnN0YW50QnVmZmVyVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1JbnZva2FibGVOYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAvL1N0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogCiAgICAgdm9pZCBjbGVhcigpOwogICAgIHZvaWQgcnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKTsKLSAgICB2b2lkIGFwcGVuZFZhckRlZmluZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwotICAgIHZvaWQgYXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwogCiAgICAgc3RydWN0IFN5bWJvbFRhYmxlX3QgewogICAgICAgICBjb25zdCBjaGFyICogbU5hbWU7CiAgICAgICAgIHZvaWQgKiBtUHRyOwotICAgICAgICBjb25zdCBjaGFyICogbVJldDsKLSAgICAgICAgY29uc3QgY2hhciAqIG1QYXJhbTsKICAgICB9OwotICAgIHN0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CisgICAgLy9zdGF0aWMgU3ltYm9sVGFibGVfdCBnU3ltc1tdOwogICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKik7Ci0gICAgc3RhdGljIHZvaWQgYXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKTsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsaW50PiBtSW50MzJEZWZpbmVzOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsZmxvYXQ+IG1GbG9hdERlZmluZXM7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICopOworICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKaW5kZXggMjAyY2EzZC4uZWEwMTEzNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCkBAIC0xNywxOCArMTcsMTAgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotI2luY2x1ZGUgInJzTm9pc2UuaCIKIAogI2luY2x1ZGUgImFjYy9hY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKIAotI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCiAjaW5jbHVkZSA8dGltZS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTM5LDI1MiArMzEsMTEgQEAKICAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAogICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci19IHZlYzNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLSAgICBmbG9hdCB6OwotICAgIGZsb2F0IHc7Ci19IHZlYzRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLX0gdmVjMl90OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElPIHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGZsb2F0IFNDX2xvYWRGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICAvL0xPR0UoImxvYWRGICVpICVpID0gJWYgJXgiLCBiYW5rLCBvZmZzZXQsIGYsICgoaW50ICopJmYpWzBdKTsKLSAgICByZXR1cm4gZltvZmZzZXRdOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19sb2FkSTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPih2cCk7Ci0gICAgLy9MT0dFKCJsb2FkSTMyICVpICVpID0gJWkiLCBiYW5rLCBvZmZzZXQsIHQpOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyBmbG9hdCogU0NfbG9hZEFycmF5Rih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgcmV0dXJuIGYgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90KiBTQ19sb2FkQXJyYXlJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHZwKTsKLSAgICByZXR1cm4gaSArIG9mZnNldDsKLX0KLQotc3RhdGljIGZsb2F0KiBTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRihSc1NpbXBsZU1lc2ggbWVzaCwgdWludDMyX3QgaWR4KQotewotICAgIFNpbXBsZU1lc2ggKnRtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtZXNoKTsKLSAgICB2b2lkICp2cCA9IHRtLT5tVmVydGV4QnVmZmVyc1tpZHhdLT5nZXRQdHIoKTs7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdXBkYXRlU2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggbWVzaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG1lc2gpOwotICAgIHNtLT51cGxvYWRBbGwocnNjKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2xvYWRVMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IHVpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4odnApOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2xvYWRWZWM0KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX1ZlY3RvcjQgKnYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KHYsICZmW29mZnNldF0sIHNpemVvZihyc2NfVmVjdG9yNCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19sb2FkTWF0cml4KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkobSwgJmZbb2Zmc2V0XSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBmbG9hdCB2KQotewotICAgIC8vTE9HRSgic3RvcmVGICVpICVpICVmIiwgYmFuaywgb2Zmc2V0LCB2KTsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICBmW29mZnNldF0gPSB2OwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBpbnQzMl90ICpmID0gc3RhdGljX2Nhc3Q8aW50MzJfdCAqPih2cCk7Ci0gICAgc3RhdGljX2Nhc3Q8aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICB1aW50MzJfdCAqZiA9IHN0YXRpY19jYXN0PHVpbnQzMl90ICo+KHZwKTsKLSAgICBzdGF0aWNfY2FzdDx1aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVmVjNCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IHJzY19WZWN0b3I0ICp2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCB2LCBzaXplb2YocnNjX1ZlY3RvcjQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVNYXRyaXgodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZlYzMgcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ192ZWMzTm9ybSh2ZWMzX3QgKnYpCi17Ci0gICAgZmxvYXQgbGVuID0gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56KTsKLSAgICBsZW4gPSAxIC8gbGVuOwotICAgIHYtPnggKj0gbGVuOwotICAgIHYtPnkgKj0gbGVuOwotICAgIHYtPnogKj0gbGVuOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjM0xlbmd0aChjb25zdCB2ZWMzX3QgKnYpCi17Ci0gICAgcmV0dXJuIHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNBZGQodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTdWIodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCAtIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55IC0gcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogLSByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNDcm9zcyh2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBmbG9hdCB4ID0gbGhzLT55ICogcmhzLT56ICAtIGxocy0+eiAqIHJocy0+eTsKLSAgICBmbG9hdCB5ID0gbGhzLT56ICogcmhzLT54ICAtIGxocy0+eCAqIHJocy0+ejsKLSAgICBmbG9hdCB6ID0gbGhzLT54ICogcmhzLT55ICAtIGxocy0+eSAqIHJocy0+eDsKLSAgICBkZXN0LT54ID0geDsKLSAgICBkZXN0LT55ID0geTsKLSAgICBkZXN0LT56ID0gejsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzNEb3QoY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIHJldHVybiBsaHMtPnggKiByaHMtPnggKyBsaHMtPnkgKiByaHMtPnkgKyBsaHMtPnogKiByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTY2FsZSh2ZWMzX3QgKmxocywgZmxvYXQgc2NhbGUpCi17Ci0gICAgbGhzLT54ICo9IHNjYWxlOwotICAgIGxocy0+eSAqPSBzY2FsZTsKLSAgICBsaHMtPnogKj0gc2NhbGU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmVjNCByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzROb3JtKHZlYzRfdCAqdikKLXsKLSAgICBmbG9hdCBsZW4gPSBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci0gICAgbGVuID0gMSAvIGxlbjsKLSAgICB2LT54ICo9IGxlbjsKLSAgICB2LT55ICo9IGxlbjsKLSAgICB2LT56ICo9IGxlbjsKLSAgICB2LT53ICo9IGxlbjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzRMZW5ndGgoY29uc3QgdmVjNF90ICp2KQotewotICAgIHJldHVybiBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzRBZGQodmVjNF90ICpkZXN0LCBjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci0gICAgZGVzdC0+dyA9IGxocy0+dyArIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFN1Yih2ZWM0X3QgKmRlc3QsIGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54IC0gcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgLSByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiAtIHJocy0+ejsKLSAgICBkZXN0LT53ID0gbGhzLT53IC0gcmhzLT53OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjNERvdChjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgcmV0dXJuIGxocy0+eCAqIHJocy0+eCArIGxocy0+eSAqIHJocy0+eSArIGxocy0+eiAqIHJocy0+eiArIGxocy0+dyAqIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFNjYWxlKHZlYzRfdCAqbGhzLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBsaHMtPnggKj0gc2NhbGU7Ci0gICAgbGhzLT55ICo9IHNjYWxlOwotICAgIGxocy0+eiAqPSBzY2FsZTsKLSAgICBsaHMtPncgKj0gc2NhbGU7Ci19CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWF0aCByb3V0aW5lcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSNkZWZpbmUgUEkgMy4xNDE1OTI2ZgotI2RlZmluZSBERUdfVE9fUkFEIFBJIC8gMTgwLjBmCi0jZGVmaW5lIFJBRF9UT19ERUcgMTgwLjBmIC8gUEkKLQogc3RhdGljIGZsb2F0IFNDX3NpbmZfZmFzdChmbG9hdCB4KQogewogICAgIGNvbnN0IGZsb2F0IEEgPSAgIDEuMGYgLyAoMi4wZiAqIE1fUEkpOwpAQCAtMzIzLDYgKzc0LDcgQEAKICAgICByZXR1cm4gMC4yMjE1ZiAqICh5ICogZmFic2YoeSkgLSB5KSArIHk7CiB9CiAKKwogc3RhdGljIGZsb2F0IFNDX3JhbmRmKGZsb2F0IG1heCkKIHsKICAgICBmbG9hdCByID0gKGZsb2F0KXJhbmQoKTsKQEAgLTMzNSwxMDQgKzg3LDIwIEBACiAgICAgcmV0dXJuIHIgLyBSQU5EX01BWCAqIChtYXggLSBtaW4pICsgbWluOwogfQogCi1zdGF0aWMgaW50IFNDX3NpZ24oaW50IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaShpbnQgbWF4KQogewotICAgIHJldHVybiAodmFsdWUgPiAwKSAtICh2YWx1ZSA8IDApOworICAgIHJldHVybiAoaW50KVNDX3JhbmRmKG1heCk7CiB9CiAKLXN0YXRpYyBmbG9hdCBTQ19zaWduZihmbG9hdCB2YWx1ZSkKK3N0YXRpYyBpbnQgU0NfcmFuZGkyKGludCBtaW4sIGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYyKG1pbiwgbWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX2NsYW1wZihmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkKK3N0YXRpYyBmbG9hdCBTQ19mcmFjKGZsb2F0IHYpCiB7Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgU0NfY2xhbXAoaW50IGFtb3VudCwgaW50IGxvdywgaW50IGhpZ2gpCi17Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXhmKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPiBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19taW5mKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19zcXJmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgKiB2OwotfQotCi1zdGF0aWMgaW50IFNDX3NxcihpbnQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19mcmFjZihmbG9hdCB2KQotewotICAgIHJldHVybiB2IC0gZmxvb3JmKHYpOwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfcm91bmRmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIGZsb29yZih2ICsgMC40OTk5OTk5OTk5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kaXN0ZjMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICBmbG9hdCB6ID0gejIgLSB6MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hZ2YyKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIHNxcnRmKGEgKiBhICsgYiAqIGIpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjMoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYiArIGMgKiBjKTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3JhZGYoZmxvYXQgZGVncmVlcykKLXsKLSAgICByZXR1cm4gZGVncmVlcyAqIERFR19UT19SQUQ7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kZWdmKGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfVE9fREVHOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbGVycGYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKLXsKLSAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX25vcm1mKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gKHZhbHVlIC0gc3RhcnQpIC8gKHN0b3AgLSBzdGFydCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXBmKGZsb2F0IG1pblN0YXJ0LCBmbG9hdCBtaW5TdG9wLCBmbG9hdCBtYXhTdGFydCwgZmxvYXQgbWF4U3RvcCwgZmxvYXQgdmFsdWUpCi17Ci0gICAgcmV0dXJuIG1heFN0YXJ0ICsgKG1heFN0YXJ0IC0gbWF4U3RvcCkgKiAoKHZhbHVlIC0gbWluU3RhcnQpIC8gKG1pblN0b3AgLSBtaW5TdGFydCkpOworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTUxMSw2ICsxNzksMjQgQEAKICAgICByZXR1cm4gdGltZWluZm8tPnRtX3llYXI7CiB9CiAKK3N0YXRpYyBpbnQ2NF90IFNDX3VwdGltZU1pbGxpczIoKQoreworICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK30KKworc3RhdGljIGludDY0X3QgU0Nfc3RhcnRUaW1lTWlsbGlzMigpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiBzYy0+bUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpczsKK30KKworc3RhdGljIGludDY0X3QgU0NfZWxhcHNlZFRpbWVNaWxsaXMyKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpCisgICAgICAgICAgICAtIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOworfQorCiBzdGF0aWMgaW50MzJfdCBTQ191cHRpbWVNaWxsaXMoKQogewogICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKQEAgLTYwMiw0NzcgKzI4OCwxNDMgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBTQ192ZWMyUmFuZChmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pCi17Ci0gICAgZmxvYXQgYW5nbGUgPSBTQ19yYW5kZihQSSAqIDIpOwotICAgIGZsb2F0IGxlbiA9IFNDX3JhbmRmKG1heExlbik7Ci0gICAgdmVjWzBdID0gbGVuICogc2luZihhbmdsZSk7Ci0gICAgdmVjWzFdID0gbGVuICogY29zZihhbmdsZSk7Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRleHQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ19iaW5kVGV4dHVyZShSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBmcykKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjLCBwZnMpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVZlcnRleChSc1Byb2dyYW1WZXJ0ZXggcHYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgocnNjLCBwdik7Ci0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWUAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOwotfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEcmF3aW5nCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZsb2F0IHZ0eFtdID0geyB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyIH07Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfTElORVMsIDAsIDIpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgdnR4W10gPSB7IHgsIHksIHogfTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSk7Ci0gICAgfQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1BPSU5UUywgMCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vTE9HRSgiUXVhZCIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOwotCi0gICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OwotICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDIsIDgsIFJTX0tJTkRfVEVYVFVSRSwgZmFsc2UsICh1aW50MzJfdCl0ZXgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KQotewotICAgIFNDX2RyYXdRdWFkVGV4Q29vcmRzKHgxLCB5MSwgejEsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDIsIHkyLCB6MiwgMSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MywgeTMsIHozLCAxLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHg0LCB5NCwgejQsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXAocnNjLT5nZXRWZXJ0ZXgoKSk7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotCi0gICAgLy9HTGludCBjcm9wWzRdID0gezAsIGgsIHcsIC1ofTsKLQotICAgIGZsb2F0IHNoID0gcnNjLT5nZXRIZWlnaHQoKTsKLQotICAgIFNDX2RyYXdRdWFkKHgsICAgc2ggLSB5LCAgICAgeiwKLSAgICAgICAgICAgICAgICB4K3csIHNoIC0geSwgICAgIHosCi0gICAgICAgICAgICAgICAgeCt3LCBzaCAtICh5K2gpLCB6LAotICAgICAgICAgICAgICAgIHgsICAgc2ggLSAoeStoKSwgeik7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXAuZ2V0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsCi0gICAgICAgIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR0xpbnQgY3JvcFs0XSA9IHtjeDAsIGN5MCwgY3gxLCBjeTF9OwotICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICBnbERyYXdUZXhmT0VTKHgsIHksIHosIHcsIGgpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKLSAgICBmbG9hdCB2b3V0WzRdOwotCi0gICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKLSAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7Ci0gICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7Ci0gICAgdm91dFswXSAvPSB2b3V0WzNdOwotICAgIHZvdXRbMV0gLz0gdm91dFszXTsKLSAgICB2b3V0WzJdIC89IHZvdXRbM107Ci0KLSAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLSAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLQotICAgIHZvdXRbMF0gLT0gdy8yOwotICAgIHZvdXRbMV0gLT0gaC8yOwotCi0gICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOwotCi0gICAgLy8gVSwgViwgVywgSAotICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKLXsKLSAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCi0gICAgICAgICAgICAgICAgeDIsIHkyLCB6LAotICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKLSAgICAgICAgICAgICAgICB4MSwgeTEsIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggdnNtKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc20tPnJlbmRlcihyc2MpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaFJhbmdlKFJzU2ltcGxlTWVzaCB2c20sIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzbS0+cmVuZGVyUmFuZ2UocnNjLCBzdGFydCwgbGVuKTsKLX0KLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVgoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclswXSA9IHI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMV0gPSBnOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzJdID0gYjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclszXSA9IGE7Ci0gICAgaWYgKCFyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyLCBnLCBiLCBhKTsKLSAgICB9CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIC8vTE9HRSgiU0NfYWxsb2NHZXREaW1YIGE9JXAiLCBhKTsKKyAgICAvL0xPR0UoIiB0eXBlPSVwIiwgYS0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2FtYmllbnQoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kaWZmdXNlKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3BlY3VsYXIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZW1pc3Npb24oZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc2hpbmluZXNzKGZsb2F0IHMpCi17Ci0gICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3BvaW50QXR0ZW51YXRpb24oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyBhLCBiLCBjIH07Ci0gICAgZ2xQb2ludFBhcmFtZXRlcmZ2KEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2JUb1JnYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCogcmdiKQotewotICAgIGZsb2F0IHJlZCA9IDAuMGY7Ci0gICAgZmxvYXQgZ3JlZW4gPSAwLjBmOwotICAgIGZsb2F0IGJsdWUgPSAwLjBmOwotCi0gICAgZmxvYXQgeCA9IGg7Ci0gICAgZmxvYXQgeSA9IHM7Ci0gICAgZmxvYXQgeiA9IGI7Ci0KLSAgICBmbG9hdCBoZiA9ICh4IC0gKGludCkgeCkgKiA2LjBmOwotICAgIGludCBpaGYgPSAoaW50KSBoZjsKLSAgICBmbG9hdCBmID0gaGYgLSBpaGY7Ci0gICAgZmxvYXQgcHYgPSB6ICogKDEuMGYgLSB5KTsKLSAgICBmbG9hdCBxdiA9IHogKiAoMS4wZiAtIHkgKiBmKTsKLSAgICBmbG9hdCB0diA9IHogKiAoMS4wZiAtIHkgKiAoMS4wZiAtIGYpKTsKLQotICAgIHN3aXRjaCAoaWhmKSB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSB0djsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgLy8gR3JlZW4gaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBxdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSB0djsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgLy8gQmx1ZSBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSBxdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJlZCA9IHR2OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSBxdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJnYlswXSA9IHJlZDsKLSAgICByZ2JbMV0gPSBncmVlbjsKLSAgICByZ2JbMl0gPSBibHVlOwotfQotCi1zdGF0aWMgaW50IFNDX2hzYlRvQWJncihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIGZsb2F0IHJnYlszXTsKLSAgICBTQ19oc2JUb1JnYihoLCBzLCBiLCByZ2IpOwotICAgIHJldHVybiBpbnQoYSAgICAgICogMjU1LjBmKSA8PCAyNCB8Ci0gICAgICAgICAgIGludChyZ2JbMl0gKiAyNTUuMGYpIDw8IDE2IHwKLSAgICAgICAgICAgaW50KHJnYlsxXSAqIDI1NS4wZikgPDwgIDggfAotICAgICAgICAgICBpbnQocmdiWzBdICogMjU1LjBmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1ZKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7Ci0gICAgfQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGJhc2VNaXBMZXZlbCkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVooUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWigpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1MT0QoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1MT0QoKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc3luY1RvR0woUnNBbGxvY2F0aW9uIHZhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltRmFjZXMoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltRmFjZXMoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfQ2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIC8vTE9HRSgiYyAlZiAlZiAlZiAlZiIsIHIsIGcsIGIsIGEpOwotICAgIEdFVF9UTFMoKTsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdID0gYjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOwotfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0YoY29uc3QgY2hhciAqcywgZmxvYXQgZikKLXsKLSAgICBMT0dFKCIlcyAlZiIsIHMsIGYpOwotfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0hleEYoY29uc3QgY2hhciAqcywgZmxvYXQgZikKLXsKLSAgICBMT0dFKCIlcyAweCV4IiwgcywgKigoaW50ICopICgmZikpKTsKK3N0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKSB7CisgICAgTE9HRSgiJXMgJWYsIDB4JTA4eCIsIHMsIGYsICooKGludCAqKSAoJmYpKSk7CiB9Ci0KLXN0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkKLXsKLSAgICBMT0dFKCIlcyAlaSIsIHMsIGkpOworc3RhdGljIHZvaWQgU0NfZGVidWdGdjIoY29uc3QgY2hhciAqcywgcnN2Rl8yIGZ2KSB7CisgICAgZmxvYXQgKmYgPSAoZmxvYXQgKikmZnY7CisgICAgTE9HRSgiJXMgeyVmLCAlZn0iLCBzLCBmWzBdLCBmWzFdKTsKIH0KLQotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCBpKTsKK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYzKGNvbnN0IGNoYXIgKnMsIHJzdkZfNCBmdikgeworICAgIGZsb2F0ICpmID0gKGZsb2F0ICopJmZ2OworICAgIExPR0UoIiVzIHslZiwgJWYsICVmfSIsIHMsIGZbMF0sIGZbMV0sIGZbMl0pOwogfQotCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworc3RhdGljIHZvaWQgU0NfZGVidWdGdjQoY29uc3QgY2hhciAqcywgcnN2Rl80IGZ2KSB7CisgICAgZmxvYXQgKmYgPSAoZmxvYXQgKikmZnY7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmfSIsIHMsIGZbMF0sIGZbMV0sIGZbMl0sIGZbM10pOwogfQotCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgdWludDMyX3QgYyA9IDA7Ci0gICAgYyB8PSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIGMgfD0gKCh1aW50MzJfdCkoZyAqIDI1NS5mICsgMC41ZikpIDw8IDg7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKSkgPDwgMTY7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShhICogMjU1LmYgKyAwLjVmKSkgPDwgMjQ7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvNTY1KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgdWludDMyX3QgaXIgPSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGlnID0gKHVpbnQzMl90KShnICogMjU1LmYgKyAwLjVmKTsKLSAgICB1aW50MzJfdCBpYiA9ICh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41Zik7Ci0gICAgcmV0dXJuIHJzODg4dG81NjUoaXIsIGlnLCBpYik7CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpIHsKKyAgICBMT0dFKCIlcyAlaSAgMHgleCIsIHMsIGksIGkpOwogfQogCiBzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKQogewogICAgIEdFVF9UTFMoKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50ICVpICVpICVpIiwgY21kSUQsIGxlbiwgd2FpdEZvclNwYWNlKTsKICAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIHdhaXRGb3JTcGFjZSAhPSAwKTsKIH0KIAogc3RhdGljIHZvaWQgU0Nfc2NyaXB0Q2FsbChpbnQgc2NyaXB0SUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzYy0+cnVuU2NyaXB0KChTY3JpcHQgKilzY3JpcHRJRCwgMCk7CisgICAgcnNjLT5ydW5TY3JpcHQoKFNjcmlwdCAqKXNjcmlwdElEKTsKK30KKworaW50IFNDX2RpdnNpMyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLyBiOworfQorCitpbnQgU0NfZ2V0QWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jID0gc2MtPnB0clRvQWxsb2NhdGlvbihwdHIpOworICAgIHJldHVybiAoaW50KWFsbG9jOworfQorCisKK3ZvaWQgU0NfRm9yRWFjaGlpKFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmluKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBOVUxMKTsKK30KKwordm9pZCBTQ19Gb3JFYWNoaWlpKFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmluLCBSc0FsbG9jYXRpb24gdm91dCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCk7Cit9CisKK3ZvaWQgU0NfRm9yRWFjaGlpaWkoUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2aW4sIGludCB4U3RhcnQsIGludCB4RW5kKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBOVUxMLCB4U3RhcnQsIHhFbmQpOworfQorCit2b2lkIFNDX0ZvckVhY2hpaWlpaShSc1NjcmlwdCB2cywgUnNBbGxvY2F0aW9uIHZpbiwgUnNBbGxvY2F0aW9uIHZvdXQsIGludCB4U3RhcnQsIGludCB4RW5kKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB4U3RhcnQsIHhFbmQpOworfQorCit2b2lkIFNDX0ZvckVhY2hpaWlpaWkoUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2aW4sIGludCB4U3RhcnQsIGludCB5U3RhcnQsIGludCB4RW5kLCBpbnQgeUVuZCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZpbik7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgTlVMTCwgeFN0YXJ0LCB5U3RhcnQsIHhFbmQsIHlFbmQpOworfQorCit2b2lkIFNDX0ZvckVhY2hpaWlpaWlpKFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmluLCBSc0FsbG9jYXRpb24gdm91dCwgaW50IHhTdGFydCwgaW50IHlTdGFydCwgaW50IHhFbmQsIGludCB5RW5kKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB4U3RhcnQsIHlTdGFydCwgeEVuZCwgeUVuZCk7CiB9CiAKIApAQCAtMTA4MCwzMTEgKzQzMiw5MiBAQAogLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgU2NyaXB0Q1N0YXRlOjpnU3ltc1tdID0gewotICAgIC8vIElPCi0gICAgeyAibG9hZEkzMiIsICh2b2lkICopJlNDX2xvYWRJMzIsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50KSIgfSwKLSAgICAvL3sgImxvYWRVMzIiLCAodm9pZCAqKSZTQ19sb2FkVTMyLCAidW5zaWduZWQgaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEYiLCAodm9pZCAqKSZTQ19sb2FkRiwKLSAgICAgICAgImZsb2F0IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5RiIsICh2b2lkICopJlNDX2xvYWRBcnJheUYsCi0gICAgICAgICJmbG9hdCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkQXJyYXlJMzIiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlJMzIsCi0gICAgICAgICJpbnQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZFZlYzQiLCAodm9pZCAqKSZTQ19sb2FkVmVjNCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkTWF0cml4IiwgKHZvaWQgKikmU0NfbG9hZE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJzdG9yZUkzMiIsICh2b2lkICopJlNDX3N0b3JlSTMyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgLy97ICJzdG9yZVUzMiIsICh2b2lkICopJlNDX3N0b3JlVTMyLCAidm9pZCIsICIoaW50LCBpbnQsIHVuc2lnbmVkIGludCkiIH0sCi0gICAgeyAic3RvcmVGIiwgKHZvaWQgKikmU0Nfc3RvcmVGLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0KSIgfSwKLSAgICB7ICJzdG9yZVZlYzQiLCAodm9pZCAqKSZTQ19zdG9yZVZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVNYXRyaXgiLCAodm9pZCAqKSZTQ19zdG9yZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiIsICh2b2lkICopJlNDX2xvYWRTaW1wbGVNZXNoVmVydGljZXNGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAidXBkYXRlU2ltcGxlTWVzaCIsICh2b2lkICopJlNDX3VwZGF0ZVNpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAorLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCiAKLSAgICAvLyBtYXRoCi0gICAgeyAibW9kZiIsICh2b2lkICopJmZtb2QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJhYnMiLCAodm9pZCAqKSZhYnMsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAiYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaW5mX2Zhc3QiLCAodm9pZCAqKSZTQ19zaW5mX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2ZfZmFzdCIsICh2b2lkICopJlNDX2Nvc2ZfZmFzdCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZiIsICh2b2lkICopJnNpbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2YiLCAodm9pZCAqKSZjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhc2luZiIsICh2b2lkICopJmFzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhY29zZiIsICh2b2lkICopJmFjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuZiIsICh2b2lkICopJmF0YW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZiIsICh2b2lkICopJlNDX3JhbmRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZjIiLCAodm9pZCAqKSZTQ19yYW5kZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImZyYWNmIiwgKHZvaWQgKikmU0NfZnJhY2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNlaWxmIiwgKHZvaWQgKikmY2VpbGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJvdW5kZiIsICh2b2lkICopJlNDX3JvdW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZXhwZiIsICh2b2lkICopJmV4cGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxvZ2YiLCAodm9pZCAqKSZsb2dmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb3dmIiwgKHZvaWQgKikmcG93ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1heGYiLCAodm9pZCAqKSZTQ19tYXhmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWluZiIsICh2b2lkICopJlNDX21pbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzcXJ0IiwgKHZvaWQgKikmc3FydCwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzcXJ0ZiIsICh2b2lkICopJnNxcnRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzcXIiLCAodm9pZCAqKSZTQ19zcXIsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FyZiIsICh2b2lkICopJlNDX3NxcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpZ24iLCAodm9pZCAqKSZTQ19zaWduLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNsYW1wIiwgKHZvaWQgKikmU0NfY2xhbXAsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImNsYW1wZiIsICh2b2lkICopJlNDX2NsYW1wZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjIiLCAodm9pZCAqKSZTQ19kaXN0ZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpc3RmMyIsICh2b2lkICopJlNDX2Rpc3RmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYWdmMiIsICh2b2lkICopJlNDX21hZ2YyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjMiLCAodm9pZCAqKSZTQ19tYWdmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJyYWRmIiwgKHZvaWQgKikmU0NfcmFkZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZGVnZiIsICh2b2lkICopJlNDX2RlZ2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxlcnBmIiwgKHZvaWQgKikmU0NfbGVycGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9ybWYiLCAodm9pZCAqKSZTQ19ub3JtZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXBmIiwgKHZvaWQgKikmU0NfbWFwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZiIsICh2b2lkICopJlNDX25vaXNlZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMiIsICh2b2lkICopJlNDX25vaXNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYzIiwgKHZvaWQgKikmU0Nfbm9pc2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJ0dXJidWxlbmNlZjIiLCAodm9pZCAqKSZTQ190dXJidWxlbmNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYzIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICB7ICJfX2RpdnNpMyIsICh2b2lkICopJlNDX2RpdnNpMyB9LAorCisgICAgLy8gYWxsb2NhdGlvbgorICAgIHsgInJzQWxsb2NhdGlvbkdldERpbVgiLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVggfSwKKyAgICB7ICJyc0FsbG9jYXRpb25HZXREaW1ZIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1ZIH0sCisgICAgeyAicnNBbGxvY2F0aW9uR2V0RGltWiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWiB9LAorICAgIHsgInJzQWxsb2NhdGlvbkdldERpbUxPRCIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltTE9EIH0sCisgICAgeyAicnNBbGxvY2F0aW9uR2V0RGltRmFjZXMiLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUZhY2VzIH0sCisgICAgeyAicnNHZXRBbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfZ2V0QWxsb2NhdGlvbiB9LAorCisgICAgLy8gRGVidWcKKyAgICB7ICJfWjdyc0RlYnVnUEtjZiIsICh2b2lkICopJlNDX2RlYnVnRiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NEdjJfZiIsICh2b2lkICopJlNDX2RlYnVnRnYyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY0R2M19mIiwgKHZvaWQgKikmU0NfZGVidWdGdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjRHY0X2YiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2NCB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NpIiwgKHZvaWQgKikmU0NfZGVidWdJMzIgfSwKKyAgICAvL2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKik7CisKKworICAgIC8vIFJTIE1hdGgKKyAgICB7ICJfWjZyc1JhbmRpIiwgKHZvaWQgKikmU0NfcmFuZGkgfSwKKyAgICB7ICJfWjZyc1JhbmRpaSIsICh2b2lkICopJlNDX3JhbmRpMiB9LAorICAgIHsgIl9aNnJzUmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiB9LAorICAgIHsgIl9aNnJzUmFuZGZmIiwgKHZvaWQgKikmU0NfcmFuZGYyIH0sCisgICAgeyAiX1o2cnNGcmFjZiIsICh2b2lkICopJlNDX2ZyYWMgfSwKIAogICAgIC8vIHRpbWUKLSAgICB7ICJzZWNvbmQiLCAodm9pZCAqKSZTQ19zZWNvbmQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImhvdXIiLCAodm9pZCAqKSZTQ19ob3VyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImRheSIsICh2b2lkICopJlNDX2RheSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtb250aCIsICh2b2lkICopJlNDX21vbnRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInllYXIiLCAodm9pZCAqKSZTQ195ZWFyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInVwdGltZU1pbGxpcyIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJzdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAiZWxhcHNlZFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX2VsYXBzZWRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKKyAgICB7ICJyc1NlY29uZCIsICh2b2lkICopJlNDX3NlY29uZCB9LAorICAgIHsgInJzTWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlIH0sCisgICAgeyAicnNIb3VyIiwgKHZvaWQgKikmU0NfaG91ciB9LAorICAgIHsgInJzRGF5IiwgKHZvaWQgKikmU0NfZGF5IH0sCisgICAgeyAicnNNb250aCIsICh2b2lkICopJlNDX21vbnRoIH0sCisgICAgeyAicnNZZWFyIiwgKHZvaWQgKikmU0NfeWVhciB9LAorICAgIHsgInJzVXB0aW1lTWlsbGlzIiwgKHZvaWQqKSZTQ191cHRpbWVNaWxsaXMyIH0sCisgICAgeyAicnNTdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpczIgfSwKKyAgICB7ICJyc0VsYXBzZWRUaW1lTWlsbGlzIiwgKHZvaWQqKSZTQ19lbGFwc2VkVGltZU1pbGxpczIgfSwKKworICAgIHsgInJzU2VuZFRvQ2xpZW50IiwgKHZvaWQgKikmU0NfdG9DbGllbnQgfSwKIAogICAgIC8vIG1hdHJpeAotICAgIHsgIm1hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRGbG9hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRGbG9hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpmKSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpuZXdtYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkUm90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkU2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkVHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpsaHMsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKKyAgICB7ICJyc01hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSB9LAorICAgIHsgInJzTWF0cml4TG9hZEZsb2F0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZEZsb2F0IH0sCisgICAgeyAicnNNYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCB9LAorICAgIHsgInJzTWF0cml4TG9hZFJvdGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRSb3RhdGUgfSwKKyAgICB7ICJyc01hdHJpeExvYWRTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRTY2FsZSB9LAorICAgIHsgInJzTWF0cml4TG9hZFRyYW5zbGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRUcmFuc2xhdGUgfSwKKyAgICB7ICJyc01hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSB9LAorICAgIHsgInJzTWF0cml4TXVsdGlwbHkiLCAodm9pZCAqKSZTQ19tYXRyaXhNdWx0aXBseSB9LAorICAgIHsgInJzTWF0cml4Um90YXRlIiwgKHZvaWQgKikmU0NfbWF0cml4Um90YXRlIH0sCisgICAgeyAicnNNYXRyaXhTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeFNjYWxlIH0sCisgICAgeyAicnNNYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUgfSwKIAotICAgIC8vIHZlY3RvcgotICAgIHsgInZlYzJSYW5kIiwgKHZvaWQgKikmU0NfdmVjMlJhbmQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pIiB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpIH0sCisgICAgeyAiX1o5cnNGb3JFYWNoaWlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpaSB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpaWkiLCAodm9pZCAqKSZTQ19Gb3JFYWNoaWlpaSB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpaWlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpaWlpIH0sCisgICAgeyAiX1o5cnNGb3JFYWNoaWlpaWlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpaWlpaSB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpaWlpaWkiLCAodm9pZCAqKSZTQ19Gb3JFYWNoaWlpaWlpaSB9LAogCi0gICAgLy8gdmVjMwotICAgIHsgInZlYzNOb3JtIiwgKHZvaWQgKikmU0NfdmVjM05vcm0sCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzTGVuZ3RoIiwgKHZvaWQgKikmU0NfdmVjM0xlbmd0aCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzQWRkIiwgKHZvaWQgKikmU0NfdmVjM0FkZCwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzU3ViIiwgKHZvaWQgKikmU0NfdmVjM1N1YiwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzQ3Jvc3MiLCAodm9pZCAqKSZTQ192ZWMzQ3Jvc3MsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0RvdCIsICh2b2lkICopJlNDX3ZlYzNEb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1NjYWxlIiwgKHZvaWQgKikmU0NfdmVjM1NjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIC8vIHZlYzQKLSAgICB7ICJ2ZWM0Tm9ybSIsICh2b2lkICopJlNDX3ZlYzROb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNExlbmd0aCIsICh2b2lkICopJlNDX3ZlYzRMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNEFkZCIsICh2b2lkICopJlNDX3ZlYzRBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFN1YiIsICh2b2lkICopJlNDX3ZlYzRTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNERvdCIsICh2b2lkICopJlNDX3ZlYzREb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFNjYWxlIiwgKHZvaWQgKikmU0NfdmVjNFNjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorICAgIC8veyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0IH0sCisgICAgLy97ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QgfSwKIAotICAgIC8vIGNvbnRleHQKLSAgICB7ICJiaW5kUHJvZ3JhbUZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVZlcnRleCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtVmVydGV4LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kU2FtcGxlciIsICh2b2lkICopJlNDX2JpbmRTYW1wbGVyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgeyAiYmluZFRleHR1cmUiLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotCi0gICAgLy8gdnAKLSAgICB7ICJ2cExvYWRNb2RlbE1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZE1vZGVsTWF0cml4LAotICAgICAgICAidm9pZCIsICIodm9pZCAqKSIgfSwKLSAgICB7ICJ2cExvYWRUZXh0dXJlTWF0cml4IiwgKHZvaWQgKikmU0NfdnBMb2FkVGV4dHVyZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCisgICAgeyAic2NyaXB0Q2FsbCIsICh2b2lkICopJlNDX3NjcmlwdENhbGwgfSwKIAogCi0KLSAgICAvLyBkcmF3aW5nCi0gICAgeyAiZHJhd1JlY3QiLCAodm9pZCAqKSZTQ19kcmF3UmVjdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KSIgfSwKLSAgICB7ICJkcmF3UXVhZCIsICh2b2lkICopJlNDX2RyYXdRdWFkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkiIH0sCi0gICAgeyAiZHJhd1F1YWRUZXhDb29yZHMiLCAodm9pZCAqKSZTQ19kcmF3UXVhZFRleENvb3JkcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2UiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkiIH0sCi0gICAgeyAiZHJhd0xpbmUiLCAodm9pZCAqKSZTQ19kcmF3TGluZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpIiB9LAotICAgIHsgImRyYXdQb2ludCIsICh2b2lkICopJlNDX2RyYXdQb2ludCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQgaXNtKSIgfSwKLSAgICB7ICJkcmF3U2ltcGxlTWVzaFJhbmdlIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2hSYW5nZSwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbikiIH0sCi0KLQotICAgIC8vIG1pc2MKLSAgICB7ICJwZkNsZWFyQ29sb3IiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yIiwgKHZvaWQgKikmU0NfY29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiIiwgKHZvaWQgKikmU0NfaHNiLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImhzYlRvUmdiIiwgKHZvaWQgKikmU0NfaHNiVG9SZ2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCopIiB9LAotICAgIHsgImhzYlRvQWJnciIsICh2b2lkICopJlNDX2hzYlRvQWJnciwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImFtYmllbnQiLCAodm9pZCAqKSZTQ19hbWJpZW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpZmZ1c2UiLCAodm9pZCAqKSZTQ19kaWZmdXNlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNwZWN1bGFyIiwgKHZvaWQgKikmU0Nfc3BlY3VsYXIsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZW1pc3Npb24iLCAodm9pZCAqKSZTQ19lbWlzc2lvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzaGluaW5lc3MiLCAodm9pZCAqKSZTQ19zaGluaW5lc3MsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG9pbnRBdHRlbnVhdGlvbiIsICh2b2lkICopJlNDX3BvaW50QXR0ZW51YXRpb24sCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotICAgIHsgInVwbG9hZFRvVGV4dHVyZSIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJ1cGxvYWRUb0J1ZmZlck9iamVjdCIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotICAgIHsgInN5bmNUb0dMIiwgKHZvaWQgKikmU0Nfc3luY1RvR0wsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAiY29sb3JGbG9hdFJHQkF0b1VOb3JtOCIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG9VTm9ybTgsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJjb2xvckZsb2F0UkdCdG81NjUiLCAodm9pZCAqKSZTQ19jb2xvckZsb2F0UkdCQXRvNTY1LAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotCi0gICAgeyAiZ2V0V2lkdGgiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJnZXRIZWlnaHQiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0KLSAgICB7ICJzZW5kVG9DbGllbnQiLCAodm9pZCAqKSZTQ190b0NsaWVudCwKLSAgICAgICAgImludCIsICIodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKSIgfSwKLQotCi0gICAgeyAiZGVidWdGIiwgKHZvaWQgKikmU0NfZGVidWdGLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBmbG9hdCkiIH0sCi0gICAgeyAiZGVidWdJMzIiLCAodm9pZCAqKSZTQ19kZWJ1Z0kzMiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgaW50KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEYiLCAodm9pZCAqKSZTQ19kZWJ1Z0hleEYsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEkzMiIsICh2b2lkICopJlNDX2RlYnVnSGV4STMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotCi0gICAgeyAic2NyaXB0Q2FsbCIsICh2b2lkICopJlNDX3NjcmlwdENhbGwsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0KLSAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChjb25zdCBjaGFyICpzeW0pCkBAIC0xNDAwLDE3ICs1MzMsMyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKQotewotICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOwotICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1SZXQpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tTmFtZSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1QYXJhbSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCI7XG4iKTsKLSAgICAgICAgc3ltcysrOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKworLy8gSW1wbGVtZW50cyByc19jbC5yc2gKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworc3RhdGljIGZsb2F0IFNDX2Fjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3NmKHYpLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXNpbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXRhbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yZih5LCB4KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19jb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNvc2YodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZXhwMTAoZmxvYXQgdikgeworICAgIHJldHVybiBwb3coMTAuZiwgdik7CisKK30KKworc3RhdGljIGZsb2F0IFNDX2ZyYWN0KGZsb2F0IHYsIGludCAqaXB0cikgeworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICBpcHRyWzBdID0gaTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCAoZmxvYXQpcCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19wb3dyKGZsb2F0IHYsIGZsb2F0IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCBwKTsKK30KKworZmxvYXQgU0Nfcm9vdG4oZmxvYXQgdiwgaW50IHIpIHsKKyAgICByZXR1cm4gcG93KHYsIDEuZiAvIHIpOworfQorCitmbG9hdCBTQ19yc3FydChmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZiAvIHNxcnRmKHYpOworfQorCitmbG9hdCBTQ19zaW5jb3MoZmxvYXQgdiwgZmxvYXQgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3NmKHYpOworICAgIHJldHVybiBzaW5mKHYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBzaW5mKHYgKiBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3RhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuZih2ICogTV9QSSk7Cit9CisKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJ0Z2FtbWEiLCAodm9pZCAqKSYgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnRlZ2VyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitzdGF0aWMgdWludDMyX3QgU0NfYWJzX2kzMihpbnQzMl90IHYpIHtyZXR1cm4gYWJzKHYpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19hYnNfaTE2KGludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpYWJzKHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Fic19pOChpbnQ4X3Qgdikge3JldHVybiAodWludDhfdClhYnModik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfY2x6X3UzMih1aW50MzJfdCB2KSB7cmV0dXJuIF9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Nsel91MTYodWludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDhfdCBTQ19jbHpfdTgodWludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIGludDMyX3QgU0NfY2x6X2kzMihpbnQzMl90IHYpIHtyZXR1cm4gKGludDMyX3QpX19idWlsdGluX2NseigodWludDMyX3Qpdik7fQorc3RhdGljIGludDE2X3QgU0NfY2x6X2kxNihpbnQxNl90IHYpIHtyZXR1cm4gKGludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50OF90IFNDX2Nsel9pOChpbnQ4X3Qgdikge3JldHVybiAoaW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWF4X3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21heF91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21heF91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21heF9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19tYXhfaTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19tYXhfaTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWluX3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21pbl91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21pbl91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21pbl9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19taW5faTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19taW5faTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZsb2F0IHV0aWwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgZmxvYXQgU0NfY2xhbXBfZjMyKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQoreworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZGVncmVlcyhmbG9hdCByYWRpYW5zKQoreworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19tYXhfZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01heCh2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taW5fZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01pbih2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taXhfZjMyKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpCit7CisgICAgLy9MT0dFKCJsZXJwZiAlZiAgJWYgICVmIiwgc3RhcnQsIHN0b3AsIGFtb3VudCk7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19yYWRpYW5zKGZsb2F0IGRlZ3JlZXMpCit7CisgICAgcmV0dXJuIGRlZ3JlZXMgKiAoTV9QSSAvIDE4MC5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3N0ZXBfZjMyKGZsb2F0IGVkZ2UsIGZsb2F0IHYpCit7CisgICAgaWYgKHYgPCBlZGdlKSByZXR1cm4gMC5mOworICAgIHJldHVybiAxLmY7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaWduX2YzMihmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiAtMS5mOworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCisKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICAvLyBPcGVuQ0wgbWF0aAorICAgIHsgIl9aNGFjb3NmIiwgKHZvaWQgKikmYWNvc2YgfSwKKyAgICB7ICJfWjVhY29zaGYiLCAodm9pZCAqKSZhY29zaGYgfSwKKyAgICB7ICJfWjZhY29zcGlmIiwgKHZvaWQgKikmU0NfYWNvc3BpIH0sCisgICAgeyAiX1o0YXNpbmYiLCAodm9pZCAqKSZhc2luZiB9LAorICAgIHsgIl9aNWFzaW5oZiIsICh2b2lkICopJmFzaW5oZiB9LAorICAgIHsgIl9aNmFzaW5waWYiLCAodm9pZCAqKSZTQ19hc2lucGkgfSwKKyAgICB7ICJfWjRhdGFuZiIsICh2b2lkICopJmF0YW5mIH0sCisgICAgeyAiX1o1YXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmIH0sCisgICAgeyAiX1o2YXRhbnBpZiIsICh2b2lkICopJlNDX2F0YW5waSB9LAorICAgIHsgIl9aN2F0YW4ycGlmIiwgKHZvaWQgKikmU0NfYXRhbjJwaSB9LAorICAgIHsgIl9aNGNicnRmIiwgKHZvaWQgKikmY2JydGYgfSwKKyAgICB7ICJfWjRjZWlsZiIsICh2b2lkICopJmNlaWxmIH0sCisgICAgeyAiX1o4Y29weXNpZ25mZiIsICh2b2lkICopJmNvcHlzaWduZiB9LAorICAgIHsgIl9aM2Nvc2YiLCAodm9pZCAqKSZjb3NmIH0sCisgICAgeyAiX1o0Y29zaGYiLCAodm9pZCAqKSZjb3NoZiB9LAorICAgIHsgIl9aNWNvc3BpZiIsICh2b2lkICopJlNDX2Nvc3BpIH0sCisgICAgeyAiX1o0ZXJmY2YiLCAodm9pZCAqKSZlcmZjZiB9LAorICAgIHsgIl9aM2VyZmYiLCAodm9pZCAqKSZlcmZmIH0sCisgICAgeyAiX1ozZXhwZiIsICh2b2lkICopJmV4cGYgfSwKKyAgICB7ICJfWjRleHAyZiIsICh2b2lkICopJmV4cDJmIH0sCisgICAgeyAiX1o1ZXhwMTBmIiwgKHZvaWQgKikmU0NfZXhwMTAgfSwKKyAgICB7ICJfWjVleHBtMWYiLCAodm9pZCAqKSZleHBtMWYgfSwKKyAgICB7ICJfWjRmYWJzZiIsICh2b2lkICopJmZhYnNmIH0sCisgICAgeyAiX1o0ZmRpbWZmIiwgKHZvaWQgKikmZmRpbWYgfSwKKyAgICB7ICJfWjVmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYgfSwKKyAgICB7ICJfWjNmbWFmZmYiLCAodm9pZCAqKSZmbWFmIH0sCisgICAgeyAiX1o0Zm1heGZmIiwgKHZvaWQgKikmZm1heGYgfSwKKyAgICB7ICJfWjRmbWluZmYiLCAodm9pZCAqKSZmbWluZiB9LCAgLy8gZmxvYXQgZm1pbihmbG9hdCwgZmxvYXQpCisgICAgeyAiX1o0Zm1vZGZmIiwgKHZvaWQgKikmZm1vZGYgfSwKKyAgICB7ICJfWjVmcmFjdGZQZiIsICh2b2lkICopJlNDX2ZyYWN0IH0sCisgICAgeyAiX1o1ZnJleHBmUGkiLCAodm9pZCAqKSZmcmV4cGYgfSwKKyAgICB7ICJfWjVoeXBvdGZmIiwgKHZvaWQgKikmaHlwb3RmIH0sCisgICAgeyAiX1o1aWxvZ2JmIiwgKHZvaWQgKikmaWxvZ2JmIH0sCisgICAgeyAiX1o1bGRleHBmaSIsICh2b2lkICopJmxkZXhwZiB9LAorICAgIHsgIl9aNmxnYW1tYWYiLCAodm9pZCAqKSZsZ2FtbWFmIH0sCisgICAgeyAiX1ozbG9nZiIsICh2b2lkICopJmxvZ2YgfSwKKyAgICB7ICJfWjRsb2cyZiIsICh2b2lkICopJlNDX2xvZzIgfSwKKyAgICB7ICJfWjVsb2cxMGYiLCAodm9pZCAqKSZsb2cxMGYgfSwKKyAgICB7ICJfWjVsb2cxcGYiLCAodm9pZCAqKSZsb2cxcGYgfSwKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIHsgIm1vZGYiLCAodm9pZCAqKSZtb2RmZiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o5bmV4dGFmdGVyZmYiLCAodm9pZCAqKSZuZXh0YWZ0ZXJmIH0sCisgICAgeyAiX1ozcG93ZmYiLCAodm9pZCAqKSZwb3dmIH0sCisgICAgeyAiX1o0cG93bmZpIiwgKHZvaWQgKikmU0NfcG93biB9LAorICAgIHsgIl9aNHBvd3JmZiIsICh2b2lkICopJlNDX3Bvd3IgfSwKKyAgICB7ICJfWjlyZW1haW5kZXJmZiIsICh2b2lkICopJnJlbWFpbmRlcmYgfSwKKyAgICB7ICJyZW1xdW8iLCAodm9pZCAqKSZyZW1xdW9mIH0sCisgICAgeyAiX1o0cmludGYiLCAodm9pZCAqKSZyaW50ZiB9LAorICAgIHsgIl9aNXJvb3RuZmkiLCAodm9pZCAqKSZTQ19yb290biB9LAorICAgIHsgIl9aNXJvdW5kZiIsICh2b2lkICopJnJvdW5kZiB9LAorICAgIHsgIl9aNXJzcXJ0ZiIsICh2b2lkICopJlNDX3JzcXJ0IH0sCisgICAgeyAiX1ozc2luZiIsICh2b2lkICopJnNpbmYgfSwKKyAgICB7ICJzaW5jb3MiLCAodm9pZCAqKSZTQ19zaW5jb3MgfSwKKyAgICB7ICJfWjRzaW5oZiIsICh2b2lkICopJnNpbmhmIH0sCisgICAgeyAiX1o1c2lucGlmIiwgKHZvaWQgKikmU0Nfc2lucGkgfSwKKyAgICB7ICJfWjRzcXJ0ZiIsICh2b2lkICopJnNxcnRmIH0sCisgICAgeyAiX1ozdGFuZiIsICh2b2lkICopJnRhbmYgfSwKKyAgICB7ICJfWjR0YW5oZiIsICh2b2lkICopJnRhbmhmIH0sCisgICAgeyAiX1o1dGFucGlmIiwgKHZvaWQgKikmU0NfdGFucGkgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNXRydW5jZiIsICh2b2lkICopJnRydW5jZiB9LAorCisgICAgLy8gT3BlbkNMIEludAorICAgIHsgIl9aM2Fic2kiLCAodm9pZCAqKSZTQ19hYnNfaTMyIH0sCisgICAgeyAiX1ozYWJzcyIsICh2b2lkICopJlNDX2Fic19pMTYgfSwKKyAgICB7ICJfWjNhYnNjIiwgKHZvaWQgKikmU0NfYWJzX2k4IH0sCisgICAgeyAiX1ozY2x6aiIsICh2b2lkICopJlNDX2Nsel91MzIgfSwKKyAgICB7ICJfWjNjbHp0IiwgKHZvaWQgKikmU0NfY2x6X3UxNiB9LAorICAgIHsgIl9aM2NsemgiLCAodm9pZCAqKSZTQ19jbHpfdTggfSwKKyAgICB7ICJfWjNjbHppIiwgKHZvaWQgKikmU0NfY2x6X2kzMiB9LAorICAgIHsgIl9aM2NsenMiLCAodm9pZCAqKSZTQ19jbHpfaTE2IH0sCisgICAgeyAiX1ozY2x6YyIsICh2b2lkICopJlNDX2Nsel9pOCB9LAorICAgIHsgIl9aM21heGpqIiwgKHZvaWQgKikmU0NfbWF4X3UzMiB9LAorICAgIHsgIl9aM21heHR0IiwgKHZvaWQgKikmU0NfbWF4X3UxNiB9LAorICAgIHsgIl9aM21heGhoIiwgKHZvaWQgKikmU0NfbWF4X3U4IH0sCisgICAgeyAiX1ozbWF4aWkiLCAodm9pZCAqKSZTQ19tYXhfaTMyIH0sCisgICAgeyAiX1ozbWF4c3MiLCAodm9pZCAqKSZTQ19tYXhfaTE2IH0sCisgICAgeyAiX1ozbWF4Y2MiLCAodm9pZCAqKSZTQ19tYXhfaTggfSwKKyAgICB7ICJfWjNtaW5qaiIsICh2b2lkICopJlNDX21pbl91MzIgfSwKKyAgICB7ICJfWjNtaW50dCIsICh2b2lkICopJlNDX21pbl91MTYgfSwKKyAgICB7ICJfWjNtaW5oaCIsICh2b2lkICopJlNDX21pbl91OCB9LAorICAgIHsgIl9aM21pbmlpIiwgKHZvaWQgKikmU0NfbWluX2kzMiB9LAorICAgIHsgIl9aM21pbnNzIiwgKHZvaWQgKikmU0NfbWluX2kxNiB9LAorICAgIHsgIl9aM21pbmNjIiwgKHZvaWQgKikmU0NfbWluX2k4IH0sCisKKyAgICAvLyBPcGVuQ0wgNi4xMS40CisgICAgeyAiX1o1Y2xhbXBmZmYiLCAodm9pZCAqKSZTQ19jbGFtcF9mMzIgfSwKKyAgICB7ICJfWjdkZWdyZWVzZiIsICh2b2lkICopJlNDX2RlZ3JlZXMgfSwKKyAgICB7ICJfWjNtYXhmZiIsICh2b2lkICopJlNDX21heF9mMzIgfSwKKyAgICB7ICJfWjNtaW5mZiIsICh2b2lkICopJlNDX21pbl9mMzIgfSwKKyAgICB7ICJfWjNtaXhmZmYiLCAodm9pZCAqKSZTQ19taXhfZjMyIH0sCisgICAgeyAiX1o3cmFkaWFuc2YiLCAodm9pZCAqKSZTQ19yYWRpYW5zIH0sCisgICAgeyAiX1o0c3RlcGZmIiwgKHZvaWQgKikmU0Nfc3RlcF9mMzIgfSwKKyAgICAvL3sgInNtb290aHN0ZXAiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjRzaWduZiIsICh2b2lkICopJlNDX3NpZ25fZjMyIH0sCisKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICpzeW0pCit7CisgICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7CisKKyAgICB3aGlsZSAoc3ltcy0+bVB0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzeW1zLT5tTmFtZSwgc3ltKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bXM7CisgICAgICAgIH0KKyAgICAgICAgc3ltcysrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDM5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKQEAgLTAsMCArMSw0MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKworI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgR0VUX1RMUygpICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSBcCisgICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7IFwKKyAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAorICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSU8gcm91dGluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ191cGRhdGVTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCBtZXNoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obWVzaCk7CisgICAgc20tPnVwbG9hZEFsbChyc2MpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29udGV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1TdG9yZShSc1Byb2dyYW1TdG9yZSBwZnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShyc2MsIHBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1WZXJ0ZXgoUnNQcm9ncmFtVmVydGV4IHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVJhc3RlcihSc1Byb2dyYW1SYXN0ZXIgcHYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIocnNjLCBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVlAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ192cExvYWRNb2RlbE1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRNb2RlbHZpZXdNYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0VGV4dHVyZU1hdHJpeChtKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTE9HRSgiUXVhZCIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOworCisgICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OworICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMTIsIGZhbHNlLCAodWludDMyX3QpdnR4LCAicG9zaXRpb24iKTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDIsIDgsIGZhbHNlLCAodWludDMyX3QpdGV4LCAidGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpCit7CisgICAgU0NfZHJhd1F1YWRUZXhDb29yZHMoeDEsIHkxLCB6MSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgzLCB5MywgejMsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDQsIHk0LCB6NCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcChyc2MtPmdldFZlcnRleCgpKTsKKyAgICByc2MtPnNldFZlcnRleChyc2MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOworICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7CisKKyAgICAvL0dMaW50IGNyb3BbNF0gPSB7MCwgaCwgdywgLWh9OworCisgICAgZmxvYXQgc2ggPSByc2MtPmdldEhlaWdodCgpOworCisgICAgU0NfZHJhd1F1YWQoeCwgICBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSB5LCAgICAgeiwKKyAgICAgICAgICAgICAgICB4K3csIHNoIC0gKHkraCksIHosCisgICAgICAgICAgICAgICAgeCwgICBzaCAtICh5K2gpLCB6KTsKKyAgICByc2MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcC5nZXQoKSk7Cit9CisvKgorc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBmbG9hdCB2aW5bM10gPSB7eCwgeSwgen07CisgICAgZmxvYXQgdm91dFs0XTsKKworICAgIC8vTE9HRSgiZHMgIGluICVmICVmICVmIiwgeCwgeSwgeik7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+dHJhbnNmb3JtVG9TY3JlZW4ocnNjLCB2b3V0LCB2aW4pOworICAgIC8vTE9HRSgiZHMgIG91dCAlZiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0sIHZvdXRbM10pOworICAgIHZvdXRbMF0gLz0gdm91dFszXTsKKyAgICB2b3V0WzFdIC89IHZvdXRbM107CisgICAgdm91dFsyXSAvPSB2b3V0WzNdOworCisgICAgdm91dFswXSAqPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKj0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisgICAgdm91dFswXSArPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKz0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisKKyAgICB2b3V0WzBdIC09IHcvMjsKKyAgICB2b3V0WzFdIC09IGgvMjsKKworICAgIC8vTE9HRSgiZHMgIG91dDIgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdKTsKKworICAgIC8vIFUsIFYsIFcsIEgKKyAgICBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2Uodm91dFswXSwgdm91dFsxXSwgeiwgaCwgdyk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKK30KKyovCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKK3sKKyAgICAvL0xPR0UoIlNDX2RyYXdSZWN0ICVmLCVmICAlZiwlZiAgJWYiLCB4MSwgeTEsIHgyLCB5Miwgeik7CisgICAgU0NfZHJhd1F1YWQoeDEsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MiwgeiwKKyAgICAgICAgICAgICAgICB4MiwgeTEsIHosCisgICAgICAgICAgICAgICAgeDEsIHkxLCB6KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2goUnNTaW1wbGVNZXNoIHZzbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXIocnNjKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2hSYW5nZShSc1NpbXBsZU1lc2ggdnNtLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlclJhbmdlKHJzYywgc3RhcnQsIGxlbik7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMF0gPSByOworICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzFdID0gZzsKKyAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclsyXSA9IGI7CisgICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbM10gPSBhOworICAgIGlmICghcnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgeworICAgICAgICBnbENvbG9yNGYociwgZywgYiwgYSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUyKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKK30KK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJDb2xvcihyLCBnLCBiLCBhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckRlcHRoKGZsb2F0IHYpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJEZXB0aGYodik7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dEFsbG9jKFJzQWxsb2NhdGlvbiB2YSwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KGFsbG9jLCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfRHJhd1RleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQucmVuZGVyVGV4dCh0ZXh0LCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfQmluZEZvbnQoUnNGb250IGZvbnQpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZEZvbnQocnNjLCBmb250KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQorCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAicnNnQmluZFByb2dyYW1GcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQgfSwKKyAgICB7ICJyc2dCaW5kUHJvZ3JhbVN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1TdG9yZSB9LAorICAgIHsgInJzZ0JpbmRQcm9ncmFtVmVydGV4IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1WZXJ0ZXggfSwKKyAgICB7ICJyc2dCaW5kUHJvZ3JhbVJhc3RlciIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtUmFzdGVyIH0sCisgICAgeyAicnNnQmluZFNhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciB9LAorICAgIHsgInJzZ0JpbmRUZXh0dXJlIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUgfSwKKworICAgIHsgInJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCB9LAorICAgIHsgInJzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXggfSwKKworICAgIHsgInJzZ0dldFdpZHRoIiwgKHZvaWQgKikmU0NfZ2V0V2lkdGggfSwKKyAgICB7ICJyc2dHZXRIZWlnaHQiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQgfSwKKworICAgIHsgIl9aMThyc2dVcGxvYWRUb1RleHR1cmUxM3JzX2FsbG9jYXRpb25pIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlMiB9LAorICAgIHsgIl9aMThyc2dVcGxvYWRUb1RleHR1cmUxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUgfSwKKyAgICB7ICJyc2dVcGxvYWRUb0J1ZmZlck9iamVjdCIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0IH0sCisKKyAgICB7ICJyc2dEcmF3UmVjdCIsICh2b2lkICopJlNDX2RyYXdSZWN0IH0sCisgICAgeyAicnNnRHJhd1F1YWQiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCB9LAorICAgIHsgInJzZ0RyYXdRdWFkVGV4Q29vcmRzIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMgfSwKKyAgICAvL3sgImRyYXdTcHJpdGUiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlIH0sCisgICAgeyAicnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIH0sCisgICAgeyAiX1oxN3JzZ0RyYXdTaW1wbGVNZXNoN3JzX21lc2giLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaCB9LAorICAgIHsgIl9aMTdyc2dEcmF3U2ltcGxlTWVzaDdyc19tZXNoaWkiLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaFJhbmdlIH0sCisKKyAgICB7ICJyc2dDbGVhckNvbG9yIiwgKHZvaWQgKikmU0NfQ2xlYXJDb2xvciB9LAorICAgIHsgInJzZ0NsZWFyRGVwdGgiLCAodm9pZCAqKSZTQ19DbGVhckRlcHRoIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1RleHRQS2NpaSIsICh2b2lkICopJlNDX0RyYXdUZXh0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0MTNyc19hbGxvY2F0aW9uaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dEFsbG9jIH0sCisKKyAgICB7ICJyc2dCaW5kRm9udCIsICh2b2lkICopJlNDX0JpbmRGb250IH0sCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSU8KKyAgICB7ICJ1cGRhdGVTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfdXBkYXRlU2ltcGxlTWVzaCB9LAorCisgICAgLy8gbWlzYworICAgIHsgImNvbG9yIiwgKHZvaWQgKikmU0NfY29sb3IgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAppbmRleCA0NzExZDFiLi41MDRmZmJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCisrKyBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKQEAgLTE0LDEwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTk0LDE2ICs5OCwxMSBAQAogICAgICAgICBnbEF0dGFjaFNoYWRlcihwZ20sIGZyYWctPmdldFNoYWRlcklEKCkpOwogCiAgICAgICAgIGlmICghdnR4LT5pc1VzZXJQcm9ncmFtKCkpIHsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9MZWdhY3lQb3NpdGlvbiIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX0xlZ2FjeUNvbG9yIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfTGVnYWN5Tm9ybWFsIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfTGVnYWN5UG9pbnRTaXplIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDQsICJBVFRSSUJfTGVnYWN5VGV4dHVyZSIpOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9TSVRJT05dID0gMDsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX0NPTE9SXSA9IDE7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9OT1JNQUxdID0gMjsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1BPSU5UX1NJWkVdID0gMzsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1RFWFRVUkVdID0gNDsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9wb3NpdGlvbiIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX2NvbG9yIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfbm9ybWFsIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfcG9pbnRTaXplIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDQsICJBVFRSSUJfdGV4dHVyZTAiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vTE9HRSgiZTIgJXgiLCBnbEdldEVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpZ25hbC5jcHAgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM5YmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworU2lnbmFsOjpTaWduYWwoKQoreworICAgIG1TZXQgPSB0cnVlOworfQorCitTaWduYWw6On5TaWduYWwoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Cit9CisKK2Jvb2wgU2lnbmFsOjppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2lnbmFsOjpzZXQoKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2V0ID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIFNpZ25hbDo6d2FpdCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtU2V0KSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2V0ID0gZmFsc2U7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmggYi9saWJzL3JzL3JzU2lnbmFsLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oCnJlbmFtZSB0byBsaWJzL3JzL3JzU2lnbmFsLmgKaW5kZXggMmEwOGJkMy4uMmU3NjBmMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oCisrKyBiL2xpYnMvcnMvcnNTaWduYWwuaApAQCAtMTQsMzEgKzE0LDMzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIEFORFJPSURfUlNfRklMRV9BM0RfREVDTFNfSAotI2RlZmluZSBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKKyNpZm5kZWYgQU5EUk9JRF9SU19TSUdOQUxfSAorI2RlZmluZSBBTkRST0lEX1JTX1NJR05BTF9ICiAKIAotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCisjaW5jbHVkZSAicnNVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotICAgIGVudW0gQTNEQ2h1bmtUeXBlIHsKLSAgICAgICAgQ0hVTktfRU1QVFksCitjbGFzcyBTaWduYWwgeworcHVibGljOgorICAgIFNpZ25hbCgpOworICAgIH5TaWduYWwoKTsKIAotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCisgICAgYm9vbCBpbml0KCk7CiAKLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07CisgICAgdm9pZCBzZXQoKTsKKyAgICB2b2lkIHdhaXQoKTsKIAorcHJvdGVjdGVkOgorICAgIGJvb2wgbVNldDsKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Cit9OwogCiB9CiB9Ci0jZW5kaWYgLy9BTkRST0lEX1JTX0ZJTEVfQTNEX0gKIAotCisjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCmluZGV4IDUzY2U1Y2QuLmU1YzJlYjUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcAorKysgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKQEAgLTE0LDEzICsxNCwyNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworCiAKIFNpbXBsZU1lc2g6OlNpbXBsZU1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewpAQCAtNTcsMjEgKzY4LDE2IEBACiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDEiKTsKICAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0SXNCdWZmZXJPYmplY3QoKSkgewogICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcjIoJnZhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldFB0cigpKTsKICAgICAgICAgfQotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmEuc2V0dXBHTChyc2MsIDApOworICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOwogICAgIH0KKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAyIik7CiAgICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKQEAgLTEwMSw2ICsxMDcsOTcgQEAKICAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnVwbG9hZEFsbCIpOwogfQogCit2b2lkIFNpbXBsZU1lc2g6OnVwZGF0ZUdMUHJpbWl0aXZlKCkKK3sKKyAgICBzd2l0Y2gobVByaW1pdGl2ZSkgeworICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgbUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIG1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIG1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOworICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgbUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IG1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIG1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFNpbXBsZU1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIEFkZCBwcmltaXRpdmUgdHlwZQorICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbVByaW1pdGl2ZSk7CisKKyAgICAvLyBBbmQgbm93IHNlcmlhbGl6ZSB0aGUgYWxsb2NhdGlvbnMKKyAgICBtSW5kZXhCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgLy8gV2UgbmVlZCB0byBpbmRpY2F0ZSBpZiB0aGUgcHJpbWl0aXZlIGJ1ZmZlciBpcyBwcmVzZW50CisgICAgaWYobVByaW1pdGl2ZUJ1ZmZlci5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFdyaXRlIGlmIHRoZSBwcmltaXRpdmUgYnVmZmVyIGlzIHByZXNlbnQKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIoMSk7CisgICAgICAgIG1QcmltaXRpdmVCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gTm8gYnVmZmVyIHByZXNlbnQsIHdpbGwgbmVlZCB0aGlzIHdoZW4gd2UgcmVhZAorICAgICAgICBzdHJlYW0tPmFkZFUzMigwKTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4VHlwZUNvdW50KTsKKyAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRleFR5cGVDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0tPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KK30KKworU2ltcGxlTWVzaCAqU2ltcGxlTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNIKSB7CisgICAgICAgIExPR0UoInNpbXBsZSBtZXNoIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTaW1wbGVNZXNoICogbWVzaCA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKyAgICBtZXNoLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIG1lc2gtPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtZXNoLT51cGRhdGVHTFByaW1pdGl2ZSgpOworCisgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGNvbnN0IFR5cGUgKmluZGV4VHlwZSA9IGluZGV4QWxsb2MtPmdldFR5cGUoKTsKKyAgICBtZXNoLT5tSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworICAgIG1lc2gtPm1JbmRleFR5cGUuc2V0KGluZGV4VHlwZSk7CisKKyAgICBib29sIGlzUHJpbWl0aXZlUHJlc2VudCA9IHN0cmVhbS0+bG9hZFUzMigpICE9IDA7CisgICAgaWYoaXNQcmltaXRpdmVQcmVzZW50KSB7CisgICAgICAgIG1lc2gtPm1QcmltaXRpdmVCdWZmZXIuc2V0KEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pKTsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZVR5cGUuc2V0KG1lc2gtPm1QcmltaXRpdmVCdWZmZXItPmdldFR5cGUoKSk7CisgICAgfQorCisgICAgbWVzaC0+bVZlcnRleFR5cGVDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1WZXJ0ZXhUeXBlQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bbWVzaC0+bVZlcnRleFR5cGVDb3VudF07CisgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbWVzaC0+bVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0ZXhUeXBlQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICAgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIGNvbnN0IFR5cGUgKnZlcnRleFR5cGUgPSB2ZXJ0ZXhBbGxvYy0+Z2V0VHlwZSgpOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbdkNvdW50XS5zZXQodmVydGV4QWxsb2MpOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleFR5cGVzW3ZDb3VudF0uc2V0KHZlcnRleFR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+dXBsb2FkQWxsKHJzYyk7CisKKyAgICByZXR1cm4gbWVzaDsKK30KKwogCiBTaW1wbGVNZXNoQ29udGV4dDo6U2ltcGxlTWVzaENvbnRleHQoKQogewpAQCAtMTMxLDE0ICsyMjgsNyBAQAogICAgIH0KIAogICAgIHNtLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXByaW1UeXBlOwotICAgIHN3aXRjaChzbS0+bVByaW1pdGl2ZSkgewotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1BPSU5UOiAgICAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FOiAgICAgICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FX1NUUklQOiAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFOiAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9TVFJJUDogc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9GQU46ICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7Ci0gICAgfQorICAgIHNtLT51cGRhdGVHTFByaW1pdGl2ZSgpOwogICAgIHJldHVybiBzbTsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guaCBiL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmgKaW5kZXggNmRlZmJkYS4uMzYyYzdmYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NpbXBsZU1lc2guaAorKysgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCkBAIC00OCw3ICs0OCwxMSBAQAogICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7CiAgICAgdm9pZCByZW5kZXJSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OwogICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7CisgICAgdm9pZCB1cGRhdGVHTFByaW1pdGl2ZSgpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0lNUExFX01FU0g7IH0KKyAgICBzdGF0aWMgU2ltcGxlTWVzaCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKIH07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmNwcCBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODc0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmNwcApAQCAtMCwwICsxLDEzMiBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworSVN0cmVhbTo6SVN0cmVhbShjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSBidWY7CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZEJ5dGVBcnJheSh2b2lkICpkZXN0LCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgbWVtY3B5KGRlc3QsIG1EYXRhICsgbVBvcywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3VpbnQ2NF90IElTdHJlYW06OmxvYWRPZmZzZXQoKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHJldHVybiBsb2FkVTMyKCk7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IGxvYWRVMzIoKTsKKyAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKKyAgICBMT0dFKCJsb2FkU3RyaW5nICVzIiwgcy0+c3RyaW5nKCkpOworICAgIG1Qb3MgKz0gbGVuOworfQorCisKKy8vIE91dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KKworT1N0cmVhbTo6T1N0cmVhbSh1aW50NjRfdCBsZW4sIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSAodWludDhfdCopbWFsbG9jKGxlbik7CisgICAgbUxlbmd0aCA9IGxlbjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKworT1N0cmVhbTo6fk9TdHJlYW0oKQoreworICAgIGZyZWUobURhdGEpOworfQorCit2b2lkIE9TdHJlYW06OmFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICAvLyBXZSBuZWVkIHRvIHBvdGVudGlhbGx5IGdyb3cgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIG51bWJlciBvZiBieWVzIHdlIHdyaXRlIGlzIHN1YnN0YW50aWFsCisgICAgd2hpbGUobVBvcyArIG51bUJ5dGVzID49IG1MZW5ndGgpIHsKKyAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICB9CisgICAgbWVtY3B5KG1EYXRhICsgbVBvcywgc3JjLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordm9pZCBPU3RyZWFtOjphZGRPZmZzZXQodWludDY0X3QgdikKK3sKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMzIpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDApICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNTYpICYgMHhmZik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhZGRVMzIodik7CisgICAgfQorfQorCit2b2lkIE9TdHJlYW06OmFkZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IHMtPnNpemUoKTsKKyAgICBhZGRVMzIobGVuKTsKKyAgICBpZihtUG9zICsgbGVuKnNpemVvZihjaGFyKSA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIGNoYXIgKnN0cmluZ0RhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1EYXRhW21Qb3NdKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKKyAgICAgICAgc3RyaW5nRGF0YVtpXSA9IHMtPnN0cmluZygpW2ldOworICAgIH0KKyAgICBtUG9zICs9IGxlbipzaXplb2YoY2hhcik7Cit9CisKK3ZvaWQgT1N0cmVhbTo6Z3Jvd1NpemUoKQoreworICAgIHVpbnQ4X3QgKm5ld0RhdGEgPSAodWludDhfdCopbWFsbG9jKG1MZW5ndGgqMik7CisgICAgbWVtY3B5KG5ld0RhdGEsIG1EYXRhLCBtTGVuZ3RoKnNpemVvZih1aW50OF90KSk7CisgICAgbUxlbmd0aCA9IG1MZW5ndGggKiAyOworICAgIGZyZWUobURhdGEpOworICAgIG1EYXRhID0gbmV3RGF0YTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmggYi9saWJzL3JzL3JzU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMWNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIElTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7CisKKyAgICBmbG9hdCBsb2FkRigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW50MzJfdCBsb2FkSTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MzJfdCBsb2FkVTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MTZfdCBsb2FkVTE2KCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbmxpbmUgdWludDhfdCBsb2FkVTgoKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB2b2lkIGxvYWRCeXRlQXJyYXkodm9pZCAqZGVzdCwgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7CisgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOworICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQodWludDY0X3QgcG9zKSB7CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Qb3MgPSAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtUG9zOworICAgIGJvb2wgbVVzZTY0OworfTsKKworY2xhc3MgT1N0cmVhbQoreworcHVibGljOgorICAgIE9TdHJlYW0odWludDY0X3QgbGVuZ3RoLCBib29sIHVzZTY0KTsKKyAgICB+T1N0cmVhbSgpOworICAgIAorICAgIHZvaWQgYWxpZ24odWludDMyX3QgYnl0ZXMpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgKGJ5dGVzIC0gMSkpICYgKH4oYnl0ZXMgLSAxKSk7CisgICAgICAgIGlmKG1Qb3MgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEYoZmxvYXQgdikgeworICAgICAgICB1aW50MzJfdCB1aW50ViA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4gKCZ2KTsKKyAgICAgICAgYWRkVTMyKHVpbnRWKTsKKyAgICB9CisgICAgdm9pZCBhZGRJMzIoaW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTMyKHVpbnQzMl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICB9CisgICAgdm9pZCBhZGRVMTYodWludDE2X3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ID4+IDgpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRVOCh1aW50OF90IHYpIHsKKyAgICAgICAgaWYobVBvcyArIDEgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXSA9IHY7CisgICAgICAgIG1Qb3MgKys7CisgICAgfQorICAgIHZvaWQgYWRkQnl0ZUFycmF5KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB2b2lkIGFkZE9mZnNldCh1aW50NjRfdCB2KTsKKyAgICB2b2lkIGFkZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdyb3dTaXplKCk7CisgICAgdWludDhfdCAqIG1EYXRhOworICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisgICAgCisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvL0FORFJPSURfUlNfU1RSRUFNX0gKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5jcHAgYi9saWJzL3JzL3JzVHlwZS5jcHAKaW5kZXggYzA5ZTk3OS4uOGRjYTBmZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuY3BwCisrKyBiL2xpYnMvcnMvcnNUeXBlLmNwcApAQCAtMTQsOCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC04NCw3ICs4OSw5IEBACiAgICAgICAgIG1MT0RDb3VudCA9IDE7CiAgICAgfQogICAgIGlmIChtTE9EQ291bnQgIT0gb2xkTE9EQ291bnQpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICBpZihtTE9Ecyl7CisgICAgICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIH0gICAgICAgIAogICAgICAgICBtTE9EcyA9IG5ldyBMT0RbbUxPRENvdW50XTsKICAgICB9CiAKQEAgLTE0MywxMzEgKzE1MCwyMiBAQAogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBnZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKTsgY3QrKykgewogICAgICAgICBjb25zdCBDb21wb25lbnQgJmMgPSBnZXRFbGVtZW50KCktPmdldEZpZWxkKGN0KS0+Z2V0Q29tcG9uZW50KCk7CiAKLSAgICAgICAgc3dpdGNoKGMuZ2V0S2luZCgpKSB7Ci0gICAgICAgIGNhc2UgUlNfS0lORF9VU0VSOgotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ly9jLmdldElzTm9ybWFsaXplZCgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm5hbWUuc2V0VG8oZ2V0RWxlbWVudCgpLT5nZXRGaWVsZE5hbWUoY3QpKTsKLSAgICAgICAgICAgIHVzZXJOdW0gKys7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVZ0eC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1WdHgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1WdHgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVZ0eC5uYW1lLnNldFRvKCJQb3NpdGlvbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Db2xvci5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3IudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOwotICAgICAgICAgICAgbUdMLm1Db2xvci5uYW1lLnNldFRvKCJDb2xvciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX05PUk1BTDoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tTm9ybS5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Ob3JtLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm5hbWUuc2V0VG8oIk5vcm1hbCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVRleC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1UZXgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVRleC5uYW1lLnNldFRvKCJUZXh0dXJlIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KCFtR0wubVBvaW50U2l6ZS5zaXplKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubmFtZS5zZXRUbygiUG9pbnRTaXplIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOy8vYy5nZXRJc05vcm1hbGl6ZWQoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOworICAgICAgICB1c2VyTnVtICsrOwogICAgIH0KIH0KIAorCiB2b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyKFZlcnRleEFycmF5ICp2YSkgY29uc3QKIHsKLSAgICAvLyBOb3RlOiBXZSBhcmUgb25seSBnb2luZyB0byBlbmFibGUgYnVmZmVycyBhbmQgbmV2ZXIgZGlzYWJsZSB0aGVtCi0gICAgLy8gaGVyZS4gIFRoZSByZWFzb24gaXMgbW9yZSB0aGFuIG9uZSBBbGxvY2F0aW9uIG1heSBiZSB1c2VkIGFzIGEgdmVydGV4Ci0gICAgLy8gc291cmNlLiAgU28gd2UgY2Fubm90IGRpc2FibGUgYXJyYXlzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbiB1c2UgYnkKLSAgICAvLyBhbm90aGVyIGFsbG9jYXRpb24uCi0KLSAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7Ci0gICAgaWYgKG1HTC5tVnR4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVZ0eC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgIG1HTC5tVnR4LnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Ob3JtLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubU5vcm0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Ob3JtLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tQ29sb3Iuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tQ29sb3IudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tQ29sb3Iuc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubVRleC5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1UZXgudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tVGV4LnNpemUsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tVGV4Lm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tUG9pbnRTaXplLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVBvaW50U2l6ZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfUE9JTlRfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUub2Zmc2V0KTsKLSAgICB9Ci0KLX0KLQotdm9pZCBUeXBlOjplbmFibGVHTFZlcnRleEJ1ZmZlcjIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAotewotICAgIC8vIERvIGxlZ2FjeSBidWZmZXJzCi0gICAgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIodmEpOwotCiAgICAgdWludDMyX3Qgc3RyaWRlID0gbUVsZW1lbnQtPmdldFNpemVCeXRlcygpOwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBSU19NQVhfQVRUUklCUzsgY3QrKykgewotICAgICAgICBpZiAobUdMLm1Vc2VyW2N0XS5zaXplKSB7Ci0gICAgICAgICAgICB2YS0+YWRkVXNlcihtR0wubVVzZXJbY3RdLCBzdHJpZGUpOworICAgICAgICBpZiAobUF0dHJpYnNbY3RdLnNpemUpIHsKKyAgICAgICAgICAgIHZhLT5hZGQobUF0dHJpYnNbY3RdLCBzdHJpZGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjgzLDYgKzE4MSw1NyBAQAogICAgIG1FbGVtZW50LT5kdW1wTE9HVihidWYpOwogfQogCit2b2lkIFR5cGU6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1FbGVtZW50LT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1YKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWSk7CisgICAgc3RyZWFtLT5hZGRVMzIobURpbVopOworCisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobURpbUxPRCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobUZhY2VzID8gMSA6IDApKTsKK30KKworVHlwZSAqVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1RZUEUpIHsKKyAgICAgICAgTE9HRSgidHlwZSBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICBpZighZWxlbSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUeXBlICp0eXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICB0eXBlLT5tRGltWCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIHR5cGUtPm1EaW1ZID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVogPSBzdHJlYW0tPmxvYWRVMzIoKTsKKworICAgIHVpbnQ4X3QgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bURpbUxPRCA9IHRlbXAgIT0gMDsKKworICAgIHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIHR5cGUtPm1GYWNlcyA9IHRlbXAgIT0gMDsKKworICAgIHR5cGUtPnNldEVsZW1lbnQoZWxlbSk7CisKKyAgICByZXR1cm4gdHlwZTsKK30KKwogYm9vbCBUeXBlOjpnZXRJc05wMigpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgeCA9IGdldERpbVgoKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNUeXBlLmggYi9saWJzL3JzL3JzVHlwZS5oCmluZGV4IGMyNTU3N2MuLjViNTFlMjAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmgKKysrIGIvbGlicy9ycy9yc1R5cGUuaApAQCAtNzEsOSArNzEsMTEgQEAKICAgICB2b2lkIGNvbXB1dGUoKTsKIAogICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7Ci0gICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcjIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfVFlQRTsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBMT0QgewpAQCAtMTEyLDE1ICsxMTQsNyBAQAogICAgIExPRCAqbUxPRHM7CiAgICAgdWludDMyX3QgbUxPRENvdW50OwogCi0gICAgc3RydWN0IEdMU3RhdGVfdCB7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVVzZXJbUlNfTUFYX0FUVFJJQlNdOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1WdHg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbU5vcm07Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbUNvbG9yOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1UZXg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVBvaW50U2l6ZTsKLSAgICB9OwotICAgIEdMU3RhdGVfdCBtR0w7CisgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CiAgICAgdm9pZCBtYWtlR0xDb21wb25lbnRzKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVXRpbHMuaCBiL2xpYnMvcnMvcnNVdGlscy5oCmluZGV4IDA3Zjg5MzMuLjBhMzdhNWIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNVdGlscy5oCisrKyBiL2xpYnMvcnMvcnNVdGlscy5oCkBAIC0xOSwxNSArMTksMjIgQEAKIAogI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUmVuZGVyU2NyaXB0IgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxFR0wvZWdsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgpAQCAtNDEsNiArNDgsMjYgQEAKICNkZWZpbmUgcnNBc3NlcnQodikgd2hpbGUoMCkKICNlbmRpZgogCit0eXBlZGVmIGZsb2F0IHJzdkZfMiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDgpKSk7Cit0eXBlZGVmIGZsb2F0IHJzdkZfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOwordHlwZWRlZiB1aW50OF90IHJzdlU4XzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg0KSkpOworCit1bmlvbiBmbG9hdDIgeworICAgIHJzdkZfMiB2OworICAgIGZsb2F0IGZbMl07Cit9OworCit1bmlvbiBmbG9hdDQgeworICAgIHJzdkZfNCB2OworICAgIGZsb2F0IGZbNF07Cit9OworCit1bmlvbiB1Y2hhcjQgeworICAgIHJzdlU4XzQgdjsKKyAgICB1aW50OF90IGZbNF07CisgICAgdWludDMyX3QgcGFja2VkOworfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFQgcnNNaW4oVCBpbjEsIFQgaW4yKQogewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKaW5kZXggNmMyMDAyZC4uZWY4OTJhNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAorKysgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCkBAIC0xNCwxMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtNTUsNyArNjAsNiBAQAogICAgIHNpemUgPSBhLnNpemU7CiAgICAgc3RyaWRlID0gYS5zdHJpZGU7CiAgICAgbm9ybWFsaXplZCA9IGEubm9ybWFsaXplZDsKLSAgICBraW5kID0gUlNfS0lORF9VU0VSOwogICAgIG5hbWUuc2V0VG8oYS5uYW1lKTsKIH0KIApAQCAtNzUsMTM4ICs3OSw4NiBAQAogICAgIG1BdHRyaWJzW25dLmNsZWFyKCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZFVzZXIoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCit2b2lkIFZlcnRleEFycmF5OjphZGQoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgYXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKKyAgICByc0Fzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zZXQoYSk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0gUlNfS0lORF9VU0VSOwogICAgIG1Db3VudCArKzsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6YWRkTGVnYWN5KHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgUnNEYXRhS2luZCBraW5kLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCkKK3ZvaWQgVmVydGV4QXJyYXk6OmFkZCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uY2xlYXIoKTsKICAgICBtQXR0cmlic1ttQ291bnRdLnR5cGUgPSB0eXBlOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2l6ZSA9IHNpemU7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5ub3JtYWxpemVkID0gbm9ybWFsaXplZDsKLSAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0ga2luZDsKKyAgICBtQXR0cmlic1ttQ291bnRdLm5hbWUuc2V0VG8obmFtZSk7CisKKyAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CisgICAgbUF0dHJpYnNbbUNvdW50XS5wdHIgPSBtQWN0aXZlUG9pbnRlcjsKICAgICBtQ291bnQgKys7CiB9CiAKIHZvaWQgVmVydGV4QXJyYXk6OmxvZ0F0dHJpYih1aW50MzJfdCBpZHgsIHVpbnQzMl90IHNsb3QpIGNvbnN0IHsKLSAgICBMT0dFKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSAgc2l6ZT0laSAgdHlwZT0weCV4ICBraW5kPSVpICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLCBpZHgsIHNsb3QsCisgICAgTE9HRSgidmEgJWk6IHNsb3Q9JWkgbmFtZT0lcyBidWY9JWkgcHRyPSVwIHNpemU9JWkgIHR5cGU9MHgleCAgc3RyaWRlPTB4JXggIG5vcm09JWkgIG9mZnNldD0weCV4IiwgaWR4LCBzbG90LAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5uYW1lLnN0cmluZygpLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5idWZmZXIsCisgICAgICAgICBtQXR0cmlic1tpZHhdLnB0ciwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc2l6ZSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0udHlwZSwKLSAgICAgICAgIG1BdHRyaWJzW2lkeF0ua2luZCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc3RyaWRlLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5ub3JtYWxpemVkLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5vZmZzZXQpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUpIGNvbnN0Ci17Ci0gICAgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChtQXR0cmlic1tjdF0ua2luZCkgewotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihQT1NJVElPTik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVmVydGV4UG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoTk9STUFMKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1BdHRyaWJzW2N0XS5zaXplID09IDMpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbE5vcm1hbFBvaW50ZXIobUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoQ09MT1IpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsQ29sb3JQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9URVhUVVJFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFRleENvb3JkUG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPSU5UX1NJWkUpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsUG9pbnRTaXplUG9pbnRlck9FUyhtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMIik7Ci19Ci0KIHZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykgY29uc3QKIHsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBzdGFydCIpOwotICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQ7IGN0KyspIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDw9IDB4Zi8qc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQqLzsgY3QrKykgewogICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShjdCk7CiAgICAgfQogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTDIgZGlzYWJsZWQiKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7CiAgICAgICAgIHVpbnQzMl90IHNsb3QgPSAwOworCisgICAgICAgIGlmIChtQXR0cmlic1tjdF0ubmFtZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKHNjLT5pc1VzZXJWZXJ0ZXhQcm9ncmFtKCkpIHsKICAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4QXR0cmliU2xvdChjdCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUF0dHJpYnNbY3RdLmtpbmQgPT0gUlNfS0lORF9VU0VSKSB7CisgICAgICAgICAgICBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gInBvc2l0aW9uIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAiY29sb3IiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJub3JtYWwiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJwb2ludFNpemUiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJ0ZXh0dXJlMCIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QobUF0dHJpYnNbY3RdLmtpbmQpOwogICAgICAgICB9CiAKICAgICAgICAgLy9sb2dBdHRyaWIoY3QsIHNsb3QpOwogICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNsb3QpOwogICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLQogICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ubm9ybWFsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnB0ciArIG1BdHRyaWJzW2N0XS5vZmZzZXQpOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCA9IG1Db3VudDsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkb25lIik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuaCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCmluZGV4IDM5MDRjYjYuLjdjNjA5YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCkBAIC0zNywxMyArMzcsMTMgQEAKICAgICBjbGFzcyBBdHRyaWIgewogICAgIHB1YmxpYzoKICAgICAgICAgdWludDMyX3QgYnVmZmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogcHRyOwogICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIHVpbnQzMl90IHNpemU7CiAgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKICAgICAgICAgYm9vbCBub3JtYWxpemVkOwogICAgICAgICBTdHJpbmc4IG5hbWU7Ci0gICAgICAgIFJzRGF0YUtpbmQga2luZDsKIAogICAgICAgICBBdHRyaWIoKTsKICAgICAgICAgdm9pZCBzZXQoY29uc3QgQXR0cmliICYpOwpAQCAtNTIsOSArNTIsMTggQEAKIAogCiAgICAgdm9pZCBjbGVhckFsbCgpOwotICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7bUFjdGl2ZUJ1ZmZlciA9IGlkO30KLSAgICB2b2lkIGFkZFVzZXIoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7Ci0gICAgdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcih1aW50MzJfdCBpZCkgeworICAgICAgICBtQWN0aXZlQnVmZmVyID0gaWQ7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKKyAgICB9CisgICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgICAgICBtQWN0aXZlUG9pbnRlciA9IChjb25zdCB1aW50OF90ICopcHRyOworICAgIH0KKworICAgIHZvaWQgYWRkKGNvbnN0IEF0dHJpYiAmLCB1aW50MzJfdCBzdHJpZGUpOworICAgIC8vdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCk7CisgICAgdm9pZCBhZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICopIGNvbnN0OwogICAgIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICosIFNoYWRlckNhY2hlICopIGNvbnN0OwpAQCAtNjMsNiArNzIsNyBAQAogcHJvdGVjdGVkOgogICAgIHZvaWQgY2xlYXIodWludDMyX3QgaW5kZXgpOwogICAgIHVpbnQzMl90IG1BY3RpdmVCdWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqIG1BY3RpdmVQb2ludGVyOwogICAgIHVpbnQzMl90IG1Db3VudDsKIAogICAgIEF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcAppbmRleCBjZWU5ZjUyLi4wMTY5Yjk4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCisrKyBiL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKQEAgLTcsOCArNywxMiBAQAogc3RydWN0IEVsZW1lbnQ7CiAKIHN0cnVjdCBFbGVtZW50RmllbGQgeworICAgIC8vIEFuIEVsZW1lbnQgRmllbGQgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBFbGVtZW50IHdpdGggYSBuYW1lIGFzc2lnbmVkLgorCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBFbGVtZW50ICplOworCisKICAgICBFbGVtZW50RmllbGQoY29uc3QgY2hhciAqbiwgRWxlbWVudCAqX2UpIHsKICAgICAgICAgbmFtZSA9IG47CiAgICAgICAgIGUgPSBfZTsKQEAgLTIwLDEyICsyNCwyMSBAQAogfTsKIAogc3RydWN0IEVsZW1lbnQgeworICAgIC8vIEFuIEVsZW1lbnQgY2FuIHRha2Ugb25lIG9mIHR3byBmb3Jtcy4KKyAgICAvLyAxOiBCYXNpYy4gIEl0IGNvbnRhaW5zIGEgc2luZ2xlIGJhc2ljIHR5cGUgYW5kIHZlY3RvciBzaXplLgorICAgIC8vIDI6IENvbXBsZXguICBJdCBjb250YWlucyBhIGxpc3Qgb2YgZmllbGRzIHdpdGggbmFtZXMuICBFYWNoIGZpZWxkCisgICAgLy8gd2lsbCBpbiB0dXJuIGJlIGFub3RoZXIgZWxlbWVudC4KKwogICAgIEVsZW1lbnRGaWVsZCAqZmllbGRzOwotICAgIHNpemVfdCBmaWVsZENvdW50OworICAgIHNpemVfdCBmaWVsZENvdW50OyAgLy8gSWYgZmllbGQgY291bnQgaXMgMCwgdGhlIGVsZW1lbnQgaXMgYSBCYXNpYyB0eXBlLgogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgYm9vbCBnZW5lcmF0ZWQ7CiAKKyAgICAvLyBUaGUgYmFzaWMgZGF0YSB0eXBlIGZyb20gUmVuZGVyU2NyaXB0LmgKICAgICBSc0RhdGFUeXBlIGNvbXBUeXBlOworCisgICAgLy8gVGhlIHZlY3RvciBzaXplIG9mIHRoZSBkYXRhIHR5cGUgZm9yIGZsb2F0MiwgZmxvYXQzLCAuLi4uCisgICAgLy8gQWxsb3dlZCBzaXplcyBhcmUgMiwzLDQsOCwxNgogICAgIHVpbnQzMl90IGNvbXBWZWN0b3JTaXplOwogCiAgICAgRWxlbWVudCgpIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODQ0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCkBAIC0wLDAgKzEsNzg1IEBACisjaWZuZGVmIF9fUlNfQ0xfUlNIX18KKyNkZWZpbmUgX19SU19DTF9SU0hfXworCisjZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODhmICAgLyogcGkgKi8KKworCisvLyBDb252ZXJzaW9ucworI2RlZmluZSBDVlRfRlVOQ18yKHR5cGVvdXQsIHR5cGVpbikgXAorc3RhdGljIHR5cGVvdXQjIzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzIodHlwZWluIyMyIHYpIHsgXAorICAgIHR5cGVvdXQjIzIgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueX07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMyh0eXBlaW4jIzMgdikgeyBcCisgICAgdHlwZW91dCMjMyByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2Lnp9OyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIHR5cGVvdXQjIzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzQodHlwZWluIyM0IHYpIHsgXAorICAgIHR5cGVvdXQjIzQgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueSwgKHR5cGVvdXQpdi56LCAodHlwZW91dCl2Lnd9OyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBDVlRfRlVOQyh0eXBlKSAgICAgIENWVF9GVU5DXzIodHlwZSwgdWNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgc2hvcnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdWludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgZmxvYXQpCisKK0NWVF9GVU5DKGNoYXIpCitDVlRfRlVOQyh1Y2hhcikKK0NWVF9GVU5DKHNob3J0KQorQ1ZUX0ZVTkModXNob3J0KQorQ1ZUX0ZVTkMoaW50KQorQ1ZUX0ZVTkModWludCkKK0NWVF9GVU5DKGZsb2F0KQorCisKKworLy8gRmxvYXQgb3BzLCA2LjExLjIKKworI2RlZmluZSBERUZfRlVOQ18xKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2KSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2KSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHIudyA9IGZuYyh2LncpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yRihmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9CisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOworREVGX0ZVTkNfMShhY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc2goZmxvYXQpOworREVGX0ZVTkNfMShhY29zaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3ModikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhY29zcGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXNpbnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7CitERUZfRlVOQ18xKGF0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihhdGFuMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXRhbnBpKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yKHksIHgpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzIoYXRhbjJwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNicnQoZmxvYXQpOworREVGX0ZVTkNfMShjYnJ0KQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdCk7CitERUZfRlVOQ18xKGNlaWwpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihjb3B5c2lnbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGNvcykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvc2goZmxvYXQpOworREVGX0ZVTkNfMShjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3ModiAqIE1fUEkpOworfQorREVGX0ZVTkNfMShjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGVyZmMoZmxvYXQpOworREVGX0ZVTkNfMShlcmZjKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXJmKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdCk7CitERUZfRlVOQ18xKGV4cDIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKK30KK0RFRl9GVU5DXzEoZXhwMTApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHBtMShmbG9hdCk7CitERUZfRlVOQ18xKGV4cG0xKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7CitERUZfRlVOQ18xKGZhYnMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmZGltKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZkaW0pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7CitERUZfRlVOQ18xKGZsb29yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWF4KTsKK0RFRl9GVU5DXzJGKGZtYXgpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWluKTsKK0RFRl9GVU5DXzJGKGZtaW4pOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbW9kKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQgdiwgZmxvYXQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQyIHYsIGZsb2F0MiAqaXB0cikgeworICAgIGZsb2F0IHRbMl07CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0MyB2LCBmbG9hdDMgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzNdOworICAgIGZsb2F0MyByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDQgdiwgZmxvYXQ0ICppcHRyKSB7CisgICAgZmxvYXQgdFs0XTsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICByLnogPSBmcmFjdCh2LnosICZ0WzJdKTsKKyAgICByLncgPSBmcmFjdCh2LncsICZ0WzNdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICBpcHRyWzJdID0gdFsyXTsKKyAgICBpcHRyWzNdID0gdFszXTsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGh5cG90KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGh5cG90KQorCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGlsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEoaWxvZ2IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdCwgaW50KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQzLCBpbnQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQ0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludCk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0NCwgaW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKGxnYW1tYSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nKQorCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7CitERUZfRlVOQ18xKGxvZzEwKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KK0RFRl9GVU5DXzEobG9nMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzFwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMXApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0NCwgZmxvYXQ0ICopOworCisvL2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuYW4odWludCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuZXh0YWZ0ZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIobmV4dGFmdGVyKQorCitERUZfRlVOQ18yKHBvdykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdClwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDIgdiwgaW50MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQyKXApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MyB2LCBpbnQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDMpcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQ0IHYsIGludDQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0NClwKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQyIHYsIGZsb2F0MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDMgdiwgZmxvYXQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0NCB2LCBmbG9hdDQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1haW5kZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIocmVtYWluZGVyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0LCBmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDIsIGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQzLCBmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKK0RFRl9GVU5DXzEocmludCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQyIHYsIGludDIgcikgeworICAgIGZsb2F0MiB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDMgdiwgaW50MyByKSB7CisgICAgZmxvYXQzIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIuen07CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQ0IHYsIGludDQgcikgeworICAgIGZsb2F0NCB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55LCAxLmYgLyByLnosIDEuZiAvIHIud307CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKK0RFRl9GVU5DXzEocm91bmQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0KTsKKy8qc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydCh2KTsKK30KK0RFRl9GVU5DXzEocnNxcnQpKi8KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7CitERUZfRlVOQ18xKHNpbikKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQyIHYsIGZsb2F0MiAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQzIHYsIGZsb2F0MyAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQ0IHYsIGZsb2F0NCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luaChmbG9hdCk7CitERUZfRlVOQ18xKHNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbih2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKHNpbnBpKQorCitERUZfRlVOQ18xKHNxcnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOworREVGX0ZVTkNfMSh0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEodGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEodGFucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z2FtbWEoZmxvYXQpOworREVGX0ZVTkNfMSh0Z2FtbWEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7CitERUZfRlVOQ18xKHRydW5jKQorCisvLyBJbnQgb3BzIChwYXJ0aWFsKSwgNi4xMS4zCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoY2hhcik7CisKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1aW50KTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGludCk7CitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1c2hvcnQpOworZXh0ZXJuIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihzaG9ydCk7CitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVjaGFyKTsKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihjaGFyKTsKKworc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVpbnQgdjEsIHVpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihpbnQgdjEsIGludCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVzaG9ydCB2MSwgdXNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihzaG9ydCB2MSwgc2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVjaGFyIHYxLCB1Y2hhciB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihjaGFyIHYxLCBjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorCitzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWludCB2MSwgdWludCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGludCB2MSwgaW50IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodXNob3J0IHYxLCB1c2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHNob3J0IHYxLCBzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWNoYXIgdjEsIHVjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGNoYXIgdjEsIGNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CisKKworCisKKy8vIDYuMTEuNAorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQyIGxvdywgZmxvYXQyIGhpZ2gpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdy54ID8gbG93LnggOiAoYW1vdW50LnggPiBoaWdoLnggPyBoaWdoLnggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cueSA/IGxvdy55IDogKGFtb3VudC55ID4gaGlnaC55ID8gaGlnaC55IDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdDMgbG93LCBmbG9hdDMgaGlnaCkgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQgYW1vdW50LCBmbG9hdDQgbG93LCBmbG9hdDQgaGlnaCkgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHIudyA9IGFtb3VudC53IDwgbG93LncgPyBsb3cudyA6IChhbW91bnQudyA+IGhpZ2gudyA/IGhpZ2gudyA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cgPyBsb3cgOiAoYW1vdW50LnogPiBoaWdoID8gaGlnaCA6IGFtb3VudC56KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93ID8gbG93IDogKGFtb3VudC56ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueik7CisgICAgci53ID0gYW1vdW50LncgPCBsb3cgPyBsb3cgOiAoYW1vdW50LncgPiBoaWdoID8gaGlnaCA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQgcmFkaWFucykgeworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CitERUZfRlVOQ18xKGRlZ3JlZXMpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQgdjEsIGZsb2F0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0MyB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56ID4gdjIueiA/IHYxLnogOiB2Mi56OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA+IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByLncgPSB2MS53ID4gdjIudyA/IHYxLncgOiB2Mi53OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPiB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55ID4gdjIgPyB2MS55IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDQgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgci53ID0gdjEudyA+IHYyID8gdjEudyA6IHYyOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0IHYxLCBmbG9hdCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQyIHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA8IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0NCB2MSwgZmxvYXQ0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPCB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgci53ID0gdjEudyA8IHYyLncgPyB2MS53IDogdjIudzsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54IDwgdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA8IHYyID8gdjEueSA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0IHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHIudyA9IHYxLncgPCB2MiA/IHYxLncgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdDIgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMgc3RhcnQsIGZsb2F0MyBzdG9wLCBmbG9hdDMgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdDQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MyBzdGFydCwgZmxvYXQzIHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0IHN0YXJ0LCBmbG9hdDQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorREVGX0ZVTkNfMShyYWRpYW5zKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdCBlZGdlLCBmbG9hdCB2KSB7CisgICAgcmV0dXJuICh2IDwgZWRnZSkgPyAwLmYgOiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0MiB2KSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0MyB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0NCB2KSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgci53ID0gKHYudyA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MyBlZGdlLCBmbG9hdCB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYgPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodiA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDQpOworCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCB2KSB7CisgICAgaWYgKHYgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2IDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHY7Cit9CitERUZfRlVOQ18xKHNpZ24pCisKKy8vIDYuMTEuNQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGxocy55ICogcmhzLnogIC0gbGhzLnogKiByaHMueTsKKyAgICByLnkgPSBsaHMueiAqIHJocy54ICAtIGxocy54ICogcmhzLno7CisgICAgci56ID0gbGhzLnggKiByaHMueSAgLSBsaHMueSAqIHJocy54OworICAgIHIudyA9IDAuZjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsaHMgKiByaHM7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0MiBsaHMsIGZsb2F0MiByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLno7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueSArIGxocy56KnJocy56ICsgbGhzLncqcmhzLnc7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQgdikgeworICAgIHJldHVybiB2OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDIgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55KTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSArIHYueip2LnopOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDQgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueiArIHYudyp2LncpOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQgbGhzLCBmbG9hdCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQgdikgeworICAgIHJldHVybiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDIgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNTUwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApAQCAtMCwwICsxLDUwNSBAQAorI2lmbmRlZiBfX1JTX0NPUkVfUlNIX18KKyNkZWZpbmUgX19SU19DT1JFX1JTSF9fCisKKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9IDI1NTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9ICh1Y2hhcikoYSAqIDI1NS5mKTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDMgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgMjU1fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDQgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgY29sb3Iud307CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBmbG9hdDQgcnNVbnBhY2tDb2xvcjg4ODgodWNoYXI0IGMpCit7CisgICAgZmxvYXQ0IHJldCA9IChmbG9hdDQpMC4wMDM5MTU2ODYyNzQ1ZjsKKyAgICByZXQgKj0gY29udmVydF9mbG9hdDQoYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy9leHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdDMpOworLy9leHRlcm4gZmxvYXQ0IHJzVW5wYWNrQ29sb3I1NjUodWNoYXI0KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTWF0cml4IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDQgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXg0eDQgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogNCArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAzICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4M3gzICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDMgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogMiArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDJ4MiAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiAyICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDR4NCAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDAuZjsKKyAgICBtLT5tWzVdID0gMS5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMC5mOworICAgIG0tPm1bOV0gPSAwLmY7CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXgzeDMgKm0pIHsKKyAgICBtLT5tWzBdID0gMS5mOworICAgIG0tPm1bMV0gPSAwLmY7CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSAxLmY7CisgICAgbS0+bVs1XSA9IDAuZjsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDJ4MiAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworICAgIG0tPm1bOV0gPSB2WzldOworICAgIG0tPm1bMTBdID0gdlsxMF07CisgICAgbS0+bVsxMV0gPSB2WzExXTsKKyAgICBtLT5tWzEyXSA9IHZbMTJdOworICAgIG0tPm1bMTNdID0gdlsxM107CisgICAgbS0+bVsxNF0gPSB2WzE0XTsKKyAgICBtLT5tWzE1XSA9IHZbMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKKyAgICBtLT5tWzRdID0gdls0XTsKKyAgICBtLT5tWzVdID0gdls1XTsKKyAgICBtLT5tWzZdID0gdls2XTsKKyAgICBtLT5tWzddID0gdls3XTsKKyAgICBtLT5tWzhdID0gdls4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXg0eDQgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKKyAgICBtLT5tWzldID0gdi0+bVs5XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bMTBdOworICAgIG0tPm1bMTFdID0gdi0+bVsxMV07CisgICAgbS0+bVsxMl0gPSB2LT5tWzEyXTsKKyAgICBtLT5tWzEzXSA9IHYtPm1bMTNdOworICAgIG0tPm1bMTRdID0gdi0+bVsxNF07CisgICAgbS0+bVsxNV0gPSB2LT5tWzE1XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IHYtPm1bNV07CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gdi0+bVs2XTsKKyAgICBtLT5tWzldID0gdi0+bVs3XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bOF07CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gMS5mOworICAgIG0tPm1bMTFdID0gMC5mOworICAgIG0tPm1bMTJdID0gMC5mOworICAgIG0tPm1bMTNdID0gMC5mOworICAgIG0tPm1bMTRdID0gMC5mOworICAgIG0tPm1bMTVdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IHYtPm1bM107CisgICAgbS0+bVs0XSA9IHYtPm1bNF07CisgICAgbS0+bVs1XSA9IHYtPm1bNV07CisgICAgbS0+bVs2XSA9IHYtPm1bNl07CisgICAgbS0+bVs3XSA9IHYtPm1bN107CisgICAgbS0+bVs4XSA9IHYtPm1bOF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGZsb2F0IGMsIHM7CisgICAgbS0+bVszXSA9IDA7CisgICAgbS0+bVs3XSA9IDA7CisgICAgbS0+bVsxMV09IDA7CisgICAgbS0+bVsxMl09IDA7CisgICAgbS0+bVsxM109IDA7CisgICAgbS0+bVsxNF09IDA7CisgICAgbS0+bVsxNV09IDE7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZik7CisgICAgYyA9IGNvcyhyb3QpOworICAgIHMgPSBzaW4ocm90KTsKKworICAgIGNvbnN0IGZsb2F0IGxlbiA9IHgqeCArIHkqeSArIHoqejsKKyAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBzcXJ0KGxlbik7CisgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgfQorICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisgICAgbS0+bVsgMF0gPSB4KngqbmMgKyAgYzsKKyAgICBtLT5tWyA0XSA9ICB4eSpuYyAtIHpzOworICAgIG0tPm1bIDhdID0gIHp4Km5jICsgeXM7CisgICAgbS0+bVsgMV0gPSAgeHkqbmMgKyB6czsKKyAgICBtLT5tWyA1XSA9IHkqeSpuYyArICBjOworICAgIG0tPm1bIDldID0gIHl6Km5jIC0geHM7CisgICAgbS0+bVsgMl0gPSAgengqbmMgLSB5czsKKyAgICBtLT5tWyA2XSA9ICB5eipuYyArIHhzOworICAgIG0tPm1bMTBdID0geip6Km5jICsgIGM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0geDsKKyAgICBtLT5tWzVdID0geTsKKyAgICBtLT5tWzEwXSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVsxMl0gPSB4OworICAgIG0tPm1bMTNdID0geTsKKyAgICBtLT5tWzE0XSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqbGhzLCBjb25zdCByc19tYXRyaXg0eDQgKnJocykgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICBmbG9hdCByaTMgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPDQgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJoc19paiA9IHJzTWF0cml4R2V0KHJocywgaSxqKTsKKyAgICAgICAgICAgIHJpMCArPSByc01hdHJpeEdldChsaHMsIGosIDApICogcmhzX2lqOworICAgICAgICAgICAgcmkxICs9IHJzTWF0cml4R2V0KGxocywgaiwgMSkgKiByaHNfaWo7CisgICAgICAgICAgICByaTIgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAyKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMyArPSByc01hdHJpeEdldChsaHMsIGosIDMpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDMsIHJpMyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgcnNfbWF0cml4NHg0IG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpsaHMsIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgcnNfbWF0cml4M3gzIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgcnNfbWF0cml4MngyICpsaHMsIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByc01hdHJpeFNldChtLCBpLCAwLCByaTApOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAxLCByaTEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnJocykgeworICAgIHJzX21hdHJpeDJ4MiBtdDsKKyAgICByc01hdHJpeExvYWRNdWx0aXBseSgmbXQsIG0sIHJocyk7CisgICAgcnNNYXRyaXhMb2FkKG0sICZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzX21hdHJpeDR4NCBtMTsKKyAgICByc01hdHJpeExvYWRSb3RhdGUoJm0xLCByb3QsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2NhbGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFNjYWxlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbTEsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE9ydGhvKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bMTBdPSAtMi5mIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTJdPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzEzXT0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxNF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRGcnVzdHVtKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mICogbmVhciAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bNV0gPSAyLmYgKiBuZWFyIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVs4XSA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs5XSA9ICh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMV09IC0xLmY7CisgICAgbS0+bVsxNF09IC0yLmYgKiBmYXIgKiBuZWFyIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTVdPSAwLmY7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDQgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopICsgKG0tPm1bMTJdICogaW4udyk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIChtLT5tWzldICogaW4ueikgKyAobS0+bVsxM10gKiBpbi53KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgKG0tPm1bMTBdICogaW4ueikgKyAobS0+bVsxNF0gKiBpbi53KTsKKyAgICByZXQudyA9IChtLT5tWzNdICogaW4ueCkgKyAobS0+bVs3XSAqIGluLnkpICsgKG0tPm1bMTFdICogaW4ueikgKyAobS0+bVsxNV0gKiBpbi53KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgbS0+bVsxNV07CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MiBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyBtLT5tWzEzXTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDMgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSkgKyAobS0+bVs2XSAqIGluLnopOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs3XSAqIGluLnopOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDIgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzJdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bM10gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaW50IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworX19pbmxpbmVfXyBzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVpbnQgYW1vdW50LCB1aW50IGxvdywgdWludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodXNob3J0IGFtb3VudCwgdXNob3J0IGxvdywgdXNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoc2hvcnQgYW1vdW50LCBzaG9ydCBsb3csIHNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWNoYXIgYW1vdW50LCB1Y2hhciBsb3csIHVjaGFyIGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChjaGFyIGFtb3VudCwgY2hhciBsb3csIGNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCmluZGV4IDcwY2Q1NjIuLmZiYTNkNmQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaApAQCAtMSw2NSArMSw0NyBAQAorI2lmbmRlZiBfX1JTX0dSQVBISUNTX1JTSF9fCisjZGVmaW5lIF9fUlNfR1JBUEhJQ1NfUlNIX18KKworI2luY2x1ZGUgInJzX21hdGgucnNoIgogCiAKLWV4dGVybiBmbG9hdDIgdmVjMlJhbmQoZmxvYXQgbGVuKTsKKy8vIGNvbnRleHQKK2V4dGVybiB2b2lkIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQocnNfcHJvZ3JhbV9mcmFnbWVudCk7CitleHRlcm4gdm9pZCByc2dCaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUpOworZXh0ZXJuIHZvaWQgcnNnQmluZFByb2dyYW1WZXJ0ZXgocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIHZvaWQgcnNnQmluZFByb2dyYW1SYXN0ZXIocnNfcHJvZ3JhbV9yYXN0ZXIpOwogCi1leHRlcm4gZmxvYXQzIGZsb2F0M05vcm0oZmxvYXQzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDNMZW5ndGgoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzQWRkKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNTdWIoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M0Nyb3NzKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0M0RvdChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzU2NhbGUoZmxvYXQzIHYsIGZsb2F0IHNjYWxlKTsKK2V4dGVybiB2b2lkIHJzZ0JpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGludCBzbG90LCByc19zYW1wbGVyKTsKK2V4dGVybiB2b2lkIHJzZ0JpbmRUZXh0dXJlKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGludCBzbG90LCByc19hbGxvY2F0aW9uKTsKIAotZXh0ZXJuIGZsb2F0NCBmbG9hdDRBZGQoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NFN1YihmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0Q3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQgZmxvYXQ0RG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRTY2FsZShmbG9hdDQgdiwgZmxvYXQgc2NhbGUpOworZXh0ZXJuIHZvaWQgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCByc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOwogCi0gICAgLy8gY29udGV4dAotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1GcmFnbWVudChyc19wcm9ncmFtX2ZyYWdtZW50KTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtU3RvcmUocnNfcHJvZ3JhbV9zdG9yZSk7Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gaW50IHJzZ0dldFdpZHRoKCk7CitleHRlcm4gaW50IHJzZ0dldEhlaWdodCgpOwogCi1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfc2FtcGxlcik7Ci1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbiwgaW50IG1pcExldmVsKTsKK2V4dGVybiB2b2lkIHJzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0KHJzX2FsbG9jYXRpb24pOworLy9leHRlcm4gdm9pZCByc2dVcGxvYWRNZXNoKHJzX21lc2gpOwogCi1leHRlcm4gdm9pZCB2cExvYWRNb2RlbE1hdHJpeChjb25zdCBmbG9hdCAqKTsKLWV4dGVybiB2b2lkIHZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgZmxvYXQgKik7CitleHRlcm4gdm9pZCByc2dEcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeik7CitleHRlcm4gdm9pZCByc2dEcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKK2V4dGVybiB2b2lkIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7CisvL2V4dGVybiB2b2lkIHJzZ0RyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7CitleHRlcm4gdm9pZCByc2dEcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3U2ltcGxlTWVzaChyc19tZXNoIGlzbSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3U2ltcGxlTWVzaChyc19tZXNoIGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsKIAorZXh0ZXJuIHZvaWQgcnNnQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCByc2dDbGVhckRlcHRoKGZsb2F0KTsKIAotLy8gZHJhd2luZwotZXh0ZXJuIHZvaWQgZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOwotZXh0ZXJuIHZvaWQgZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCk7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpOwotZXh0ZXJuIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpOwotZXh0ZXJuIHZvaWQgZHJhd1NpbXBsZU1lc2goaW50IGlzbSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaFJhbmdlKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3VGV4dChjb25zdCBjaGFyICosIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3VGV4dChyc19hbGxvY2F0aW9uLCBpbnQgeCwgaW50IHkpOworZXh0ZXJuIHZvaWQgcnNnQmluZEZvbnQocnNfZm9udCk7CiAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIG1pc2MKLWV4dGVybiB2b2lkIHBmQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiBleHRlcm4gdm9pZCBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBoc2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiVG9SZ2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKTsKLWV4dGVybiBpbnQgaHNiVG9BYmdyKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIHZvaWQgdXBsb2FkVG9UZXh0dXJlKGludCwgaW50KTsKLWV4dGVybiB2b2lkIHVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCk7Ci0KLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gaW50IGNvbG9yRmxvYXRSR0J0bzU2NShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLQotZXh0ZXJuIGludCBnZXRXaWR0aCgpOwotZXh0ZXJuIGludCBnZXRIZWlnaHQoKTsKLQotZXh0ZXJuIGludCBzZW5kVG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKTsKLQotZXh0ZXJuIHZvaWQgZGVidWdGKGNvbnN0IGNoYXIgKiwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgZGVidWdJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZGVidWdIZXhJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKaW5kZXggNjEzYzdjYS4uOGJmNTNiZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaApAQCAtMSwyODcgKzEsNTUgQEAKLS8vIEZsb2F0IG9wcwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQyLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ4LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzLCBmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0MTYpOworI2luY2x1ZGUgInJzX2NsLnJzaCIKKyNpbmNsdWRlICJyc19jb3JlLnJzaCIKIAogCiAKKy8vIEFsbG9jYXRpb25zCitleHRlcm4gcnNfYWxsb2NhdGlvbiByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqKTsKK2V4dGVybiB1aW50MzJfdCByc0FsbG9jYXRpb25HZXREaW1YKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IHJzQWxsb2NhdGlvbkdldERpbVkocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgcnNBbGxvY2F0aW9uR2V0RGltWihyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCByc0FsbG9jYXRpb25HZXREaW1MT0QocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbik7CiAKIAogCi0vLyBJbnQgb3BzCisvLyBEZWJ1Z2dpbmcKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0Mik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdDMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSlyc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQ0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICopOworI2RlZmluZSBSU19ERUJVRyhhKSByc0RlYnVnKCNhLCBhKQorI2RlZmluZSBSU19ERUJVR19NQVJLRVIgcnNEZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18pCiAKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7Ci1leHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Mik7Ci1leHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Myk7Ci1leHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50NCk7Ci1leHRlcm4gaW50OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50OCk7Ci1leHRlcm4gaW50MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludDE2KTsKKy8vIFJTIE1hdGgKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNSYW5kKGludCk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUmFuZChpbnQsIGludCk7CitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNSYW5kKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1JhbmQoZmxvYXQsIGZsb2F0KTsKIAorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRnJhYyhmbG9hdCk7CiAKKy8vIHRpbWUKK2V4dGVybiBpbnQzMl90IHJzU2Vjb25kKCk7CitleHRlcm4gaW50MzJfdCByc01pbnV0ZSgpOworZXh0ZXJuIGludDMyX3QgcnNIb3VyKCk7CitleHRlcm4gaW50MzJfdCByc0RheSgpOworZXh0ZXJuIGludDMyX3QgcnNNb250aCgpOworZXh0ZXJuIGludDMyX3QgcnNZZWFyKCk7CitleHRlcm4gaW50NjRfdCByc1VwdGltZU1pbGxpcygpOworZXh0ZXJuIGludDY0X3QgcnNTdGFydFRpbWVNaWxsaXMoKTsKK2V4dGVybiBpbnQ2NF90IHJzRWxhcHNlZFRpbWVNaWxsaXMoKTsKIAotLyoKLWV4dGVybiBmbG9hdCBtb2RmKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgcmFuZGYoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IHJhbmRmMihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IGZyYWNmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBsZXJwZihmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCBtYXBmKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0qLworZXh0ZXJuIGludCByc1NlbmRUb0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpOworCisvLyBTY3JpcHQgdG8gU2NyaXB0CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRm9yRWFjaChyc19zY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSlyc0ZvckVhY2gocnNfc2NyaXB0LCByc19hbGxvY2F0aW9uIGlucHV0LCByc19hbGxvY2F0aW9uIG91dHB1dCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRm9yRWFjaChyc19zY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIGludCB4U3RhcnQsIGludCB4RW5kKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGludCB4U3RhcnQsIGludCB4RW5kKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgaW50IHhTdGFydCwgaW50IHlTdGFydCwgaW50IHhFbmQsIGludCB5RW5kKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGludCB4U3RhcnQsIGludCB5U3RhcnQsIGludCB4RW5kLCBpbnQgeUVuZCk7CisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKaW5kZXggNDE5OGE3NC4uNjllMWFlZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCkBAIC0yLDcwICsyLDcxIEBACiB0eXBlZGVmIGNoYXIgaW50OF90OwogdHlwZWRlZiBzaG9ydCBpbnQxNl90OwogdHlwZWRlZiBpbnQgaW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIGludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIHVpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CiAKIHR5cGVkZWYgdWludDhfdCB1Y2hhcjsKIHR5cGVkZWYgdWludDE2X3QgdXNob3J0OwogdHlwZWRlZiB1aW50MzJfdCB1aW50OwotLy90eXBlZGVmIHVpbnQ2NF90IHVsb25nOwordHlwZWRlZiB1aW50NjRfdCB1bG9uZzsKIAotdHlwZWRlZiBpbnQgcnNfZWxlbWVudDsKLXR5cGVkZWYgaW50IHJzX3R5cGU7Ci10eXBlZGVmIGludCByc19hbGxvY2F0aW9uOwotdHlwZWRlZiBpbnQgcnNfc2FtcGxlcjsKLXR5cGVkZWYgaW50IHJzX3NjcmlwdDsKLXR5cGVkZWYgaW50IHJzX21lc2g7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX2ZyYWdtZW50OwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV92ZXJ0ZXg7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3Jhc3RlcjsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fc3RvcmU7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19lbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfdHlwZTsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2FsbG9jYXRpb247Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zYW1wbGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfc2NyaXB0OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfbWVzaDsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fZnJhZ21lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3ZlcnRleDsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fcmFzdGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2ZvbnQ7CiAKIHR5cGVkZWYgZmxvYXQgZmxvYXQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBmbG9hdCBmbG9hdDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGZsb2F0IGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgZmxvYXQgZmxvYXQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBmbG9hdCBmbG9hdDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1Y2hhciB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVjaGFyIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdWNoYXIgdWNoYXI0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1Y2hhciB1Y2hhcjggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVjaGFyIHVjaGFyMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1c2hvcnQgdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVzaG9ydCB1c2hvcnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1c2hvcnQgdXNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVpbnQgdWludDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVpbnQgdWludDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVpbnQgdWludDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVpbnQgdWludDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVpbnQgdWludDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBjaGFyIGNoYXIyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBjaGFyIGNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBjaGFyIGNoYXI0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBjaGFyIGNoYXI4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBjaGFyIGNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgc2hvcnQgc2hvcnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBzaG9ydCBzaG9ydDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHNob3J0IHNob3J0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgc2hvcnQgc2hvcnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBzaG9ydCBzaG9ydDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBpbnQgaW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgaW50IGludDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGludCBpbnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBpbnQgaW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgaW50IGludDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVsxNl07Cit9IHJzX21hdHJpeDR4NDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bOV07Cit9IHJzX21hdHJpeDN4MzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bNF07Cit9IHJzX21hdHJpeDJ4MjsKKworCisjZGVmaW5lIFJTX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQogCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAppbmRleCBhMTQwMWFkLi40MzYyZDE0IDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKQEAgLTMxNyw2ICszMTcsMTIgQEAKICAgICAgICAgICAgIG1TdHJpbmdQb29sU2l6ZSA9CiAgICAgICAgICAgICAgICAgKG1IZWFkZXItPmhlYWRlci5zaXplLW1IZWFkZXItPnN0cmluZ3NTdGFydCkvY2hhclNpemU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBzdGFydHMgYmVmb3JlIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPj0gKG1IZWFkZXItPmhlYWRlci5zaXplLXNpemVvZih1aW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQgcGFzdCBkYXRhIHNpemUgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbUhlYWRlci0+c3R5bGVzU3RhcnQsIChpbnQpbUhlYWRlci0+aGVhZGVyLnNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAobUVycm9yPUJBRF9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIGZvbGxvdyB0aGUgc3RyaW5ncwogICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0IDw9IG1IZWFkZXItPnN0cmluZ3NTdGFydCkgewogICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkLCBiZWZvcmUgc3RyaW5ncyBhdCAlZFxuIiwKQEAgLTE4NzgsNiArMTg4NCwxMiBAQAogICAgICAgICBvdXROYW1lLT50eXBlID0gZ3JwLT5iYXNlUGFja2FnZS0+dHlwZVN0cmluZ3Muc3RyaW5nQXQodCwgJm91dE5hbWUtPnR5cGVMZW4pOwogICAgICAgICBvdXROYW1lLT5uYW1lID0gZ3JwLT5iYXNlUGFja2FnZS0+a2V5U3RyaW5ncy5zdHJpbmdBdCgKICAgICAgICAgICAgIGR0b2hsKGVudHJ5LT5rZXkuaW5kZXgpLCAmb3V0TmFtZS0+bmFtZUxlbik7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGJhZCBpbmRleCBmb3Igc29tZSByZWFzb24sIHdlIHNob3VsZCBhYm9ydC4KKyAgICAgICAgaWYgKG91dE5hbWUtPnR5cGUgPT0gTlVMTCB8fCBvdXROYW1lLT5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjYwOSw2ICsyNjIxLDI0IEBACiAgICAgICAgICpvdXRUeXBlID0gKmRlZlR5cGU7CiAgICAgfQogICAgICpvdXROYW1lID0gU3RyaW5nMTYocCwgZW5kLXApOworICAgIGlmKCoqb3V0UGFja2FnZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgcGFja2FnZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0VHlwZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgdHlwZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0TmFtZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgaWQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDEyNywxMyArNDE1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIElOVkFMSUQgVFlQRSBDT05GSUcgRk9SIFJFU09VUkNFIDB4JTA4eFxuIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewpAQCAtNDM0MCwxMSArNDM3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgSU5WQUxJRCBSRVNPVVJDRSAweCUwOHg6ICIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpc09mZnNldCYweDMpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk5PTi1JTlRFR0VSIE9GRlNFVDogJXBcbiIsICh2b2lkKil0aGlzT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MDIsMTggKzQ0MzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYWdQdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTiA9IGR0b2hsKGJhZ1B0ci0+Y291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChjb25zdCBSZXNUYWJsZV9tYXAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKWVudCkgKyBlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJhc2VNYXBQdHIgPSAoY29uc3QgdWludDhfdCopZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgUGFyZW50PTB4JTA4eCwgQ291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obChiYWdQdHItPnBhcmVudC5pZGVudCksIE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOICYmIG1hcE9mZnNldCA8ICh0eXBlU2l6ZS1zaXplb2YoUmVzVGFibGVfbWFwKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgIyVpIChLZXk9MHglMDh4KTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkdG9obChtYXBQdHItPm5hbWUuaWRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNvcHlGcm9tX2R0b2gobWFwUHRyLT52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gZHRvaHMobWFwUHRyLT52YWx1ZS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKSgoKGNvbnN0IHVpbnQ4X3QqKW1hcFB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPZmZzZXQgKz0gc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCmluZGV4IGJiYmJhNzQuLmIyM2RjZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKQEAgLTE1MjUsNCArMTUyNSwyMiBAQAogICAgICAgKiB7QGhpZGV9CiAgICAgICAqLwogICAgICBwcml2YXRlIElCaW5kZXIgbUlDYWxsQmFjayA9IG5ldyBCaW5kZXIoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGhvbmUgaXMgaW4gc2lsZW50IG1vZGUsIHdpdGggb3Igd2l0aG91dCB2aWJyYXRlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UmluZ2VyTW9kZSgpCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBDb3VuY2lsIGFwcHJvdmFsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaWxlbnRNb2RlKCkgeworICAgICAgICBpbnQgcmluZ2VyTW9kZSA9IGdldFJpbmdlck1vZGUoKTsKKyAgICAgICAgYm9vbGVhbiBzaWxlbnRNb2RlID0KKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1NJTEVOVCkgfHwKKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1ZJQlJBVEUpOworICAgICAgICByZXR1cm4gc2lsZW50TW9kZTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTE4MmJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBDbGllbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDbGllbnQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBDbGllbnQoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk10cENsaWVudDogbGlzdGVuZXIgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbUV2ZW50VGhyZWFkID0gbmV3IE10cEV2ZW50VGhyZWFkKCk7CisgICAgICAgIG1FdmVudFRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcmVudChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9wYXJlbnQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0b3JhZ2VJRChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zdG9yYWdlX2lkKGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNdHBFdmVudFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOworCisgICAgICAgIHB1YmxpYyBNdHBFdmVudFRocmVhZCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCJNdHBFdmVudFRocmVhZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiTXRwRXZlbnRUaHJlYWQgc3RhcnRpbmciKTsKKyAgICAgICAgICAgIHdoaWxlICghbURvbmUpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgd2FpdCBmb3IgYW4gZXZlbnQgZnJvbSBhbiBNVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuZChUQUcsICJNdHBFdmVudFRocmVhZCBleGl0aW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYSBuZXcgTVRQIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkCisgICAgICAgIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKTsKKworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhbiBNVFAgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZUFkZGVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VBZGRlZChpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlUmVtb3ZlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlUmVtb3ZlZChpZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNdHBFdmVudFRocmVhZCBtRXZlbnRUaHJlYWQ7CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfZGVsZXRlX29iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRfcGFyZW50KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9zdG9yYWdlX2lkKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjZmQwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RXaW5kb3dlZEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICAqIEN1cnNvciBjbGFzcyBmb3IgTVRQIGNvbnRlbnQgcHJvdmlkZXIKKyAgKiBAaGlkZQorICAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cEN1cnNvciBleHRlbmRzIEFic3RyYWN0V2luZG93ZWRDdXJzb3IgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cEN1cnNvciI7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19DT1VOVCA9IC0xOworCisgICAgLyogY29uc3RhbnRzIGZvciBtUXVlcnlUeXBlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFICAgICAgICAgICAgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX0lEICAgICAgICAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRSAgICAgICAgICAgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9JRCAgICAgICAgICA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUICAgICAgICAgICAgICA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lEICAgICAgICAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9DSElMRFJFTiAgICA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0NISUxEUkVOICAgICA9IDg7CisKKyAgICBwcml2YXRlIGludCBtUXVlcnlUeXBlOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGludCBtU3RvcmFnZUlEOworICAgIHByaXZhdGUgaW50IG1RYmplY3RJRDsKKworICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHByb2plY3Rpb24gKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworCisgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCisgICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CisKKyAgICBwcml2YXRlIGZpbmFsIE10cENsaWVudCBtQ2xpZW50OworCisgICAgcHVibGljIE10cEN1cnNvcihNdHBDbGllbnQgY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKworICAgICAgICBtQ2xpZW50ID0gY2xpZW50OworICAgICAgICBtUXVlcnlUeXBlID0gcXVlcnlUeXBlOworICAgICAgICBtRGV2aWNlSUQgPSBkZXZpY2VJRDsKKyAgICAgICAgbVN0b3JhZ2VJRCA9IHN0b3JhZ2VJRDsKKyAgICAgICAgbVFiamVjdElEID0gb2JqZWN0SUQ7CisgICAgICAgIG1Db2x1bW5zID0gcHJvamVjdGlvbjsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5VHlwZSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICBjYXNlIERFVklDRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzRGV2aWNlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICAgICAgbWFwID0gc09iamVjdFByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gcXVlcnkgdHlwZSAiICArIHF1ZXJ5VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBjb2x1bW5zID0gbmV3IGludFtwcm9qZWN0aW9uLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdGlvbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSW50ZWdlciBpZCA9IG1hcC5nZXQocHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY29sdW1uICIgICsgcHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2x1bW5zW2ldID0gaWQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfc2V0dXAoY2xpZW50LCBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgaWYgKG1Db3VudCA9PSBOT19DT1VOVCkgeworICAgICAgICAgICAgZmlsbFdpbmRvdygwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CisgICAgICAgIExvZy5kKFRBRywgInJlcXVlcnkiKTsKKyAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsV2luZG93KGludCBzdGFydFBvcykgeworICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHdpbmRvdyBzZXQgYWxyZWFkeSBpdCB3aWxsIG9ubHkgYmUgYWNjZXNzZWQgbG9jYWxseQorICAgICAgICAgICAgbVdpbmRvdyA9IG5ldyBDdXJzb3JXaW5kb3codHJ1ZSAvKiB0aGUgd2luZG93IGlzIGxvY2FsIG9ubHkgKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOworICAgICAgICBtQ291bnQgPSBuYXRpdmVfZmlsbF93aW5kb3cobVdpbmRvdywgc3RhcnRQb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q29sdW1uTmFtZXMgcmV0dXJuaW5nICIgKyBtQ29sdW1ucyk7CisgICAgICAgIHJldHVybiBtQ29sdW1uczsKKyAgICB9CisKKyAgICAvKiBEZXZpY2UgQ29sdW1uIElEcyAqLworICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9ST1dfSUQgICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX01PREVMICAgICAgICAgICA9IDM7CisKKyAgICAvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX1JPV19JRCAgICAgICAgID0gMTAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lERU5USUZJRVIgICAgID0gMTAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0RFU0NSSVBUSU9OICAgID0gMTAzOworCisgICAgLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICA9IDIwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgPSAyMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9GT1JNQVQgICAgICAgICAgICAgID0gMjAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICA9IDIwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgPSAyMDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9GT1JNQVQgICAgICAgID0gMjA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICA9IDIwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgPSAyMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9IRUlHSFQgICAgICAgID0gMjA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICA9IDIxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgPSAyMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9ERVBUSCAgICAgICAgID0gMjEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICA9IDIxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgPSAyMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDICAgID0gMjE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICA9IDIxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgPSAyMTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX0NSRUFURUQgICAgICAgID0gMjE4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICA9IDIxOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgPSAyMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQiAgICAgICAgICAgICAgID0gMjIxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNPYmplY3RQcm9qZWN0aW9uTWFwOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLl9JRCwgbmV3IEludGVnZXIoREVWSUNFX1JPV19JRCkpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIG5ldyBJbnRlZ2VyKERFVklDRV9NQU5VRkFDVFVSRVIpKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuTU9ERUwsIG5ldyBJbnRlZ2VyKERFVklDRV9NT0RFTCkpOworCisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5fSUQsIG5ldyBJbnRlZ2VyKFNUT1JBR0VfUk9XX0lEKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuSURFTlRJRklFUiwgbmV3IEludGVnZXIoU1RPUkFHRV9JREVOVElGSUVSKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04sIG5ldyBJbnRlZ2VyKFNUT1JBR0VfREVTQ1JJUFRJT04pKTsKKworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuX0lELCBuZXcgSW50ZWdlcihPQkpFQ1RfUk9XX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNUT1JBR0VfSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TVE9SQUdFX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5QUk9URUNUSU9OX1NUQVRVUywgbmV3IEludGVnZXIoT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0ZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9TSVpFLCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfU0laRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0RFUFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBBUkVOVCwgbmV3IEludGVnZXIoT0JKRUNUX1BBUkVOVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9UWVBFLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9ERVNDLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fREVTQykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9DUkVBVEVELCBuZXcgSW50ZWdlcihPQkpFQ1RfREFURV9DUkVBVEVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX01PRElGSUVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LktFWVdPUkRTLCBuZXcgSW50ZWdlcihPQkpFQ1RfS0VZV09SRFMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Lk5BTUUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9OQU1FKSk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsCisgICAgICAgICAgICBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50W10gY29sdW1ucyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV93YWl0X2Zvcl9ldmVudCgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjNzdmNTUxLi4zNzJhOTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC03MjcsNyArNzI3LDggQEAKICAgICBpZiAoKHBvcENvdW50KGRldmljZSkgPT0gMSApICYmCiAgICAgICAgIChkZXZpY2UgJiAoQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyB8CiAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkpKSB7CisgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfAorICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggNmY1ODFkMy4uMjQ0MjZmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xMzMsNiArMTMzLDEzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKG5hbWUpOworICAgICAgICBpZiAobmFtZUxlbmd0aCArIDEgPiBwYXRoUmVtYWluaW5nKSB7CisgICAgICAgICAgICAvLyBwYXRoIHRvbyBsb25nIQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGZpbGVTcG90LCBuYW1lKTsKKwogICAgICAgICBpbnQgdHlwZSA9IGVudHJ5LT5kX3R5cGU7CiAgICAgICAgIGlmICh0eXBlID09IERUX1VOS05PV04pIHsKICAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIGlzIHVua25vd24sIHN0YXQoKSB0aGUgZmlsZSBpbnN0ZWFkLgpAQCAtMTUwLDE2ICsxNTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlID09IERUX1JFRyB8fCB0eXBlID09IERUX0RJUikgewotICAgICAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7Ci0gICAgICAgICAgICBib29sIGlzRGlyZWN0b3J5ID0gKHR5cGUgPT0gRFRfRElSKTsKLQotICAgICAgICAgICAgaWYgKG5hbWVMZW5ndGggPiBwYXRoUmVtYWluaW5nIHx8IChpc0RpcmVjdG9yeSAmJiBuYW1lTGVuZ3RoICsgMSA+IHBhdGhSZW1haW5pbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyY3B5KGZpbGVTcG90LCBuYW1lKTsKLSAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gRFRfRElSKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGRpcmVjdG9yaWVzIHdpdGggYSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggJy4nCiAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHRoZSBNYWMgIi5UcmFzaGVzIiBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY4NGUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMDIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbXRwdGVzdC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEYXRhYmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBNZWRpYVNjYW5uZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFNlcnZlci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgU3FsaXRlRGF0YWJhc2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBTcWxpdGVTdGF0ZW1lbnQuY3BwICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbXRwdGVzdAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL3NxbGl0ZS9kaXN0CisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ1dGlscyBsaWJzcWxpdGUgbGlic3RhZ2VmcmlnaHQgbGliY3V0aWxzIFwKKwlsaWJtZWRpYQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJtdHBob3N0CisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDdXJzb3IuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5LmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworCitMT0NBTF9DRkxBR1MgOj0gLWcgLURNVFBfSE9TVAorTE9DQUxfTERGTEFHUyA6PSAtZworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gc2NhbnRlc3QKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgc2NhbnRlc3QuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBNZWRpYVNjYW5uZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFiYXNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwVXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBTcWxpdGVEYXRhYmFzZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFNxbGl0ZVN0YXRlbWVudC5jcHAgICAgICAgICAgICAgICAgICAgXAorCisKKyNMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnVzYmhvc3QKKyNMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvc3FsaXRlL2Rpc3QKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidXRpbHMgbGlic3FsaXRlIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhCisKKworTE9DQUxfQ0ZMQUdTIDo9IC1nCitMT0NBTF9MREZMQUdTIDo9IC1nCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cENsaWVudC5jcHAgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg3NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cENsaWVudC5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cENsaWVudCIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjApCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERlYnVnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwQ2xpZW50OjpNdHBDbGllbnQoKQorICAgIDogICBtU3RhcnRlZChmYWxzZSkKK3sKK30KKworTXRwQ2xpZW50Ojp+TXRwQ2xpZW50KCkgeworfQorCitib29sIE10cENsaWVudDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdGFydGVkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICh1c2JfaG9zdF9pbml0KHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgdGhpcykpIHsKKyAgICAgICAgTE9HRSgiTXRwQ2xpZW50OjpzdGFydCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNdHBDbGllbnQ6OnVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CisKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXNiX2Rlc2NyaXB0b3JfaXRlcl9pbml0KGRldmljZSwgJml0ZXIpOworCisgICAgd2hpbGUgKChkZXNjID0gdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9JTlRFUkZBQ0UpIHsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZSA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICopZGVzYzsKKworICAgICAgICAgICAgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19TVElMTF9JTUFHRSAmJgorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzID09IDEgJiYgLy8gU3RpbGwgSW1hZ2UgQ2FwdHVyZQorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sID09IDEpICAgICAvLyBQaWN0dXJlIFRyYW5zZmVyIFByb3RvY29sIChQSU1BIDE1NDcwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGNhbWVyYTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKworICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhyZWUgZW5kcG9pbnRzCisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2luX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0X2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW5fZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX291dF9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbnRyX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWVwX2luX2Rlc2MgfHwgIWVwX291dF9kZXNjIHx8ICFlcF9pbnRyX2Rlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW5fZGVzYyk7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0ID0gdXNiX2VuZHBvaW50X29wZW4oZGV2aWNlLCBlcF9vdXRfZGVzYyk7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50ciA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW50cl9kZXNjKTsKKworICAgICAgICAgICAgICAgIGlmICh1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgidXNiX2RldmljZV9jbGFpbV9pbnRlcmZhY2UgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2luKTsKKyAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX291dCk7CisgICAgICAgICAgICAgICAgICAgIHVzYl9lbmRwb2ludF9jbG9zZShlcF9pbnRyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE10cERldmljZSogbXRwRGV2aWNlID0gbmV3IE10cERldmljZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbiwgZXBfb3V0LCBlcF9pbnRyKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQobXRwRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBtdHBEZXZpY2UtPmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VBZGRlZChtdHBEZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKK30KKworTXRwRGV2aWNlKiBNdHBDbGllbnQ6OmdldERldmljZShpbnQgaWQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gbURldmljZUxpc3RbaV07CisgICAgICAgIGlmIChkZXZpY2UtPmdldElEKCkgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBDbGllbnQ6OnVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGV2bmFtZSwgZGV2aWNlLT5nZXREZXZpY2VOYW1lKCkpKSB7CisgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgICAgICBMT0dEKCJDYW1lcmEgcmVtb3ZlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9hZGRlZCAlc1xuIiwgZGV2bmFtZSk7CisgICAgKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZUFkZGVkKGRldm5hbWUpOworfQorCit2b2lkIE10cENsaWVudDo6dXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9yZW1vdmVkICVzXG4iLCBkZXZuYW1lKTsKKyAgICAoKE10cENsaWVudCAqKWNsaWVudF9kYXRhKS0+dXNiRGV2aWNlUmVtb3ZlZChkZXZuYW1lKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDbGllbnQuaCBiL21lZGlhL210cC9NdHBDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdjMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cENsaWVudC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfQ0xJRU5UX0gKKyNkZWZpbmUgX01UUF9DTElFTlRfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2VMaXN0ICAgICAgICAgICBtRGV2aWNlTGlzdDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhcnRlZDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cENsaWVudCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBDbGllbnQoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisKKyAgICBpbmxpbmUgTXRwRGV2aWNlTGlzdCYgICBnZXREZXZpY2VMaXN0KCkgeyByZXR1cm4gbURldmljZUxpc3Q7IH0KKyAgICBNdHBEZXZpY2UqICAgICAgICAgICAgICBnZXREZXZpY2UoaW50IGlkKTsKKworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSA9IDA7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlQWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlUmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lKTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvbXRwL010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzYTViZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3IiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBDdXJzb3IuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogRGV2aWNlIENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBERVZJQ0VfUk9XX0lEICAgICAgICAgICAxCisjZGVmaW5lIERFVklDRV9NQU5VRkFDVFVSRVIgICAgIDIKKyNkZWZpbmUgREVWSUNFX01PREVMICAgICAgICAgICAgMworCisvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBTVE9SQUdFX1JPV19JRCAgICAgICAgICAxMDEKKyNkZWZpbmUgU1RPUkFHRV9JREVOVElGSUVSICAgICAgMTAyCisjZGVmaW5lIFNUT1JBR0VfREVTQ1JJUFRJT04gICAgIDEwMworCisvKiBPYmplY3QgQ29sdW1uIElEcyAqLworLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5qYXZhICovCisjZGVmaW5lIE9CSkVDVF9ST1dfSUQgICAgICAgICAgICAgICAyMDEKKyNkZWZpbmUgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgIDIwMgorI2RlZmluZSBPQkpFQ1RfRk9STUFUICAgICAgICAgICAgICAgMjAzCisjZGVmaW5lIE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUyAgICAyMDQKKyNkZWZpbmUgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgIDIwNQorI2RlZmluZSBPQkpFQ1RfVEhVTUJfRk9STUFUICAgICAgICAgMjA2CisjZGVmaW5lIE9CSkVDVF9USFVNQl9TSVpFICAgICAgICAgICAyMDcKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgIDIwOAorI2RlZmluZSBPQkpFQ1RfVEhVTUJfSEVJR0hUICAgICAgICAgMjA5CisjZGVmaW5lIE9CSkVDVF9JTUFHRV9XSURUSCAgICAgICAgICAyMTAKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgIDIxMQorI2RlZmluZSBPQkpFQ1RfSU1BR0VfREVQVEggICAgICAgICAgMjEyCisjZGVmaW5lIE9CSkVDVF9QQVJFTlQgICAgICAgICAgICAgICAyMTMKKyNkZWZpbmUgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgIDIxNAorI2RlZmluZSBPQkpFQ1RfQVNTT0NJQVRJT05fREVTQyAgICAgMjE1CisjZGVmaW5lIE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIgICAgICAyMTYKKyNkZWZpbmUgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgIDIxNworI2RlZmluZSBPQkpFQ1RfREFURV9DUkVBVEVEICAgICAgICAgMjE4CisjZGVmaW5lIE9CSkVDVF9EQVRFX01PRElGSUVEICAgICAgICAyMTkKKyNkZWZpbmUgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgIDIyMAorI2RlZmluZSBPQkpFQ1RfVEhVTUIgICAgICAgICAgICAgICAgMjIxCisKK010cEN1cnNvcjo6TXRwQ3Vyc29yKE10cENsaWVudCogY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsCisgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucykKKyAgICAgICAgOiAgIG1DbGllbnQoY2xpZW50KSwKKyAgICAgICAgICAgIG1RdWVyeVR5cGUocXVlcnlUeXBlKSwKKyAgICAgICAgICAgIG1EZXZpY2VJRChkZXZpY2VJRCksCisgICAgICAgICAgICBtU3RvcmFnZUlEKHN0b3JhZ2VJRCksCisgICAgICAgICAgICBtUWJqZWN0SUQob2JqZWN0SUQpLAorICAgICAgICAgICAgbUNvbHVtbkNvdW50KGNvbHVtbkNvdW50KSwKKyAgICAgICAgICAgIG1Db2x1bW5zKE5VTEwpCit7CisgICAgaWYgKGNvbHVtbnMpIHsKKyAgICAgICAgbUNvbHVtbnMgPSBuZXcgaW50W2NvbHVtbkNvdW50XTsKKyAgICAgICAgbWVtY3B5KG1Db2x1bW5zLCBjb2x1bW5zLCBjb2x1bW5Db3VudCAqIHNpemVvZihpbnQpKTsKKyAgICB9Cit9CisKK010cEN1cnNvcjo6fk10cEN1cnNvcigpIHsKKyAgICBkZWxldGVbXSBtQ29sdW1uczsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTE9HRCgiTXRwQ3Vyc29yOjpmaWxsV2luZG93IG1RdWVyeVR5cGU6ICVkXG4iLCBtUXVlcnlUeXBlKTsKKworICAgIHN3aXRjaCAobVF1ZXJ5VHlwZSkgeworICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsRGV2aWNlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBERVZJQ0VfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlKHdpbmRvdywgc3RhcnRQb3MpOworICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIDAsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdCh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgLTEsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCBtUWJqZWN0SUQsIHN0YXJ0UG9zKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdzogdW5rbm93biBxdWVyeSB0eXBlICVkXG4iLCBtUXVlcnlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlTGlzdCA9IG1DbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZmlsbERldmljZSh3aW5kb3csIGRldmljZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VJRHMgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICBpZiAoIXN0b3JhZ2VJRHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlSURzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gKCpzdG9yYWdlSURzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBzdG9yYWdlSUQsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgc3RvcmFnZUlEczsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbFN0b3JhZ2Uod2luZG93LCBkZXZpY2UsIG1TdG9yYWdlSUQsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IGRldmljZS0+Z2V0T2JqZWN0SGFuZGxlcyhtU3RvcmFnZUlELCAwLCBwYXJlbnQpOworICAgIGlmICghaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICBpZiAoZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgaGFuZGxlLCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgbVFiamVjdElELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwgaW50IHJvdykgeworICAgIE10cERldmljZUluZm8qIGRldmljZUluZm8gPSBkZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICBpZiAoIWRldmljZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgZGV2aWNlLT5nZXRJRCgpLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERVZJQ0VfTUFOVUZBQ1RVUkVSOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1hbnVmYWN0dXJlciwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01PREVMOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1vZGVsLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsRGV2aWNlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBpbnQgcm93KSB7CisKK0xPR0QoImZpbGxTdG9yYWdlICVkXG4iLCBzdG9yYWdlSUQpOworCisgICAgTXRwU3RvcmFnZUluZm8qIHN0b3JhZ2VJbmZvID0gZGV2aWNlLT5nZXRTdG9yYWdlSW5mbyhzdG9yYWdlSUQpOworICAgIGlmICghc3RvcmFnZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkgeworICAgICAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiB0ZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBzdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1Wb2x1bWVJZGVudGlmaWVyOworICAgICAgICAgICAgICAgIGlmICghdGV4dCB8fCAhdGV4dFswXSkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJDYW1lcmEgU3RvcmFnZSI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0RFU0NSSVBUSU9OOgorICAgICAgICAgICAgICAgIHRleHQgPSBzdG9yYWdlSW5mby0+bVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiU3RvcmFnZSBEZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsU3RvcmFnZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgcmV0dXJuIHRydWU7CisKK2ZhaWw6CisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpIHsKKworICAgIE10cE9iamVjdEluZm8qIG9iamVjdEluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8ob2JqZWN0SUQpOworICAgIGlmICghb2JqZWN0SW5mbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIG9iamVjdEluZm8tPnByaW50KCk7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIG9iamVjdEluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVN0b3JhZ2VJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVByb3RlY3Rpb25TdGF0dXMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Db21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJGb3JtYXQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9JTUFHRV9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfREVQVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4RGVwdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVBhcmVudCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEU6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uVHlwZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0M6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uRGVzYywgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tU2VxdWVuY2VOdW1iZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9OQU1FOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bU5hbWUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9EQVRFX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVDcmVhdGVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRGF0ZU1vZGlmaWVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfS0VZV09SRFM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCBvYmplY3RJbmZvLT5tS2V5d29yZHMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFRodW1ibmFpbCh3aW5kb3csIG9iamVjdElELCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoImZpbGxTdG9yYWdlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpIHsKKyAgICBpZiAoIXdpbmRvdy0+c2V0TnVtQ29sdW1ucyhtQ29sdW1uQ291bnQpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjaGFuZ2UgY29sdW1uIGNvdW50IGZyb20gJWQgdG8gJWQiLCB3aW5kb3ctPmdldE51bUNvbHVtbnMoKSwgbUNvbHVtbkNvdW50KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IHdpbmRvdy0+YWxsb2NSb3coKTsKKyAgICBpZiAoIWZpZWxkRGlyKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBNdHBDdXJzb3I6OnB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbikgeworCisgICAgaWYgKCF3aW5kb3ctPnB1dExvbmcocm93LCBjb2x1bW4sIHZhbHVlKSkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGxvbmcgaW4gY29sdW1uICVkIiwgY29sdW1uKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnB1dFN0cmluZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgY29uc3QgY2hhciogdGV4dCwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIGludCBzaXplID0gc3RybGVuKHRleHQpICsgMTsKKyAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgJXMiLCBzaXplLCB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIChjb25zdCB1aW50OF90Kil0ZXh0LCBzaXplKTsKKworICAgIC8vIFRoaXMgbXVzdCBiZSB1cGRhdGVkIGFmdGVyIHRoZSBjYWxsIHRvIGFsbG9jKCksIHNpbmNlIHRoYXQKKyAgICAvLyBtYXkgbW92ZSB0aGUgZmllbGQgYXJvdW5kIGluIHRoZSB3aW5kb3cKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSB3aW5kb3ctPmdldEZpZWxkU2xvdChyb3csIGNvbHVtbik7CisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9TVFJJTkc7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IG9iamVjdElELCBpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpbnQgc2l6ZTsKKyAgICB2b2lkKiB0aHVtYm5haWwgPSBkZXZpY2UtPmdldFRodW1ibmFpbChvYmplY3RJRCwgc2l6ZSk7CisKKyAgICBMT0dEKCJwdXRUaHVtYm5haWw6ICVwLCBzaXplOiAlZFxuIiwgdGh1bWJuYWlsLCBzaXplKTsKKyAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0aHVtYm5haWwiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgKGNvbnN0IHVpbnQ4X3QqKXRodW1ibmFpbCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfQkxPQjsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ3Vyc29yLmggYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxYzA1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NVUlNPUl9ICisjZGVmaW5lIF9NVFBfQ1VSU09SX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ3Vyc29yV2luZG93OworCitjbGFzcyBNdHBDdXJzb3IgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgREVWSUNFICAgICAgICAgICAgICA9IDEsCisgICAgICAgIERFVklDRV9JRCAgICAgICAgICAgPSAyLAorICAgICAgICBTVE9SQUdFICAgICAgICAgICAgID0gMywKKyAgICAgICAgU1RPUkFHRV9JRCAgICAgICAgICA9IDQsCisgICAgICAgIE9CSkVDVCAgICAgICAgICAgICAgPSA1LAorICAgICAgICBPQkpFQ1RfSUQgICAgICAgICAgID0gNiwKKyAgICAgICAgU1RPUkFHRV9DSElMRFJFTiAgICA9IDcsCisgICAgICAgIE9CSkVDVF9DSElMRFJFTiAgICAgPSA4LAorICAgIH07CisKKyAgICBNdHBDbGllbnQqICBtQ2xpZW50OworICAgIGludCAgICAgICAgIG1RdWVyeVR5cGU7CisgICAgaW50ICAgICAgICAgbURldmljZUlEOworICAgIGludCAgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgaW50ICAgICAgICAgbVFiamVjdElEOworICAgIGludCAgICAgICAgIG1Db2x1bW5Db3VudDsKKyAgICBpbnQqICAgICAgICBtQ29sdW1uczsKKworcHVibGljOgorICAgICAgICAgICAgICAgIE10cEN1cnNvcihNdHBDbGllbnQqIGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucyk7CisgICAgdmlydHVhbCAgICAgfk10cEN1cnNvcigpOworCisgICAgaW50ICAgICAgICAgZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworcHJpdmF0ZToKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0cyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHBhcmVudCwgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworCisgICAgYm9vbCAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCBzdGFydFBvcyk7CisgICAgYm9vbCAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdyk7CisgICAgYm9vbCAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpOworCisgICAgYm9vbCAgICAgICAgcHJlcGFyZVJvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdyk7CisgICAgYm9vbCAgICAgICAgcHV0TG9uZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pOworICAgIGJvb2wgICAgICAgIHB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IG9iamVjdElELCBpbnQgcm93LCBpbnQgY29sdW1uKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0NVUlNPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNDI1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGF0YVBhY2tldDo6TXRwRGF0YVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpLAorICAgICAgICBtT2Zmc2V0KE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCit7Cit9CisKK010cERhdGFQYWNrZXQ6On5NdHBEYXRhUGFja2V0KCkgeworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnJlc2V0KCkgeworICAgIE10cFBhY2tldDo6cmVzZXQoKTsKKyAgICBtT2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQsIGNvZGUpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQxNl90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQxNigpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50MTZfdCByZXN1bHQgPSAodWludDE2X3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpOworICAgIG1PZmZzZXQgKz0gMjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MzIoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KTsKKyAgICBtT2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDY0KCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQ2NF90IHJlc3VsdCA9ICh1aW50NjRfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA0XSA8PCAzMikgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNV0gPDwgNDApIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDZdIDw8IDQ4KSAgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgN10gPDwgNTYpOworICAgIG1PZmZzZXQgKz0gODsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OmdldFVJbnQxMjgodWludDEyOF90JiB2YWx1ZSkgeworICAgIHZhbHVlWzBdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbMV0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVsyXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzNdID0gZ2V0VUludDMyKCk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6Z2V0U3RyaW5nKE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKQoreworICAgIHN0cmluZy5yZWFkRnJvbVBhY2tldCh0aGlzKTsKK30KKworSW50OExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQ4KCkgeworICAgIEludDhMaXN0KiByZXN1bHQgPSBuZXcgSW50OExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50OCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50OExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50OCgpIHsKKyAgICBVSW50OExpc3QqIHJlc3VsdCA9IG5ldyBVSW50OExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDgoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50MTZMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50MTYoKSB7CisgICAgSW50MTZMaXN0KiByZXN1bHQgPSBuZXcgSW50MTZMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDE2KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQxNkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50MTYoKSB7CisgICAgVUludDE2TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQxNkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDE2KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDMyTGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDMyKCkgeworICAgIEludDMyTGlzdCogcmVzdWx0ID0gbmV3IEludDMyTGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQzMigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50MzJMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDMyKCkgeworICAgIFVJbnQzMkxpc3QqIHJlc3VsdCA9IG5ldyBVSW50MzJMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQzMigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQ2NExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQ2NCgpIHsKKyAgICBJbnQ2NExpc3QqIHJlc3VsdCA9IG5ldyBJbnQ2NExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50NjQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDY0TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQ2NCgpIHsKKyAgICBVSW50NjRMaXN0KiByZXN1bHQgPSBuZXcgVUludDY0TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50NjQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQ4KGludDhfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAxKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCl2YWx1ZTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDgodWludDhfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAxKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCl2YWx1ZTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MTYoaW50MTZfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAyKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxNih1aW50MTZfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAyKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDMyKGludDMyX3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgNCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDMyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDQpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDY0KGludDY0X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgOCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50NjQodWludDY0X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgOCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxMjgoY29uc3QgaW50MTI4X3QmIHZhbHVlKSB7CisgICAgcHV0SW50MzIodmFsdWVbMF0pOworICAgIHB1dEludDMyKHZhbHVlWzFdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVsyXSk7CisgICAgcHV0SW50MzIodmFsdWVbM10pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxMjgoY29uc3QgdWludDEyOF90JiB2YWx1ZSkgeworICAgIHB1dFVJbnQzMih2YWx1ZVswXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzFdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbMl0pOworICAgIHB1dFVJbnQzMih2YWx1ZVszXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDgoY29uc3QgaW50OF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQ4KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQ4KGNvbnN0IHVpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQ4KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDE2KGNvbnN0IGludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDE2KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQxNihjb25zdCB1aW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDMyKGNvbnN0IGludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDMyKCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQzMihjb25zdCB1aW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDMyKCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQzMihjb25zdCBVSW50MzJMaXN0KiBsaXN0KSB7CisgICAgaWYgKCFsaXN0KSB7CisgICAgICAgIHB1dEVtcHR5QXJyYXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGxpc3QtPnNpemUoKTsKKyAgICAgICAgcHV0VUludDMyKHNpemUpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHB1dFVJbnQzMigoKmxpc3QpW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDY0KGNvbnN0IGludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDY0KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQ2NChjb25zdCB1aW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDY0KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKQoreworICAgIHN0cmluZy53cml0ZVRvUGFja2V0KHRoaXMpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCBjaGFyKiBzKQoreworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmcocyk7CisgICAgc3RyaW5nLndyaXRlVG9QYWNrZXQodGhpcyk7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFIAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CitwcmludGYoIk10cERhdGFQYWNrZXQ6OnJlYWQgMSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBpZiAocmV0ICE9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvLyB0aGVuIHRoZSBmb2xsb3dpbmcgZGF0YQorICAgIGludCB0b3RhbCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgaW50IHJlbWFpbmluZyA9IHRvdGFsIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKK3ByaW50ZigidG90YWw6ICVkLCByZW1haW5pbmc6ICVkXG4iLCB0b3RhbCwgcmVtYWluaW5nKTsKKyAgICByZXQgPSA6OnJlYWQoZmQsICZtQnVmZmVyWzBdICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwgcmVtYWluaW5nKTsKK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZCAyIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIGlmIChyZXQgIT0gcmVtYWluaW5nKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtUGFja2V0U2l6ZSA9IHRvdGFsOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIHJldHVybiB0b3RhbDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPiAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworCisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoaW50IGZkLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIGxlbmd0aCk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZiAvLyBNVFBfREVWSUNFCisKKyNpZmRlZiBNVFBfSE9TVAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgbGVuZ3RoID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAobGVuZ3RoID4gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICAvLyBsb29rIGF0IHRoZSBsZW5ndGggZmllbGQgdG8gc2VlIGlmIHRoZSBkYXRhIHNwYW5zIG11bHRpcGxlIHBhY2tldHMKKyAgICAgICAgdWludDMyX3QgdG90YWxMZW5ndGggPSBNdHBQYWNrZXQ6OmdldFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQpOworICAgICAgICB3aGlsZSAodG90YWxMZW5ndGggPiBsZW5ndGgpIHsKKyAgICAgICAgICAgIGFsbG9jYXRlKGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50KTsKKyAgICAgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIGxlbmd0aCwgbUFsbG9jYXRpb25JbmNyZW1lbnQpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSByZXQ7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxlbmd0aCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IGxlbmd0aDsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisKKyAgICAvLyBzZW5kIGhlYWRlciBzZXBhcmF0ZWx5IGZyb20gZGF0YQorICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCisjZW5kaWYgLy8gTVRQX0hPU1QKKwordm9pZCogTXRwRGF0YVBhY2tldDo6Z2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3QgeworICAgIGludCBsZW5ndGggPSBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKGxlbmd0aCk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2ZWY2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0RBVEFfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKK3ByaXZhdGU6CisgICAgLy8gY3VycmVudCBvZmZzZXQgZm9yIGdldC9wdXQgbWV0aG9kcworICAgIGludCAgICAgICAgICAgICAgICAgbU9mZnNldDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cERhdGFQYWNrZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVzZXQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKTsKKworICAgIGlubGluZSB1aW50OF90ICAgICAgZ2V0VUludDgoKSB7IHJldHVybiAodWludDhfdCltQnVmZmVyW21PZmZzZXQrK107IH0KKyAgICBpbmxpbmUgaW50OF90ICAgICAgIGdldEludDgoKSB7IHJldHVybiAoaW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQorICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0VUludDE2KCk7CisgICAgaW5saW5lIGludDE2X3QgICAgICBnZXRJbnQxNigpIHsgcmV0dXJuIChpbnQxNl90KWdldFVJbnQxNigpOyB9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoKTsKKyAgICBpbmxpbmUgaW50MzJfdCAgICAgIGdldEludDMyKCkgeyByZXR1cm4gKGludDMyX3QpZ2V0VUludDMyKCk7IH0KKyAgICB1aW50NjRfdCAgICAgICAgICAgIGdldFVJbnQ2NCgpOworICAgIGlubGluZSBpbnQ2NF90ICAgICAgZ2V0SW50NjQoKSB7IHJldHVybiAoaW50NjRfdClnZXRVSW50NjQoKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgZ2V0VUludDEyOCh1aW50MTI4X3QmIHZhbHVlKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGdldEludDEyOChpbnQxMjhfdCYgdmFsdWUpIHsgZ2V0VUludDEyOCgodWludDEyOF90Jil2YWx1ZSk7IH0KKyAgICB2b2lkICAgICAgICAgICAgICAgIGdldFN0cmluZyhNdHBTdHJpbmdCdWZmZXImIHN0cmluZyk7CisKKyAgICBJbnQ4TGlzdCogICAgICAgICAgIGdldEFJbnQ4KCk7CisgICAgVUludDhMaXN0KiAgICAgICAgICBnZXRBVUludDgoKTsKKyAgICBJbnQxNkxpc3QqICAgICAgICAgIGdldEFJbnQxNigpOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgZ2V0QVVJbnQxNigpOworICAgIEludDMyTGlzdCogICAgICAgICAgZ2V0QUludDMyKCk7CisgICAgVUludDMyTGlzdCogICAgICAgICBnZXRBVUludDMyKCk7CisgICAgSW50NjRMaXN0KiAgICAgICAgICBnZXRBSW50NjQoKTsKKyAgICBVSW50NjRMaXN0KiAgICAgICAgIGdldEFVSW50NjQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50OChpbnQ4X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDgodWludDhfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxNihpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxNih1aW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQzMihpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQzMih1aW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQ2NChpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQ2NCh1aW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxMjgoY29uc3QgaW50MTI4X3QmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxMjgoY29uc3QgdWludDEyOF90JiB2YWx1ZSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQ4KGNvbnN0IGludDhfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQ4KGNvbnN0IHVpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQxNihjb25zdCBpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDE2KGNvbnN0IHVpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50MzIoY29uc3QgaW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQzMihjb25zdCB1aW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQzMihjb25zdCBVSW50MzJMaXN0KiBsaXN0KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQ2NChjb25zdCBpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDY0KGNvbnN0IHVpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZyk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eVN0cmluZygpIHsgcHV0VUludDE2KDApOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eUFycmF5KCkgeyBwdXRVSW50MzIoMCk7IH0KKworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihpbnQgZmQpOworCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihpbnQgZmQsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIGJvb2wgICAgICAgICBoYXNEYXRhKCkgY29uc3QgeyByZXR1cm4gbVBhY2tldFNpemUgPiBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOyB9CisgICAgdm9pZCogICAgICAgICAgICAgICBnZXREYXRhKGludCYgb3V0TGVuZ3RoKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RBVEFfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhYmFzZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisjaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJTcWxpdGVTdGF0ZW1lbnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3FsaXRlMy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgRklMRV9JRF9DT0xVTU4gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJTEVfUEFUSF9DT0xVTU4gICAgICAgICAgICAgICAgMgorI2RlZmluZSBGSUxFX0ZPUk1BVF9DT0xVTU4gICAgICAgICAgICAgIDMKKyNkZWZpbmUgRklMRV9QQVJFTlRfQ09MVU1OICAgICAgICAgICAgICA0CisjZGVmaW5lIEZJTEVfU1RPUkFHRV9DT0xVTU4gICAgICAgICAgICAgNQorI2RlZmluZSBGSUxFX1NJWkVfQ09MVU1OICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgRklMRV9NT0RJRklFRF9DT0xVTU4gICAgICAgICAgICA3CisKKyNkZWZpbmUgQVVESU9fSURfQ09MVU1OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFVRElPX1RJVExFX0NPTFVNTiAgICAgICAgICAgICAgMgorI2RlZmluZSBBVURJT19BUlRJU1RfQ09MVU1OICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVVESU9fQUxCVU1fQ09MVU1OICAgICAgICAgICAgICA0CisjZGVmaW5lIEFVRElPX0FMQlVNX0FSVElTVF9DT0xVTU4gICAgICAgNQorI2RlZmluZSBBVURJT19HRU5SRV9DT0xVTU4gICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVVESU9fQ09NUE9TRVJfQ09MVU1OICAgICAgICAgICA3CisjZGVmaW5lIEFVRElPX1RSQUNLX05VTUJFUl9DT0xVTU4gICAgICAgOAorI2RlZmluZSBBVURJT19ZRUFSX0NPTFVNTiAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQVVESU9fRFVSQVRJT05fQ09MVU1OICAgICAgICAgICAxMAorI2RlZmluZSBBVURJT19VU0VfQ09VTlRfQ09MVU1OICAgICAgICAgIDExCisjZGVmaW5lIEFVRElPX1NBTVBMRV9SQVRFX0NPTFVNTiAgICAgICAgMTIKKyNkZWZpbmUgQVVESU9fTlVNX0NIQU5ORUxTX0NPTFVNTiAgICAgICAxMworI2RlZmluZSBBVURJT19BVURJT19XQVZFX0NPREVDX0NPTFVNTiAgIDE0CisjZGVmaW5lIEFVRElPX0FVRElPX0JJVF9SQVRFX0NPTFVNTiAgICAgMTUKKworI2RlZmluZSBGSUxFX1RBQkxFX0NSRUFURSAgICAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZmlsZXMgKCIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIl9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudCBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdG9yYWdlIElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImRhdGVfbW9kaWZpZWQgSU5URUdFUiIgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIik7IgorCisjZGVmaW5lIEFVRElPX1RBQkxFX0NSRUFURSAgICAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYXVkaW8gKCIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImlkIElOVEVHRVIgUFJJTUFSWSBLRVksIiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSBURVhULCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aXN0IFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImFsYnVtIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbGJ1bV9hcnRpc3QgVEVYVCwiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VucmUgVEVYVCwiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvc2VyIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja19udW1iZXIgSU5URUdFUiwiICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAieWVhciBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VfY291bnQgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlX3JhdGUgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm51bV9jaGFubmVscyBJTlRFR0VSLCIgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb193YXZlX2NvZGVjIFRFWFQsIiAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fYml0X3JhdGUgSU5URUdFUiIgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIik7IgorCisjZGVmaW5lIFBBVEhfSU5ERVhfQ1JFQVRFICJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBwYXRoX2luZGV4IG9uIGZpbGVzKHBhdGgpOyIKKworI2RlZmluZSBGSUxFX0lEX1FVRVJZICAgIlNFTEVDVCBfaWQsZm9ybWF0IEZST00gZmlsZXMgV0hFUkUgcGF0aCA9ID87IgorI2RlZmluZSBGSUxFX1BBVEhfUVVFUlkgIlNFTEVDVCBwYXRoLHNpemUgRlJPTSBmaWxlcyBXSEVSRSBfaWQgPSA/IgorCisjZGVmaW5lIEdFVF9PQkpFQ1RfSU5GT19RVUVSWSAgICJTRUxFQ1Qgc3RvcmFnZSxmb3JtYXQscGFyZW50LHBhdGgsc2l6ZSxkYXRlX21vZGlmaWVkIEZST00gZmlsZXMgV0hFUkUgX2lkID0gPzsiCisjZGVmaW5lIEZJTEVfSU5TRVJUICAgICAiSU5TRVJUIElOVE8gZmlsZXMgVkFMVUVTKD8sPyw/LD8sPyw/LD8pOyIKKyNkZWZpbmUgRklMRV9ERUxFVEUgICAgICJERUxFVEUgRlJPTSBmaWxlcyBXSEVSRSBfaWQgPSA/OyIKKworI2RlZmluZSBBVURJT19JTlNFUlQgICAgIklOU0VSVCBJTlRPIGF1ZGlvIFZBTFVFUyg/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPyk7IgorI2RlZmluZSBBVURJT19ERUxFVEUgICAgIkRFTEVURSBGUk9NIGF1ZGlvIFdIRVJFIGlkID0gPzsiCisKK3N0cnVjdCBQcm9wZXJ0eVRhYmxlRW50cnkgeworICAgIE10cE9iamVjdFByb3BlcnR5ICAgcHJvcGVydHk7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgY29sdW1uTmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwgICAgIE1UUF9UWVBFX1VJTlQzMiwgICAgInBhcmVudCIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lELCAgICAgICAgTVRQX1RZUEVfVUlOVDMyLCAgICAic3RvcmFnZSIgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsICAgICBNVFBfVFlQRV9VSU5UMzIsICAgICJmb3JtYXQiICAgICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiwgICAgICAgInBhdGgiICAgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgICAgICAgTVRQX1RZUEVfVUlOVDY0LCAgICAic2l6ZSIgICAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsICAgICBNVFBfVFlQRV9TVFIsICAgICAgICJkYXRlX21vZGlmaWVkIiB9LAorfTsKKworc3RhdGljIGJvb2wgZ2V0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUsIGNvbnN0IGNoYXIqJiBjb2x1bW5OYW1lKSB7CisgICAgaW50IGNvdW50ID0gc2l6ZW9mKGtQcm9wZXJ0eVRhYmxlKSAvIHNpemVvZihrUHJvcGVydHlUYWJsZVswXSk7CisgICAgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5KiBlbnRyeSA9IGtQcm9wZXJ0eVRhYmxlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKywgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPnByb3BlcnR5ID09IHByb3BlcnR5KSB7CisgICAgICAgICAgICB0eXBlID0gZW50cnktPnR5cGU7CisgICAgICAgICAgICBjb2x1bW5OYW1lID0gZW50cnktPmNvbHVtbk5hbWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworCitNdHBEYXRhYmFzZTo6TXRwRGF0YWJhc2UoKQorICAgIDogICBtRmlsZUlkUXVlcnkoTlVMTCksCisgICAgICAgIG1GaWxlUGF0aFF1ZXJ5KE5VTEwpLAorICAgICAgICBtT2JqZWN0SW5mb1F1ZXJ5KE5VTEwpLAorICAgICAgICBtRmlsZUluc2VydGVyKE5VTEwpLAorICAgICAgICBtRmlsZURlbGV0ZXIoTlVMTCksCisgICAgICAgIG1BdWRpb0luc2VydGVyKE5VTEwpLAorICAgICAgICBtQXVkaW9EZWxldGVyKE5VTEwpCit7Cit9CisKK010cERhdGFiYXNlOjp+TXRwRGF0YWJhc2UoKSB7Cit9CisKK2Jvb2wgTXRwRGF0YWJhc2U6Om9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpIHsKKyAgICBpZiAoIVNxbGl0ZURhdGFiYXNlOjpvcGVuKHBhdGgsIGNyZWF0ZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIGNyZWF0ZSB0YWJsZXMgYW5kIGluZGljZXMgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCFleGVjKEZJTEVfVEFCTEVfQ1JFQVRFKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZmlsZSB0YWJsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFleGVjKFBBVEhfSU5ERVhfQ1JFQVRFKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBwYXRoIGluZGV4IG9uIGZpbGUgdGFibGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXhlYyhBVURJT19UQUJMRV9DUkVBVEUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBmaWxlIHRhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbUZpbGVJZFF1ZXJ5KSB7CisgICAgICAgIG1GaWxlSWRRdWVyeSA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUZpbGVJZFF1ZXJ5LT5wcmVwYXJlKEZJTEVfSURfUVVFUlkpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEZJTEVfSURfUVVFUllcbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtRmlsZVBhdGhRdWVyeSkgeworICAgICAgICBtRmlsZVBhdGhRdWVyeSA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUZpbGVQYXRoUXVlcnktPnByZXBhcmUoRklMRV9QQVRIX1FVRVJZKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29tcGlsZSBGSUxFX1BBVEhfUVVFUllcbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtT2JqZWN0SW5mb1F1ZXJ5KSB7CisgICAgICAgIG1PYmplY3RJbmZvUXVlcnkgPSBuZXcgU3FsaXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICBpZiAoIW1PYmplY3RJbmZvUXVlcnktPnByZXBhcmUoR0VUX09CSkVDVF9JTkZPX1FVRVJZKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29tcGlsZSBHRVRfT0JKRUNUX0lORk9fUVVFUllcbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtRmlsZUluc2VydGVyKSB7CisgICAgICAgIG1GaWxlSW5zZXJ0ZXIgPSBuZXcgU3FsaXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICBpZiAoIW1GaWxlSW5zZXJ0ZXItPnByZXBhcmUoRklMRV9JTlNFUlQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEZJTEVfSU5TRVJUXG4iKTsKKyAgICAgICAgICAgIGV4aXQoLTEpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghbUZpbGVEZWxldGVyKSB7CisgICAgICAgIG1GaWxlRGVsZXRlciA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUZpbGVEZWxldGVyLT5wcmVwYXJlKEZJTEVfREVMRVRFKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29tcGlsZSBGSUxFX0RFTEVURVxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1BdWRpb0luc2VydGVyKSB7CisgICAgICAgIG1BdWRpb0luc2VydGVyID0gbmV3IFNxbGl0ZVN0YXRlbWVudCh0aGlzKTsKKyAgICAgICAgaWYgKCFtQXVkaW9JbnNlcnRlci0+cHJlcGFyZShBVURJT19JTlNFUlQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEFVRElPX0lOU0VSVFxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1BdWRpb0RlbGV0ZXIpIHsKKyAgICAgICAgbUF1ZGlvRGVsZXRlciA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUF1ZGlvRGVsZXRlci0+cHJlcGFyZShBVURJT19ERUxFVEUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEFVRElPX0RFTEVURVxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBNdHBEYXRhYmFzZTo6Z2V0VGFibGVGb3JGaWxlKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQUlGRjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dBVjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QMzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0ZMQUM6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU86CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9XTUE6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9PR0c6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BQUM6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BVURJQkxFOgorICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvOworICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQVZJOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfTVBFRzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FTRjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dNVjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QNF9DT05UQUlORVI6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9NUDI6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSOgorICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvOworICAgICAgICBjYXNlIE1UUF9GT1JNQVRfREVGSU5FRDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0VYSUZfSlBFRzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1RJRkZfRVA6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9GTEFTSFBJWDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0JNUDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0NJRkY6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9HSUY6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9KRklGOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQ0Q6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9QSUNUOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfUE5HOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfVElGRjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1RJRkZfSVQ6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9KUDI6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9KUFg6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZTsKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1Q6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dQTF9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX00zVV9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QTF9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FTWF9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1BMU19QTEFZTElTVDoKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0SGFuZGxlVGFibGVQbGF5bGlzdDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0SGFuZGxlVGFibGVGaWxlOworICAgIH0KK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERhdGFiYXNlOjpnZXRPYmplY3RIYW5kbGUoY29uc3QgY2hhciogcGF0aCkgeworICAgIG1GaWxlSWRRdWVyeS0+cmVzZXQoKTsKKyAgICBtRmlsZUlkUXVlcnktPmJpbmQoMSwgcGF0aCk7CisgICAgaWYgKG1GaWxlSWRRdWVyeS0+c3RlcCgpKSB7CisgICAgICAgIGludCByb3cgPSBtRmlsZUlkUXVlcnktPmdldENvbHVtbkludCgwKTsKKyAgICAgICAgaWYgKHJvdyA+IDApIHsKKyAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRmlsZUlkUXVlcnktPmdldENvbHVtbkludCgxKTsKKyAgICAgICAgICAgIHJvdyB8PSBnZXRUYWJsZUZvckZpbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiByb3c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERhdGFiYXNlOjphZGRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgeworICAgIG1GaWxlSW5zZXJ0ZXItPmJpbmQoRklMRV9QQVRIX0NPTFVNTiwgcGF0aCk7CisgICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX0ZPUk1BVF9DT0xVTU4sIGZvcm1hdCk7CisgICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX1BBUkVOVF9DT0xVTU4sIHBhcmVudCk7CisgICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX1NUT1JBR0VfQ09MVU1OLCBzdG9yYWdlKTsKKyAgICBtRmlsZUluc2VydGVyLT5iaW5kKEZJTEVfU0laRV9DT0xVTU4sIHNpemUpOworICAgIG1GaWxlSW5zZXJ0ZXItPmJpbmQoRklMRV9NT0RJRklFRF9DT0xVTU4sIG1vZGlmaWVkKTsKKyAgICBtRmlsZUluc2VydGVyLT5zdGVwKCk7CisgICAgbUZpbGVJbnNlcnRlci0+cmVzZXQoKTsKKyAgICBpbnQgcmVzdWx0ID0gbGFzdEluc2VydGVkUm93KCk7CisgICAgcmV0dXJuIChyZXN1bHQgPD0gMCA/IGtJbnZhbGlkT2JqZWN0SGFuZGxlIDogcmVzdWx0KTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERhdGFiYXNlOjphZGRBdWRpb0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0lEX0NPTFVNTiwgaGFuZGxlKTsKKyAgICBtQXVkaW9JbnNlcnRlci0+c3RlcCgpOworICAgIG1BdWRpb0luc2VydGVyLT5yZXNldCgpOworICAgIGludCByZXN1bHQgPSBsYXN0SW5zZXJ0ZWRSb3coKTsKKyAgICBoYW5kbGUgfD0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW87CisgICAgcmV0dXJuIChyZXN1bHQgPiAwID8gaGFuZGxlIDoga0ludmFsaWRPYmplY3RIYW5kbGUpOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGF0YWJhc2U6OmFkZEF1ZGlvRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcnRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhbGJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFsYnVtQXJ0aXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2VucmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHllYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24pIHsKKyAgICBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19JRF9DT0xVTU4sIGhhbmRsZSk7CisgICAgaWYgKHRpdGxlKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19USVRMRV9DT0xVTU4sIHRpdGxlKTsKKyAgICBpZiAoYXJ0aXN0KSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19BUlRJU1RfQ09MVU1OLCBhcnRpc3QpOworICAgIGlmIChhbGJ1bSkgbUF1ZGlvSW5zZXJ0ZXItPmJpbmQoQVVESU9fQUxCVU1fQ09MVU1OLCBhbGJ1bSk7CisgICAgaWYgKGFsYnVtQXJ0aXN0KSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19BTEJVTV9BUlRJU1RfQ09MVU1OLCBhbGJ1bUFydGlzdCk7CisgICAgaWYgKGdlbnJlKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19HRU5SRV9DT0xVTU4sIGdlbnJlKTsKKyAgICBpZiAoY29tcG9zZXIpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0NPTVBPU0VSX0NPTFVNTiwgY29tcG9zZXIpOworICAgIGlmICh0cmFjaykgbUF1ZGlvSW5zZXJ0ZXItPmJpbmQoQVVESU9fVFJBQ0tfTlVNQkVSX0NPTFVNTiwgdHJhY2spOworICAgIGlmICh5ZWFyKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19ZRUFSX0NPTFVNTiwgeWVhcik7CisgICAgaWYgKGR1cmF0aW9uKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19EVVJBVElPTl9DT0xVTU4sIGR1cmF0aW9uKTsKKyAgICBtQXVkaW9JbnNlcnRlci0+c3RlcCgpOworICAgIG1BdWRpb0luc2VydGVyLT5yZXNldCgpOworICAgIGludCByZXN1bHQgPSBsYXN0SW5zZXJ0ZWRSb3coKTsKKyAgICBpZiAocmVzdWx0IDw9IDApCisgICAgICAgIHJldHVybiBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICByZXN1bHQgfD0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW87CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXRwRGF0YWJhc2U6OmdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgYm9vbCAgICAgICAgICAgICAgICB3aGVyZVN0b3JhZ2UgPSAoc3RvcmFnZUlEICE9IDB4RkZGRkZGRkYpOworICAgIGJvb2wgICAgICAgICAgICAgICAgd2hlcmVGb3JtYXQgPSAoZm9ybWF0ICE9IDApOworICAgIGJvb2wgICAgICAgICAgICAgICAgd2hlcmVQYXJlbnQgPSAocGFyZW50ICE9IDApOworICAgIGNoYXIgICAgICAgICAgICAgICAgaW50QnVmZmVyWzIwXTsKKworICAgIE10cFN0cmluZyAgcXVlcnkoIlNFTEVDVCBfaWQsZm9ybWF0IEZST00gZmlsZXMiKTsKKyAgICBpZiAod2hlcmVTdG9yYWdlIHx8IHdoZXJlRm9ybWF0IHx8IHdoZXJlUGFyZW50KQorICAgICAgICBxdWVyeSArPSAiIFdIRVJFIjsKKyAgICBpZiAod2hlcmVTdG9yYWdlKSB7CisgICAgICAgIHNucHJpbnRmKGludEJ1ZmZlciwgc2l6ZW9mKGludEJ1ZmZlciksICIlZCIsIHN0b3JhZ2VJRCk7CisgICAgICAgIHF1ZXJ5ICs9ICIgc3RvcmFnZSA9ICI7CisgICAgICAgIHF1ZXJ5ICs9IGludEJ1ZmZlcjsKKyAgICB9CisgICAgaWYgKHdoZXJlRm9ybWF0KSB7CisgICAgICAgIHNucHJpbnRmKGludEJ1ZmZlciwgc2l6ZW9mKGludEJ1ZmZlciksICIlZCIsIGZvcm1hdCk7CisgICAgICAgIGlmICh3aGVyZVN0b3JhZ2UpCisgICAgICAgICAgICBxdWVyeSArPSAiIEFORCI7CisgICAgICAgIHF1ZXJ5ICs9ICIgZm9ybWF0ID0gIjsKKyAgICAgICAgcXVlcnkgKz0gaW50QnVmZmVyOworICAgIH0KKyAgICBpZiAod2hlcmVQYXJlbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBNVFBfUEFSRU5UX1JPT1QpCisgICAgICAgICAgICBwYXJlbnQgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKKyAgICAgICAgc25wcmludGYoaW50QnVmZmVyLCBzaXplb2YoaW50QnVmZmVyKSwgIiVkIiwgcGFyZW50KTsKKyAgICAgICAgaWYgKHdoZXJlU3RvcmFnZSB8fCB3aGVyZUZvcm1hdCkKKyAgICAgICAgICAgIHF1ZXJ5ICs9ICIgQU5EIjsKKyAgICAgICAgcXVlcnkgKz0gIiBwYXJlbnQgPSAiOworICAgICAgICBxdWVyeSArPSBpbnRCdWZmZXI7CisgICAgfQorICAgIHF1ZXJ5ICs9ICI7IjsKKworICAgIFNxbGl0ZVN0YXRlbWVudCBzdG10KHRoaXMpOworICAgIHByaW50ZigiJXNcbiIsIChjb25zdCBjaGFyICopcXVlcnkpOworICAgIHN0bXQucHJlcGFyZShxdWVyeSk7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEhhbmRsZUxpc3QoKTsKKyAgICB3aGlsZSAoIXN0bXQuaXNEb25lKCkpIHsKKyAgICAgICAgaWYgKHN0bXQuc3RlcCgpKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBzdG10LmdldENvbHVtbkludCgwKTsKKyAgICAgICAgICAgIHByaW50Zigic3RtdC5nZXRDb2x1bW5JbnQgcmV0dXJuZWQgJWRcbiIsIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gc3RtdC5nZXRDb2x1bW5JbnQoMSk7CisgICAgICAgICAgICAgICAgaW5kZXggfD0gZ2V0VGFibGVGb3JGaWxlKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgbGlzdC0+cHVzaChpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJsaXN0IHNpemU6ICVkXG4iLCBsaXN0LT5zaXplKCkpOworICAgIHJldHVybiBsaXN0OworfQorCisKK010cFJlc3BvbnNlQ29kZSBNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHkoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBjb25zdCBjaGFyKiBjb2x1bW5OYW1lOworICAgIGNoYXIgICAgICAgIGludEJ1ZmZlclsyMF07CisKKyAgICBpZiAoaGFuZGxlICE9IE1UUF9QQVJFTlRfUk9PVCkKKyAgICAgICAgaGFuZGxlICY9IGtPYmplY3RIYW5kbGVJbmRleE1hc2s7CisKKyAgICBpZiAoIWdldFByb3BlcnR5SW5mbyhwcm9wZXJ0eSwgdHlwZSwgY29sdW1uTmFtZSkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9DT0RFOworICAgIHNucHJpbnRmKGludEJ1ZmZlciwgc2l6ZW9mKGludEJ1ZmZlciksICIlZCIsIGhhbmRsZSk7CisKKyAgICBNdHBTdHJpbmcgIHF1ZXJ5KCJTRUxFQ1QgIik7CisgICAgcXVlcnkgKz0gY29sdW1uTmFtZTsKKyAgICBxdWVyeSArPSAiIEZST00gZmlsZXMgV0hFUkUgX2lkID0gIjsKKyAgICBxdWVyeSArPSBpbnRCdWZmZXI7CisgICAgcXVlcnkgKz0gIjsiOworCisgICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7CisgICAgcHJpbnRmKCIlc1xuIiwgKGNvbnN0IGNoYXIgKilxdWVyeSk7CisgICAgc3RtdC5wcmVwYXJlKHF1ZXJ5KTsKKworICAgIGlmICghc3RtdC5zdGVwKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYoc3RtdC5nZXRDb2x1bW5JbnQoMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIoc3RtdC5nZXRDb2x1bW5JbnQoMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMihzdG10LmdldENvbHVtbkludCgwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChzdG10LmdldENvbHVtbkludDY0KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQoc3RtdC5nZXRDb2x1bW5JbnQ2NCgwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHN0bXQuZ2V0Q29sdW1uU3RyaW5nKDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBvYmplY3QgdHlwZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cERhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgY2hhciAgICBkYXRlWzIwXTsKKworICAgIGlmIChoYW5kbGUgIT0gTVRQX1BBUkVOVF9ST09UKQorICAgICAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKKworICAgIG1PYmplY3RJbmZvUXVlcnktPnJlc2V0KCk7CisgICAgbU9iamVjdEluZm9RdWVyeS0+YmluZCgxLCBoYW5kbGUpOworICAgIGlmICghbU9iamVjdEluZm9RdWVyeS0+c3RlcCgpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtT2JqZWN0SW5mb1F1ZXJ5LT5nZXRDb2x1bW5JbnQoMCk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1PYmplY3RJbmZvUXVlcnktPmdldENvbHVtbkludCgxKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50KDIpOworICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGguICBkbyB3ZSB3YW50IGEgc2VwYXJhdGUgZGF0YWJhc2UgZW50cnkgZm9yIHRoaXM/CisgICAgY29uc3QgY2hhciogbmFtZSA9IG1PYmplY3RJbmZvUXVlcnktPmdldENvbHVtblN0cmluZygzKTsKKyAgICBjb25zdCBjaGFyKiBsYXN0U2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJyk7CisgICAgaWYgKGxhc3RTbGFzaCkKKyAgICAgICAgbmFtZSA9IGxhc3RTbGFzaCArIDE7CisgICAgaW50NjRfdCBzaXplID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50NjQoNCk7CisgICAgdGltZV90IG1vZGlmaWVkID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50KDUpOworICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQpOworCisgICAgcHJpbnRmKCJzdG9yYWdlSUQ6ICVkLCBmb3JtYXQ6ICVkLCBwYXJlbnQ6ICVkXG4iLCBzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKworICAgIHBhY2tldC5wdXRVSW50MzIoc3RvcmFnZUlEKTsKKyAgICBwYWNrZXQucHV0VUludDE2KGZvcm1hdCk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyBwcm90ZWN0aW9uIHN0YXR1cworICAgIHBhY2tldC5wdXRVSW50MzIoKHNpemUgPiAweEZGRkZGRkZGTEwgPyAweEZGRkZGRkZGIDogc2l6ZSkpOworICAgIHBhY2tldC5wdXRVSW50MTYoMCk7ICAgLy8gdGh1bWIgZm9ybWF0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBwYWNrZXQucHV0VUludDMyKHBhcmVudCk7CisgICAgcGFja2V0LnB1dFVJbnQxNihhc3NvY2lhdGlvblR5cGUpOworICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gYXNzb2NpYXRpb24gZGVzYworICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gc2VxdWVuY2UgbnVtYmVyCisgICAgcGFja2V0LnB1dFN0cmluZyhuYW1lKTsgICAvLyBmaWxlIG5hbWUKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsKKyAgICBmb3JtYXREYXRlVGltZShtb2RpZmllZCwgZGF0ZSwgc2l6ZW9mKGRhdGUpKTsKKyAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOyAgIC8vIGRhdGUgbW9kaWZpZWQKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBrZXl3b3JkcworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworYm9vbCBNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgaWYgKGhhbmRsZSAhPSBNVFBfUEFSRU5UX1JPT1QpCisgICAgICAgIGhhbmRsZSAmPSBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrOworICAgIG1GaWxlUGF0aFF1ZXJ5LT5yZXNldCgpOworICAgIG1GaWxlUGF0aFF1ZXJ5LT5iaW5kKDEsIGhhbmRsZSk7CisgICAgaWYgKCFtRmlsZVBhdGhRdWVyeS0+c3RlcCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gbUZpbGVQYXRoUXVlcnktPmdldENvbHVtblN0cmluZygwKTsKKyAgICBpZiAoIXBhdGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmaWxlUGF0aCA9IHBhdGg7CisgICAgZmlsZUxlbmd0aCA9IG1GaWxlUGF0aFF1ZXJ5LT5nZXRDb2x1bW5JbnQ2NCgxKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBEYXRhYmFzZTo6ZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgdWludDMyX3QgdGFibGUgPSBoYW5kbGUgJiBrT2JqZWN0SGFuZGxlVGFibGVNYXNrOworICAgIGhhbmRsZSAmPSBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrOworICAgIG1GaWxlRGVsZXRlci0+YmluZCgxLCBoYW5kbGUpOworICAgIG1GaWxlRGVsZXRlci0+c3RlcCgpOworICAgIG1GaWxlRGVsZXRlci0+cmVzZXQoKTsKKyAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pIHsKKyAgICAgICAgbUF1ZGlvRGVsZXRlci0+YmluZCgxLCBoYW5kbGUpOworICAgICAgICBtQXVkaW9EZWxldGVyLT5zdGVwKCk7CisgICAgICAgIG1BdWRpb0RlbGV0ZXItPnJlc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cE9iamVjdEhhbmRsZSogTXRwRGF0YWJhc2U6OmdldEZpbGVMaXN0KGludCYgb3V0Q291bnQpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUqIHJlc3VsdCA9IE5VTEw7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBTcWxpdGVTdGF0ZW1lbnQgc3RtdCh0aGlzKTsKKyAgICBzdG10LnByZXBhcmUoIlNFTEVDVCBjb3VudCgqKSBGUk9NIGZpbGVzOyIpOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgaWYgKHN0bXQuc3RlcCgpKQorICAgICAgICBjb3VudCA9IHN0bXQuZ2V0Q29sdW1uSW50KDApOworCisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICByZXN1bHQgPSBuZXcgTXRwT2JqZWN0SGFuZGxlW2NvdW50XTsKKyAgICAgICAgbWVtc2V0KHJlc3VsdCwgMCwgY291bnQgKiBzaXplb2YoKnJlc3VsdCkpOworICAgICAgICBTcWxpdGVTdGF0ZW1lbnQgc3RtdDIodGhpcyk7CisgICAgICAgIHN0bXQyLnByZXBhcmUoIlNFTEVDVCBfaWQsZm9ybWF0IEZST00gZmlsZXM7Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXN0bXQyLnN0ZXAoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0RmlsZUxpc3QgZW5kZWQgZWFybHlcbiIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBzdG10Mi5nZXRDb2x1bW5JbnQoMCk7CisgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gc3RtdDIuZ2V0Q29sdW1uSW50KDEpOworICAgICAgICAgICAgaGFuZGxlIHw9IGdldFRhYmxlRm9yRmlsZShmb3JtYXQpOworICAgICAgICAgICAgcmVzdWx0W2ldID0gaGFuZGxlOworICAgICAgICB9CisgICAgfQorICAgIG91dENvdW50ID0gY291bnQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAgICBmb3IgZ2V0T2JqZWN0UHJvcERlc2MKKworICAgIHBhY2tldC5wdXRVSW50MTYocHJvcGVydHkpOworICAgIHBhY2tldC5wdXRVSW50MTYoZGF0YVR5cGUpOworICAgIHBhY2tldC5wdXRVSW50OChnZXRTZXQpOworICAgIC8vIGRlZmF1bHQgdmFsdWUgRFRTCisgICAgcGFja2V0LnB1dFVJbnQzMihncm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChmb3JtRmxhZyk7CisgICAgLy8gZm9ybSwgdmFyaWFibGUKKyovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDVmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RBVEFCQVNFX0gKKyNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorI2luY2x1ZGUgIlNxbGl0ZURhdGFiYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKK2NsYXNzIFNxbGl0ZVN0YXRlbWVudDsKKworY2xhc3MgTXRwRGF0YWJhc2UgOiBwdWJsaWMgU3FsaXRlRGF0YWJhc2UgeworcHJpdmF0ZToKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtRmlsZUlkUXVlcnk7CisgICAgU3FsaXRlU3RhdGVtZW50KiAgICAgICAgbUZpbGVQYXRoUXVlcnk7CisgICAgU3FsaXRlU3RhdGVtZW50KiAgICAgICAgbU9iamVjdEluZm9RdWVyeTsKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtRmlsZUluc2VydGVyOworICAgIFNxbGl0ZVN0YXRlbWVudCogICAgICAgIG1GaWxlRGVsZXRlcjsKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtQXVkaW9JbnNlcnRlcjsKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtQXVkaW9EZWxldGVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YWJhc2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGF0YWJhc2UoKTsKKworICAgIHN0YXRpYyB1aW50MzJfdCAgICAgICAgIGdldFRhYmxlRm9yRmlsZShNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldE9iamVjdEhhbmRsZShjb25zdCBjaGFyKiBwYXRoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBhZGRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCk7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBhZGRBdWRpb0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGlkKTsKKworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGFkZEF1ZGlvRmlsZShNdHBPYmplY3RIYW5kbGUgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFydGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFsYnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWxidW1BcnRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnZW5yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbik7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIC8vIGhlbHBlciBmb3IgbWVkaWEgc2Nhbm5lcgorICAgIE10cE9iamVjdEhhbmRsZSogICAgICAgIGdldEZpbGVMaXN0KGludCYgb3V0Q291bnQpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQUJBU0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmNwcCBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlZDZlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcGVyYXRpb25Db2RlRW50cnkgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgTXRwT3BlcmF0aW9uQ29kZSBjb2RlOworfTsKKworc3RhdGljIGNvbnN0IE9wZXJhdGlvbkNvZGVFbnRyeSBzT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyIsICAgICAgICAgICAgICAweDEwMDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiIsICAgICAgICAgICAgICAgICAweDEwMDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04iLCAgICAgICAgICAgICAgICAweDEwMDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyIsICAgICAgICAgICAgICAweDEwMDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8iLCAgICAgICAgICAgICAweDEwMDUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyIsICAgICAgICAgICAgICAweDEwMDYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyIsICAgICAgICAgICAweDEwMDcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTyIsICAgICAgICAgICAgICAweDEwMDggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAweDEwMDkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiIsICAgICAgICAgICAgICAgICAgICAweDEwMEEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAweDEwMEIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8iLCAgICAgICAgICAgICAweDEwMEMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMEQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUiLCAgICAgICAgICAgICAweDEwMEUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSIsICAgICAgICAgICAgICAgICAweDEwMEYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSIsICAgICAgICAgICAgICAgICAweDEwMTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCIsICAgICAgICAgICAgICAgICAgICAweDEwMTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiIsICAgICAgICAweDEwMTIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04iLCAgICAgICAgICAgICAgICAgICAweDEwMTMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDIiwgICAgICAgICAweDEwMTQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAweDEwMTcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUiLCAgICAgICAweDEwMTggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMTkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMUEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCIsICAgICAgICAgICAweDEwMUIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSIsICAgICAgICAweDEwMUMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEIiwgICAweDk4MDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDIiwgICAgICAgICAweDk4MDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NLSVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIGNvbnN0IE9wZXJhdGlvbkNvZGVFbnRyeSogZW50cnkgPSBzT3BlcmF0aW9uQ29kZXM7CisgICAgd2hpbGUgKGVudHJ5LT5uYW1lKSB7CisgICAgICAgIGlmIChlbnRyeS0+Y29kZSA9PSBjb2RlKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5uYW1lOworICAgICAgICBlbnRyeSsrOworICAgIH0KKyAgICByZXR1cm4gIioqKiBVTktOT1dOIE9QRVJBVElPTiAqKioiOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvbWVkaWEvbXRwL010cERlYnVnLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIG1lZGlhL210cC9NdHBEZWJ1Zy5oCmluZGV4IDU2N2Q1N2ZhLi4zY2JjMjA5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwyNCArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisjaWZuZGVmIF9NVFBfREVCVUdfSAorI2RlZmluZSBfTVRQX0RFQlVHX0gKIAotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKIAorbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7Ci0gICAgfQorY2xhc3MgTXRwRGVidWcgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworfTsKIAotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotCi0KLQorI2VuZGlmIC8vIF9NVFBfREVCVUdfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE4YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlOjpNdHBEZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSwgaW50IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luLCBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKKyAgICAgICAgbUVuZHBvaW50SW4oZXBfaW4pLAorICAgICAgICBtRW5kcG9pbnRPdXQoZXBfb3V0KSwKKyAgICAgICAgbUVuZHBvaW50SW50cihlcF9pbnRyKSwKKyAgICAgICAgbURldmljZUluZm8oTlVMTCksCisgICAgICAgIG1JRCh1c2JfZGV2aWNlX2dldF91bmlxdWVfaWQoZGV2aWNlKSksCisgICAgICAgIG1TZXNzaW9uSUQoMCksCisgICAgICAgIG1UcmFuc2FjdGlvbklEKDApCit7Cit9CisKK010cERldmljZTo6fk10cERldmljZSgpIHsKKyAgICBjbG9zZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllc1tpXTsKK30KKwordm9pZCBNdHBEZXZpY2U6OmluaXRpYWxpemUoKSB7CisgICAgb3BlblNlc3Npb24oKTsKKyAgICBtRGV2aWNlSW5mbyA9IGdldERldmljZUluZm8oKTsKKyAgICBpZiAobURldmljZUluZm8pIHsKKyAgICAgICAgbURldmljZUluZm8tPnByaW50KCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcykgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzLT5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wQ29kZSA9ICgqbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXREZXZpY2VQcm9wRGVzYyhwcm9wQ29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LT5wcmludCgpOworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjpjbG9zZSgpIHsKKyAgICBpZiAobURldmljZSkgeworICAgICAgICB1c2JfZGV2aWNlX3JlbGVhc2VfaW50ZXJmYWNlKG1EZXZpY2UsIG1JbnRlcmZhY2UpOworICAgICAgICB1c2JfZGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgICAgICBtRGV2aWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIE10cERldmljZTo6Z2V0RGV2aWNlTmFtZSgpIHsKKyAgICBpZiAobURldmljZSkKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X25hbWUobURldmljZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIj8/PyI7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpvcGVuU2Vzc2lvbigpIHsKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDA7CisgICAgTXRwU2Vzc2lvbklEIG5ld1Nlc3Npb24gPSAxOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG5ld1Nlc3Npb24pOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOKQorICAgICAgICBuZXdTZXNzaW9uID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICBlbHNlIGlmIChyZXQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtU2Vzc2lvbklEID0gbmV3U2Vzc2lvbjsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpjbG9zZVNlc3Npb24oKSB7CisgICAgLy8gRklYTUUKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTXRwRGV2aWNlSW5mbyogTXRwRGV2aWNlOjpnZXREZXZpY2VJbmZvKCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cERldmljZUluZm8qIGluZm8gPSBuZXcgTXRwRGV2aWNlSW5mbzsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUlETGlzdCogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSURzKCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSW5mbyogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKSB7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFN0b3JhZ2VJbmZvKiBpbmZvID0gbmV3IE10cFN0b3JhZ2VJbmZvKHN0b3JhZ2VJRCk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDIsIGZvcm1hdCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDMsIHBhcmVudCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RJbmZvKiBNdHBEZXZpY2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIC8vIEZJWE1FIC0gd2UgbWlnaHQgd2FudCB0byBhZGQgc29tZSBjYWNoaW5nIGhlcmUKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBuZXcgTXRwT2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKiBNdHBEZXZpY2U6OmdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQmIG91dExlbmd0aCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CKSAmJiByZWFkRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YS5nZXREYXRhKG91dExlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0TGVuZ3RoID0gMDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBNdHBEZXZpY2U6OmRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVBhcmVudDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVN0b3JhZ2VJRDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwUHJvcGVydHkqIE10cERldmljZTo6Z2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGNvZGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG5ldyBNdHBQcm9wZXJ0eTsKKyAgICAgICAgcHJvcGVydHktPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbikgeworICAgIExPR0QoInNlbmRSZXF1ZXN0OiAlc1xuIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgIG1SZXF1ZXN0LnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBpZiAobVRyYW5zYWN0aW9uSUQgPiAwKQorICAgICAgICBtUmVxdWVzdC5zZXRUcmFuc2FjdGlvbklEKG1UcmFuc2FjdGlvbklEKyspOworICAgIGludCByZXQgPSBtUmVxdWVzdC53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1SZXF1ZXN0LmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6c2VuZERhdGEoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pIHsKKyAgICBMT0dEKCJzZW5kRGF0YVxuIik7CisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBpbnQgcmV0ID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0KTsKKyAgICBtRGF0YS5kdW1wKCk7CisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnJlYWREYXRhKCkgeworICAgIG1EYXRhLnJlc2V0KCk7CisgICAgaW50IHJldCA9IG1EYXRhLnJlYWQobUVuZHBvaW50SW4pOworICAgIExPR0QoInJlYWREYXRhIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRCgicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBEZXZpY2U6OnJlYWRSZXNwb25zZSgpIHsKKyAgICBMT0dEKCJyZWFkUmVzcG9uc2VcbiIpOworICAgIGludCByZXQgPSBtUmVzcG9uc2UucmVhZChtRW5kcG9pbnRJbik7CisgICAgaWYgKHJldCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIG1SZXNwb25zZS5kdW1wKCk7CisgICAgICAgIHJldHVybiBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dEKCJyZWFkUmVzcG9uc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuaCBiL21lZGlhL210cC9NdHBEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA1MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0gKKyNkZWZpbmUgX01UUF9ERVZJQ0VfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGV2aWNlSW5mbzsKK2NsYXNzIE10cE9iamVjdEluZm87CitjbGFzcyBNdHBTdG9yYWdlSW5mbzsKKworY2xhc3MgTXRwRGV2aWNlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IHVzYl9kZXZpY2UqICAgICAgbURldmljZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEluOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludE91dDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbnRyOworICAgIE10cERldmljZUluZm8qICAgICAgICAgIG1EZXZpY2VJbmZvOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzOworCisgICAgLy8gYSB1bmlxdWUgSUQgZm9yIHRoZSBkZXZpY2UKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSUQ7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgICAgICBtVHJhbnNhY3Rpb25JRDsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgICAgIG1SZXF1ZXN0OworICAgIE10cERhdGFQYWNrZXQgICAgICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgICAgIG1SZXNwb25zZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZShzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlLCBpbnQgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4sIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2UoKTsKKworICAgIGlubGluZSBpbnQgICAgICAgICAgICAgIGdldElEKCkgY29uc3QgeyByZXR1cm4gbUlEOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBvcGVuU2Vzc2lvbigpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGNsb3NlU2Vzc2lvbigpOworCisgICAgTXRwRGV2aWNlSW5mbyogICAgICAgICAgZ2V0RGV2aWNlSW5mbygpOworICAgIE10cFN0b3JhZ2VJRExpc3QqICAgICAgIGdldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBTdG9yYWdlSW5mbyogICAgICAgICBnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RIYW5kbGVzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIE10cE9iamVjdEluZm8qICAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kRGF0YShNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbik7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgcmVhZERhdGEoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZWFkUmVzcG9uc2UoKTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjI1ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZUluZm8iCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZUluZm86Ok10cERldmljZUluZm8oKQorICAgIDogICBtU3RhbmRhcmRWZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQoMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYyhOVUxMKSwKKyAgICAgICAgbUZ1bmN0aW9uYWxDb2RlKDApLAorICAgICAgICBtT3BlcmF0aW9ucyhOVUxMKSwKKyAgICAgICAgbUV2ZW50cyhOVUxMKSwKKyAgICAgICAgbURldmljZVByb3BlcnRpZXMoTlVMTCksCisgICAgICAgIG1DYXB0dXJlRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbVBsYXliYWNrRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbU1hbnVmYWN0dXJlcihOVUxMKSwKKyAgICAgICAgbU1vZGVsKE5VTEwpLAorICAgICAgICBtVmVyc2lvbihOVUxMKSwKKyAgICAgICAgbVNlcmlhbChOVUxMKQoreworfQorCitNdHBEZXZpY2VJbmZvOjp+TXRwRGV2aWNlSW5mbygpIHsKKyAgICBpZiAobVZlbmRvckV4dGVuc2lvbkRlc2MpCisgICAgICAgIGZyZWUobVZlbmRvckV4dGVuc2lvbkRlc2MpOworICAgIGRlbGV0ZSBtT3BlcmF0aW9uczsKKyAgICBkZWxldGUgbUV2ZW50czsKKyAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXM7CisgICAgZGVsZXRlIG1DYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgbVBsYXliYWNrRm9ybWF0czsKKyAgICBpZiAobU1hbnVmYWN0dXJlcikKKyAgICAgICAgZnJlZShtTWFudWZhY3R1cmVyKTsKKyAgICBpZiAobU1vZGVsKQorICAgICAgICBmcmVlKG1Nb2RlbCk7CisgICAgaWYgKG1WZXJzaW9uKQorICAgICAgICBmcmVlKG1WZXJzaW9uKTsKKyAgICBpZiAobVNlcmlhbCkKKyAgICAgICAgZnJlZShtU2VyaWFsKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisKKyAgICAvLyByZWFkIHRoZSBkZXZpY2UgaW5mbworICAgIG1TdGFuZGFyZFZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVZlbmRvckV4dGVuc2lvbklEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uID0gcGFja2V0LmdldFVJbnQxNigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKworICAgIG1GdW5jdGlvbmFsQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtT3BlcmF0aW9ucyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUV2ZW50cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbURldmljZVByb3BlcnRpZXMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1DYXB0dXJlRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbVBsYXliYWNrRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1hbnVmYWN0dXJlciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Nb2RlbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZXJzaW9uID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVNlcmlhbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwRGV2aWNlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiRGV2aWNlIEluZm86XG5cdG1TdGFuZGFyZFZlcnNpb246ICVkXG5cdG1WZW5kb3JFeHRlbnNpb25JRDogJWRcblx0bVZlbmRvckV4dGVuc2lvblZlcnNpb255OiAlZFxuIiwKKyAgICAgICAgICAgIG1TdGFuZGFyZFZlcnNpb24sIG1WZW5kb3JFeHRlbnNpb25JRCwgbVZlbmRvckV4dGVuc2lvblZlcnNpb24pOworICAgIExPR0QoIlx0bVZlbmRvckV4dGVuc2lvbkRlc2M6ICVzXG5cdG1GdW5jdGlvbmFsQ29kZTogJWRcblx0bU1hbnVmYWN0dXJlcjogJXNcblx0bU1vZGVsOiAlc1xuXHRtVmVyc2lvbjogJXNcblx0bVNlcmlhbDogJXNcbiIsCisgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYywgbUZ1bmN0aW9uYWxDb2RlLCBtTWFudWZhY3R1cmVyLCBtTW9kZWwsIG1WZXJzaW9uLCBtU2VyaWFsKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0lORk9fSAorI2RlZmluZSBfTVRQX0RFVklDRV9JTkZPX0gKKworc3RydWN0IHN0YXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwRGV2aWNlSW5mbyB7CitwdWJsaWM6CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2M7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZ1bmN0aW9uYWxDb2RlOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1PcGVyYXRpb25zOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1FdmVudHM7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgbURldmljZVByb3BlcnRpZXM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbUNhcHR1cmVGb3JtYXRzOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqICAgIG1QbGF5YmFja0Zvcm1hdHM7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbU1hbnVmYWN0dXJlcjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTW9kZWw7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVNlcmlhbDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8oKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGV2aWNlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFVklDRV9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiMWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBNZWRpYVNjYW5uZXIuY3BwCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwTWVkaWFTY2FubmVyLmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cE1lZGlhU2Nhbm5lckNsaWVudCA6IHB1YmxpYyBNZWRpYVNjYW5uZXJDbGllbnQKK3sKK3B1YmxpYzoKKyAgICBNdHBNZWRpYVNjYW5uZXJDbGllbnQoKQorICAgIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NdHBNZWRpYVNjYW5uZXJDbGllbnQoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBpbiB0aGUgSmF2YSBjb2RlCisgICAgdmlydHVhbCBib29sIHNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsIGxvbmcgbG9uZyBsYXN0TW9kaWZpZWQsIGxvbmcgbG9uZyBmaWxlU2l6ZSkKKyAgICB7CisgICAgICAgIHByaW50Zigic2NhbkZpbGUgJXNcbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBpbiB0aGUgSmF2YSBjb2RlCisgICAgdmlydHVhbCBib29sIGhhbmRsZVN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGludCB0ZW1wOworCisgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJ0aXRsZSIpKSB7CisgICAgICAgICAgICBtVGl0bGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIG1IYXNUaXRsZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAgKCFzdHJjbXAobmFtZSwgImFydGlzdCIpKSB7CisgICAgICAgICAgICBtQXJ0aXN0ID0gdmFsdWU7CisgICAgICAgICAgICBtSGFzQXJ0aXN0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAiYWxidW0iKSkgeworICAgICAgICAgICAgbUFsYnVtID0gdmFsdWU7CisgICAgICAgICAgICBtSGFzQWxidW0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpKSB7CisgICAgICAgICAgICBtQWxidW1BcnRpc3QgPSB2YWx1ZTsKKyAgICAgICAgICAgIG1IYXNBbGJ1bUFydGlzdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAgKCFzdHJjbXAobmFtZSwgImdlbnJlIikpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gaGFuZGxlIG51bWVyaWMgdmFsdWVzIGhlcmUKKyAgICAgICAgICAgIG1HZW5yZSA9IHZhbHVlOworICAgICAgICAgICAgbUhhc0dlbnJlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSkgeworICAgICAgICAgICAgbUNvbXBvc2VyID0gdmFsdWU7CisgICAgICAgICAgICBtSGFzQ29tcG9zZXIgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJ0cmFja251bWJlciIpKSB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiJWQiLCAmdGVtcCkgPT0gMSkKKyAgICAgICAgICAgICAgICBtVHJhY2sgPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJkaXNjbnVtYmVyIikpIHsKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1bnVzZWQKKyAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAieWVhciIpIHx8ICFzdHJjbXAobmFtZSwgImRhdGUiKSkgeworICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiVkIiwgJnRlbXApID09IDEpCisgICAgICAgICAgICAgICAgbVllYXIgPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJkdXJhdGlvbiIpKSB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiJWQiLCAmdGVtcCkgPT0gMSkKKyAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSB0ZW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJoYW5kbGVTdHJpbmdUYWcgJXMgOiAlc1xuIiwgbmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkZWQsIGZhbHNlIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIGluIHRoZSBKYXZhIGNvZGUKKyAgICB2aXJ0dWFsIGJvb2wgc2V0TWltZVR5cGUoY29uc3QgY2hhciogbWltZVR5cGUpCisgICAgeworICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICAgICAgbUhhc01pbWVUeXBlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgaW4gdGhlIEphdmEgY29kZQorICAgIHZpcnR1YWwgYm9vbCBhZGROb01lZGlhRm9sZGVyKGNvbnN0IGNoYXIqIHBhdGgpCisgICAgeworICAgICAgICBwcmludGYoImFkZE5vTWVkaWFGb2xkZXIgJXNcbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIG1IYXNUaXRsZSA9IGZhbHNlOworICAgICAgICBtSGFzQXJ0aXN0ID0gZmFsc2U7CisgICAgICAgIG1IYXNBbGJ1bSA9IGZhbHNlOworICAgICAgICBtSGFzQWxidW1BcnRpc3QgPSBmYWxzZTsKKyAgICAgICAgbUhhc0dlbnJlID0gZmFsc2U7CisgICAgICAgIG1IYXNDb21wb3NlciA9IGZhbHNlOworICAgICAgICBtSGFzTWltZVR5cGUgPSBmYWxzZTsKKyAgICAgICAgbVRyYWNrID0gbVllYXIgPSBtRHVyYXRpb24gPSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRUaXRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNUaXRsZSA/IChjb25zdCBjaGFyICopbVRpdGxlIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBcnRpc3QoKSBjb25zdCB7IHJldHVybiBtSGFzQXJ0aXN0ID8gKGNvbnN0IGNoYXIgKiltQXJ0aXN0IDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBbGJ1bSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNBbGJ1bSA/IChjb25zdCBjaGFyICopbUFsYnVtIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBbGJ1bUFydGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNBbGJ1bUFydGlzdCA/IChjb25zdCBjaGFyICopbUFsYnVtQXJ0aXN0IDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRHZW5yZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNHZW5yZSA/IChjb25zdCBjaGFyICopbUdlbnJlIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRDb21wb3NlcigpIGNvbnN0IHsgcmV0dXJuIG1IYXNDb21wb3NlciA/IChjb25zdCBjaGFyICopbUNvbXBvc2VyIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRNaW1lVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNNaW1lVHlwZSA/IChjb25zdCBjaGFyICopbU1pbWVUeXBlIDogTlVMTDsgfQorICAgIGlubGluZSBpbnQgZ2V0VHJhY2soKSBjb25zdCB7IHJldHVybiBtVHJhY2s7IH0KKyAgICBpbmxpbmUgaW50IGdldFllYXIoKSBjb25zdCB7IHJldHVybiBtWWVhcjsgfQorICAgIGlubGluZSBpbnQgZ2V0RHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtRHVyYXRpb247IH0KKworcHJpdmF0ZToKKyAgICBNdHBTdHJpbmcgICBtVGl0bGU7CisgICAgTXRwU3RyaW5nICAgbUFydGlzdDsKKyAgICBNdHBTdHJpbmcgICBtQWxidW07CisgICAgTXRwU3RyaW5nICAgbUFsYnVtQXJ0aXN0OworICAgIE10cFN0cmluZyAgIG1HZW5yZTsKKyAgICBNdHBTdHJpbmcgICBtQ29tcG9zZXI7CisgICAgTXRwU3RyaW5nICAgbU1pbWVUeXBlOworCisgICAgYm9vbCAgICAgICAgbUhhc1RpdGxlOworICAgIGJvb2wgICAgICAgIG1IYXNBcnRpc3Q7CisgICAgYm9vbCAgICAgICAgbUhhc0FsYnVtOworICAgIGJvb2wgICAgICAgIG1IYXNBbGJ1bUFydGlzdDsKKyAgICBib29sICAgICAgICBtSGFzR2VucmU7CisgICAgYm9vbCAgICAgICAgbUhhc0NvbXBvc2VyOworICAgIGJvb2wgICAgICAgIG1IYXNNaW1lVHlwZTsKKworICAgIGludCAgICAgICAgIG1UcmFjazsKKyAgICBpbnQgICAgICAgICBtWWVhcjsKKyAgICBpbnQgICAgICAgICBtRHVyYXRpb247Cit9OworCisKK010cE1lZGlhU2Nhbm5lcjo6TXRwTWVkaWFTY2FubmVyKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsIE10cERhdGFiYXNlKiBkYikKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1GaWxlUGF0aChmaWxlUGF0aCksCisgICAgICAgIG1EYXRhYmFzZShkYiksCisgICAgICAgIG1NZWRpYVNjYW5uZXIoTlVMTCksCisgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQoTlVMTCksCisgICAgICAgIG1GaWxlTGlzdChOVUxMKSwKKyAgICAgICAgbUZpbGVDb3VudCgwKQoreworICAgIG1NZWRpYVNjYW5uZXIgPSBuZXcgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI7CisgICAgbU1lZGlhU2Nhbm5lckNsaWVudCA9IG5ldyBNdHBNZWRpYVNjYW5uZXJDbGllbnQ7Cit9CisKK010cE1lZGlhU2Nhbm5lcjo6fk10cE1lZGlhU2Nhbm5lcigpIHsKK30KKworYm9vbCBNdHBNZWRpYVNjYW5uZXI6OnNjYW5GaWxlcygpIHsKKyAgICBtRGF0YWJhc2UtPmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICBtRmlsZUNvdW50ID0gMDsKKyAgICBtRmlsZUxpc3QgPSBtRGF0YWJhc2UtPmdldEZpbGVMaXN0KG1GaWxlQ291bnQpOworCisgICAgaW50IHJldCA9IHNjYW5EaXJlY3RvcnkobUZpbGVQYXRoLCBNVFBfUEFSRU5UX1JPT1QpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRmlsZUNvdW50OyBpKyspIHsKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHRlc3QgPSBtRmlsZUxpc3RbaV07CisgICAgICAgIGlmICghICh0ZXN0ICYga09iamVjdEhhbmRsZU1hcmtCaXQpKSB7CisgICAgICAgICAgICBwcmludGYoImRlbGV0ZSBtaXNzaW5nIGZpbGUgJTA4WFxuIiwgdGVzdCk7CisgICAgICAgICAgICBtRGF0YWJhc2UtPmRlbGV0ZUZpbGUodGVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVbXSBtRmlsZUxpc3Q7CisgICAgbUZpbGVDb3VudCA9IDA7CisgICAgbURhdGFiYXNlLT5jb21taXRUcmFuc2FjdGlvbigpOworICAgIHJldHVybiAocmV0ID09IDApOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTWVkaWFGaWxlVHlwZUVudHJ5Cit7CisgICAgY29uc3QgY2hhciogICAgIGV4dGVuc2lvbjsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0OworICAgIHVpbnQzMl90ICAgICAgICB0YWJsZTsKK30gc0ZpbGVUeXBlc1tdID0KK3sKKyAgICB7ICJNUDMiLCAgICBNVFBfRk9STUFUX01QMywgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiTTRBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIldBViIsICAgIE1UUF9GT1JNQVRfV0FWLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJBTVIiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiQVdCIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIldNQSIsICAgIE1UUF9GT1JNQVRfV01BLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJPR0ciLCAgICBNVFBfRk9STUFUX09HRywgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiT0dBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIkFBQyIsICAgIE1UUF9GT1JNQVRfQUFDLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJNSUQiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiTUlESSIsICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIlhNRiIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPLCBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJSVFRUTCIsICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiU01GIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIklNWSIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPLCBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJSVFgiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiT1RBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIk1QRUciLCAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKKyAgICB7ICJNUDQiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCisgICAgeyAiTTRWIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAorICAgIHsgIjNHUCIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKKyAgICB7ICIzR1BQIiwgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCisgICAgeyAiM0cyIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAorICAgIHsgIjNHUFAyIiwgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKKyAgICB7ICJXTVYiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCisgICAgeyAiQVNGIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAorICAgIHsgIkpQRyIsICAgIE1UUF9GT1JNQVRfRVhJRl9KUEVHLCAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZSAgICAgfSwKKyAgICB7ICJKUEVHIiwgICBNVFBfRk9STUFUX0VYSUZfSlBFRywgICAgICAga09iamVjdEhhbmRsZVRhYmxlSW1hZ2UgICAgIH0sCisgICAgeyAiR0lGIiwgICAgTVRQX0ZPUk1BVF9HSUYsICAgICAgICAgICAgIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICB9LAorICAgIHsgIlBORyIsICAgIE1UUF9GT1JNQVRfUE5HLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZSAgICAgfSwKKyAgICB7ICJCTVAiLCAgICBNVFBfRk9STUFUX0JNUCwgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlSW1hZ2UgICAgIH0sCisgICAgeyAiV0JNUCIsICAgTVRQX0ZPUk1BVF9CTVAsICAgICAgICAgICAgIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICB9LAorICAgIHsgIk0zVSIsICAgIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNULCAgICBrT2JqZWN0SGFuZGxlVGFibGVQbGF5bGlzdCAgfSwKKyAgICB7ICJQTFMiLCAgICBNVFBfRk9STUFUX1BMU19QTEFZTElTVCwgICAga09iamVjdEhhbmRsZVRhYmxlUGxheWxpc3QgIH0sCisgICAgeyAiV1BMIiwgICAgTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QsICAgIGtPYmplY3RIYW5kbGVUYWJsZVBsYXlsaXN0ICB9LAorfTsKKworTXRwT2JqZWN0Rm9ybWF0IE10cE1lZGlhU2Nhbm5lcjo6Z2V0RmlsZUZvcm1hdChjb25zdCBjaGFyKiBwYXRoLCB1aW50MzJfdCYgdGFibGUpCit7CisgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOworICAgIGlmICghZXh0ZW5zaW9uKQorICAgICAgICByZXR1cm4gTVRQX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgZXh0ZW5zaW9uKys7IC8vIHNraXAgdGhlIGRvdAorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihzRmlsZVR5cGVzKSAvIHNpemVvZihzRmlsZVR5cGVzWzBdKTsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChleHRlbnNpb24sIHNGaWxlVHlwZXNbaV0uZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgdGFibGUgPSBzRmlsZVR5cGVzW2ldLnRhYmxlOworICAgICAgICAgICAgcmV0dXJuIHNGaWxlVHlwZXNbaV0uZm9ybWF0OworICAgICAgICB9CisgICAgfQorICAgIHRhYmxlID0ga09iamVjdEhhbmRsZVRhYmxlRmlsZTsKKyAgICByZXR1cm4gTVRQX0ZPUk1BVF9VTkRFRklORUQ7Cit9CisKK2ludCBNdHBNZWRpYVNjYW5uZXI6OnNjYW5EaXJlY3RvcnkoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkKK3sKKyAgICBjaGFyIGJ1ZmZlcltQQVRIX01BWF07CisgICAgc3RydWN0IGRpcmVudCogZW50cnk7CisKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgaWYgKGxlbmd0aCA+IHNpemVvZihidWZmZXIpICsgMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBhdGggdG9vIGxvbmc6ICVzXG4iLCBwYXRoKTsKKyAgICB9CisKKyAgICBESVIqIGRpciA9IG9wZW5kaXIocGF0aCk7CisgICAgaWYgKCFkaXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuZGlyICVzIGZhaWxlZCwgZXJybm86ICVkIiwgcGF0aCwgZXJybm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RybmNweShidWZmZXIsIHBhdGgsIHNpemVvZihidWZmZXIpKTsKKyAgICBjaGFyKiBmaWxlU3RhcnQgPSBidWZmZXIgKyBsZW5ndGg7CisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBzbGFzaAorICAgIGlmIChmaWxlU3RhcnRbLTFdICE9ICcvJykgeworICAgICAgICAqKGZpbGVTdGFydCsrKSA9ICcvJzsKKyAgICB9CisgICAgaW50IGZpbGVOYW1lTGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgKyBmaWxlU3RhcnQgLSBidWZmZXI7CisKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iLCBhcyB3ZWxsIGFzIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBzdGFyaW5nIHdpdGggZG90CisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmxlbihuYW1lKSArIDEgPiBmaWxlTmFtZUxlbmd0aCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwYXRoIHRvbyBsb25nIGZvciAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoZmlsZVN0YXJ0LCBuYW1lKTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgICAgICBtZW1zZXQoJnN0YXRidWYsIDAsIHNpemVvZihzdGF0YnVmKSk7CisgICAgICAgIHN0YXQoYnVmZmVyLCAmc3RhdGJ1Zik7CisKKyAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0SGFuZGxlKGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbWFya0ZpbGUoaGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRGaWxlKGJ1ZmZlciwgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgbVN0b3JhZ2VJRCwgMCwgc3RhdGJ1Zi5zdF9tdGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuRGlyZWN0b3J5KGJ1ZmZlciwgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIHNjYW5GaWxlKGJ1ZmZlciwgcGFyZW50LCBzdGF0YnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlZGlyKGRpcik7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTXRwTWVkaWFTY2FubmVyOjpzY2FuRmlsZShjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgcGFyZW50LCBzdHJ1Y3Qgc3RhdCYgc3RhdGJ1ZikgeworICAgIHVpbnQzMl90IHRhYmxlOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBnZXRGaWxlRm9ybWF0KHBhdGgsIHRhYmxlKTsKKyAgICAvLyBkb24ndCBzY2FuIHVua25vd24gZmlsZSB0eXBlcworICAgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9VTkRFRklORUQpCisgICAgICAgIHJldHVybjsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5nZXRPYmplY3RIYW5kbGUocGF0aCk7CisgICAgLy8gZml4bWUgLSByZXNjYW4gaWYgbW9kIGRhdGUgY2hhbmdlZAorICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgbWFya0ZpbGUoaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRGF0YWJhc2UtPmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRGaWxlKHBhdGgsIGZvcm1hdCwgcGFyZW50LCBtU3RvcmFnZUlELAorICAgICAgICAgICAgICAgIHN0YXRidWYuc3Rfc2l6ZSwgc3RhdGJ1Zi5zdF9tdGltZSk7CisgICAgICAgIGlmIChoYW5kbGUgPD0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGRGaWxlIGZhaWxlZCBpbiBNdHBNZWRpYVNjYW5uZXI6OnNjYW5GaWxlKClcbiIpOworICAgICAgICAgICAgbURhdGFiYXNlLT5yb2xsYmFja1RyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pIHsKKyAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPnJlc2V0KCk7CisgICAgICAgICAgICBtTWVkaWFTY2FubmVyLT5wcm9jZXNzRmlsZShwYXRoLCBOVUxMLCAqbU1lZGlhU2Nhbm5lckNsaWVudCk7CisgICAgICAgICAgICBoYW5kbGUgPSBtRGF0YWJhc2UtPmFkZEF1ZGlvRmlsZShoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPmdldFRpdGxlKCksCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPmdldEFydGlzdCgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRBbGJ1bSgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRBbGJ1bUFydGlzdCgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRHZW5yZSgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRDb21wb3NlcigpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRNaW1lVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRUcmFjaygpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRZZWFyKCksCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPmdldER1cmF0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS0+Y29tbWl0VHJhbnNhY3Rpb24oKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwTWVkaWFTY2FubmVyOjptYXJrRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1GaWxlTGlzdCkgeworICAgICAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKKyAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gbUZpbGVMaXN0CisgICAgICAgIGludCBsb3cgPSAwOworICAgICAgICBpbnQgaGlnaCA9IG1GaWxlQ291bnQ7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkgeworICAgICAgICAgICAgaW5kZXggPSAobG93ICsgaGlnaCkgPj4gMTsKKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSB0ZXN0ID0gKG1GaWxlTGlzdFtpbmRleF0gJiBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPCB0ZXN0KQorICAgICAgICAgICAgICAgIGhpZ2ggPSBpbmRleDsgICAgICAgLy8gaXRlbSBpcyBsZXNzIHRoYW4gaW5kZXgKKyAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZSA+IHRlc3QpCisgICAgICAgICAgICAgICAgbG93ID0gaW5kZXggKyAxOyAgICAvLyBpdGVtIGlzIGdyZWF0ZXIgdGhhbiBpbmRleAorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbUZpbGVMaXN0W2luZGV4XSB8PSBrT2JqZWN0SGFuZGxlTWFya0JpdDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmaWxlICVkIG5vdCBmb3VuZCBpbiBtRmlsZUxpc3RcbiIsIGhhbmRsZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5oIGIvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDUwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwTWVkaWFTY2FubmVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9NRURJQV9TQ0FOTkVSX0gKKyNkZWZpbmUgX01UUF9NRURJQV9TQ0FOTkVSX0gKKworc3RydWN0IHN0YXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YWJhc2U7CitjbGFzcyBTcWxpdGVTdGF0ZW1lbnQ7CitjbGFzcyBNZWRpYVNjYW5uZXI7CitjbGFzcyBNdHBNZWRpYVNjYW5uZXJDbGllbnQ7CisKK2NsYXNzIE10cE1lZGlhU2Nhbm5lciB7Citwcml2YXRlOgorICAgIE10cFN0b3JhZ2VJRCAgICAgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgbUZpbGVQYXRoOworICAgIE10cERhdGFiYXNlKiAgICAgICAgICAgIG1EYXRhYmFzZTsKKyAgICBNZWRpYVNjYW5uZXIqICAgICAgICAgICBtTWVkaWFTY2FubmVyOworICAgIE10cE1lZGlhU2Nhbm5lckNsaWVudCogIG1NZWRpYVNjYW5uZXJDbGllbnQ7CisKKyAgICAvLyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW5nIG1pc3NpbmcgZmlsZXMKKyAgICBNdHBPYmplY3RIYW5kbGUqICAgICAgICBtRmlsZUxpc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZpbGVDb3VudDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE1lZGlhU2Nhbm5lcihNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBNZWRpYVNjYW5uZXIoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNjYW5GaWxlcygpOworCitwcml2YXRlOgorICAgIE10cE9iamVjdEZvcm1hdCAgICAgICAgIGdldEZpbGVGb3JtYXQoY29uc3QgY2hhciogcGF0aCwgdWludDMyX3QmIHRhYmxlKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzY2FuRGlyZWN0b3J5KGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsIHN0cnVjdCBzdGF0JiBzdGF0YnVmKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBtYXJrRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX01FRElBX1NDQU5ORVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGY1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cE9iamVjdEluZm8iCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwT2JqZWN0SW5mbzo6TXRwT2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKQorICAgIDogICBtSGFuZGxlKGhhbmRsZSksCisgICAgICAgIG1TdG9yYWdlSUQoMCksCisgICAgICAgIG1Gb3JtYXQoMCksCisgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzKDApLAorICAgICAgICBtQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYkZvcm1hdCgwKSwKKyAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYlBpeFdpZHRoKDApLAorICAgICAgICBtVGh1bWJQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeFdpZHRoKDApLAorICAgICAgICBtSW1hZ2VQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeERlcHRoKDApLAorICAgICAgICBtUGFyZW50KDApLAorICAgICAgICBtQXNzb2NpYXRpb25UeXBlKDApLAorICAgICAgICBtQXNzb2NpYXRpb25EZXNjKDApLAorICAgICAgICBtU2VxdWVuY2VOdW1iZXIoMCksCisgICAgICAgIG1OYW1lKE5VTEwpLAorICAgICAgICBtRGF0ZUNyZWF0ZWQoMCksCisgICAgICAgIG1EYXRlTW9kaWZpZWQoMCksCisgICAgICAgIG1LZXl3b3JkcyhOVUxMKQoreworfQorCitNdHBPYmplY3RJbmZvOjp+TXRwT2JqZWN0SW5mbygpIHsKKyAgICBpZiAobU5hbWUpCisgICAgICAgIGZyZWUobU5hbWUpOworICAgIGlmIChtS2V5d29yZHMpCisgICAgICAgIGZyZWUobUtleXdvcmRzKTsKK30KKwordm9pZCBNdHBPYmplY3RJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisgICAgdGltZV90IHRpbWU7CisKKyAgICBtU3RvcmFnZUlEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVByb3RlY3Rpb25TdGF0dXMgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUNvbXByZXNzZWRTaXplID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYkZvcm1hdCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhXaWR0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhIZWlnaHQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeERlcHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1QYXJlbnQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUFzc29jaWF0aW9uVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQXNzb2NpYXRpb25EZXNjID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1TZXF1ZW5jZU51bWJlciA9IHBhY2tldC5nZXRVSW50MzIoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTmFtZSA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlQ3JlYXRlZCA9IHRpbWU7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlTW9kaWZpZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1LZXl3b3JkcyA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiTXRwT2JqZWN0IEluZm8gJTA4WDogJXNcbiIsIG1IYW5kbGUsIG1OYW1lKTsKKyAgICBMT0dEKCIgIG1TdG9yYWdlSUQ6ICUwOFggbUZvcm1hdDogJTA0WCBtUHJvdGVjdGlvblN0YXR1czogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtRm9ybWF0LCBtUHJvdGVjdGlvblN0YXR1cyk7CisgICAgTE9HRCgiICBtQ29tcHJlc3NlZFNpemU6ICVkIG1UaHVtYkZvcm1hdDogJTA0WCBtVGh1bWJDb21wcmVzc2VkU2l6ZTogJWRcbiIsCisgICAgICAgICAgICBtQ29tcHJlc3NlZFNpemUsIG1Gb3JtYXQsIG1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBMT0dEKCIgIG1UaHVtYlBpeFdpZHRoOiAlZCBtVGh1bWJQaXhIZWlnaHQ6ICVkXG4iLCBtVGh1bWJQaXhXaWR0aCwgbVRodW1iUGl4SGVpZ2h0KTsKKyAgICBMT0dEKCIgIG1JbWFnZVBpeFdpZHRoOiAlZCBtSW1hZ2VQaXhIZWlnaHQ6ICVkIG1JbWFnZVBpeERlcHRoOiAlZFxuIiwKKyAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoLCBtSW1hZ2VQaXhIZWlnaHQsIG1JbWFnZVBpeERlcHRoKTsKKyAgICBMT0dEKCIgIG1QYXJlbnQ6ICUwOFggbUFzc29jaWF0aW9uVHlwZTogJTA0WCBtQXNzb2NpYXRpb25EZXNjOiAlMDRYXG4iLAorICAgICAgICAgICAgbVBhcmVudCwgbUFzc29jaWF0aW9uVHlwZSwgbUFzc29jaWF0aW9uRGVzYyk7CisgICAgTE9HRCgiICBtU2VxdWVuY2VOdW1iZXI6ICVkIG1EYXRlQ3JlYXRlZDogJWQgbURhdGVNb2RpZmllZDogJWQgbUtleXdvcmRzOiAlc1xuIiwKKyAgICAgICAgICAgIG1TZXF1ZW5jZU51bWJlciwgbURhdGVDcmVhdGVkLCBtRGF0ZU1vZGlmaWVkLCBtS2V5d29yZHMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaCBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNDQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfT0JKRUNUX0lORk9fSAorI2RlZmluZSBfTVRQX09CSkVDVF9JTkZPX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwT2JqZWN0SW5mbyB7CitwdWJsaWM6CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1Gb3JtYXQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtUHJvdGVjdGlvblN0YXR1czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Db21wcmVzc2VkU2l6ZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1UaHVtYkZvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iUGl4V2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeERlcHRoOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVBhcmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvblR5cGU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtQXNzb2NpYXRpb25EZXNjOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgbU5hbWU7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZUNyZWF0ZWQ7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZU1vZGlmaWVkOworICAgIGNoYXIqICAgICAgICAgICAgICAgbUtleXdvcmRzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cE9iamVjdEluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfT0JKRUNUX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI2YWJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBQYWNrZXQ6Ok10cFBhY2tldChpbnQgYnVmZmVyU2l6ZSkKKyAgICA6ICAgbUJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUJ1ZmZlclNpemUoYnVmZmVyU2l6ZSksCisgICAgICAgIG1BbGxvY2F0aW9uSW5jcmVtZW50KGJ1ZmZlclNpemUpLAorICAgICAgICBtUGFja2V0U2l6ZSgwKQoreworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhidWZmZXJTaXplKTsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IVxuIik7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitNdHBQYWNrZXQ6On5NdHBQYWNrZXQoKSB7CisgICAgaWYgKG1CdWZmZXIpCisgICAgICAgIGZyZWUobUJ1ZmZlcik7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpyZXNldCgpIHsKKyAgICBhbGxvY2F0ZShNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBtUGFja2V0U2l6ZSA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgbWVtc2V0KG1CdWZmZXIsIDAsIG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OmFsbG9jYXRlKGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID4gbUJ1ZmZlclNpemUpIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50OworICAgICAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKilyZWFsbG9jKG1CdWZmZXIsIG5ld0xlbmd0aCk7CisgICAgICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IVxuIik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gbmV3TGVuZ3RoOworICAgIH0KK30KKwordm9pZCBNdHBQYWNrZXQ6OmR1bXAoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGFja2V0U2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJTAyWCAiLCBtQnVmZmVyW2ldKTsKKyAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJcblxuIik7Cit9CisKK3VpbnQxNl90IE10cFBhY2tldDo6Z2V0VUludDE2KGludCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwgKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0XTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSAgfCAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDE2KGludCBvZmZzZXQsIHVpbnQxNl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnB1dFVJbnQzMihpbnQgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkgeworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRDb250YWluZXJDb2RlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpIHsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK010cFRyYW5zYWN0aW9uSUQgTXRwUGFja2V0OjpnZXRUcmFuc2FjdGlvbklEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQzMl90IE10cFBhY2tldDo6Z2V0UGFyYW1ldGVyKGludCBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA1KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlcXVlc3RQYWNrZXQ6OmdldFBhcmFtZXRlclxuIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgKyAoaW5kZXggLSAxKSAqIHNpemVvZih1aW50MzJfdCkpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0UGFyYW1ldGVyKGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZGV4ICVkIG91dCBvZiByYW5nZSBpbiBNdHBSZXNwb25zZVBhY2tldDo6c2V0UGFyYW1ldGVyXG4iLCBpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG9mZnNldCA9IE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpKQorICAgICAgICBtUGFja2V0U2l6ZSA9IG9mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisgICAgcHV0VUludDMyKG9mZnNldCwgdmFsdWUpOworfQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBQYWNrZXQ6OnRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpZiAodXNiX2VuZHBvaW50X3F1ZXVlKGVwLCBidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2JfZW5kcG9pbnRfcXVldWUgZmFpbGVkLCBlcnJubzogJWRcbiIsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgZXBfbnVtOworICAgIHJldHVybiB1c2JfZW5kcG9pbnRfd2FpdCh1c2JfZW5kcG9pbnRfZ2V0X2RldmljZShlcCksICZlcF9udW0pOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyNGE3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK3N0cnVjdCB1c2JfZW5kcG9pbnQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwU3RyaW5nQnVmZmVyOworCitjbGFzcyBNdHBQYWNrZXQgeworCitwcm90ZWN0ZWQ6CisgICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOworICAgIC8vIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHdoZW4gcmVzaXppbmcgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgLy8gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgcGFja2V0CisgICAgaW50ICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUGFja2V0KGludCBidWZmZXJTaXplKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQYWNrZXQoKTsKKworICAgIC8vIHNldHMgcGFja2V0IHNpemUgdG8gdGhlIGRlZmF1bHQgY29udGFpbmVyIHNpemUgYW5kIHNldHMgYnVmZmVyIHRvIHplcm8KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGFsbG9jYXRlKGludCBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcCgpOworCisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRDb250YWluZXJDb2RlKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpOworCisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICBnZXRUcmFuc2FjdGlvbklEKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKTsKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICB0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNlNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSgpCisgICAgOiAgIG1Db2RlKDApLAorICAgICAgICBtVHlwZSgwKSwKKyAgICAgICAgbVdyaXRlYWJsZShmYWxzZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtRGVmYXVsdFZhbHVlLnN0ciA9IE5VTEw7CisgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOworICAgIG1NaW5pbXVtVmFsdWUuc3RyID0gTlVMTDsKKyAgICBtTWF4aW11bVZhbHVlLnN0ciA9IE5VTEw7Cit9CisKK010cFByb3BlcnR5Ojp+TXRwUHJvcGVydHkoKSB7CisgICAgaWYgKG1UeXBlID09IE1UUF9UWVBFX1NUUikgeworICAgICAgICAvLyBmcmVlIGFsbCBzdHJpbmdzCisgICAgICAgIGZyZWUobURlZmF1bHRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1DdXJyZW50VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWluaW11bVZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1heGltdW1WYWx1ZS5zdHIpOworICAgICAgICBpZiAobURlZmF1bHRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGVmYXVsdEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRGVmYXVsdEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1cnJlbnRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUN1cnJlbnRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW51bVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUVudW1WYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGVbXSBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUVudW1WYWx1ZXM7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIG1Db2RlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Xcml0ZWFibGUgPSAocGFja2V0LmdldFVJbnQ4KCkgPT0gMSk7CisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyA9IHJlYWRBcnJheVZhbHVlcyhwYWNrZXQsIG1EZWZhdWx0QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyA9IHJlYWRBcnJheVZhbHVlcyhwYWNrZXQsIG1DdXJyZW50QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOworICAgIH0KKyAgICBtRm9ybUZsYWcgPSBwYWNrZXQuZ2V0VUludDgoKTsKKworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIG1FbnVtTGVuZ3RoID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICBtRW51bVZhbHVlcyA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW21FbnVtTGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoKSB7CisgICAgTE9HRCgiTXRwUHJvcGVydHkgJTA0WFxuIiwgbUNvZGUpOworICAgIExPR0QoIiAgICB0eXBlICUwNFhcbiIsIG1UeXBlKTsKKyAgICBMT0dEKCIgICAgd3JpdGVhYmxlICVzXG4iLCAobVdyaXRlYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHZhbHVlLmk4ID0gcGFja2V0LmdldEludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgdmFsdWUudTggPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgdmFsdWUuaTE2ID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS51MTYgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLmkzMiA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgdmFsdWUudTMyID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICB2YWx1ZS5pNjQgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLnU2NCA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5nZXRJbnQxMjgodmFsdWUuaTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LmdldFVJbnQxMjgodmFsdWUudTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biB0eXBlICVkIGluIE10cFByb3BlcnR5OjpyZWFkVmFsdWVcbiIsIG1UeXBlKTsKKyAgICB9Cit9CisKK010cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgeworICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmggYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzcyMjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QUk9QRVJUWV9ICisjZGVmaW5lIF9NVFBfUFJPUEVSVFlfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBQcm9wZXJ0eSB7CitwdWJsaWM6CisgICAgTXRwUHJvcGVydHlDb2RlICAgICBtQ29kZTsKKyAgICBNdHBEYXRhVHlwZSAgICAgICAgIG1UeXBlOworICAgIGJvb2wgICAgICAgICAgICAgICAgbVdyaXRlYWJsZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1EZWZhdWx0VmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtQ3VycmVudFZhbHVlOworCisgICAgLy8gZm9yIGFycmF5IHR5cGVzCisgICAgaW50ICAgICAgICAgICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbURlZmF1bHRBcnJheVZhbHVlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtQ3VycmVudEFycmF5VmFsdWVzOworCisgICAgZW51bSB7CisgICAgICAgIGtGb3JtTm9uZSA9IDAsCisgICAgICAgIGtGb3JtUmFuZ2UgPSAxLAorICAgICAgICBrRm9ybUVudW0gPSAyLAorICAgIH07CisgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybUZsYWc7CisKKyAgICAvLyBmb3IgcmFuZ2UgZm9ybQorICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1pbmltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1NYXhpbXVtVmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtU3RlcFNpemU7CisKKyAgICAvLyBmb3IgZW51bSBmb3JtCisgICAgaW50ICAgICAgICAgICAgICAgICBtRW51bUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1FbnVtVmFsdWVzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFByb3BlcnR5KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIHJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BST1BFUlRZX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2E3MjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlcXVlc3RQYWNrZXQ6Ok10cFJlcXVlc3RQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXF1ZXN0UGFja2V0Ojp+TXRwUmVxdWVzdFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBSZXF1ZXN0UGFja2V0OjpyZWFkKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQgKGhvc3QgbW9kZSkKK2ludCBNdHBSZXF1ZXN0UGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkKK3sKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EKTsKKyAgICByZXR1cm4gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MThmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVFVRVNUX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUmVxdWVzdFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVxdWVzdFBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cE9wZXJhdGlvbkNvZGUgICAgZ2V0T3BlcmF0aW9uQ29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTc5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBSZXNwb25zZVBhY2tldDo6TXRwUmVzcG9uc2VQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXNwb25zZVBhY2tldDo6fk10cFJlc3BvbnNlUGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cFJlc3BvbnNlUGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9SRVNQT05TRSk7CisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKK2ludCBNdHBSZXNwb25zZVBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNmOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVNQT05TRV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBSZXNwb25zZVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFJlc3BvbnNlUGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwUmVzcG9uc2VDb2RlICAgICAgZ2V0UmVzcG9uc2VDb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlQ29kZShNdHBSZXNwb25zZUNvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliNGNhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKworI2luY2x1ZGUgImZfbXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IE10cE9wZXJhdGlvbkNvZGUga1N1cHBvcnRlZE9wZXJhdGlvbkNvZGVzW10gPSB7CisgICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiwKKyAgICBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QsCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFLAorLy8gICAgTVRQX09QRVJBVElPTl9TRUxGX1RFU1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiwKKy8vICAgIE1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUywKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTLAorLy8gICAgTVRQX09QRVJBVElPTl9TS0lQLAorfTsKKworc3RhdGljIGNvbnN0IE10cE9iamVjdFByb3BlcnR5IGtTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzW10gPSB7CisgICAgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFLAorICAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULAorfTsKKworc3RhdGljIGNvbnN0IE10cE9iamVjdEZvcm1hdCBrU3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzW10gPSB7CisgICAgLy8gTVRQX0ZPUk1BVF9VTkRFRklORUQsCisgICAgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAvLyBNVFBfRk9STUFUX1RFWFQsCisgICAgLy8gTVRQX0ZPUk1BVF9IVE1MLAorICAgIE1UUF9GT1JNQVRfTVAzLAorICAgIC8vTVRQX0ZPUk1BVF9BVkksCisgICAgTVRQX0ZPUk1BVF9NUEVHLAorICAgIC8vIE1UUF9GT1JNQVRfQVNGLAorICAgIE1UUF9GT1JNQVRfRVhJRl9KUEVHLAorICAgIE1UUF9GT1JNQVRfVElGRl9FUCwKKyAgICAvLyBNVFBfRk9STUFUX0JNUCwKKyAgICBNVFBfRk9STUFUX0dJRiwKKyAgICBNVFBfRk9STUFUX0pGSUYsCisgICAgTVRQX0ZPUk1BVF9QTkcsCisgICAgTVRQX0ZPUk1BVF9USUZGLAorICAgIE1UUF9GT1JNQVRfV01BLAorICAgIE1UUF9GT1JNQVRfT0dHLAorICAgIE1UUF9GT1JNQVRfQUFDLAorICAgIC8vIE1UUF9GT1JNQVRfRkxBQywKKyAgICAvLyBNVFBfRk9STUFUX1dNViwKKyAgICBNVFBfRk9STUFUX01QNF9DT05UQUlORVIsCisgICAgTVRQX0ZPUk1BVF9NUDIsCisgICAgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSLAorICAgIC8vIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0sCisgICAgLy8gTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX1dQTF9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX00zVV9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX01QTF9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX1BMU19QTEFZTElTVCwKK307CisKK010cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgY29uc3QgY2hhciogZGF0YWJhc2VQYXRoKQorICAgIDogICBtRkQoZmQpLAorICAgICAgICBtRGF0YWJhc2VQYXRoKGRhdGFiYXNlUGF0aCksCisgICAgICAgIG1EYXRhYmFzZShOVUxMKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVNlc3Npb25PcGVuKGZhbHNlKSwKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUoa0ludmFsaWRPYmplY3RIYW5kbGUpLAorICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplKDApCit7CisgICAgbURhdGFiYXNlID0gbmV3IE10cERhdGFiYXNlKCk7CisgICAgbURhdGFiYXNlLT5vcGVuKGRhdGFiYXNlUGF0aCwgdHJ1ZSk7Cit9CisKK010cFNlcnZlcjo6fk10cFNlcnZlcigpIHsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OmFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICBpbnQgaW5kZXggPSBtU3RvcmFnZXMuc2l6ZSgpICsgMTsKKyAgICBpbmRleCB8PSBpbmRleCA8PCAxNjsgICAvLyBzZXQgaGlnaCBhbmQgbG93IHBhcnQgdG8gb3VyIGluZGV4CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG5ldyBNdHBTdG9yYWdlKGluZGV4LCBmaWxlUGF0aCwgbURhdGFiYXNlKTsKKyAgICBhZGRTdG9yYWdlKHN0b3JhZ2UpOworfQorCitNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07CisgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNjYW5TdG9yYWdlKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSAgbVN0b3JhZ2VzW2ldOworICAgICAgICBzdG9yYWdlLT5zY2FuRmlsZXMoKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwU2VydmVyOjpydW4oKSB7CisgICAgaW50IGZkID0gbUZEOworCisgICAgcHJpbnRmKCJNdHBTZXJ2ZXI6OnJ1biBmZDogJWRcbiIsIGZkKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKGZkKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVxdWVzdCByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiA9IG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKTsKKyAgICAgICAgTXRwVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbiA9IG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKTsKKworICAgICAgICBwcmludGYoIm9wZXJhdGlvbjogJXNcbiIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICAgICAgbVJlcXVlc3QuZHVtcCgpOworCisgICAgICAgIC8vIEZJWE1FIG5lZWQgdG8gZ2VuZXJhbGl6ZSB0aGlzCisgICAgICAgIGJvb2wgZGF0YUluID0gKG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8pOworICAgICAgICBpZiAoZGF0YUluKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChmZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGF0YSByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJyZWNlaXZlZCBkYXRhOlxuIik7CisgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRGF0YS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhbmRsZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgaWYgKCFkYXRhSW4gJiYgbURhdGEuaGFzRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICAgIHByaW50Zigic2VuZGluZyBkYXRhOlxuIik7CisgICAgICAgICAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICAgICAgICAgIHJldCA9IG1EYXRhLndyaXRlKGZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZFxuIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZXNwb25zZS5zZXRUcmFuc2FjdGlvbklEKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgIHByaW50Zigic2VuZGluZyByZXNwb25zZSAlMDRYXG4iLCBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgcmV0ID0gbVJlc3BvbnNlLndyaXRlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXF1ZXN0IHdyaXRlIHJldHVybmVkICVkLCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJza2lwcGluZyByZXNwb25zZVxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgTXRwU2VydmVyOjpoYW5kbGVSZXF1ZXN0KCkgeworICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXNwb25zZTsKKworICAgIG1SZXNwb25zZS5yZXNldCgpOworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlICE9IGtJbnZhbGlkT2JqZWN0SGFuZGxlICYmIG9wZXJhdGlvbiAhPSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVlZCB0byBkZWxldGUgbVNlbmRPYmplY3RIYW5kbGUgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJleHBlY3RlZCBTZW5kT2JqZWN0IGFmdGVyIFNlbmRPYmplY3RJbmZvXG4iKTsKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wZXJhdGlvbikgeworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZUluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb09wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT046CisgICAgICAgICAgICByZXNwb25zZSA9IGRvQ2xvc2VTZXNzaW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSURzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RIYW5kbGVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZW5kT2JqZWN0SW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvRGVsZXRlT2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzcG9uc2UgPSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOworICAgIHJldHVybiB0cnVlOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldERldmljZUluZm8oKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgc3RyaW5nOworICAgIGNoYXIgcHJvcF92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0RW1wdHlBcnJheSgpOyAvLyBFdmVudHMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0RW1wdHlBcnJheSgpOyAvLyBEZXZpY2UgUHJvcGVydGllcyBTdXBwb3J0ZWQKKyAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7IC8vIENhcHR1cmUgRm9ybWF0cworICAgIG1EYXRhLnB1dEFVSW50MTYoa1N1cHBvcnRlZFBsYXliYWNrRm9ybWF0cywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKSAvIHNpemVvZih1aW50MTZfdCkpOyAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb09wZW5TZXNzaW9uKCkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBtU2Vzc2lvbklEKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTjsKKyAgICB9CisgICAgbVNlc3Npb25JRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBtU2Vzc2lvbk9wZW4gPSB0cnVlOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvQ2xvc2VTZXNzaW9uKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgbVNlc3Npb25JRCA9IDA7CisgICAgbVNlc3Npb25PcGVuID0gZmFsc2U7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSURzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisKKyAgICBpbnQgY291bnQgPSBtU3RvcmFnZXMuc2l6ZSgpOworICAgIG1EYXRhLnB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBtRGF0YS5wdXRVSW50MzIobVN0b3JhZ2VzW2ldLT5nZXRTdG9yYWdlSUQoKSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJbmZvKCkgeworICAgIE10cFN0cmluZ0J1ZmZlciAgIHN0cmluZzsKKworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGlkID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKGlkKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldFR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEZpbGVTeXN0ZW1UeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRBY2Nlc3NDYXBhYmlsaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRNYXhDYXBhY2l0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpOworICAgIG1EYXRhLnB1dFVJbnQzMigxMDI0KjEwMjQqMTAyNCk7IC8vIEZyZWUgU3BhY2UgaW4gT2JqZWN0cworICAgIHN0cmluZy5zZXQoc3RvcmFnZS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7CisgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBWb2x1bWUgSWRlbnRpZmllcgorCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcykgLyBzaXplb2YodWludDE2X3QpKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdEhhbmRsZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURhdGFiYXNlLT5nZXRPYmplY3RMaXN0KHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wVmFsdWUoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5KGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaWYgKCFtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworCisgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICBtZnIuZmQgPSBvcGVuKGZpbGVQYXRoLCBPX1JET05MWSk7CisgICAgaWYgKG1mci5mZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICBtZnIub2Zmc2V0ID0gMDsKKyAgICBtZnIubGVuZ3RoID0gZmlsZUxlbmd0aDsKKworICAgIC8vIHNlbmQgZGF0YSBoZWFkZXIKKyAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKSk7CisgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgIG1EYXRhLndyaXRlRGF0YUhlYWRlcihtRkQsIGZpbGVMZW5ndGgpOworCisgICAgLy8gdGhlbiB0cmFuc2ZlciB0aGUgZmlsZQorICAgIGludCByZXQgPSBpb2N0bChtRkQsIE1UUF9TRU5EX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2VuZE9iamVjdEluZm8oKSB7CisgICAgTXRwU3RyaW5nIHBhdGg7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gZ2V0U3RvcmFnZShzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKKworICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgcm9vdAorICAgIGlmIChwYXJlbnQgPT0gTVRQX1BBUkVOVF9ST09UKQorICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgIGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICBpZiAoIW1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgocGFyZW50LCBwYXRoLCBkdW1teSkpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyByZWFkIG9ubHkgdGhlIGZpZWxkcyB3ZSBuZWVkCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBzdG9yYWdlIElECisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gcHJvdGVjdGlvbiBzdGF0dXMKKyAgICBtU2VuZE9iamVjdEZpbGVTaXplID0gbURhdGEuZ2V0VUludDMyKCk7CisgICAgbURhdGEuZ2V0VUludDE2KCk7ICAvLyB0aHVtYiBmb3JtYXQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gcGFyZW50CisgICAgdWludDE2X3QgYXNzb2NpYXRpb25UeXBlID0gbURhdGEuZ2V0VUludDE2KCk7CisgICAgdWludDMyX3QgYXNzb2NpYXRpb25EZXNjID0gbURhdGEuZ2V0VUludDMyKCk7ICAgLy8gYXNzb2NpYXRpb24gZGVzYworICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc2VxdWVuY2UgbnVtYmVyCisgICAgTXRwU3RyaW5nQnVmZmVyIG5hbWUsIGNyZWF0ZWQsIG1vZGlmaWVkOworICAgIG1EYXRhLmdldFN0cmluZyhuYW1lKTsgICAgLy8gZmlsZSBuYW1lCisgICAgbURhdGEuZ2V0U3RyaW5nKGNyZWF0ZWQpOyAgICAgIC8vIGRhdGUgY3JlYXRlZAorICAgIG1EYXRhLmdldFN0cmluZyhtb2RpZmllZCk7ICAgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgLy8ga2V5d29yZHMgZm9sbG93CisKKyAgICB0aW1lX3QgbW9kaWZpZWRUaW1lOworICAgIGlmICghcGFyc2VEYXRlVGltZShtb2RpZmllZCwgbW9kaWZpZWRUaW1lKSkKKyAgICAgICAgbW9kaWZpZWRUaW1lID0gMDsKK3ByaW50ZigiU2VuZE9iamVjdEluZm8gZm9ybWF0OiAlMDRYIHNpemU6ICVkIG5hbWU6ICVzLCBjcmVhdGVkOiAlcywgbW9kaWZpZWQ6ICVzXG4iLAorZm9ybWF0LCBtU2VuZE9iamVjdEZpbGVTaXplLCAoY29uc3QgY2hhciopbmFtZSwgKGNvbnN0IGNoYXIqKWNyZWF0ZWQsIChjb25zdCBjaGFyKiltb2RpZmllZCk7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBtRGF0YWJhc2UtPmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRGaWxlKChjb25zdCBjaGFyKilwYXRoLCBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemUsIG1vZGlmaWVkVGltZSk7CisgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBtRGF0YWJhc2UtPnJvbGxiYWNrVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICB1aW50MzJfdCB0YWJsZSA9IE10cERhdGFiYXNlOjpnZXRUYWJsZUZvckZpbGUoZm9ybWF0KTsKKyAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pCisgICAgICAgIGhhbmRsZSA9IG1EYXRhYmFzZS0+YWRkQXVkaW9GaWxlKGhhbmRsZSk7CisgICAgbURhdGFiYXNlLT5jb21taXRUcmFuc2FjdGlvbigpOworCisgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgeworICAgICAgICBtb2RlX3QgbWFzayA9IHVtYXNrKDApOworICAgICAgICBpbnQgcmV0ID0gbWtkaXIoKGNvbnN0IGNoYXIgKilwYXRoLCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VuZE9iamVjdEZpbGVQYXRoID0gcGF0aDsKKyAgICAgICAgLy8gc2F2ZSB0aGUgaGFuZGxlIGZvciB0aGUgU2VuZE9iamVjdCBjYWxsLCB3aGljaCBzaG91bGQgZm9sbG93CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0gaGFuZGxlOworICAgIH0KKworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDIsIHBhcmVudCk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkV4cGVjdGVkIFNlbmRPYmplY3RJbmZvIGJlZm9yZSBTZW5kT2JqZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTzsKKyAgICB9CisKKyAgICAvLyByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgcmV0ID0gbURhdGEucmVhZERhdGFIZWFkZXIobUZEKTsKKyAgICAvLyBGSVhNRSAtIGNoZWNrIGZvciBlcnJvcnMgaGVyZS4KKworICAgIC8vIHJlc2V0IHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGlzIGJhY2sKKyAgICBtRGF0YS5yZXNldCgpOworCisgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICBtZnIuZmQgPSBvcGVuKG1TZW5kT2JqZWN0RmlsZVBhdGgsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKyAgICBpZiAobWZyLmZkIDwgMCkgeworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplOworCisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisgICAgLy8gRklYTUUgLSB3ZSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZSBpZiB0aGlzIGZhaWxzLgorICAgIHByaW50ZigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9EZWxldGVPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIC8vIEZJWE1FIC0gc3VwcG9ydCBkZWxldGluZyBhbGwgb2JqZWN0cyBpZiBoYW5kbGUgaXMgMHhGRkZGRkZGRgorICAgIC8vIEZJWE1FIC0gaW1wbGVtZW50IGRlbGV0aW5nIG9iamVjdHMgYnkgZm9ybWF0CisgICAgLy8gRklYTUUgLSBoYW5kbGUgbm9uLWVtcHR5IGRpcmVjdG9yaWVzCisKKyAgICBNdHBTdHJpbmcgZmlsZVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGlmICghbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChoYW5kbGUsIGZpbGVQYXRoLCBmaWxlTGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisKK3ByaW50ZigiZGVsZXRpbmcgJXNcbiIsIChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgIC8vIG9uZSBvZiB0aGVzZSBzaG91bGQgd29yaworICAgIHJtZGlyKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgIHVubGluaygoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKworICAgIG1EYXRhYmFzZS0+ZGVsZXRlRmlsZShoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wRGVzYygpIHsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworCisgICAgcmV0dXJuIC0xOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjNjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TRVJWRVJfSAorI2RlZmluZSBfTVRQX1NFUlZFUl9ICisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFN0b3JhZ2U7CitjbGFzcyBNdHBEYXRhYmFzZTsKKworY2xhc3MgTXRwU2VydmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBmaWxlIGRlc2NyaXB0b3IgZm9yIE1UUCBrZXJuZWwgZHJpdmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CisKKyAgICAvLyBwYXRoIHRvIG91ciBzcWxpdGUzIGRhdGFiYXNlCisgICAgY29uc3QgY2hhciogICAgICAgICBtRGF0YWJhc2VQYXRoOworCisgICAgTXRwRGF0YWJhc2UqICAgICAgICBtRGF0YWJhc2U7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gdHJ1ZSBpZiB3ZSBoYXZlIGFuIG9wZW4gc2Vzc2lvbiBhbmQgbVNlc3Npb25JRCBpcyB2YWxpZAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlc3Npb25PcGVuOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgbVJlc3BvbnNlOworCisgICAgTXRwU3RvcmFnZUxpc3QgICAgICBtU3RvcmFnZXM7CisKKyAgICAvLyBoYW5kbGUgZm9yIG5ldyBvYmplY3QsIHNldCBieSBTZW5kT2JqZWN0SW5mbyBhbmQgdXNlZCBieSBTZW5kT2JqZWN0CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtU2VuZE9iamVjdEhhbmRsZTsKKyAgICBNdHBTdHJpbmcgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGg7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoaW50IGZkLCBjb25zdCBjaGFyKiBkYXRhYmFzZVBhdGgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFNlcnZlcigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeyBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsgfQorICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2NhblN0b3JhZ2UoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJ1bigpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdCgpOworCisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZUluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvT3BlblNlc3Npb24oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvQ2xvc2VTZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0U3RvcmFnZUluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0SW5mbygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9EZWxldGVPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NFUlZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cE1lZGlhU2Nhbm5lci5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0b3JhZ2U6Ok10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKQorICAgIDogICBtU3RvcmFnZUlEKGlkKSwKKyAgICAgICAgbUZpbGVQYXRoKGZpbGVQYXRoKSwKKyAgICAgICAgbURhdGFiYXNlKGRiKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApCit7CisgICAgcHJpbnRmKCJNdHBTdG9yYWdlIGlkOiAlZCBwYXRoOiAlc1xuIiwgaWQsIGZpbGVQYXRoKTsKK30KKworTXRwU3RvcmFnZTo6fk10cFN0b3JhZ2UoKSB7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSVhFRF9SQU07Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUw7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFOworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRNYXhDYXBhY2l0eSgpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ID09IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1NYXhDYXBhY2l0eSA9ICh1aW50NjRfdClzdGF0LmZfYmxvY2tzICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1NYXhDYXBhY2l0eTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0RnJlZVNwYWNlKCkgeworICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXN0YXQuZl9iYXZhaWwgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworfQorCitjb25zdCBjaGFyKiBNdHBTdG9yYWdlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIkRldmljZSBTdG9yYWdlIjsKK30KKworYm9vbCBNdHBTdG9yYWdlOjpzY2FuRmlsZXMoKSB7CisgICAgTXRwTWVkaWFTY2FubmVyIHNjYW5uZXIobVN0b3JhZ2VJRCwgbUZpbGVQYXRoLCBtRGF0YWJhc2UpOworICAgIHJldHVybiBzY2FubmVyLnNjYW5GaWxlcygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5NzI3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TVE9SQUdFX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0gKKworI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworY2xhc3MgU3FsaXRlU3RhdGVtZW50OworCitjbGFzcyBNdHBTdG9yYWdlIHsKKworcHJpdmF0ZToKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgICAgICBtU3RvcmFnZUlEOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIG1GaWxlUGF0aDsKKyAgICBNdHBEYXRhYmFzZSogICAgICAgICAgICBtRGF0YWJhc2U7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbU1heENhcGFjaXR5OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBTdG9yYWdlKCk7CisKKyAgICBpbmxpbmUgTXRwU3RvcmFnZUlEICAgICBnZXRTdG9yYWdlSUQoKSBjb25zdCB7IHJldHVybiBtU3RvcmFnZUlEOyB9CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVTeXN0ZW1UeXBlKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0QWNjZXNzQ2FwYWJpbGl0eSgpIGNvbnN0OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldE1heENhcGFjaXR5KCk7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgZ2V0RnJlZVNwYWNlKCk7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb24oKSBjb25zdDsKKyAgICBpbmxpbmUgY29uc3QgY2hhciogICAgICBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gbUZpbGVQYXRoOyB9CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzY2FuRmlsZXMoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUT1JBR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MzA2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZUluZm8iCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdG9yYWdlSW5mbzo6TXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKQorICAgIDogICBtU3RvcmFnZUlEKGlkKSwKKyAgICAgICAgbVN0b3JhZ2VUeXBlKDApLAorICAgICAgICBtRmlsZVN5c3RlbVR5cGUoMCksCisgICAgICAgIG1BY2Nlc3NDYXBhYmlsaXR5KDApLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCksCisgICAgICAgIG1GcmVlU3BhY2VCeXRlcygwKSwKKyAgICAgICAgbUZyZWVTcGFjZU9iamVjdHMoMCksCisgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24oTlVMTCksCisgICAgICAgIG1Wb2x1bWVJZGVudGlmaWVyKE5VTEwpCit7Cit9CisKK010cFN0b3JhZ2VJbmZvOjp+TXRwU3RvcmFnZUluZm8oKSB7CisgICAgaWYgKG1TdG9yYWdlRGVzY3JpcHRpb24pCisgICAgICAgIGZyZWUobVN0b3JhZ2VEZXNjcmlwdGlvbik7CisgICAgaWYgKG1Wb2x1bWVJZGVudGlmaWVyKQorICAgICAgICBmcmVlKG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKwordm9pZCBNdHBTdG9yYWdlSW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworCisgICAgLy8gcmVhZCB0aGUgZGV2aWNlIGluZm8KKyAgICBtU3RvcmFnZVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUZpbGVTeXN0ZW1UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1BY2Nlc3NDYXBhYmlsaXR5ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1NYXhDYXBhY2l0eSA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICBtRnJlZVNwYWNlQnl0ZXMgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZU9iamVjdHMgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Wb2x1bWVJZGVudGlmaWVyID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBTdG9yYWdlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiU3RvcmFnZSBJbmZvICUwOFg6XG5cdG1TdG9yYWdlVHlwZTogJWRcblx0bUZpbGVTeXN0ZW1UeXBlOiAlZFxuXHRtQWNjZXNzQ2FwYWJpbGl0eTogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtU3RvcmFnZVR5cGUsIG1GaWxlU3lzdGVtVHlwZSwgbUFjY2Vzc0NhcGFiaWxpdHkpOworICAgIExPR0QoIlx0bU1heENhcGFjaXR5OiAlbGxkXG5cdG1GcmVlU3BhY2VCeXRlczogJWxsZFxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCisgICAgICAgICAgICBtTWF4Q2FwYWNpdHksIG1GcmVlU3BhY2VCeXRlcywgbUZyZWVTcGFjZU9iamVjdHMpOworICAgIExPR0QoIlx0bVN0b3JhZ2VEZXNjcmlwdGlvbjogJXNcblx0bVZvbHVtZUlkZW50aWZpZXI6ICVzXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiwgbVZvbHVtZUlkZW50aWZpZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I2MjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TVE9SQUdFX0lORk9fSAorI2RlZmluZSBfTVRQX1NUT1JBR0VfSU5GT19ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cFN0b3JhZ2VJbmZvIHsKK3B1YmxpYzoKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtU3RvcmFnZVR5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICBtRmlsZVN5c3RlbVR5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIG1GcmVlU3BhY2VCeXRlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzOworICAgIGNoYXIqICAgICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1Wb2x1bWVJZGVudGlmaWVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgaWQpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFN0b3JhZ2VJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUT1JBR0VfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTQ1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcigpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBtQnVmZmVyWzBdID0gMDsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgY2hhciogc3JjKQorICAgIDogICBtQ2hhckNvdW50KDApLAorICAgICAgICBtQnl0ZUNvdW50KDEpCit7CisgICAgc2V0KHNyYyk7Cit9CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3JjKQorICAgIDogICBtQ2hhckNvdW50KHNyYy5tQ2hhckNvdW50KSwKKyAgICAgICAgbUJ5dGVDb3VudChzcmMubUJ5dGVDb3VudCkKK3sKKyAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLm1CdWZmZXIsIG1CeXRlQ291bnQpOworfQorCisKK010cFN0cmluZ0J1ZmZlcjo6fk10cFN0cmluZ0J1ZmZlcigpIHsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OnNldChjb25zdCBjaGFyKiBzcmMpIHsKKyAgICBpbnQgbGVuZ3RoID0gc3RybGVuKHNyYyk7CisgICAgaWYgKGxlbmd0aCA+PSBzaXplb2YobUJ1ZmZlcikpCisgICAgICAgIGxlbmd0aCA9IHNpemVvZihtQnVmZmVyKSAtIDE7CisgICAgbWVtY3B5KG1CdWZmZXIsIHNyYywgbGVuZ3RoKTsKKworICAgIC8vIGNvdW50IHRoZSBjaGFyYWN0ZXJzCisgICAgaW50IGNvdW50ID0gMDsKKyAgICBjaGFyIGNoOworICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9IDApIHsKKyAgICAgICAgaWYgKChjaCAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgorICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKCEgKnNyYysrKSB7CisgICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4RjApID09IDB4RTApIHsKKyAgICAgICAgICAgIC8vIDMgYnl0ZSBjaGFyCisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCB0d28gYnl0ZXMKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3VudCsrOworICAgIH0KKworICAgIG1CeXRlQ291bnQgPSBsZW5ndGggKyAxOworICAgIG1CdWZmZXJbbGVuZ3RoXSA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6cmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSB7CisgICAgaW50IGNvdW50ID0gcGFja2V0LT5nZXRVSW50OCgpOworICAgIHVpbnQ4X3QqIGRlc3QgPSBtQnVmZmVyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB1aW50MTZfdCBjaCA9IHBhY2tldC0+Z2V0VUludDE2KCk7CisgICAgICAgIGlmIChjaCA+PSAweDA4MDApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhFMCB8IChjaCA+PiAxMikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKChjaCA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDgwKSB7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4QzAgfCAoY2ggPj4gNikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3QrKyA9IGNoOworICAgICAgICB9CisgICAgfQorICAgICpkZXN0KysgPSAwOworICAgIG1DaGFyQ291bnQgPSBjb3VudDsKKyAgICBtQnl0ZUNvdW50ID0gZGVzdCAtIG1CdWZmZXI7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjp3cml0ZVRvUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgY29uc3QgeworICAgIGludCBjb3VudCA9IG1DaGFyQ291bnQ7CisgICAgY29uc3QgdWludDhfdCogc3JjID0gbUJ1ZmZlcjsKKyAgICBwYWNrZXQtPnB1dFVJbnQ4KGNvdW50KTsKKworICAgIC8vIGV4cGFuZCB1dGY4IHRvIDE2IGJpdCBjaGFycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB1aW50MTZfdCBjaDsKKyAgICAgICAgdWludDE2X3QgY2gxID0gKnNyYysrOworICAgICAgICBpZiAoKGNoMSAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgY2ggPSBjaDE7CisgICAgICAgIH0gZWxzZSBpZiAoKGNoMSAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOworICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MUYpIDw8IDYpIHwgKGNoMiAmIDB4M0YpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhyZWUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMyA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDBGKSA8PCAxMikgfCAoKGNoMiAmIDB4M0YpIDw8IDYpIHwgKGNoMyAmIDB4M0YpOworICAgICAgICB9CisgICAgICAgIHBhY2tldC0+cHV0VUludDE2KGNoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmggYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MWMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUUklOR19CVUZGRVJfSAorI2RlZmluZSBfTVRQX1NUUklOR19CVUZGRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworLy8gUmVwcmVzZW50cyBhIHV0Zjggc3RyaW5nLCB3aXRoIGEgbWF4aW11bSBvZiAyNTUgY2hhcmFjdGVycworY2xhc3MgTXRwU3RyaW5nQnVmZmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBtYXhpbXVtIDMgYnl0ZXMvY2hhcmFjdGVyLCB3aXRoIDEgZXh0cmEgZm9yIHplcm8gdGVybWluYXRpb24KKyAgICB1aW50OF90ICAgICAgICAgbUJ1ZmZlclsyNTUgKiAzICsgMV07CisgICAgaW50ICAgICAgICAgICAgIG1DaGFyQ291bnQ7CisgICAgaW50ICAgICAgICAgICAgIG1CeXRlQ291bnQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpOworICAgIHZpcnR1YWwgICAgICAgICB+TXRwU3RyaW5nQnVmZmVyKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgc2V0KGNvbnN0IGNoYXIqIHNyYyk7CisKKyAgICB2b2lkICAgICAgICAgICAgcmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KTsKKyAgICB2b2lkICAgICAgICAgICAgd3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0OworCisgICAgaW5saW5lIGludCAgICAgIGdldENoYXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFyQ291bnQ7IH0KKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Qnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUJ5dGVDb3VudDsgfQorCisJaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltQnVmZmVyOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVFJJTkdfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBUeXBlcy5oIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzM2EyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBUeXBlcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1RZUEVTX0gKKyNkZWZpbmUgX01UUF9UWVBFU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ1dGlscy9TdHJpbmc4LmgiCisjaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiBpbnQzMl90IGludDEyOF90WzRdOwordHlwZWRlZiB1aW50MzJfdCB1aW50MTI4X3RbNF07CisKK3R5cGVkZWYgdWludDE2X3QgTXRwT3BlcmF0aW9uQ29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwUmVzcG9uc2VDb2RlOwordHlwZWRlZiB1aW50MzJfdCBNdHBTZXNzaW9uSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFN0b3JhZ2VJRDsKK3R5cGVkZWYgdWludDMyX3QgTXRwVHJhbnNhY3Rpb25JRDsKK3R5cGVkZWYgdWludDE2X3QgTXRwUHJvcGVydHlDb2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBEYXRhVHlwZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwT2JqZWN0Rm9ybWF0OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwRGV2aWNlUHJvcGVydHk7Cit0eXBlZGVmIE10cFByb3BlcnR5Q29kZSBNdHBPYmplY3RQcm9wZXJ0eTsKKworLy8gb2JqZWN0IGhhbmRsZXMgYXJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN0b3JhZ2UgYnV0IG9ubHkgd2l0aGluIGEgc2luZ2xlIHNlc3Npb24uCisvLyBvYmplY3QgaGFuZGxlcyBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGFuIG9iamVjdCBpcyBkZWxldGVkLgorLy8gdmFsdWVzIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYgYXJlIHJlc2VydmVkIGZvciBzcGVjaWFsIHB1cnBvc2VzLgordHlwZWRlZiB1aW50MzJfdCBNdHBPYmplY3RIYW5kbGU7CisKK3R5cGVkZWYgdW5pb24gTXRwUHJvcGVydHlWYWx1ZSB7CisgICAgaW50OF90ICAgICAgICAgIGk4OworICAgIHVpbnQ4X3QgICAgICAgICB1ODsKKyAgICBpbnQxNl90ICAgICAgICAgaTE2OworICAgIHVpbnQxNl90ICAgICAgICB1MTY7CisgICAgaW50MzJfdCAgICAgICAgIGkzMjsKKyAgICB1aW50MzJfdCAgICAgICAgdTMyOworICAgIGludDY0X3QgICAgICAgICBpNjQ7CisgICAgdWludDY0X3QgICAgICAgIHU2NDsKKyAgICBpbnQxMjhfdCAgICAgICAgaTEyODsKKyAgICB1aW50MTI4X3QgICAgICAgdTEyODsKKyAgICBjaGFyKiAgICAgICAgICAgc3RyOworfTsKKworLy8gU3BlY2lhbCB2YWx1ZXMKKyNkZWZpbmUgTVRQX1BBUkVOVF9ST09UICAgICAgICAgMHhGRkZGRkZGRiAgICAgICAvLyBwYXJlbnQgaXMgcm9vdCBvZiB0aGUgc3RvcmFnZQorI2RlZmluZSBrSW52YWxpZE9iamVjdEhhbmRsZSAgICAweEZGRkZGRkZGCisKKy8vIE10cE9iamVjdEhhbmRsZSBiaXRzIGFuZCBtYXNrcworI2RlZmluZSBrT2JqZWN0SGFuZGxlTWFya0JpdCAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8vIHVzZWQgZm9yIG1hcmsgJiBzd2VlcCBieSBNdHBNZWRpYVNjYW5uZXIKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlTWFzayAgICAgIDB4NzAwMDAwMDAgICAgICAvLyBtYXNrIGZvciBvYmplY3QgdGFibGUKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlRmlsZSAgICAgIDB4MDAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgb25seSBpbiB0aGUgZmlsZSB0YWJsZQorI2RlZmluZSBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgMHgxMDAwMDAwMCAgICAgIC8vIG9iamVjdCBpcyBpbiB0aGUgYXVkaW8gdGFibGUKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIDB4MjAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgaW4gdGhlIHZpZGVvIHRhYmxlCisjZGVmaW5lIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICAweDMwMDAwMDAwICAgICAgLy8gb2JqZWN0IGlzIGluIHRoZSBpbWFnZXMgdGFibGUKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlUGxheWxpc3QgIDB4NDAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgaW4gdGhlIHBsYXlsaXN0IHRhYmxlCisjZGVmaW5lIGtPYmplY3RIYW5kbGVJbmRleE1hc2sgICAgICAweDBGRkZGRkZGICAgICAgLy8gbWFzayBmb3Igb2JqZWN0IGluZGV4IGluIGZpbGUgdGFibGUKKworY2xhc3MgTXRwU3RvcmFnZTsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cFByb3BlcnR5OworCit0eXBlZGVmIFZlY3RvcjxNdHBTdG9yYWdlICo+IE10cFN0b3JhZ2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwRGV2aWNlKj4gTXRwRGV2aWNlTGlzdDsKK3R5cGVkZWYgVmVjdG9yPE10cFByb3BlcnR5Kj4gTXRwUHJvcGVydHlMaXN0OworCit0eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50MTZfdD4gVUludDE2TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ4X3Q+IEludDhMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50NjRfdD4gSW50NjRMaXN0OworCit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwRGV2aWNlUHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdEZvcm1hdExpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwT2JqZWN0SGFuZGxlTGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwU3RvcmFnZUlETGlzdDsKKwordHlwZWRlZiBTdHJpbmc4ICAgIE10cFN0cmluZzsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYTE2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCitEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKK3Rha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKK3JlcHJlc2VudGF0aW9uLCBZWVlZIHNoYWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB5ZWFyLCBNTSByZXBsYWNlZCBieSB0aGUgbW9udGggKDAxLTEyKSwKK0REIHJlcGxhY2VkIGJ5IHRoZSBkYXkgKDAxLTMxKSwgVCBpcyBhIGNvbnN0YW50IGNoYXJhY3RlciAnVCcgZGVsaW1pdGluZyB0aW1lIGZyb20gZGF0ZSwKK2hoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob3VyICgwMC0yMyksIG1tIGlzIHJlcGxhY2VkIGJ5IHRoZSBtaW51dGUgKDAwLTU5KSwgYW5kIHNzIGJ5IHRoZQorc2Vjb25kICgwMC01OSkuIFRoZSAiLnMiIGlzIG9wdGlvbmFsLCBhbmQgcmVwcmVzZW50cyB0ZW50aHMgb2YgYSBzZWNvbmQuCisqLworCitib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgY2hhciogZGF0ZVRpbWUsIHRpbWVfdCYgb3V0U2Vjb25kcykgeworICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKKyAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICBpZiAoc3NjYW5mKGRhdGVUaW1lLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCkgIT0gNikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGNoYXIqIHRhaWwgPSBkYXRlVGltZSArIDE1OworICAgIC8vIHNraXAgb3B0aW9uYWwgdGVudGggb2Ygc2Vjb25kCisgICAgaWYgKHRhaWxbMF0gPT0gJy4nICYmIHRhaWxbMV0pCisgICAgICAgIHRhaWwgKz0gMjsKKyAgICAvL0ZJWE1FIC0gc3VwcG9ydCArLy1oaG1tCisgICAgYm9vbCB1c2VVVEMgPSAodGFpbFswXSA9PSAnWicpOworCisgICAgLy8gaGFjayB0byBjb21wdXRlIHRpbWV6b25lCisgICAgdGltZV90IGR1bW15OworICAgIGxvY2FsdGltZV9yKCZkdW1teSwgJnRtKTsKKworICAgIHRtLnRtX3NlYyA9IHNlY29uZDsKKyAgICB0bS50bV9taW4gPSBtaW51dGU7CisgICAgdG0udG1faG91ciA9IGhvdXI7CisgICAgdG0udG1fbWRheSA9IGRheTsKKyAgICB0bS50bV9tb24gPSBtb250aDsKKyAgICB0bS50bV95ZWFyID0geWVhciAtIDE5MDA7CisgICAgdG0udG1fd2RheSA9IDA7CisgICAgdG0udG1faXNkc3QgPSAtMTsKKyAgICBpZiAodXNlVVRDKQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lKCZ0bSk7CisgICAgZWxzZQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lX3R6KCZ0bSwgdG0udG1fem9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKSB7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgbG9jYWx0aW1lX3IoJnNlY29uZHMsICZ0bSk7CisgICAgc25wcmludGYoYnVmZmVyLCBidWZmZXJMZW5ndGgsICIlMDRkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwKKyAgICAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpjb3B5IHRvIG1lZGlhL210cC9NdHBVdGlscy5oCmluZGV4IGZhYmQ5NTkuLjYxZjkwNTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDI1ICsxNCwxNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKyNpZm5kZWYgX01UUF9VVElMU19ICisjZGVmaW5lIF9NVFBfVVRJTFNfSAogCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjRmIHsKLSAgICBwdWJsaWMgVmVjdG9yNGYoKSB7Ci0gICAgfQorYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpOwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKTsKIAotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotICAgIHB1YmxpYyBmbG9hdCB3OwotfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotCi0KKyNlbmRpZiAvLyBfTVRQX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5jcHAgYi9tZWRpYS9tdHAvU3FsaXRlRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTU2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvU3FsaXRlRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJTcWxpdGVTdGF0ZW1lbnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3FsaXRlMy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NxbGl0ZURhdGFiYXNlOjpTcWxpdGVEYXRhYmFzZSgpCisgICAgOiAgIG1EYXRhYmFzZUhhbmRsZShOVUxMKQoreworfQorCitTcWxpdGVEYXRhYmFzZTo6flNxbGl0ZURhdGFiYXNlKCkgeworICAgIGNsb3NlKCk7Cit9CisKK2Jvb2wgU3FsaXRlRGF0YWJhc2U6Om9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpIHsKKyAgICBpbnQgZmxhZ3MgPSBTUUxJVEVfT1BFTl9SRUFEV1JJVEU7CisgICAgaWYgKGNyZWF0ZSkgZmxhZ3MgfD0gU1FMSVRFX09QRU5fQ1JFQVRFOworICAgIC8vIFNRTElURV9PUEVOX05PTVVURVg/CisgICAgaW50IHJldCA9IHNxbGl0ZTNfb3Blbl92MihwYXRoLCAmbURhdGFiYXNlSGFuZGxlLCBmbGFncywgTlVMTCk7CisgICAgaWYgKHJldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTcWxpdGVEYXRhYmFzZTo6Y2xvc2UoKSB7CisgICAgaWYgKG1EYXRhYmFzZUhhbmRsZSkgeworICAgICAgICBzcWxpdGUzX2Nsb3NlKG1EYXRhYmFzZUhhbmRsZSk7CisgICAgICAgIG1EYXRhYmFzZUhhbmRsZSA9IE5VTEw7CisgICAgfQorfQorCitib29sIFNxbGl0ZURhdGFiYXNlOjpleGVjKGNvbnN0IGNoYXIqIHNxbCkgeworICAgIHJldHVybiAoc3FsaXRlM19leGVjKG1EYXRhYmFzZUhhbmRsZSwgc3FsLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKTsKK30KKworaW50IFNxbGl0ZURhdGFiYXNlOjpsYXN0SW5zZXJ0ZWRSb3coKSB7CisgICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQobURhdGFiYXNlSGFuZGxlKTsKK30KKwordm9pZCBTcWxpdGVEYXRhYmFzZTo6YmVnaW5UcmFuc2FjdGlvbigpIHsKKyAgICBleGVjKCJCRUdJTiBUUkFOU0FDVElPTiIpOworfQorCit2b2lkIFNxbGl0ZURhdGFiYXNlOjpjb21taXRUcmFuc2FjdGlvbigpIHsKKyAgICBleGVjKCJDT01NSVQgVFJBTlNBQ1RJT04iKTsKK30KKwordm9pZCBTcWxpdGVEYXRhYmFzZTo6cm9sbGJhY2tUcmFuc2FjdGlvbigpIHsKKyAgICBleGVjKCJST0xMQkFDSyBUUkFOU0FDVElPTiIpOworfQorCitpbnQgU3FsaXRlRGF0YWJhc2U6OmdldFZlcnNpb24oKSB7CisgICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7CisgICAgc3RtdC5wcmVwYXJlKCJQUkFHTUEgdXNlcl92ZXJzaW9uOyIpOworICAgIHN0bXQuc3RlcCgpOworICAgIHJldHVybiBzdG10LmdldENvbHVtbkludCgwKTsKK30KK3ZvaWQgU3FsaXRlRGF0YWJhc2U6OnNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKKyAgICBjaGFyICAgIGJ1ZmZlcls0MF07CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlBSQUdNQSB1c2VyX3ZlcnNpb24gPSAlZCIsIHZlcnNpb24pOworICAgIGV4ZWMoYnVmZmVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5oIGIvbWVkaWEvbXRwL1NxbGl0ZURhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkZDlkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TUUxJVEVfREFUQUJBU0VfSAorI2RlZmluZSBfU1FMSVRFX0RBVEFCQVNFX0gKKwordHlwZWRlZiBzdHJ1Y3Qgc3FsaXRlMyBzcWxpdGUzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNxbGl0ZURhdGFiYXNlIHsKK3ByaXZhdGU6CisgICAgc3FsaXRlMyogICAgICAgIG1EYXRhYmFzZUhhbmRsZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBTcWxpdGVEYXRhYmFzZSgpOworICAgIHZpcnR1YWwgICAgICAgICB+U3FsaXRlRGF0YWJhc2UoKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICBvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGJvb2wgY3JlYXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgY2xvc2UoKTsKKworICAgIGJvb2wgICAgICAgICAgICBleGVjKGNvbnN0IGNoYXIqIHNxbCk7CisgICAgaW50ICAgICAgICAgICAgIGxhc3RJbnNlcnRlZFJvdygpOworCisgICAgdm9pZCAgICAgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICB2b2lkICAgICAgICAgICAgY29tbWl0VHJhbnNhY3Rpb24oKTsKKyAgICB2b2lkICAgICAgICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbigpOworCisgICAgaW50ICAgICAgICAgICAgIGdldFZlcnNpb24oKTsKKyAgICB2b2lkICAgICAgICAgICAgc2V0VmVyc2lvbihpbnQgdmVyc2lvbik7CisKKyAgICBpbmxpbmUgc3FsaXRlMyogZ2V0RGF0YWJhc2VIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtRGF0YWJhc2VIYW5kbGU7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfU1FMSVRFX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuY3BwIGIvbWVkaWEvbXRwL1NxbGl0ZVN0YXRlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3FsaXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3FsaXRlMy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NxbGl0ZVN0YXRlbWVudDo6U3FsaXRlU3RhdGVtZW50KFNxbGl0ZURhdGFiYXNlKiBkYikKKyAgICA6ICAgbURhdGFiYXNlSGFuZGxlKGRiLT5nZXREYXRhYmFzZUhhbmRsZSgpKSwKKyAgICAgICAgbVN0YXRlbWVudChOVUxMKSwKKyAgICAgICAgbURvbmUoZmFsc2UpCit7Cit9CisKK1NxbGl0ZVN0YXRlbWVudDo6flNxbGl0ZVN0YXRlbWVudCgpIHsKKyAgICBmaW5hbGl6ZSgpOworfQorCitib29sIFNxbGl0ZVN0YXRlbWVudDo6cHJlcGFyZShjb25zdCBjaGFyKiBzcWwpIHsKKyAgICByZXR1cm4gKHNxbGl0ZTNfcHJlcGFyZV92MihtRGF0YWJhc2VIYW5kbGUsIHNxbCwgLTEsICZtU3RhdGVtZW50LCBOVUxMKSA9PSAwKTsKK30KKworYm9vbCBTcWxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKSB7CisgICAgaW50IHJldCA9IHNxbGl0ZTNfc3RlcChtU3RhdGVtZW50KTsKKyAgICBpZiAocmV0ID09IFNRTElURV9ET05FKSB7CisgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiAocmV0ID09IFNRTElURV9PSyB8fCByZXQgPT0gU1FMSVRFX1JPVyk7Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpyZXNldCgpIHsKKyAgICBzcWxpdGUzX3Jlc2V0KG1TdGF0ZW1lbnQpOworICAgIG1Eb25lID0gZmFsc2U7Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpmaW5hbGl6ZSgpIHsKKyAgICBpZiAobVN0YXRlbWVudCkgeworICAgICAgICBzcWxpdGUzX2ZpbmFsaXplKG1TdGF0ZW1lbnQpOworICAgICAgICBtU3RhdGVtZW50ID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpiaW5kKGludCBjb2x1bW4sIGludCB2YWx1ZSkgeworICAgIHNxbGl0ZTNfYmluZF9pbnQobVN0YXRlbWVudCwgY29sdW1uLCB2YWx1ZSk7Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpiaW5kKGludCBjb2x1bW4sIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgc3FsaXRlM19iaW5kX3RleHQobVN0YXRlbWVudCwgY29sdW1uLCB2YWx1ZSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOworfQorCitpbnQgU3FsaXRlU3RhdGVtZW50OjpnZXRDb2x1bW5JbnQoaW50IGNvbHVtbikgeworICAgIHJldHVybiBzcWxpdGUzX2NvbHVtbl9pbnQobVN0YXRlbWVudCwgY29sdW1uKTsKK30KKworaW50NjRfdCBTcWxpdGVTdGF0ZW1lbnQ6OmdldENvbHVtbkludDY0KGludCBjb2x1bW4pIHsKKyAgICByZXR1cm4gc3FsaXRlM19jb2x1bW5faW50NjQobVN0YXRlbWVudCwgY29sdW1uKTsKK30KKworY29uc3QgY2hhciogU3FsaXRlU3RhdGVtZW50OjpnZXRDb2x1bW5TdHJpbmcoaW50IGNvbHVtbikgeworICAgIHJldHVybiAoY29uc3QgY2hhciAqKXNxbGl0ZTNfY29sdW1uX3RleHQobVN0YXRlbWVudCwgY29sdW1uKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuaCBiL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGViZmZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL1NxbGl0ZVN0YXRlbWVudC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TUUxJVEVfU1RBVEVNRU5UX0gKKyNkZWZpbmUgX1NRTElURV9TVEFURU1FTlRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNxbGl0ZTMgc3FsaXRlMzsKK3R5cGVkZWYgc3RydWN0IHNxbGl0ZTNfc3RtdCBzcWxpdGUzX3N0bXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3FsaXRlRGF0YWJhc2U7CisKK2NsYXNzIFNxbGl0ZVN0YXRlbWVudCB7Citwcml2YXRlOgorICAgIHNxbGl0ZTMqICAgICAgICBtRGF0YWJhc2VIYW5kbGU7CisgICAgc3FsaXRlM19zdG10KiAgIG1TdGF0ZW1lbnQ7CisgICAgYm9vbCAgICAgICAgICAgIG1Eb25lOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIFNxbGl0ZVN0YXRlbWVudChTcWxpdGVEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICB+U3FsaXRlU3RhdGVtZW50KCk7CisKKyAgICBib29sICAgICAgICAgICAgcHJlcGFyZShjb25zdCBjaGFyKiBzcWwpOworICAgIGJvb2wgICAgICAgICAgICBzdGVwKCk7CisgICAgdm9pZCAgICAgICAgICAgIHJlc2V0KCk7CisgICAgdm9pZCAgICAgICAgICAgIGZpbmFsaXplKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgYmluZChpbnQgY29sdW1uLCBpbnQgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICBiaW5kKGludCBjb2x1bW4sIGNvbnN0IGNoYXIqIHZhbHVlKTsKKworICAgIGludCAgICAgICAgICAgICBnZXRDb2x1bW5JbnQoaW50IGNvbHVtbik7CisgICAgaW50NjRfdCAgICAgICAgIGdldENvbHVtbkludDY0KGludCBjb2x1bW4pOworICAgIGNvbnN0IGNoYXIqICAgICBnZXRDb2x1bW5TdHJpbmcoaW50IGNvbHVtbik7CisKKyAgICBpbmxpbmUgYm9vbCAgICAgaXNEb25lKCkgY29uc3QgeyByZXR1cm4gbURvbmU7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfU1FMSVRFX1NUQVRFTUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvZl9tdHAuaCBiL21lZGlhL210cC9mX210cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzlhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvZl9tdHAuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogR2FkZ2V0IEZ1bmN0aW9uIERyaXZlciBmb3IgTVRQCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSwgSW5jLgorICogQXV0aG9yOiBNaWtlIExvY2t3b29kIDxsb2Nrd29vZEBhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX0ZfTVRQX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfRl9NVFBfSAorCisvKiBDb25zdGFudHMgZm9yIE1UUF9TRVRfSU5URVJGQUNFX01PREUgKi8KKyNkZWZpbmUgTVRQX0lOVEVSRkFDRV9NT0RFX01UUCAgMAorI2RlZmluZSBNVFBfSU5URVJGQUNFX01PREVfUFRQICAxCisKKworc3RydWN0IG10cF9maWxlX3JhbmdlIHsKKwkvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIGZpbGUgdG8gdHJhbnNmZXIgKi8KKwlpbnQJCQlmZDsKKwkvKiBvZmZzZXQgaW4gZmlsZSBmb3Igc3RhcnQgb2YgdHJhbnNmZXIgKi8KKwlsb2ZmX3QgIAlvZmZzZXQ7CisJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyICovCisJc2l6ZV90CQlsZW5ndGg7Cit9OworCisvKiBTZW5kcyB0aGUgc3BlY2lmaWVkIGZpbGUgcmFuZ2UgdG8gdGhlIGhvc3QgKi8KKyNkZWZpbmUgTVRQX1NFTkRfRklMRSAgICAgICAgICAgICAgX0lPVygnTScsIDAsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKy8qIFJlY2VpdmVzIGRhdGEgZnJvbSB0aGUgaG9zdCBhbmQgd3JpdGVzIGl0IHRvIGEgZmlsZS4KKyAqIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKi8KKyNkZWZpbmUgTVRQX1JFQ0VJVkVfRklMRSAgICAgICAgICAgX0lPVygnTScsIDEsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKy8qIFNldHMgdGhlIGRyaXZlciBtb2RlIHRvIGVpdGhlciBNVFAgb3IgUFRQICovCisjZGVmaW5lIE1UUF9TRVRfSU5URVJGQUNFX01PREUgICAgIF9JT1coJ00nLCAyLCBpbnQpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9GX01UUF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvbXRwLmggYi9tZWRpYS9tdHAvbXRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0Y2ZiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9tdHAuaApAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ICisjZGVmaW5lIF9NVFBfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgTVRQX1NUQU5EQVJEX1ZFUlNJT04gICAgICAgICAgICAxMDAKKworLy8gQ29udGFpbmVyIFR5cGVzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9VTkRFRklORUQgICAgMAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCAgICAgIDEKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEgICAgICAgICAyCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9SRVNQT05TRSAgICAgMworI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfRVZFTlQgICAgICAgIDQKKworLy8gQ29udGFpbmVyIE9mZnNldHMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VUICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQgICAgIDgKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICAgICAgICAgIDEyCisjZGVmaW5lIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAxMgorCisvLyBNVFAgVHlwZXMKKyNkZWZpbmUgTVRQX1RZUEVfVU5ERUZJTkVEICAgICAgMHgwMDAwICAgICAgICAgIC8vIFVuZGVmaW5lZAorI2RlZmluZSBNVFBfVFlQRV9JTlQ4ICAgICAgICAgICAweDAwMDEgICAgICAgICAgLy8gU2lnbmVkIDgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDggICAgICAgICAgMHgwMDAyICAgICAgICAgIC8vIFVuc2lnbmVkIDgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UMTYgICAgICAgICAgMHgwMDAzICAgICAgICAgIC8vIFNpZ25lZCAxNi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMTYgICAgICAgICAweDAwMDQgICAgICAgICAgLy8gVW5zaWduZWQgMTYtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UMzIgICAgICAgICAgMHgwMDA1ICAgICAgICAgIC8vIFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMzIgICAgICAgICAweDAwMDYgICAgICAgICAgLy8gVW5zaWduZWQgMzItYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UNjQgICAgICAgICAgMHgwMDA3ICAgICAgICAgIC8vIFNpZ25lZCA2NC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UNjQgICAgICAgICAweDAwMDggICAgICAgICAgLy8gVW5zaWduZWQgNjQtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UMTI4ICAgICAgICAgMHgwMDA5ICAgICAgICAgIC8vIFNpZ25lZCAxMjgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDEyOCAgICAgICAgMHgwMDBBICAgICAgICAgIC8vIFVuc2lnbmVkIDEyOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9BSU5UOCAgICAgICAgICAweDQwMDEgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UOCAgICAgICAgIDB4NDAwMiAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMTYgICAgICAgICAweDQwMDMgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDE2ICAgICAgICAweDQwMDQgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMTYtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQzMiAgICAgICAgIDB4NDAwNSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMzItYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMzIgICAgICAgIDB4NDAwNiAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDY0ICAgICAgICAgMHg0MDA3ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCA2NC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQ2NCAgICAgICAgMHg0MDA4ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMTI4ICAgICAgICAweDQwMDkgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDEyOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQxMjggICAgICAgMHg0MDBBICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDEyOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfU1RSICAgICAgICAgICAgMHhGRkZGICAgICAgICAgIC8vIFZhcmlhYmxlLWxlbmd0aCBVbmljb2RlIHN0cmluZworCisvLyBNVFAgRm9ybWF0IENvZGVzCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMCAgIC8vIFVuZGVmaW5lZCBvYmplY3QKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxICAgLy8gQXNzb2NpYXRpb24gKGZvciBleGFtcGxlLCBhIGZvbGRlcikKKyNkZWZpbmUgTVRQX0ZPUk1BVF9TQ1JJUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAyICAgLy8gRGV2aWNlIG1vZGVsLXNwZWNpZmljIHNjcmlwdAorI2RlZmluZSBNVFBfRk9STUFUX0VYRUNVVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDMgICAvLyBEZXZpY2UgbW9kZWwtc3BlY2lmaWMgYmluYXJ5IGV4ZWN1dGFibGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA0ICAgLy8gVGV4dCBmaWxlCisjZGVmaW5lIE1UUF9GT1JNQVRfSFRNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNSAgIC8vIEh5cGVydGV4dCBNYXJrdXAgTGFuZ3VhZ2UgZmlsZSAodGV4dCkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9EUE9GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA2ICAgLy8gRGlnaXRhbCBQcmludCBPcmRlciBGb3JtYXQgZmlsZSAodGV4dCkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BSUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA3ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX1dBViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDggICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfTVAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOSAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BVkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBBICAgLy8gVmlkZW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX01QRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEIgICAvLyBWaWRlbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfQVNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQyAgIC8vIE1pY3Jvc29mdCBBZHZhbmNlZCBTdHJlYW1pbmcgRm9ybWF0ICh2aWRlbykKKyNkZWZpbmUgTVRQX0ZPUk1BVF9ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAwICAgLy8gVW5rbm93biBpbWFnZSBvYmplY3QKKyNkZWZpbmUgTVRQX0ZPUk1BVF9FWElGX0pQRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxICAgLy8gRXhjaGFuZ2VhYmxlIEZpbGUgRm9ybWF0LCBKRUlEQSBzdGFuZGFyZAorI2RlZmluZSBNVFBfRk9STUFUX1RJRkZfRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDIgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQgZm9yIEVsZWN0cm9uaWMgUGhvdG9ncmFwaHkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9GTEFTSFBJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAzICAgLy8gU3RydWN0dXJlZCBTdG9yYWdlIEltYWdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDQgICAvLyBNaWNyb3NvZnQgV2luZG93cyBCaXRtYXAgZmlsZQorI2RlZmluZSBNVFBfRk9STUFUX0NJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDUgICAvLyBDYW5vbiBDYW1lcmEgSW1hZ2UgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9HSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA3ICAgLy8gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfSkZJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOCAgIC8vIEpQRUcgRmlsZSBJbnRlcmNoYW5nZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9DRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA5ICAgLy8gUGhvdG9DRCBJbWFnZSBQYWMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QSUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBBICAgLy8gUXVpY2tkcmF3IEltYWdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1BORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEIgICAvLyBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzCisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRCAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1RJRkZfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEUgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQgZm9yIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgKGdyYXBoaWMgYXJ0cykKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBGICAgLy8gSlBFRzIwMDAgQmFzZWxpbmUgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KUFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEwICAgLy8gSlBFRzIwMDAgRXh0ZW5kZWQgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUgICAgICAgICAgICAgICAgICAgMHhCODAyCisjZGVmaW5lIE1UUF9GT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgICAgICAgICAgICAgICAgIDB4Qjg4MQorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyAgICAgICAgICAgICAgICAgICAgICAweEI5MDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAxCisjZGVmaW5lIE1UUF9GT1JNQVRfT0dHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMgorI2RlZmluZSBNVFBfRk9STUFUX0FBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BVURJQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA0CisjZGVmaW5lIE1UUF9GT1JNQVRfRkxBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTyAgICAgICAgICAgICAgICAgICAgICAweEI5ODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgxCisjZGVmaW5lIE1UUF9GT1JNQVRfTVA0X0NPTlRBSU5FUiAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MiAgLy8gSVNPIDE0NDk2LTEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgzCisjZGVmaW5lIE1UUF9GT1JNQVRfM0dQX0NPTlRBSU5FUiAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4NCAgLy8gM0dQUCBmaWxlIGZvcm1hdC4gRGV0YWlsczogaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvaHRtbC1pbmZvLzI2MjQ0Lmh0bSAocGFnZSB0aXRsZSAtIFx1MjAxY1RyYW5zcGFyZW50IGVuZC10by1lbmQgcGFja2V0IHN3aXRjaGVkIHN0cmVhbWluZyBzZXJ2aWNlLCAzR1BQIGZpbGUgZm9ybWF0XHUyMDFkKS4KKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiAgICAgICAgICAgICAgICAgMHhCQTAwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSAgICAgICAgICAgIDB4QkEwMQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0lNQUdFX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTAzCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwNAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUICAgICAgICAgICAgICAgICAweEJBMDUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQICAgICAgICAgICAgICAgMHhCQTA2CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIgICAgICAgICAgICAgIDB4QkEwNworI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OICAgICAgICAweEJBMDgKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19QTEFZTElTVCAgICAgICAgICAgICAgMHhCQTA5CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QgICAgICAgICAgICAgIDB4QkEwQQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVCAgICAgICAgICAgICAgICAgICAweEJBMEIgLy8gRm9yIHVzZSB3aXRoIG1lZGlhY2FzdHM7IHJlZmVyZW5jZXMgbXVsdGltZWRpYSBlbmNsb3N1cmVzIG9mIFJTUyBmZWVkcyBvciBlcGlzb2RpYyBjb250ZW50CisjZGVmaW5lIE1UUF9GT1JNQVRfV1BMX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMAorI2RlZmluZSBNVFBfRk9STUFUX00zVV9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUExfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEyCisjZGVmaW5lIE1UUF9GT1JNQVRfQVNYX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMworI2RlZmluZSBNVFBfRk9STUFUX1BMU19QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgMHhCQTgwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgIDB4QkE4MQorI2RlZmluZSBNVFBfRk9STUFUX1hNTF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBODIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19XT1JEX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAgMHhCQTgzCisjZGVmaW5lIE1UUF9GT1JNQVRfTUhUX0NPTVBJTEVEX0hUTUxfRE9DVU1FTlQgICAgICAgICAgIDB4QkE4NAorI2RlZmluZSBNVFBfRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUICAgICAgICAgICAgICAgICAweEJBODUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTiAgICAgICAgICAgMHhCQTg2CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX01FU1NBR0UgICAgICAgICAgICAgICAgICAgIDB4QkIwMAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFICAgICAgICAgICAgICAgICAgICAweEJCMDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQ09OVEFDVCAgICAgICAgICAgICAgICAgICAgMHhCQjgwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVCAgICAgICAgICAgICAgICAgICAgIDB4QkI4MQorI2RlZmluZSBNVFBfRk9STUFUX1ZDQVJEXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEJCODIKKworLy8gTVRQIE9iamVjdCBQcm9wZXJ0eSBDb2RlcworI2RlZmluZSBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4REMwMworI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAweERDMDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX0RFU0MgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0NSRUFURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfS0VZV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMTE9XRURfRk9MREVSX0NPTlRFTlRTICAgICAgICAgICAgICAgIDB4REMwQworI2RlZmluZSBNVFBfUFJPUEVSVFlfSElEREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TWVNURU1fT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BFUlNJU1RFTlRfVUlEICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1lOQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9QRVJUWV9CQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ1JFQVRFRF9CWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQVVUSE9SRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NworI2RlZmluZSBNVFBfUFJPUEVSVFlfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfUkVGRVJFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBTkdVQUdFX0xPQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OICAgICAgICAgICAgICAgICAgMHhEQzRCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SSUdJTl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9BRERFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OT05fQ09OU1VNQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPUlJVUFRfVU5QTEFZQUJMRSAgICAgICAgICAgICAgICAgICAgIDB4REM1MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgMHhEQzUxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUICAgICAgICAgICAweERDODEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFICAgICAgICAgICAgIDB4REM4MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0hFSUdIVCAgICAgICAgICAgMHhEQzgzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfV0lEVEggICAgICAgICAgICAweERDODQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiAgICAgICAgIDB4REM4NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RBVEEgICAgICAgICAgICAgMHhEQzg2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRFVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RSQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfR0VOUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DUkVESVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xZUklDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCU0NSSVBUSU9OX0NPTlRFTlRfSUQgICAgICAgICAgICAgICAgMHhEQzhGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9EVUNFRF9CWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VTRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU0tJUF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQVNUX0FDQ0VTU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBUkVOVEFMX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVUQV9HRU5SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT01QT1NFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VGRkVDVElWRV9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NworI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCVElUTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUgICAgICAgICAgICAgICAgICAweERDOTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMQlVNX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxCVU1fQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NT09EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JU19DUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgIDB4RENEMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9UT1RBTF9CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JJVFJBVEVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfU0FNUExFX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OVU1CRVJfT0ZfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAweERFOTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX0JJVF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19XQVZFX0NPREVDICAgICAgICAgICAgICAgICAgICAgICAweERFOTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVklERU9fRk9VUkNDX0NPREVDICAgICAgICAgICAgICAgICAgICAgMHhERTlCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9WSURFT19CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyAgICAgICAgICAgIDB4REU5RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfS0VZRlJBTUVfRElTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHhERTlFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VOQ09ESU5HX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgMHhERUExCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ESVNQTEFZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JPRFlfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0dJVkVOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUlERExFX05BTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSRUZJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMworI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VGRklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19HSVZFTl9OQU1FICAgICAgICAgICAgICAgICAgICAweEREMDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX0ZBTUlMWV9OQU1FICAgICAgICAgICAgICAgICAgIDB4REQwNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8xICAgICAgICAgICAgICAgICAgICAgICAweEREMDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMSAgICAgICAgICAgICAgICAgICAgICAgMHhERDBBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18yICAgICAgICAgICAgICAgICAgICAgICAweEREMEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX09USEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgMHhERDBECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUwgICAgICAgICAgICAgICAgICAweEREMEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTF8yICAgICAgICAgICAgICAgIDB4REQwRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTICAgICAgICAgICAgICAgICAgMHhERDEwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1NfMiAgICAgICAgICAgICAgICAweEREMTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEUgICAgICAgICAgICAgICAgICAgIDB4REQxMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRV8yICAgICAgICAgICAgICAgICAgMHhERDEzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgICAweEREMTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUEVSU09OQUwgICAgICAgICAgICAgICAgICAgIDB4REQxNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9CVVNJTkVTUyAgICAgICAgICAgICAgICAgICAgMHhERDE2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQUdFUl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9PVEhFUlMgICAgICAgICAgICAgICAgICAgIDB4REQxOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJJTUFSWV9XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHhERDE5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweEREMUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JVU0lORVNTX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4REQxQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTUyAgICAgICAgICAgICAgMHhERDFDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzIgICAgICAgICAgICAweEREMUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMyAgICAgICAgICAgIDB4REQxRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCAgICAgICAgICAgMHhERDFGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEgICAgICAgICAweEREMjAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMiAgICAgICAgIDB4REQyMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ0lUWSAgICAgICAgICAgMHhERDIyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9SRUdJT04gICAgICAgICAweEREMjMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFICAgIDB4REQyNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ09VTlRSWSAgICAgICAgMHhERDI1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19GVUxMICAgICAgICAgICAweEREMjYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMSAgICAgICAgIDB4REQyNworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yICAgICAgICAgMHhERDI4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DSVRZICAgICAgICAgICAweEREMjkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1JFR0lPTiAgICAgICAgIDB4REQyQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUE9TVEFMX0NPREUgICAgMHhERDJCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DT1VOVFJZICAgICAgICAweEREMkMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0ZVTEwgICAgICAgICAgICAgIDB4REQyRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8xICAgICAgICAgICAgMHhERDJFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzIgICAgICAgICAgICAweEREMkYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkgICAgICAgICAgICAgIDB4REQzMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OICAgICAgICAgICAgMHhERDMxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9QT1NUQUxfQ09ERSAgICAgICAweEREMzIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkgICAgICAgICAgIDB4REQzMworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUgICAgICAgICAgICAgICAgICAgICAgMHhERDM0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19PUkdBTklaQVRJT05fTkFNRSAgICAgICAgICAgICAweEREMzUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JPTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQklSVEhEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9CQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfUkVDRUlWRURfVElNRSAgICAgICAgICAgICAgICAgIDB4REQ0NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQ1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9CRUdJTl9USU1FICAgICAgICAgICAgICAgICAgICAweERENTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0VORF9USU1FICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgMHhERDUyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMgICAgICAgICAgICAweERENTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX09QVElPTkFMX0FUVEVOREVFUyAgICAgICAgICAgIDB4REQ1NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgMHhERDU2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCAgICAgICAgICAgICAgICAgICAgICAweERENTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1RFTlRBVElWRSAgICAgICAgICAgICAgICAgICAgIDB4REQ1OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQgICAgICAgICAgICAgICAgICAgICAgMHhERDU5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRU1BSU5ERVJfVElNRSAgICAgICAgICAgICAgICAweERENUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX09XTkVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PV05FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VESVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfV0VCTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVElNRV9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAweERENjMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JZVEVfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFTVF9CVUlMRF9EQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9USU1FX1RPX0xJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FRElBX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MgorCisvLyBNVFAgRGV2aWNlIFByb3BlcnR5IENvZGVzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAweDUwMDAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMICAgICAgICAgICAgICAgICAgIDB4NTAwMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZVTkNUSU9OQUxfTU9ERSAgICAgICAgICAgICAgICAgMHg1MDAyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfSU1BR0VfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDUwMDMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT01QUkVTU0lPTl9TRVRUSU5HICAgICAgICAgICAgIDB4NTAwNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UgICAgICAgICAgICAgICAgICAgMHg1MDA1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUkdCX0dBSU4gICAgICAgICAgICAgICAgICAgICAgICAweDUwMDYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMHg1MDA4CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfRElTVEFOQ0UgICAgICAgICAgICAgICAgICAweDUwMDkKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX01FVEVSSU5HX01PREUgICAgICAgICAgMHg1MDBCCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDUwMEMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9USU1FICAgICAgICAgICAgICAgICAgIDB4NTAwRAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1BST0dSQU1fTU9ERSAgICAgICAgICAgMHg1MDBFCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggICAgICAgICAgICAgICAgICAweDUwMEYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9CSUFTX0NPTVBFTlNBVElPTiAgICAgIDB4NTAxMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDExCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ0FQVFVSRV9ERUxBWSAgICAgICAgICAgICAgICAgICAweDUwMTIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUgICAgICAgICAgICAgIDB4NTAxMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU0hBUlBORVNTICAgICAgICAgICAgICAgICAgICAgICAweDUwMTUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ESUdJVEFMX1pPT00gICAgICAgICAgICAgICAgICAgIDB4NTAxNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VGRkVDVF9NT0RFICAgICAgICAgICAgICAgICAgICAgMHg1MDE3CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfTlVNQkVSICAgICAgICAgICAgICAgICAgICAweDUwMTgKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgIDB4NTAxOQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9OVU1CRVIgICAgICAgICAgICAgICAgMHg1MDFBCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMICAgICAgICAgICAgICAweDUwMUIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFICAgICAgICAgICAgIDB4NTAxQworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1VQTE9BRF9VUkwgICAgICAgICAgICAgICAgICAgICAgMHg1MDFECisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMUUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT1BZUklHSFRfSU5GTyAgICAgICAgICAgICAgICAgIDB4NTAxRgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSICAgICAgICAgMHhENDAxCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUgICAgICAgICAgICAweEQ0MDIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9WT0xVTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RDQwMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NVUFBPUlRFRF9GT1JNQVRTX09SREVSRUQgICAgICAgMHhENDA0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04gICAgICAgICAgICAgICAgICAgICAweEQ0MDUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19SQVRFICAgICAgICAgICAgICAgICAgIDB4RDQxMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCAgICAgICAgICAgICAgICAgMHhENDExCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYICAgICAgICAweEQ0MTIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8gIDB4RDQwNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSAgICAgICAgICAgMHhENDA3CisKKy8vIE1UUCBPcGVyYXRpb24gQ29kZXMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8gICAgICAgICAgICAgICAgICAgICAgMHgxMDA1CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTICAgICAgICAgICAgICAgICAgICAgICAweDEwMDYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMgICAgICAgICAgICAgICAgICAgIDB4MTAwNworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA4CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDkKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfVEhVTUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBCCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAweDEwMEMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUgICAgICAgICAgICAgICAgICAgICAgMHgxMDBFCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDExCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OICAgICAgICAgICAgICAgICAweDEwMTIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDICAgICAgICAgICAgICAgICAgMHgxMDE0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDEwMTUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4MTAxNgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgMHgxMDE3CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSAgICAgICAgICAgICAgICAweDEwMTgKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxOQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDFBCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNUICAgICAgICAgICAgICAgICAgICAweDEwMUIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUgICAgICAgICAgICAgICAgIDB4MTAxQworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEICAgICAgICAgICAgMHg5ODAxCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MgICAgICAgICAgICAgICAgICAweDk4MDIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4OTgwMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHg5ODA0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTICAgICAgICAgICAgICAgICAweDk4MTAKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMgICAgICAgICAgICAgICAgIDB4OTgxMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NLSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ODIwCisKKy8vIE1UUCBSZXNwb25zZSBDb2RlcworI2RlZmluZSBNVFBfUkVTUE9OU0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBNVFBfUkVTUE9OU0VfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMQorI2RlZmluZSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9UUkFOU0FDVElPTl9JRCAgICAgICAgICAgICAgICAgICAgIDB4MjAwNAorI2RlZmluZSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgIDB4MjAwNQorI2RlZmluZSBNVFBfUkVTUE9OU0VfUEFSQU1FVEVSX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgIDB4MjAwNgorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5DT01QTEVURV9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwNworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwOAorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFICAgICAgICAgICAgICAgICAgICAgIDB4MjAwOQorI2RlZmluZSBNVFBfUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgIDB4MjAwQQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfRk9STUFUX0NPREUgICAgICAgICAgICAgICAgIDB4MjAwQgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1RPUkFHRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwQworI2RlZmluZSBNVFBfUkVTUE9OU0VfT0JKRUNUX1dSSVRFX1BST1RFQ1RFRCAgICAgICAgICAgICAgICAgICAgIDB4MjAwRAorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1RPUkVfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwRQorI2RlZmluZSBNVFBfUkVTUE9OU0VfQUNDRVNTX0RFTklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwRgorI2RlZmluZSBNVFBfUkVTUE9OU0VfTk9fVEhVTUJOQUlMX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMAorI2RlZmluZSBNVFBfUkVTUE9OU0VfU0VMRl9URVNUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMQorI2RlZmluZSBNVFBfUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1RPUkVfTk9UX0FWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMworI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9GT1JNQVRfVU5TVVBQT1JURUQgICAgICAgIDB4MjAxNAorI2RlZmluZSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MjAxNQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9DT0RFX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxNgorI2RlZmluZSBNVFBfUkVTUE9OU0VfVU5LTk9XTl9WRU5ET1JfQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxNworI2RlZmluZSBNVFBfUkVTUE9OU0VfQ0FQVFVSRV9BTFJFQURZX1RFUk1JTkFURUQgICAgICAgICAgICAgICAgIDB4MjAxOAorI2RlZmluZSBNVFBfUkVTUE9OU0VfREVWSUNFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxOQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJFTlRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgIDB4MjAxQQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQgICAgICAgICAgICAgICAgIDB4MjAxQgorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MjAxQworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxRAorI2RlZmluZSBNVFBfUkVTUE9OU0VfU0VTU0lPTl9BTFJFQURZX09QRU4gICAgICAgICAgICAgICAgICAgICAgIDB4MjAxRQorI2RlZmluZSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MjAxRgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9PRl9ERVNUSU5BVElPTl9VTlNVUFBPUlRFRCAgIDB4MjAyMAorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9DT0RFICAgICAgICAgICAgICAgICAgIDB4QTgwMQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQgICAgICAgICAgICAgICAgIDB4QTgwMgorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4QTgwMworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUkVGRVJFTkNFICAgICAgICAgICAgICAgICAgIDB4QTgwNAorI2RlZmluZSBNVFBfUkVTUE9OU0VfR1JPVVBfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4QTgwNQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9EQVRBU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTgwNgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9HUk9VUF9VTlNVUFBPUlRFRCAgICAgICAgIDB4QTgwNworI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9ERVBUSF9VTlNVUFBPUlRFRCAgICAgICAgIDB4QTgwOAorI2RlZmluZSBNVFBfUkVTUE9OU0VfT0JKRUNUX1RPT19MQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTgwOQorI2RlZmluZSBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgIDB4QTgwQQorCisvLyBNVFAgRXZlbnQgQ29kZXMKKyNkZWZpbmUgTVRQX0VWRU5UX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgTVRQX0VWRU5UX0NBTkNFTF9UUkFOU0FDVElPTiAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9BRERFRCAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVEICAgICAgICAgICAgICAgICAgICAweDQwMDMKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JFX0FEREVEICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQgICAgICAgICAgICAgICAweDQwMDYKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgICAweDQwMDcKKyNkZWZpbmUgTVRQX0VWRU5UX0RFVklDRV9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgICAweDQwMDgKKyNkZWZpbmUgTVRQX0VWRU5UX1JFUVVFU1RfT0JKRUNUX1RSQU5TRkVSICAgICAgICAgICAweDQwMDkKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JFX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAweDQwMEEKKyNkZWZpbmUgTVRQX0VWRU5UX0RFVklDRV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDQwMEIKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JBR0VfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAweDQwMEMKKyNkZWZpbmUgTVRQX0VWRU5UX0NBUFRVUkVfQ09NUExFVEUgICAgICAgICAgICAgICAgICAweDQwMEQKKyNkZWZpbmUgTVRQX0VWRU5UX1VOUkVQT1JURURfU1RBVFVTICAgICAgICAgICAgICAgICAweDQwMEUKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9QUk9QX0NIQU5HRUQgICAgICAgICAgICAgICAweEM4MDEKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9QUk9QX0RFU0NfQ0hBTkdFRCAgICAgICAgICAweEM4MDIKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9SRUZFUkVOQ0VTX0NIQU5HRUQgICAgICAgICAweEM4MDMKKworLy8gU3RvcmFnZSBUeXBlCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJWEVEX1JPTSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFTU9WQUJMRV9ST00gICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJWEVEX1JBTSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFTU9WQUJMRV9SQU0gICAgICAgICAgICAgICAgICAgMHgwMDA0CisKKy8vIFN0b3JhZ2UgRmlsZSBTeXN0ZW0KKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9GTEFUICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUwgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9EQ0YgICAgICAgICAgICAgICAgICAweDAwMDMKKworLy8gU3RvcmFnZSBBY2Nlc3MgQ2FwYWJpbGl0eQorI2RlZmluZSBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfU1RPUkFHRV9SRUFEX09OTFlfV0lUSE9VVF9ERUxFVEUgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfU1RPUkFHRV9SRUFEX09OTFlfV0lUSF9ERUxFVEUgICAgICAgICAgIDB4MDAwMAorCisvLyBBc3NvY2lhdGlvbiBUeXBlCisjZGVmaW5lIE1UUF9BU1NPQ0lBVElPTl9UWVBFX1VOREVGSU5FRCAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSICAgICAgICAgMHgwMDAxCisKKyNlbmRpZiAvLyBfTVRQX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHB0ZXN0LmNwcCBiL21lZGlhL210cC9tdHB0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdjZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL210cHRlc3QuY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm10cF91c2IiCisjaW5jbHVkZSAiY3V0aWxzL2xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiTXRwU2VydmVyLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgImZfbXRwLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgYm9vbCBlbmFibGVfdXNiX2Z1bmN0aW9uKGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wgZW5hYmxlKSB7CisgICAgY2hhciAgICBwYXRoW1BBVEhfTUFYXTsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZS8lcy9lbmFibGUiLCBuYW1lKTsKKyAgICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuICVzIGluIGVuYWJsZV91c2JfZnVuY3Rpb25cbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdyaXRlKGZkLCBlbmFibGUgPyAiMSIgOiAiMCIsIDIpOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGJvb2wgdXNlUFRQID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogc3RvcmFnZVBhdGggPSAiL3NkY2FyZCI7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyKiBhcmcgPSBhcmd2W2ldOworICAgICAgICBpZiAoIXN0cmNtcChhcmcsICItcCIpKQorICAgICAgICAgICAgdXNlUFRQID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICcvJykKKyAgICAgICAgICAgIHN0b3JhZ2VQYXRoID0gYXJnOworICAgIH0KKworICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7CisgICAgcHJpbnRmKCJvcGVuIHJldHVybmVkICVkXG4iLCBmZCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIE1UUCBkcml2ZXJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHVzZVBUUCkgeworICAgICAgICAvLyBzZXQgZHJpdmVyIG1vZGUgdG8gUFRQCisgICAgICAgIGludCByZXQgPSBpb2N0bChmZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwgTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGlzYWJsZSBVTVMgYW5kIGVuYWJsZSBNVFAgVVNCIGZ1bmN0aW9ucworICAgIGVuYWJsZV91c2JfZnVuY3Rpb24oInVzYl9tYXNzX3N0b3JhZ2UiLCBmYWxzZSk7CisgICAgZW5hYmxlX3VzYl9mdW5jdGlvbigibXRwIiwgdHJ1ZSk7CisKKyAgICBNdHBTZXJ2ZXIgICBzZXJ2ZXIoZmQsICIvZGF0YS9kYXRhL210cC9tdHAuZGIiKTsKKyAgICBzZXJ2ZXIuYWRkU3RvcmFnZShzdG9yYWdlUGF0aCk7CisgICAgc2VydmVyLnNjYW5TdG9yYWdlKCk7CisgICAgc2VydmVyLnJ1bigpOworCisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvc2NhbnRlc3QuY3BwIGIvbWVkaWEvbXRwL3NjYW50ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTEwYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3NjYW50ZXN0LmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cE1lZGlhU2Nhbm5lci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgPHN0b3JhZ2UgcGF0aD5cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gbmV3IE10cERhdGFiYXNlKCk7CisgICAgZGF0YWJhc2UtPm9wZW4oInNjYW50ZXN0LmRiIiwgdHJ1ZSk7CisKKyAgICBNdHBNZWRpYVNjYW5uZXIgc2Nhbm5lcigxLCBhcmd2WzFdLCBkYXRhYmFzZSk7CisgICAgc2Nhbm5lci5zY2FuRmlsZXMoKTsKKyAgICBkYXRhYmFzZS0+Y2xvc2UoKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDYW1lcmFCcm93c2VyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxOCBAQAorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9sYWJlbCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkNhbWVyYUJyb3dzZXIiIGFuZHJvaWQ6bGFiZWw9IkNhbWVyYSBCcm93c2VyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTdG9yYWdlQnJvd3NlciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iT2JqZWN0QnJvd3NlciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iT2JqZWN0Vmlld2VyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmQ4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCkBAIC0wLDAgKzEsMTQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2JqZWN0X2luZm8iCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kZXB0aCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NlcXVlbmNlIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tb2RpZmllZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleXdvcmRzIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJuYWlsIiAvPgorICAgIDwvVGFibGVSb3c+Cis8L1RhYmxlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIAorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWE0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9kZWxldGUiCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGVsZXRlX2l0ZW0iIC8+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5NGU2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX2xhYmVsIj5DYW1lcmEgQnJvd3Nlcjwvc3RyaW5nPgorCisgICAgPCEtLSBmb3Igb2JqZWN0IGluZm8gLS0+CisgICAgPHN0cmluZyBuYW1lPSJuYW1lX2xhYmVsIj5OYW1lOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNpemVfbGFiZWwiPlNpemU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfd2lkdGhfbGFiZWwiPlRodW1iIFdpZHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX2hlaWdodF9sYWJlbCI+VGh1bWIgSGVpZ2h0OiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX3NpemVfbGFiZWwiPlRodW1iIFNpemU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2lkdGhfbGFiZWwiPldpZHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhlaWdodF9sYWJlbCI+SGVpZ2h0OiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlcHRoX2xhYmVsIj5EZXB0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZXF1ZW5jZV9sYWJlbCI+U2VxdWVuY2U6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY3JlYXRlZF9sYWJlbCI+Q3JlYXRlZDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb2RpZmllZF9sYWJlbCI+TW9kaWZpZWQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5d29yZHNfbGFiZWwiPktleXdvcmRzOiA8L3N0cmluZz4KKworICAgIDwhLS0gbWVudSBpdGVtcyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9pdGVtIj5EZWxldGU8L3N0cmluZz4KKworICAgIDwhLS0gdG9hc3RzIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSI+T2JqZWN0IGRlbGV0ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IGRlbGV0ZSBvYmplY3Q8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Njk5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJpbmZvX2xhYmVsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9ImluZm9fdmFsdWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ4NzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBjb25uZWN0ZWQgY2FtZXJhcy4KKyAqLworcHVibGljIGNsYXNzIENhbWVyYUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgIHByaXZhdGUgRGV2aWNlT2JzZXJ2ZXIgbURldmljZU9ic2VydmVyOworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisKKyAgICBwcml2YXRlIGNsYXNzIERldmljZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgRGV2aWNlT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZU9ic2VydmVyLm9uQ2hhbmdlIik7CisgICAgICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfQ09MVU1OUyA9CisgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLl9JRCwgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbVJlc29sdmVyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIG1EZXZpY2VPYnNlcnZlciA9IG5ldyBEZXZpY2VPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5EZXZpY2UuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgREVWSUNFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgIG1DdXJzb3IgPSBjOworCisgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMi54bWwKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8yLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSBsaXN0CisgICAgICAgIG1SZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihNdHAuRGV2aWNlLkNPTlRFTlRfVVJJLCB0cnVlLCBtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobURldmljZU9ic2VydmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIChpbnQpbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjhmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBvYmplY3RzIHdpdGhpbiBhIGNvbnRhaW5lciAoZm9sZGVyIG9yIHN0b3JhZ2UgdW5pdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0QnJvd3NlciI7CisKKyAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOworICAgIHByaXZhdGUgT2JqZWN0Q3Vyc29yQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5PYmplY3QuX0lELCBNdHAuT2JqZWN0Lk5BTUUsIE10cC5PYmplY3QuRk9STUFULCBNdHAuT2JqZWN0LlRIVU1CIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50IElEX0NPTFVNTiA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ09MVU1OID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRIVU1CX0NPTFVNTiA9IDM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoIm9iamVjdCIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbVN0b3JhZ2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYzsKKyAgICAgICAgICAgIFVyaSB1cmk7CisgICAgICAgICAgICBpZiAobU9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JTdG9yYWdlQ2hpbGRyZW4obURldmljZUlELCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4obURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgIiArIHVyaSk7CisgICAgICAgICAgICBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworICAgICAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IE9iamVjdEN1cnNvckFkYXB0ZXIodGhpcywgYyk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgaW50IHJvd0lEID0gKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgcm93SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyArICIgY291bnQ6ICIgKyBjLmdldENvdW50KCkpOworICAgICAgICBsb25nIGZvcm1hdCA9IDA7CisgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5nZXRDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQ09MVU1OKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYy5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZm9ybWF0ID0gYy5nZXRMb25nKEZPUk1BVF9DT0xVTU4pOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicm93SWQ6ICIgKyByb3dJZCArICIgbmFtZTogIiArIG5hbWUgKyAiIGZvcm1hdDogIiArIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHAuT2JqZWN0LkZPUk1BVF9KRklGKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RWaWV3ZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm9iamVjdCIscm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgT2JqZWN0QnJvd3Nlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgib2JqZWN0Iiwgcm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lm9iamVjdF9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGludCBwb3NpdGlvbiA9IG1MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQuZGVsZXRlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHBvc2l0aW9uICE9IEFkYXB0ZXJWaWV3LklOVkFMSURfUE9TSVRJT04pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5kZWxldGU6CisgICAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVNlbGVjdGVkKCkgeworICAgICAgICBpbnQgcG9zaXRpb24gPSBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgICAgICBpbnQgcm93SUQgPSAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIFVyaSB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCByb3dJRCk7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRpbmcgIiArIHVyaSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgICAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcub2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLmRlbGV0ZV9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9iamVjdEN1cnNvckFkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgeworCisgICAgICAgIHB1YmxpYyBPYmplY3RDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIFIubGF5b3V0Lm9iamVjdF9saXN0LCBjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgSW1hZ2VWaWV3IHRodW1iVmlldyA9IChJbWFnZVZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgVGV4dFZpZXcgbmFtZVZpZXcgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKworICAgICAgICAgICAgLy8gZ2V0IHRoZSB0aHVtYm5haWwKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjdXJzb3IuZ2V0QmxvYihUSFVNQl9DT0xVTU4pOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHRodW1ibmFpbCwgMCwgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVWaWV3LnNldFRleHQobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDMzYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBBIHZpZXcgdG8gZGlzcGxheSB0aGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RWaWV3ZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk9iamVjdFZpZXdlciI7CisKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICBNdHAuT2JqZWN0Ll9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfREVQVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlNFUVVFTkNFX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuREFURV9DUkVBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5EQVRFX01PRElGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUIsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm9iamVjdF9pbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgic3RvcmFnZSIsIDApOworICAgICAgICBtT2JqZWN0SUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgib2JqZWN0IiwgMCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwICYmIG1PYmplY3RJRCAhPSAwKSB7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgVGV4dFZpZXcgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChjLmdldFN0cmluZygxKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDIpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3dpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZygzKSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl9oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDQpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3NpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDUpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLndpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg2KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDcpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmRlcHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg4KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXF1ZW5jZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoOSkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuY3JlYXRlZCk7CisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShjLmdldExvbmcoMTApICogMTAwMCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubW9kaWZpZWQpOworICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGMuZ2V0TG9uZygxMSkgKiAxMDAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChkYXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5rZXl3b3Jkcyk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoYy5nZXRTdHJpbmcoMTIpKTsKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjLmdldEJsb2IoMTMpOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ290IHRodW1ibmFpbCwgbGVuZ3RoOiAiICsgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgICAiICsgSW50ZWdlci50b0hleFN0cmluZyh0aHVtYm5haWxbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdGh1bWJWaWV3ID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheSh0aHVtYm5haWwsIDAsIHRodW1ibmFpbC5sZW5ndGgpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImJpdG1hcDogIiArIGJpdG1hcCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRmNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIHN0b3JhZ2UgdW5pdHMgb24gYSBkZXZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yYWdlQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0b3JhZ2VCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RPUkFHRV9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuX0lELCBNdHAuU3RvcmFnZS5ERVNDUklQVElPTiB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIG1EZXZpY2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJkZXZpY2UiLCAwKTsKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5TdG9yYWdlLmdldENvbnRlbnRVcmkobURldmljZUlEKSwKKyAgICAgICAgICAgICAgICAgICAgU1RPUkFHRV9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIodGhpcywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEsIGFuZHJvaWQuUi5pZC50ZXh0MiB9KTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC90dHMuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjOTlmNwotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9UVFNfSAorI2RlZmluZSBBTkRST0lEX1RUU19IIAorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCBieSB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorLy8gdG8gYWNjZXNzIFRleHQtVG8tU3BlZWNoIGZ1bmN0aW9uYWxpdHkgaW4gc2hhcmVkIGxpYnJhcmllcyB0aGF0IGltcGxlbWVudAorLy8gc3BlZWNoIHN5bnRoZXNpcyBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vIHN5bnRoZXNpcy4KKworLy8gVGhlIHNoYXJlZCBsaWJyYXJ5IG11c3QgY29udGFpbiBhIGZ1bmN0aW9uIG5hbWVkICJhbmRyb2lkX2dldFR0c0VuZ2luZSIKKy8vIHRoYXQgcmV0dXJucyBhbiAnYW5kcm9pZF90dHNfZW5naW5lX3QnIGluc3RhbmNlLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRyAiZW5naW5lQ29uZmlnIgorI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfUElUQ0ggICJwaXRjaCIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1JBVEUgICAicmF0ZSIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1ZPTFVNRSAidm9sdW1lIgorCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NVQ0NFU1MgICAgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19GQUlMVVJFICAgICAgICAgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0ZFQVRVUkVfVU5TVVBQT1JURUQgICAgID0gLTIsCisgICAgQU5EUk9JRF9UVFNfVkFMVUVfSU5WQUxJRCAgICAgICAgICAgPSAtMywKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCAgICA9IC00LAorICAgIEFORFJPSURfVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMID0gLTUsCisgICAgQU5EUk9JRF9UVFNfTUlTU0lOR19SRVNPVVJDRVMgICAgICAgPSAtNgorfSBhbmRyb2lkX3R0c19yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19MQU5HX0NPVU5UUllfVkFSX0FWQUlMQUJMRSA9IDIsCisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSAgICA9IDEsCisgICAgQU5EUk9JRF9UVFNfTEFOR19BVkFJTEFCTEUgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfTEFOR19NSVNTSU5HX0RBVEEgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCAgICAgICAgPSAtMgorfSBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NZTlRIX0RPTkUgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19TWU5USF9QRU5ESU5HICAgICAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVCAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFICAgICAgID0gMQorfSBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdDsKKworLy8gU3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0lOVkFMSUQgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfREVGQVVMVCAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgPSAxLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQgID0gMiwKK30gYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3Q7CisKKworLyogQW4gYW5kcm9pZF90dHNfZW5naW5lX3Qgb2JqZWN0IGNhbiBiZSBhbnl0aGluZywgYnV0IG11c3QgaGF2ZSwKKyAqIGFzIGl0cyBmaXJzdCBmaWVsZCwgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgZnVuY3Rpb25zLgorICoKKyAqIFNlZSB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIHN0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfdF9mdW5jc190CisgKiBiZWxvdyBmb3IgZGV0YWlscy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgKmZ1bmNzOworfSBhbmRyb2lkX3R0c19lbmdpbmVfdDsKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIFRUUyBFbmdpbmUgc2hhcmVkIGxpYnJhcnkKKyAqIGFuZCBtdXN0IHJldHVybiB0aGUgYWRkcmVzcyBvZiBhbiBhbmRyb2lkX3R0c19lbmdpbmVfdCBsaWJyYXJ5LgorICovCitleHRlcm4gYW5kcm9pZF90dHNfZW5naW5lX3QgKmFuZHJvaWRfZ2V0VHRzRW5naW5lKCk7CisKKy8vIEEgY2FsbGJhY2sgdHlwZSB1c2VkIHRvIG5vdGlmeSB0aGUgZnJhbWV3b3JrIG9mIG5ldyBzeW50aGV0aXplZAorLy8gYXVkaW8gc2FtcGxlcywgc3RhdHVzIHdpbGwgYmUgU1lOVEhfRE9ORSBmb3IgdGhlIGxhc3Qgc2FtcGxlIG9mCisvLyB0aGUgbGFzdCByZXF1ZXN0LCBvZiBTWU5USF9QRU5ESU5HIG90aGVyd2lzZS4KKy8vCisvLyBUaGlzIGlzIHBhc3NlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHRoZSBlbmdpbmUgdGhyb3VnaCB0aGUKKy8vICdlbmdpbmVfaW5pdCcgZnVuY3Rpb24gKHNlZSBiZWxvdykuCisvLworLy8gVGhlIGNhbGxiYWNrIGZvciBzeW50aGVzaXMgY29tcGxldGVkIHRha2VzOgorLy8gQHBhcmFtIFtpbm91dF0gdm9pZCAqJiAgICAgICAtIFRoZSB1c2VyZGF0YSBwb2ludGVyIHNldCBpbiB0aGUgb3JpZ2luYWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGggY2FsbAorLy8gQHBhcmFtIFtpbl0gICAgdWludDMyX3QgICAgICAtIFRyYWNrIHNhbXBsaW5nIHJhdGUgaW4gSHoKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUaGUgYXVkaW8gZm9ybWF0CisvLyBAcGFyYW0gW2luXSAgICBpbnQgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBjaGFubmVscworLy8gQHBhcmFtIFtpbm91dF0gaW50OF90IComICAgICAtIEEgYnVmZmVyIG9mIGF1ZGlvIGRhdGEgb25seSB2YWxpZCBkdXJpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBjYWxsYmFjaworLy8gQHBhcmFtIFtpbm91dF0gc2l6ZV90ICAmICAgICAtIFRoZSBzaXplIG9mIHRoZSBidWZmZXIKKy8vIEBwYXJhbSBbaW5dIHR0c19zeW50aF9zdGF0dXMgLSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW50aGVzaXMgaXMgZG9uZSwgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW9yZSBkYXRhIGlzIHRvIGJlIHN5bnRoZXNpemVkLgorLy8gQHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVCB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3Qgc3RvcCwKKy8vICAgICAgICAgVFRTX0NBTExCQUNLX0NPTlRJTlVFIHRvIGluZGljYXRlIHRoZSBzeW50aGVzaXMgbXVzdCBjb250aW51ZSBpZgorLy8gICAgICAgICAgICB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcHJvZHVjZS4KK3R5cGVkZWYgYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3QgKCphbmRyb2lkX3R0c19zeW50aF9jYl90KQorICAgICAgICAgICAgKHZvaWQgKipwVXNlckRhdGEsCisgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tTYW1wbGluZ0h6LAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgaW50OF90ICoqcEF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Qgc3RhdHVzKTsKKworCisvLyBUaGUgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCB0aGUgYW5kcm9pZF90dHNfZW5naW5lX3QgbXVzdCBwb2ludCB0by4KKy8vIE5vdGUgdGhhdCBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRha2UgYSBoYW5kbGUgdG8gdGhlIGVuZ2luZSBpdHNlbGYKKy8vIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlci4KKy8vCisKK3N0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdCB7CisgICAgLy8gcmVzZXJ2ZWQgZmllbGRzLCBpZ25vcmVkIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAvLyB0aGV5IG11c3QgYmUgcGxhY2VkIGhlcmUgdG8gZW5zdXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgICAgLy8gb2YgbGVnYWN5IGJpbmFyeSBwbHVnaW5zLgorICAgIHZvaWQgKnJlc2VydmVkWzJdOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgVFRTIGVuZ2luZSBhbmQgcmV0dXJucyB3aGV0aGVyIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZC4KKyAgICAvLyBAcGFyYW0gc3ludGhEb25lQ0JQdHIgc3ludGhlc2lzIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqaW5pdCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfY2JfdCBzeW50aERvbmVQdHIsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5naW5lQ29uZmlnKTsKKworICAgIC8vIFNodXQgZG93biB0aGUgVFRTIGVuZ2luZSBhbmQgcmVsZWFzZXMgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzaHV0ZG93bikKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gSW50ZXJydXB0IHN5bnRoZXNpcyBhbmQgZmx1c2hlcyBhbnkgc3ludGhlc2l6ZWQgZGF0YSB0aGF0IGhhc24ndCBiZWVuCisgICAgLy8gb3V0cHV0IHlldC4gVGhpcyB3aWxsIGJsb2NrIHVudGlsIGNhbGxiYWNrcyB1bmRlcndheSBhcmUgY29tcGxldGVkLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzdG9wKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsZXZlbCBvZiBzdXBwb3J0IGZvciB0aGUgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQuCisgICAgLy8gQHJldHVybiBUVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50IGFyZSBzdXBwb3J0ZWQsCisgICAgLy8gICAgICAgICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUKKyAgICAvLyAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZCwgYnV0IHRoZXJlIGlzIG5vIG1hdGNoIGZvcgorICAgIC8vICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY291bnRyeSBhbmQgdmFyaWFudAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTUlTU0lOR19EQVRBIGlmIHRoZSByZXF1aXJlZCByZXNvdXJjZXMgdG8gcHJvdmlkZSBhbnkgbGV2ZWwgb2Ygc3VwcG9ydAorICAgIC8vICAgICAgICAgICAgIGZvciB0aGUgbGFuZ3VhZ2UgYXJlIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19OT1RfU1VQUE9SVEVEIGlmIHRoZSBsYW5ndWFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBUVFMgZW5naW5lLgorICAgIGFuZHJvaWRfdHRzX3N1cHBvcnRfcmVzdWx0X3QgKCppc0xhbmd1YWdlQXZhaWxhYmxlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBMb2FkIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuIFRoZSBsb2FkZWQKKyAgICAvLyBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmxvYWRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCBMb2NhbGUgdmFyaWFudC4KKyAgICAvLyBUaGUgbG9hZGVkIGxhbmd1YWdlIHdpbGwgb25seSBiZSB1c2VkIG9uY2UgYSBjYWxsIHRvIHNldExhbmd1YWdlRnJvbUxvY2FsZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldExhbmd1YWdlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudGx5IHNldCBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCwgb3IgZW1wdHkgc3RyaW5ncyBpZiBub25lIG9mCisgICAgLy8gcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0LiBMYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgMy1sZXR0ZXIgSVNPIGNvZGUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCAzLWxldHRlciBjb2RlIGxhbmd1YWdlIHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBjb3VudHJ5IHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgdmFyaWFudCB2YWx1ZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY2hhciAqbGFuZ3VhZ2UsCisgICAgICAgICAgICAgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIE5vdGlmaWVzIHRoZSBlbmdpbmUgd2hhdCBhdWRpbyBwYXJhbWV0ZXJzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc3ludGhlc2lzLgorICAgIC8vIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGhpbnQsIHRoZSBlbmdpbmUgaW1wbGVtZW50YXRpb24gd2lsbCBzZXQgdGhlIG91dHB1dCB2YWx1ZXMKKyAgICAvLyB0byB0aG9zZSBvZiB0aGUgc3ludGhlc2lzIGZvcm1hdCwgYmFzZWQgb24gYSBnaXZlbiBoaW50LgorICAgIC8vIEBwYXJhbVtpbm91dF0gZW5jb2RpbmcgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSBmb3JtYXQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gcmF0ZSBpbjogdGhlIGRlc2lyZWQgYXVkaW8gc2FtcGxlIHJhdGUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBzYW1wbGUgcmF0ZSB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtW2lub3V0XSBjaGFubmVscyBpbjogdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2V0QXVkaW9Gb3JtYXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90KiBwRW5jb2RpbmcsCisgICAgICAgICAgICAgdWludDMyX3QqIHBSYXRlLAorICAgICAgICAgICAgIGludCogcENoYW5uZWxzKTsKKworICAgIC8vIFNldCBhIHByb3BlcnR5IGZvciB0aGUgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyAic2l6ZSIgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiAidmFsdWUiIGZvciBwcm9wZXJ0aWVzICJwcm9wZXJ0eSIKKyAgICAvLyBAcGFyYW0gcHJvcGVydHkgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgbmFtZQorICAgIC8vIEBwYXJhbSB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgIC8vIEBwYXJhbSBzaXplICAgICBtYXhpbXVtIHNpemUgcmVxdWlyZWQgdG8gc3RvcmUgdGhpcyB0eXBlIG9mIHByb3BlcnR5CisgICAgLy8gQHJldHVybiAgICAgICAgIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFLAorICAgIC8vICAgICAgICAgICAgICAgICAgb3IgVFRTX1ZBTFVFX0lOVkFMSUQKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhIHByb3BlcnR5IGZyb20gdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW0gICAgICAgIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHZhbHVlICAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtpbm91dF0gaW9zaXplICAgaW46IHN0b3JlcyB0aGUgc2l6ZSBhdmFpbGFibGUgdG8gc3RvcmUgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiBzdG9yZXMgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgbGFuZ3VhZ2UKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaWYgZ2V0TGFuZ3VhZ2UoKSByZXR1cm5lZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwsIHVuY2hhbmdlZCBvdGhlcndpc2UKKyAgICAvLyBAcmV0dXJuIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsCisgICAgLy8gICAgICAgICBvciBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmdldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBzaXplX3QgKmlvc2l6ZSk7CisKKyAgICAvLyBTeW50aGVzaXplIHRoZSB0ZXh0LgorICAgIC8vIEFzIHRoZSBzeW50aGVzaXMgaXMgcGVyZm9ybWVkLCB0aGUgZW5naW5lIGludm9rZXMgdGhlIGNhbGxiYWNrIHRvIG5vdGlmeQorICAgIC8vIHRoZSBUVFMgZnJhbWV3b3JrIHRoYXQgaXQgaGFzIGZpbGxlZCB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgaW5kaWNhdGVzIGhvdworICAgIC8vIG1hbnkgYnl0ZXMgaXQgd3JvdGUuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW5naW5lCisgICAgLy8gaGFzIGdlbmVyYXRlZCBhbGwgdGhlIGF1ZGlvIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgdGV4dC4KKyAgICAvLyBOb3RlIGFib3V0IHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0OiB0aGUgdGV4dCBwYXJhbWV0ZXIgbWF5IHVzZSB0aGUKKyAgICAvLyBmb2xsb3dpbmcgZWxlbWVudHMKKyAgICAvLyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIFNTTUwgMS4wIHNwZWNpZmljYXRpb246CisgICAgLy8gICAgKiBsYW5nCisgICAgLy8gICAgKiBzYXktYXM6CisgICAgLy8gICAgICAgICAgbyBpbnRlcnByZXQtYXMKKyAgICAvLyAgICAqIHBob25lbWUKKyAgICAvLyAgICAqIHZvaWNlOgorICAgIC8vICAgICAgICAgIG8gZ2VuZGVyLAorICAgIC8vICAgICAgICAgIG8gYWdlLAorICAgIC8vICAgICAgICAgIG8gdmFyaWFudCwKKyAgICAvLyAgICAgICAgICBvIG5hbWUKKyAgICAvLyAgICAqIGVtcGhhc2lzCisgICAgLy8gICAgKiBicmVhazoKKyAgICAvLyAgICAgICAgICBvIHN0cmVuZ3RoLAorICAgIC8vICAgICAgICAgIG8gdGltZQorICAgIC8vICAgICogcHJvc29keToKKyAgICAvLyAgICAgICAgICBvIHBpdGNoLAorICAgIC8vICAgICAgICAgIG8gY29udG91ciwKKyAgICAvLyAgICAgICAgICBvIHJhbmdlLAorICAgIC8vICAgICAgICAgIG8gcmF0ZSwKKyAgICAvLyAgICAgICAgICBvIGR1cmF0aW9uLAorICAgIC8vICAgICAgICAgIG8gdm9sdW1lCisgICAgLy8gICAgKiBtYXJrCisgICAgLy8gRGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzIHRleHQgZm9ybWF0IGFuZCBTU01MIGFyZToKKyAgICAvLyAgICAqIGZ1bGwgU1NNTCBkb2N1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyAgICAqIG5hbWVzcGFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyBUZXh0IGlzIGNvZGVkIGluIFVURi04LgorICAgIC8vIEBwYXJhbSB0ZXh0ICAgICAgdGhlIFVURi04IHRleHQgdG8gc3ludGhlc2l6ZQorICAgIC8vIEBwYXJhbSB1c2VyZGF0YSAgcG9pbnRlciB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSBjYWxsIGlzIGludm9rZWQKKyAgICAvLyBAcGFyYW0gYnVmZmVyICAgIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3ludGhlc2l6ZWQgZGF0YSBtdXN0IGJlIHdyaXR0ZW4KKyAgICAvLyBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW4gYnVmZmVyCisgICAgLy8gQHJldHVybiAgICAgICAgICBUVFNfU1VDQ0VTUyBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3ludGhlc2l6ZVRleHQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgaW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFORFJPSURfVFRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0Vmlld3BvcnQKKworIyBTZXQgYSBzcGVjaWZpYyBTREsgdmVyc2lvbiBzbyB3ZSBjYW4gcnVuIG9uIEZyb3lvLgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSA4CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUKQEAgLTAsMCArMSwyOCBAQAorUmVwcm8gc3RlcHM6CisKK2J1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0Vmlld3BvcnQuYXBrCisKK1J1biBvbiBTYXBwaGlyZSB3aXRoIEZyb3lvLgorCitUaGUgcHJvZ3JhbSBjbGVhcnMgdGhlIHNjcmVlbiB0byBibHVlLCB0aGVuIGRyYXdzIGEgZnVsbCBzY3JlZW4gd2hpdGUgcXVhZCB0aGF0CitpcyBhbGxpZ25lZCB0byB0aGUgc2NyZWVuLgorKFRoZXJlZm9yZSB0aGUgd2hvbGUgc2NyZWVuIHNob3VsZCBhcHBlYXIgdG8gYmUgd2hpdGUuKQorCisKK05vdGUgdGhhdCBzY3JlZW4gaXMgYWxsIHdoaXRlLgorCitSb3RhdGUgc2NyZWVuIDkwIGRlZ3JlZXMuCisKK0V4cGVjdGVkOiBzY3JlZW4gaXMgc3RpbGwgYWxsIHdoaXRlLgorCitBY3R1YWw6IHNjcmVlbiBpcyBibHVlIHdpdGggb2Zmc2V0IHdoaXRlIHJlY3RhbmdsZS4KKworVGhpcyBidWcgb25seSBoYXBwZW5zIG9uIFNhcHBoaXJlLCBpdCB3b3JrcyBjb3JyZWN0bHkgb24gUGFzc2lvbi4KKworV2hhdCBoYXBwZW5zOgorCitJIHRoaW5rIHRoZSBidWcgaXMgdGhhdCB0aGUgZ2wuZ2xWaWV3cG9ydCgpIGNhbGwgaW4gb25TdXJmYWNlQ2hhbmdlZCgpIGlzCitiZWluZyBpZ25vcmVkIGJ5IHRoZSBPcGVuR0wgZHJpdmVyLgorCitOT1RFOiBJZiBhIGdsLmdsVmlld3BvcnQgY2FsbCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbkRyYXdGcmFtZSgpCitjYWxsICh3aGljaCBtZWFucyBpdCBpcyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGRyYXcpLCB0aGUgcHJvZ3JhbSBydW5zIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4YmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IFZpZXdwb3J0PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7CisgICAgVGVzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1WaWV3ID0gbmV3IFRlc3RWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKwkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NjMzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgVGVzdFZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICAgICAgc2V0UmVuZGVyTW9kZShSRU5ERVJNT0RFX1dIRU5fRElSVFkpOworICAgIH0KKyAgICAKKyAgICAgICAgLyoqIEEgZ3JpZCBpcyBhIHRvcG9sb2dpY2FsbHkgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgdmVydGljZXMuCisgICAgKgorICAgICogVGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSBhcmUgaGVsZCBpbiBWQk8gb2JqZWN0cyBiZWNhdXNlIG9uIG1vc3QKKyAgICAqIEdQVXMgVkJPIG9iamVjdHMgYXJlIHRoZSBmYXN0ZXN0IHdheSBvZiByZW5kZXJpbmcgc3RhdGljIHZlcnRleAorICAgICogYW5kIGluZGV4IGRhdGEuCisgICAgKgorICAgICovCisKKyAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyaWQgeworICAgICAgIC8vIFNpemUgb2YgdmVydGV4IGRhdGEgZWxlbWVudHMgaW4gYnl0ZXM6CisgICAgICAgZmluYWwgc3RhdGljIGludCBGTE9BVF9TSVpFID0gNDsKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IENIQVJfU0laRSA9IDI7CisKKyAgICAgICAvLyBWZXJ0ZXggc3RydWN0dXJlOgorICAgICAgIC8vIGZsb2F0IHgsIHksIHo7CisKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IFZFUlRFWF9TSVpFID0gMyAqIEZMT0FUX1NJWkU7CisKKyAgICAgICBwcml2YXRlIGludCBtVmVydGV4QnVmZmVyT2JqZWN0SWQ7CisgICAgICAgcHJpdmF0ZSBpbnQgbUVsZW1lbnRCdWZmZXJPYmplY3RJZDsKKworICAgICAgIC8vIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgdG8gaG9sZCB0aGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIHdoaWxlCisgICAgICAgLy8gY29uc3RydWN0aW5nIHRoZSBncmlkLiBPbmNlIGNyZWF0ZUJ1ZmZlck9iamVjdHMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB0aGUgYnVmZmVycyBhcmUgbnVsbGVkIG91dCB0byBzYXZlIG1lbW9yeS4KKworICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtVmVydGV4Qnl0ZUJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1WZXJ0ZXhCdWZmZXI7CisgICAgICAgcHJpdmF0ZSBDaGFyQnVmZmVyIG1JbmRleEJ1ZmZlcjsKKworICAgICAgIHByaXZhdGUgaW50IG1XOworICAgICAgIHByaXZhdGUgaW50IG1IOworICAgICAgIHByaXZhdGUgaW50IG1JbmRleENvdW50OworCisgICAgICAgcHVibGljIEdyaWQoaW50IHcsIGludCBoKSB7CisgICAgICAgICAgIGlmICh3IDwgMCB8fCB3ID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3Iik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGggPCAwIHx8IGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImgiKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAodyAqIGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIncgKiBoID49IDY1NTM2Iik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBtVyA9IHc7CisgICAgICAgICAgIG1IID0gaDsKKyAgICAgICAgICAgaW50IHNpemUgPSB3ICogaDsKKworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVEVYX1NJWkUgKiBzaXplKQorICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG1WZXJ0ZXhCeXRlQnVmZmVyLmFzRmxvYXRCdWZmZXIoKTsKKworICAgICAgICAgICBpbnQgcXVhZFcgPSBtVyAtIDE7CisgICAgICAgICAgIGludCBxdWFkSCA9IG1IIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRDb3VudCA9IHF1YWRXICogcXVhZEg7CisgICAgICAgICAgIGludCBpbmRleENvdW50ID0gcXVhZENvdW50ICogNjsKKyAgICAgICAgICAgbUluZGV4Q291bnQgPSBpbmRleENvdW50OworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENIQVJfU0laRSAqIGluZGV4Q291bnQpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzQ2hhckJ1ZmZlcigpOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEluaXRpYWxpemUgdHJpYW5nbGUgbGlzdCBtZXNoLgorICAgICAgICAgICAgKgorICAgICAgICAgICAgKiAgICAgWzBdLS0tLS1bICAxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgIC8gICB8CisgICAgICAgICAgICAqICAgICAgfCAgIC8gICAgfAorICAgICAgICAgICAgKiAgICAgIHwgIC8gICAgIHwKKyAgICAgICAgICAgICogICAgIFt3XS0tLS0tW3crMV0gLi4uCisgICAgICAgICAgICAqICAgICAgfCAgICAgICB8CisgICAgICAgICAgICAqCisgICAgICAgICAgICAqLworCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgcXVhZEg7IHkrKykgeworICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcXVhZFc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGEgPSAoY2hhcikgKHkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGIgPSAoY2hhcikgKHkgKiBtVyArIHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGEpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGQpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBtVykgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaSIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChqIDwgMCB8fCBqID49IG1IKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqIik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpbnQgaW5kZXggPSBtVyAqIGogKyBpOworCisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucG9zaXRpb24oaW5kZXggKiBWRVJURVhfU0laRSAvIEZMT0FUX1NJWkUpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh4KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHopOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJ1ZmZlck9iamVjdHMoR0wgZ2wpIHsKKyAgICAgICAgICAgLy8gR2VuZXJhdGUgYSB0aGUgdmVydGV4IGFuZCBlbGVtZW50IGJ1ZmZlciBJRHMKKyAgICAgICAgICAgaW50W10gdmJvSWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworICAgICAgICAgICBnbDExLmdsR2VuQnVmZmVycygyLCB2Ym9JZHMsIDApOworICAgICAgICAgICBtVmVydGV4QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMF07CisgICAgICAgICAgIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMV07CisKKyAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2ZXJ0ZXggZGF0YQorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4Qnl0ZUJ1ZmZlci5jYXBhY2l0eSgpLCBtVmVydGV4Qnl0ZUJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLmNhcGFjaXR5KCkgKiBDSEFSX1NJWkUsIG1JbmRleEJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgaW4tbWVtb3J5IGRhdGEgYW55IG1vcmUKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworCisgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOworCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCBWRVJURVhfU0laRSwgMCk7CisgICAgICAgICAgIAorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgZ2wxMS5nbERyYXdFbGVtZW50cyhHTDEwLkdMX1RSSUFOR0xFUywgbUluZGV4Q291bnQsIEdMMTAuR0xfVU5TSUdORURfU0hPUlQsIDApOworICAgICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgfQorICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVuZGVyZXIiOworICAgICAgICBwcml2YXRlIEdyaWQgbUdyaWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisJCQlnbC5nbENsZWFyQ29sb3IoMCwwLDEsMSk7CisJCQlnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBtR3JpZC5kcmF3KGdsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7CisJCQlnbC5nbExvYWRJZGVudGl0eSgpOworCQkJZ2wuZ2xPcnRob2YoMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgICAgIGNyZWF0ZUdyaWQoZ2wsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHcmlkKEdMMTAgZ2wsIGZsb2F0IHcsIGZsb2F0IGgpIHsKKyAgICAgICAgbUdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQkJZmxvYXQgeCA9IHcgKiBpOworCQkJCQlmbG9hdCB5ID0gaCAqIGo7CisJCQkJCWZsb2F0IHogPSAwLjBmOworCQkJCQltR3JpZC5zZXQoaSxqLCB4LCB5LCB6KTsKKwkJCQl9CisJCQl9CisJCQltR3JpZC5jcmVhdGVCdWZmZXJPYmplY3RzKGdsKTsKKwkJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEKaW5kZXggNWQxNmU5My4uZjQ0Y2JjNCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICB9CiAKICAgICBTdGF0dXNCYXJQb2xpY3kgbUljb25Qb2xpY3k7Ci0gICAgCisKICAgICBpbnQgbUhlaWdodDsKICAgICBpbnQgbUljb25XaWR0aDsKIApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgaW50IG1QaXhlbEZvcm1hdDsKICAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKICAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICAKKwogICAgIC8vIGljb25zCiAgICAgTGluZWFyTGF5b3V0IG1JY29uczsKICAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKQEAgLTE1OCwxNCArMTU4LDE0IEBACiAgICAgcHJpdmF0ZSBUaWNrZXIgbVRpY2tlcjsKICAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOwotICAgIAorCiAgICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCiAgICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKICAgICBib29sZWFuIG1UcmFja2luZzsKICAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKLSAgICAKKwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9GUkFNRV9EVVJBVElPTiA9ICgxMDAwLzYwKTsKLSAgICAKKwogICAgIGJvb2xlYW4gbUFuaW1hdGluZzsKICAgICBsb25nIG1DdXJBbmltYXRpb25UaW1lOwogICAgIGZsb2F0IG1EaXNwbGF5SGVpZ2h0OwpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgYm9vbGVhbiBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CiAgICAgaW50IG1WaWV3RGVsdGE7CiAgICAgaW50W10gbUFic1BvcyA9IG5ldyBpbnRbMl07Ci0gICAgCisKICAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCiAgICAgaW50IG1EaXNhYmxlZCA9IDA7CiAKQEAgLTI0MCw3ICsyNDAsNyBAQAogCiAgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAKKwogICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKIAogICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKQEAgLTI4OSw4ICsyODksOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIFNsb2cuZChUQUcsICJhZGRJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICArICIgaWNvbj0iICsgaWNvbik7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXgKKyAgICAgICAgICAgICAgICArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXggKyAiIGljb249IiArIGljb24pOwogICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwogICAgICAgICB2aWV3LnNldChpY29uKTsKICAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvbldpZHRoLCBtSGVpZ2h0KSk7CkBAIC0yOTgsMTQgKzI5OCwxNSBAQAogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LAogICAgICAgICAgICAgU3RhdHVzQmFySWNvbiBvbGQsIFN0YXR1c0Jhckljb24gaWNvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIG9sZD0iICsgb2xkICsgIiBpY29uPSIgKyBpY29uKTsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleAorICAgICAgICAgICAgICAgICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOwogICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7CiAgICAgICAgIHZpZXcuc2V0KGljb24pOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4KTsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleAorICAgICAgICAgICAgICAgICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7CiAgICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKICAgICB9CiAKQEAgLTM1OCw3ICszNTksNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CiAKICAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OwogICAgICAgICBpbnQgb2xkSW5kZXggPSBtT25nb2luZy5maW5kRW50cnkoa2V5KTsKQEAgLTY0NywxOSArNjQ4LDE5IEBACiAgICAgICAgIH0KICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CiAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHRydWUpOwotICAgICAgICAKKwogICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwogICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKICAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKICAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIAorCiAgICAgICAgIGlmICghbVRpY2tpbmcpIHsKICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgewogICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGUgZXhwYW5kOiBleHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CkBAIC02NzIsNyArNjczLDcgQEAKICAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOwogICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgewogICAgICAgICBpZiAoU1BFVykgewogICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZApAQCAtNjgyLDcgKzY4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVk9IiArIG1BbmltWQogICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNjk5LDcgKzcwMCw3IEBACiAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7CiAgICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgewogICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CkBAIC03MTksNyArNzIwLDcgQEAKICAgICB2b2lkIHBlcmZvcm1Db2xsYXBzZSgpIHsKICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtQ29sbGFwc2U6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCiAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNzM0LDcgKzczNSw3IEBACiAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CiAgICAgICAgIH0KICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC04MDEsNyArODAyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKICAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKQEAgLTgzMCw3ICs4MzEsNyBAQAogICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcGVyZm9ybUZsaW5nKGludCB5LCBmbG9hdCB2ZWwsIGJvb2xlYW4gYWx3YXlzKSB7CiAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKICAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKQEAgLTg5MCw3ICs4OTEsNyBAQAogICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOwogICAgICAgICBzdG9wVHJhY2tpbmcoKTsKICAgICB9Ci0gICAgCisKICAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKFNQRVcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCkBAIC05MDAsNyArOTAxLDcgQEAKICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgZmluYWwgaW50IHN0YXR1c0JhclNpemUgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKICAgICAgICAgZmluYWwgaW50IGhpdFNpemUgPSBzdGF0dXNCYXJTaXplKjI7CiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewpAQCAtOTU0LDEwICs5NTUsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgdmVsID0gLXZlbDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcoKGludClldmVudC5nZXRSYXdZKCksIHZlbCwgZmFsc2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTAzNiw3ICsxMDM3LDcgQEAKICAgICAgICAgTXlUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBTdGF0dXNCYXJWaWV3IHNiKSB7CiAgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzYik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHZvaWQgdGlja2VyU3RhcnRpbmcoKSB7CiAgICAgICAgICAgICBtVGlja2luZyA9IHRydWU7CkBAIC0xMTA0LDcgKzExMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCkBAIC0xMTU0LDcgKzExNTUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICovCi0gICAgICAgIAorCiAgICAgICAgIGlmIChmYWxzZSkgewogICAgICAgICAgICAgcHcucHJpbnRsbigic2VlIHRoZSBsb2djYXQgZm9yIGEgZHVtcCBvZiB0aGUgdmlld3Mgd2UgaGF2ZSBjcmVhdGVkLiIpOwogICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCkBAIC0xNDQyLDcgKzE0NDMsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVsb2FkIHNvbWUgb2Ygb3VyIHJlc291cmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICogCisgICAgICoKICAgICAgKiBXZSBkb24ndCByZWxvYWQgZXZlcnl0aGluZyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgLS0gd2UgcHJvYmFibHkKICAgICAgKiBzaG91bGQsIGJ1dCBnZXR0aW5nIHRoYXQgc21vb3RoIGlzIHRvdWdoLiAgU29tZWRheSB3ZSdsbCBmaXggdGhhdC4gIEluIHRoZQogICAgICAqIG1lYW50aW1lLCBqdXN0IHVwZGF0ZSB0aGUgdGhpbmdzIHRoYXQgd2Uga25vdyBjaGFuZ2UuCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tawppbmRleCBiNDE3NTlhLi41ZGMwYzMwIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCisrKyBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAJYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCisJZnJhbWV3b3Jrcy9iYXNlL25hdGl2ZS9pbmNsdWRlIFwKIAkkKEpOSV9IX0lOQ0xVREUpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAppbmRleCAxZDY5MzYxLi44ZGM4OGRiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAorKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0jaW5jbHVkZSA8dHRzL1R0c0VuZ2luZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvdHRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1hdGguaD4KIApAQCAtMTU0LDcgKzE1NCw3IEBACiBjbGFzcyBTeW50aFByb3h5Sm5pU3RvcmFnZSB7CiAgICAgcHVibGljIDoKICAgICAgICAgam9iamVjdCAgICAgICAgICAgICAgICAgICB0dHNfcmVmOwotICAgICAgICBUdHNFbmdpbmUqICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZTsKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QqICAgICAgIG1FbmdpbmU7CiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZUxpYkhhbmRsZTsKICAgICAgICAgQXVkaW9UcmFjayogICAgICAgICAgICAgICBtQXVkaW9PdXQ7CiAgICAgICAgIGludDhfdCAgICAgICAgICAgICAgICAgICAgbVBsYXlTdGF0ZTsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAgICAgICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKCkgewogICAgICAgICAgICAgdHRzX3JlZiA9IE5VTEw7Ci0gICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UgPSBOVUxMOworICAgICAgICAgICAgbUVuZ2luZSA9IE5VTEw7CiAgICAgICAgICAgICBtRW5naW5lTGliSGFuZGxlID0gTlVMTDsKICAgICAgICAgICAgIG1BdWRpb091dCA9IE5VTEw7CiAgICAgICAgICAgICBtUGxheVN0YXRlID0gIFNZTlRIUExBWVNUQVRFX0lTX1NUT1BQRUQ7CkBAIC0xODQsOSArMTg0LDkgQEAKICAgICAgICAgflN5bnRoUHJveHlKbmlTdG9yYWdlKCkgewogICAgICAgICAgICAgLy9MT0dWKCJlbnRlcmluZyB+U3ludGhQcm94eUpuaVN0b3JhZ2UoKSIpOwogICAgICAgICAgICAga2lsbEF1ZGlvKCk7Ci0gICAgICAgICAgICBpZiAobU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zaHV0ZG93bigpOwotICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUVuZ2luZSkgeworICAgICAgICAgICAgICAgIG1FbmdpbmUtPmZ1bmNzLT5zaHV0ZG93bihtRW5naW5lKTsKKyAgICAgICAgICAgICAgICBtRW5naW5lID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtRW5naW5lTGliSGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgLy9MT0dFKCJ+U3ludGhQcm94eUpuaVN0b3JhZ2UoKTogYmVmb3JlIGNsb3NlIGxpYnJhcnkiKTsKQEAgLTI3MywyOCArMjczLDQ1IEBACiAgKiBDYWxsYmFjayBmcm9tIFRUUyBlbmdpbmUuCiAgKiBEaXJlY3RseSBzcGVha3MgdXNpbmcgQXVkaW9UcmFjayBvciB3cml0ZSB0byBmaWxlCiAgKi8KLXN0YXRpYyB0dHNfY2FsbGJhY2tfc3RhdHVzIHR0c1N5bnRoRG9uZUNCKHZvaWQgKiYgdXNlcmRhdGEsIHVpbnQzMl90IHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IComd2F2LCBzaXplX3QgJmJ1ZmZlclNpemUsIHR0c19zeW50aF9zdGF0dXMgc3RhdHVzKSB7CitleHRlcm4gIkMiIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190CitfX3R0c1N5bnRoRG9uZUNCKHZvaWQgKiogcFVzZXJkYXRhLCB1aW50MzJfdCByYXRlLAorICAgICAgICAgICAgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgIGludDhfdCAqKnBXYXYsIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICBhbmRyb2lkX3R0c19zeW50aF9zdGF0dXNfdCBzdGF0dXMpIAorewogICAgIC8vTE9HVigidHRzU3ludGhEb25lQ2FsbGJhY2s6ICVkIGJ5dGVzIiwgYnVmZmVyU2l6ZSk7CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAgZW5jb2Rpbmc7CiAKLSAgICBpZiAodXNlcmRhdGEgPT0gTlVMTCl7CisgICAgaWYgKCpwVXNlcmRhdGEgPT0gTlVMTCl7CiAgICAgICAgIExPR0UoInVzZXJkYXRhID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICB9Ci0gICAgYWZ0ZXJTeW50aERhdGFfdCogcEZvckFmdGVyID0gKGFmdGVyU3ludGhEYXRhX3QqKXVzZXJkYXRhOworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIkNhbid0IHBsYXksIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgfQorICAgIGFmdGVyU3ludGhEYXRhX3QqIHBGb3JBZnRlciA9IChhZnRlclN5bnRoRGF0YV90KikgKnBVc2VyZGF0YTsKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcEpuaURhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKShwRm9yQWZ0ZXItPmpuaVN0b3JhZ2UpOwogCiAgICAgaWYgKHBGb3JBZnRlci0+dXNhZ2VNb2RlID09IFVTQUdFTU9ERV9QTEFZX0lNTUVESUFURUxZKXsKICAgICAgICAgLy9MT0dWKCJEaXJlY3Qgc3BlZWNoIik7CiAKLSAgICAgICAgaWYgKHdhdiA9PSBOVUxMKSB7CisgICAgICAgIGlmICgqcFdhdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOworICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKICAgICAgICAgICAgIExPR1YoIk51bGw6IHNwZWVjaCBoYXMgY29tcGxldGVkIik7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChidWZmZXJTaXplID4gMCkgewotICAgICAgICAgICAgcHJlcEF1ZGlvVHJhY2socEpuaURhdGEsIHBGb3JBZnRlci0+c3RyZWFtVHlwZSwgcmF0ZSwgKEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQpZm9ybWF0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKCpwQnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHByZXBBdWRpb1RyYWNrKHBKbmlEYXRhLCBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUsIHJhdGUsIGVuY29kaW5nLCBjaGFubmVsKTsKICAgICAgICAgICAgIGlmIChwSm5pRGF0YS0+bUF1ZGlvT3V0KSB7CiAgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1QbGF5TG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYocEpuaURhdGEtPm1BdWRpb091dC0+c3RvcHBlZCgpCkBAIC0zMDMsMjggKzMyMCwzMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bVBsYXlMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiVXNlRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90Kil3YXYsIGJ1ZmZlclNpemUvMik7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90KikqcFdhdiwgKnBCdWZmZXJTaXplLzIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bUF1ZGlvT3V0LT53cml0ZSh3YXYsIGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIG1lbXNldCh3YXYsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tQXVkaW9PdXQtPndyaXRlKCpwV2F2LCAqcEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIG1lbXNldCgqcFdhdiwgMCwgKnBCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICAvL0xPR1YoIkF1ZGlvVHJhY2sgd3JvdGU6ICVkIGJ5dGVzIiwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExPR0UoIkNhbid0IHBsYXksIG51bGwgYXVkaW90cmFjayIpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CisgICAgICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSAgaWYgKHBGb3JBZnRlci0+dXNhZ2VNb2RlID09IFVTQUdFTU9ERV9XUklURV9UT19GSUxFKSB7CiAgICAgICAgIC8vTE9HVigiU2F2ZSB0byBmaWxlIik7Ci0gICAgICAgIGlmICh3YXYgPT0gTlVMTCkgeworICAgICAgICBpZiAoKnBXYXYgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKICAgICAgICAgICAgIExPR1YoIk51bGw6IHNwZWVjaCBoYXMgY29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IDApeworICAgICAgICBpZiAoKnBCdWZmZXJTaXplID4gMCl7CiAgICAgICAgICAgICBpZiAoYlVzZUZpbHRlcikgewotICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90Kil3YXYsIGJ1ZmZlclNpemUvMik7CisgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKSpwV2F2LCAqcEJ1ZmZlclNpemUvMik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmd3JpdGUod2F2LCAxLCBidWZmZXJTaXplLCBwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOwotICAgICAgICAgICAgbWVtc2V0KHdhdiwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBmd3JpdGUoKnBXYXYsIDEsICpwQnVmZmVyU2l6ZSwgcEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIG1lbXNldCgqcFdhdiwgMCwgKnBCdWZmZXJTaXplKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBGdXR1cmUgdXBkYXRlOgpAQCAtMzMyLDcgKzM1Miw3IEBACiAgICAgLy8gICAgICBqYXZhVFRTRmllbGRzLnN5bnRoUHJveHlNZXRob2RQb3N0IG1ldGhvZGUgdG8gbm90aWZ5CiAgICAgLy8gICAgICBwbGF5YmFjayBoYXMgY29tcGxldGVkIGlmIHRoZSBzeW50aGVzaXMgaXMgZG9uZSBvciBpZiBhIG1hcmtlciBoYXMgYmVlbiByZWFjaGVkLgogCi0gICAgaWYgKHN0YXR1cyA9PSBUVFNfU1lOVEhfRE9ORSkgeworICAgIGlmIChzdGF0dXMgPT0gQU5EUk9JRF9UVFNfU1lOVEhfRE9ORSkgewogICAgICAgICAvLyB0aGlzIHN0cnVjdCB3YXMgYWxsb2NhdGVkIGluIHRoZSBvcmlnaW5hbCBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrIGNhbGwsCiAgICAgICAgIC8vIGFsbCBwcm9jZXNzaW5nIG1hdGNoaW5nIHRoaXMgY2FsbCBpcyBub3cgZG9uZS4KICAgICAgICAgTE9HVigiU3BlZWNoIHN5bnRoZXNpcyBkb25lLiIpOwpAQCAtMzQyLDE2ICszNjIsMTYgQEAKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CiAgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgfQogCiAgICAgLy8gd2UgZG9uJ3QgdXBkYXRlIHRoZSB3YXYgKG91dHB1dCkgcGFyYW1ldGVyIGFzIHdlJ2xsIGxldCB0aGUgbmV4dCBjYWxsYmFjawogICAgIC8vIHdyaXRlIGF0IHRoZSBzYW1lIGxvY2F0aW9uLCB3ZSd2ZSBjb25zdW1lZCB0aGUgZGF0YSBhbHJlYWR5LCBidXQgd2UgbmVlZAogICAgIC8vIHRvIHVwZGF0ZSBidWZmZXJTaXplIHRvIGxldCB0aGUgVFRTIGVuZ2luZSBrbm93IGhvdyBtdWNoIGl0IGNhbiB3cml0ZSB0aGUKICAgICAvLyBuZXh0IHRpbWUgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbi4KLSAgICBidWZmZXJTaXplID0gcEpuaURhdGEtPm1CdWZmZXJTaXplOworICAgICpwQnVmZmVyU2l6ZSA9IHBKbmlEYXRhLT5tQnVmZmVyU2l6ZTsKIAotICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfQ09OVElOVUU7CisgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFOwogfQogCiAKQEAgLTM2MCw3ICszODAsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMb3dTaGVsZihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiBhcHBseUZpbHRlciwKICAgICAgICAgamZsb2F0IGZpbHRlckdhaW4sIGpmbG9hdCBhdHRlbnVhdGlvbkluRGIsIGpmbG9hdCBmcmVxSW5IeiwgamZsb2F0IHNsb3BlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfU1VDQ0VTUzsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfU1VDQ0VTUzsKIAogICAgIGJVc2VGaWx0ZXIgPSBhcHBseUZpbHRlcjsKICAgICBpZiAoYXBwbHlGaWx0ZXIpIHsKQEAgLTM3Myw3ICszOTMsNyBAQAogICAgICAgICAgICAgaW5pdGlhbGl6ZUVRKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHNsb3BlLCBjYW4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4NSw3ICs0MDUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9uYXRpdmVfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKICAgICAgICAgam9iamVjdCB3ZWFrX3RoaXMsIGpzdHJpbmcgbmF0aXZlU29MaWIsIGpzdHJpbmcgZW5nQ29uZmlnKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGJVc2VGaWx0ZXIgPSBmYWxzZTsKIApAQCAtNDAyLDE4ICs0MjIsMjggQEAKICAgICBpZiAoZW5naW5lX2xpYl9oYW5kbGUgPT0gTlVMTCkgewogICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbmF0aXZlX3NldHVwKCk6IGVuZ2luZV9saWJfaGFuZGxlID09IE5VTEwiKTsKICAgICB9IGVsc2UgewotICAgICAgICBUdHNFbmdpbmUgKigqZ2V0X1R0c0VuZ2luZSkoKSA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PFR0c0VuZ2luZSogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiZ2V0VHRzRW5naW5lIikpOworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqICgqZ2V0X1R0c0VuZ2luZSkoKSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGFuZHJvaWRfdHRzX2VuZ2luZV90KiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJhbmRyb2lkX2dldFR0c0VuZ2luZSIpKTsKIAotICAgICAgICBwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gKCpnZXRfVHRzRW5naW5lKSgpOwotICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZUxpYkhhbmRsZSA9IGVuZ2luZV9saWJfaGFuZGxlOwotCi0gICAgICAgIGlmIChwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7Ci0gICAgICAgICAgICBwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5pbml0KHR0c1N5bnRoRG9uZUNCLCBlbmdDb25maWdTdHJpbmcpOworICAgICAgICAvLyBTdXBwb3J0IG9ic29sZXRlL2xlZ2FjeSBiaW5hcnkgbW9kdWxlcworICAgICAgICBpZiAoZ2V0X1R0c0VuZ2luZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBnZXRfVHRzRW5naW5lID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGFuZHJvaWRfdHRzX2VuZ2luZV90KiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJnZXRUdHNFbmdpbmUiKSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXN1bHQgPSBUVFNfU1VDQ0VTUzsKKyAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmUgPSAoKmdldF9UdHNFbmdpbmUpKCk7CisgICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lTGliSGFuZGxlID0gZW5naW5lX2xpYl9oYW5kbGU7CisKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBKbmlTdG9yYWdlLT5tRW5naW5lOworICAgICAgICBpZiAoZW5naW5lKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7CisgICAgICAgICAgICBlbmdpbmUtPmZ1bmNzLT5pbml0KAorICAgICAgICAgICAgICAgIGVuZ2luZSwKKyAgICAgICAgICAgICAgICBfX3R0c1N5bnRoRG9uZUNCLAorICAgICAgICAgICAgICAgIGVuZ0NvbmZpZ1N0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBBTkRST0lEX1RUU19TVUNDRVNTOwogICAgIH0KIAogICAgIC8vIHdlIHVzZSBhIHdlYWsgcmVmZXJlbmNlIHNvIHRoZSBTeW50aFByb3h5IG9iamVjdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCkBAIC00NjIsNyArNDkyLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfaXNMYW5ndWFnZUF2YWlsYWJsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfaXNMYW5ndWFnZUF2YWlsYWJsZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC00NzQsOCArNTA0LDEwIEBACiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+aXNMYW5ndWFnZUF2YWlsYWJsZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5pc0xhbmd1YWdlQXZhaWxhYmxlKGVuZ2luZSxsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC00ODcsNyArNTE5LDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0Q29uZmlnKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwganN0cmluZyBlbmdpbmVDb25maWcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldENvbmZpZygpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC00OTgsOSArNTMwLDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBjb25zdCBjaGFyICplbmdpbmVDb25maWdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGVuZ2luZUNvbmZpZywgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSxBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfQ09ORklHLAogICAgICAgICAgICAgICAgIGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZywgc3RybGVuKGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZykpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbmdpbmVDb25maWcsIGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZyk7CkBAIC01MTIsNyArNTQ1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TGFuZ3VhZ2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExhbmd1YWdlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTUyNSw5ICs1NTgsMTAgQEAKICAgICBjb25zdCBjaGFyICpsYW5nTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgMCk7CiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0TGFuZ3VhZ2UobGFuZ05hdGl2ZVN0cmluZywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldExhbmd1YWdlKGVuZ2luZSwgbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNTQxLDcgKzU3NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X2xvYWRMYW5ndWFnZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbG9hZExhbmd1YWdlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTU1Miw5ICs1ODYsMTAgQEAKICAgICBjb25zdCBjaGFyICpsYW5nTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgMCk7CiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+bG9hZExhbmd1YWdlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5sb2FkTGFuZ3VhZ2UoZW5naW5lLCBsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC01NjksNyArNjA0LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0U3BlZWNoUmF0ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGppbnQgc3BlZWNoUmF0ZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0U3BlZWNoUmF0ZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01ODQsOSArNjE5LDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBMT0dJKCJzZXR0aW5nIHNwZWVjaCByYXRlIHRvICVkIiwgc3BlZWNoUmF0ZSk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoInJhdGUiLCBidWZmZXIsIGJ1ZlNpemUpOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLCAicmF0ZSIsIGJ1ZmZlciwgYnVmU2l6ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTU5Nyw3ICs2MzMsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRQaXRjaChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGppbnQgcGl0Y2gpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFBpdGNoKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTYxMiw5ICs2NDgsMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIExPR0koInNldHRpbmcgcGl0Y2ggdG8gJWQiLCBwaXRjaCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoInBpdGNoIiwgYnVmZmVyLCBidWZTaXplKTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSwgInBpdGNoIiwgYnVmZmVyLCBidWZTaXplKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNjI1LDcgKzY2Miw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIHRleHRKYXZhU3RyaW5nLCBqc3RyaW5nIGZpbGVuYW1lSmF2YVN0cmluZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC02MzMsNyArNjcwLDcgQEAKICAgICB9CiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKLSAgICBpZiAoIXBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmICghcFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogaW52YWxpZCBlbmdpbmUgaGFuZGxlIik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjQzLDEyICs2ODAsMjIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7CiAKICAgICAvLyBSZXRyaWV2ZSBhdWRpbyBwYXJhbWV0ZXJzIGJlZm9yZSB3cml0aW5nIHRoZSBmaWxlIGhlYWRlcgotICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgZW5jb2RpbmcgPSBERUZBVUxUX1RUU19GT1JNQVQ7CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCBlbmNvZGluZzsKICAgICB1aW50MzJfdCByYXRlID0gREVGQVVMVF9UVFNfUkFURTsKICAgICBpbnQgY2hhbm5lbHMgPSBERUZBVUxUX1RUU19OQl9DSEFOTkVMUzsKLSAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldEF1ZGlvRm9ybWF0KGVuY29kaW5nLCByYXRlLCBjaGFubmVscyk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgIGZvcm1hdCA9IEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9ERUZBVUxUOwogCi0gICAgaWYgKChlbmNvZGluZyAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgJiYgKGVuY29kaW5nICE9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpKSB7CisgICAgZW5naW5lLT5mdW5jcy0+c2V0QXVkaW9Gb3JtYXQoZW5naW5lLCAmZm9ybWF0LCAmcmF0ZSwgJmNoYW5uZWxzKTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBlbmdpbmUgdXNlcyBpbnZhbGlkIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTY3Nyw3ICs3MjQsOCBAQAogICAgIHVuc2lnbmVkIGludCB1bmlxdWVfaWRlbnRpZmllcjsKIAogICAgIG1lbXNldChwU3ludGhEYXRhLT5tQnVmZmVyLCAwLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSk7Ci0gICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zeW50aGVzaXplVGV4dCh0ZXh0TmF0aXZlU3RyaW5nLAorCisgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3ludGhlc2l6ZVRleHQoZW5naW5lLCB0ZXh0TmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgcFN5bnRoRGF0YS0+bUJ1ZmZlciwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUsICh2b2lkICopcEZvckFmdGVyKTsKIAogICAgIGxvbmcgZmlsZWxlbiA9IGZ0ZWxsKHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7CkBAIC03MzcsNyArNzg1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIHRleHRKYXZhU3RyaW5nLCBqaW50IGphdmFTdHJlYW1UeXBlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhaygpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC03NTksMTAgKzgwNywxMiBAQAogICAgIHBGb3JBZnRlci0+dXNhZ2VNb2RlICA9IFVTQUdFTU9ERV9QTEFZX0lNTUVESUFURUxZOwogICAgIHBGb3JBZnRlci0+c3RyZWFtVHlwZSA9IChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpIGphdmFTdHJlYW1UeXBlOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmIChwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRleHROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHRleHRKYXZhU3RyaW5nLCAwKTsKICAgICAgICAgbWVtc2V0KHBTeW50aERhdGEtPm1CdWZmZXIsIDAsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplKTsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zeW50aGVzaXplVGV4dCh0ZXh0TmF0aXZlU3RyaW5nLAorICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zeW50aGVzaXplVGV4dChlbmdpbmUsIHRleHROYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgcFN5bnRoRGF0YS0+bUJ1ZmZlciwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUsICh2b2lkICopcEZvckFmdGVyKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnModGV4dEphdmFTdHJpbmcsIHRleHROYXRpdmVTdHJpbmcpOwogICAgIH0KQEAgLTc3NCw3ICs4MjQsNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC03OTAsOCArODQwLDkgQEAKICAgICB9CiAgICAgcFN5bnRoRGF0YS0+bVBsYXlMb2NrLnVubG9jaygpOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN0b3AoKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN0b3AoZW5naW5lKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtODAxLDcgKzg1Miw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3BTeW5jKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC04MjksNyArODgwLDcgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmIChwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIHNpemVfdCBidWZTaXplID0gMTAwOwogICAgICAgICBjaGFyIGxhbmdbYnVmU2l6ZV07CiAgICAgICAgIGNoYXIgY291bnRyeVtidWZTaXplXTsKQEAgLTgzOSw3ICs4OTAsOSBAQAogICAgICAgICBtZW1zZXQodmFyaWFudCwgMCwgYnVmU2l6ZSk7CiAgICAgICAgIGpvYmplY3RBcnJheSByZXRMb2NhbGUgPSAoam9iamVjdEFycmF5KWVudi0+TmV3T2JqZWN0QXJyYXkoMywKICAgICAgICAgICAgICAgICBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpLCBlbnYtPk5ld1N0cmluZ1VURigiIikpOwotICAgICAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmdldExhbmd1YWdlKGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOworCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgICAgICBlbmdpbmUtPmZ1bmNzLT5nZXRMYW5ndWFnZShlbmdpbmUsIGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDAsIGVudi0+TmV3U3RyaW5nVVRGKGxhbmcpKTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAxLCBlbnYtPk5ld1N0cmluZ1VURihjb3VudHJ5KSk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMiwgZW52LT5OZXdTdHJpbmdVVEYodmFyaWFudCkpOwpAQCAtODY0LDggKzkxNyw5IEBACiAgICAgY2hhciBidWZbYnVmU2l6ZV07CiAgICAgbWVtc2V0KGJ1ZiwgMCwgYnVmU2l6ZSk7CiAgICAgLy8gVE9ETyBjaGVjayByZXR1cm4gY29kZXMKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+Z2V0UHJvcGVydHkoInJhdGUiLCBidWYsICZidWZTaXplKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmdldFByb3BlcnR5KGVuZ2luZSwicmF0ZSIsIGJ1ZiwgJmJ1ZlNpemUpOwogICAgIH0KICAgICByZXR1cm4gYXRvaShidWYpOwogfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IDI3NzA2ZWYuLjg2OTMyOTQgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKQEAgLTY2Nyw2ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZGUgPSBVbmxvY2tNb2RlLlBhc3N3b3JkOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc6CkBAIC02ODcsOCArNjg4LDE3IEBACiAKICAgICBwcml2YXRlIHZvaWQgc2hvd1RpbWVvdXREaWFsb2coKSB7CiAgICAgICAgIGludCB0aW1lb3V0SW5TZWNvbmRzID0gKGludCkgTG9ja1BhdHRlcm5VdGlscy5GQUlMRURfQVRURU1QVF9USU1FT1VUX01TIC8gMTAwMDsKKyAgICAgICAgaW50IG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOzsKKyAgICAgICAgaWYoZ2V0VW5sb2NrTW9kZSgpID09IFVubG9ja01vZGUuUGFzc3dvcmQpIHsKKyAgICAgICAgICAgIGlmKG1Mb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCkgPT0KKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQykgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtQ29udGV4dC5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgbWVzc2FnZUlkLAogICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldEZhaWxlZEF0dGVtcHRzKCksCiAgICAgICAgICAgICAgICAgdGltZW91dEluU2Vjb25kcyk7CiAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQppbmRleCBhNWVmMWZhLi5iMzcwN2IwIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQpAQCAtMjIwLDcgKzIyMCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0KICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwpAQCAtNTE4LDcgKzUxNyw3IEBACiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRUZXh0KCIiKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dAotICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjU4LDcgKzY1Nyw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yKTsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpAQCAtNjc2LDYgKzY3NCw1IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25QaG9uZVN0YXRlQ2hhbmdlZChTdHJpbmcgbmV3U3RhdGUpIHsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggMzlmMjkxNy4uNjBjZDU2YyAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQpAQCAtNTMsNiArNTMsOCBAQAogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGE7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1QYXNzd29yZEVudHJ5OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKQEAgLTg3LDggKzg5LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGludCBxdWFsaXR5ID0gbG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQWxwaGEgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9PSBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgfHwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyA9PSBxdWFsaXR5OworICAgICAgICBtSXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKKyAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHkKKyAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCA9PSBxdWFsaXR5OwogCiAgICAgICAgIG1LZXlib2FyZFZpZXcgPSAoUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldykgZmluZFZpZXdCeUlkKFIuaWQua2V5Ym9hcmQpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeSA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRFbnRyeSk7CkBAIC05OSw3ICsxMDIsNyBAQAogICAgICAgICBtVGl0bGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmVudGVyX3Bhc3N3b3JkX2xhYmVsKTsKIAogICAgICAgICBtS2V5Ym9hcmRIZWxwZXIgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKGNvbnRleHQsIG1LZXlib2FyZFZpZXcsIHRoaXMpOwotICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKGlzQWxwaGEgPyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQorICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKG1Jc0FscGhhID8gUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfQUxQSEEKICAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOwogCiAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KQEAgLTEwOCwxMCArMTExLDExIEBACiAKICAgICAgICAgLy8gVGhpcyBhbGxvd3Mga2V5Ym9hcmRzIHdpdGggb3ZlcmxhcHBpbmcgcXdlcnR5L251bWVyaWMga2V5cyB0byBjaG9vc2UganVzdCB0aGUKICAgICAgICAgLy8gbnVtZXJpYyBrZXlzLgotICAgICAgICBpZiAoaXNBbHBoYSkgeworICAgICAgICBpZiAobUlzQWxwaGEpIHsKICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEtleUxpc3RlbmVyKFRleHRLZXlMaXN0ZW5lci5nZXRJbnN0YW5jZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEtleUxpc3RlbmVyKERpZ2l0c0tleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KQEAgLTEzOCw2ICsxNDIsNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICAvLyBzdGFydCBmcmVzaAogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRUZXh0KCIiKTsKKyAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnJlcXVlc3RGb2N1cygpOwogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogCkBAIC0xNzQsNiArMTc5LDkgQEAKICAgICAgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gbUxvY2tQYXR0ZXJuVXRpbHMuc2V0TG9ja291dEF0dGVtcHREZWFkbGluZSgpOwogICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmcpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CiAgICAgICAgIH0KICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CiAgICAgfQpAQCAtMTk3LDggKzIwNSw4IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKCkgewogICAgICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSk7CiAgICAgICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICAgICAgfQogICAgICAgICB9LnN0YXJ0KCk7CiAgICAgfQpAQCAtMjY0LDQgKzI3MiwxMiBAQAogCiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgaWYobUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOworICAgICAgICB9CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggNTY0MjU4OC4uZTc1MTFlMCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtNTMsNiArNTMsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uQmFyVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0UXVldWU7CkBAIC0xMTQsNiArMTE1LDggQEAKICAgICBwcml2YXRlIExheW91dEluZmxhdGVyIG1MYXlvdXRJbmZsYXRlcjsKIAogICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkJhclZpZXcgbUFjdGlvbkJhcjsKIAogICAgIHByaXZhdGUgRHJhd2FibGVGZWF0dXJlU3RhdGVbXSBtRHJhd2FibGVzOwogCkBAIC0yNzYsNiArMjc5LDggQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0VGl0bGUodGl0bGUpOwogICAgICAgICB9CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOwogICAgIH0KQEAgLTMwMSw3ICszMDYsNyBAQAogICAgICAgICAvLyBBbHJlYWR5IHByZXBhcmVkIChpc1ByZXBhcmVkIHdpbGwgYmUgcmVzZXQgdG8gZmFsc2UgbGF0ZXIpCiAgICAgICAgIGlmIChzdC5pc1ByZXBhcmVkKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KKyAgICAgICAgCiAgICAgICAgIGlmICgobVByZXBhcmVkUGFuZWwgIT0gbnVsbCkgJiYgKG1QcmVwYXJlZFBhbmVsICE9IHN0KSkgewogICAgICAgICAgICAgLy8gQW5vdGhlciBQYW5lbCBpcyBwcmVwYXJlZCBhbmQgcG9zc2libHkgb3Blbiwgc28gY2xvc2UgaXQKICAgICAgICAgICAgIGNsb3NlUGFuZWwobVByZXBhcmVkUGFuZWwsIGZhbHNlKTsKQEAgLTMxNSw5ICszMjAsMTEgQEAKIAogICAgICAgICBpZiAoc3QuY3JlYXRlZFBhbmVsVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBJbml0IHRoZSBwYW5lbCBzdGF0ZSdzIG1lbnUtLXJldHVybiBmYWxzZSBpZiBpbml0IGZhaWxlZAotICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCB8fCBzdC5yZWZyZXNoTWVudUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBDYWxsIGNhbGxiYWNrLCBhbmQgcmV0dXJuIGlmIGl0IGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IG1lbnUKICAgICAgICAgICAgICAgICBpZiAoKGNiID09IG51bGwpIHx8ICFjYi5vbkNyZWF0ZVBhbmVsTWVudShzdC5mZWF0dXJlSWQsIHN0Lm1lbnUpKSB7CkBAIC0zMjYsNiArMzMzLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRNZW51KHN0Lm1lbnUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2FsbGJhY2sgYW5kIHJldHVybiBpZiB0aGUgY2FsbGJhY2sgZG9lcyBub3Qgd2FudCB0byBzaG93IHRoZSBtZW51CkBAIC0zNzQsMTEgKzM4Nyw5IEBACiAgICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFyTWVudVZpZXdzKFBhbmVsRmVhdHVyZVN0YXRlIHN0KSB7Ci0KICAgICAgICAgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIG9uIGNvbmZpZyBjaGFuZ2VzLCBzbyB3ZSBzaG91bGQgbWFrZSBzdXJlCiAgICAgICAgIC8vIHRoZSB2aWV3cyB3aWxsIGJlIHJlY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIG5ldyBvcmllbnRhdGlvbiwgZXRjLgogCkBAIC01NDUsNiArNTU2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdC5tZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0Lm1lbnUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSB0cnVlOworICAgICAgICBzdC5yZWZyZXNoRGVjb3JWaWV3ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFByZXBhcmUgdGhlIG9wdGlvbnMgcGFuZWwgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gYmFyCisgICAgICAgIGlmICgoZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUiB8fCBmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMKQorICAgICAgICAgICAgICAgICYmIG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QgPSBnZXRQYW5lbFN0YXRlKFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3QuaXNQcmVwYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHByZXBhcmVQYW5lbChzdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhbmVsIGtleSBpcyBwdXNoZWQgZG93bi4KICAgICAgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSBmZWF0dXJlIElEIG9mIHRoZSByZWxldmFudCBwYW5lbCAoZGVmYXVsdHMgdG8gRkVBVFVSRV9PUFRJT05TX1BBTkVMfS4KQEAgLTIxMDYsNiArMjEzNyw5IEBACiAKICAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93Tm9UaXRsZSwgZmFsc2UpKSB7CiAgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgfSBlbHNlIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0FjdGlvbkJhciwgZmFsc2UpKSB7CisgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBhbiBhY3Rpb24gYmFyIGlmIHRoZXJlIGlzIG5vIHRpdGxlLgorICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0Z1bGxzY3JlZW4sIGZhbHNlKSkgewpAQCAtMjE4OSw2ICsyMjIzLDggQEAKICAgICAgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgZmxvYXRpbmcsIHdlIG5lZWQgYSBkaWFsb2cgbGF5b3V0CiAgICAgICAgICAgICBpZiAobUlzRmxvYXRpbmcpIHsKICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmRpYWxvZ190aXRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2FjdGlvbl9iYXI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3RpdGxlOwogICAgICAgICAgICAgfQpAQCAtMjI3Myw2ICsyMzA5LDExIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyID0gKEFjdGlvbkJhclZpZXcpIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXIpOworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwgJiYgbUFjdGlvbkJhci5nZXRUaXRsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRUaXRsZShtVGl0bGUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI2MjYsNiArMjY2Nyw4IEBACiAKICAgICAgICAgYm9vbGVhbiByZWZyZXNoRGVjb3JWaWV3OwogCisgICAgICAgIGJvb2xlYW4gcmVmcmVzaE1lbnVDb250ZW50OworICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0T3BlbjsKICAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gd2FzTGFzdEV4cGFuZGVkOwpkaWZmIC0tZ2l0IGEvcHJlbG9hZGVkLWNsYXNzZXMgYi9wcmVsb2FkZWQtY2xhc3NlcwppbmRleCBiNjAyMDM5Li45Njg2ZmM5IDEwMDY0NAotLS0gYS9wcmVsb2FkZWQtY2xhc3NlcworKysgYi9wcmVsb2FkZWQtY2xhc3NlcwpAQCAtNTYzLDggKzU2Myw2IEBACiBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwogYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldwotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcgotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25MaXN0VmlldwogYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94CkBAIC01ODIsNiArNTgwLDcgQEAKIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3JFNjYWxlVHlwZQogYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0CithbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3cKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5MaXN0VmlldyRTYXZlZFN0YXRlCiBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIKQEAgLTY4NSw3ICs2ODQsNiBAQAogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyCiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsCiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXIKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Db250YWN0SGVhZGVyV2lkZ2V0CiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlhbG9nVGl0bGUKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5FZGl0YWJsZUlucHV0Q29ubmVjdGlvbgogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQKQEAgLTY5Nyw3ICs2OTUsNiBAQAogY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldERlY29kZXJJQ1UKIGNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0LkNoYXJzZXRFbmNvZGVySUNVCiBjb20uaWJtLmljdTRqbmkuY2hhcnNldC5DaGFyc2V0SUNVCi1jb20uaWJtLmljdTRqbmkuY2hhcnNldC5DaGFyc2V0UHJvdmlkZXJJQ1UKIGNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0Lk5hdGl2ZUNvbnZlcnRlcgogY29tLmlibS5pY3U0am5pLmNvbW1vbi5FcnJvckNvZGUKIGNvbS5pYm0uaWN1NGpuaS5sYW5nLlVDaGFyYWN0ZXIKQEAgLTcwNyw5ICs3MDQsNiBAQAogY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlQ29sbGF0aW9uCiBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0CiBjb20uaWJtLmljdTRqbmkudGV4dC5SdWxlQmFzZWRDb2xsYXRvcgotY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0Ci1jb20uaWJtLmljdTRqbmkudXRpbC5SZXNvdXJjZXMKLWNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyREZWZhdWx0VGltZVpvbmVzCiBkYWx2aWsuc3lzdGVtLkRhbHZpa0xvZ0hhbmRsZXIKIGRhbHZpay5zeXN0ZW0uRGFsdmlrTG9nZ2luZwogZGFsdmlrLnN5c3RlbS5OYXRpdmVTdGFydApAQCAtNzMzLDcgKzcyNyw2IEBACiBqYXZhLmlvLkZpbGUKIGphdmEuaW8uRmlsZURlc2NyaXB0b3IKIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtCi1qYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSRSZXBvc2l0aW9uaW5nTG9jawogamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbQogamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQpAQCAtNzU4LDcgKzc1MSw2IEBACiBqYXZhLmlvLlByaW50V3JpdGVyCiBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyCiBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUKLWphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSRSZXBvc2l0aW9uTG9jawogamF2YS5pby5SZWFkZXIKIGphdmEuaW8uU2VyaWFsaXphYmxlCiBqYXZhLmlvLlN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgpAQCAtOTMwLDcgKzkyMiw2IEBACiBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlCiBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZQogamF2YS50ZXh0LkNvbGxhdG9yCi1qYXZhLnRleHQuQ29sbGF0b3IkMQogamF2YS50ZXh0LkRhdGVGb3JtYXQKIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkCiBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdApAQCAtMTEyNiw3ICsxMTE3LDYgQEAKIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuSW5wdXRTdHJlYW1IZWxwZXIkMQogb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5JbnB1dFN0cmVhbUhlbHBlciRFeHBvc2VkQnl0ZUFycmF5SW5wdXRTdHJlYW0KIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTG9jYWxlQ2FjaGUKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnCiBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk51bWJlckNvbnZlcnRlcgogb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Qcml2aUFjdGlvbgogb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5UaHJlYWRMb2NhbENhY2hlCkBAIC0xMTM5LDcgKzExMjksNiBAQAogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5GaWxlQ2hhbm5lbEZhY3RvcnkKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGlyZWN0QnVmZmVyCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwkUmVwb3NpdGlvbmluZ0xvY2sKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUxvY2tJbXBsCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyJDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggODdkZTc5YS4uODNjZTNlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTI2OSwxNCArMjY5LDEwIEBACiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgeworICAgIHB1YmxpYyBib29sZWFuIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50LnNldEVuYWJsZWQobUlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkRlYWQgQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ6ICIgKyBjbGllbnQsIHJlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgcmV0dXJuIG1Jc0VuYWJsZWQ7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQppbmRleCA4MWI4ZDQwLi45ZmY3ZGU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCkBAIC0yOCwxMSArMjgsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC00Niw2ICs0OCw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNvbm5lY3Rpdml0eS5UZXRoZXJpbmc7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTY0LDcgKzY4LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtMTA0LDYgKzEwNywxMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUluaXRpYWxCcm9hZGNhc3Q7CiAKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtTmV0VHJhbnNpdGlvbldha2VMb2NrOworICAgIHByaXZhdGUgU3RyaW5nIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeSA9ICIiOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQ7CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXR3b3JrQXR0cmlidXRlcyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDbGFzcyBmb3IgaG9sZGluZyBzZXR0aW5ncyByZWFkIGZyb20gcmVzb3VyY2VzLgpAQCAtMTk0LDYgKzIwMiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwogICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKQEAgLTU5NywxNSArNjExLDcgQEAKICAgICAgICAgICAgICAgICBuZXR3b3JrLnJlY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZVVzZXJzLmFkZChmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLLAotICAgICAgICAgICAgICAgICAgICAgICAgZiksIGdldFJlc3RvcmVEZWZhdWx0TmV0d29ya0RlbGF5KCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmsuc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKGZlYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOwpAQCAtNzI0LDggKzczMCw3IEBACiAgICAgICAgICAgICB0cmFja2VyLnRlYXJkb3duKCk7CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGRvIGl0IHRoZSBvbGQgZmFzaGlvbmVkIHdheQotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIuc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwgcGlkLCB1aWQpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NTIsNyArNzU3LDMyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGhvc3RBZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGFkZEhvc3RSb3V0ZSh0cmFja2VyLCBob3N0QWRkcmVzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFkZEhvc3RSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50LCBpbnQgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG50LmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIEludGVnZXIudG9IZXhTdHJpbmcoaG9zdEFkZHJlc3MpICsKKyAgICAgICAgICAgICAgICAgICAgICIoIiArIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgaG9zdEFkZHJlc3MgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKGludGVyZmFjZU5hbWUsIGhvc3RBZGRyZXNzKSA9PSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC04NTksNiArODg5LDEyIEBACiAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpdml0eVNlcnZpY2UiKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZW5mb3JjZUNvbm5lY3Rpdml0eUludGVybmFsUGVybWlzc2lvbigpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DT05ORUNUSVZJVFlfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgIkNvbm5lY3Rpdml0eVNlcnZpY2UiKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBIYW5kbGUgYSB7QGNvZGUgRElTQ09OTkVDVEVEfSBldmVudC4gSWYgdGhpcyBwZXJ0YWlucyB0byB0aGUgbm9uLWFjdGl2ZQogICAgICAqIG5ldHdvcmssIHdlIGlnbm9yZSBpdC4gSWYgaXQgaXMgZm9yIHRoZSBhY3RpdmUgbmV0d29yaywgd2Ugc2VuZCBvdXQgYQpAQCAtMTEzNCwxNSArMTE3MCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIk5ldHdvcmsgZGVjbGluZWQgdGVhcmRvd24gcmVxdWVzdCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhaWxvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlck5ldC5yZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29ubmVjdGl2aXR5U2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIG5ldyBkZWZhdWx0IG5ldHdvcmssIHJlbGVhc2UgdGhlIHRyYW5zaXRpb24gd2FrZWxvY2sgaW4gYSBzZWNvbmQKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGhlbGQuICBUaGUgc2Vjb25kIHBhdXNlIGlzIHRvIGFsbG93IGFwcHMgdG8gcmVjb25uZWN0IG92ZXIgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IG5ldHdvcmsKKyAgICAgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgeworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BY3RpdmVEZWZhdWx0TmV0d29yayA9IHR5cGU7CiAgICAgICAgIH0KICAgICAgICAgdGhpc05ldC5zZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7Ci0gICAgICAgIHRoaXNOZXQudXBkYXRlTmV0d29ya1NldHRpbmdzKCk7CisgICAgICAgIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncyh0aGlzTmV0KTsKICAgICAgICAgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKCk7CiAgICAgICAgIHNlbmRDb25uZWN0ZWRCcm9hZGNhc3QoaW5mbyk7CiAgICAgfQpAQCAtMTE5MiwyMCArMTIzNiwxODUgQEAKICAgICAgICAgZm9yIChpbnQgbmV0VHlwZSA6IG1Qcmlvcml0eUxpc3QpIHsKICAgICAgICAgICAgIGlmIChtTmV0VHJhY2tlcnNbbmV0VHlwZV0uZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5hZGREZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRGVmYXVsdFJvdXRlKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLmFkZFByaXZhdGVEbnNSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5yZW1vdmVEZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGVmYXVsdFJvdXRlKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBhZGRQcml2YXRlRG5zUm91dGVzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBudC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIGJvb2xlYW4gcHJpdmF0ZURuc1JvdXRlU2V0ID0gbnQuaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG50ICsKKyAgICAgICAgICAgICAgICAgICAgIigiICsgaW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIgKyBwcml2YXRlRG5zUm91dGVTZXQpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBnZXROYW1lU2VydmVyTGlzdChudC5nZXREbnNQcm9wTmFtZXMoKSk7CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIXByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkclN0cmluZyA6IGRuc0xpc3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgYWRkciA9IE5ldHdvcmtVdGlscy5sb29rdXBIb3N0KGFkZHJTdHJpbmcpOworICAgICAgICAgICAgICAgIGlmIChhZGRyICE9IC0xICYmIGFkZHIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiICBhZGRpbmcgIithZGRyU3RyaW5nKyIgKCIrYWRkcisiKSIpOworICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKGludGVyZmFjZU5hbWUsIGFkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG50LnByaXZhdGVEbnNSb3V0ZVNldCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcml2YXRlRG5zUm91dGVzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250CisgICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQorICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG50LmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIHByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVIb3N0Um91dGVzKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoaXMKKyAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyB0aGUgbmFtZXMgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcworICAgICAqIGdpdmUgdGhlIElQIGFkZHJlc3Nlcy4gUHJvcGVydGllcyB3aXRoIG5vIHZhbHVlcyBhcmUgc2tpcHBlZC4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAY29kZSBTdHJpbmd9cyBjb250YWluaW5nIHRoZSBJUCBhZGRyZXNzZXMKKyAgICAgKiBvZiB0aGUgRE5TIHNlcnZlcnMsIGluIGRvdC1ub3RhdGlvbi4gVGhpcyBtYXkgaGF2ZSBmZXdlcgorICAgICAqIG5vbi1udWxsIGVudHJpZXMgdGhhbiB0aGUgbGlzdCBvZiBuYW1lcyBwYXNzZWQgaW4sIHNpbmNlCisgICAgICogc29tZSBvZiB0aGUgcGFzc2VkLWluIG5hbWVzIG1heSBoYXZlIGVtcHR5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXROYW1lU2VydmVyTGlzdChTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgIFN0cmluZ1tdIGRuc0FkZHJlc3NlcyA9IG5ldyBTdHJpbmdbcHJvcGVydHlOYW1lcy5sZW5ndGhdOworICAgICAgICBpbnQgaSwgajsKKworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZXNbaV0pOworICAgICAgICAgICAgLy8gVGhlIEdTTSBsYXllciBzb21ldGltZXMgc2V0cyBhIGJvZ3VzIEROUyBzZXJ2ZXIgYWRkcmVzcyBvZgorICAgICAgICAgICAgLy8gMC4wLjAuMAorICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkgJiYgIVRleHRVdGlscy5lcXVhbHModmFsdWUsICIwLjAuMC4wIikpIHsKKyAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNbaisrXSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkbnNBZGRyZXNzZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gbnQuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBpbnQgZGVmYXVsdEdhdGV3YXlBZGRyID0gbnQuZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCk7CisgICAgICAgIGJvb2xlYW4gZGVmYXVsdFJvdXRlU2V0ID0gbnQuaXNEZWZhdWx0Um91dGVTZXQoKTsKKyAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworCisgICAgICAgIGlmICgoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSAmJiAoZGVmYXVsdEdhdGV3YXlBZGRyICE9IDApICYmCisgICAgICAgICAgICAgICAgZGVmYXVsdFJvdXRlU2V0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZERlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIGludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIGRlZmF1bHRHYXRld2F5QWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOZXR3b3JrVXRpbHMuc2V0RGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUsIGRlZmF1bHRHYXRld2F5QWRkcik7CisgICAgICAgICAgICBudC5kZWZhdWx0Um91dGVTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gbnQuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBib29sZWFuIGRlZmF1bHRSb3V0ZVNldCA9IG50LmlzRGVmYXVsdFJvdXRlU2V0KCk7CisgICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbnQuZ2V0TmV0d29ya0luZm8oKTsKKworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIGRlZmF1bHRSb3V0ZVNldCA9PSB0cnVlKSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShpbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgIG50LmRlZmF1bHRSb3V0ZVNldChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBuZXR3b3JrIHNwZWNpZmljIFRDUCBidWZmZXIgc2l6ZXMgZnJvbSBTeXN0ZW1Qcm9wZXJ0aWVzCisgICAgICogbmV0LnRjcC5idWZmZXJzaXplLltkZWZhdWx0fHdpZml8dW10c3xlZGdlfGdwcnNdIGFuZCBzZXQgdGhlbSBmb3Igc3lzdGVtCisgICAgICogd2lkZSB1c2UKKyAgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBudC5nZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CisgICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsIGtleSArICIgbm90IGZvdW5kIGluIHN5c3RlbSBwcm9wZXJ0aWVzLiBVc2luZyBkZWZhdWx0cyIpOworCisgICAgICAgICAgICAvLyBTZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWVzIHNvIHdlIHdvbid0IGJlIHN0dWNrIHRvIHByZXZpb3VzIHZhbHVlcworICAgICAgICAgICAga2V5ID0gIm5ldC50Y3AuYnVmZmVyc2l6ZS5kZWZhdWx0IjsKKyAgICAgICAgICAgIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB2YWx1ZXMgaW4ga2VybmVsCisgICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIlNldHRpbmcgVENQIHZhbHVlczogWyIgKyBidWZmZXJTaXplcworICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGljaCBjb21lcyBmcm9tIFsiICsga2V5ICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCisgICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXJTaXplcyBpbiB0aGUgZm9ybWF0IG9mICJyZWFkTWluLCByZWFkSW5pdGlhbCwgcmVhZE1heCwKKyAgICAgKiAgICAgICAgd3JpdGVNaW4sIHdyaXRlSW5pdGlhbCwgd3JpdGVNYXgiCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEJ1ZmZlclNpemUoU3RyaW5nIGJ1ZmZlclNpemVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBidWZmZXJTaXplcy5zcGxpdCgiLCIpOworCisgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7CisgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkludmFsaWQgYnVmZmVyc2l6ZSBzdHJpbmc6ICIgKyBidWZmZXJTaXplcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBzZXQgdGNwIGJ1ZmZlciBzaXplczoiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFdyaXRlcyBzdHJpbmcgdG8gZmlsZS4gQmFzaWNhbGx5IHNhbWUgYXMgImVjaG8gLW4gJHN0cmluZyA+ICRmaWxlbmFtZSIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEBwYXJhbSBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlKHN0cmluZyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgLyoqCiAgICAgICogQWRqdXN0IHRoZSBwZXItcHJvY2VzcyBkbnMgZW50cmllcyAobmV0LmRuczx4Pi48cGlkPikgYmFzZWQKICAgICAgKiBvbiB0aGUgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgbmV0IHdoaWNoIHRoaXMgcHJvY2VzcyByZXF1ZXN0ZWQuCkBAIC0xMjI1LDcgKzE0MzQsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxwaWRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcGlkID0gKEludGVnZXIpcGlkcy5nZXQoaik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwaWQuaW50VmFsdWUoKSA9PSBteVBpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZG5zTGlzdCA9IG50LmdldE5hbWVTZXJ2ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gZ2V0TmFtZVNlcnZlckxpc3QobnQuZ2V0RG5zUHJvcE5hbWVzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zTGlzdCwgbXlQaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvQnVtcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBEbnMoKTsKQEAgLTEyNzksNyArMTQ4OCw3IEBACiAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIG50ID0gbU5ldFRyYWNrZXJzW25ldFR5cGVdOwogICAgICAgICAgICAgaWYgKG50ICE9IG51bGwgJiYgbnQuZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICFudC5pc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gbnQuZ2V0TmFtZVNlcnZlcnMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gZ2V0TmFtZVNlcnZlckxpc3QobnQuZ2V0RG5zUHJvcE5hbWVzKCkpOwogICAgICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKQEAgLTEzNjIsNiArMTU3MSwxMyBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIk5ldHdvcmtUcmFuc3Rpb25XYWtlTG9jayBpcyBjdXJyZW50bHkgIiArCisgICAgICAgICAgICAgICAgICAgIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpID8gIiIgOiAibm90ICIpICsgImhlbGQuIik7CisgICAgICAgICAgICBwdy5wcmludGxuKCJJdCB3YXMgbGFzdCByZXF1ZXN0ZWQgZm9yICIrbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5KTsKKyAgICAgICAgfQorICAgICAgICBwdy5wcmludGxuKCk7CisKICAgICAgICAgbVRldGhlcmluZy5kdW1wKGZkLCBwdywgYXJncyk7CiAgICAgfQogCkBAIC0xNDUzLDYgKzE2NjksMjAgQEAKICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZVVzZXIgdSA9IChGZWF0dXJlVXNlciltc2cub2JqOwogICAgICAgICAgICAgICAgICAgICB1LmV4cGlyZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0s6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXVzZWRCeSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29ubmVjdGl2aXR5U2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZzEgPT0gbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkQnkgPSBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhdXNlZEJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJOZXRUcmFuc2l0aW9uIFdha2Vsb2NrIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkQnkgKyAiIHJlbGVhc2VkIGJ5IHRpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1MzYsNCArMTc2NiwyMyBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5URVRIRVJfU1VQUE9SVEVELCBkZWZhdWx0VmFsKSAhPSAwKTsKICAgICAgICAgcmV0dXJuIHRldGhlckVuYWJsZWRJblNldHRpbmdzICYmIG1UZXRoZXJpbmdDb25maWdWYWxpZDsKICAgICB9CisKKyAgICAvLyBBbiBBUEkgTmV0d29ya1N0YXRlVHJhY2tlcnMgY2FuIGNhbGwgd2hlbiB0aGV5IGxvc2UgdGhlaXIgbmV0d29yay4KKyAgICAvLyBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbGVhcmVkIGFmdGVyIFggc2Vjb25kcyBvciBhIG5ldHdvcmsgYmVjb21lcyBDT05ORUNURUQsCisgICAgLy8gd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuICBUaGUgdGltZXIgaXMgc3RhcnRlZCBieSB0aGUgZmlyc3QgY2FsbGVyIGFuZCBub3QKKyAgICAvLyByZXN0YXJ0ZWQgYnkgc3Vic2VxdWVudCBjYWxsZXJzLgorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgcmV0dXJuOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcisrOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkgPSBmb3JXaG9tOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Nzk4NWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVtb0RhdGFTZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJEZW1vRGF0YVNldCI7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBkYXRhCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKENvbnRhY3RzLlBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgZGF0YQotICAgICAgICBhZGREZWZhdWx0RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGltYWdlcyBmcm9tIC9hbmRyb2lkL2ltYWdlcwotICAgICAgICBhZGREZWZhdWx0SW1hZ2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHRJbWFnZXMoKQotICAgIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuZ2V0Um9vdERpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgW10gZmlsZXMKLSAgICAgICAgICAgID0gbmV3IEZpbGUocm9vdERpcmVjdG9yeSwgImltYWdlcyIpLmxpc3QoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgImFkZERlZmF1bHRJbWFnZXM6IG5vIGltYWdlcyBmb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcm9vdERpcmVjdG9yeSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHBhdGgsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbXBvcnQgaW1hZ2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0RGF0YSgpCi0gICAgewotICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBkZWZhdWx0IGRhdGEuLi4iKTsKLQotLy8gICAgICAgYWRkSW1hZ2UoIlZpb2xldCIsICJpbWFnZXMvdmlvbGV0LnBuZyIpOwotLy8gICAgICAgYWRkSW1hZ2UoIkNvcmt5IiwgImltYWdlcy9jb3JreS5wbmciKTsKLQotICAgICAgICAvLyBQRU5ESU5HOiBzaG91bGQgdGhpcyBiZSBkb25lIGhlcmU/IT8hCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fQ0FMTCwgVXJpLmZyb21QYXJ0cygidm9pY2VtYWlsIiwgIiIsIG51bGwpKTsKLSAgICAgICAgYWRkU2hvcnRjdXQoIjEiLCBpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZEltYWdlKFN0cmluZyBuYW1lLCBVcmkgZmlsZSkKLSAgICB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgaW1hZ2V2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgaW1hZ2V2LnB1dCgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIFVyaSB1cmwgPSBudWxsOwotCi0gICAgICAgIEFzc2V0TWFuYWdlciBhc3MgPSBBc3NldE1hbmFnZXIuZ2V0U3lzdGVtKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4gPSBhc3Mub3BlbihmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB1cmwgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChJbWFnZXMuTWVkaWEuSU5URVJOQUxfQ09OVEVOVF9VUkksIGltYWdldik7Ci0gICAgICAgICAgICBvdXQgPSBtQ29udGVudFJlc29sdmVyLm9wZW5PdXRwdXRTdHJlYW0odXJsKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSA4ICogMTAyNDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGluc2VydCBpbWFnZSAnIiArIGZpbGUgKyAiJyIsIGUpOwotICAgICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkU2hvcnRjdXQoU3RyaW5nIHNob3J0Y3V0LCBJbnRlbnQgaW50ZW50KQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBTbG9nLnYoTE9HX1RBRywgImFkZFNob3J0Y3V0OiBzaG9ydGN1dD0iICsgc2hvcnRjdXQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5Cb29rbWFya3MuYWRkKG1Db250ZW50UmVzb2x2ZXIsIGludGVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgIT0gbnVsbCA/IHNob3J0Y3V0LmNoYXJBdCgwKSA6IDAsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDE5ZDE0NmQuLmMwZWE2OGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjcsMzcgKzY3LDUwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZSBleHRlbmRzIElEZXZpY2VQb2xpY3lNYW5hZ2VyLlN0dWIgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlIjsKLSAgICAKKwogICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgZmluYWwgTXlQYWNrYWdlTW9uaXRvciBtTW9uaXRvcjsKIAogICAgIElQb3dlck1hbmFnZXIgbUlQb3dlck1hbmFnZXI7Ci0gICAgCisKICAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICBpbnQgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgPSAwOwotICAgIAorCiAgICAgaW50IG1QYXNzd29yZE93bmVyID0gLTE7Ci0gICAgCisKICAgICBmaW5hbCBIYXNoTWFwPENvbXBvbmVudE5hbWUsIEFjdGl2ZUFkbWluPiBtQWRtaW5NYXAKICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8Q29tcG9uZW50TmFtZSwgQWN0aXZlQWRtaW4+KCk7CiAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGl2ZUFkbWluPiBtQWRtaW5MaXN0CiAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QWN0aXZlQWRtaW4+KCk7Ci0gICAgCisKICAgICBzdGF0aWMgY2xhc3MgQWN0aXZlQWRtaW4gewogICAgICAgICBmaW5hbCBEZXZpY2VBZG1pbkluZm8gaW5mbzsKLSAgICAgICAgCisKICAgICAgICAgaW50IHBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZExlbmd0aCA9IDA7CisgICAgICAgIGludCBwYXNzd29yZEhpc3RvcnlMZW5ndGggPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkU3ltYm9scyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgICAgICBsb25nIG1heGltdW1UaW1lVG9VbmxvY2sgPSAwOwogICAgICAgICBpbnQgbWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgPSAwOwotICAgICAgICAKKwogICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKICAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgZ2V0VWlkKCkgeyByZXR1cm4gaW5mby5nZXRBY3Rpdml0eUluZm8oKS5hcHBsaWNhdGlvbkluZm8udWlkOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgd3JpdGVUb1htbChYbWxTZXJpYWxpemVyIG91dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKQEAgLTExMCw3ICsxMjMsNDIgQEAKICAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExldHRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE51bWVyaWMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewpAQCAtMTI0LDcgKzE3Miw3IEBACiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWF4LWZhaWxlZC1wYXNzd29yZC13aXBlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdm9pZCByZWFkRnJvbVhtbChYbWxQdWxsUGFyc2VyIHBhcnNlcikKICAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaW50IG91dGVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTE0Myw2ICsxOTEsMjcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbGVuZ3RoIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZXR0ZXJzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1udW1lcmljIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1zeW1ib2xzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1ub25sZXR0ZXIiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtYXgtdGltZS10by11bmxvY2siLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1heGltdW1UaW1lVG9VbmxvY2sgPSBMb25nLnBhcnNlTG9uZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwpAQCAtMTU1LDcgKzIyNCw3IEBACiAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgUHJpbnRXcml0ZXIgcHcpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJ1aWQ9Iik7IHB3LnByaW50bG4oZ2V0VWlkKCkpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnRsbigicG9saWNpZXM6Iik7CkBAIC0xNjYsMjMgKzIzNSwzNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYXNzd29yZFF1YWxpdHk9MHgiKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhwYXNzd29yZFF1YWxpdHkpKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtaW5pbXVtUGFzc3dvcmRMZW5ndGg9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhwYXNzd29yZFF1YWxpdHkpKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMZW5ndGg9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYXNzd29yZEhpc3RvcnlMZW5ndGg9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4ocGFzc3dvcmRIaXN0b3J5TGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2U9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2U9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZExldHRlcnMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE51bWVyaWM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkU3ltYm9scz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRTeW1ib2xzKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXI9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKTsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtYXhpbXVtVGltZVRvVW5sb2NrPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1heGltdW1UaW1lVG9VbmxvY2spOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIGNsYXNzIE15UGFja2FnZU1vbml0b3IgZXh0ZW5kcyBQYWNrYWdlTW9uaXRvciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU29tZVBhY2thZ2VzQ2hhbmdlZCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UudGhpcykgewogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGk9bUFkbWluTGlzdC5zaXplKCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFhID0gbUFkbWluTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaGFuZ2UgPSBpc1BhY2thZ2VEaXNhcHBlYXJpbmcoYWEuaW5mby5nZXRQYWNrYWdlTmFtZSgpKTsgCisgICAgICAgICAgICAgICAgICAgIGludCBjaGFuZ2UgPSBpc1BhY2thZ2VEaXNhcHBlYXJpbmcoYWEuaW5mby5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZSA9PSBQQUNLQUdFX1BFUk1BTkVOVF9DSEFOR0UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFuZ2UgPT0gUEFDS0FHRV9URU1QT1JBUllfQ0hBTkdFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQWRtaW4gdW5leHBlY3RlZGx5IHVuaW5zdGFsbGVkOiAiCkBAIC0yMDcsNyArMjkwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyB0aGUgc2VydmljZS4KICAgICAgKi8KQEAgLTIyNCw3ICszMDcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtSVBvd2VyTWFuYWdlcjsKICAgICB9Ci0gICAgCisKICAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbk1hcC5nZXQod2hvKTsKICAgICAgICAgaWYgKGFkbWluICE9IG51bGwKQEAgLTIzNCw3ICszMTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcmVxUG9saWN5KQogICAgICAgICAgICAgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IGNhbGxpbmdVaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwpAQCAtMjY1LDEzICszNDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpICsgIiBmb3IgcG9saWN5ICMiICsgcmVxUG9saWN5KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgc2VuZEFkbWluQ29tbWFuZExvY2tlZChBY3RpdmVBZG1pbiBhZG1pbiwgU3RyaW5nIGFjdGlvbikgewogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwogICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KGFkbWluLmluZm8uZ2V0Q29tcG9uZW50KCkpOwogICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKFN0cmluZyBhY3Rpb24sIGludCByZXFQb2xpY3kpIHsKICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgaWYgKE4gPiAwKSB7CkBAIC0yODMsNyArMzY2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW5Mb2NrZWQoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsKSB7CkBAIC0yOTUsNyArMzc4LDcgQEAKICAgICAgICAgICAgIHZhbGlkYXRlUGFzc3dvcmRPd25lckxvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIERldmljZUFkbWluSW5mbyBmaW5kQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pbk5hbWUpIHsKICAgICAgICAgSW50ZW50IHJlc29sdmVJbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIHJlc29sdmVJbnRlbnQuc2V0Q29tcG9uZW50KGFkbWluTmFtZSk7CkBAIC0zMDQsNyArMzg3LDcgQEAKICAgICAgICAgaWYgKGluZm9zID09IG51bGwgfHwgaW5mb3Muc2l6ZSgpIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gYWRtaW46ICIgKyBhZG1pbk5hbWUpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IERldmljZUFkbWluSW5mbyhtQ29udGV4dCwgaW5mb3MuZ2V0KDApKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC0zMTUsNyArMzk4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgSm91cm5hbGVkRmlsZSBtYWtlSm91cm5hbGVkRmlsZSgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGJhc2UgPSAiL2RhdGEvc3lzdGVtL2RldmljZV9wb2xpY2llcy54bWwiOwogICAgICAgICByZXR1cm4gbmV3IEpvdXJuYWxlZEZpbGUobmV3IEZpbGUoYmFzZSksIG5ldyBGaWxlKGJhc2UgKyAiLnRtcCIpKTsKQEAgLTMzMSw3ICs0MTQsNyBAQAogICAgICAgICAgICAgb3V0LnN0YXJ0RG9jdW1lbnQobnVsbCwgdHJ1ZSk7CiAKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC0zNDIsMjYgKzQyNSwzNiBAQAogICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhZG1pbiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtb3duZXIiKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobVBhc3N3b3JkT3duZXIpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1vd25lciIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJmYWlsZWQtcGFzc3dvcmQtYXR0ZW1wdHMiKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJmYWlsZWQtcGFzc3dvcmQtYXR0ZW1wdHMiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gMCkgeworCisgICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExldHRlcnMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmROdW1lcmljICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJhY3RpdmUtcGFzc3dvcmQiKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJxdWFsaXR5IiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRRdWFsaXR5KSk7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibGVuZ3RoIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ1cHBlcmNhc2UiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxvd2VyY2FzZSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibGV0dGVycyIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTGV0dGVycykpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgIm51bWVyaWMiLCBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTnVtZXJpYykpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInN5bWJvbHMiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJub25sZXR0ZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcikpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImFjdGl2ZS1wYXNzd29yZCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBvbGljaWVzIik7CiAKICAgICAgICAgICAgIG91dC5lbmREb2N1bWVudCgpOwpAQCAtNDM5LDYgKzUzMiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAicXVhbGl0eSIpKTsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImxlbmd0aCIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInVwcGVyY2FzZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImxvd2VyY2FzZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsZXR0ZXJzIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm51bWVyaWMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAic3ltYm9scyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm5vbmxldHRlciIpKTsKICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biB0YWc6ICIgKyB0YWcpOwpAQCAtNDc2LDEwICs1ODEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHV0aWxzLmdldEFjdGl2ZVBhc3N3b3JkUXVhbGl0eSgpKSk7CiAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKLSAgICAgICAgCisKICAgICAgICAgbG9uZyB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKICAgICAgICAgaWYgKHRpbWVNcyA8PSAwKSB7CiAgICAgICAgICAgICB0aW1lTXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKQEAgLTQ5OCwxMiArNjA5LDEzIEBACiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDOgogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQzoKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzoKKyAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcXVhbGl0eSBjb25zdGFudDogMHgiCiAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpKTsKICAgICB9Ci0gICAgCisKICAgICB2b2lkIHZhbGlkYXRlUGFzc3dvcmRPd25lckxvY2tlZCgpIHsKICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgIGJvb2xlYW4gaGF2ZU93bmVyID0gZmFsc2U7CkBAIC01MjAsMTcgKzYzMiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9hZFNldHRpbmdzTG9ja2VkKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIERldmljZUFkbWluSW5mbyBpbmZvID0gZmluZEFkbWluKGFkbWluUmVjZWl2ZXIpOwogICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgYWRtaW46ICIgKyBhZG1pblJlY2VpdmVyKTsKQEAgLTU1MiwxMyArNjY0LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiBpc0FkbWluQWN0aXZlKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChhZG1pblJlY2VpdmVyKSAhPSBudWxsOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIExpc3Q8Q29tcG9uZW50TmFtZT4gZ2V0QWN0aXZlQWRtaW5zKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CkBAIC01NzIsNyArNjg0LDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiBwYWNrYWdlSGFzQWN0aXZlQWRtaW5zKFN0cmluZyBwYWNrYWdlTmFtZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CkBAIC01ODQsNyArNjk2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2ZUFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CkBAIC02MDMsMTAgKzcxNSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcXVhbGl0eSkgewogICAgICAgICB2YWxpZGF0ZVF1YWxpdHlDb25zdGFudChxdWFsaXR5KTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOwpAQCAtNjE5LDE2ICs3MzEsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IG1vZGUgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ucGFzc3dvcmRRdWFsaXR5IDogbW9kZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNjM5LDcgKzc1MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gbW9kZTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewpAQCAtNjUzLDE2ICs3NjUsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTGVuZ3RoIDogbGVuZ3RoOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC02NzMsMTggKzc4NSwyNjcgQEAKICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAucGFzc3dvcmRIaXN0b3J5TGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZExldHRlcnMgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVycyA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTnVtZXJpYyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmROdW1lcmljID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRTeW1ib2xzICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9scyA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9scykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKICAgICAgICAgICAgIC8vIHNvIHRyeSB0byByZXRyaWV2ZSBpdCB0byBjaGVjayB0aGF0IHRoZSBjYWxsZXIgaXMgb25lLgogICAgICAgICAgICAgZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQobnVsbCwKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID49IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKQotICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKG51bGwpOworICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPCBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoIDwgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKG51bGwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA+PSBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID49IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID49IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA+PSBnZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRDdXJyZW50RmFpbGVkUGFzc3dvcmRBdHRlbXB0cygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTY5NCw3ICsxMDU1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0czsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbnVtKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC03MDksMTYgKzEwNzAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIDogY291bnQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTczMiw3ICsxMDkzLDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIHJlc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkLCBpbnQgZmxhZ3MpIHsKICAgICAgICAgaW50IHF1YWxpdHk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtNzQzLDE0ICsxMTA0LDE1IEBACiAgICAgICAgICAgICBxdWFsaXR5ID0gZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpOwogICAgICAgICAgICAgaWYgKHF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICAgICAgaW50IHJlYWxRdWFsaXR5ID0gTG9ja1BhdHRlcm5VdGlscy5jb21wdXRlUGFzc3dvcmRRdWFsaXR5KHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbFF1YWxpdHkgPCBxdWFsaXR5KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxRdWFsaXR5IDwgcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogcGFzc3dvcmQgcXVhbGl0eSAweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBxdWFsaXR5IDB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcXVhbGl0eSA9IHJlYWxRdWFsaXR5OworICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBNYXRoLm1heChyZWFsUXVhbGl0eSwgcXVhbGl0eSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKG51bGwpOwogICAgICAgICAgICAgaWYgKHBhc3N3b3JkLmxlbmd0aCgpIDwgbGVuZ3RoKSB7CkBAIC03NTgsMTQgKzExMjAsODYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIGxlbmd0aCAiICsgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocXVhbGl0eSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCkgeworICAgICAgICAgICAgICAgIGludCBsZXR0ZXJzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgdXBwZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbG93ZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbnVtYmVycyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHN5bWJvbHMgPSAwOworICAgICAgICAgICAgICAgIGludCBub25sZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFzc3dvcmQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBwYXNzd29yZC5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRMZXR0ZXJzID0gZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZihsZXR0ZXJzIDwgbmVlZGVkTGV0dGVycykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIGxldHRlcnMgIiArIGxldHRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbGV0dGVycyAiICsgbmVlZGVkTGV0dGVycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZE51bWJlcnMgPSBnZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChudW1iZXJzIDwgbmVlZGVkTnVtYmVycykgeworICAgICAgICAgICAgICAgICAgICBTbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgIiArIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTnVtYmVycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZExvd2VyQ2FzZSA9IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobG93ZXJjYXNlIDwgbmVlZGVkTG93ZXJDYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbG93ZXJjYXNlIGxldHRlcnMgIiArIGxvd2VyY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBsb3dlcmNhc2UgbGV0dGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWRMb3dlckNhc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRVcHBlckNhc2UgPSBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKHVwcGVyY2FzZSA8IG5lZWRlZFVwcGVyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIHVwcGVyY2FzZSBsZXR0ZXJzICIgKyB1cHBlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkU3ltYm9scyA9IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKHN5bWJvbHMgPCBuZWVkZWRTeW1ib2xzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2Ygc3BlY2lhbCBzeW1ib2xzICIgKyBzeW1ib2xzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIHNwZWNpYWwgc3ltYm9scyAiICsgbmVlZGVkU3ltYm9scyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZE5vbkxldHRlciA9IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobm9ubGV0dGVyIDwgbmVlZGVkTm9uTGV0dGVyKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzICIgKyBub25sZXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZE5vbkxldHRlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvY2tQYXR0ZXJuVXRpbHMgdXRpbHMgPSBuZXcgTG9ja1BhdHRlcm5VdGlscyhtQ29udGV4dCk7CisgICAgICAgICAgICBpZih1dGlscy5jaGVja1Bhc3N3b3JkSGlzdG9yeShwYXNzd29yZCkpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogcGFzc3dvcmQgaXMgdGhlIHNhbWUgYXMgb25lIG9mIHRoZSBsYXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpICsgIiBwYXNzd29yZHMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICBpZiAobVBhc3N3b3JkT3duZXIgPj0gMCAmJiBtUGFzc3dvcmRPd25lciAhPSBjYWxsaW5nVWlkKSB7CiAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogYWxyZWFkeSBzZXQgYnkgYW5vdGhlciB1aWQgYW5kIG5vdCBlbnRlcmVkIGJ5IHVzZXIiKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyBEb24ndCBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaGVsZCwgYmVjYXVzZSBpdCBpcyBnb2luZyB0byBjYWxsCiAgICAgICAgIC8vIGJhY2sgaW4gdG8gdGhlIHNlcnZpY2UuCiAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTc4MywxMCArMTIxNywxMCBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1UaW1lVG9Mb2NrKENvbXBvbmVudE5hbWUgd2hvLCBsb25nIHRpbWVNcykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewpAQCAtNzk2LDE2ICsxMjMwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9GT1JDRV9MT0NLKTsKICAgICAgICAgICAgIGlmIChhcC5tYXhpbXVtVGltZVRvVW5sb2NrICE9IHRpbWVNcykgewogICAgICAgICAgICAgICAgIGFwLm1heGltdW1UaW1lVG9VbmxvY2sgPSB0aW1lTXM7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyA9IGdldE1heGltdW1UaW1lVG9Mb2NrKG51bGwpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGltZU1zIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJUG93ZXJNYW5hZ2VyKCkuc2V0TWF4aW11bVNjcmVlbk9mZlRpbWVvdW50KChpbnQpdGltZU1zKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTgxNywxNiArMTI1MSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGxvbmcgZ2V0TWF4aW11bVRpbWVUb0xvY2soQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBsb25nIHRpbWUgPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1heGltdW1UaW1lVG9VbmxvY2sgOiB0aW1lOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC04NDAsNyArMTI3NCw3IEBACiAgICAgICAgICAgICByZXR1cm4gdGltZTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGxvY2tOb3coKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC04NTcsNyArMTI5MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHdpcGVEYXRhTG9ja2VkKGludCBmbGFncykgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgUmVjb3ZlcnlTeXN0ZW0ucmVib290V2lwZVVzZXJEYXRhKG1Db250ZXh0KTsKQEAgLTg2NSw3ICsxMjk5LDcgQEAKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsZWQgcmVxdWVzdGluZyBkYXRhIHdpcGUiLCBlKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHdpcGVEYXRhKGludCBmbGFncykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtODgwLDExICsxMzE0LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKENvbXBvbmVudE5hbWUgY29tcCwgZmluYWwgUmVtb3RlQ2FsbGJhY2sgcmVzdWx0KSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoY29tcCk7CiAgICAgICAgICAgICBpZiAoYWRtaW4gPT0gbnVsbCkgewpAQCAtOTA3LDIwICsxMzQxLDMwIEBACiAgICAgICAgICAgICB9LCBudWxsLCBBY3Rpdml0eS5SRVNVTFRfT0ssIG51bGwsIG51bGwpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgsIGludCBsZXR0ZXJzLCBpbnQgdXBwZXJjYXNlLAorICAgICAgICAgICAgaW50IGxvd2VyY2FzZSwgaW50IG51bWJlcnMsIGludCBzeW1ib2xzLCBpbnQgbm9ubGV0dGVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICB2YWxpZGF0ZVF1YWxpdHlDb25zdGFudChxdWFsaXR5KTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSAhPSBxdWFsaXR5IHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCAhPSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgfHwgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB8fCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZExldHRlcnMgIT0gbGV0dGVycworICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgIT0gdXBwZXJjYXNlCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSAhPSBsb3dlcmNhc2UgfHwgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyAhPSBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgIT0gc3ltYm9scyB8fCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgIT0gbm9ubGV0dGVyKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBxdWFsaXR5OwogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSBsZXR0ZXJzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSBsb3dlcmNhc2U7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IHVwcGVyY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IG51bWJlcnM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPSBzeW1ib2xzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSBub25sZXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoRGV2aWNlQWRtaW5SZWNlaXZlci5BQ1RJT05fUEFTU1dPUkRfQ0hBTkdFRCwKQEAgLTkzMSwxMSArMTM3NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwb3J0RmFpbGVkUGFzc3dvcmRBdHRlbXB0KCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICB0cnkgewpAQCAtOTUyLDExICsxMzk2LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZXBvcnRTdWNjZXNzZnVsUGFzc3dvcmRBdHRlbXB0KCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCB8fCBtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtOTcyLDcgKzE0MTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCkBAIC05ODMsMTIgKzE0MjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmFsIFByaW50ZXIgcCA9IG5ldyBQcmludFdyaXRlclByaW50ZXIocHcpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHAucHJpbnRsbigiQ3VycmVudCBEZXZpY2UgUG9saWN5IE1hbmFnZXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcC5wcmludGxuKCIgIEVuYWJsZWQgRGV2aWNlIEFkbWluczoiKTsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CkBAIC05OTksMTEgKzE0NDMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYXAuZHVtcCgiICAgICIsIHB3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHcucHJpbnRsbigiICIpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eT0weCIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExlbmd0aCk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2U9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZE51bWVyaWM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cz0iKTsgcHcucHJpbnRsbihtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtUGFzc3dvcmRPd25lcj0iKTsgcHcucHJpbnRsbihtUGFzc3dvcmRPd25lcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0ZDM1YmVjLi5mNmUzNDQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NjksOCArNDY5LDEwIEBACiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7CiAgICAgICAgIFNsb2cuaShUQUcsICJFbmFibGVkIGlucHV0IG1ldGhvZHM6ICIgKyBlbmFibGVkU3RyKTsKLSAgICAgICAgaWYgKGVuYWJsZWRTdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIkVuYWJsZWQgaW5wdXQgbWV0aG9kcyBoYXMgbm90IGJlZW4gc2V0LCBlbmFibGluZyBhbGwiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRJbWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOworICAgICAgICBpZiAoZW5hYmxlZFN0ciA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KGRlZmF1bHRJbWUpKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRW5hYmxlZCBpbnB1dCBtZXRob2RzIG9yIGRlZmF1bHQgSU1FIGhhcyBub3QgYmVlbiBzZXQsIGVuYWJsaW5nIGFsbCIpOwogICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGRlZkltID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyNTYpOwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWV0aG9kTGlzdC5zaXplKCk7CkBAIC0xNDc2LDcgKzE0NzgsNyBAQAogCiAgICAgICAgIFN0cmluZyBkZWZhdWx0SW1lID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dAogICAgICAgICAgICAgICAgIC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKLSAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkoZGVmYXVsdEltZSkpIHsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZWZhdWx0SW1lKSAmJiAhbWFwLmNvbnRhaW5zS2V5KGRlZmF1bHRJbWUpKSB7CiAgICAgICAgICAgICBpZiAoY2hvb3NlTmV3RGVmYXVsdElNRUxvY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgdXBkYXRlRnJvbVNldHRpbmdzTG9ja2VkKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggODUxOWUyYy4uYjVlMTY1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNDY1LDEwICs0NjUsMTEgQEAKICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuYWRkKHBhc3NpdmVQcm92aWRlci5nZXROYW1lKCkpOwogCiAgICAgICAgIC8vIGluaXRpYWxpemUgZXh0ZXJuYWwgbmV0d29yayBsb2NhdGlvbiBhbmQgZ2VvY29kZXIgc2VydmljZXMKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC4gZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOwogICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19uZXR3b3JrTG9jYXRpb25Qcm92aWRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsICYmIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQoc2VydmljZU5hbWUpLCAwKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIgPQogICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvblByb3ZpZGVyUHJveHkobUNvbnRleHQsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUsIG1Mb2NhdGlvbkhhbmRsZXIpOwpAQCAtNDc2LDcgKzQ3Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX2dlb2NvZGVQcm92aWRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsICYmIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQoc2VydmljZU5hbWUpLCAwKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtR2VvY29kZVByb3ZpZGVyID0gbmV3IEdlb2NvZGVyUHJveHkobUNvbnRleHQsIHNlcnZpY2VOYW1lKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGI0ZmMxNWEuLjFmZDA1M2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC05NTUxLDcgKzk1NTEsOCBAQAogICAgICogVXBkYXRlIG1lZGlhIHN0YXR1cyBvbiBQYWNrYWdlTWFuYWdlci4KICAgICAqLwogICAgcHVibGljIHZvaWQgdXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmaW5hbCBib29sZWFuIG1lZGlhU3RhdHVzLCBmaW5hbCBib29sZWFuIHJlcG9ydFN0YXR1cykgewotICAgICAgIGlmIChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgeworICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKKyAgICAgICBpZiAoY2FsbGluZ1VpZCAhPSAwICYmIGNhbGxpbmdVaWQgIT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiTWVkaWEgc3RhdHVzIGNhbiBvbmx5IGJlIHVwZGF0ZWQgYnkgdGhlIHN5c3RlbSIpOwogICAgICAgIH0KICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYWNrYWdlcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2FtcGxpbmdQcm9maWxlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZjdmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Ecm9wQm94TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworcHVibGljIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGV4dGVuZHMgQmluZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2FtcGxpbmdQcm9maWxlclNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX0RJUiA9IFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5TTkFQU0hPVF9ESVI7CisKKyAgICBwcml2YXRlIEZpbGVPYnNlcnZlciBzbmFwc2hvdE9ic2VydmVyOworCisgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZWdpc3RlclNldHRpbmdPYnNlcnZlcihjb250ZXh0KTsKKyAgICAgICAgc3RhcnRXb3JraW5nKGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFdvcmtpbmcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCAic3RhcnRpbmcgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UhIik7CisKKyAgICAgICAgZmluYWwgRHJvcEJveE1hbmFnZXIgZHJvcGJveCA9CisgICAgICAgICAgICAgICAgKERyb3BCb3hNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5EUk9QQk9YX1NFUlZJQ0UpOworCisgICAgICAgIC8vIGJlZm9yZSBGaWxlT2JzZXJ2ZXIgaXMgcmVhZHksIHRoZXJlIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNvbWUgc25hcHNob3RzCisgICAgICAgIC8vIGluIHRoZSBkaXJlY3RvcnksIHdlIGRvbid0IHdhbnQgdG8gbWlzcyB0aGVtCisgICAgICAgIEZpbGVbXSBzbmFwc2hvdEZpbGVzID0gbmV3IEZpbGUoU05BUFNIT1RfRElSKS5saXN0RmlsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IHNuYXBzaG90RmlsZXMgIT0gbnVsbCAmJiBpIDwgc25hcHNob3RGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKHNuYXBzaG90RmlsZXNbaV0sIGRyb3Bib3gpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGV0ZWN0IG5ldyBzbmFwc2hvdCBhbmQgcHV0IGl0IGluIGRyb3Bib3gKKyAgICAgICAgLy8gZGVsZXRlIGl0IGFmdGVyd2FyZHMgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgYmVmb3JlCisgICAgICAgIC8vIE5vdGU6IG5lZWRzIGxpc3RlbmluZyBhdCBldmVudCBBVFRSSUIgcmF0aGVyIHRoYW4gQ0xPU0VfV1JJVEUsIGJlY2F1c2Ugd2Ugc2V0IHRoZQorICAgICAgICAvLyByZWFkYWJpbGl0eSBvZiBzbmFwc2hvdCBmaWxlcyBhZnRlciB3cml0aW5nIHRoZW0hCisgICAgICAgIHNuYXBzaG90T2JzZXJ2ZXIgPSBuZXcgRmlsZU9ic2VydmVyKFNOQVBTSE9UX0RJUiwgRmlsZU9ic2VydmVyLkFUVFJJQikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KGludCBldmVudCwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVTbmFwc2hvdEZpbGUobmV3IEZpbGUoU05BUFNIT1RfRElSLCBwYXRoKSwgZHJvcGJveCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNuYXBzaG90T2JzZXJ2ZXIuc3RhcnRXYXRjaGluZygpOworCisgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCAiU2FtcGxpbmdQcm9maWxlclNlcnZpY2UgYWN0aXZhdGVkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNuYXBzaG90RmlsZShGaWxlIGZpbGUsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3gpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRyb3Bib3guYWRkRmlsZShUQUcsIGZpbGUsIDApOworICAgICAgICAgICAgaWYgKExPQ0FMX0xPR1YpIFNsb2cudihUQUcsIGZpbGUuZ2V0UGF0aCgpICsgIiBhZGRlZCB0byBkcm9wYm94Iik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBhZGQgIiArIGZpbGUuZ2V0UGF0aCgpICsgIiB0byBkcm9wYm94IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyU2V0dGluZ09ic2VydmVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgY29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLlNBTVBMSU5HX1BST0ZJTEVSX0haKSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgbmV3IFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKGNvbnRlbnRSZXNvbHZlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHB3LnByaW50bG4oIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlOiIpOworICAgICAgICBwdy5wcmludGxuKCJXYXRjaGluZyBkaXJlY3Rvcnk6ICIgKyBTTkFQU0hPVF9ESVIpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2FtcGxpbmdQcm9maWxlclNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworICAgICAgICBwdWJsaWMgU2FtcGxpbmdQcm9maWxlclNldHRpbmdzT2JzZXJ2ZXIoQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlcikgeworICAgICAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOworICAgICAgICAgICAgb25DaGFuZ2UoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIEludGVnZXIgc2FtcGxpbmdQcm9maWxlckh6ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciwgU2V0dGluZ3MuU2VjdXJlLlNBTVBMSU5HX1BST0ZJTEVSX0haLCAwKTsKKyAgICAgICAgICAgIC8vIHNldHRpbmcgdGhpcyBzZWN1cmUgcHJvcGVydHkgd2lsbCBzdGFydCBvciBzdG9wIHNhbXBsaW5nIHByb2ZpbGVyLAorICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhZGp1c3QgdGhlIGZyZXF1ZW5jeSBvZiB0YWtpbmcgc25hcHNob3RzLgorICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoInBlcnNpc3Quc3lzLnByb2ZpbGVyX2h6Iiwgc2FtcGxpbmdQcm9maWxlckh6LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDcxMzA2MzYuLjQzYTg3ZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0yMywyNiArMjMsMjYgQEAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEEyZHBTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXI7CkBAIC01MCwxMSArNTAsOCBAQAogCiBjbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIElOQ0xVREVfREVNTyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CT09UX1BST0dSRVNTX1NZU1RFTV9SVU4gPSAzMDEwOwotCi0gICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKIAogICAgIHByaXZhdGUgY2xhc3MgQWRiU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CiAgICAgICAgIHB1YmxpYyBBZGJTZXR0aW5nc09ic2VydmVyKCkgewpAQCAtODAsNyArNzcsNyBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfRk9SRUdST1VORCk7CiAKICAgICAgICAgQmluZGVySW50ZXJuYWwuZGlzYWJsZUJhY2tncm91bmRTY2hlZHVsaW5nKHRydWUpOwotICAgICAgICAKKwogICAgICAgICBTdHJpbmcgZmFjdG9yeVRlc3RTdHIgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicm8uZmFjdG9yeXRlc3QiKTsKICAgICAgICAgaW50IGZhY3RvcnlUZXN0ID0gIiIuZXF1YWxzKGZhY3RvcnlUZXN0U3RyKSA/IFN5c3RlbVNlcnZlci5GQUNUT1JZX1RFU1RfT0ZGCiAgICAgICAgICAgICAgICAgOiBJbnRlZ2VyLnBhcnNlSW50KGZhY3RvcnlUZXN0U3RyKTsKQEAgLTMyOSwxMSArMzI2LDYgQEAKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBTZWFyY2ggU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoSU5DTFVERV9ERU1PKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkluc3RhbGxpbmcgZGVtbyBkYXRhLi4uIik7Ci0gICAgICAgICAgICAgICAgKG5ldyBEZW1vVGhyZWFkKGNvbnRleHQpKS5zdGFydCgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJEcm9wQm94IFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFLApAQCAtNDE4LDYgKzQxMCwxOCBAQAogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBEaXNrU3RhdHMgU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHRoaXMgc2VydmljZSBldmVuIGlmIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5pc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgIC8vIGlzIGZhbHNlLCBiZWNhdXNlIGl0IGlzIHRoaXMgc2VydmljZSB0aGF0IGRldGVjdHMgc3lzdGVtIHByb3BlcnR5IGNoYW5nZSBhbmQKKyAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uIFBsdXMsIHdoZW4gc2FtcGxpbmcgcHJvZmlsZXIgZG9lc24ndCB3b3JrLAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGxpdHRsZSBvdmVyaGVhZCBmb3IgcnVubmluZyB0aGlzIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoInNhbXBsaW5ncHJvZmlsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShjb250ZXh0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIsIGUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBBREJfRU5BQkxFRCBzZXR0aW5nIHZhbHVlIG1hdGNoZXMgdGhlIHNlY3VyZSBwcm9wZXJ0eSB2YWx1ZQpAQCAtNTE0LDM3ICs1MTgsNyBAQAogICAgIH0KIH0KIAotY2xhc3MgRGVtb1RocmVhZCBleHRlbmRzIFRocmVhZAotewotICAgIERlbW9UaHJlYWQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEYXRhID0gYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKTsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzRGF0YSkgewotICAgICAgICAgICAgICAgIERlbW9EYXRhU2V0IGRhdGFzZXQgPSBuZXcgRGVtb0RhdGFTZXQoKTsKLSAgICAgICAgICAgICAgICBkYXRhc2V0LmFkZChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoIlN5c3RlbVNlcnZlciIsICJGYWlsdXJlIGluc3RhbGxpbmcgZGVtbyBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIKLXsKK3B1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUllfVEVTVF9PRkYgPSAwOwpAQCAtNTY4LDcgKzU0Miw3IEBACiAgICAgICAgICAgICB0aW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBTTkFQU0hPVF9JTlRFUlZBTCwgU05BUFNIT1RfSU5URVJWQUwpOwogICAgICAgICB9CkBAIC01NzYsNyArNTUwLDcgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2ZXIgaGFzIHRvIHJ1biBhbGwgb2YgdGhlIHRpbWUsIHNvIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIC8vIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3aXRoIGl0cyBtZW1vcnkgdXNhZ2UuCiAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKDAuOGYpOwotICAgICAgICAKKwogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFuZHJvaWRfc2VydmVycyIpOwogICAgICAgICBpbml0MShhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQppbmRleCA2NjRkZmE1Li5iMWNhNzg1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBtRGF0YUNvbm5lY3Rpb25BcG4gPSAiIjsKIAotICAgIHByaXZhdGUgU3RyaW5nW10gbURhdGFDb25uZWN0aW9uQXBuVHlwZXMgPSBudWxsOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUNvbm5lY3RlZEFwbnM7CiAKICAgICBwcml2YXRlIFN0cmluZyBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lID0gIiI7CiAKQEAgLTEyMCw2ICsxMjAsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzIsMTkgKzIzMywyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTUsOCArMjU3LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjY5LDEwICsyNzAsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MiwxMCArMjgzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTQsMTggKzI5NiwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxMywxOCArMzE2LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMyLDU2ICszMzYsODAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IG5ldHdvcmtUeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbigpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkQXBucy5jb250YWlucyhhcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBucy5hZGQoYXBuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25TdGF0ZSAhPSBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMucmVtb3ZlKGFwblR5cGUpOworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkQXBucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHN0aWxsIGNvbm5lY3RlZCwgc28gc2VuZCB0aGF0IG91dCBpZiB3ZSBzZW5kIGFueXRoaW5nLgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG1EYXRhQ29ubmVjdGlvblN0YXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblBvc3NpYmxlID0gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGU7CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25SZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25BcG4gPSBhcG47Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25BcG5UeXBlcyA9IGFwblR5cGVzOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZU5hbWU7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSA9IG5ldHdvcmtUeXBlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgaWYgKG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlICE9IG5ldHdvcmtUeXBlKSB7CisgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgPSBuZXR3b3JrVHlwZTsKKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobW9kaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SUJpbmRlcj4gcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgbmV0d29ya1R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwgcmVhc29uLCBhcG4sCi0gICAgICAgICAgICAgICAgYXBuVHlwZXMsIGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGFwblR5cGUsIGludGVyZmFjZU5hbWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhlcmUgaXMgb24gb25EYXRhQ29ubmVjdGlvbkZhaWxlZCBjYWxsYmFjawotICAgICAgICAgKiBvbiBQaG9uZVN0YXRlTGlzdGVuZXIuIFRoZXJlIHNob3VsZCBiZQorICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBubyBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCisgICAgICAgICAqIGluIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25GYWlsZWRSZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1SZWNvcmRzLnNpemUoKTsKQEAgLTM5Myw3ICs0MjEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICovCi0gICAgICAgIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKEJ1bmRsZSBjZWxsTG9jYXRpb24pIHsKQEAgLTQwMiw4ICs0MzAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DZWxsTG9jYXRpb24gPSBjZWxsTG9jYXRpb247Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NFTExfTE9DQVRJT04pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZENlbGxMb2NhdGlvbihyLCBjZWxsTG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ2Myw4ICs0OTAsNyBAQAogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lPSIgKyBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNlbGxMb2NhdGlvbj0iICsgbUNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCJyZWdpc3RyYXRpb25zOiBjb3VudD0iICsgcmVjb3JkQ291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICIgKyByLnBrZ0ZvckRlYnVnICsgIiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHIuZXZlbnRzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzNSw3ICs1NjEsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwKICAgICAgICAgICAgIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NDksMjIgKzU3NSwxNiBAQAogICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZLCByZWFzb24pOwogICAgICAgICB9CiAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVksIGFwbik7Ci0gICAgICAgIFN0cmluZyB0eXBlcyA9IG5ldyBTdHJpbmcoIiIpOwotICAgICAgICBpZiAoYXBuVHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgdHlwZXMgPSBhcG5UeXBlc1swXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXBuVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0eXBlcyA9IHR5cGVzKyIsIithcG5UeXBlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZLCB0eXBlcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSwgYXBuVHlwZSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpbnRlcmZhY2VOYW1lKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3REYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7CisgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSwgcmVhc29uKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQppbmRleCBhOTNhNmVlLi5kODQxY2IzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQpAQCAtNjAsNiArNjAsOCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC04Myw4ICs4NSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsKIAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lQb2xsUGVyaW9kU2VjOwotICAgIHByaXZhdGUgbG9uZyBtUG9saWN5VGhyZXNob2xkOwotICAgIHByaXZhdGUgaW50IG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgIHByaXZhdGUgQXRvbWljTG9uZyBtUG9saWN5VGhyZXNob2xkOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKICAgICBwcml2YXRlIGludCBtUG9saWN5UmVzZXREYXk7IC8vIDEtMjgKICAgICBwcml2YXRlIGludCBtUG9saWN5Tm90aWZpY2F0aW9uc0FsbG93ZWRNYXNrOwogCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIEludGVyZmFjZU9ic2VydmVyIG1JbnRlcmZhY2VPYnNlcnZlcjsKICAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7CiAKLSAgICBwcml2YXRlIGludCBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgbVRocm90dGxlSW5kZXg7IC8vIDAgZm9yIG5vbmUsIDEgZm9yIGZpcnN0IHRocm90dGxlIHZhbCwgMiBmb3IgbmV4dCwgZXRjCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQgPSAtMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQgICA9ICAwOwogCkBAIC0xMjYsNiArMTI4LDEwIEBACiAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAiU3RhcnRpbmcgVGhyb3R0bGVTZXJ2aWNlIik7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAorICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICBtVGhyb3R0bGVJbmRleCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKICAgICAgICAgbU50cEFjdGl2ZSA9IGZhbHNlOwogCiAgICAgICAgIG1JZmFjZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb25maWdfZGF0YXVzZV9pZmFjZSk7CkBAIC0yMTQsNyArMjIwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgbnRwVG9XYWxsVGltZShsb25nIG50cFRpbWUpIHsKLSAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUodHJ1ZSk7IC8vIGRvIGl0IHF1aWNrbHkKICAgICAgICAgbG9uZyBsb2NhbE5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICByZXR1cm4gbG9jYWxOb3cgKyAobnRwVGltZSAtIGJlc3ROb3cpOwogICAgIH0KQEAgLTIyMiw0MCArMjI4LDQyIEBACiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBsb25nIGdldFJlc2V0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgbG9uZyByZXNldFRpbWUgPSAwOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZEVuZCgpKTsKKyAgICAgICAgICAgIHJlc2V0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKTsKICAgICAgICAgfQorICAgICAgICByZXNldFRpbWUgPSBudHBUb1dhbGxUaW1lKHJlc2V0VGltZSk7CiAgICAgICAgIHJldHVybiByZXNldFRpbWU7CiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICBwdWJsaWMgbG9uZyBnZXRQZXJpb2RTdGFydFRpbWUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gMDsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKG1SZWNvcmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydFRpbWUgPSBudHBUb1dhbGxUaW1lKG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKTsKKyAgICAgICAgICAgIHN0YXJ0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpOwogICAgICAgICB9CisgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUoc3RhcnRUaW1lKTsKICAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKICAgICB9CiAgICAgLy9UT0RPIC0gYSBiZXR0ZXIgbmFtZT8gIGdldENsaWZmQnl0ZUNvdW50VGhyZXNob2xkPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldENsaWZmVGhyZXNob2xkKFN0cmluZyBpZmFjZSwgaW50IGNsaWZmKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkOworICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgLy8gVE9ETyAtIGEgYmV0dGVyIG5hbWU/IGdldFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yNjcsMTAgKzI3NSw5IEBACiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgeworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVDb3VudChTdHJpbmcgaWZhY2UsIGludCBkaXIsIGludCBwZXJpb2QsIGludCBhZ28pIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYKLSAgICAgICAgICAgICAgICAobVJlY29yZGVyICE9IG51bGwpKSB7CisgICAgICAgIGlmICgocGVyaW9kID09IFRocm90dGxlTWFuYWdlci5QRVJJT0RfQ1lDTEUpICYmIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIGlmIChkaXIgPT0gVGhyb3R0bGVNYW5hZ2VyLkRJUkVDVElPTl9UWCkgcmV0dXJuIG1SZWNvcmRlci5nZXRQZXJpb2RUeChhZ28pOwogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1JYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFJ4KGFnbyk7CiAgICAgICAgIH0KQEAgLTI3OSwxMCArMjg2LDEwIEBACiAKICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZSAtIGdldEN1cnJlbnRUaHJvdHRsZVJhdGU/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUaHJvdHRsZShTdHJpbmcgaWZhY2UpIHsKKyAgICBwdWJsaWMgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVRocm90dGxlSW5kZXggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTMwNSwyMiArMzEyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9SRVNFVCkpOwogCi0gICAgICAgIC8vIHVzZSBhIG5ldyB0aHJlYWQgYXMgd2UgZG9uJ3Qgd2FudCB0byBzdGFsbCB0aGUgc3lzdGVtIGZvciBmaWxlIHdyaXRlcwotICAgICAgICBtVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoVEFHKTsKLSAgICAgICAgbVRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIobVRocmVhZC5nZXRMb29wZXIoKSk7Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUkVCT09UX1JFQ09WRVJZKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICBtSW50ZXJmYWNlT2JzZXJ2ZXIgPSBuZXcgSW50ZXJmYWNlT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0lGQUNFX1VQLCBtSWZhY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU5NU2VydmljZS5yZWdpc3Rlck9ic2VydmVyKG1JbnRlcmZhY2VPYnNlcnZlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHJlZ2lzdGVyIEludGVyZmFjZU9ic2VydmVyICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX1BPTElDWV9DSEFOR0VEKTsKLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7Ci0KICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMzM3LDYgKzMyOCwyMiBAQAogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCisgICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOworICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKICAgICB9CiAKIApAQCAtMzc1LDcgKzM4Miw3IEBACiAgICAgICAgICAgICAvLyBjaGVjayBmb3Igc2ltIGNoYW5nZSBUT0RPCiAgICAgICAgICAgICAvLyByZXJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2YgcG9saWN5IGNoYW5nZQogCi0gICAgICAgICAgICBtVGhyb3R0bGVJbmRleCA9IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQ7CisgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCk7CiAKICAgICAgICAgICAgIG1SZWNvcmRlciA9IG5ldyBEYXRhUmVjb3JkZXIobUNvbnRleHQsIFRocm90dGxlU2VydmljZS50aGlzKTsKIApAQCAtNDAzLDE1ICs0MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3RocmVzaG9sZF9ieXRlcyk7CiAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3Rocm90dGxlX2tiaXRzcHMpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0TG9uZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjID0gVEVTVElOR19QT0xMSU5HX1BFUklPRF9TRUM7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBURVNUSU5HX1RIUkVTSE9MRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIHRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfVEhSRVNIT0xEX0JZVEVTLCBkZWZhdWx0VGhyZXNob2xkKTsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOworCisgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCh0aHJlc2hvbGQpOworICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuc2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldChURVNUSU5HX1RIUkVTSE9MRCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Qb2xpY3lSZXNldERheSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCkBAIC00MjMsMTAgKzQzMSw4IEBACiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfUkVTRVRfREFZLCBtUG9saWN5UmVzZXREYXkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlmYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCgwKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IGRlZmF1bHROb3RpZmljYXRpb25UeXBlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKQEAgLTQzNywxNSArNDQzLDE2IEBACiAgICAgICAgICAgICBtTWF4TnRwQ2FjaGVBZ2VTZWMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfTUFYX05UUF9DQUNIRV9BR0VfU0VDLCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMpOwogCi0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25Qb2xpY3lDaGFuZ2VkIHRlc3Rpbmc9IiArIHRlc3RpbmcgKyIsIHBlcmlvZD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkICsgIiwgdmFsdWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKyAiLCBub3RlVHlwZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsgbU1heE50cENhY2hlQWdlU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIHZhbHVlPSIgKyBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgbm90ZVR5cGU9IiArIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHVwZGF0ZXMKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgb25SZXNldEFsYXJtKCk7CiAKQEAgLTQ4Nyw3ICs0OTQsNyBAQAogICAgICAgICAgICAgbG9uZyBwZXJpb2RSeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RSeCgwKTsKICAgICAgICAgICAgIGxvbmcgcGVyaW9kVHggPSBtUmVjb3JkZXIuZ2V0UGVyaW9kVHgoMCk7CiAgICAgICAgICAgICBsb25nIHRvdGFsID0gcGVyaW9kUnggKyBwZXJpb2RUeDsKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGxBbGFybSAtIHJvYW1pbmcgPSIgKyByb2FtaW5nICsKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHJlYWQgPSIgKyBpbmNSZWFkICsgIiwgd3JpdHRlbiA9IiArIGluY1dyaXRlICsgIiwgbmV3IHRvdGFsID0iICsgdG90YWwpOwogICAgICAgICAgICAgfQpAQCAtNTEwLDExICs1MTcsMTEgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uSWZhY2VVcCgpIHsKICAgICAgICAgICAgIC8vIGlmIHdlIHdlcmUgdGhyb3R0bGVkIGJlZm9yZSwgYmUgc3VyZSBhbmQgc2V0IGl0IGFnYWluIC0gdGhlIGlmYWNlIHdlbnQgZG93bgogICAgICAgICAgICAgLy8gKGFuZCBtYXkgaGF2ZSBkaXNhcHBlYXJlZCBhbGwgdG9nZXRoZXIpIGFuZCB0aGVzZSBzZXR0aW5ncyB3ZXJlIGxvc3QKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7CisgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLCAtMSwgLTEpOwogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpLCBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjMsNyArNTMwLDggQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJvdHRsZUFuZFBvc3ROb3RpZmljYXRpb24obG9uZyBjdXJyZW50VG90YWwpIHsKICAgICAgICAgICAgIC8vIGlzIHRocm90dGxpbmcgZW5hYmxlZD8KLSAgICAgICAgICAgIGlmIChtUG9saWN5VGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKKyAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgPT0gMCkgewogICAgICAgICAgICAgICAgIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC01MzUsMTUgKzU0MywxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHRocm90dGxlCi0gICAgICAgICAgICBpZiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiVGhyZXNob2xkICIgKyBtUG9saWN5VGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIHRocmVzaG9sZCArICIgZXhjZWVkZWQhIik7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJlcnJvciBzZXR0aW5nIFRocm90dGxlOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1Niw3ICs1NjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOwogCiAgICAgICAgICAgICAgICAgICAgIEludGVudCBicm9hZGNhc3QgPSBuZXcgSW50ZW50KFRocm90dGxlTWFuYWdlci5USFJPVFRMRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QucHV0RXh0cmEoVGhyb3R0bGVNYW5hZ2VyLkVYVFJBX1RIUk9UVExFX0xFVkVMLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7CiAKICAgICAgICAgICAgICAgICB9IC8vIGVsc2UgYWxyZWFkeSB1cCEKQEAgLTU3OSw4ICs1ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZExlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVVc2VkID0gbm93IC0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqbVBvbGljeVRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZC80KSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHdhcm5pbmdUaHJlc2hvbGQgPSAyKnRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gdGhyZXNob2xkLzQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoUi5kcmF3YWJsZS5zdGF0X3N5c190aHJvdHRsZWQpOwpAQCAtNjI1LDExICs2MzIsOSBAQAogICAgICAgICB9CiAKIAotICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKSB7Ci0gICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXggIT0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgeworICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTY4NywxMiArNjkyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgb25SZXNldEFsYXJtKCkgewotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUmVzZXRBbGFybSAtIGxhc3QgcGVyaW9kIGhhZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApICsKICAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcmVhZCBhbmQgIiArIG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKSArICIgd3JpdHRlbiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKGZhbHNlKTsKIAogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUgfHwgKG1OdHBTZXJ2ZXIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBDYWxlbmRhciBlbmQgPSBjYWxjdWxhdGVQZXJpb2RFbmQobm93KTsKQEAgLTcxOSwyMCArNzI0LDIzIEBACiAKICAgICAgICAgLy8gd2lsbCB0cnkgdG8gZ2V0IHRoZSBudHAgdGltZSBhbmQgc3dpdGNoIHRvIGl0IGlmIGZvdW5kLgogICAgICAgICAvLyB3aWxsIGFsc28gY2FjaGUgdGhlIHRpbWUgc28gd2UgZG9uJ3QgZmV0Y2ggaXQgcmVwZWF0ZWRseS4KLSAgICAgICAgZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgZ2V0QmVzdFRpbWUoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMgPSA2MCAqIDYwICogMjQ7IC8vIDEgZGF5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfRkVUQ0hfV0FJVCA9IDEwICogMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMjAgKiAxMDAwOwogICAgIHByaXZhdGUgaW50IG1NYXhOdHBDYWNoZUFnZVNlYyA9IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQzsKICAgICBwcml2YXRlIGxvbmcgY2FjaGVkTnRwOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHBUaW1lc3RhbXA7CiAKLSAgICBwcml2YXRlIGxvbmcgZ2V0QmVzdFRpbWUoKSB7CisgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgdGllZCB0byBVSSBhbmQgQU5SJ3MgYXJlIGEgZGFuZ2VyLCByZXF1ZXN0IGEgZmFzdCByZXN1bHQKKyAgICAvLyB0aGUgcmVndWxhciBwb2xsaW5nIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGNhY2hlZCB0aW1lIHJlY2VudGx5IHVzaW5nIHRoZQorICAgIC8vIHNsb3dlciBtZXRob2QgKCFmYXN0KQorICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZShib29sZWFuIGZhc3QpIHsKICAgICAgICAgaWYgKG1OdHBTZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUpIHsKICAgICAgICAgICAgICAgICBsb25nIG50cEFnZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gY2FjaGVkTnRwVGltZXN0YW1wOwotICAgICAgICAgICAgICAgIGlmIChudHBBZ2UgPCBtTWF4TnRwQ2FjaGVBZ2VTZWMgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDAgfHwgZmFzdCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgU2xvZy52KFRBRywgInVzaW5nIGNhY2hlZCB0aW1lIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWROdHAgKyBudHBBZ2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAyNSwzOSArMTAzMyw1NyBAQAogICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJkYXRhIGZpbGUgZW1wdHkiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJzZWQgPSBkYXRhLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBpbnN1ZmZpY2llbnQgbGVuZ3RoIC0gaWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIGludCBwYXJzZWRVc2VkID0gMDsKKyAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaW50IHBlcmlvZENvdW50OworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFJ4RGF0YTsKKyAgICAgICAgICAgIGxvbmdbXSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICBpbnQgY3VycmVudFBlcmlvZDsKKyAgICAgICAgICAgIENhbGVuZGFyIHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kRW5kOworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAoSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSkgIT0gREFUQV9GSUxFX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIHZlcnNpb24gLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogbVBlcmlvZENvdW50KSkgeworICAgICAgICAgICAgICAgIHBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogcGVyaW9kQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGJhZCBsZW5ndGggKCIgKyBwYXJzZWQubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSsoMiptUGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSArICgyICogcGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RSeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyaW9kVHhEYXRhID0gbmV3IGxvbmdbcGVyaW9kQ291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyaW9kQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1ttUGVyaW9kQ291bnRdOwotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtUGVyaW9kQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUGVyaW9kVHhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IEludGVnZXIucGFyc2VJbnQocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisKKyAgICAgICAgICAgICAgICBwZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHBhcnNpbmcgZGF0YSBmaWxlIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBwZXJpb2RDb3VudDsKKyAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQZXJpb2QgPSBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBwZXJpb2RFbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTA5MSwxNSArMTExNywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAotICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkICsKKyAgICAgICAgcHcucHJpbnRsbigiVGhlIHRocmVzaG9sZCBpcyAiICsgbVBvbGljeVRocmVzaG9sZC5nZXQoKSArCiAgICAgICAgICAgICAgICAgIiwgYWZ0ZXIgd2hpY2ggeW91IGV4cGVyaW5jZSB0aHJvdHRsaW5nIHRvICIgKwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgImticHMiKTsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICJrYnBzIik7CiAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgcGVyaW9kIGlzICIgKwogICAgICAgICAgICAgICAgIChtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkgLSBtUmVjb3JkZXIuZ2V0UGVyaW9kU3RhcnQoKSkvMTAwMCArICIgc2Vjb25kcyBsb25nICIgKwogICAgICAgICAgICAgICAgICJhbmQgZW5kcyBpbiAiICsgKGdldFJlc2V0VGltZShtSWZhY2UpIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIC8gMTAwMCArCiAgICAgICAgICAgICAgICAgIiBzZWNvbmRzLiIpOwogICAgICAgICBwdy5wcmludGxuKCJQb2xsaW5nIGV2ZXJ5ICIgKyBtUG9saWN5UG9sbFBlcmlvZFNlYyArICIgc2Vjb25kcyIpOwotICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFRocm90dGxlIEluZGV4IGlzICIgKyBtVGhyb3R0bGVJbmRleCk7CisgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4LmdldCgpKTsKICAgICAgICAgcHcucHJpbnRsbigiTWF4IE5UUCBDYWNoZSBBZ2UgaXMgIiArIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUmVjb3JkZXIuZ2V0UGVyaW9kQ291bnQoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQppbmRleCA1MDljNzg5Li4zNWJhYWE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKQEAgLTE0NCwxOSArMTQ0LDYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQUtFTE9DS19UQUcgPSAiV2lmaVNlcnZpY2UiOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gaG9sZCB0aGUgd2FrZSBsb2NrIGFmdGVyIGEgZGlzY29ubmVjdAotICAgICAqIGNhdXNlZCBieSBzdG9wcGluZyB0aGUgZHJpdmVyLiBFc3RhYmxpc2hpbmcgYW4gRURHRSBjb25uZWN0aW9uIGhhcyBiZWVuCi0gICAgICogb2JzZXJ2ZWQgdG8gdGFrZSBhYm91dCA1IHNlY29uZHMgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMuIFRoaXMKLSAgICAgKiBwcm92aWRlcyBhIGJpdCBvZiBleHRyYSBtYXJnaW4uCi0gICAgICogPHA+Ci0gICAgICogU2VlIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNXSUZJX01PQklMRV9EQVRBX1RSQU5TSVRJT05fV0FLRUxPQ0tfVElNRU9VVF9NU30uCi0gICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBhIFNldHRpbmdzLlNlY3VyZSB2YWx1ZSBpcyBub3QgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XQUtFTE9DS19USU1FT1VUID0gODAwMDsKLQotICAgIC8vIFdha2UgbG9jayB1c2VkIGJ5IGRyaXZlci1zdG9wIG9wZXJhdGlvbgotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzRHJpdmVyU3RvcFdha2VMb2NrOwogICAgIC8vIFdha2UgbG9jayB1c2VkIGJ5IG90aGVyIG9wZXJhdGlvbnMKICAgICBwcml2YXRlIHN0YXRpYyBQb3dlck1hbmFnZXIuV2FrZUxvY2sgc1dha2VMb2NrOwogCkBAIC0xNjQsNyArMTUxLDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9ESVNBQkxFX1dJRkkgICAgICAgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfV0lGSSAgICAgICAgICA9IDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RBUlRfV0lGSSAgICAgICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLICAgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1VQREFURV9TVEFURSAgICAgICA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UID0gNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVCAgPSA3OwpAQCAtMjM4LDcgKzIyNCw2IEBACiAKICAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFTE9DS19UQUcpOwotICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKAogICAgICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKQEAgLTI5Myw3ICsyNzgsMTAgQEAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKLSAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICB9CisKICAgICAgICAgbVdpZmlSZWdleHMgPSBtQ20uZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKIAogICAgICAgICBmb3IgKFN0cmluZyBpbnRmIDogYXZhaWxhYmxlKSB7CkBAIC0xODI5LDE5ICsxODE3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRTdGFydE1lc3NhZ2Uoc3Ryb25nZXN0TG9ja01vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHdha2VMb2NrVGltZW91dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9XQUtFTE9DS19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogV2UgYXJlIGFzc3VtaW5nIHRoYXQgQ29ubmVjdGl2aXR5U2VydmljZSBjYW4gbWFrZQotICAgICAgICAgICAgICAgICAgICAgKiBhIHRyYW5zaXRpb24gdG8gY2VsbHVsYXIgZGF0YSB3aXRoaW4gd2FrZUxvY2tUaW1lb3V0IHRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSB3YWtlbG9jayBpcyByZWxlYXNlZCBieSB0aGUgZGVsYXllZCBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNtLnJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFRBRyk7CiAgICAgICAgICAgICAgICAgICAgIG1XaWZpSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1FU1NBR0VfU1RPUF9XSUZJKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSywgd2FrZUxvY2tUaW1lb3V0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CkBAIC0xOTI3LDEwICsxOTA4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVsZWFzZSB3YWtlbG9jawogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLOgotICAgICAgICAgICAgICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KICAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UOgogICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcodHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggOTVhYjViYy4uY2Y0YTYwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xNTYsNyArMTU2LDYgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TVEFSVElOR19XSU5ET1cgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19SRU9SREVSID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfV0FMTFBBUEVSID0gZmFsc2U7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRlJFRVpFID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19UUkFOU0FDVElPTlMgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX1NUQUNLX0NSQVdMUyA9IHRydWU7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVBU1VSRV9MQVRFTkNZID0gZmFsc2U7CkBAIC00NTQ5LDggKzQ1NDgsNyBAQAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgdyA9IChXaW5kb3dTdGF0ZSltV2luZG93cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHcuaXNWaXNpYmxlTHcoKSAmJiAhdy5tT2JzY3VyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICh3Lm1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICF3LmlzRHJhd25MdygpKSkgeworICAgICAgICAgICAgICAgIGlmICh3LmlzVmlzaWJsZUx3KCkgJiYgIXcubU9ic2N1cmVkICYmICF3LmlzRHJhd25MdygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC01NzczLDE5ICs1NzcxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIG91dCA9IG1LZXlXYWl0ZXIubU91dHNpZGVUb3VjaFRhcmdldHM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgb2V2ID0gTW90aW9uRXZlbnQub2J0YWluKGV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX09VVFNJREUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgZnJhbWUgPSBvdXQubUZyYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5vZmZzZXRMb2NhdGlvbigtKGZsb2F0KWZyYW1lLmxlZnQsIC0oZmxvYXQpZnJhbWUudG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQubUNsaWVudC5kaXNwYXRjaFBvaW50ZXIob2V2LCBldmVudFRpbWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJXSU5ET1cgRElFRCBkdXJpbmcgb3V0c2lkZSBtb3Rpb24gZGlzcGF0Y2g6ICIgKyBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYub2Zmc2V0TG9jYXRpb24oKGZsb2F0KWZyYW1lLmxlZnQsIChmbG9hdClmcmFtZS50b3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IG91dC5tTmV4dE91dHNpZGVUb3VjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG91dCAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIubU91dHNpZGVUb3VjaFRhcmdldHMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9PVVRTSURFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgZnJhbWUgPSBvdXQubUZyYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYub2Zmc2V0TG9jYXRpb24oLShmbG9hdClmcmFtZS5sZWZ0LCAtKGZsb2F0KWZyYW1lLnRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQubUNsaWVudC5kaXNwYXRjaFBvaW50ZXIob2V2LCBldmVudFRpbWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJTkRPVyBESUVEIGR1cmluZyBvdXRzaWRlIG1vdGlvbiBkaXNwYXRjaDogIiArIG91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2V2Lm9mZnNldExvY2F0aW9uKChmbG9hdClmcmFtZS5sZWZ0LCAoZmxvYXQpZnJhbWUudG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gb3V0Lm1OZXh0T3V0c2lkZVRvdWNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG91dCAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLm1PdXRzaWRlVG91Y2hUYXJnZXRzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2V2LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtODU1Nyw3ICs4NTYwLDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtQXR0YWNoZWRIaWRkZW4KICAgICAgICAgICAgICAgICAgICAgJiYgKGF0b2tlbiA9PSBudWxsID8gbVBvbGljeVZpc2liaWxpdHkgOiAhYXRva2VuLmhpZGRlblJlcXVlc3RlZCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKQorICAgICAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgJiYgIW1FeGl0aW5nICYmICFtRGVzdHJveWluZzsKICAgICAgICAgfQogCkBAIC04NjYxLDE0ICs4NjY0LDEyIEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGhhcyBhIHN1cmZhY2UgdGhhdCBpdCBoYXMgZHJhd24gYQotICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4gIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24KLSAgICAgICAgICogaXMgY2hhbmdpbmcgZXZlbiBpZiB0aGUgd2luZG93IGhhc24ndCByZWRyYXduIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotICAgICAgICAgKiB0byBzdG9wIHRoaW5ncyBmcm9tIGV4ZWN1dGluZyBkdXJpbmcgdGhhdCB0aW1lLgorICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRHJhd25MdygpIHsKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtRGVzdHJveWluZwotICAgICAgICAgICAgICAgICYmIChtT3JpZW50YXRpb25DaGFuZ2luZyB8fCAoIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nKSk7CisgICAgICAgICAgICAgICAgJiYgIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsbHNTY3JlZW5MdyhpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQsCkBAIC0xMDk0MSwxMiArMTA5NDIsNiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAody5tQXR0YWNoZWRIaWRkZW4gfHwgIXcuaXNSZWFkeUZvckRpc3BsYXkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3Lm1MYXN0SGlkZGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdW1wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0NPTkZJR1VSQVRJT04pIFNsb2cudihUQUcsICJXaW5kb3cgaGlkaW5nOiB3YWl0aW5nVG9TaG93PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLndhaXRpbmdUb1Nob3cgKyAiIHBvbHZpcz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVBvbGljeVZpc2liaWxpdHkgKyAiIGF0dGhpZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubUF0dGFjaGVkSGlkZGVuICsgIiB0b2toaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Sb290VG9rZW4uaGlkZGVuICsgIiB2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1WaWV3VmlzaWJpbGl0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5tTGFzdEhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVFJBTlNBQ1RJT05TKSBsb2dTdXJmYWNlKHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSElERSAocGVyZm9ybUxheW91dCkiLCBudWxsKTsKQEAgLTExMzQyLDI4ICsxMTMzNywyMyBAQAogICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGluZykgewogICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSsoMTAwMC82MCktU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiTGF5b3V0OiBtRGlzcGxheUZyb3plbj0iICsgbURpc3BsYXlGcm96ZW4KLSAgICAgICAgICAgICAgICArICIgaG9sZFNjcmVlbj0iICsgaG9sZFNjcmVlbik7Ci0gICAgICAgIGlmICghbURpc3BsYXlGcm96ZW4pIHsKLSAgICAgICAgICAgIHNldEhvbGRTY3JlZW5Mb2NrZWQoaG9sZFNjcmVlbiAhPSBudWxsKTsKLSAgICAgICAgICAgIGlmIChzY3JlZW5CcmlnaHRuZXNzIDwgMCB8fCBzY3JlZW5CcmlnaHRuZXNzID4gMS4wZikgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKLSAgICAgICAgICAgICAgICAgICAgICAgIChzY3JlZW5CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1dHRvbkJyaWdodG5lc3MgPCAwIHx8IGJ1dHRvbkJyaWdodG5lc3MgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaG9sZFNjcmVlbiAhPSBtSG9sZGluZ1NjcmVlbk9uKSB7Ci0gICAgICAgICAgICAgICAgbUhvbGRpbmdTY3JlZW5PbiA9IGhvbGRTY3JlZW47Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gbUgub2J0YWluTWVzc2FnZShILkhPTERfU0NSRUVOX0NIQU5HRUQsIGhvbGRTY3JlZW4pOwotICAgICAgICAgICAgICAgIG1ILnNlbmRNZXNzYWdlKG0pOwotICAgICAgICAgICAgfQorICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7CisgICAgICAgIGlmIChzY3JlZW5CcmlnaHRuZXNzIDwgMCB8fCBzY3JlZW5CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1dHRvbkJyaWdodG5lc3MgPCAwIHx8IGJ1dHRvbkJyaWdodG5lc3MgPiAxLjBmKSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQorICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9sZFNjcmVlbiAhPSBtSG9sZGluZ1NjcmVlbk9uKSB7CisgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKKyAgICAgICAgICAgIG1ILnNlbmRNZXNzYWdlKG0pOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UdXJuT25TY3JlZW4pIHsKQEAgLTExNjU1LDggKzExNjQ1LDYgQEAKICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIEZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gdHJ1ZTsKICAgICAgICAgaWYgKG1OZXh0QXBwVHJhbnNpdGlvbiAhPSBXaW5kb3dNYW5hZ2VyUG9saWN5LlRSQU5TSVRfVU5TRVQpIHsKICAgICAgICAgICAgIG1OZXh0QXBwVHJhbnNpdGlvbiA9IFdpbmRvd01hbmFnZXJQb2xpY3kuVFJBTlNJVF9VTlNFVDsKQEAgLTExNjgwLDggKzExNjY4LDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIioqKiBVTkZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gZmFsc2U7CiAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguQVBQX0ZSRUVaRV9USU1FT1VUKTsKICAgICAgICAgaWYgKFBST0ZJTEVfT1JJRU5UQVRJT04pIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCmluZGV4IDBiNDFkZDguLjdiZjMyZjMgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcApAQCAtMjU4LDkgKzI1OCw5IEBACiAgICAgICAgIHNBR3BzSW50ZXJmYWNlLT5pbml0KCZzQUdwc0NhbGxiYWNrcyk7CiAKICAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkKLSAgICAgICBzR3BzTmlJbnRlcmZhY2UgPSAoY29uc3QgR3BzTmlJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX05JX0lOVEVSRkFDRSk7CisgICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKICAgICBpZiAoc0dwc05pSW50ZXJmYWNlKQotICAgICAgIHNHcHNOaUludGVyZmFjZS0+aW5pdCgmc0dwc05pQ2FsbGJhY2tzKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlLT5pbml0KCZzR3BzTmlDYWxsYmFja3MpOwogCiAgICAgaWYgKCFzR3BzRGVidWdJbnRlcmZhY2UpCiAgICAgICAgc0dwc0RlYnVnSW50ZXJmYWNlID0gKGNvbnN0IEdwc0RlYnVnSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19ERUJVR19JTlRFUkZBQ0UpOwpAQCAtNDI2LDEyICs0MjYsMTAgQEAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9zZW5kX25pX3Jlc3BvbnNlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwKICAgICAgIGppbnQgbm90aWZJZCwgamludCByZXNwb25zZSkKIHsKLSAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkgeworICAgIGlmICghc0dwc05pSW50ZXJmYWNlKQogICAgICAgICBzR3BzTmlJbnRlcmZhY2UgPSAoY29uc3QgR3BzTmlJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX05JX0lOVEVSRkFDRSk7Ci0gICAgfQotICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpIHsKKyAgICBpZiAoc0dwc05pSW50ZXJmYWNlKQogICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPnJlc3BvbmQobm90aWZJZCwgcmVzcG9uc2UpOwotICAgIH0KIH0KIAogc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX2dldF9pbnRlcm5hbF9zdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmopCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYjA3YTEwYi4uMTg2YjM0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tawpAQCAtNyw4ICs3LDEwIEBACiAjIEluY2x1ZGUgYWxsIHRlc3QgamF2YSBmaWxlcy4KIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGVhc3ltb2NrbGliCiAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgc2VydmljZXMKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzCiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWNlMTA5Zi4uZjExNWY0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNiArMjMsMTkgQEAKICAgICAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUzYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUKKyAqIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlfSBieSBtb2NraW5nIHRoZQorICoge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyfSB3aGljaCB0YWxrcyB0byB0byB0aGUKKyAqIHNlcnZpY2UuIFRoZSBzZXJ2aWNlIGl0c2VsZiBpcyBpbnRlcmFjdGluZyB3aXRoIHRoZSBwbGF0Zm9ybS4gTm90ZTogVGVzdGluZworICogdGhlIHNlcnZpY2UgaW4gZnVsbCBpc29sYXRpb24gd291bGQgcmVxdWlyZSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yayBmb3IKKyAqIG1vY2tpbmcgYWxsIHN5c3RlbSBpbnRlcmFjdGlvbnMuIEl0IHdvdWxkIGFsc28gcmVxdWlyZSBhIGxvdCBvZiBtb2NraW5nIGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSAxMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IGluIHdoaWNoIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgc3lzdGVtIHRvIHN0YXJ0IHRoZSBtb2NrCisgICAgICogYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTID0gMzAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCB1c2VkIGZvciB0ZXN0aW5nIHRoYXQgYSBzZXJ2aWNlIGlzIG5vdGlmaWVkIG9ubHkgdXBvbiBhCisgICAgICogbm90aWZpY2F0aW9uIHRpbWVvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzUGFja2FnZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIHVzZWQgdG8gdGFsayB0byB0aGUgdGVzdGVkIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1hbmFnZXJTZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgaWYgKHNQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzUGFja2FnZU5hbWUgPSBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0KCkgeworICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eURpc2FibGVkVGhlbkVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWRUaGVuRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBjbGllbnQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGNsaWVudCBtb2NrIGluc3RhbmNlCisgICAgICAgIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IG1vY2tDbGllbnQgPSBuZXcgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsaWVudCBtdXN0IGJlIGVuYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2xpZW50IG11c3QgYmUgZGlzYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VzTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IGZhbHNlOworCisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBTdHJpbmcgZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAgICAgLy8gbG9vayBmb3IgdGhlIHR3byBtb2NrIHNlcnZpY2VzCisgICAgICAgIGZvciAoU2VydmljZUluZm8gc2VydmljZUluZm8gOiBtTWFuYWdlclNlcnZpY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoc2VydmljZUluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlyc3QgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCBtb2NrIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQiLCBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RNYXRjaGluZ1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoIm5vLnNlcnZpY2UucmVnaXN0ZXJlZC5mb3IudGhpcy5wYWNrYWdlIik7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdFdmVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RpZml2YXRpb25BZnRlclRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQ7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oaW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBmaXJzdCBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBmaXJzdEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBzZWNvbmQgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2Vjb25kRXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UuZXhwZWN0RXZlbnQoc2Vjb25kRXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50cworICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2Vjb25kRXZlbnQpOworCisgICAgICAgIC8vIHdhaXQgZm9yICNzZW5kQWNjZXNzaWJpbGl0eUV2ZW50IHRvIHJlYWNoIHRoZSBiYWNraW5nIHNlcnZpY2UKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2aWNlLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiTm8gZXZlbnRzIG11c3QgYmUgZGlzcGF0Y2hlZCBiZWZvcmUgdGhlIGV4cGlyYXRpb24gb2YgdGhlIG5vdGlmaWNhdGlvbiB0aW1lb3V0LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvKiBleHBlY3RlZCAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGNvbmZpZ3VyZWQgbm90aWZpY2F0aW9uIHRpbWVvdXQgdG8gZXhwaXJlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfRGlmZkZlZWRiYWNrKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfSEFQVElDOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKHNlY29uZEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9PbmVEZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX1R3b0RlZmF1bHQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gc2Vjb25kSW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEludGVycnVwdCgpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBjYWxsIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBtTWFuYWdlclNlcnZpY2UuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsbHkgcG9wdWxhdGVzIHRoZSB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSB0byBtYXJzaGFsLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbnRFdmVudCBUaGUgZXZlbnQgdG8gcG9wdWxhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQpIHsKKyAgICAgICAgc2VudEV2ZW50LnNldEFkZGVkQ291bnQoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRCZWZvcmVUZXh0KCJCZWZvcmVUZXh0Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDaGVja2VkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2xhc3NOYW1lKCJmb28uYmFyLmJhei5DbGFzcyIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKCJDb250ZW50RGVzY3JpcHRpb24iKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEN1cnJlbnRJdGVtSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFRpbWUoMTAwMCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGcm9tSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGdWxsU2NyZWVuKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0SXRlbUNvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoImZvby5iYXIuYmF6Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXJjZWxhYmxlRGF0YShNZXNzYWdlLm9idGFpbihudWxsLCAxLCBudWxsKSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXNzd29yZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFJlbW92ZWRDb3VudCgxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgbW9jayB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuU3R1YiB7CisgICAgICAgIGJvb2xlYW4gbUlzRW5hYmxlZDsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFjY2Vzc2liaWxpdHkgaXMgaW4gYSBnaXZlbiBzdGF0ZSBieSB3cml0aW5nIHRoZSBzdGF0ZSB0byB0aGUKKyAgICAgKiBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGljayBpdCB1cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCBoYW5kbGUgdG8gYWNjZXNzIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUaGUgYWNjZXNzaWJpbGl0eSBzdGF0ZSB0byB3cml0ZSB0byB0aGUgc2V0dGluZ3MuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCwgMCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7CisKKyAgICAgICAgaWYgKGlzRW5hYmxlZCA9PSBlbmFibGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgZW5hYmxlZCA/IDEgOiAwKTsKKworICAgICAgICAvLyB3YWl0IHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSB0byBwaWNrIHRoZSBjaGFuZ2UgdXAKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIG9ubHkge0BsaW5rIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZX1zIHdpdGggZ2l2ZW4gY29tcG9uZW50CisgICAgICogbmFtZXMgYXJlIGVuYWJsZWQgYnkgd3JpdGluZyB0byB0aGUgc3lzdGVtIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZQorICAgICAqIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2tzIHRoYXQgdXAgb3IgdGhlCisgICAgICoge0BsaW5rICNUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFU30gaXMgZXhjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBmaXJzdCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQgSWYgdGhlIHNlY29uZCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBmb3IgZW5hYmxpbmcgbW9jayBzZXJ2aWNlcworICAgICAqICAgICAgICAgaXMgbm90IHByb3Blcmx5IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCwKKyAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVuYWJsZWRTZXJ2aWNlcyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNlcnZpY2VzVG9FbmFibGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2aWNlc1RvRW5hYmxlLmVxdWFscyhlbmFibGVkU2VydmljZXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgc2VydmljZXNUb0VuYWJsZS50b1N0cmluZygpKTsKKworICAgICAgICAvLyB3ZSBoYXZlIGVuYWJsZWQgdGhlIHNlcnZpY2VzIG9mIGludGVyZXN0IGFuZCBuZWVkIHRvIHdhaXQgdW50aWwgdGhleQorICAgICAgICAvLyBhcmUgaW5zdGFudGlhdGVkIGFuZCBzdGFydGVkIChpZiBuZWVkZWQpIGFuZCB0aGUgc3lzdGVtIGJpbmRzIHRvIHRoZW0KKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlT0sgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsaW5nSW50ZXJ2YWwgPSBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyAvIDY7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUykgIHsKKyAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VPSyA9ICFmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZS5pc1N5c3RlbUJvdW5kQXNDbGllbnQoKSk7CisKKyAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlT0sgPSAhc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHx8IChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZU9LICYmIHNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsaW5nSW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoIk1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyBub3Qgc3RhcnRlZCBvciBzeXN0ZW0gbm90IGJvdW5kIGFzIGEgY2xpZW50OiAiKTsKKyAgICAgICAgaWYgKCFmaXJzdE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZAorICAgICAqICh3aGljaCBpcyBpdCBoYXMgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIG1ldGhvZCBjYWxscyB3aXRoIGV4cGVjdGVkCisgICAgICogYXJndW1lbnRzKSB3aXRoaW4gdGhlIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uIFRoZSB2ZXJpZmllZCBzdGF0ZSBpcworICAgICAqIGNoZWNrZWQgYnkgcG9sbGluZyB1cG9uIHNtYWxsIGludGVydmFscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIHZlcmlmeS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBmYWlsZWQgd2l0aCBleGNlcHRpb24gYWZ0ZXIgdGhlCisgICAgICogICAgICAgICAgICAge0BsaW5rICNUSU1FT1VUX0JJTkRFUl9DQUxMfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGxhc3RWZXJpZnlFeGNlcHRpb24gPSBudWxsOworICAgICAgICBsb25nIGJlZ2luVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBsb25nIHBvbGxUbWVvdXQgPSBUSU1FT1VUX0JJTkRFUl9DQUxMIC8gNTsKKworICAgICAgICAvLyBwb2xsIHVudGlsIHRoZSB0aW1lb3V0IGhhcyBlbGFwc2VkCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIGJlZ2luVGltZSA8IFRJTUVPVVRfQklOREVSX0NBTEwpIHsKKyAgICAgICAgICAgIC8vIHNsZWVwIGZpcnN0IHNpbmNlIGltbWVkaWF0ZSBjYWxsIHdpbGwgYWx3YXlzIGZhaWwKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBvbGxUbWVvdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBvbGwgZm9yIHZlcmlmaWNhdGlvbiBhbmQgaWYgdGhpcyBmYWlscyBzYXZlIHRoZSBleGNlcHRpb24gYW5kCisgICAgICAgICAgICAvLyBrZWVwIHBvbGxpbmcKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBzbyBpdCBkb2VzIG5vdCBhY2NlcHQgbW9yZSBldmVudHMKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc2V0LCB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkCisgICAgICAgIHNlcnZpY2UucmVzZXQoKTsKKworICAgICAgICAvLyBhbHdheXMgbm90IG51bGwKKyAgICAgICAgdGhyb3cgbGFzdFZlcmlmeUV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0byB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGZpcnN0IG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc0luc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZlZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNyZWF0ZVN0cmljdE1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBvcnRNYXRjaGVyOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVzZXQ7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7CisKK2ltcG9ydCBvcmcuZWFzeW1vY2suSUFyZ3VtZW50TWF0Y2hlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgd2hpY2ggbW9ja2luZyB0aGUgYmFja2luZyBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9CSU5ERVJfQ0FMTCA9IDUwOworCisgICAgLyoqCisgICAgICogVGhlIHJldXNhYmxlIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1vY2tTZXJ2aWNlSW50ZXJmYWNlID0KKyAgICAgICAgY3JlYXRlU3RyaWN0TW9jayhJQWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xhc3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzZXQobU1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBpbnN0YWxsZWQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyB0aGUgbW9jayBzZXJ2aWNlIHJldHVybnMKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gZXhwZWN0ZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZUluZm8+KCk7CisgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHNlcnZpY2VJbmZvLm5hbWUgPSAiVGVzdFNlcnZpY2VJbmZvTmFtZSI7CisgICAgICAgIGV4cGVjdGVkU2VydmljZXMuYWRkKHNlcnZpY2VJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkuYW5kUmV0dXJuKGV4cGVjdGVkU2VydmljZXMpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiByZWNlaXZlZFNlcnZpY2VzID0gbWFuYWdlci5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQgKGxpc3QgZXF1YWxzKCkgY29tcGFyZXMgaXQgY29udGVudHMgYXMgd2VsbCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGwgZXhwZWN0ZWQgc2VydmljZXMgbXVzdCBiZSByZXR1cm5lZCIsIHJlY2VpdmVkU2VydmljZXMsIGV4cGVjdGVkU2VydmljZXMpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBtb2NrU2VydmljZUludGVyZmFjZS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5pbnRlcnJ1cHQoKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkID0gbWFuYWdlci5pc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzdCBiZSBlbmFibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZW5hYmxlZCIsIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgbWFuYWdlci5nZXRDbGllbnQoKS5zZXRFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYXN5bmNocm9ub3VzIElCaW5kZXIgY2FsbCB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJNdXN0IGJlIGRpc2FibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZGlzYWJsZWQiLAorICAgICAgICAgICAgICAgIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gZGlmZmVyZW50IHByb2Nlc3NlcykKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudERpZmZlcmVudFByb2Nlc3NlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLCBzbyB0aGUgZXZlbnQgbXVzdCBiZSAiICsKKyAgICAgICAgICAgICAgICAicmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudERpZmZlcmVudFByb2Nlc3Nlcyk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAobWFuYWdlciBhbmQgc2VydmljZSBpbiB0aGUgc2FtZSBwcm9jZXNzKQorICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudFNhbWVQcm9jZXNzID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJUaGUgbWFuYWdlciBhbmQgdGhlIHNlcnZpY2UgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsIHNvIHRoZSBldmVudCBtdXN0IG5vdCIgKworICAgICAgICAgICAgICAgICJiZSByZWN5Y2xlZCIsIHNlbnRFdmVudCwgbmV4dEV2ZW50U2FtZVByb2Nlc3MpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYW4gZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAoYWNjZXNzaWJpbGl0eSBkaXNhYmxlZCkKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgICAgICBmYWlsKCJObyBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBhcmUgc2VudCBpZiBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY2Nlc3NpYmlsaXR5IG9mZi4gRGlkIHlvdSBmb3JnZXQgdG8gY2hlY2sgdGhhdD8iLCBpc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZWQgVGhlIGV2ZW50IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBleHBlY3RhdGlvbnMgYXJlIG1hdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50IGVxQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBtYXRjaGVkKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlcihtYXRjaGVkKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYW4ge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0gcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50CisgICAgICogbWF0Y2hlcyBleHBlY3RhdGlvbnMgd2hpY2ggaW4gdGhpcyBjYXNlIGFyZSB0aGF0IGFueSBpbnN0YW5jZSBpcyBhY2NlcHRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgcmVwb3J0TWF0Y2hlcihuZXcgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyKCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50IG1FeHBlY3RlZEV2ZW50OworCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgICAgIG1FeHBlY3RlZEV2ZW50ID0gZXhwZWN0ZWRFdmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBBY2Nlc3NpYmlsaXR5RXZlbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQgPSAoQWNjZXNzaWJpbGl0eUV2ZW50KSBtYXRjaGVkOworICAgICAgICAgICAgcmV0dXJuIG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpID09IHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KCkiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiB3aXRoIGV2ZW50IHR5cGUgXCIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobUV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXIgZm9yIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnRNYXRoZXIgaW1wbGVtZW50cyBJQXJndW1lbnRNYXRjaGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKCEobWF0Y2hlZCBpbnN0YW5jZW9mIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImFkZENsaWVudCgpIHdpdGggYW55IElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzliODYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX1zLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHRoaXMgc2VydmljZSBleHBlY3RzIHRvIHJlY2VpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxBY2Nlc3NpYmlsaXR5RXZlbnQ+IG1FeHBlY3RlZEV2ZW50cyA9IG5ldyBMaW5rZWRMaXN0PEFjY2Vzc2liaWxpdHlFdmVudD4oKTsKKworICAgIC8qKgorICAgICAqIEludGVycnVwdGlvbiBjYWxsIHRoaXMgc2VydmljZSBleHBlY3RzIHRvIHJlY2VpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FeHBlY3RlZEludGVycnVwdDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaWYgdGhlIG1vY2sgaXMgY3VycmVudGx5IHJlcGxheWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlcGxheWluZzsKKworICAgIC8qKgorICAgICAqIEZsYWcgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCBhcyBhIGNsaWVudCB0byB0aGlzIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99IHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQKKyAgICAgKiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IGluZm8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gY3JlYXRlRGVmYXVsdEluZm8oKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBkZWZhdWx0SW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKKyAgICAgICAgZGVmYXVsdEluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRDsKKyAgICAgICAgZGVmYXVsdEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7CisgICAgICAgIGRlZmF1bHRJbmZvLmZsYWdzID0gMDsKKyAgICAgICAgZGVmYXVsdEluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IDA7CisgICAgICAgIGRlZmF1bHRJbmZvLnBhY2thZ2VOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiZm9vLmJhci5iYXoiCisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyByZXBsYXlpbmcgdGhlIG1vY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVwbGF5KCkgeworICAgICAgICBtUmVwbGF5aW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyBpZiBhbGwgZXhwZWN0ZWQgc2VydmljZSBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVwbGF5KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRJbnRlcnJ1cHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGNhbGwgdG8gI2ludGVycnVwdCgpIG5vdCByZWNlaXZlZCIpOworICAgICAgICB9CisgICAgICAgIGlmICghbUV4cGVjdGVkRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBjYWxsIHRvIG9uQWNjZXNzaWJpbGl0eUV2ZW50KCkgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZXZlbnRzIFwiIiArIG1FeHBlY3RlZEV2ZW50cyArICJcIiBub3QgcmVjZWl2ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGlzIGluc3RhbmNlIHNvIGl0IGNhbiBiZSByZXVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1FeHBlY3RlZEV2ZW50cy5jbGVhcigpOworICAgICAgICBtRXhwZWN0ZWRJbnRlcnJ1cHQgPSBmYWxzZTsKKyAgICAgICAgbVJlcGxheWluZyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZXhwZWN0ZWQgY2FsbCB0bworICAgICAqIHtAbGluayAjb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50KX0gd2l0aCBnaXZlbiBldmVudCBhcworICAgICAqIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGVjdGVkRXZlbnQgVGhlIGV4cGVjdGVkIGV2ZW50IGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdEV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50KSB7CisgICAgICAgIG1FeHBlY3RlZEV2ZW50cy5hZGQoZXhwZWN0ZWRFdmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBleHBlY3RlZCBjYWxsIG9mIHtAbGluayAjb25JbnRlcnJ1cHQoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0SW50ZXJydXB0KCkgeworICAgICAgICBtRXhwZWN0ZWRJbnRlcnJ1cHQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZEV2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZXZlbnQ6ICIgKyByZWNlaXZlZEV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50ID0gbUV4cGVjdGVkRXZlbnRzLnBvbGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoZXhwZWN0ZWRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25JbnRlcnJ1cHQoKSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRXhwZWN0ZWRJbnRlcnJ1cHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2FsbCB0byBvbkludGVycnVwdCgpIik7CisgICAgICAgIH0KKworICAgICAgICBtRXhwZWN0ZWRJbnRlcnJ1cHQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7CisgICAgICAgIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUlzU3lzdGVtQm91bmRBc0NsaWVudCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kIGFzIGNsaWVudCB0byB0aGlzIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3lzdGVtQm91bmRBc0NsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgYWxsIHByb3BlcnRpZXMgb2YgdGhlIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZWNldmllZEV2ZW50PC9jb2RlPiB0byB2ZXJpZnkgdGhhdCB0aGUgcmVjZWl2ZWQgZXZlbnQgaXMgdGhlIG9uZQorICAgICAqIHRoYXQgaXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc0FjY2Vzc2libGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJhZGRlZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEFkZGVkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEFkZGVkQ291bnQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiYmVmb3JlVGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRCZWZvcmVUZXh0KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRCZWZvcmVUZXh0KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNoZWNrZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNDaGVja2VkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0NoZWNrZWQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY2xhc3NOYW1lIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldENsYXNzTmFtZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNvbnRlbnREZXNjcmlwdGlvbiBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudAorICAgICAgICAgICAgICAgIC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwgcmVjZWl2ZWRFdmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY3VycmVudEl0ZW1JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudAorICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SXRlbUluZGV4KCksIHJlY2VpdmVkRXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJlbmFibGVkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNFbmFibGVkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImV2ZW50VHlwZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJmcm9tSW5kZXggaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0RnJvbUluZGV4KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRGcm9tSW5kZXgoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZnVsbFNjcmVlbiBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0Z1bGxTY3JlZW4oKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzRnVsbFNjcmVlbigpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJpdGVtQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0SXRlbUNvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRJdGVtQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc05vdGlmaWNhdGlvbkFzUGFyY2VsYWJsZURhdGEoZXhwZWN0ZWRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygicGFzc3dvcmQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNQYXNzd29yZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNQYXNzd29yZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJyZW1vdmVkQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0UmVtb3ZlZENvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRSZW1vdmVkQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc1RleHQoZXhwZWN0ZWRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHtAbGluayBhbmRyb2lkLm9zLlBhcmNlbGFibGV9IGRhdGEgb2YgdGhlCisgICAgICogPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kIDxjb2RlPnJlY2VpdmVkRXZlbnQ8L2NvZGU+IHRvIHZlcmlmeSB0aGF0CisgICAgICogdGhlIHJlY2VpdmVkIGV2ZW50IGlzIHRoZSBvbmUgdGhhdCBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzTm90aWZpY2F0aW9uQXNQYXJjZWxhYmxlRGF0YShBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gInBhcmNlbGFibGVEYXRhIGhhcyBpbmNvcnJlY3QgdmFsdWUiOworICAgICAgICBNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9IChNZXNzYWdlKSBleHBlY3RlZEV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCk7CisgICAgICAgIE1lc3NhZ2UgcmVjZWl2ZWRNZXNzYWdlID0gKE1lc3NhZ2UpIHJlY2VpdmVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKTsKKworICAgICAgICBpZiAoZXhwZWN0ZWRNZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZWNlaXZlZE1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwobWVzc2FnZSwgcmVjZWl2ZWRNZXNzYWdlKTsKKworICAgICAgICAvLyB3ZSBkbyBhIHZlcnkgc2ltcGxlIHNhbml0eSBjaGVjayBzaW5jZSB3ZSBkbyBub3QgdGVzdCBNZXNzYWdlCisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZE1lc3NhZ2Uud2hhdCwgcmVjZWl2ZWRNZXNzYWdlLndoYXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSB0ZXh0IG9mIHRoZSA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQKKyAgICAgKiA8Y29kZT5yZWNlaXZlZEV2ZW50PC9jb2RlPiBieSBjb21wYXJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHtAbGluayBDaGFyU2VxdWVuY2V9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzVGV4dChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gInRleHQgaGFzIGluY29ycmVjdCB2YWx1ZSI7CisgICAgICAgIExpc3Q8Q2hhclNlcXVlbmNlPiBleHBlY3RlZFRleHQgPSBleHBlY3RlZEV2ZW50LmdldFRleHQoKTsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IHJlY2VpdmVkVGV4dCA9IHJlY2VpdmVkRXZlbnQuZ2V0VGV4dCgpOworCisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRleHQuc2l6ZSgpLCByZWNlaXZlZFRleHQuc2l6ZSgpKTsKKworICAgICAgICBJdGVyYXRvcjxDaGFyU2VxdWVuY2U+IGV4cGVjdGVkVGV4dEl0ZXJhdG9yID0gZXhwZWN0ZWRUZXh0Lml0ZXJhdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yPENoYXJTZXF1ZW5jZT4gcmVjZWl2ZWRUZXh0SXRlcmF0b3IgPSByZWNlaXZlZFRleHQuaXRlcmF0b3IoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVGV4dC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUZXh0SXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGV4dEl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCmluZGV4IDhhNDczMzkuLjc4MjYzNWUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQpAQCAtMTYsODMgKzE2LDE5OSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5Bc1lvdVR5cGVGb3JtYXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogV2F0Y2hlcyBhIHtAbGluayBUZXh0Vmlld30gYW5kIGlmIGEgcGhvbmUgbnVtYmVyIGlzIGVudGVyZWQgd2lsbCBmb3JtYXQgaXQgdXNpbmcKLSAqIHtAbGluayBQaG9uZU51bWJlclV0aWxzI2Zvcm1hdE51bWJlcihFZGl0YWJsZSwgaW50KX0uIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uCi0gKiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIHdoZW4gdGhpcyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCi0gKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgKiBXYXRjaGVzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZAorICogd2lsbCBmb3JtYXQgaXQuCisgKiA8cD4KKyAqIFN0b3AgZm9ybWF0dGluZyB3aGVuIHRoZSB1c2VyCisgKiA8dWw+CisgKiA8bGk+SW5wdXRzIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXJzPC9saT4KKyAqIDxsaT5SZW1vdmVzIHRoZSBzZXBhcmF0b3IgaW4gdGhlIG1pZGRsZSBvZiBzdHJpbmcuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSBmb3JtYXR0aW5nIHdpbGwgYmUgcmVzdGFydGVkIG9uY2UgdGhlIHRleHQgaXMgY2xlYXJlZC4KICAqLwogcHVibGljIGNsYXNzIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyIGltcGxlbWVudHMgVGV4dFdhdGNoZXIgeworICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGNoYXJhY3RlcnMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfUkVNT1ZFX0xBU1QgPSAwOwogCi0gICAgc3RhdGljIHByaXZhdGUgaW50IHNGb3JtYXRUeXBlOwotICAgIHN0YXRpYyBwcml2YXRlIExvY2FsZSBzQ2FjaGVkTG9jYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRm9ybWF0dGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nSHlwaGVuOwotICAgIHByaXZhdGUgaW50IG1IeXBoZW5TdGFydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nQmFja3dhcmQ7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9BUFBFTkQgPSAxOwogCisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgZGlnaXRzIHdlcmUgY2hhbmdlZCBpbiB0aGUgYmVnaW5uaW5nIG9yIHRoZSBtaWRkbGUgb2YgdGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfTU9ESUZZX0RJR0lUUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhbmdlcyBvdGhlciB0aGFuIHRoZSBhYm92ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfT1RIRVIgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXRlIG9mIHRoaXMgY2hhbmdlIGNvdWxkIGJlIG9uZSB2YWx1ZSBvZiB0aGUgYWJvdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtU3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGNoYW5nZSB3YXMgY2F1c2VkIGJ5IG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgZm9ybWF0dGluZyBoYXMgYmVlbiBzdG9wcGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcEZvcm1hdHRpbmc7CisKKyAgICBwcml2YXRlIEFzWW91VHlwZUZvcm1hdHRlciBtRm9ybWF0dGVyOworCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3lzdGVtIGxvY2FsZSBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCisgICAgICogbWF5IG5vdCB0YWtlIGVmZmVjdCBvbiB0aGlzIGluc3RhbmNlLgorICAgICAqLwogICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpIHsKLSAgICAgICAgaWYgKHNDYWNoZWRMb2NhbGUgPT0gbnVsbCB8fCBzQ2FjaGVkTG9jYWxlICE9IExvY2FsZS5nZXREZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHNDYWNoZWRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgc0Zvcm1hdFR5cGUgPSBQaG9uZU51bWJlclV0aWxzLmdldEZvcm1hdFR5cGVGb3JMb2NhbGUoc0NhY2hlZExvY2FsZSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcyAoTG9jYWxlLmdldERlZmF1bHQoKSAhPSBudWxsID8gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCkgOiAiVVMiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBpZ25vcmUgY2FsbHMgdG8gYWZ0ZXJUZXh0Q2hhbmdlZCBjYXVzZWQgYnkgdGhlIHdvcmsgZG9uZSBiZWxvdwotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIElmIGRlbGV0aW5nIHRoZSBoeXBoZW4sIGFsc28gZGVsZXRlIHRoZSBjaGFyIGJlZm9yZSBvciBhZnRlciB0aGF0Ci0gICAgICAgICAgICBpZiAobURlbGV0aW5nSHlwaGVuICYmIG1IeXBoZW5TdGFydCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobURlbGV0aW5nQmFja3dhcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IeXBoZW5TdGFydCAtIDEgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQgLSAxLCBtSHlwaGVuU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSHlwaGVuU3RhcnQgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKG1IeXBoZW5TdGFydCwgbUh5cGhlblN0YXJ0ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcih0ZXh0LCBzRm9ybWF0VHlwZSk7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXR0aW5nID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gPGNvZGU+Y291bnRyeUNvZGU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50cnlDb2RlIHRoZSBJU08gMzE2Ni0xIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb3VudHJ5L3JlZ2lvbgorICAgICAqIHdoZXJlIHRoZSBwaG9uZSBudW1iZXIgaXMgYmVpbmcgZW50ZXJlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKFN0cmluZyBjb3VudHJ5Q29kZSkgeworICAgICAgICBtRm9ybWF0dGVyID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCkuZ2V0QXNZb3VUeXBlRm9ybWF0dGVyKGNvdW50cnlDb2RlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBkZWxldGluZyBhIGh5cGhlbgotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdXNlciBpcyBkZWxldGluZyBvbmUgY2hhciwgd2l0aG91dCBhIHNlbGVjdGlvbgotICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHMpOwotICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocyk7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDEgLy8gQ2FuIGRlbGV0ZSBhbm90aGVyIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBjb3VudCA9PSAxIC8vIERlbGV0aW5nIG9ubHkgb25lIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBhZnRlciA9PSAwIC8vIERlbGV0aW5nCi0gICAgICAgICAgICAgICAgICAgICYmIHMuY2hhckF0KHN0YXJ0KSA9PSAnLScgLy8gYSBoeXBoZW4KLSAgICAgICAgICAgICAgICAgICAgJiYgc2VsU3RhcnQgPT0gc2VsRW5kKSB7IC8vIG5vIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIG1EZWxldGluZ0h5cGhlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUh5cGhlblN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgZm9yd2FyZCBvciBiYWNrd2FyZAotICAgICAgICAgICAgICAgIGlmIChzZWxTdGFydCA9PSBzdGFydCArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0aW5nQmFja3dhcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSAwICYmIHMubGVuZ3RoKCkgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEFwcGVuZCBvbmUgb3IgbW9yZSBuZXcgY2hhcnMKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FQUEVORDsKKyAgICAgICAgfSBlbHNlIGlmIChhZnRlciA9PSAwICYmIHN0YXJ0ICsgY291bnQgPT0gcy5sZW5ndGgoKSAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbmUgb3IgbW9yZSBjaGFycyBmcm9tIHRoZSBlbmQgb2Ygc3RyaW5nLgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVNT1ZFX0xBU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkaWFsYWJsZSBjaGFycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NT0RJRllfRElHSVRTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfT1RIRVI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgewotICAgICAgICAvLyBEb2VzIG5vdGhpbmcKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgIWhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlciBpbnNlcnRlZCB0aGUgZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQVBQRU5EICYmIGNvdW50ID4gMCAmJiBoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gVXNlciBhcHBlbmRlZCB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3Rlciwgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICAgICAgc3RvcEZvcm1hdHRpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgbXVzdCBpbnNlcnQgb3IgcmVtb3ZlIHRoZSBub24tZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mCisgICAgICAgICAgICAvLyBudW1iZXIsIHN0b3AgZm9ybWF0dGluZy4gCisgICAgICAgICAgICBzdG9wRm9ybWF0dGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICBpZiAobVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSBmb3JtYXR0aW5nIHdoZW4gYWxsIHRleHRzIHdlcmUgY2xlYXIuCisgICAgICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSAhKHMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGNoYW5nZSBjYXVzZWQgYnkgcy5yZXBsYWNlKCkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZCA9IHJlZm9ybWF0KHMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocykpOworICAgICAgICBpZiAoZm9ybWF0dGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCByZW1lbWJlcmVkUG9zID0gbUZvcm1hdHRlci5nZXRSZW1lbWJlcmVkUG9zaXRpb24oKTsKKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHMucmVwbGFjZSgwLCBzLmxlbmd0aCgpLCBmb3JtYXR0ZWQsIDAsIGZvcm1hdHRlZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAvLyBUaGUgdGV4dCBjb3VsZCBiZSBjaGFuZ2VkIGJ5IG90aGVyIFRleHRXYXRjaGVyIGFmdGVyIHdlIGNoYW5nZWQgaXQuIElmIHdlIGZvdW5kIHRoZQorICAgICAgICAgICAgLy8gdGV4dCBpcyBub3QgdGhlIG9uZSB3ZSB3ZXJlIGV4cGVjdGluZywganVzdCBnaXZlIHVwIGNhbGxpbmcgc2V0U2VsZWN0aW9uKCkuCisgICAgICAgICAgICBpZiAoZm9ybWF0dGVkLmVxdWFscyhzLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzLCByZW1lbWJlcmVkUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZm9ybWF0dGVkIG51bWJlciBieSBpZ25vcmluZyBhbGwgbm9uLWRpYWxhYmxlIGNoYXJzIGFuZCBzdGljayB0aGUgY3Vyc29yIHRvIHRoZQorICAgICAqIG5lYXJlc3QgZGlhbGFibGUgY2hhciB0byB0aGUgbGVmdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbnVtYmVyIGlzICAoNjUwKSAxMjMtNDU2NzggYW5kICc0JyBpcworICAgICAqIHJlbW92ZWQgdGhlbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBiZWhpbmQgJzMnIGluc3RlYWQgb2YgJy0nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlZm9ybWF0KENoYXJTZXF1ZW5jZSBzLCBpbnQgY3Vyc29yKSB7CisgICAgICAgIC8vIFRoZSBpbmRleCBvZiBjaGFyIHRvIHRoZSBsZWZ0d2FyZCBvZiB0aGUgY3Vyc29yLgorICAgICAgICBpbnQgY3VySW5kZXggPSBjdXJzb3IgLSAxOworICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gbnVsbDsKKyAgICAgICAgbUZvcm1hdHRlci5jbGVhcigpOworICAgICAgICBjaGFyIGxhc3ROb25TZXBhcmF0b3IgPSAwOworICAgICAgICBib29sZWFuIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gZ2V0Rm9ybWF0dGVkTnVtYmVyKGxhc3ROb25TZXBhcmF0b3IsIGhhc0N1cnNvcik7CisgICAgICAgICAgICAgICAgICAgIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0Tm9uU2VwYXJhdG9yID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IGN1ckluZGV4KSB7CisgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdE5vblNlcGFyYXRvciAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0dGVkOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZvcm1hdHRlZE51bWJlcihjaGFyIGxhc3ROb25TZXBhcmF0b3IsIGJvb2xlYW4gaGFzQ3Vyc29yKSB7CisgICAgICAgIHJldHVybiBoYXNDdXJzb3IgPyBtRm9ybWF0dGVyLmlucHV0RGlnaXRBbmRSZW1lbWJlclBvc2l0aW9uKGxhc3ROb25TZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgOiBtRm9ybWF0dGVyLmlucHV0RGlnaXQobGFzdE5vblNlcGFyYXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSB0cnVlOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcGFyYXRvcihmaW5hbCBDaGFyU2VxdWVuY2UgcywgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgY291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICghUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKaW5kZXggZjIyMTJmYi4uZTFiOWI2MCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQpAQCAtNTg2LDcgKzU4Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJbiB0aGUgVVMsIDEtNjUwLTU1NS0xMjM0IG11c3QgYmUgZXF1YWwgdG8gNjUwLTU1NS0xMjM0LAotICAgICAgICAgICAgLy8gd2hpbGUgMDkwLTEyMzQtMTIzNCBtdXN0IG5vdCBiZSBlcXVhbHQgdG8gOTAtMTIzNC0xMjM0IGluIEphcGFuLgorICAgICAgICAgICAgLy8gd2hpbGUgMDkwLTEyMzQtMTIzNCBtdXN0IG5vdCBiZSBlcXVhbCB0byA5MC0xMjM0LTEyMzQgaW4gSmFwYW4uCiAgICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3QgZXhpc3RzIGp1c3QgaW4gVVMgKHdpdGggMSB0cnVuayAoTkREKSBwcmVmaXgpLgogICAgICAgICAgICAgLy8gSW4gYWRkaXRpb24sICIwMTEgMTEgNzAwNTU1NDE0MSIgbXVzdCBub3QgZXF1YWwgdG8gIisxNzAwNTU1NDE0MSIsCiAgICAgICAgICAgICAvLyB3aGlsZSAiMDExIDEgNzAwNTU1NDE0MSIgbXVzdCBlcXVhbCB0byAiKzE3MDA1NTU0MTQxIgpAQCAtNzQ4LDEwICs3NDgsMTAgQEAKICAgICAgICAgaWYgKHByZXBlbmRQbHVzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuICJpbnRlcm5hdGlvbmFsIG51bWJlciIgYW5kIHNob3VsZCBoYXZlCiAgICAgICAgICAgICAvLyBhIHBsdXMgcHJlcGVuZGVkIHRvIHRoZSBkaWFsaW5nIG51bWJlci4gQnV0IHRoZXJlCi0gICAgICAgICAgICAvLyBjYW4gYWxzbyBiZSBHc20gTU1JIGNvZGVzIGFzIGRlZmluZWQgaW4gVFMgMjIuMDMwIDYuNS4yCisgICAgICAgICAgICAvLyBjYW4gYWxzbyBiZSBHU00gTU1JIGNvZGVzIGFzIGRlZmluZWQgaW4gVFMgMjIuMDMwIDYuNS4yCiAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aG9zZSBhbHNvLgogICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIGh0dHA6Ly93ZWIudGVsaWEuY29tL351NDc5MDQ3NzYvZ3Nta29kZS5odG0gaXMgYQorICAgICAgICAgICAgLy8gaHR0cDovL3dlYi50ZWxpYS5jb20vfnU0NzkwNDc3Ni9nc21rb2RlLmh0bQogICAgICAgICAgICAgLy8gaGFzIGEgbmljZSBsaXN0IG9mIHNvbWUgb2YgdGhlc2UgR1NNIGNvZGVzLgogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIEV4YW1wbGVzIGFyZToKQEAgLTgzOSwxMCArODM5LDEwIEBACiAKICAgICAgICAgICAgIC8vIEZJWE1FKG1rZikgVFMgMjMuMDQwIDkuMS4yLjMgc2F5cwogICAgICAgICAgICAgLy8gImlmIGEgbW9iaWxlIHJlY2VpdmVzIDExMTEgaW4gYSBwb3NpdGlvbiBwcmlvciB0bwotICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc2VtaS1vY3RldCB0aGVuIHByb2Nlc3Npbmcgc2hhbGwgY29tbWVuc2Ugd2l0aAorICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc2VtaS1vY3RldCB0aGVuIHByb2Nlc3Npbmcgc2hhbGwgY29tbWVuY2Ugd2l0aAogICAgICAgICAgICAgLy8gdGhlIG5leHQgc2VtaS1vY3RldCBhbmQgdGhlIGludGVydmVuaW5nCiAgICAgICAgICAgICAvLyBzZW1pLW9jdGV0IHNoYWxsIGJlIGlnbm9yZWQiCi0gICAgICAgICAgICAvLyBIb3cgZG9lcyB0aGlzIGppdmUgd2l0aCAyNCwwMDggMTAuNS40LjcKKyAgICAgICAgICAgIC8vIEhvdyBkb2VzIHRoaXMgaml2ZSB3aXRoIDI0LjAwOCAxMC41LjQuNwogCiAgICAgICAgICAgICBiID0gKGJ5dGUpKChieXRlc1tpXSA+PiA0KSAmIDB4Zik7CiAKQEAgLTk3Myw3ICs5NzMsNyBAQAogICAgICAqIENvbnZlcnQgYSBkaWFsaW5nIG51bWJlciB0byBCQ0QgYnl0ZSBhcnJheQogICAgICAqCiAgICAgICogQHBhcmFtIG51bWJlciBkaWFsaW5nIG51bWJlciBzdHJpbmcKLSAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9ubCBUT0EKKyAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9uYWwgVE9BCiAgICAgICogQHJldHVybiBCQ0QgYnl0ZSBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdCkBAIC0xMDc3LDEwICsxMDc3LDEwIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CiAgICAgICogQHBhcmFtIGRlZmF1bHRGb3JtYXR0aW5nVHlwZSBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHJ1bGVzIHRvIGFwcGx5IGlmIHRoZSBudW1iZXIgZG9lcwotICAgICAqIG5vdCBiZWdpbiB3aXRoICs8Y291bnRyeV9jb2RlPgorICAgICAqIG5vdCBiZWdpbiB3aXRoICtbY291bnRyeV9jb2RlXQogICAgICAqIEByZXR1cm4gVGhlIHBob25lIG51bWJlciBmb3JtYXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0dGluZyB0eXBlLgogICAgICAqCi0gICAgICogQGhpZGUgVE9ETzpTaHVvbGQgYmUgdW5oaWRkZW4uCisgICAgICogQGhpZGUgVE9ETzogU2hvdWxkIGJlIHVuaGlkZGVuLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcihTdHJpbmcgc291cmNlLCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNvdXJjZSk7CkBAIC0xMTA3LDcgKzExMDcsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRleHQgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQsIHdpbGwgYmUgbW9kaWZpZWQgd2l0aCB0aGUgZm9ybWF0dGluZwogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0TnVtYmVyKEVkaXRhYmxlIHRleHQsIGludCBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUpIHsKICAgICAgICAgaW50IGZvcm1hdFR5cGUgPSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGU7CkBAIC0xNTE1LDcgKzE1MTUsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKLSAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm10KSB7CisgICAgY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoU3RyaW5nIGRpYWxTdHIsaW50IGN1cnJGb3JtYXQsaW50IGRlZmF1bHRGb3JtYXQpIHsKICAgICAgICAgU3RyaW5nIHJldFN0ciA9IGRpYWxTdHI7CiAKICAgICAgICAgLy8gQ2hlY2tzIGlmIHRoZSBwbHVzIHNpZ24gY2hhcmFjdGVyIGlzIGluIHRoZSBwYXNzZWQtaW4gZGlhbCBzdHJpbmcKQEAgLTE1MjMsNyArMTUyMyw3IEBACiAgICAgICAgICAgICBkaWFsU3RyLmxhc3RJbmRleE9mKFBMVVNfU0lHTl9TVFJJTkcpICE9IC0xKSB7CiAgICAgICAgICAgICAvLyBGb3JtYXQgdGhlIHN0cmluZyBiYXNlZCBvbiB0aGUgcnVsZXMgZm9yIHRoZSBjb3VudHJ5IHRoZSBudW1iZXIgaXMgZnJvbSwKICAgICAgICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBjb3VudHJ5IHRoZSBwaG9uZSBpcyBjYW1wZWQgb24uCi0gICAgICAgICAgICBpZiAoKGN1cnJGb3JtYXQgPT0gZGVmYXVsdEZvcm10KSAmJiAoY3VyckZvcm1hdCA9PSBGT1JNQVRfTkFOUCkpIHsKKyAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybWF0KSAmJiAoY3VyckZvcm1hdCA9PSBGT1JNQVRfTkFOUCkpIHsKICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBkZWZhdWx0IGFuZCBjdXJyZW50IHRlbGVwaG9uZSBudW1iZXJpbmcgcGxhbnMgYXJlIE5BTlAuCiAgICAgICAgICAgICAgICAgU3RyaW5nIHBvc3REaWFsU3RyID0gbnVsbDsKICAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcERpYWxTdHIgPSBkaWFsU3RyOwpAQCAtMTcwMSw3ICsxNzAxLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8vIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgbm9uLWRpYWJsYWJsZSBQL1cgY2hhcmFjdGVyIHRvIHRoZSBvcmlnaW5hbAorICAgIC8vIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgbm9uLWRpYWxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCiAgICAgLy8gZGlhbCBzdHJpbmcgYmFzZWQgb24gdGhlIGRpYWxhYmxlIGluZGV4IHBhc3NlZCBpbgogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZwogICAgIGFwcGVuZFB3Q2hhckJhY2tUb09yaWdEaWFsU3RyKGludCBkaWFsYWJsZUluZGV4LFN0cmluZyBvcmlnU3RyLCBTdHJpbmcgZGlhbFN0cikgewpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKICAgICAgICAgcmV0dXJuIHJldFN0cjsKICAgICB9CiAKLSAgICAvLz09PT09IEJlZ2luaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKICAgICAvKioKICAgICAgKiBQaG9uZSBudW1iZXJzIGFyZSBzdG9yZWQgaW4gImxvb2t1cCIgZm9ybSBpbiB0aGUgZGF0YWJhc2UKQEAgLTE4NDMsMTIgKzE4NDMsMTIgQEAKIAogICAgIC8vPT09PT0gRW5kIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQogCi0gICAgLy89PT09PSBCZWdnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlU3RyaWN0bHkoKSA9PT09CisgICAgLy89PT09PSBCZWdpbm5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlU3RyaWN0bHkoKSA9PT09CiAKICAgICAvKgogICAgICAqIElmIHRydWUsIHRoZSBudW1iZXIgaXMgY291bnRyeSBjYWxsaW5nIGNvZGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVExZX0NBTExJTkdfQ0FMTFtdID0geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRSWV9DQUxMSU5HX0NBTExbXSA9IHsKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAogICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwKQEAgLTE4NjAsMTggKzE4NjAsMTggQEAKICAgICAgICAgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsCiAgICAgICAgIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCiAgICAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NDX0xFTkdUSCA9IENPVU5UTFlfQ0FMTElOR19DQUxMLmxlbmd0aDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NDX0xFTkdUSCA9IENPVU5UUllfQ0FMTElOR19DQUxMLmxlbmd0aDsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGlucHV0IGlzIHZhbGlkIENvdW50cnkgQ2FsbGluZyBDb2RlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb3VudHJ5Q2FsbGluZ0NvZGUoaW50IGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSkgewogICAgICAgICByZXR1cm4gY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlID4gMCAmJiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPCBDQ0NfTEVOR1RIICYmCi0gICAgICAgICAgICAgICAgQ09VTlRMWV9DQUxMSU5HX0NBTExbY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlXTsKKyAgICAgICAgICAgICAgICBDT1VOVFJZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaW50ZXJnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgaWYgaW5wdXQgImNoIiBpcworICAgICAqIFJldHVybnMgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCiAgICAgICogSVNPLUxBVElOIGNoYXJhY3RlcnMgMC05LgogICAgICAqIFJldHVybnMgLTEgb3RoZXJ3aXNlCiAgICAgICovCkBAIC0yMDA2LDcgKzIwMDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHByZWZpeCBvZiAic3RyIiBpcyAiaWdub3JhYmxlIi4gSGVyZSwgImlnbm9yYWJsZSIgbWVhbnMKLSAgICAgKiB0aGF0ICJzdHIiIGhhcyBvbmx5IG9uZSBkaWdpdCBhbmQgc2VwYXJhdGVyIGNoYXJhY3RlcnMuIFRoZSBvbmUgZGlnaXQgaXMKKyAgICAgKiB0aGF0ICJzdHIiIGhhcyBvbmx5IG9uZSBkaWdpdCBhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcnMuIFRoZSBvbmUgZGlnaXQgaXMKICAgICAgKiBhc3N1bWVkIHRvIGJlIHRydW5rIHByZWZpeC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUHJlZml4SXNJZ25vcmFibGUoZmluYWwgU3RyaW5nIHN0ciwKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKaW5kZXggODMwYWY0Ny4uMzhmNDRkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogCiAvKioKICAqIEEgbGlzdGVuZXIgY2xhc3MgZm9yIG1vbml0b3JpbmcgY2hhbmdlcyBpbiBzcGVjaWZpYyB0ZWxlcGhvbnkgc3RhdGVzCkBAIC0yODQsNyArMjg1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgbmV0d29ya1R5cGUpIHsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBMSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFLCBzdGF0ZSwgbmV0d29ya1R5cGUsIG51bGwpLgorICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSkuCiAgICAgICAgICAgICAgICAgICAgIHNlbmRUb1RhcmdldCgpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQppbmRleCBmNWU5NzUxLi45NTM2OTZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVNtczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNSYXdEYXRhOwpAQCAtMzMsNyArMzIsNyBAQAogLyoKICAqIFRPRE8oY29kZSByZXZpZXcpOiBDdXJpb3VzIHF1ZXN0aW9uLi4uIFdoeSBhcmUgYSBsb3Qgb2YgdGhlc2UKICAqIG1ldGhvZHMgbm90IGRlY2xhcmVkIGFzIHN0YXRpYywgc2luY2UgdGhleSBkbyBub3Qgc2VlbSB0byByZXF1aXJlCi0gKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgQXNzdW1lZGx5IHRoaXMgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAorICogYW55IGxvY2FsIG9iamVjdCBzdGF0ZT8gIFByZXN1bWFibHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CiAgKiBpbnRlcmZlcmluZyB3aXRoIHRoZSBBUEkuLi4KICAqLwogCkBAIC00Miw3ICs0MSw4IEBACiAgKiBHZXQgdGhpcyBvYmplY3QgYnkgY2FsbGluZyB0aGUgc3RhdGljIG1ldGhvZCBTbXNNYW5hZ2VyLmdldERlZmF1bHQoKS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNtc01hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIFNtc01hbmFnZXIgc0luc3RhbmNlOworICAgIC8qKiBTaW5nbGV0b24gb2JqZWN0IGNvbnN0cnVjdGVkIGR1cmluZyBjbGFzcyBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTbXNNYW5hZ2VyIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7CiAKICAgICAvKioKICAgICAgKiBTZW5kIGEgdGV4dCBiYXNlZCBTTVMuCkBAIC01Miw4ICs1Miw4IEBACiAgICAgICogIHRoZSBjdXJyZW50IGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKICAgICAgKiAgIGJyb2FkY2FzdCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgcGFydCBoYXMgYmVlbiBzZW50LgotICAgICAqICAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgICAqICAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50cyBpZiBub3QgbnVsbCwgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZgogICAgICAqICAgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT5zIChvbmUgZm9yIGVhY2ggbWVzc2FnZSBwYXJ0KSB0aGF0IGlzCkBAIC0xNzgsOCArMTc4LDggQEAKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Qb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCi0gICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAqICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTIyNCw5ICsyMjQsNiBAQAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIFNtc01hbmFnZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNtc01hbmFnZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgU21zTWFuYWdlcigpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKaW5kZXggYTI4NGVhNS4uZDg5OTQzMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuU3VibWl0UGR1QmFzZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViZjY4YQotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsODIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKKworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3Q7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBoaWRlCisgKgorICogQ2FsbE1hbmFnZXIgY2xhc3MgcHJvdmlkZXMgYW4gYWJzdHJhY3QgbGF5ZXIgZm9yIFBob25lQXBwIHRvIGFjY2VzcworICogYW5kIGNvbnRyb2wgY2FsbHMuIEl0IGltcGxlbWVudHMgUGhvbmUgaW50ZXJmYWNlLgorICoKKyAqIENhbGxNYW5hZ2VyIHByb3ZpZGVzIGNhbGwgYW5kIGNvbm5lY3Rpb24gY29udHJvbCBhcyB3ZWxsIGFzCisgKiBjaGFubmVsIGNhcGFiaWxpdHkuCisgKgorICogVGhlcmUgYXJlIHRocmVlIGNhdGVnb3JpZXMgb2YgQVBJcyBDYWxsTWFuYWdlciBwcm92aWRlZAorICoKKyAqICAxLiBDYWxsIGNvbnRyb2wgYW5kIG9wZXJhdGlvbiwgc3VjaCBhcyBkaWFsKCkgYW5kIGhhbmd1cCgpCisgKiAgMi4gQ2hhbm5lbCBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMgQ2FuQ29uZmVyZW5jZSgpCisgKiAgMy4gUmVnaXN0ZXIgbm90aWZpY2F0aW9uCisgKgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENhbGxNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ESVNDT05ORUNUID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DQUxMX1NUQVRFX0NIQU5HRUQgPSAxMDE7CisKKworICAgIC8vIFNpbmdsZXRvbiBpbnN0YW5jZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhbGxNYW5hZ2VyIElOU1RBTkNFID0gbmV3IENhbGxNYW5hZ2VyKCk7CisKKyAgICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgcGhvbmVzCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UGhvbmU+IG1QaG9uZXM7CisKKyAgICAvLyBsaXN0IG9mIHN1cHBvcnRlZCByaW5naW5nIGNhbGxzCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q2FsbD4gbVJpbmdpbmdDYWxsczsKKworICAgIC8vIGxpc3Qgb2Ygc3VwcG9ydGVkIGJhY2tncm91bmQgY2FsbHMKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsPiBtQmFja2dyb3VuZENhbGxzOworCisgICAgLy8gbGlzdCBvZiBzdXBwb3J0ZWQgZm9yZWdyb3VuZCBjYWxscworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGw+IG1Gb3JlZ3JvdW5kQ2FsbHM7CisKKyAgICAvLyBzdGF0ZSByZWdpc3RyYW50cworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtUHJlY2lzZUNhbGxTdGF0ZVJlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtTmV3UmluZ2luZ0Nvbm5lY3Rpb25SZWdpc3RyYW50cworICAgID0gbmV3IFJlZ2lzdHJhbnRMaXN0KCk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVnaXN0cmFudExpc3QgbUluY29taW5nUmluZ1JlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtRGlzY29ubmVjdFJlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtU2VydmljZVN0YXRlUmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1NbWlDb21wbGV0ZVJlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtTW1pUmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1Vbmtub3duQ29ubmVjdGlvblJlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtU3VwcFNlcnZpY2VGYWlsZWRSZWdpc3RyYW50cworICAgID0gbmV3IFJlZ2lzdHJhbnRMaXN0KCk7CisKKyAgICBwcml2YXRlIENhbGxNYW5hZ2VyKCkgeworICAgICAgICBtUGhvbmVzID0gbmV3IEFycmF5TGlzdDxQaG9uZT4oKTsKKyAgICAgICAgbVJpbmdpbmdDYWxscyA9IG5ldyBBcnJheUxpc3Q8Q2FsbD4oKTsKKyAgICAgICAgbUJhY2tncm91bmRDYWxscyA9IG5ldyBBcnJheUxpc3Q8Q2FsbD4oKTsKKyAgICAgICAgbUZvcmVncm91bmRDYWxscyA9IG5ldyBBcnJheUxpc3Q8Q2FsbD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbGxNYW5hZ2VyCisgICAgICogQHJldHVybiBDYWxsTWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2FsbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBwaG9uZSB0byBDYWxsTWFuYWdlcgorICAgICAqIEBwYXJhbSBwaG9uZQorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclBob25lKFBob25lIHBob25lKSB7CisgICAgICAgIGlmIChwaG9uZSAhPSBudWxsICYmICFtUGhvbmVzLmNvbnRhaW5zKHBob25lKSkgeworICAgICAgICAgICAgbVBob25lcy5hZGQocGhvbmUpOworICAgICAgICAgICAgbVJpbmdpbmdDYWxscy5hZGQocGhvbmUuZ2V0UmluZ2luZ0NhbGwoKSk7CisgICAgICAgICAgICBtQmFja2dyb3VuZENhbGxzLmFkZChwaG9uZS5nZXRCYWNrZ3JvdW5kQ2FsbCgpKTsKKyAgICAgICAgICAgIG1Gb3JlZ3JvdW5kQ2FsbHMuYWRkKHBob25lLmdldEZvcmVncm91bmRDYWxsKCkpOworICAgICAgICAgICAgcmVnaXN0ZXJGb3JQaG9uZVN0YXRlcyhwaG9uZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5yZWdpc3RlciBwaG9uZSBmcm9tIENhbGxNYW5hZ2VyCisgICAgICogQHBhcmFtIHBob25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlclBob25lKFBob25lIHBob25lKSB7CisgICAgICAgIGlmIChwaG9uZSAhPSBudWxsICYmICFtUGhvbmVzLmNvbnRhaW5zKHBob25lKSkgeworICAgICAgICAgICAgbVBob25lcy5yZW1vdmUocGhvbmUpOworICAgICAgICAgICAgbVJpbmdpbmdDYWxscy5yZW1vdmUocGhvbmUuZ2V0UmluZ2luZ0NhbGwoKSk7CisgICAgICAgICAgICBtQmFja2dyb3VuZENhbGxzLnJlbW92ZShwaG9uZS5nZXRCYWNrZ3JvdW5kQ2FsbCgpKTsKKyAgICAgICAgICAgIG1Gb3JlZ3JvdW5kQ2FsbHMucmVtb3ZlKHBob25lLmdldEZvcmVncm91bmRDYWxsKCkpOworICAgICAgICAgICAgdW5yZWdpc3RlckZvclBob25lU3RhdGVzKHBob25lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvclBob25lU3RhdGVzKFBob25lIHBob25lKSB7CisgICAgICAgIHBob25lLnJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQobUhhbmRsZXIsIEVWRU5UX0NBTExfU1RBVEVfQ0hBTkdFRCwgbnVsbCk7CisgICAgICAgIHBob25lLnJlZ2lzdGVyRm9yRGlzY29ubmVjdChtSGFuZGxlciwgRVZFTlRfRElTQ09OTkVDVCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGb3JQaG9uZVN0YXRlcyhQaG9uZSBwaG9uZSkgeworICAgICAgICBwaG9uZS51bnJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQobUhhbmRsZXIpOworICAgICAgICBwaG9uZS51bnJlZ2lzdGVyRm9yRGlzY29ubmVjdChtSGFuZGxlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5zd2VycyBhIHJpbmdpbmcgb3Igd2FpdGluZyBjYWxsLgorICAgICAqCisgICAgICogQWN0aXZlIGNhbGwsIGlmIGFueSwgZ28gb24gaG9sZC4KKyAgICAgKiBJZiBhY3RpdmUgY2FsbCBjYW4ndCBiZSBoZWxkLCBpLmUuLCBhIGJhY2tncm91bmQgY2FsbCBvZiB0aGUgc2FtZSBjaGFubmVsIGV4aXN0cywKKyAgICAgKiB0aGUgYWN0aXZlIGNhbGwgd2lsbCBiZSBoYW5nIHVwLgorICAgICAqCisgICAgICogQW5zd2VyaW5nIG9jY3VycyBhc3luY2hyb25vdXNseSwgYW5kIGZpbmFsIG5vdGlmaWNhdGlvbiBvY2N1cnMgdmlhCisgICAgICoge0BsaW5rICNyZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKGFuZHJvaWQub3MuSGFuZGxlciwgaW50LAorICAgICAqIGphdmEubGFuZy5PYmplY3QpIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoKX0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiB3aGVuIGNhbGwgaXMgbm90IHJpbmdpbmcgb3Igd2FpdGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdENhbGwoQ2FsbCByaW5naW5nQ2FsbCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBob25lIHJpbmdpbmdQaG9uZSA9IHJpbmdpbmdDYWxsLmdldFBob25lKCk7CisKKyAgICAgICAgaWYgKCBoYXNBY3RpdmVGZ0NhbGwoKSApIHsKKyAgICAgICAgICAgIFBob25lIGFjdGl2ZVBob25lID0gZ2V0QWN0aXZlRmdDYWxsKCkuZ2V0UGhvbmUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzQmdDYWxsID0gYWN0aXZlUGhvbmUuZ2V0QmFja2dyb3VuZENhbGwoKS5pc0lkbGUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2FtZUNoYW5uZWwgPSAoYWN0aXZlUGhvbmUgPT0gcmluZ2luZ1Bob25lKTsKKworICAgICAgICAgICAgaWYgKHNhbWVDaGFubmVsICYmIGhhc0JnQ2FsbCkgeworICAgICAgICAgICAgICAgIGdldEFjdGl2ZUZnQ2FsbCgpLmhhbmd1cCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc2FtZUNoYW5uZWwgJiYgIWhhc0JnQ2FsbCkgeworICAgICAgICAgICAgICAgIGFjdGl2ZVBob25lLnN3aXRjaEhvbGRpbmdBbmRBY3RpdmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNhbWVDaGFubmVsICYmIGhhc0JnQ2FsbCkgeworICAgICAgICAgICAgICAgIGdldEFjdGl2ZUZnQ2FsbCgpLmhhbmd1cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmluZ2luZ1Bob25lLmFjY2VwdENhbGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWplY3QgKGlnbm9yZSkgYSByaW5naW5nIGNhbGwuIEluIEdTTSwgdGhpcyBtZWFucyBVRFVCCisgICAgICogKFVzZXIgRGV0ZXJtaW5lZCBVc2VyIEJ1c3kpLiBSZWplY3Qgb2NjdXJzIGFzeW5jaHJvbm91c2x5LAorICAgICAqIGFuZCBmaW5hbCBub3RpZmljYXRpb24gb2NjdXJzIHZpYQorICAgICAqIHtAbGluayAjcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChhbmRyb2lkLm9zLkhhbmRsZXIsIGludCwKKyAgICAgKiBqYXZhLmxhbmcuT2JqZWN0KSByZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKCl9LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDYWxsU3RhdGVFeGNlcHRpb24gd2hlbiBubyBjYWxsIGlzIHJpbmdpbmcgb3Igd2FpdGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlamVjdENhbGwoQ2FsbCByaW5naW5nQ2FsbCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBob25lIHJpbmdpbmdQaG9uZSA9IHJpbmdpbmdDYWxsLmdldFBob25lKCk7CisKKyAgICAgICAgcmluZ2luZ1Bob25lLnJlamVjdENhbGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQbGFjZXMgYW55IGFjdGl2ZSBjYWxscyBvbiBob2xkLCBhbmQgbWFrZXMgYW55IGhlbGQgY2FsbHMKKyAgICAgKiAgYWN0aXZlLiBTd2l0Y2ggb2NjdXJzIGFzeW5jaHJvbm91c2x5IGFuZCBtYXkgZmFpbC4KKyAgICAgKiBGaW5hbCBub3RpZmljYXRpb24gb2NjdXJzIHZpYQorICAgICAqIHtAbGluayAjcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChhbmRyb2lkLm9zLkhhbmRsZXIsIGludCwKKyAgICAgKiBqYXZhLmxhbmcuT2JqZWN0KSByZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKCl9LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDYWxsU3RhdGVFeGNlcHRpb24gaWYgYWN0aXZlIGNhbGwgaXMgcmluZ2luZywgd2FpdGluZywgb3IKKyAgICAgKiBkaWFsaW5nL2FsZXJ0aW5nLCBvciBoZWxkQ2FsbCBjYW4ndCBiZSBhY3RpdmUuCisgICAgICogSW4gdGhlc2UgY2FzZXMsIHRoaXMgb3BlcmF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN3aXRjaEhvbGRpbmdBbmRBY3RpdmUoQ2FsbCBoZWxkQ2FsbCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBob25lIGFjdGl2ZVBob25lID0gbnVsbDsKKyAgICAgICAgUGhvbmUgaGVsZFBob25lID0gbnVsbDsKKworICAgICAgICBpZiAoaGFzQWN0aXZlRmdDYWxsKCkpIHsKKyAgICAgICAgICAgIGFjdGl2ZVBob25lID0gZ2V0QWN0aXZlRmdDYWxsKCkuZ2V0UGhvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoZWxkQ2FsbCAhPSBudWxsKSB7CisgICAgICAgICAgICBoZWxkUGhvbmUgPSBoZWxkQ2FsbC5nZXRQaG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjdGl2ZVBob25lICE9IGhlbGRQaG9uZSkgeworICAgICAgICAgICAgYWN0aXZlUGhvbmUuc3dpdGNoSG9sZGluZ0FuZEFjdGl2ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaGVsZFBob25lLnN3aXRjaEhvbGRpbmdBbmRBY3RpdmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGhvbmUgY2FuIGNvbmZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgcGhvbmUKKyAgICAgKiBzdGF0ZS0tdGhhdCBpcywgb25lIGNhbGwgaG9sZGluZyBhbmQgb25lIGNhbGwgYWN0aXZlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGhvbmUgY2FuIGNvbmZlcmVuY2U7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5Db25mZXJlbmNlKENhbGwgaGVsZENhbGwpIHsKKyAgICAgICAgUGhvbmUgYWN0aXZlUGhvbmUgPSBudWxsOworICAgICAgICBQaG9uZSBoZWxkUGhvbmUgPSBudWxsOworCisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgYWN0aXZlUGhvbmUgPSBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlbGRDYWxsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhlbGRQaG9uZSA9IGhlbGRDYWxsLmdldFBob25lKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGhlbGRQaG9uZSA9PSBhY3RpdmVQaG9uZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmVyZW5jZXMgaG9sZGluZyBhbmQgYWN0aXZlLiBDb25mZXJlbmNlIG9jY3VycyBhc3luY2hyb25vdXNseQorICAgICAqIGFuZCBtYXkgZmFpbC4gRmluYWwgbm90aWZpY2F0aW9uIG9jY3VycyB2aWEKKyAgICAgKiB7QGxpbmsgI3JlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoYW5kcm9pZC5vcy5IYW5kbGVyLCBpbnQsCisgICAgICogamF2YS5sYW5nLk9iamVjdCkgcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZCgpfS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2FsbFN0YXRlRXhjZXB0aW9uIGlmIGNhbkNvbmZlcmVuY2UoKSB3b3VsZCByZXR1cm4gZmFsc2UuCisgICAgICogSW4gdGhlc2UgY2FzZXMsIHRoaXMgb3BlcmF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZlcmVuY2UoQ2FsbCBoZWxkQ2FsbCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYW5Db25mZXJlbmNlKGhlbGRDYWxsKSkKKyAgICAgICAgICAgIHRocm93KG5ldyBDYWxsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNvbmZlcmVuY2UgZm9yZWdyb3VuZCBhbmQgc2VsZWN0ZWQgYmFja2dyb3VuZCBjYWxsIikpOworCisgICAgICAgIGhlbGRDYWxsLmdldFBob25lKCkuY29uZmVyZW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgbmV3IHZvaWNlIGNvbm5lY3Rpb24uIFRoaXMgaGFwcGVucyBhc3luY2hyb25vdXNseSwgc28geW91CisgICAgICogY2Fubm90IGFzc3VtZSB0aGUgYXVkaW8gcGF0aCBpcyBjb25uZWN0ZWQgKG9yIGEgY2FsbCBpbmRleCBoYXMgYmVlbgorICAgICAqIGFzc2lnbmVkKSB1bnRpbCBQaG9uZVN0YXRlQ2hhbmdlZCBub3RpZmljYXRpb24gaGFzIG9jY3VycmVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDYWxsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgb3V0Z29pbmcgY2FsbCBpcyBub3QgY3VycmVudGx5CisgICAgICogcG9zc2libGUgYmVjYXVzZSBubyBtb3JlIGNhbGwgc2xvdHMgZXhpc3Qgb3IgYSBjYWxsIGV4aXN0cyB0aGF0IGlzCisgICAgICogZGlhbGluZywgYWxlcnRpbmcsIHJpbmdpbmcsIG9yIHdhaXRpbmcuICBPdGhlciBlcnJvcnMgYXJlCisgICAgICogaGFuZGxlZCBhc3luY2hyb25vdXNseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFBob25lIHBob25lLCBTdHJpbmcgZGlhbFN0cmluZykgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwaG9uZS5kaWFsKGRpYWxTdHJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgbmV3IHZvaWNlIGNvbm5lY3Rpb24uIFRoaXMgaGFwcGVucyBhc3luY2hyb25vdXNseSwgc28geW91CisgICAgICogY2Fubm90IGFzc3VtZSB0aGUgYXVkaW8gcGF0aCBpcyBjb25uZWN0ZWQgKG9yIGEgY2FsbCBpbmRleCBoYXMgYmVlbgorICAgICAqIGFzc2lnbmVkKSB1bnRpbCBQaG9uZVN0YXRlQ2hhbmdlZCBub3RpZmljYXRpb24gaGFzIG9jY3VycmVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDYWxsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgb3V0Z29pbmcgY2FsbCBpcyBub3QgY3VycmVudGx5CisgICAgICogcG9zc2libGUgYmVjYXVzZSBubyBtb3JlIGNhbGwgc2xvdHMgZXhpc3Qgb3IgYSBjYWxsIGV4aXN0cyB0aGF0IGlzCisgICAgICogZGlhbGluZywgYWxlcnRpbmcsIHJpbmdpbmcsIG9yIHdhaXRpbmcuICBPdGhlciBlcnJvcnMgYXJlCisgICAgICogaGFuZGxlZCBhc3luY2hyb25vdXNseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFBob25lIHBob25lLCBTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNJbmZvKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBob25lLmRpYWwoZGlhbFN0cmluZywgdXVzSW5mbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xlYXIgZGlzY29ubmVjdCBjb25uZWN0aW9uIGZvciBlYWNoIHBob25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGZvcihQaG9uZSBwaG9uZSA6IG1QaG9uZXMpIHsKKyAgICAgICAgICAgIHBob25lLmNsZWFyRGlzY29ubmVjdGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGhvbmUgY2FuIGRvIGV4cGxpY2l0IGNhbGwgdHJhbnNmZXIgaW4gdGhlIGN1cnJlbnQKKyAgICAgKiBwaG9uZSBzdGF0ZS0tdGhhdCBpcywgb25lIGNhbGwgaG9sZGluZyBhbmQgb25lIGNhbGwgYWN0aXZlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGhvbmUgY2FuIGRvIGV4cGxpY2l0IGNhbGwgdHJhbnNmZXI7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5UcmFuc2ZlcihDYWxsIGhlbGRDYWxsKSB7CisgICAgICAgIFBob25lIGFjdGl2ZVBob25lID0gbnVsbDsKKyAgICAgICAgUGhvbmUgaGVsZFBob25lID0gbnVsbDsKKworICAgICAgICBpZiAoaGFzQWN0aXZlRmdDYWxsKCkpIHsKKyAgICAgICAgICAgIGFjdGl2ZVBob25lID0gZ2V0QWN0aXZlRmdDYWxsKCkuZ2V0UGhvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoZWxkQ2FsbCAhPSBudWxsKSB7CisgICAgICAgICAgICBoZWxkUGhvbmUgPSBoZWxkQ2FsbC5nZXRQaG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChoZWxkUGhvbmUgPT0gYWN0aXZlUGhvbmUgJiYgYWN0aXZlUGhvbmUuY2FuVHJhbnNmZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIGhlbGQgY2FsbCBhbmQgYWN0aXZlIGNhbGwKKyAgICAgKiBEaXNjb25uZWN0cyB0aGUgc3Vic2NyaWJlciBmcm9tIGJvdGggY2FsbHMKKyAgICAgKgorICAgICAqIEV4cGxpY2l0IENhbGwgVHJhbnNmZXIgb2NjdXJzIGFzeW5jaHJvbm91c2x5CisgICAgICogYW5kIG1heSBmYWlsLiBGaW5hbCBub3RpZmljYXRpb24gb2NjdXJzIHZpYQorICAgICAqIHtAbGluayAjcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChhbmRyb2lkLm9zLkhhbmRsZXIsIGludCwKKyAgICAgKiBqYXZhLmxhbmcuT2JqZWN0KSByZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKCl9LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDYWxsU3RhdGVFeGNlcHRpb24gaWYgY2FuVHJhbnNmZXIoKSB3b3VsZCByZXR1cm4gZmFsc2UuCisgICAgICogSW4gdGhlc2UgY2FzZXMsIHRoaXMgb3BlcmF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyKENhbGwgaGVsZENhbGwpIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAoY2FuVHJhbnNmZXIoaGVsZENhbGwpKSB7CisgICAgICAgICAgICBoZWxkQ2FsbC5nZXRQaG9uZSgpLmV4cGxpY2l0Q2FsbFRyYW5zZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiByaW5naW5nIGNhbGxzCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdDxDYWxsPiBnZXRSaW5naW5nQ2FsbHMoKSB7CisgICAgICAgIHJldHVybiBtQmFja2dyb3VuZENhbGxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBiYWNrZ3JvdW5kIGNhbGxzCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdDxDYWxsPiBnZXRCYWNrZ3JvdW5kQ2FsbHMoKSB7CisgICAgICAgIHJldHVybiBtQmFja2dyb3VuZENhbGxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbm9uIGlkbGUgZm9yZWdyb3VuZCBjYWxsLAorICAgICAqIG5vdGU6IHRoZXJlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiBpc0FsaXZlIGFuZCBub24gaWRsZQorICAgICAqLworICAgIHB1YmxpYyBDYWxsIGdldEFjdGl2ZUZnQ2FsbCgpIHsKKyAgICAgICAgZm9yIChDYWxsIGNhbGwgOiBtRm9yZWdyb3VuZENhbGxzKSB7CisgICAgICAgICAgICBpZiAoY2FsbC5nZXRTdGF0ZSgpICE9IENhbGwuU3RhdGUuSURMRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgZmlyc3QgYWN0aXZlIGNhbGwgZnJvbSBhIGNhbGwgbGlzdAorICAgICAqLworICAgIHByaXZhdGUgIENhbGwgZ2V0Rmlyc3RBY3RpdmVDYWxsKEFycmF5TGlzdDxDYWxsPiBjYWxscykgeworICAgICAgICBmb3IgKENhbGwgY2FsbCA6IGNhbGxzKSB7CisgICAgICAgICAgICBpZiAoIWNhbGwuaXNJZGxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGZvcmVncm91bmQgY2FsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0FjdGl2ZUZnQ2FsbCgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRGaXJzdEFjdGl2ZUNhbGwobUZvcmVncm91bmRDYWxscykgIT0gbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBiYWNrZ3JvdW5kIGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBY3RpdmVCZ0NhbGwoKSB7CisgICAgICAgIHJldHVybiAoZ2V0Rmlyc3RBY3RpdmVDYWxsKG1CYWNrZ3JvdW5kQ2FsbHMpICE9IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhY3RpdmUgcmluZ2luZyBjYWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzQWN0aXZlUmluZ2luZ0NhbGwoKSB7CisgICAgICAgIHJldHVybiAoZ2V0Rmlyc3RBY3RpdmVDYWxsKG1SaW5naW5nQ2FsbHMpICE9IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIE1NSSBjb2RlcyB0aGF0IGFyZSBwZW5kaW5nIGZvciBhIHBob25lLiAoVGhleSBoYXZlIGluaXRpYXRlZAorICAgICAqIGJ1dCBoYXZlIG5vdCB5ZXQgY29tcGxldGVkKS4KKyAgICAgKiBQcmVzZW50bHkgdGhlcmUgaXMgb25seSBldmVyIG9uZS4KKyAgICAgKgorICAgICAqIFVzZSA8Y29kZT5yZWdpc3RlckZvck1taUluaXRpYXRlPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5yZWdpc3RlckZvck1taUNvbXBsZXRlPC9jb2RlPiBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgcGhvbmUgZG9lc24ndCBoYXZlIG9yIHN1cHBvcnQgbW1pIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgTW1pQ29kZT4gZ2V0UGVuZGluZ01taUNvZGVzKFBob25lIHBob25lKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIHVzZXIgcmVzcG9uc2UgdG8gYSBVU1NEIFJFUVVFU1QgbWVzc2FnZS4gIEFuIE1taUNvZGUgaW5zdGFuY2UKKyAgICAgKiByZXByZXNlbnRpbmcgdGhpcyByZXNwb25zZSBpcyBzZW50IHRvIGhhbmRsZXJzIHJlZ2lzdGVyZWQgd2l0aAorICAgICAqIHJlZ2lzdGVyRm9yTW1pSW5pdGlhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNzZE1lc3NnZSAgICBNZXNzYWdlIHRvIHNlbmQgaW4gdGhlIHJlc3BvbnNlLgorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgcGhvbmUgZG9lc24ndCBzdXBwb3J0IHVzc2Qgc2VydmljZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbmRVc3NkUmVzcG9uc2UoUGhvbmUgcGhvbmUsIFN0cmluZyB1c3NkTWVzc2dlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXRlcyBvciB1bm11dGVzIHRoZSBtaWNyb3Bob25lIGZvciB0aGUgYWN0aXZlIGNhbGwuIFRoZSBtaWNyb3Bob25lCisgICAgICogaXMgYXV0b21hdGljYWxseSB1bm11dGVkIGlmIGEgY2FsbCBpcyBhbnN3ZXJlZCwgZGlhbGVkLCBvciByZXN1bWVkCisgICAgICogZnJvbSBhIGhvbGRpbmcgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXV0ZWQgdHJ1ZSB0byBtdXRlIHRoZSBtaWNyb3Bob25lLAorICAgICAqIGZhbHNlIHRvIGFjdGl2YXRlIHRoZSBtaWNyb3Bob25lLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0TXV0ZShib29sZWFuIG11dGVkKSB7CisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgZ2V0QWN0aXZlRmdDYWxsKCkuZ2V0UGhvbmUoKS5zZXRNdXRlKG11dGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgY3VycmVudCBtdXRlIHN0YXR1cy4gVXNlCisgICAgICoge0BsaW5rICNyZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKGFuZHJvaWQub3MuSGFuZGxlciwgaW50LAorICAgICAqIGphdmEubGFuZy5PYmplY3QpIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoKX0KKyAgICAgKiBhcyBhIGNoYW5nZSBub3RpZmNhdGlvbiwgYWx0aG91Z2ggcHJlc2VudGx5IHBob25lIHN0YXRlIGNoYW5nZWQgaXMgbm90CisgICAgICogZmlyZWQgd2hlbiBzZXRNdXRlKCkgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlzIG11dGluZywgZmFsc2UgaXMgdW5tdXRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNdXRlKCkgeworICAgICAgICBpZiAoaGFzQWN0aXZlRmdDYWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpLmdldE11dGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGxheSBhIERUTUYgdG9uZSBvbiB0aGUgYWN0aXZlIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBzaG91bGQgYmUgb25lIG9mIDAtOSwgJyonIG9yICcjJy4gT3RoZXIgdmFsdWVzIHdpbGwgYmUKKyAgICAgKiBzaWxlbnRseSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgbm8gYWN0aXZlIGNhbGwgb3IgdGhlIGFjdGl2ZSBjYWxsIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgZHRtZiB0b25lCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VuZER0bWYoY2hhciBjKSB7CisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgZ2V0QWN0aXZlRmdDYWxsKCkuZ2V0UGhvbmUoKS5zZW5kRHRtZihjKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0byBwYWx5IGEgRFRNRiB0b25lIG9uIHRoZSBhY3RpdmUgY2FsbC4KKyAgICAgKiBvciB0aGVyZSBpcyBhIHBsYXlpbmcgRFRNRiB0b25lLgorICAgICAqIEBwYXJhbSBjIHNob3VsZCBiZSBvbmUgb2YgMC05LCAnKicgb3IgJyMnLiBPdGhlciB2YWx1ZXMgd2lsbCBiZQorICAgICAqIHNpbGVudGx5IGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIG5vIGFjdGl2ZSBjYWxsIG9yIHRoZSBhY3RpdmUgY2FsbCBkb2Vzbid0IHN1cHBvcnQKKyAgICAgKiAgICAgICAgIGR0bWYgdG9uZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0RHRtZihjaGFyIGMpIHsKKyAgICAgICAgaWYgKGhhc0FjdGl2ZUZnQ2FsbCgpKSB7CisgICAgICAgICAgICBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpLnNlbmREdG1mKGMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIHBsYXlpbmcgRFRNRiB0b25lLiBJZ25vcmVkIGlmIHRoZXJlIGlzIG5vIHBsYXlpbmcgRFRNRgorICAgICAqIHRvbmUgb3Igbm8gYWN0aXZlIGNhbGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcER0bWYoUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgcGhvbmUuc3RvcER0bWYoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZW5kIGJ1cnN0IERUTUYgdG9uZSwgaXQgY2FuIHNlbmQgdGhlIHN0cmluZyBhcyBzaW5nbGUgY2hhcmFjdGVyIG9yIG11bHRpcGxlIGNoYXJhY3RlcgorICAgICAqIGlnbm9yZSBpZiB0aGVyZSBpcyBubyBhY3RpdmUgY2FsbCBvciBub3QgdmFsaWQgZGlnaXRzIHN0cmluZy4KKyAgICAgKiBWYWxpZCBkaWdpdCBtZWFucyBvbmx5IGluY2x1ZGVzIGNoYXJhY3RlcnMgSVNPLUxBVElOIGNoYXJhY3RlcnMgMC05LCAqLCAjCisgICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzZW5kRHRtZiBhbmQgc2VuZEJ1cnN0RHRtZiBpcyBzZW5kRHRtZiBvbmx5IHNlbmRzIG9uZSBjaGFyYWN0ZXIsCisgICAgICogdGhpcyBhcGkgY2FuIHNlbmQgc2luZ2xlIGNoYXJhY3RlciBhbmQgbXVsdGlwbGUgY2hhcmFjdGVyLCBhbHNvLCB0aGlzIGFwaSBoYXMgcmVzcG9uc2UKKyAgICAgKiBiYWNrIHRvIGNhbGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdG1mU3RyaW5nIGlzIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRpYWxpbmcgZGlnaXQocykgaW4gdGhlIGFjdGl2ZSBjYWxsCisgICAgICogQHBhcmFtIG9uIHRoZSBEVE1GIE9OIGxlbmd0aCBpbiBtaWxsaXNlY29uZHMsIG9yIDAgZm9yIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gb2ZmIHRoZSBEVE1GIE9GRiBsZW5ndGggaW4gbWlsbGlzZWNvbmRzLCBvciAwIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIG9uQ29tcGxldGUgaXMgdGhlIGNhbGxiYWNrIG1lc3NhZ2Ugd2hlbiB0aGUgYWN0aW9uIGlzIHByb2Nlc3NlZCBieSBCUAorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VuZEJ1cnN0RHRtZihQaG9uZSBwaG9uZSwgU3RyaW5nIGR0bWZTdHJpbmcsIGludCBvbiwgaW50IG9mZiwgTWVzc2FnZSBvbkNvbXBsZXRlKSB7CisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgZ2V0QWN0aXZlRmdDYWxsKCkuZ2V0UGhvbmUoKS5zZW5kQnVyc3REdG1mKGR0bWZTdHJpbmcsIG9uLCBvZmYsIG9uQ29tcGxldGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGhhcyBkaXNjb25uZWN0ZWQsIGVpdGhlciBkdWUgdG8gbG9jYWwKKyAgICAgKiBvciByZW1vdGUgaGFuZ3VwIG9yIGVycm9yLgorICAgICAqCisgICAgICogIE1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhpcyB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOjxwPgorICAgICAqICA8dWw+PGxpPk1lc3NhZ2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQ8L2xpPgorICAgICAqICA8bGk+QXN5bmNSZXN1bHQudXNlck9iaiA9IG9iajwvbGk+CisgICAgICogIDxsaT5Bc3luY1Jlc3VsdC5yZXN1bHQgPSBhIENvbm5lY3Rpb24gb2JqZWN0IHRoYXQgaXMKKyAgICAgKiAgbm8gbG9uZ2VyIGNvbm5lY3RlZC48L2xpPjwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JEaXNjb25uZWN0KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgbURpc2Nvbm5lY3RSZWdpc3RyYW50cy5hZGRVbmlxdWUoaCwgd2hhdCwgb2JqKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3Igdm9pY2UgZGlzY29ubmVjdGlvbiBub3RpZmljYXRpb24uCisgICAgICogRXh0cmFuZW91cyBjYWxscyBhcmUgdG9sZXJhdGVkIHNpbGVudGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckRpc2Nvbm5lY3QoSGFuZGxlciBoKXsKKyAgICAgICAgbURpc2Nvbm5lY3RSZWdpc3RyYW50cy5yZW1vdmUoaCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIGdldHRpbmcgbm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlIGluIHRoZSBDYWxsIFN0YXRlIHtAbGluayBDYWxsLlN0YXRlfQorICAgICAqIFRoaXMgaXMgY2FsbGVkIFByZWNpc2VDYWxsU3RhdGUgYmVjYXVzZSB0aGUgY2FsbCBzdGF0ZSBpcyBtb3JlIHByZWNpc2UgdGhhbiB0aGUKKyAgICAgKiB7QGxpbmsgUGhvbmUuU3RhdGV9IHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUge0BsaW5rIFBob25lU3RhdGVMaXN0ZW5lcn0KKyAgICAgKgorICAgICAqIFJlc3VsdGluZyBldmVudHMgd2lsbCBoYXZlIGFuIEFzeW5jUmVzdWx0IGluIDxjb2RlPk1lc3NhZ2Uub2JqPC9jb2RlPi4KKyAgICAgKiBBc3luY1Jlc3VsdC51c2VyRGF0YSB3aWxsIGJlIHNldCB0byB0aGUgb2JqIGFyZ3VtZW50IGhlcmUuCisgICAgICogVGhlIDxlbT5oPC9lbT4gcGFyYW1ldGVyIGlzIGhlbGQgb25seSBieSBhIHdlYWsgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7CisgICAgICAgIG1QcmVjaXNlQ2FsbFN0YXRlUmVnaXN0cmFudHMuYWRkVW5pcXVlKGgsIHdoYXQsIG9iaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIHZvaWNlIGNhbGwgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCisgICAgICogRXh0cmFuZW91cyBjYWxscyBhcmUgdG9sZXJhdGVkIHNpbGVudGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChIYW5kbGVyIGgpeworICAgICAgICBtUHJlY2lzZUNhbGxTdGF0ZVJlZ2lzdHJhbnRzLnJlbW92ZShoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB3aGVuIGEgcHJldmlvdXNseSB1bnRyYWNrZWQgbm9uLXJpbmdpbmcvd2FpdGluZyBjb25uZWN0aW9uIGhhcyBhcHBlYXJlZC4KKyAgICAgKiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gc29tZSBvdGhlciBlbnRpdHkgKGVnLCBTSU0gY2FyZCBhcHBsaWNhdGlvbikgaW5pdGlhdGluZyBhIGNhbGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JVbmtub3duQ29ubmVjdGlvbihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3IgdW5rbm93biBjb25uZWN0aW9uIG5vdGlmaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclVua25vd25Db25uZWN0aW9uKEhhbmRsZXIgaCl7fQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB3aGVuIGEgbmV3IHJpbmdpbmcgb3Igd2FpdGluZyBjb25uZWN0aW9uIGhhcyBhcHBlYXJlZC48cD4KKyAgICAgKgorICAgICAqICBNZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoaXM6CisgICAgICogIE1lc3NhZ2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKKyAgICAgKiAgQXN5bmNSZXN1bHQudXNlck9iaiA9IG9iagorICAgICAqICBBc3luY1Jlc3VsdC5yZXN1bHQgPSBhIENvbm5lY3Rpb24uIDxwPgorICAgICAqICBQbGVhc2UgY2hlY2sgQ29ubmVjdGlvbi5pc1JpbmdpbmcoKSB0byBtYWtlIHN1cmUgdGhlIENvbm5lY3Rpb24KKyAgICAgKiAgaGFzIG5vdCBkcm9wcGVkIHNpbmNlIHRoaXMgbWVzc2FnZSB3YXMgcG9zdGVkLgorICAgICAqICBJZiBDb25uZWN0aW9uLmlzUmluZ2luZygpIGlzIHRydWUsIHRoZW4KKyAgICAgKiAgIENvbm5lY3Rpb24uZ2V0Q2FsbCgpID09IFBob25lLmdldFJpbmdpbmdDYWxsKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvck5ld1JpbmdpbmdDb25uZWN0aW9uKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciBuZXcgcmluZ2luZyBjb25uZWN0aW9uIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JOZXdSaW5naW5nQ29ubmVjdGlvbihIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHdoZW4gYW4gaW5jb21pbmcgY2FsbCByaW5ncy48cD4KKyAgICAgKgorICAgICAqICBNZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoaXM6CisgICAgICogIE1lc3NhZ2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKKyAgICAgKiAgQXN5bmNSZXN1bHQudXNlck9iaiA9IG9iagorICAgICAqICBBc3luY1Jlc3VsdC5yZXN1bHQgPSBhIENvbm5lY3Rpb24uIDxwPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9ySW5jb21pbmdSaW5nKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciByaW5nIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JJbmNvbWluZ1JpbmcoSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB3aGVuIG91dC1iYW5kIHJpbmdiYWNrIHRvbmUgaXMgbmVlZGVkLjxwPgorICAgICAqCisgICAgICogIE1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhpczoKKyAgICAgKiAgTWVzc2FnZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAorICAgICAqICBBc3luY1Jlc3VsdC51c2VyT2JqID0gb2JqCisgICAgICogIEFzeW5jUmVzdWx0LnJlc3VsdCA9IGJvb2xlYW4sIHRydWUgdG8gc3RhcnQgcGxheSByaW5nYmFjayB0b25lCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBmYWxzZSB0byBzdG9wLiA8cD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclJpbmdiYWNrVG9uZShIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3IgcmluZ2JhY2sgdG9uZSBub3RpZmljYXRpb24uCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yUmluZ2JhY2tUb25lKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIHRoZSBoYW5kbGVyIHRvIHJlc2V0IHRoZSB1cGxpbmsgbXV0ZSBzdGF0ZSB0byBnZXQKKyAgICAgKiB1cGxpbmsgYXVkaW8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JSZXNlbmRJbmNhbGxNdXRlKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciByZXNlbmQgaW5jYWxsIG11dGUgbm90aWZpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yUmVzZW5kSW5jYWxsTXV0ZShIYW5kbGVyIGgpe30KKworCisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBpbml0aWF0aW9uIG9mIGEgbmV3IE1NSSBjb2RlIHJlcXVlc3QuCisgICAgICogTU1JIGNvZGVzIGZvciBHU00gYXJlIGRpc2N1c3NlZCBpbiAzR1BQIFRTIDIyLjAzMC48cD4KKyAgICAgKgorICAgICAqIEV4YW1wbGU6IElmIFBob25lLmRpYWwgaXMgY2FsbGVkIHdpdGggIiojMzEjIiwgdGhlbiB0aGUgYXBwIHdpbGwKKyAgICAgKiBiZSBub3RpZmllZCBoZXJlLjxwPgorICAgICAqCisgICAgICogVGhlIHJldHVybmVkIDxjb2RlPk1lc3NhZ2Uub2JqPC9jb2RlPiB3aWxsIGNvbnRhaW4gYW4gQXN5bmNSZXN1bHQuCisgICAgICoKKyAgICAgKiA8Y29kZT5vYmoucmVzdWx0PC9jb2RlPiB3aWxsIGJlIGFuICJNbWlDb2RlIiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JNbWlJbml0aWF0ZShIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3IgbmV3IE1NSSBpbml0aWF0ZSBub3RpZmljYXRpb24uCisgICAgICogRXh0cmFuZW91cyBjYWxscyBhcmUgdG9sZXJhdGVkIHNpbGVudGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck1taUluaXRpYXRlKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgdGhhdCBhbiBNTUkgcmVxdWVzdCBoYXMgY29tcGxldGVkCisgICAgICogaXRzIG5ldHdvcmsgYWN0aXZpdHkgYW5kIGlzIGluIGl0cyBmaW5hbCBzdGF0ZS4gVGhpcyBtYXkgbWVhbiBhIHN0YXRlCisgICAgICogb2YgQ09NUExFVEUsIEZBSUxFRCwgb3IgQ0FOQ0VMTEVELgorICAgICAqCisgICAgICogPGNvZGU+TWVzc2FnZS5vYmo8L2NvZGU+IHdpbGwgY29udGFpbiBhbiBBc3luY1Jlc3VsdC4KKyAgICAgKiA8Y29kZT5vYmoucmVzdWx0PC9jb2RlPiB3aWxsIGJlIGFuICJNbWlDb2RlIiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvck1taUNvbXBsZXRlKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciBNTUkgY29tcGxldGUgbm90aWZpY2F0aW9uLgorICAgICAqIEV4dHJhbmVvdXMgY2FsbHMgYXJlIHRvbGVyYXRlZCBzaWxlbnRseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JNbWlDb21wbGV0ZShIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIFJlZ2lzdHJhdGlvbiBwb2ludCBmb3IgRWNtIHRpbWVyIHJlc2V0CisgICAgICogQHBhcmFtIGggaGFuZGxlciB0byBub3RpZnkKKyAgICAgKiBAcGFyYW0gd2hhdCB1c2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlCisgICAgICogQHBhcmFtIG9iaiBwbGFjZWQgaW4gTWVzc2FnZS5vYmoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckVjbVRpbWVyUmVzZXQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIGZvciBFY20gdGltZXIgcmVzZXQKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cmFudCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JFY21UaW1lclJlc2V0KEhhbmRsZXIgaCl7fQorCisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBTZXJ2aWNlU3RhdGUgY2hhbmdlZC4KKyAgICAgKiBNZXNzYWdlLm9iaiB3aWxsIGNvbnRhaW4gYW4gQXN5bmNSZXN1bHQuCisgICAgICogQXN5bmNSZXN1bHQucmVzdWx0IHdpbGwgYmUgYSBTZXJ2aWNlU3RhdGUgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclNlcnZpY2VTdGF0ZUNoYW5nZWQoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIFNlcnZpY2VTdGF0ZUNoYW5nZSBub3RpZmljYXRpb24uCisgICAgICogRXh0cmFuZW91cyBjYWxscyBhcmUgdG9sZXJhdGVkIHNpbGVudGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclNlcnZpY2VTdGF0ZUNoYW5nZWQoSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3IgU3VwcGxlbWVudGFyeSBTZXJ2aWNlIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgbmV0d29yay4KKyAgICAgKiBNZXNzYWdlLm9iaiB3aWxsIGNvbnRhaW4gYW4gQXN5bmNSZXN1bHQuCisgICAgICogQXN5bmNSZXN1bHQucmVzdWx0IHdpbGwgYmUgYSBTdXBwU2VydmljZU5vdGlmaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHdoYXQgVXNlci1kZWZpbmVkIG1lc3NhZ2UgY29kZS4KKyAgICAgKiBAcGFyYW0gb2JqIFVzZXIgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU3VwcFNlcnZpY2VOb3RpZmljYXRpb24oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIFN1cHBsZW1lbnRhcnkgU2VydmljZSBub3RpZmljYXRpb25zLgorICAgICAqIEV4dHJhbmVvdXMgY2FsbHMgYXJlIHRvbGVyYXRlZCBzaWxlbnRseQorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJhbnQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU3VwcFNlcnZpY2VOb3RpZmljYXRpb24oSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIGEgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIGF0dGVtcHQgZmFpbHMuCisgICAgICogTWVzc2FnZS5vYmogd2lsbCBjb250YWluIGFuIEFzeW5jUmVzdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgorICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JTdXBwU2VydmljZUZhaWxlZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gYSBzdXBwbGVtZW50YXJ5IHNlcnZpY2UgYXR0ZW1wdCBmYWlscy4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkKKyAgICAgKgorICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyYW50IGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclN1cHBTZXJ2aWNlRmFpbGVkKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBhIHNJbkNhbGwgVm9pY2VQcml2YWN5IGlzIGVuYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHdoYXQgVXNlci1kZWZpbmVkIG1lc3NhZ2UgY29kZS4KKyAgICAgKiBAcGFyYW0gb2JqIFVzZXIgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9ySW5DYWxsVm9pY2VQcml2YWN5T24oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5lZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gYSBzSW5DYWxsIFZvaWNlUHJpdmFjeSBpcyBlbmFibGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cmFudCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPbihIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gYSBzSW5DYWxsIFZvaWNlUHJpdmFjeSBpcyBkaXNhYmxlZAorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgorICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPZmYoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5lZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gYSBzSW5DYWxsIFZvaWNlUHJpdmFjeSBpcyBkaXNhYmxlZAorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJhbnQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9ySW5DYWxsVm9pY2VQcml2YWN5T2ZmKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBDRE1BIE9UQSBQcm92aXNpb24gc3RhdHVzIGNoYW5nZQorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgorICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JDZG1hT3RhU3RhdHVzQ2hhbmdlKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVuZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIENETUEgT1RBIFByb3Zpc2lvbiBzdGF0dXMgY2hhbmdlCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJhbnQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yQ2RtYU90YVN0YXR1c0NoYW5nZShIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIFJlZ2lzdHJhdGlvbiBwb2ludCBmb3Igc3Vic2NyaXB0aW9uIGluZm8gcmVhZHkKKyAgICAgKiBAcGFyYW0gaCBoYW5kbGVyIHRvIG5vdGlmeQorICAgICAqIEBwYXJhbSB3aGF0IHdoYXQgY29kZSBvZiBtZXNzYWdlIHdoZW4gZGVsaXZlcmVkCisgICAgICogQHBhcmFtIG9iaiBwbGFjZWQgaW4gTWVzc2FnZS5vYmoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclN1YnNjcmlwdGlvbkluZm9SZWFkeShIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIGZvciBzdWJzY3JpcHRpb24gaW5mbworICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyYW50IGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclN1YnNjcmlwdGlvbkluZm9SZWFkeShIYW5kbGVyIGgpe30KKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBtRGlzY29ubmVjdFJlZ2lzdHJhbnRzLm5vdGlmeVJlZ2lzdHJhbnRzKChBc3luY1Jlc3VsdCkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfQ0FMTF9TVEFURV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBtUHJlY2lzZUNhbGxTdGF0ZVJlZ2lzdHJhbnRzLm5vdGlmeVJlZ2lzdHJhbnRzKChBc3luY1Jlc3VsdCkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCmluZGV4IDhlMDNjNWEuLjVmMjdlM2YgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZHNJbnRlcmZhY2UgewogICAgIGVudW0gUmFkaW9TdGF0ZSB7Ci0gICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWN0bHkgcG93ZXJlZCBvZmYgKGVnIENGVU49MCkgKi8KLSAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlZywgcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCisgICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWNpdGx5IHBvd2VyZWQgb2ZmIChlLmcuIENGVU49MCkgKi8KKyAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlLmcuIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLwogICAgICAgICBTSU1fTk9UX1JFQURZLCAgICAgLyogUmFkaW8gaXMgb24sIGJ1dCB0aGUgU0lNIGludGVyZmFjZSBpcyBub3QgcmVhZHkgKi8KICAgICAgICAgU0lNX0xPQ0tFRF9PUl9BQlNFTlQsICAvKiBTSU0gUElOIGxvY2tlZCwgUFVLIHJlcXVpcmVkLCBuZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxpemF0aW9uLCBvciBTSU0gYWJzZW50ICovCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAvLyBTZWUgMjcuMDA3ICtDQ0ZDIG9yICtDTENLCiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX05PTkUgICAgID0gMDsgLy8gbm8gdXNlciBpbnB1dAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19WT0lDRSAgICA9ICgxIDw8IDApOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBICAgICA9ICgxIDw8IDEpOyAvL3N5bm95bSBmb3IgMTYrMzIrNjQrMTI4CisgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub255bSBmb3IgMTYrMzIrNjQrMTI4CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0ZBWCAgICAgID0gKDEgPDwgMik7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1NNUyAgICAgID0gKDEgPDwgMyk7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEFfU1lOQyA9ICgxIDw8IDQpOwpAQCAtOTUyLDE5ICs5NTIsMTkgQEAKICAgICB2b2lkIHdyaXRlU21zVG9SdWltKGludCBzdGF0dXMsIFN0cmluZyBwZHUsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gYXBuCiAgICAgICogQHBhcmFtIHVzZXIKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgc2V0dXBEZWZhdWx0UERQKFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gY2lkCiAgICAgICogQHBhcmFtIHJlc3BvbnNlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgdm9pZCBzZXRSYWRpb1Bvd2VyKGJvb2xlYW4gb24sIE1lc3NhZ2UgcmVzcG9uc2UpOwpAQCAtOTc0LDcgKzk3NCw3IEBACiAgICAgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ0NkbWFTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgY2F1c2UsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogcGFyYW1ldGVycyBlcXVpdmlsaWVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCisgICAgICogcGFyYW1ldGVycyBlcXVpdmFsZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKICAgICAgKiByZXNwb25zZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAogICAgICAqIHJlc3BvbnNlLm9iai51c2VyT2JqIHdpbGwgYmUgYSBJY2NJb1Jlc3VsdCBvbiBzdWNjZXNzCiAgICAgICovCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCiAgICAgLyoqCiAgICAgICogKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0IHdpbGwgYmUgYW4gSW50ZWdlciByZXByZXNlbnRpbmcKLSAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VyaXZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKKyAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VydmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQogICAgICAqCiAgICAgICogQHBhcmFtIGZhY2lsaXR5IG9uZSBvZiBDQl9GQUNJTFRZXyoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBlbmFibGUvZGlzYWJsZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHdoZW4KLSAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGVpb24gKGxhYyBhbmQvb3IgY2lkKSBoYXMgY2hhbmdlZC4KKyAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZSB0cnVlIHRvIGVuYWJsZSwgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEBwYXJhbSByZXNwb25zZSBjYWxsYmFjayBtZXNzYWdlCkBAIC0xMTgzLDcgKzExODMsNyBAQAogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRvIHRoZSB2ZW5kb3IgcmlsIHRoYXQgU3RrU2VydmljZSBpcyBydW5uaW5nCi0gICAgICogcmFuZCBpcyBlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgorICAgICAqIGFuZCBpcyByZWFkeSB0byByZWNlaXZlIFJJTF9VTlNPTF9TVEtfWFhYWCBjb21tYW5kcy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IDNiOWU2Y2MuLmU3MWZlMmUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTE4OCw3ICsxODgsMTAgQEAKICAgICAvKiogQ0lEIG9mIGFjdGl2ZSBkYXRhIGNvbm5lY3Rpb24gKi8KICAgICBwcm90ZWN0ZWQgaW50IGNpZEFjdGl2ZTsKIAotICAgLyoqCisgICAgLyoqIGluZGljYXRpb24gb2Ygb3VyIGF2YWlsYWJpbGl0eSAocHJlY29uZGl0aW9ucyB0byB0cnlzZXR1cERhdGEgYXJlIG1ldCkgKiovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUF2YWlsYWJpbGl0eSA9IGZhbHNlOworCisgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQ29ubmVjdGlvblRyYWNrZXIoUGhvbmVCYXNlIHBob25lKSB7CkBAIC00MjEsNyArNDI0LDg0IEBACiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0ZShTdGF0ZSBzKTsKIAotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VuYWJsZWQoaW50IGlkKSB7CisgICAgLy8gdGVsbCBhbGwgYWN0aXZlIGFwbnMgb2YgdGhlIGN1cnJlbnQgY29uZGl0aW9uCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgeworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW2lkXSkgeworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KHJlYXNvbik7CisgICAgfQorCisgICAgLy8gYSBuZXcgQVBOIGhhcyBnb25lIGFjdGl2ZSBhbmQgbmVlZHMgdG8gc2VuZCBldmVudHMgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWRVcFRvQ3VycmVudChTdHJpbmcgcmVhc29uLCBpbnQgYXBuSWQpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgY2FzZSBJTklUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShhcG5JZCksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzaW5jZSB3ZSBub3JtYWxseSBkb24ndCBzZW5kIGluZm8gdG8gYSBkaXNjb25uZWN0ZWQgQVBOLCB3ZSBuZWVkIHRvIGRvIHRoaXMgc3BlY2lhbGx5CisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgLy8gZGlzYWJsZWQgYXBuJ3Mgc3RpbGwgbmVlZCBhdmFpbC91bmF2YWlsIG5vdGlmaWNpYXRpb25zIC0gc2VuZCB0aGVtIG91dAorICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uLCBib29sZWFuIGF2YWlsYWJpbGl0eSkgeworICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSA9PSBhdmFpbGFiaWxpdHkpIHJldHVybjsKKyAgICAgICAgbUF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTsKKyAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IEFQTl9OVU1fVFlQRVM7IGlkKyspIHsKKyAgICAgICAgICAgIGlmICghaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQocmVhc29uLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZSBoYWQgYW4gYXZhaWxhYmlsaXR5IGNoYW5nZSAtIHRlbGwgdGhlIGxpc3RlbmVycworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoU3RyaW5nIHJlYXNvbikgeworICAgICAgICAvLyBub3RlIHRoYXQgd2UgZWl0aGVyIGp1c3QgdHVybmVkIGFsbCBvZmYgYmVjYXVzZSB3ZSBsb3N0IGF2YWlsYWJpbGl0eQorICAgICAgICAvLyBvciBhbGwgd2VyZSBvZmYgYW5kIGNvdWxkIG5vdyBnbyBvbiwgc28gb25seSBoYXZlIG9mZiBhcG5zIHRvIHdvcnJ5IGFib3V0CisgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGlzRGF0YVBvc3NpYmxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvbmx5IGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggd2UgcmVwb3J0IHRoYXQgZGF0YSBjb25uZWN0aXZpdHkgaXMgbm90CisgICAgICogcG9zc2libGUgYXJlCisgICAgICogPHVsPgorICAgICAqIDxsaT5EYXRhIGlzIGRpc2FsbG93ZWQgKHJvYW1pbmcsIHBvd2VyIHN0YXRlLCB2b2ljZSBjYWxsLCBldGMpLjwvbGk+CisgICAgICogPGxpPlRoZSBjdXJyZW50IGRhdGEgc3RhdGUgaXMge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZm9yIGEgcmVhc29uIG90aGVyIHRoYW4KKyAgICAgKiBoYXZpbmcgZXhwbGljaXRseSBkaXNhYmxlZCBjb25uZWN0aXZpdHkuIEluIG90aGVyIHdvcmRzLCBkYXRhIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBiZWNhdXNlIHRoZSBwaG9uZSBpcyBvdXQgb2YgY292ZXJhZ2Ugb3Igc29tZSBsaWtlIHJlYXNvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YVBvc3NpYmxlKCkgeworICAgICAgICBib29sZWFuIHBvc3NpYmxlID0gKGlzRGF0YUFsbG93ZWQoKSAmJgorICAgICAgICAgICAgIShnZXREYXRhRW5hYmxlZCgpICYmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQgfHwgc3RhdGUgPT0gU3RhdGUuSURMRSkpKTsKKyAgICAgICAgaWYgKCFwb3NzaWJsZSAmJiBEQkcgJiYgaXNEYXRhQWxsb3dlZCgpKSB7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IHBvc3NpYmxlLiAgTm8gY292ZXJhZ2U6IGRhdGFTdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc3NpYmxlOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzQXBuVHlwZUVuYWJsZWQoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGlzQXBuSWRFbmFibGVkKGFwblR5cGVUb0lkKGFwblR5cGUpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBcG5JZEVuYWJsZWQoaW50IGlkKSB7CiAgICAgICAgIGlmIChpZCAhPSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIGRhdGFFbmFibGVkW2lkXTsKICAgICAgICAgfQpAQCAtNDQ0LDIyICs1MjQsMjEgQEAKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiK3R5cGUrIiksIGlzQXBuVHlwZUFjdGl2ZSA9ICIKLSAgICAgICAgICAgICAgICArIGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSArICIgYW5kIHN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImVuYWJsZUFwblR5cGUoIiArIHR5cGUgKyAiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgorICAgICAgICAgICAgICAgICAgICArIGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSArICIsIGlzQXBuSWRFbmFibGVkID0iICsgaXNBcG5JZEVuYWJsZWQoaWQpICsKKyAgICAgICAgICAgICAgICAgICAgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc0FwblR5cGVBdmFpbGFibGUodHlwZSkpIHsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJ0eXBlIG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOwogICAgICAgICB9CiAKLSAgICAgICAgLy8ganVzdCBiZWNhdXNlIGl0J3MgYWN0aXZlIGRvZXNuJ3QgbWVhbiB3ZSBoYWQgaXQgZXhwbGljaXRseSByZXF1ZXN0ZWQgYmVmb3JlCi0gICAgICAgIC8vIChhIGJyb2FkIGRlZmF1bHQgbWF5IGhhbmRsZSBtYW55IHR5cGVzKS4gIG1ha2Ugc3VyZSB3ZSBtYXJrIGl0IGVuYWJsZWQKLSAgICAgICAgLy8gc28gaWYgdGhlIGRlZmF1bHQgaXMgZGlzYWJsZWQgd2Uga2VlcCB0aGUgY29ubmVjdGlvbiBmb3Igb3RoZXJzCi0gICAgICAgIHNldEVuYWJsZWQoaWQsIHRydWUpOwotCi0gICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUodHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JTklUSU5HKSByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgcmV0dXJuIFBob25lLkFQTl9BTFJFQURZX0FDVElWRTsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9BTFJFQURZX0FDVElWRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVuYWJsZWQoaWQsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgIH0KQEAgLTQ3OCw3ICs1NTcsNyBAQAogICAgICAgICBpZiAoaWQgPT0gQVBOX0lOVkFMSURfSUQpIHsKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzRW5hYmxlZChpZCkpIHsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgewogICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0pIHsKQEAgLTQ5NSw5ICs1NzQsMTAgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZChpbnQgaWQsIGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJzZXRFbmFibGVkKCIgKyBpZCArICIsICIgKyBlbmFibGUgKyAiKSB3aXRoIG9sZCBzdGF0ZSA9ICIgKwotICAgICAgICAgICAgICAgIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOwotCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJzZXRFbmFibGVkKCIgKyBpZCArICIsICIgKyBlbmFibGUgKyAiKSB3aXRoIG9sZCBzdGF0ZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkYXRhRW5hYmxlZFtpZF0gKyAiIGFuZCBlbmFibGVkQ291bnQgPSAiICsgZW5hYmxlZENvdW50KTsKKyAgICAgICAgfQogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfRU5BQkxFX05FV19BUE4pOwogICAgICAgICBtc2cuYXJnMSA9IGlkOwogICAgICAgICBtc2cuYXJnMiA9IChlbmFibGUgPyBFTkFCTEVEIDogRElTQUJMRUQpOwpAQCAtNTA3LDkgKzU4Nyw4IEBACiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG9uRW5hYmxlQXBuKGludCBhcG5JZCwgaW50IGVuYWJsZWQpIHsKICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkVWRU5UX0FQTl9FTkFCTEVfUkVRVUVTVCAiICsgYXBuSWQgKyAiLCAiICsgZW5hYmxlZCk7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArCi0gICAgICAgICAgICAgICAgICAgICIsIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQgKwotICAgICAgICAgICAgICAgICAgICAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiBkYXRhRW5hYmxlZCA9ICIgKyBkYXRhRW5hYmxlZFthcG5JZF0gKyAiLCBlbmFibGVkQ291bnQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgZW5hYmxlZENvdW50ICsgIiwgaXNBcG5UeXBlQWN0aXZlID0gIiArIGlzQXBuVHlwZUFjdGl2ZShhcG5JZFRvVHlwZShhcG5JZCkpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZW5hYmxlZCA9PSBFTkFCTEVEKSB7CiAgICAgICAgICAgICBpZiAoIWRhdGFFbmFibGVkW2FwbklkXSkgewpAQCAtNTIwLDYgKzU5OSw4IEBACiAgICAgICAgICAgICBpZiAoIWlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewogICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRBcG5UeXBlID0gdHlwZTsKICAgICAgICAgICAgICAgICBvbkVuYWJsZU5ld0FwbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFBob25lLlJFQVNPTl9BUE5fU1dJVENIRUQsIGFwbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRpc2FibGUKQEAgLTUyOCw4ICs2MDksMTcgQEAKICAgICAgICAgICAgICAgICBlbmFibGVkQ291bnQtLTsKICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZENvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgb25DbGVhblVwQ29ubmVjdGlvbih0cnVlLCBQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0gPT0gdHJ1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIGRpc2Nvbm5lY3QgbXNnIG1hbnVhbGx5LCBzaW5jZSB0aGUgbm9ybWFsIHJvdXRlIHdvbnQgc2VuZAorICAgICAgICAgICAgICAgIC8vIGl0IChpdCdzIG5vdCBlbmFibGVkKQorICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVELCBhcG5JZCk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIGFuIHVnbHkgd2F5IHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29ubiAtIHNob3VsZCBiZSBkb25lCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGEgcmVhbCBjb250ZW50aW9uIG1hbmFnZXIgYW5kIHBvbGljeSB0aGF0IGRpc2Nvbm5lY3RzIHRoZSBsb3dlciBwcmkKKyAgICAgICAgICAgICAgICAgICAgLy8gc3R1ZmYgYXMgZW5hYmxlIHJlcXVlc3RzIGNvbWUgaW4gYW5kIHBvcHMgdGhlbSBiYWNrIG9uIGFzIHdlIGRpc2FibGUgYmFjaworICAgICAgICAgICAgICAgICAgICAvLyBkb3duIHRvIHRoZSBsb3dlciBwcmkgc3R1ZmYKICAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUOwogICAgICAgICAgICAgICAgICAgICBvbkVuYWJsZU5ld0FwbigpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3NCw3ICs2NjQsNyBAQAogICAgICAgICAgICAgICAgIG9uVHJ5U2V0dXBEYXRhKFBob25lLlJFQVNPTl9EQVRBX0VOQUJMRUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDRkYTRiNmEuLjA2NDYxMDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCkBAIC05MiwxNCArOTIsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoYXBuVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb05vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvLyB1c2UgYXBuVHlwZSBhcyB0aGUga2V5IHRvIHdoaWNoIGNvbm5lY3Rpb24gd2UncmUgdGFsa2luZyBhYm91dC4KKyAgICAgICAgLy8gcGFzcyBhcG5UeXBlIGJhY2sgdXAgdG8gZmV0Y2ggcGFydGljdWxhciBmb3IgdGhpcyBvbmUuCiAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255ID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSwgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG5UeXBlcygpLAorICAgICAgICAgICAgICAgICAgICBhcG5UeXBlLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0SW50ZXJmYWNlTmFtZShudWxsKSwKICAgICAgICAgICAgICAgICAgICAgKCh0ZWxlcGhvbnkhPW51bGwpID8gdGVsZXBob255LmdldE5ldHdvcmtUeXBlKCkgOgogICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSk7CkBAIC0xMDgsOSArMTIxLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24pOworICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhCmluZGV4IGViZGQyMjAuLjc1ZWExMTYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhCkBAIC0xNiwxNCArMTYsMTMgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjaGFyYWN0ZXIgc2V0IG1hcHBpbmcgYmV0d2VlbgotICogdGhlIEdTTSBTTVMgNy1iaXQgYWxwaGFiZXQgc3BlY2lmZWQgaW4gVFMgMjMuMDM4IDYuMi4xCisgKiB0aGUgR1NNIFNNUyA3LWJpdCBhbHBoYWJldCBzcGVjaWZpZWQgaW4gVFMgMjMuMDM4IDYuMi4xCiAgKiBhbmQgVVRGLTE2CiAgKgogICoge0BoaWRlfQpAQCAtMTcxLDcgKzE3MCw3IEBACiAgICAgICogYXJyYXkgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIDI1NSBzZXB0ZXRzLgogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGEgVGhlIHRleHQgc3RyaW5nIHRvIGVuY29kZS4KLSAgICAgKiBAcGFyYW0gaGVhZGVyIE9wdGlvbmFsIGhlYWRlciAoaW5jbHVkZWluZyBsZW5ndGggYnl0ZSkgdGhhdCBwcmVjZWRlcworICAgICAqIEBwYXJhbSBoZWFkZXIgT3B0aW9uYWwgaGVhZGVyIChpbmNsdWRpbmcgbGVuZ3RoIGJ5dGUpIHRoYXQgcHJlY2VkZXMKICAgICAgKiB0aGUgZW5jb2RlZCBkYXRhLCBwYWRkZWQgdG8gc2VwdGV0IGJvdW5kYXJ5LgogICAgICAqIEByZXR1cm4gQnl0ZSBhcnJheSBjb250YWluaW5nIGhlYWRlciBhbmQgZW5jb2RlZCBkYXRhLgogICAgICAqLwpAQCAtMjA0LDcgKzIwMyw3IEBACiAgICAgICogdGhlIHBhY2tlZCBzZXB0ZXRzLiBUaGUgcmV0dXJuZWQgYXJyYXkgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIDI1NQogICAgICAqIHNlcHRldHMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBzdHJpbmcgdG8gZW5kY29kZQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmNvZGUKICAgICAgKiBAdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBpZiBTdHJpbmcgaXMgdG9vIGxhcmdlIHRvIGVuY29kZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHN0cmluZ1RvR3NtN0JpdFBhY2tlZChTdHJpbmcgZGF0YSkKQEAgLTIyMyw3ICsyMjIsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIHRleHQgdG8gY29udmVydCB0byBzZXB0ZXRzCiAgICAgICogQHBhcmFtIHN0YXJ0aW5nU2VwdGV0T2Zmc2V0IHRoZSBudW1iZXIgb2YgcGFkZGluZyBzZXB0ZXRzIHRvIHB1dCBiZWZvcmUKLSAgICAgKiAgdGhlIGNoYXJhY3RlciBkYXRhIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYXJyYXkKKyAgICAgKiAgdGhlIGNoYXJhY3RlciBkYXRhIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5CiAgICAgICogQHBhcmFtIHRocm93RXhjZXB0aW9uIElmIHRydWUsIHRocm93cyBFbmNvZGVFeGNlcHRpb24gb24gaW52YWxpZCBjaGFyLgogICAgICAqICAgSWYgZmFsc2UsIHJlcGxhY2VzIHVuZW5jb2RhYmxlIGNoYXIgd2l0aCBHU00gYWxwaGFiZXQgc3BhY2UgY2hhci4KICAgICAgKgpAQCAtMjU3LDcgKzI1Niw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFjayBhIDctYml0IGNoYXIgaW50byBpdHMgYXBwcm9waXJhdGUgcGxhY2UgaW4gYSBieXRlIGFycmF5CisgICAgICogUGFjayBhIDctYml0IGNoYXIgaW50byBpdHMgYXBwcm9wcmlhdGUgcGxhY2UgaW4gYSBieXRlIGFycmF5CiAgICAgICoKICAgICAgKiBAcGFyYW0gYml0T2Zmc2V0IHRoZSBiaXQgb2Zmc2V0IHRoYXQgdGhlIHNlcHRldCBzaG91bGQgYmUgcGFja2VkIGF0CiAgICAgICogICAgICAgICAgICAgICAgICAoc2VwdGV0IGluZGV4ICogNykKQEAgLTMyMCw3ICszMTksNyBAQAogCiAgICAgICAgICAgICAgICAgZ3NtVmFsID0gKDB4N2YgJiAocGR1W29mZnNldCArIGJ5dGVPZmZzZXRdID4+IHNoaWZ0KSk7CiAKLSAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZHJ5CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgY3Jvc3NlcyBhIGJ5dGUgYm91bmRhcnkKICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBtc2IgYml0cyB0byAwCiAgICAgICAgICAgICAgICAgICAgIGdzbVZhbCAmPSAweDdmID4+IChzaGlmdCAtIDEpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKaW5kZXggMjMyODcxNy4uN2ExNTg3YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCkBAIC0yMzksOSArMjM5LDExIEBACiAgICAgU3RyaW5nIGdldENkbWFFcmlUZXh0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ0RNQSBwcm92aXNpb25pbmcgbmVlZHMgdG8gcnVuLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgc2VydmljZSBwcm92aXNpb25pbmcgbmVlZHMgdG8gcnVuLgorICAgICAqIE9ubHkgcmVsZXZhbnQgb24gc29tZSB0ZWNobm9sb2dpZXMsIG90aGVycyB3aWxsIGFsd2F5cworICAgICAqIHJldHVybiBmYWxzZS4KICAgICAgKi8KLSAgICBib29sZWFuIGdldENkbWFOZWVkc1Byb3Zpc2lvbmluZygpOworICAgIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CiAKICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdW5yZWFkIGNvdW50IG9mIHZvaWNlbWFpbHMKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAppbmRleCA1YmY4ZTU4Li43OWMyYjQwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCkBAIC0zMiw3ICszMiw3IEBACiAgICAgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoYm9vbGVhbiBjZmkpOwogICAgIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KGludCBzdGF0ZSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihpbnQgc3RhdGUsIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBpbiBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBuZXR3b3JrVHlwZSk7Ci0gICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKTsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IG5ldHdvcmtUeXBlKTsKKyAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKICAgICB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbihpbiBCdW5kbGUgY2VsbExvY2F0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDhhNWE2YWUuLjVmZWY2ZGUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtNTcsNyArNTcsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0UG9ydCB0aGUgcG9ydCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC05NCw3ICs5NCw3IEBACiAgICAgICogIHRoZSBjdXJyZW50IGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KICAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfTlVMTF9QRFU8L2NvZGU+LgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKaW5kZXggOTU3ZWRkZC4uMDA1YWUzNyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKQEAgLTI2Nyw5ICsyNjcsMTEgQEAKIAogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgYSBieXRlIGFycmF5IGludG8gYSBTdHJpbmcgaGV4aWRlY2ltYWwgY2hhcmFjdGVycworICAgICAqIENvbnZlcnRzIGEgYnl0ZSBhcnJheSBpbnRvIGEgU3RyaW5nIG9mIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMuCiAgICAgICoKLSAgICAgKiBudWxsIHJldHVybnMgbnVsbAorICAgICAqIEBwYXJhbSBieXRlcyBhbiBhcnJheSBvZiBieXRlcworICAgICAqCisgICAgICogQHJldHVybiBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJ5dGVzIGFycmF5CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKICAgICBieXRlc1RvSGV4U3RyaW5nKGJ5dGVbXSBieXRlcykgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQppbmRleCAyMzMyNWY2Li43MDI5MDMxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQpAQCAtOTksNyArOTksNyBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfTkFNRV9LRVkgPSAicGhvbmVOYW1lIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0tFWSA9ICJyZWFzb24iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkgPSAicmVhc29uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX1RZUEVTX0tFWSA9ICJhcG5UeXBlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX1RZUEVfS0VZID0gImFwblR5cGUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fS0VZID0gImFwbiI7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfSUZBQ0VfTkFNRV9LRVkgPSAiaWZhY2UiOwpAQCAtMjQxLDEzICsyNDEsMjEgQEAKICAgICBDZWxsTG9jYXRpb24gZ2V0Q2VsbExvY2F0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCi0gICAgICogaW50ZXJmYWNlIC0tIHVzZQorICAgICAqIEdldCB0aGUgY3VycmVudCBmb3IgdGhlIGRlZmF1bHQgYXBuIERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbgorICAgICAqIGV4aXN0cyBhdCB0aGlzIGludGVyZmFjZSAtLSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyfSBpbnN0ZWFkLgogICAgICAqLwogICAgIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCisgICAgICogaW50ZXJmYWNlIC0tIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXJ9IGluc3RlYWQuCisgICAgICogQHBhcmFtIGFwblR5cGUgc3BlY2lmeSBmb3Igd2hpY2ggYXBuIHRvIGdldCBjb25uZWN0aW9uIHN0YXRlIGluZm8uCisgICAgICovCisgICAgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpOworCisgICAgLyoqCiAgICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFBY3Rpdml0eVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCiAgICAgICogaW50ZXJmYWNlIC0tIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyfSBpbnN0ZWFkLgpAQCAtMTUzMyw2ICsxNTQxLDExIEBACiAgICAgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisKKyAgICAvKioKICAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIENETUEgY2FsbCB3YWl0aW5nIGNvbWVzCiAgICAgICoKICAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCmluZGV4IDc0NjAxZTYuLmNmODA2OTEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKQEAgLTczNyw4ICs3MzcsMTMgQEAKICAgICAgICAgbU5vdGlmaWVyLm5vdGlmeU1lc3NhZ2VXYWl0aW5nQ2hhbmdlZCh0aGlzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBob25lTmFtZSgpOwpAQCAtODI0LDkgKzgyOSwxOSBAQAogICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoInVucmVnaXN0ZXJGb3JTdWJzY3JpcHRpb25JbmZvUmVhZHkiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVyIGlzIGFuIE9UQVNQIG51bWJlci4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCiAgICAgcHVibGljICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpIHsKLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2xhc3MgQ0RNQVBob25lLiBOb3QgaW1wbGVtZW50ZWQgaW4gR1NNUGhvbmUuCi0gICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgiaXNPdGFTcE51bWJlciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC05NTIsNiArOTY3LDEwIEBACiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZGlzYWJsZUFwblR5cGUodHlwZSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7CisgICAgICAgIHJldHVybiAoKG1EYXRhQ29ubmVjdGlvbiAhPSBudWxsKSAmJiAobURhdGFDb25uZWN0aW9uLmlzRGF0YVBvc3NpYmxlKCkpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBzaW11bGF0ZURhdGFDb25uZWN0aW9uCiAgICAgICoKQEAgLTk4MCw3ICs5OTksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbURhdGFDb25uZWN0aW9uLnNldFN0YXRlKGRjU3RhdGUpOwotICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDI2LDQgKzEwNDUsOCBAQAogICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IhICIgKyBuYW1lICsgIigpIGluIFBob25lQmFzZSBzaG91bGQgbm90IGJlICIgKwogICAgICAgICAgICAgICAgICJjYWxsZWQsIENETUFQaG9uZSBpbmFjdGl2ZS4iKTsKICAgICB9CisKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBnZXREYXRhQ29ubmVjdGlvblN0YXRlKEFQTl9UWVBFX0RFRkFVTFQpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCmluZGV4IGU5NmVlYWUuLjY5MTI3MWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQpAQCAtMzMsOSArMzMsMTIgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChQaG9uZSBzZW5kZXIpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSk7CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQppbmRleCBlMTUxMWU2Li5mYjJhOTM4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKQEAgLTE3Miw3ICsxNzIsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CkBAIC03NjQsNiArNzY4LDEwIEBACiAgICAgICAgIG1BY3RpdmVQaG9uZS5leGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cil7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNPdGFTcE51bWJlcihkaWFsU3RyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggMjgzM2Q1Ni4uZjFkMjQ4OCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQpAQCAtMjg1LDkgKzI4NSw4IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIC8vKioqKiogSGFuZGxlciBpbXBsZW1lbWVudGF0aW9uCi0KLSAgICAgICAgcHVibGljIHZvaWQKKyAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZAogICAgICAgICBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJyID0gKFJJTFJlcXVlc3QpKG1zZy5vYmopOwogICAgICAgICAgICAgUklMUmVxdWVzdCByZXEgPSBudWxsOwpAQCAtNzgwLDcgKzc3OSw3IEBACiAgICAgICAgIHNlbmQocnIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkCisgICAgQERlcHJlY2F0ZWQgcHVibGljIHZvaWQKICAgICBnZXRQRFBDb250ZXh0TGlzdChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBnZXREYXRhQ2FsbExpc3QocmVzdWx0KTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBjYTUyNmE1Li45ZTE3ZWIxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAgICAgcHJpdmF0ZSBTbXNDb3VudGVyIG1Db3VudGVyOwogCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbVNUcmFja2VycyA9IG5ldyBBcnJheUxpc3QoTU9fTVNHX1FVRVVFX0xJTUlUKTsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTbXNUcmFja2VyPiBtU1RyYWNrZXJzID0gbmV3IEFycmF5TGlzdDxTbXNUcmFja2VyPihNT19NU0dfUVVFVUVfTElNSVQpOwogCiAgICAgLyoqIFdha2UgbG9jayB0byBlbnN1cmUgZGV2aWNlIHN0YXlzIGF3YWtlIHdoaWxlIGRpc3BhdGNoaW5nIHRoZSBTTVMgaW50ZW50LiAqLwogICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1XYWtlTG9jazsKQEAgLTI2NSw2ICsyNjUsNyBAQAogICAgICAgICBtQ20udW5yZWdpc3RlckZvck9uKHRoaXMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICBMb2cuZChUQUcsICJTTVNEaXNwYXRjaGVyIGZpbmFsaXplZCIpOwogICAgIH0KQEAgLTM0NSw3ICszNDYsNyBAQAogICAgICAgICAgICAgbXNnLm9iaiA9IG51bGw7CiAgICAgICAgICAgICBpZiAobVNUcmFja2Vycy5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTbXNUcmFja2VyIHNUcmFja2VyID0gKFNtc1RyYWNrZXIpbVNUcmFja2Vycy5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSBtU1RyYWNrZXJzLnJlbW92ZSgwKTsKICAgICAgICAgICAgICAgICAgICAgc1RyYWNrZXIubVNlbnRJbnRlbnQuc2VuZChSRVNVTFRfRVJST1JfTElNSVRfRVhDRUVERUQpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGVkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImZhaWxlZCB0byBzZW5kIGJhY2sgUkVTVUxUX0VSUk9SX0xJTUlUX0VYQ0VFREVEIik7CkBAIC0zNTgsNyArMzU5LDcgQEAKIAogICAgICAgICBjYXNlIEVWRU5UX1NFTkRfQ09ORklSTUVEX1NNUzoKICAgICAgICAgICAgIGlmIChtU1RyYWNrZXJzLmlzRW1wdHkoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSAoU21zVHJhY2tlciltU1RyYWNrZXJzLnJlbW92ZShtU1RyYWNrZXJzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSBtU1RyYWNrZXJzLnJlbW92ZShtU1RyYWNrZXJzLnNpemUoKSAtIDEpOwogICAgICAgICAgICAgICAgIGlmIChpc011bHRpcGFydFRyYWNrZXIoc1RyYWNrZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRNdWx0aXBhcnRTbXMoc1RyYWNrZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zNzIsNyArMzczLDcgQEAKICAgICAgICAgICAgIGlmIChtU1RyYWNrZXJzLmlzRW1wdHkoKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbGF0ZXN0IG9uZS4KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTbXNUcmFja2VyIHNUcmFja2VyID0gKFNtc1RyYWNrZXIpbVNUcmFja2Vycy5yZW1vdmUobVNUcmFja2Vycy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IG1TVHJhY2tlcnMucmVtb3ZlKG1TVHJhY2tlcnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgIHNUcmFja2VyLm1TZW50SW50ZW50LnNlbmQoUkVTVUxUX0VSUk9SX0xJTUlUX0VYQ0VFREVEKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChDYW5jZWxlZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJmYWlsZWQgdG8gc2VuZCBiYWNrIFJFU1VMVF9FUlJPUl9MSU1JVF9FWENFRURFRCIpOwpAQCAtNjc5LDcgKzY4MCw3IEBACiAgICAgICogQHBhcmFtIGRlc3RQb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCiAgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgpAQCAtNjg5LDcgKzY5MCw3IEBACiAgICAgICogIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtNzA2LDcgKzcwNyw3IEBACiAgICAgICogIHRoZSBjdXJyZW50IGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KICAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CkBAIC03NDIsNyArNzQzLDcgQEAKICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfTlVMTF9QRFU8L2NvZGU+LgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKQEAgLTc1OCwxNyArNzU5LDE3IEBACiAgICAgICogU2VuZCBhIFNNUwogICAgICAqCiAgICAgICogQHBhcmFtIHNtc2MgdGhlIFNNU0MgdG8gc2VuZCB0aGUgbWVzc2FnZSB0aHJvdWdoLCBvciBOVUxMIGZvciB0aGUKLSAgICAgKiAgZGVmYXR1bHQgU01TQworICAgICAqICBkZWZhdWx0IFNNU0MKICAgICAgKiBAcGFyYW0gcGR1IHRoZSByYXcgUERVIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPkludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9OVUxMX1BEVTwvY29kZT4uCiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPkludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTkzNywxNCArOTM4LDE0IEBACiAgICAgICovCiAgICAgc3RhdGljIHByb3RlY3RlZCBjbGFzcyBTbXNUcmFja2VyIHsKICAgICAgICAgLy8gZmllbGRzIG5lZWQgdG8gYmUgcHVibGljIGZvciBkZXJpdmVkIFNtc0Rpc3BhdGNoZXJzCi0gICAgICAgIHB1YmxpYyBIYXNoTWFwIG1EYXRhOworICAgICAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbURhdGE7CiAgICAgICAgIHB1YmxpYyBpbnQgbVJldHJ5Q291bnQ7CiAgICAgICAgIHB1YmxpYyBpbnQgbU1lc3NhZ2VSZWY7CiAKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbVNlbnRJbnRlbnQ7CiAgICAgICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IG1EZWxpdmVyeUludGVudDsKIAotICAgICAgICBTbXNUcmFja2VyKEhhc2hNYXAgZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAorICAgICAgICBTbXNUcmFja2VyKEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwKICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgICAgICBtRGF0YSA9IGRhdGE7CiAgICAgICAgICAgICBtU2VudEludGVudCA9IHNlbnRJbnRlbnQ7CkBAIC05NTMsNyArOTU0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBTbXNUcmFja2VyIFNtc1RyYWNrZXJGYWN0b3J5KEhhc2hNYXAgZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAorICAgIHByb3RlY3RlZCBTbXNUcmFja2VyIFNtc1RyYWNrZXJGYWN0b3J5KEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTbXNUcmFja2VyKGRhdGEsIHNlbnRJbnRlbnQsIGRlbGl2ZXJ5SW50ZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKaW5kZXggNzg3MmVlYy4uN2E2NTE2MiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU21zSGVhZGVyIHsKIAotICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YXN0cnVjdHVyZSBpcyBnZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMKKyAgICAvLyBUT0RPKGNsZWFudXApOiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcwogICAgIC8vIHRoZSAndXNlciBkYXRhIGhlYWRlcicgb3IgVURILCBhbmQgc28gdGhlIGNsYXNzIG5hbWUgc2hvdWxkCiAgICAgLy8gY2hhbmdlIHRvIHJlZmxlY3QgdGhpcy4uLgogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zTWVzc2FnZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCmluZGV4IGFmNmM1ZjguLmNiZDg2MDYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTM2NiwxMyArMzY1LDEzIEBACiAgICAgLyoqCiAgICAgICogVHJ5IHRvIHBhcnNlIHRoaXMgbWVzc2FnZSBhcyBhbiBlbWFpbCBnYXRld2F5IG1lc3NhZ2UKICAgICAgKiBUaGVyZSBhcmUgdHdvIHdheXMgc3BlY2lmaWVkIGluIFRTIDIzLjA0MCBTZWN0aW9uIDMuOCA6Ci0gICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBpbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAorICAgICAqICAtIFNNUyBtZXNzYWdlICJtYXkgaGF2ZSBpdHMgVFAtUElEIHNldCBmb3IgSW50ZXJuZXQgZWxlY3Ryb25pYyBtYWlsIC0gTVQKICAgICAgKiBTTVMgZm9ybWF0OiBbPGZyb20tYWRkcmVzcz48c3BhY2U+XTxtZXNzYWdlPiAtICJEZXBlbmRpbmcgb24gdGhlCiAgICAgICogbmF0dXJlIG9mIHRoZSBnYXRld2F5LCB0aGUgZGVzdGluYXRpb24vb3JpZ2luYXRpb24gYWRkcmVzcyBpcyBlaXRoZXIKICAgICAgKiBkZXJpdmVkIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIFNNUyBUUC1PQSBvciBUUC1EQSBmaWVsZCwgb3IgdGhlCiAgICAgICogVFAtT0EvVFAtREEgZmllbGQgY29udGFpbnMgYSBnZW5lcmljIGdhdGV3YXkgYWRkcmVzcyBhbmQgdGhlIHRvL2Zyb20KICAgICAgKiBhZGRyZXNzIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgYXMgc2hvd24gYWJvdmUuIiAod2hpY2ggaXMgc3VwcG9ydGVkIGhlcmUpCi0gICAgICogLSBNdWx0aXBsZSBhZGRyZXNlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCisgICAgICogLSBNdWx0aXBsZSBhZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbm8gc3BhY2VzLCBTdWJqZWN0IGZpZWxkIGRlbGltaXRlZAogICAgICAqIGJ5ICcoKScgb3IgJyMjJyBhbmQgJyMnIFNlY3Rpb24gOS4yLjMuMjQuMTEgKHdoaWNoIGFyZSBOT1Qgc3VwcG9ydGVkIGhlcmUpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEVtYWlsQWRkcmVzc0Zyb21NZXNzYWdlQm9keSgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCmluZGV4IGExMTM3ODcuLjEzNmQ1YjEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAqICBDRE1BIG5ldHdvcmtzLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLm9wZXJhdG9yLmFscGhhIjsKLSAgICAvL1RPRE86IG1vc3Qgb2YgdGhlc2UgcHJvcHJpZXRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQorICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBnZW5lcmljLCBzdWJzdGl0dXRlIGdzbS4gd2l0aCBwaG9uZS4gYnVnIDE4NTY5NTkKIAogICAgIC8qKiBOdW1lcmljIG5hbWUgKE1DQytNTkMpIG9mIGN1cnJlbnQgcmVnaXN0ZXJlZCBvcGVyYXRvci48cD4KICAgICAgKiAgQXZhaWxhYmlsaXR5OiB3aGVuIHJlZ2lzdGVyZWQgdG8gYSBuZXR3b3JrLiBSZXN1bHQgbWF5IGJlIHVucmVsaWFibGUgb24KQEAgLTgzLDEyICs4MywxMiBAQAogCiAgICAgLyoqIFRoZSBNQ0MrTU5DIChtb2JpbGUgY291bnRyeSBjb2RlK21vYmlsZSBuZXR3b3JrIGNvZGUpIG9mIHRoZQogICAgICAqICBwcm92aWRlciBvZiB0aGUgU0lNLiA1IG9yIDYgZGVjaW1hbCBkaWdpdHMuCi0gICAgICogIEF2YWlsYWJsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCisgICAgICogIEF2YWlsYWJpbGl0eTogU0lNIHN0YXRlIG11c3QgYmUgIlJFQURZIgogICAgICAqLwogICAgIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfSUNDX09QRVJBVE9SX05VTUVSSUMgPSAiZ3NtLnNpbS5vcGVyYXRvci5udW1lcmljIjsKIAogICAgIC8qKiBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgaXMgYWxzbyBrbm93biBhcyB0aGUgU1BOLCBvciBTZXJ2aWNlIFByb3ZpZGVyIE5hbWUuCi0gICAgICogIEF2YWlsYWJsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCisgICAgICogIEF2YWlsYWJpbGl0eTogU0lNIHN0YXRlIG11c3QgYmUgIlJFQURZIgogICAgICAqLwogICAgIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfSUNDX09QRVJBVE9SX0FMUEhBID0gImdzbS5zaW0ub3BlcmF0b3IuYWxwaGEiOwogCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcubXVsdGlwbGUiOwogCiAgICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBtaWxsaS1zZWNvbmRzIGJldHdlZW4gQ0FMTF9SSU5HIG5vdGlmaWNhdGlvbnMuCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NBTExfUklOR19ERUxBWSA9ICJyby50ZWxlcGhvbnkuY2FsbF9yaW5nLmRlbGF5IjsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQppbmRleCAwYzU5MWU0Li40NGM2NWY3IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQpAQCAtNTA0LDE0ICs1MDQsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gbm9EYXRhID0gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuICFub0RhdGEgJiYgZ2V0SWNjQ2FyZCgpLmdldFN0YXRlKCkgPT0gSWNjQ2FyZC5TdGF0ZS5SRUFEWSAmJgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VTdGF0ZSgpLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKLSAgICAgICAgICAgICAgICAobURhdGFDb25uZWN0aW9uLmdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgfHwgIWdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTU1JIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBhbmQgbm90aWZpZXMgcmVnaXN0cmFudHMgdGhhdAogICAgICAqIGl0IGlzIGNvbXBsZXRlLgpAQCAtNjAyLDcgKzU5NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIERhdGFTdGF0ZSByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtU1NUID09IG51bGwpIHsKQEAgLTYxNCw2ICs2MDYsOCBAQAogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtRGF0YUNvbm5lY3Rpb24uaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uLmdldFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUxFRDoKQEAgLTg2NywyNiArODYxLDYgQEAKICAgICAgICAgbVJ1aW1SZWNvcmRzLnNldFZvaWNlTWVzc2FnZVdhaXRpbmcoMSwgbXdpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ0RNQSBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbgotICAgIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKLSAgICAgICAgU3RyaW5nIGNkbWFNaW4gPSBnZXRDZG1hTWluKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7Ci0gICAgICAgIGlmIChjZG1hTWluID09IG51bGwgfHwgKGNkbWFNaW4ubGVuZ3RoKCkgPCA2KSkgewotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogaWxsZWdhbCBjZG1hTWluPSciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNkbWFNaW4gKyAiJyBhc3N1bWUgcHJvdmlzaW9uaW5nIG5lZWRlZC4iKTsKLSAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gKGNkbWFNaW4uZXF1YWxzKFVOQUNUSVZBVEVEX01JTl9WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgY2RtYU1pbi5zdWJzdHJpbmcoMCw2KS5lcXVhbHMoVU5BQ1RJVkFURURfTUlOMl9WQUxVRSkpCi0gICAgICAgICAgICAgICAgICAgIHx8IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigidGVzdF9jZG1hX3NldHVwIiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc6IHJldD0iICsgbmVlZHNQcm92aXNpb25pbmcpOwotICAgICAgICByZXR1cm4gbmVlZHNQcm92aXNpb25pbmc7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhpdEVtZXJnZW5jeUNhbGxiYWNrTW9kZSgpIHsKICAgICAgICAgaWYgKG1XYWtlTG9jay5pc0hlbGQoKSkgewpAQCAtMTE4MCw2ICsxMTU0LDI2IEBACiAgICAgICAgIG1TTVMuc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgU3RyaW5nIGNkbWFNaW4gPSBnZXRDZG1hTWluKCk7CisgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CisgICAgICAgIGlmIChjZG1hTWluID09IG51bGwgfHwgKGNkbWFNaW4ubGVuZ3RoKCkgPCA2KSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogaWxsZWdhbCBjZG1hTWluPSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNkbWFNaW4gKyAiJyBhc3N1bWUgcHJvdmlzaW9uaW5nIG5lZWRlZC4iKTsKKyAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gKGNkbWFNaW4uZXF1YWxzKFVOQUNUSVZBVEVEX01JTl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgfHwgY2RtYU1pbi5zdWJzdHJpbmcoMCw2KS5lcXVhbHMoVU5BQ1RJVkFURURfTUlOMl9WQUxVRSkpCisgICAgICAgICAgICAgICAgICAgIHx8IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigidGVzdF9jZG1hX3NldHVwIiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc6IHJldD0iICsgbmVlZHNQcm92aXNpb25pbmcpOworICAgICAgICByZXR1cm4gbmVlZHNQcm92aXNpb25pbmc7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTNjgzQV9GRUFUVVJFX0NPREUgPSAiKjIyOCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTNjgzQV9GRUFUVVJFX0NPREVfTlVNX0RJR0lUUyA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTNjgzQV9TWVNfU0VMX0NPREVfTlVNX0RJR0lUUyA9IDI7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggOWYyYTQ0Yi4uYmQxMDNkNCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMzA1LDkgKzMwNSw0MCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwotICAgICAgICByZXR1cm4gZ2V0QW55RGF0YUVuYWJsZWQoKSAmJiAoIXJvYW1pbmcgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYgbU1hc3RlckRhdGFFbmFibGVkOworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7CisgICAgICAgIGludCBwc1N0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICBib29sZWFuIHJvYW1pbmcgPSAocGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmICFnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOworCisgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IChwc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICYmCisgICAgICAgICAgICAgICAgKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgPT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSB8fAorICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpICYmCisgICAgICAgICAgICAgICAgKG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSB8fAorICAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUpICYmCisgICAgICAgICAgICAgICAgIXJvYW1pbmcgJiYKKyAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICBkZXNpcmVkUG93ZXJTdGF0ZSAmJgorICAgICAgICAgICAgICAgICFtUGVuZGluZ1Jlc3RhcnRSYWRpbyAmJgorICAgICAgICAgICAgICAgICFtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKTsKKyAgICAgICAgaWYgKCFhbGxvd2VkICYmIERCRykgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOworICAgICAgICAgICAgaWYgKHBzU3RhdGUgIT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHJlYXNvbiArPSAiIC0gcHNTdGF0ZT0gIiArIHBzU3RhdGU7CisgICAgICAgICAgICBpZiAocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSAhPSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZICYmCisgICAgICAgICAgICAgICAgICAgICFtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIHJhZGlvU3RhdGU9ICIgKyBwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICsgIiAtIFJVSU0gbm90IGxvYWRlZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U3RhdGUoKSAhPSBQaG9uZS5TdGF0ZS5JRExFICYmCisgICAgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gY29uY3VycmVudFZvaWNlQW5kRGF0YSBub3QgYWxsb3dlZCBhbmQgc3RhdGU9ICIgKyBwaG9uZS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJvYW1pbmcpIHJlYXNvbiArPSAiIC0gUm9hbWluZyI7CisgICAgICAgICAgICBpZiAoIW1NYXN0ZXJEYXRhRW5hYmxlZCkgcmVhc29uICs9ICIgLSBtTWFzdGVyRGF0YUVuYWJsZWQ9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmICghZGVzaXJlZFBvd2VyU3RhdGUpIHJlYXNvbiArPSAiIC0gZGVzaXJlZFBvd2VyU3RhdGU9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ1Jlc3RhcnRSYWRpbykgcmVhc29uICs9ICIgLSBtUGVuZGluZ1Jlc3RhcnRSYWRpbz0gdHJ1ZSI7CisgICAgICAgICAgICBpZiAobUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSkgcmVhc29uICs9ICIgLSBuZWVkcyBQcm92aXNpb25pbmciOworICAgICAgICAgICAgbG9nKCJEYXRhIG5vdCBhbGxvd2VkIGR1ZSB0byIgKyByZWFzb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewpAQCAtMzE3LDcgKzM0OCw4IEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCB0cnVlKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIihmaXg/KSBXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMjcsMzYgKzM1OSwxMyBAQAogICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7CiAgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKIAotICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpCi0gICAgICAgICAgICAgICAgJiYgKHBzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpCi0gICAgICAgICAgICAgICAgJiYgKChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpID09IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpCi0gICAgICAgICAgICAgICAgJiYgKG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFICkKLSAgICAgICAgICAgICAgICAmJiBpc0RhdGFBbGxvd2VkKCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkUG93ZXJTdGF0ZQotICAgICAgICAgICAgICAgICYmICFtUGVuZGluZ1Jlc3RhcnRSYWRpbwotICAgICAgICAgICAgICAgICYmICFtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXR1cERhdGEocmVhc29uKTsKLQorICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpICYmCisgICAgICAgICAgICAgICAgaXNEYXRhQWxsb3dlZCgpICYmIGdldEFueURhdGFFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHJldFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJ0cnlTZXR1cERhdGE6IE5vdCByZWFkeSBmb3IgZGF0YTogIiArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YVN0YXRlPSIgKyBzdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgUFMgc3RhdGU9IiArIHBzU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIHJhZGlvIHN0YXRlPSIgKyBwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBydWltPSIgKyBtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGNvbmN1cnJlbnRWb2ljZSZEYXRhPSIgKyBtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBob25lU3RhdGU9IiArIHBob25lLmdldFN0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFFbmFibGVkPSIgKyBnZXRBbnlEYXRhRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiByb2FtaW5nPSIgKyByb2FtaW5nICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhT25Sb2FtaW5nRW5hYmxlPSIgKyBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkZXNpcmVkUG93ZXJTdGF0ZT0iICsgZGVzaXJlZFBvd2VyU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIFBlbmRpbmdSZXN0YXJ0UmFkaW89IiArIG1QZW5kaW5nUmVzdGFydFJhZGlvICsKLSAgICAgICAgICAgICAgICAgICAgIiBNYXN0ZXJEYXRhRW5hYmxlZD0iICsgbU1hc3RlckRhdGFFbmFibGVkICsKLSAgICAgICAgICAgICAgICAgICAgIiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc9IiArIG1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzgyLDYgKzM5MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShyZWFzb24pOwogCiAgICAgICAgIGJvb2xlYW4gbm90aWZpY2F0aW9uRGVmZXJyZWQgPSBmYWxzZTsKICAgICAgICAgZm9yIChEYXRhQ29ubmVjdGlvbiBjb25uIDogZGF0YUNvbm5lY3Rpb25MaXN0KSB7CkBAIC00NDAsMTMgKzQ1MCwxMyBAQAogICAgICAgICBjb25uLmNvbm5lY3QobXNnLCBtQWN0aXZlQXBuKTsKIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JTklUSU5HKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmF1bHREYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwogICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CiAgICAgfQpAQCAtNjIyLDEyICs2MzIsMTMgQEAKIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlOb0RhdGEoRmFpbENhdXNlIGxhc3RGYWlsQ2F1c2VDb2RlKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkZBSUxFRCk7CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkobnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coImdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb246IHJlYXNvbj0iICsgcmVhc29uKTsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgIH0KIApAQCAtNjg3LDExICs2OTgsMTMgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgfQogCisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkobnVsbCk7CisKICAgICAgICAgaWYgKHN0YXRlICE9IFN0YXRlLklETEUpIHsKICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKHRydWUsIG51bGwpOwogICAgICAgICB9CkBAIC03NjIsNyArNzc1LDcgQEAKICAgICAgICAgICAgIG9uUmVzdGFydFJhZGlvKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEaXNjb25uZWN0ZWQocmVhc29uKSkgewogICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtNzg5LDcgKzgwMiw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICFtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgwMCwxMSArODE0LDEyIEBACiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIGlmICghbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICAgICAgICAgIC8vIGluIGNhc2UgZGF0YSBzZXR1cCB3YXMgYXR0ZW1wdGVkIHdoZW4gd2Ugd2VyZSBvbiBhIHZvaWNlIGNhbGwKQEAgLTgzOCw3ICs4NTMsNyBAQAogICAgIHByaXZhdGUgdm9pZCBvbkNkbWFEYXRhRGV0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggZWQ5M2FlYS4uMWIwOGFlZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCkBAIC01MSw3ICs1MSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEubGFuZy5Cb29sZWFuOwogCiAKIGZpbmFsIGNsYXNzIENkbWFTTVNEaXNwYXRjaGVyIGV4dGVuZHMgU01TRGlzcGF0Y2hlciB7CkBAIC03NSw2ICs3NCw3IEBACiAgICAgICogQHBhcmFtIGFyIEFzeW5jUmVzdWx0IHBhc3NlZCBpbnRvIHRoZSBtZXNzYWdlIGhhbmRsZXIuICBhci5yZXN1bHQgc2hvdWxkCiAgICAgICogICAgICAgICAgIGJlIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIHJlcG9ydCBQRFUsIGFzIEFTQ0lJIGhleC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdGF0dXNSZXBvcnQoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3RhdHVzUmVwb3J0IGlzIGEgc3BlY2lhbCBHU00gZnVuY3Rpb24sIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gQ0RNQSEiKTsKICAgICB9CkBAIC05Nyw2ICs5Nyw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGRpc3BhdGNoTWVzc2FnZShTbXNNZXNzYWdlQmFzZSBzbXNiKSB7CiAKICAgICAgICAgLy8gSWYgc21zIGlzIG51bGwsIG1lYW5zIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3IuCkBAIC0xNzYsNyArMTc3LDcgQEAKICAgICAgICAgICogVE9ETyhjbGVhbnVwKTogV2h5IGFyZSB3ZSB1c2luZyBhIGdldHRlciBtZXRob2QgZm9yIHRoaXMKICAgICAgICAgICogKGFuZCBmb3Igc28gbWFueSBvdGhlciBzbXMgZmllbGRzKT8gIFRyaXZpYWwgZ2V0dGVycyBhbmQKICAgICAgICAgICogc2V0dGVycyBsaWtlIHRoaXMgYXJlIGRpcmVjdCB2aW9sYXRpb25zIG9mIHRoZSBzdHlsZSBndWlkZS4KLSAgICAgICAgICogSWYgdGhlIHB1cnBvc2UgaXMgdG8gcHJvdGVjdCBhZ2Fpc3Qgd3JpdGVzIChieSBub3QKKyAgICAgICAgICogSWYgdGhlIHB1cnBvc2UgaXMgdG8gcHJvdGVjdCBhZ2FpbnN0IHdyaXRlcyAoYnkgbm90CiAgICAgICAgICAqIHByb3ZpZGluZyBhIHNldHRlcikgdGhlbiBhbnkgcHJvdGVjdGlvbiBpcyBpbGx1c29yeSAoYW5kCiAgICAgICAgICAqIGhlbmNlIGJhZCkgZm9yIGNhc2VzIHdoZXJlIHRoZSB2YWx1ZXMgYXJlIG5vdCBwcmltaXRpdmVzLAogICAgICAgICAgKiBzdWNoIGFzIHRoaXMgY2FsbCBmb3IgdGhlIGhlYWRlci4gIFNpbmNlIHRoaXMgaXMgYW4gaXNzdWUKQEAgLTM0MCw2ICszNDEsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZERhdGEoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBpbnQgZGVzdFBvcnQsCiAgICAgICAgICAgICBieXRlW10gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzQ4LDYgKzM1MCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzU2LDYgKzM1OSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzY0LDcgKzM2OCw3IEBACiAgICAgICAgICAqIFRPRE8oY2xlYW51cCk6IFRoZXJlIGlzIG5vIHJlYWwgY29kZSBkaWZmZXJlbmNlIGJldHdlZW4KICAgICAgICAgICogdGhpcyBhbmQgdGhlIEdTTSB2ZXJzaW9uLCBhbmQgaGVuY2UgaXQgc2hvdWxkIGJlIG1vdmVkIHRvCiAgICAgICAgICAqIHRoZSBiYXNlIGNsYXNzIG9yIGNvbnNvbGlkYXRlZCBzb21laG93LCBwcm92aWRlZCBjYWxsaW5nCi0gICAgICAgICAqIHRoZSBwcm9wZXIgc3VibWl0cGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KKyAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXQgcGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KICAgICAgICAgICovCiAKICAgICAgICAgaW50IHJlZk51bWJlciA9IGdldE5leHRDb25jYXRlbmF0ZWRSZWYoKSAmIDB4MDBGRjsKQEAgLTQzNyw4ICs0NDEsOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNtcyhTbXNUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIGJ5dGUgc21zY1tdID0gKGJ5dGVbXSkgbWFwLmdldCgic21zYyIpOwogICAgICAgICBieXRlIHBkdVtdID0gKGJ5dGVbXSkgbWFwLmdldCgicGR1Iik7CkBAIC00NDksMTEgKzQ1NCwxMyBAQAogICAgIH0KIAogICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRTbXMgKFNtc1RyYWNrZXIgdHJhY2tlcikgewogICAgICAgICBMb2cuZChUQUcsICJUT0RPOiBDZG1hU01TRGlzcGF0Y2hlci5zZW5kTXVsdGlwYXJ0U21zIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgcmVzdWx0LCBNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gRklYTUUgdW5pdCB0ZXN0IGxlYXZlcyBjbSA9PSBudWxsLiB0aGlzIHNob3VsZCBjaGFuZ2UKIApAQCAtNDc0LDE2ICs0ODEsMTkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLnNldENkbWFCcm9hZGNhc3RBY3RpdmF0aW9uKChhY3RpdmF0ZSA9PSAwKSwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIG1DbS5nZXRDZG1hQnJvYWRjYXN0Q29uZmlnKHJlc3BvbnNlKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLnNldENkbWFCcm9hZGNhc3RDb25maWcoY29uZmlnVmFsdWVzQXJyYXksIHJlc3BvbnNlKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAyY2FkNmNjLi41ZDRkYzU4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTExMTksNyArMTExOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzQ2RtYURhdGFDb25uZWN0aW9uQ2hhbmdlZCB8fCBoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCBjZmNmZDk4Li5hOWRmMzc1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTY3LDggKzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNtcyAgPSAoTGlzdDxTbXNSYXdEYXRhPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVmFsaWRSYXdEYXRhKChBcnJheUxpc3Q8Ynl0ZVtdPikgYXIucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zID0gYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihEQkcpIGxvZygiQ2Fubm90IGxvYWQgU21zIHJlY29yZHMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNtcyAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCmluZGV4IGI1MDUwMmMuLjY1ZDg3ZjUgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTE4LDExICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7CkBAIC0zMyw3ICszMCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC01OCw3ICs1NCw3IEBACiAvKioKICAqIFRPRE8oY2xlYW51cCk6IGludGVybmFsbHkgcmV0dXJuaW5nIG51bGwgaW4gbWFueSBwbGFjZXMgbWFrZXMKICAqIGRlYnVnZ2luZyB2ZXJ5IGhhcmQgKGFtb25nIG1hbnkgb3RoZXIgcmVhc29ucykgYW5kIHNob3VsZCBiZSBtYWRlCi0gKiBtb3JlIG1lYW5pbmdmdWwgKHJlcGxhY2VkIHdpdGggZXhlY3B0aW9ucyBmb3IgZXhhbXBsZSkuICBOdWxsCisgKiBtb3JlIG1lYW5pbmdmdWwgKHJlcGxhY2VkIHdpdGggZXhjZXB0aW9ucyBmb3IgZXhhbXBsZSkuICBOdWxsCiAgKiByZXR1cm5zIHNob3VsZCBvbmx5IG9jY3VyIGF0IHRoZSB2ZXJ5IG91dHNpZGUgb2YgdGhlIG1vZHVsZS9jbGFzcwogICogc2NvcGUuCiAgKi8KQEAgLTI4Nyw3ICsyODMsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0QWRkciAgICAgICAgICAgICAgQWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50LgogICAgICAqIEBwYXJhbSBtZXNzYWdlICAgICAgICAgICAgICAgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIHBheWxvYWQuCiAgICAgICogQHBhcmFtIHN0YXR1c1JlcG9ydFJlcXVlc3RlZCBJbmRpY2F0ZXMgd2hldGhlciBhIHJlcG9ydCBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gaGVhZGVyRGF0YSAgICAgICAgICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgZm9yIHRoZSBVc2VyIERhdGEgSGVhZGVyLCBwcmVjZWRlZAorICAgICAqIEBwYXJhbSBzbXNIZWFkZXIgICAgICAgICAgICAgQXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIFVzZXIgRGF0YSBIZWFkZXIsIHByZWNlZGVkCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgRWxlbWVudCBJZGVudGlmaWVycy4KICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3VibWl0UGR1PC9jb2RlPiBjb250YWluaW5nIHRoZSBlbmNvZGVkIFNDCiAgICAgICogICAgICAgICBhZGRyZXNzLCBpZiBhcHBsaWNhYmxlLCBhbmQgdGhlIGVuY29kZWQgbWVzc2FnZS4KQEAgLTM1NSw3ICszNTEsNyBAQAogICAgICAqIEdldCBhbiBTTVMtU1VCTUlUIFBEVSBmb3IgYSBkYXRhIG1lc3NhZ2UgdG8gYSBkZXN0aW5hdGlvbiBhZGRyZXNzICZhbXA7IHBvcnQKICAgICAgKgogICAgICAqIEBwYXJhbSBkZXN0QWRkciB0aGUgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVzZXJEYXJhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSB1c2VyRGF0YSB0aGUgZGF0YSBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcGFyYW0gc3RhdHVzUmVwb3J0UmVxdWVzdGVkIEluZGljYXRlcyB3aGV0aGVyIGEgcmVwb3J0IGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBtZXNzYWdlLgogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgpAQCAtNjE0LDcgKzYxMCw3IEBACiAgICAgICogaW5jcmVtZW50aW5nIHdpdGhpbiB0aGUgcmFuZ2UgMS4uNjU1MzUgcmVtZW1iZXJpbmcgdGhlIHN0YXRlCiAgICAgICogdmlhIGEgcGVyc2lzdGVudCBzeXN0ZW0gcHJvcGVydHkuICAoU2VlIEMuUzAwMTUtQiwgdjIuMCwKICAgICAgKiA0LjMuMS41KSBTaW5jZSB0aGlzIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gYmUgYWNjZXNzZWQgdmlhIHZpYQotICAgICAqIGJpbmRlci1jYWxsLCBhbmQgaGVuY2Ugc2hvdWxkIGJlIHRocmVhZHNhZmUsIGl0IGhhcyBiZWVuCisgICAgICogYmluZGVyLWNhbGwsIGFuZCBoZW5jZSBzaG91bGQgYmUgdGhyZWFkLXNhZmUsIGl0IGhhcyBiZWVuCiAgICAgICogc3luY2hyb25pemVkLgogICAgICAqLwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBpbnQgZ2V0TmV4dE1lc3NhZ2VJZCgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCmluZGV4IGM3MDMyYWMuLmU5ZmVhNTUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1BWF9VU0VSX0RBVEFfQllURVNfV0lUSF9IRUFERVI7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CiAKQEAgLTMwLDEwICsyOSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5Vc2VyRGF0YTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VJbnB1dFN0cmVhbTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VPdXRwdXRTdHJlYW07CiAKQEAgLTQ1LDEzICs0MiwxMyBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlNNUyI7CiAKICAgICAvKioKLSAgICAgKiBCZWFyZXIgRGF0YSBTdWJwYXJhbWV0ZXIgSW5kZW50aWZpZXJzCisgICAgICogQmVhcmVyIERhdGEgU3VicGFyYW1ldGVyIElkZW50aWZpZXJzCiAgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIsIHYyLjAsIHRhYmxlIDQuNS0xKQogICAgICAqIE5PVEU6IENvbW1lbnRlZCBzdWJwYXJhbWV0ZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX01FU1NBR0VfSURFTlRJRklFUiAgICAgICAgICAgICAgID0gMHgwMDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1VTRVJfREFUQSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1VTRVJfUkVQT05TRV9DT0RFICAgICAgICAgICAgICAgID0gMHgwMjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1VTRVJfUkVTUE9OU0VfQ09ERSAgICAgICAgICAgICAgID0gMHgwMjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX01FU1NBR0VfQ0VOVEVSX1RJTUVfU1RBTVAgICAgICAgID0gMHgwMzsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1ZBTElESVRZX1BFUklPRF9BQlNPTFVURSAgICAgICAgID0gMHgwNDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1ZBTElESVRZX1BFUklPRF9SRUxBVElWRSAgICAgICAgID0gMHgwNTsKQEAgLTQwNSw3ICs0MDIsNyBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGVuY29kaW5nIGxlbmd0aCwgZnJhZ21lbnRhdGlvbiwgYW5kIG90aGVyIGRldGFpbHMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZm9yY2UgaWdub3JlIChidXQgc3RpbGwgY291bnQpIGlsbGVnYWwgY2hhcmFjdGVycyBpZiB0cnVlCisgICAgICogQHBhcmFtIGZvcmNlN0JpdEVuY29kaW5nIGlnbm9yZSAoYnV0IHN0aWxsIGNvdW50KSBpbGxlZ2FsIGNoYXJhY3RlcnMgaWYgdHJ1ZQogICAgICAqIEByZXR1cm4gc2VwdGV0IGNvdW50LCBvciAtMSBvbiBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUZXh0RW5jb2RpbmdEZXRhaWxzIGNhbGNUZXh0RW5jb2RpbmdEZXRhaWxzKENoYXJTZXF1ZW5jZSBtc2csCkBAIC02OTUsNyArNjkyLDcgQEAKICAgICAvKgogICAgICAqIFRPRE8oY2xlYW51cCk6IENkbWFTbXNBZGRyZXNzIGVuY29kaW5nIHNob3VsZCBtYWtlIHVzZSBvZgogICAgICAqIENkbWFTbXNBZGRyZXNzLnBhcnNlIHByb3ZpZGVkIHRoYXQgRFRNRiBlbmNvZGluZyBpcyB1bmlmaWVkLAotICAgICAqIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiA0Yml0IHZzIDhiaXQgaXMgcmVzb2x2ZWQuCisgICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDQtYml0IHZzLiA4LWJpdCBpcyByZXNvbHZlZC4KICAgICAgKi8KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5jb2RlQ2RtYVNtc0FkZHJlc3MoQ2RtYVNtc0FkZHJlc3MgYWRkcikgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbiB7CkBAIC04MDIsOSArNzk5LDkgQEAKICAgICAgKiBDcmVhdGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBmb3IgQmVhcmVyRGF0YSBvYmplY3QuCiAgICAgICogKFNlZSAzR1BQMiBDLlIxMDAxLUYsIHYxLjAsIHNlY3Rpb24gNC41IGZvciBsYXlvdXQgZGV0YWlscykKICAgICAgKgotICAgICAqIEBwYXJhbSBiZWFyZXJEYXRhIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCisgICAgICogQHBhcmFtIGJEYXRhIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGRhdGEgYnl0YSBhcnJheSBvZiByYXcgZW5jb2RlZCBTTVMgYmVhcmVyIGRhdGEuCisgICAgICogQHJldHVybiBkYXRhIGJ5dGUgYXJyYXkgb2YgcmF3IGVuY29kZWQgU01TIGJlYXJlciBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShCZWFyZXJEYXRhIGJEYXRhKSB7CiAgICAgICAgIGJEYXRhLmhhc1VzZXJEYXRhSGVhZGVyID0gKChiRGF0YS51c2VyRGF0YSAhPSBudWxsKSAmJgpAQCAtOTE0LDcgKzkxMSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVV0ZjE2KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgMTYtYml0IGFsaWduZWQgYm91bmRyeSBhZnRlciBvZmZzZXQuCisgICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZGFyeSBhZnRlciBvZmZzZXQuCiAgICAgICAgIGludCBwYWRkaW5nID0gb2Zmc2V0ICUgMjsKICAgICAgICAgbnVtRmllbGRzIC09IChvZmZzZXQgKyBwYWRkaW5nKSAvIDI7CiAgICAgICAgIHRyeSB7CkBAIC05NjAsNyArOTU3LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlN2JpdEdzbShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IG51bUZpZWxkcykKICAgICAgICAgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRyeSBhZnRlciBvZmZzZXQuCisgICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCA3LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IG9mZnNldEJpdHMgPSBvZmZzZXQgKiA4OwogICAgICAgICBpbnQgb2Zmc2V0U2VwdGV0cyA9IChvZmZzZXRCaXRzICsgNikgLyA3OwogICAgICAgICBudW1GaWVsZHMgLT0gb2Zmc2V0U2VwdGV0czsKQEAgLTE1NTMsNyArMTU1MCw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyRGF0YShiRGF0YSwgaW5TdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfUkVQT05TRV9DT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gZGVjb2RlVXNlclJlc3BvbnNlQ29kZShiRGF0YSwgaW5TdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1JFUExZX09QVElPTjoKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKaW5kZXggMGRjYWNjMS4uYTY3MzI3YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zOwogCiAKLXB1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZXsKK3B1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZSB7CiAgICAgLyoqCiAgICAgICogTWVzc2FnZSBUeXBlcwogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CIDMuNC4xKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCmluZGV4IGM3YjFlNWMuLjA0Yjc1YmMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICByZXR1cm4gbVBlbmRpbmdNTUlzOwogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtMzA0LDYgKzMwNCw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgeyAvKiBtU1NULmdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAqLwogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtNDA1LDggKzQwNyw4IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZAotICAgIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHRoaXMsIHJlYXNvbik7CisgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZApAQCAtMTA5MywyNyArMTA5NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKLSAgICAgKiBwb3NzaWJsZSBhcmUKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGEgcm9hbWluZyBpcyBkaXNhbGxvd2VkIGFuZCB3ZSBhcmUgcm9hbWluZy48L2xpPgotICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCi0gICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCi0gICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5IGNoZWNrcyBpZiBhbnkgR1BSUyBjb25uZWN0aW9uIGlzIGFjdGl2ZS4gU2hvdWxkIGl0IG9ubHkKLSAgICAgICAgLy8gY2hlY2sgZm9yICJkZWZhdWx0Ij8KLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpID09IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7Ci0gICAgICAgIHJldHVybiAhbm9EYXRhICYmIGdldEljY0NhcmQoKS5nZXRTdGF0ZSgpID09IFNpbUNhcmQuU3RhdGUuUkVBRFkgJiYKLSAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlU3RhdGUoKS5nZXRTdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICYmCi0gICAgICAgICAgICAobURhdGFDb25uZWN0aW9uLmdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgfHwgIWdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTU1JIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBhbmQgbm90aWZpZXMKICAgICAgKiByZWdpc3RyYW50cyB0aGF0IGl0IGlzIGNvbXBsZXRlLgogICAgICAqIEBwYXJhbSBtbWkgTU1JIHRoYXQgaXMgZG9uZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggZjZkNDQ5MS4uNjgyNmZhOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0zODgsMTIgKzM4OCw2IEBACiAgICAgICAgIHJldHVybiBwZHBzOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgewotICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7Ci0gICAgICAgIHJldHVybiBnZXRBbnlEYXRhRW5hYmxlZCgpICYmICghcm9hbWluZyB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgotICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZDsKLSAgICB9Ci0KICAgICAvLyoqKioqKiBDYWxsZWQgZnJvbSBTZXJ2aWNlU3RhdGVUcmFja2VyCiAgICAgLyoqCiAgICAgICogSW52b2tlZCB3aGVuIFNlcnZpY2VTdGF0ZVRyYWNrZXIgb2JzZXJ2ZXMgYSB0cmFuc2l0aW9uIGZyb20gR1BSUwpAQCAtNDA1LDEzICszOTksMTMgQEAKICAgICAgICAgICogd2hlbiBHUFJTIGRldGFjaGVzLCBidXQgd2Ugc2hvdWxkIHN0b3AgdGhlIG5ldHdvcmsgcG9sbGluZy4KICAgICAgICAgICovCiAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19ERVRBQ0hFRCk7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0RFVEFDSEVEKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb25HcHJzQXR0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQpIHsKICAgICAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbihmYWxzZSwgUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOwpAQCAtNDIxLDYgKzQxNSwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKKyAgICAgICAgaW50IGdwcnNTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldEN1cnJlbnRHcHJzU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gKChncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgfHwgbm9BdXRvQXR0YWNoKSAmJgorICAgICAgICAgICAgICAgIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgJiYKKyAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUgJiYKKyAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAoIXBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgorICAgICAgICAgICAgICAgICFtSXNQc1Jlc3RyaWN0ZWQgJiYKKyAgICAgICAgICAgICAgICBkZXNpcmVkUG93ZXJTdGF0ZSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChncHJzU3RhdGUgIT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHJlYXNvbiArPSAiIC0gZ3Bycz0gIiArIGdwcnNTdGF0ZTsKKyAgICAgICAgICAgIGlmICghbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgcmVhc29uICs9ICIgLSBTSU0gbm90IGxvYWRlZCI7CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U3RhdGUoKSAhPSBQaG9uZS5TdGF0ZS5JRExFKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBQaG9uZVN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1hc3RlckRhdGFFbmFibGVkKSByZWFzb24gKz0gIiAtIG1NYXN0ZXJEYXRhRW5hYmxlZD0gZmFsc2UiOworICAgICAgICAgICAgaWYgKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBSb2FtaW5nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNQc1Jlc3RyaWN0ZWQpIHJlYXNvbiArPSAiIC0gbUlzUHNSZXN0cmljdGVkPSB0cnVlIjsKKyAgICAgICAgICAgIGlmICghZGVzaXJlZFBvd2VyU3RhdGUpIHJlYXNvbiArPSAiIC0gZGVzaXJlZFBvd2VyU3RhdGU9IGZhbHNlIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCIqKip0cnlTZXR1cERhdGEgZHVlIHRvICIgKyAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pKTsKIApAQCAtNDMwLDcgKzQ1Myw3IEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDM5LDE5ICs0NjIsMTUgQEAKICAgICAgICAgaW50IGdwcnNTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldEN1cnJlbnRHcHJzU3RhdGUoKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgfHwgbm9BdXRvQXR0YWNoKQotICAgICAgICAgICAgICAgICYmIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkKLSAgICAgICAgICAgICAgICAmJiBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUKLSAgICAgICAgICAgICAgICAmJiBpc0RhdGFBbGxvd2VkKCkKLSAgICAgICAgICAgICAgICAmJiAhbUlzUHNSZXN0cmljdGVkCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUgKSB7CisgICAgICAgIGlmICgoKHN0YXRlID09IFN0YXRlLklETEUpIHx8IChzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykpICYmCisgICAgICAgICAgICAgICAgaXNEYXRhQWxsb3dlZCgpICYmIGdldEFueURhdGFFbmFibGVkKCkpIHsKIAogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklETEUpIHsKICAgICAgICAgICAgICAgICB3YWl0aW5nQXBucyA9IGJ1aWxkV2FpdGluZ0FwbnMoKTsKICAgICAgICAgICAgICAgICBpZiAod2FpdGluZ0FwbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiTm8gQVBOIGZvdW5kIik7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU5vRGF0YShHc21EYXRhQ29ubmVjdGlvbi5GYWlsQ2F1c2UuTUlTU0lOR19VTktOT1dOX0FQTik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZyAoIkNyZWF0ZSBmcm9tIGFsbEFwbnMgOiAiICsgYXBuTGlzdFRvU3RyaW5nKGFsbEFwbnMpKTsKQEAgLTQ2MSwyMiArNDgwLDExIEBACiAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgbG9nICgiU2V0dXAgd2FpdG5nQXBucyA6ICIgKyBhcG5MaXN0VG9TdHJpbmcod2FpdGluZ0FwbnMpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHJldFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpCi0gICAgICAgICAgICAgICAgbG9nKCJ0cnlTZXR1cERhdGE6IE5vdCByZWFkeSBmb3IgZGF0YTogIiArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YVN0YXRlPSIgKyBzdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgZ3Byc1N0YXRlPSIgKyBncHJzU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIHNpbT0iICsgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgVU1UUz0iICsgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBob25lU3RhdGU9IiArIHBob25lLmdldFN0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGlzRGF0YUFsbG93ZWQ9IiArIGlzRGF0YUFsbG93ZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YUVuYWJsZWQ9IiArIGdldEFueURhdGFFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJvYW1pbmc9IiArIHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcHMgcmVzdHJpY3RlZD0iICsgbUlzUHNSZXN0cmljdGVkICsKLSAgICAgICAgICAgICAgICAgICAgIiBkZXNpcmVkUG93ZXJTdGF0ZT0iICsgZGVzaXJlZFBvd2VyU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIE1hc3RlckRhdGFFbmFibGVkPSIgKyBtTWFzdGVyRGF0YUVuYWJsZWQpOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNTk1LDcgKzYwMyw3IEBACiAgICAgICAgIHBkcC5jb25uZWN0KG1zZywgYXBuKTsKIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JTklUSU5HKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC03NDYsNyArNzU0LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgLy8gcmVzZXQgcmVjb25uZWN0IHRpbWVyCiAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKQEAgLTc1Niw3ICs3NjQsNyBAQAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTk5OCw3ICsxMDA2LDcgQEAKICAgICAgICAgICAgIGlmICghbVJldHJ5TWdyLmlzUmV0cnlOZWVkZWQoKSkgewogICAgICAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZEFwblR5cGUuZXF1YWxzKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUgcmV0cmllcyBvbiBhIHNlY29uZGFyeSBBUE4gYXR0ZW1wdCwgdGVsbCB0aGUgd29ybGQgYW5kIHJldmVydC4KLSAgICAgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlQXBuKGFwblR5cGVUb0lkKG1SZXF1ZXN0ZWRBcG5UeXBlKSwgRElTQUJMRUQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5MSw3ICsxMDk5LDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgfQpAQCAtMTE1OCw3ICsxMTY2LDcgQEAKICAgICAgICAgICAgIGlmIChjYXVzZS5pc1Blcm1hbmVudEZhaWwoKSkgewogICAgICAgICAgICAgICAgIG5vdGlmeU5vRGF0YShjYXVzZSk7CiAgICAgICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkQXBuVHlwZS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlQXBuKGFwblR5cGVUb0lkKG1SZXF1ZXN0ZWRBcG5UeXBlKSwgRElTQUJMRUQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xMTg4LDcgKzExOTYsNyBAQAogICAgICAgICAgICByZWFzb24gPSAoU3RyaW5nKSBhci51c2VyT2JqOwogICAgICAgICB9CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEaXNjb25uZWN0ZWQocmVhc29uKSkgewogICAgICAgICAgICAgdHJ5U2V0dXBEYXRhKHJlYXNvbik7CkBAIC0xMjE5LDcgKzEyMjcsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uVm9pY2VDYWxsU3RhcnRlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCAmJiAhIG1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMjcsNyArMTIzNSw3IEBACiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIGlmICghbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOworICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gY2xlYW4gc2xhdGUgYWZ0ZXIgY2FsbCBlbmQuCiAgICAgICAgICAgICAgICAgcmVzZXRQb2xsU3RhdHMoKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggZDcyMDUxNi4uZjA5ZmYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBTdHJpbmcgcGR1U3RyaW5nID0gKFN0cmluZykgYXIucmVzdWx0OwogICAgICAgICBTbXNNZXNzYWdlIHNtcyA9IFNtc01lc3NhZ2UubmV3RnJvbUNEUyhwZHVTdHJpbmcpOwpAQCAtODUsNiArODYsNyBAQAogCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTE1Miw2ICsxNTQsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZERhdGEoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBpbnQgZGVzdFBvcnQsCiAgICAgICAgICAgICBieXRlW10gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMTYwLDYgKzE2Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMTY4LDYgKzE3Miw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dChTdHJpbmcgZGVzdGluYXRpb25BZGRyZXNzLCBTdHJpbmcgc2NBZGRyZXNzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHMsIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50cywKICAgICAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBkZWxpdmVyeUludGVudHMpIHsKQEAgLTMwNyw4ICszMTIsOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNtcyhTbXNUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIGJ5dGUgc21zY1tdID0gKGJ5dGVbXSkgbWFwLmdldCgic21zYyIpOwogICAgICAgICBieXRlIHBkdVtdID0gKGJ5dGVbXSkgbWFwLmdldCgicGR1Iik7CkBAIC0zMjMsMTIgKzMyOSwxMyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRyYWNrZXIgaG9sZHMgdGhlIG11bHRpcGFydCBTbXMgdHJhY2tlciByZWFkeSB0byBiZSBzZW50CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzOwogICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHM7CiAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBkZWxpdmVyeUludGVudHM7CiAKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIFN0cmluZyBkZXN0aW5hdGlvbkFkZHJlc3MgPSAoU3RyaW5nKSBtYXAuZ2V0KCJkZXN0aW5hdGlvbiIpOwogICAgICAgICBTdHJpbmcgc2NBZGRyZXNzID0gKFN0cmluZykgbWFwLmdldCgic2NhZGRyZXNzIik7CkBAIC0zNDMsNiArMzUwLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nU21zKGJvb2xlYW4gc3VjY2VzcywgaW50IHJlc3VsdCwgTWVzc2FnZSByZXNwb25zZSl7CiAgICAgICAgIC8vIEZJWE1FIHVuaXQgdGVzdCBsZWF2ZXMgY20gPT0gbnVsbC4gdGhpcyBzaG91bGQgY2hhbmdlCiAgICAgICAgIGlmIChtQ20gIT0gbnVsbCkgewpAQCAtMzUxLDYgKzM1OSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoaW50IGFjdGl2YXRlLCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIC8vIFVubGVzcyBDQlMgaXMgaW1wbGVtZW50ZWQgZm9yIEdTTSwgdGhpcyBwb2ludCBzaG91bGQgYmUgdW5yZWFjaGFibGUuCiAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBUaGUgZnVuY3Rpb25hbGl0eSBjZWxsIGJyb2FkY2FzdCBzbXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CkBAIC0zNTgsNiArMzY3LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoTWVzc2FnZSByZXNwb25zZSl7CiAgICAgICAgIC8vIFVubGVzcyBDQlMgaXMgaW1wbGVtZW50ZWQgZm9yIEdTTSwgdGhpcyBwb2ludCBzaG91bGQgYmUgdW5yZWFjaGFibGUuCiAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBUaGUgZnVuY3Rpb25hbGl0eSBjZWxsIGJyb2FkY2FzdCBzbXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CkBAIC0zNjUsNiArMzc1LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCAgdm9pZCBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIC8vIFVubGVzcyBDQlMgaXMgaW1wbGVtZW50ZWQgZm9yIEdTTSwgdGhpcyBwb2ludCBzaG91bGQgYmUgdW5yZWFjaGFibGUuCiAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBUaGUgZnVuY3Rpb25hbGl0eSBjZWxsIGJyb2FkY2FzdCBzbXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IGQ1MzlmNmYxLi5jMmY2MzMwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTAxMSw3ICsxMDExLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgLy8gVE9ETyAtIGRvIHdlIHJlYWxseSB3YW50IHRoaXM/CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSb2FtaW5nT24pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggMjAyOGNhNC4uZjAwMGQ3OSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTg2LDYgKzg2LDcgQEAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKQEAgLTE5MSw2ICsxOTIsNyBAQAogICAgICAgICByZXR1cm4gbVNtczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZykgewogICAgICAgICBMb2cuZChMT0dfVEFHLCAiW1NpbVNtc0ludGVyZmFjZU1hbmFnZXJdICIgKyBtc2cpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKaW5kZXggMTJjNmI4OC4uNDg3MzcyZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlRleHRFbmNvZGluZ0RldGFpbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CkBAIC00NSw3ICs0NCw3IEBACiAgKiBBIFNob3J0IE1lc3NhZ2UgU2VydmljZSBtZXNzYWdlLgogICoKICAqLwotcHVibGljIGNsYXNzIFNtc01lc3NhZ2UgZXh0ZW5kcyBTbXNNZXNzYWdlQmFzZXsKK3B1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2UgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJHU00iOwogCiAgICAgcHJpdmF0ZSBNZXNzYWdlQ2xhc3MgbWVzc2FnZUNsYXNzOwpAQCAtMzExLDcgKzMxMCw3IEBACiAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIncyBTSU0gY2FyZC4gWW91IGNhbiB0aGVuIHNlbmQgbWVzc2FnZXMgdG8geW91cnNlbGYKICAgICAgICAgICAgIC8vIChvbiBhIHBob25lIHdpdGggdGhpcyBjaGFuZ2UpIGFuZCB0aGV5J2xsIGVuZCB1cCBvbiB0aGUgU0lNIGNhcmQuCiAgICAgICAgICAgICBiby53cml0ZSgweDAwKTsKLSAgICAgICAgfSBlbHNlIHsgLy9hc3N1bWUgVUNTLTIKKyAgICAgICAgfSBlbHNlIHsgLy8gYXNzdW1lIFVDUy0yCiAgICAgICAgICAgICBpZiAoKDB4ZmYgJiB1c2VyRGF0YVswXSkgPiBNQVhfVVNFUl9EQVRBX0JZVEVTKSB7CiAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSB0b28gbG9uZwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMzc3LDcgKzM3Niw3IEBACiAgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uQWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBtZXNzYWdlCiAgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uUG9ydCB0aGUgcG9ydCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvIGF0IHRoZQogICAgICAqICAgICAgICBkZXN0aW5hdGlvbgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXQgZm9yIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgZm9yIHRoZSBtZXNzYWdlCiAgICAgICogQHJldHVybiBhIDxjb2RlPlN1Ym1pdFBkdTwvY29kZT4gY29udGFpbmluZyB0aGUgZW5jb2RlZCBTQwogICAgICAqICAgICAgICAgYWRkcmVzcywgaWYgYXBwbGljYWJsZSwgYW5kIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCiAgICAgICogICAgICAgICBSZXR1cm5zIG51bGwgb24gZW5jb2RlIGVycm9yLgpAQCAtNDgyLDcgKzQ4MSw3IEBACiAgICAgICAgIHJldHVybiBibzsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgUGR1UGFyc2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQZHVQYXJzZXIgewogICAgICAgICBieXRlIHBkdVtdOwogICAgICAgICBpbnQgY3VyOwogICAgICAgICBTbXNIZWFkZXIgdXNlckRhdGFIZWFkZXI7CkBAIC00OTAsMTAgKzQ4OSw2IEBACiAgICAgICAgIGludCBtVXNlckRhdGFTZXB0ZXRQYWRkaW5nOwogICAgICAgICBpbnQgbVVzZXJEYXRhU2l6ZTsKIAotICAgICAgICBQZHVQYXJzZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgICAgIHRoaXMoSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcyhzKSk7Ci0gICAgICAgIH0KLQogICAgICAgICBQZHVQYXJzZXIoYnl0ZVtdIHBkdSkgewogICAgICAgICAgICAgdGhpcy5wZHUgPSBwZHU7CiAgICAgICAgICAgICBjdXIgPSAwOwpAQCAtNTQ1LDcgKzU0MCw3IEBACiAgICAgICAgICAgICBHc21TbXNBZGRyZXNzIHJldDsKIAogICAgICAgICAgICAgLy8gIlRoZSBBZGRyZXNzLUxlbmd0aCBmaWVsZCBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICAgICAgICAvLyB0aGUgbnVtYmVyIGZpZWxkLCBpLmUuIGV4Y2x1ZGVzIGFueSBzZW1pIG9jdGV0IGNvbnRhaW5pbmcgb25seQorICAgICAgICAgICAgLy8gdGhlIG51bWJlciBmaWVsZCwgaS5lLiBleGNsdWRlcyBhbnkgc2VtaS1vY3RldCBjb250YWluaW5nIG9ubHkKICAgICAgICAgICAgIC8vIGZpbGwgYml0cy4iCiAgICAgICAgICAgICAvLyBUaGUgVE9BIGZpZWxkIGlzIG5vdCBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoaXMKICAgICAgICAgICAgIGludCBhZGRyZXNzTGVuZ3RoID0gcGR1W2N1cl0gJiAweGZmOwpAQCAtNTczLDcgKzU2OCw3IEBACiAgICAgICAgICAgICBpbnQgc2Vjb25kID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KHBkdVtjdXIrK10pOwogCiAgICAgICAgICAgICAvLyBGb3IgdGhlIHRpbWV6b25lLCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCi0gICAgICAgICAgICAvLyBsZWFzdCBzaWduZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCisgICAgICAgICAgICAvLyBsZWFzdCBzaWduaWZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQogICAgICAgICAgICAgLy8gKG1lYW5pbmcgdGhlIG1heCByYW5nZSBvZiB0aGlzIGZpZWxkIGlzIDc5IHF1YXJ0ZXItaG91cnMsCiAgICAgICAgICAgICAvLyB3aGljaCBpcyBtb3JlIHRoYW4gZW5vdWdoKQogCkBAIC02MzIsNyArNjI3LDcgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEhlcmUgd2UganVzdCBjcmVhdGUgdGhlIHVzZXIgZGF0YSBsZW5ndGggdG8gYmUgdGhlIHJlbWFpbmRlciBvZgogICAgICAgICAgICAgICAgICAqIHRoZSBwZHUgbWludXMgdGhlIHVzZXIgZGF0YSBoZWFkZXIsIHNpbmNlIHVzZXJEYXRhTGVuZ3RoIG1lYW5zCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgc2VwZXRzLgorICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIHNlcHRldHMuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgYnVmZmVyTGVuID0gcGR1Lmxlbmd0aCAtIG9mZnNldDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02NzEsMTAgKzY2NiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSB1c2VyIGRhdGEKKyAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1c2VyIGRhdGEKICAgICAgICAgICogYXJyYXkgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VwdGV0cy4KICAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHVzZXIgZGF0YQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgZGF0YQogICAgICAgICAgKiBhcnJheSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzZXB0ZXRzCiAgICAgICAgICAqLwogICAgICAgICBpbnQgZ2V0VXNlckRhdGFTZXB0ZXRQYWRkaW5nKCkgewpAQCAtNjk0LDcgKzY4OSw3IEBACiAgICAgICAgIFhYWCBOb3Qgc3VyZSB3aGF0IHRoaXMgb25lIGlzIHN1cHBvc2VkIHRvIGJlIGRvaW5nLCBhbmQgbm8gb25lIGlzIHVzaW5nCiAgICAgICAgIGl0LgogICAgICAgICBTdHJpbmcgZ2V0VXNlckRhdGFHU004Yml0KCkgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZW1haW5kZXIgb2YgcHVkOiIgKworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZW1haW5kZXIgb2YgcGR1OiIgKwogICAgICAgICAgICAgLy8gSGV4RHVtcC5kdW1wSGV4U3RyaW5nKHBkdSwgY3VyLCBwZHUubGVuZ3RoIC0gY3VyKSk7CiAgICAgICAgICAgICBpbnQgY291bnQgPSBwZHVbY3VyKytdICYgMHhmZjsKICAgICAgICAgICAgIGludCBzaXplID0gcGR1W2N1cisrXTsKQEAgLTgyNSwxMSArODIwLDEzIEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFByb3RvY29sSWRlbnRpZmllcigpIHsKICAgICAgICAgcmV0dXJuIHByb3RvY29sSWRlbnRpZmllcjsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbGFjZSgpIHsKICAgICAgICAgcmV0dXJuIChwcm90b2NvbElkZW50aWZpZXIgJiAweGMwKSA9PSAweDQwCiAgICAgICAgICAgICAgICAgJiYgKHByb3RvY29sSWRlbnRpZmllciAmIDB4M2YpID4gMApAQCAtODM3LDEyICs4MzQsMTQgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ3Boc013aU1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlQ2xlYXIoKQogICAgICAgICAgICAgICAgIHx8ICgoR3NtU21zQWRkcmVzcykgb3JpZ2luYXRpbmdBZGRyZXNzKS5pc0NwaHNWb2ljZU1lc3NhZ2VTZXQoKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJQ2xlYXJNZXNzYWdlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgKG13aVNlbnNlID09IGZhbHNlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NTMsNiArODUyLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJU2V0TWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSB0cnVlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NjMsNiArODYzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTXdpRG9udFN0b3JlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgbXdpRG9udFN0b3JlKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg4MiwzMSArODgzLDM0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbHlQYXRoUHJlc2VudCgpIHsKICAgICAgICAgcmV0dXJuIHJlcGx5UGF0aFByZXNlbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVFMgMjcuMDA1IDMuMSwgPHBkdT4gZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KKyAgICAgKiBUUyAyNy4wMDUgMy4xLCAmbHQ7cGR1Jmd0OyBkZWZpbml0aW9uICJJbiB0aGUgY2FzZSBvZiBTTVM6IDNHUFAgVFMgMjQuMDExIFs2XQogICAgICAqIFNDIGFkZHJlc3MgZm9sbG93ZWQgYnkgM0dQUCBUUyAyMy4wNDAgWzNdIFRQRFUgaW4gaGV4YWRlY2ltYWwgZm9ybWF0OgogICAgICAqIE1FL1RBIGNvbnZlcnRzIGVhY2ggb2N0ZXQgb2YgVFAgZGF0YSB1bml0IGludG8gdHdvIElSQSBjaGFyYWN0ZXIgbG9uZwotICAgICAqIGhleGFkIG51bWJlciAoZS5nLiBvY3RldCB3aXRoIGludGVnZXIgdmFsdWUgNDIgaXMgcHJlc2VudGVkIHRvIFRFIGFzIHR3bworICAgICAqIGhleCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KICAgICAgKiBjaGFyYWN0ZXJzIDJBIChJUkEgNTAgYW5kIDY1KSkiIC4uLmluIHRoZSBjYXNlIG9mIGNlbGwgYnJvYWRjYXN0LAogICAgICAqIHNvbWV0aGluZyBlbHNlLi4uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGR1KGJ5dGVbXSBwZHUpIHsKICAgICAgICAgbVBkdSA9IHBkdTsKLSAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzYWdlOiIpOworICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCAicmF3IHNtcyBtZXNzYWdlOiIpOwogICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCBzKTsKIAogICAgICAgICBQZHVQYXJzZXIgcCA9IG5ldyBQZHVQYXJzZXIocGR1KTsKQEAgLTExNTgsNiArMTE2Miw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBNZXNzYWdlQ2xhc3MgZ2V0TWVzc2FnZUNsYXNzKCkgewogICAgICAgICByZXR1cm4gbWVzc2FnZUNsYXNzOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCmluZGV4IGExMjBmNTIuLmZkY2Y3OGQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0OwogCi0KIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKQEAgLTI3LDcgKzI2LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDYWxsU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZhaWxDYXVzZTsKQEAgLTMzNSw3ICszMzMsNyBAQAogCiAgICAgLyoqCiAgICAgICogKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0IHdpbGwgYmUgYW4gSW50ZWdlciByZXByZXNlbnRpbmcKLSAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VyaXZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKKyAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VydmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQogICAgICAqCiAgICAgICogQHBhcmFtIGZhY2lsaXR5IG9uZSBvZiBDQl9GQUNJTFRZXyoKICAgICAgKiBAcGFyYW0gcGluIHBhc3N3b3JkIG9yICIiIGlmIG5vdCByZXF1aXJlZApAQCAtNDQxLDcgKzQzOSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBjb250YWlucyBhIExpc3Qgb2YgRHJpdmVyQ2FsbAogICAgICAqICAgICAgVGhlIGFyLnJlc3VsdCBMaXN0IGlzIHNvcnRlZCBieSBEcml2ZXJDYWxsLmluZGV4CiAgICAgICovCkBAIC00NjgsNyArNDY2LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGNvbnRhaW5zIGEgTGlzdCBvZiBEYXRhQ2FsbFN0YXRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0RGF0YUNhbGxMaXN0KE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC00NzksNyArNDc3LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogQ0xJUl9ERUZBVUxUICAgICA9PSBvbiAidXNlIHN1YnNjcmlwdGlvbiBkZWZhdWx0IHZhbHVlIgpAQCAtNDk2LDcgKzQ5NCw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqIENMSVJfREVGQVVMVCAgICAgPT0gb24gInVzZSBzdWJzY3JpcHRpb24gZGVmYXVsdCB2YWx1ZSIKQEAgLTUxMyw3ICs1MTEsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1TSSBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1TSShNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTI0LDcgKzUyMiw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTUVJIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTUVJKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01MzUsNyArNTMzLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNRUlTViBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1FSVNWKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01NDcsNyArNTQ1LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogIDNHUFAgMjIuMDMwIDYuNS41CkBAIC01NzIsNyArNTcwLDcgQEAKICAgICAgKiAgIlJlbGVhc2VzIGFsbCBoZWxkIGNhbGxzIG9yIHNldHMgVXNlciBEZXRlcm1pbmVkIFVzZXIgQnVzeSAoVURVQikKICAgICAgKiAgIGZvciBhIHdhaXRpbmcgY2FsbC4iCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5ndXBXYWl0aW5nT3JCYWNrZ3JvdW5kIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTkzLDcgKzU5MSw3IEBACiAgICAgICogIHRoZSBvdGhlciAoaGVsZCBvciB3YWl0aW5nKSBjYWxsLiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFuZ3VwRm9yZWdyb3VuZFJlc3VtZUJhY2tncm91bmQgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02MTQsNyArNjEyLDcgQEAKICAgICAgKiAgdGhlIG90aGVyIChoZWxkIG9yIHdhaXRpbmcpIGNhbGwuIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hXYWl0aW5nT3JIb2xkaW5nQW5kQWN0aXZlIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjM0LDcgKzYzMiw3IEBACiAgICAgICogIkFkZHMgYSBoZWxkIGNhbGwgdG8gdGhlIGNvbnZlcnNhdGlvbiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29uZmVyZW5jZSAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTY1NCw3ICs2NTIsNyBAQAogICAgICAqICJDb25uZWN0cyB0aGUgdHdvIGNhbGxzIGFuZCBkaXNjb25uZWN0cyB0aGUgc3Vic2NyaWJlciBmcm9tIGJvdGggY2FsbHMiCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjkwLDcgKzY4OCw3IEBACiAgICAgLyoqCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFjY2VwdENhbGwgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC03MDgsNyArNzA2LDcgQEAKICAgICAvKioKICAgICAgKiAgYWxzbyBrbm93biBhcyBVRFVCCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWplY3RDYWxsIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNzg1LDcgKzc4Myw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IGlzIGNhbGxiYWNrIG1lc3NhZ2UKICAgICAgKiAgICAgICAgKChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCAgaXMgYW4gaW50W10gd2l0aCBldmVyeQotICAgICAqICAgICAgICBlbGVtZW50IHJlcHJlc2VudGluZyBvbmUgYXZpYWxhYmxlIEJNXypfQkFORAorICAgICAqICAgICAgICBlbGVtZW50IHJlcHJlc2VudGluZyBvbmUgYXZhaWxhYmxlIEJNXypfQkFORAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHF1ZXJ5QXZhaWxhYmxlQmFuZE1vZGUgKE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIGludCByZXRbXSA9IG5ldyBpbnQgWzRdOwpAQCAtODQ0LDcgKzg0Miw2IEBACiAgICAgICAgIHJldFsxMV0gPSBudWxsOwogICAgICAgICByZXRbMTJdID0gbnVsbDsKICAgICAgICAgcmV0WzEzXSA9IG51bGw7Ci0gICAgICAgIHJldFsxNF0gPSBudWxsOwogCiAgICAgICAgIHJlc3VsdFN1Y2Nlc3MocmVzdWx0LCByZXQpOwogICAgIH0KQEAgLTg5NSw3ICs4OTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kRHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MDQsNyArOTAxLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RhcnREdG1mKGNoYXIgYywgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkxMyw3ICs5MTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdG9wRHRtZihNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTIyLDcgKzkxOSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmRCdXJzdER0bWYoU3RyaW5nIGR0bWZTdHJpbmcsIGludCBvbiwgaW50IG9mZiwgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTk1Nyw2ICs5NTQsNyBAQAogICAgICAgICB1bmltcGxlbWVudGVkKHJlc3BvbnNlKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldHVwRGVmYXVsdFBEUChTdHJpbmcgYXBuLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICB1bmltcGxlbWVudGVkKHJlc3VsdCk7CiAgICAgfQpAQCAtOTY4LDkgKzk2Niw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGF0YUNhbGwoaW50IGNpZCwgTWVzc2FnZSByZXN1bHQpIHt1bmltcGxlbWVudGVkKHJlc3VsdCk7fQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcnJlZE5ldHdvcmtUeXBlKGludCBuZXR3b3JrVHlwZSAsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC0xMDQ3LDcgKzEwNDMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHBhcmFtZXRlcnMgZXF1aXZpbGllbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAorICAgICAqIHBhcmFtZXRlcnMgZXF1aXZhbGVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCiAgICAgICogcmVzcG9uc2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKICAgICAgKiByZXNwb25zZS5vYmoudXNlck9iaiB3aWxsIGJlIGEgU2ltSW9SZXN1bHQgb24gc3VjY2VzcwogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlYWVjZC4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKLQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQaG9uZU51bWJlcldhdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SHlwaGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBUZXh0V2F0Y2hlciB0dyA9IG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOwotICAgICAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGxlZnQgZWRnZQotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMCk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgMSk7Ci0gICAgICAgIC8vIEluc2VydCBhbiA4IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiOCIpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODU1LTUxMi0xMiIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5EZWxldGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byBhZnRlciB0aGUgaHlwaGVuCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA0KTsKLSAgICAgICAgLy8gRGVsZXRlIHRoZSBoeXBoZW4KLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAzLCAxLCAwKTsKLSAgICAgICAgbnVtYmVyLmRlbGV0ZSgzLCA0KTsKLSAgICAgICAgdHcuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpdCBkZWxldGVkIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBoeXBoZW4gCi0gICAgICAgIGFzc2VydEVxdWFscygiNTUxLTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBkZWFscyB3aXRoIGxlZnQgZWRnZSBib3VuZGFyeSBjYXNlCi0gICAgICAgIG51bWJlci5pbnNlcnQoMCwgIi0iKTsKLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDEpOwotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDAsIDEpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKaW5kZXggM2E5YzUxMS4uYTZiOWEyYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgLy8gJ0AnIG1hcHMgdG8gY2hhciAwCiAgICAgICAgIGFzc2VydEVxdWFscygwLCBHc21BbHBoYWJldC5jaGFyVG9Hc20oJ0AnKSk7CiAKLSAgICAgICAgLy8gYGEgKGEgd2l0aCBncmF2ZSBhY2NlbnQpIG1hcHMgdG8gbGFzdCBHU00gY2hhcmF0ZXIKKyAgICAgICAgLy8gYGEgKGEgd2l0aCBncmF2ZSBhY2NlbnQpIG1hcHMgdG8gbGFzdCBHU00gY2hhcmFjdGVyCiAgICAgICAgIGFzc2VydEVxdWFscygweDdmLCBHc21BbHBoYWJldC5jaGFyVG9Hc20oJ1x1MDBlMCcpKTsKIAogICAgICAgICAvLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCmluZGV4IDMxMDNmYzEuLjIxNWM2Y2UgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKQEAgLTI0LDggKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCiBwdWJsaWMgY2xhc3MgR3NtU21zVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBAU21hbGxUZXN0CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU1NzNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CisKK3B1YmxpYyBjbGFzcyBQaG9uZU51bWJlcldhdGNoZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtdWx0aUNoYXJzID0gIjY1MDEyMzQ1IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDEgPSAiKDY1MCkgMTIzLTQ1IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIC8vIEFwcGVuZCBtb3JlIHRoYW4gb25lIGNoYXJzCisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbXVsdGlDaGFycy5sZW5ndGgoKSk7CisgICAgICAgIG51bWJlci5hcHBlbmQobXVsdGlDaGFycyk7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICAgICAgLy8gQXBwZW5kIG9uZSBjaGFycworICAgICAgICBmaW5hbCBjaGFyIGFwcGVuZENoYXIgPSAnNic7CisgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWQyID0gIig2NTApIDEyMy00NTYiOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgMCwgMSk7CisgICAgICAgIG51bWJlci5hcHBlbmQoYXBwZW5kQ2hhcik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbGVuLCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICI2NTAxMjM0NTY3OCI7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQxID0gIig2NTApIDEyMy00NTY3IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGxhc3QgY2hhci4KKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBsZW4gLSAxLCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShsZW4gLSAxLCBsZW4pOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSAtIDEsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBSZW1vdmUgbGFzdCA1IGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQyID0gIig2NTApIDEyMyI7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gNCwgNCwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUobnVtYmVyLmxlbmd0aCgpIC0gNSwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCksIDQsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBJbnNlcnQgb25lIGNoYXIKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg0LCAiMSIpOyAvLyAoNjUwMSkgMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgMQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzEnCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIEluc2VydCBtdWx0aXBsZSBjaGFycworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDE0NS02NzIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg3LCAiNDU2NyIpOyAvLyBjaGFuZ2UgdG8gKDY1MCkgMTQ1NjcyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMTEpOyAvLyB0aGUgY3Vyc29yIGlzIGF0IHRoZSByaWdodCBvZiAnNycuCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNycKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wRm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MDEpIDIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBEZWxldGUgYSAnKScKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9Iig2NTAgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZSg0LCA1KTsgLy8gKDY1MDEgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGEgaHlwaGVuCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDMgPSIoNjUwKSAxMi0zIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA4LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg4LCAiLSIpOyAvLyAoNjUwKSAxMi0zCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA5KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIC0KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDMsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICctJworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdGFydEZvcm1hdHRpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDEyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIDQiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgLy8gQXBwZW5kIHNwYWNlCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIiA0Iik7IC8vICg2NTApIDEyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzQnCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc3RyaW5nLCBhbmQgc3RhcnQgZm9ybWF0dGluZyBhZ2Fpbi4KKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDAsIGxlbik7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9ICIoNjUwKSAxMjMtNCI7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICI0Iik7IC8vICg2NTApIDEyMzQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dENoYW5nZWRCeU90aGVyVGV4dFdhdGNoZXIoKSB7CisgICAgICAgIGZpbmFsIFRleHRXYXRjaGVyIGNsZWFudXBUZXh0V2F0Y2hlciA9IG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA1LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg1LCAiNCIpOyAvLyAoNjUwNCkgMTIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuc2V0U3BhbihjbGVhbnVwVGV4dFdhdGNoZXIsIDAsIG51bWJlci5sZW5ndGgoKSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgVGV4dFdhdGNoZXIgZ2V0VGV4dFdhdGNoZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoIlVTIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggNDI3Nzk1Yi4uOGNiMDVjYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOworCiAvKioKICAqIFN0dWIgY2xhc3MgdXNlZCBmb3IgdW5pdCB0ZXN0cwogICovCkBAIC0zMiw3ICszNCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oUGhvbmUgc2VuZGVyKSB7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgbm90aWZ5U2lnbmFsU3RyZW5ndGgoUGhvbmUgc2VuZGVyKSB7CiAgICAgfQogCkBAIC00MiwxMCArNDQsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoUGhvbmUgc2VuZGVyKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KFBob25lIHNlbmRlcikgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCmluZGV4IGI5Njc0M2EuLjQ4NTU0MmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKQEAgLTE4LDI3ICsxOCwyMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsU3RhdGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZXN0UGhvbmVOb3RpZmllcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxGYWlsQ2F1c2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVRlc3RIYW5kbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtTW1pQ29kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvQW5kcm9pZC5tayBiL3Rlc3QtcnVubmVyL0FuZHJvaWQubWsKaW5kZXggOTYyZTk2Yy4uNmQ4MWI3MSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvQW5kcm9pZC5taworKysgYi90ZXN0LXJ1bm5lci9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBmcmFtZXdvcmsKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUgY29yZS1qdW5pdCBmcmFtZXdvcmsKIAogTE9DQUxfTU9EVUxFOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCmluZGV4IDk3M2I5ZjIuLmVlZTNhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTQ4LDYgKzE0OSwxNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW50ZXJuYWxOYW1lID0gcmVuYW1lZEZpbGVOYW1lKG5hbWUpOworICAgICAgICBpZiAoIW1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICBtRmlsZUNvbnRleHQuZGVsZXRlRGF0YWJhc2UoaW50ZXJuYWxOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVDb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKGludGVybmFsTmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAobURhdGFiYXNlTmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgIG1EYXRhYmFzZU5hbWVzLnJlbW92ZShuYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEKaW5kZXggZmZkNzU3Yy4uYzMxYzljYyAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwpAQCAtMTg0LDYgKzE4NSwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgZmlsZSwgaW50IG1vZGUsCisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmlsZSBnZXREYXRhYmFzZVBhdGgoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKaW5kZXggOWIxYzBlZi4uYmFhMTUwYSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCkBAIC0xNzgsMzYgKzE3OCwxMSBAQAogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uVXJpKENvbnRlbnRSZXNvbHZlciBjciwgVXJpIHVyaSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQpAQCAtMjE3LDQ4ICsxOTIsNyBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CiAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVGbG9hdChpbnQgY29sdW1uSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyB2b2lkIGFib3J0VXBkYXRlcygpIHsKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhCmluZGV4IGRmNmRhNzAuLmEyYjk0ZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhCkBAIC00Niw2ICs0Niw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUZXN0R3JvdXBpbmcgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGVzdEdyb3VwaW5nIjsKKwogICAgIFNvcnRlZFNldDxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiB0ZXN0Q2FzZUNsYXNzZXM7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gU09SVF9CWV9TSU1QTEVfTkFNRQpAQCAtMTE0LDcgKzExNiw3IEBACiAgICAgICAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lIDogcGFja2FnZU5hbWVzKSB7CiAgICAgICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IGFkZGVkQ2xhc3NlcyA9IHRlc3RDYXNlQ2xhc3Nlc0luUGFja2FnZShwYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICBpZiAoYWRkZWRDbGFzc2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIExvZy53KCJUZXN0R3JvdXBpbmciLCAiSW52YWxpZCBQYWNrYWdlOiAnIiArIHBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkludmFsaWQgUGFja2FnZTogJyIgKyBwYWNrYWdlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBjb3VsZCBub3QgYmUgZm91bmQgb3IgaGFzIG5vIHRlc3RzIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0ZXN0Q2FzZUNsYXNzZXMuYWRkQWxsKGFkZGVkQ2xhc3Nlcyk7CkBAIC0yMzQsNiArMjM2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiVGVzdENhc2UgY2xhc3MgJXMgaXMgbWlzc2luZyBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMgIiArCisgICAgICAgICAgICAgICAgICAgICJvciBhIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyIC0gc2tpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICBhQ2xhc3MuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmdUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0NzdkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIFRlc3RHcm91cGluZ30KKyAqLworcHVibGljIGNsYXNzIFRlc3RHcm91cGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFRlc3RHcm91cGluZyBtR3JvdXBpbmc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtR3JvdXBpbmcgPSBuZXcgVGVzdEdyb3VwaW5nKFRlc3RHcm91cGluZy5TT1JUX0JZX1NJTVBMRV9OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IFRlc3RDYXNlcyB3aXRoIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmUgbm90IGxvYWRlZC4KKyAgICAgKiBSZWxpZXMgb24gZml4dHVyZSBjbGFzc2VzIGluIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGVzdHNfbm9QdWJsaWNDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgbUdyb3VwaW5nLmFkZFBhY2thZ2VzUmVjdXJzaXZlKCJhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yIik7CisgICAgICAgIExpc3Q8VGVzdE1ldGhvZD4gdGVzdHMgPSBtR3JvdXBpbmcuZ2V0VGVzdHMoKTsKKyAgICAgICAgLy8gb25seSB0aGUgUHVibGljQ29uc3RydWN0b3JUZXN0J3MgdGVzdCBtZXRob2Qgc2hvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdFB1YmxpY0NvbnN0cnVjdG9yIiwgdGVzdHMuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL05vUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5MDlhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL05vUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHtAbGluayBUZXN0Q2FzZX0gd2hpY2ggc2hvdWxkIG5vdCBiZSBsb2FkZWQgc2luY2UgaXQgaGFzIG5vbi1wdWJsaWMgY29uc3RydWN0b3JzIHdpdGggbm8gYXJncy4KKyAqLworcHVibGljIGNsYXNzIE5vUHVibGljQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIE5vUHVibGljQ29uc3RydWN0b3JUZXN0KFN0cmluZyBmb28sIFN0cmluZyBmb28yKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFJ1bigpIHsKKyAgICAgICAgZmFpbCgibWV0aG9kIGluIE5vUHVibGljQ29uc3RydWN0b3JUZXN0IHJ1biB1bmV4cGVjdGVkbHkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Qcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODYyZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Qcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBub3QgYmUgbG9hZGVkLgorICovCitwdWJsaWMgY2xhc3MgUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90UnVuKCkgeworICAgICAgICBmYWlsKCJtZXRob2QgaW4gUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0IHJ1biB1bmV4cGVjdGVkbHkiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKY29weSB0byB0ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQppbmRleCBmYWJkOTU5Li5hMTFlMjVkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwyNSArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CiAKLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiAvKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjRmIHsKLSAgICBwdWJsaWMgVmVjdG9yNGYoKSB7CisgKiBBIHB1YmxpYyBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgYmUgbG9hZGVkLgorICovCitwdWJsaWMgY2xhc3MgUHVibGljQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0NvbnN0cnVjdG9yKCkgewogICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotICAgIHB1YmxpYyBmbG9hdCB3OwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCmluZGV4IGEwNThkNGEuLjAzNzM2N2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKQEAgLTY1LDcgKzY1LDcgQEAKIHB1YmxpYzoKICAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CiAgICAgdmlydHVhbCB+U3ViUGx1Z2luKCkge30KLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgPSAwOwogCiAgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKaW5kZXggMmVmZjM5NC4uOTFmMWIzZCAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBicm93c2VyLT5tZW1mcmVlKGJlZ2luTWVtKTsKIH0KIAotaW50MTYgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAKICAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKaW5kZXggODhiN2M5ZC4uMDQzYmU4NSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHB1YmxpYzoKICAgICBFdmVudFBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+RXZlbnRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIAogcHJpdmF0ZToKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcAppbmRleCA0MDJhN2UyLi41MTExODBjIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCkBAIC0zNCwxOSArMzQsMTkgQEAKIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKICNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CiBOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKIE5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwogTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAotICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOworICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7CiBOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKLWludDMyICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKLWludDMyICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sCitpbnQzMl90ICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKK2ludDMyX3QgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sCiAgICAgICAgIHZvaWQqIGJ1ZmZlcik7CiB2b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7CiB2b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwotaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CitpbnQxNl90ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwogdm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCiAgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwogTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LWJyb3dzZXJ0ZXN0cGx1Z2luOmJ0cDpBbmRyb2lkIEJyb3dzZXIgVGVzdCBQbHVnaW4iOwogfQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKIHsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1OUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSkKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpCiB7CiAgICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CkBAIC0xOTksMTIgKzE5OSwxMiBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoraW50MzJfdCBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLCB2b2lkKiBidWZmZXIpCitpbnQzMl90IE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCogYnVmZmVyKQogewogICAgIHJldHVybiAwOwogfQpAQCAtMjE3LDcgKzIxNyw3IEBACiB7CiB9CiAKLWludDE2IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQoraW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKIHsKICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKICAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5IGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkKaW5kZXggYjZlN2JmMy4uY2VhYzVkMiAxMDA3NTUKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAjIENvdW50IGNyYXNoZWQgdGVzdHMuCiAgIGNyYXNoZWRfdGVzdHMgPSBbXQogCi0gIHRpbWVvdXRfbXMgPSAnMzAwMDAnCisgIHRpbWVvdXRfbXMgPSAnMTUwMDAnCiAgIGlmIG9wdGlvbnMudGltZV9vdXRfbXM6CiAgICAgdGltZW91dF9tcyA9IG9wdGlvbnMudGltZV9vdXRfbXMKIApkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKaW5kZXggNTc4MGM0My4uYTU4NzBmOCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCkBAIC03NCw2ICs3NCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9TRVRfQ0FOX09QRU5fV0lORE9XUyA9IDQyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTiA9IDQzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSUklERV9QUkVGRVJFTkNFID0gNDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9EVU1QX0NISUxEX0ZSQU1FU19URVhUID0gNDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9YU1NfQVVESVRPUl9FTkFCTEVEID0gNDY7CiAgICAgCiAgICAgQ2FsbGJhY2tQcm94eShFdmVudFNlbmRlciBldmVudFNlbmRlciwgCiAgICAgICAgICAgICBMYXlvdXRUZXN0Q29udHJvbGxlciBsYXlvdXRUZXN0Q29udHJvbGxlcikgewpAQCAtMTc4LDYgKzE4MCwxMCBAQAogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0hJU1RPUlk6CiAgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEJhY2tGb3J3YXJkTGlzdCgpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNzMsNiArMjc5LDEwIEBACiAgICAgICAgICAgICBib29sZWFuIHZhbHVlID0gbXNnLmdldERhdGEoKS5nZXRCb29sZWFuKCJ2YWx1ZSIpOwogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZShrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0WFNTQXVkaXRvckVuYWJsZWQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzgwLDYgKzM5MCwxMCBAQAogICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX1RFWFQpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpIHsKICAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9ISVNUT1JZKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CkBAIC00OTgsNCArNTEyLDggQEAKICAgICAgICAgbWVzc2FnZS5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX1hTU19BVURJVE9SX0VOQUJMRUQsIGZsYWcgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKaW5kZXggNzdmZDNlZC4uOGJkZjc3YyAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCkBAIC03MywzMCArNzMsNDAgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVUZXN0TGlzdCA9IHsKICAgICAgICAgImVkaXRpbmcvc2VsZWN0aW9uL21vdmUtbGVmdC1yaWdodC5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcKKyAgICAgICAgImZhc3QvanMvZXhjZXNzaXZlLWNvbW1hLXVzYWdlLmh0bWwiLCAvLyBUZXN0cyBodWdlIGluaXRpYWxpemVyIGxpc3QsIGNhdXNlcyBPT00uCiAgICAgICAgICJmYXN0L2pzL3JlZ2V4cC1jaGFyY2xhc3MtY3Jhc2guaHRtbCIsIC8vIFJlZ0V4cCBpcyB0b28gbGFyZ2UsIGNhdXNpbmcgT09NCiAgICAgICAgICJmYXN0L3JlZ2V4L3Rlc3QxLmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CiAgICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAogICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCBmaWxsSWdub3JlUmVzdWx0TGlzdCgpIHsKLSAgICAgICAgLy8gVGhpcyBmaXJzdCBibG9jayBvZiB0ZXN0cyBhcmUgZm9yIEhUTUw1IGZlYXR1cmVzLCBmb3Igd2hpY2ggQW5kcm9pZAorICAgICAgICAvLyBUaGlzIGZpcnN0IGJsb2NrIG9mIHRlc3RzIGFyZSBmb3IgZmVhdHVyZXMgZm9yIHdoaWNoIEFuZHJvaWQKICAgICAgICAgLy8gc2hvdWxkIHBhc3MgYWxsIHRlc3RzLiBUaGV5IGFyZSBza2lwcGVkIG9ubHkgdGVtcG9yYXJpbHkuCiAgICAgICAgIC8vIFRPRE86IEZpeCB0aGVzZSBmYWlsaW5nIHRlc3RzIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoaXMgbGlzdC4KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL2Jhc2ljLW11bHRpLXRvdWNoLWV2ZW50cy5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy90b3VjaC90b3VjaC10YXJnZXQuaHRtbCIpOyAvLyBSZXF1aXJlcyBtdWx0aS10b3VjaAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9lbXB0eS1tYW5pZmVzdC5odG1sIik7IC8vIGZsYWt5CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2ZhbGxiYWNrLmh0bWwiKTsgLy8gaHR0cDovL2IvaXNzdWU/aWQ9MjcxMzAwNAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9mb3JlaWduLWlmcmFtZS1tYWluLmh0bWwiKTsgLy8gZmxha3kgLSBza2lwcyBzdGF0ZXMKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvbWFuaWZlc3Qtd2l0aC1lbXB0eS1maWxlLmh0bWwiKTsgLy8gZmxha3kKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbCIpOyAvLyBTdWNjZWVkcyBidXQgRHVtcFJlbmRlclRyZWUgZG9lcyBub3QgcmVhZCByZXN1bHQgY29ycmVjdGx5CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2hhc2gtY2hhbmdlLXdpdGgteGhyLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9vcGVuLWRhdGFiYXNlLWNyZWF0aW9uLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3N0YXRlbWVudC1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLXN1Y2Nlc3MtY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCiAKLSAgICAgICAgLy8gV2lsbCBhbHdheXMgZmFpbAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3N2Zy9sZXZlbDMveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gdW5zdXBwb3J0ZWQgZmVhdHVyZXMuCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy90b3VjaC90b3VjaC1jb29yZHMtaW4tem9vbS1hbmQtc2Nyb2xsLmh0bWwiKTsgLy8gUmVxdWlyZXMgZXZlbnRTZW5kZXIuem9vbVBhZ2VJbigpLHpvb21QYWdlT3V0KCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3Qvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9ldmVudHNvdXJjZS93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy94bWxodHRwcmVxdWVzdC93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kb21zdG9yYWdlL2xvY2Fsc3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLWFmZmVjdHMtc3RvcmFnZS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kb21zdG9yYWdlL3Nlc3Npb25zdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctYWZmZWN0cy1zdG9yYWdlLmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2luZGV4ZWRkYiIpOyAvLyBpbmRleGVkZGIgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLXJlYWRvbmx5Lmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJ3ZWJzb2NrZXQvdGVzdHMvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKIApAQCAtMTA0LDEyICsxMTQsOSBAQAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9jc3MvY2FzZS10cmFuc2Zvcm0uaHRtbCIpOyAvLyB3aWxsIG5vdCBmaXggIzYxOTcwNwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vRWxlbWVudC9vZmZzZXRMZWZ0LW9mZnNldFRvcC1ib2R5LXF1aXJrLmh0bWwiKTsgLy8gZGlmZmVyZW50IHNjcmVlbiBzaXplIHJlc3VsdCBpbiBleHRyYSBzcGFjZXMgaW4gQXBwbGUgY29tcGFyZWQgdG8gdXMKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy9QbHVnLWlucy5odG1sIik7IC8vIG5lZWQgdGVzdCBwbHVnaW4KLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3ctcHJvcGVydGllcy5odG1sIik7IC8vIHhzbHQgYW5kIHhwYXRoIGVsZW1lbnRzIG1pc3NpbmcgZnJvbSBwcm9wZXJ0eSBsaXN0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXNjcmVlbi1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8gcGl4ZWwgZGVwdGgKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3cteHktcHJvcGVydGllcy5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vYXR0cmlidXRlLW5hbWVzcGFjZXMtZ2V0LXNldC5odG1sIik7IC8vIGh0dHA6Ly9iLzczMzIyOQotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vZ2MtOS5odG1sIik7IC8vIHJlcXVpcmVzIHhwYXRoIHN1cHBvcnQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2dsb2JhbC1jb25zdHJ1Y3RvcnMuaHRtbCIpOyAvLyByZXF1aXJlcyB4c2x0IGFuZCB4cGF0aCBzdXBwb3J0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9vYmplY3QtZW1iZWQtcGx1Z2luLXNjcmlwdGluZy5odG1sIik7IC8vIGR5bmFtaWMgcGx1Z2lucyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS90YWJpbmRleC1jbGFtcC5odG1sIik7IC8vIHRoZXJlIGlzIGV4dHJhIHNwYWNpbmcgaW4gdGhlIGZpbGUgZHVlIHRvIG11bHRpcGxlIGlucHV0IGJveGVzIGZpdHRpbmcgb24gb25lIGxpbmUgb24gQXBwbGUsIG91cnMgYXJlIHdyYXBwZWQuIFNwYWNlIGF0IGxpbmUgZW5kcyBhcmUgc3RyaXBwZWQuCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy9hbmNob3ItaW1hZ2Utc2Nyb2xsZWQteC15Lmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCkBAIC0xNzIsOCArMTc5LDYgQEAKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvcmVwbGFjZWQvaW1hZ2UtbWFwLmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3RleHQvcGxhaW4tdGV4dC1saW5lLWJyZWFrcy5odG1sIik7IC8vIGV4dHJhIHNwYWNpbmcgYmVjYXVzZSBpRnJhbWVzIHJlbmRlcmVkIG5leHQgdG8gZWFjaCBvdGhlciBvbiBBcHBsZQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgicHJvZmlsZXIiKTsgLy8gcHJvZmlsZXIgaXMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3ZnIik7IC8vIHN2ZyBpcyBub3Qgc3VwcG9ydGVkCi0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCmluZGV4IDMyMmIwZDIuLjA4ODMzODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQpAQCAtNDIsOCArNDIsMTMgQEAKICAgICAgICAgLy9ubyBjcmVhdGlvbiBvZiBpbnN0YW5jZXMKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zLAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCB3cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zLAogICAgICAgICAgICAgU3RyaW5nIGRpciwgYm9vbGVhbiBpZ25vcmVSZXN1bHRzSW5EaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IDA7CiAgICAgICAgIExvZy52KExPR1RBRywgIlNlYXJjaGluZyB0ZXN0cyB1bmRlciAiICsgZGlyKTsKIAogICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZShkaXIpOwpAQCAtNjEsNyArNjYsNyBAQAogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgdGVzdCBkaXJlY3RvcnksIHdlIGRvbid0IHJlY3Vyc2UgaW50byBpdC4KICAgICAgICAgICAgICAgICBpZiAoIUZpbGVGaWx0ZXIuaXNOb25UZXN0RGlyKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlY3Vyc2luZyBvbiAiICsgcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcywgaWdub3JlUmVzdWx0c0luRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdENvdW50ICs9IHdyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIHMsIGlnbm9yZVJlc3VsdHNJbkRpcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtODEsOCArODYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKCgiIElHTk9SRV9SRVNVTFQiKS5nZXRCeXRlcygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKCdcbicpOworICAgICAgICAgICAgICAgIHRlc3RDb3VudCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q291bnQ7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVRlc3RTdGF0dXMoU3RyaW5nIHN0YXR1c0ZpbGUsIFN0cmluZyBzKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCmluZGV4IDkyMzYzNDUuLjgzNDYwYmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBwdWJsaWMgaW50ZXJmYWNlIExheW91dFRlc3RDb250cm9sbGVyIHsKIAogCXB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKTsKKwlwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKIAlwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCk7CiAJcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpOwogCQpAQCAtNjcsNCArNjgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sZWFuIGFsbG93KTsKIAogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKKworICAgIC8vIEZvciBYU1NBdWRpdG9yIHRlc3RzCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCmluZGV4IDA0MjE1OGEuLmZhYmJmODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQpAQCAtMTgsMTIgKzE4LDkgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLlRlc3RTaGVsbEFjdGl2aXR5LkR1bXBEYXRhVHlwZTsKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuQWRiVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkZvcndhcmRTZXJ2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkZvcndhcmRTZXJ2aWNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTE1NiwxOCArMTUzLDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbUpzRW5naW5lOwogICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UGF0aFByZWZpeDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOworICAgIHByaXZhdGUgaW50IG1UZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVJlc3VtZUluZGV4OwogCiAgICAgcHVibGljIExheW91dFRlc3RzQXV0b1Rlc3QoKSB7Ci0gICAgICBzdXBlcigiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgbGF5b3V0IHRlc3QgdG8KLSAgICAvLyBBbSBzdGF0dXMgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gYSBzY3JpcHQuCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NPckZhaWxDYWxsYmFjayhTdHJpbmcgZmlsZSwgYm9vbGVhbiByZXN1bHQpIHsKLSAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oZmlsZSwgcmVzdWx0KTsKLSAgICAgIGluc3Quc2VuZFN0YXR1cygwLCBidW5kbGUpOworICAgICAgc3VwZXIoVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnZXRUZXN0TGlzdCgpIHsKQEAgLTE4OCw2ICsxNzgsNyBAQAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyB0ZXN0IGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9CisgICAgICAgIG1UZXN0Q291bnQgPSBtVGVzdExpc3Quc2l6ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN1bWVUZXN0TGlzdCgpIHsKQEAgLTE5OCw2ICsxODksNyBAQAogICAgICAgICAgICAgICAgIGlmIChtVGVzdExpc3QuZWxlbWVudEF0KGkpLmVxdWFscyhsaW5lKSkgewogICAgICAgICAgICAgICAgICAgICBtVGVzdExpc3QgPSBuZXcgVmVjdG9yPFN0cmluZz4obVRlc3RMaXN0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3Quc2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdElnbm9yZVJlc3VsdCA9IG5ldyBWZWN0b3I8Qm9vbGVhbj4obVRlc3RMaXN0SWdub3JlUmVzdWx0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3RJZ25vcmVSZXN1bHQuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bWVJbmRleCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yOTgsNyArMjkwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCkgeworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCwgaW50IHRlc3ROdW1iZXIpIHsKICAgICAgICAgYWN0aXZpdHkuc2V0Q2FsbGJhY2sobmV3IFRlc3RTaGVsbENhbGxiYWNrKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChMYXlvdXRUZXN0c0F1dG9UZXN0LnRoaXMpIHsKQEAgLTMzNCw2ICszMjYsOCBAQAogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh0ZXN0KSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5SRVNVTFRfRklMRSwgcmVzdWx0RmlsZSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5USU1FT1VUX0lOX01JTExJUywgdGltZW91dCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCBtVGVzdENvdW50KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIHRlc3ROdW1iZXIpOwogICAgICAgICBhY3Rpdml0eS5zdGFydEFjdGl2aXR5KGludGVudCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkb25lLgpAQCAtMzczLDggKzM2Nyw4IEBACiAgICAgICAgIC8vIFJlYWQgc2V0dGluZ3MKICAgICAgICAgbVRlc3RQYXRoUHJlZml4ID0gKG5ldyBGaWxlKExBWU9VVF9URVNUU19ST09UICsgcnVubmVyLm1UZXN0UGF0aCkpLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICBtUmViYXNlbGluZVJlc3VsdHMgPSBydW5uZXIubVJlYmFzZWxpbmU7Ci0gICAgICAgIC8vIEpTQyBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KLSAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gImpzYyIgOiBydW5uZXIubUpzRW5naW5lOworICAgICAgICAvLyBWOCBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KKyAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gInY4IiA6IHJ1bm5lci5tSnNFbmdpbmU7CiAKICAgICAgICAgaW50IHRpbWVvdXQgPSBydW5uZXIubVRpbWVvdXRJbk1pbGxpczsKICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgewpAQCAtMzkxLDcgKzM4NSw3IEBACiAgICAgICAgICAgICByZXN1bWVUZXN0TGlzdCgpOwogCiAgICAgICAgIFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUKTsKKyAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRVhUX1JFUFIpOwogCiAgICAgICAgIC8vIFJ1biB0ZXN0cy4KICAgICAgICAgaW50IGFkZHIgPSAtMTsKQEAgLTQwOCw3ICs0MDIsOSBAQAogICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVSZXN1bHQgPSBtVGVzdExpc3RJZ25vcmVSZXN1bHQuZWxlbWVudEF0KGkpOwogICAgICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsIHMpOwogICAgICAgICAgICAgLy8gUnVuIHRlc3RzCi0gICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCk7CisgICAgICAgICAgICAvLyBpIGlzIDAgYmFzZWQsIGJ1dCB0ZXN0IGNvdW50IGlzIDEgYmFzZWQgc28gYWRkIDEgdG8gaSBoZXJlLgorICAgICAgICAgICAgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoYWN0aXZpdHksIHMsIHJ1bm5lci5tVGltZW91dEluTWlsbGlzLCBpZ25vcmVSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIGkgKyAxICsgbVJlc3VtZUluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIEZzVXRpbHMudXBkYXRlVGVzdFN0YXR1cyhURVNUX1NUQVRVU19GSUxFLCAiI0RPTkUiKTsKQEAgLTQzMyw3ICs0MjksNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSB0ZXN0c19saXN0ID0gbmV3IEZpbGUoTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdHNfbGlzdCwgZmFsc2UpKTsKLSAgICAgICAgICAgIEZzVXRpbHMuZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBnZXRUZXN0UGF0aCgpLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCisgICAgICAgICAgICBGc1V0aWxzLndyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCmluZGV4IDgyNjcxZWIuLjVmZmU2YjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQpAQCAtNTEsMjkgKzUxLDM4IEBACiAgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCAiZmlsZTovLyIgKyBmaWxlbmFtZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCAxKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIDEpOwogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBwcm9jZXNzRGlyZWN0b3J5KFN0cmluZyBwYXRoLCBib29sZWFuIHNlbGVjdGlvbikgewotICAgICAgICBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOworICAgICAgICBpbnQgdGVzdENvdW50ID0gZ2VuZXJhdGVUZXN0TGlzdChwYXRoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVUlfQVVUT19URVNULCBMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIHRlc3RDb3VudCk7CisgICAgICAgIC8vIFRlc3RTaGVsbEFjdGl2aXR5IHdpbGwgcHJvY2VzcyB0aGlzIGludGVudCBvbmNlIGFuZCBpbmNyZW1lbnQgdGhlIHRlc3QgaW5kZXgKKyAgICAgICAgLy8gYmVmb3JlIHJ1bm5pbmcgdGhlIGZpcnN0IHRlc3QsIHNvIHBhc3MgMCBoZXJlIHRvIGFsbG93IGZvciB0aGF0LgorICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMCk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgIHByaXZhdGUgaW50IGdlbmVyYXRlVGVzdExpc3QoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IDA7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIHRlc3RzX2xpc3QgPSBuZXcgRmlsZShMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0c19saXN0LCBmYWxzZSkpOwotICAgICAgICAgICAgRnNVdGlscy5maW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIHBhdGgsIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKKyAgICAgICAgICAgIHRlc3RDb3VudCA9IEZzVXRpbHMud3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KAorICAgICAgICAgICAgICAgICAgICBib3MsIHBhdGgsIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hlbiBjcmVhdGluZyB0ZXN0IGxpc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQorICAgICAgIHJldHVybiB0ZXN0Q291bnQ7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCmluZGV4IDgxZDViMDguLjBhMDQ3MTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCkBAIC0zNCw2ICszNCw4IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSHR0cEF1dGhIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUHJvbXB0UmVzdWx0OwpAQCAtOTgsNiArMTAwLDggQEAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAibWVzc2FnZSBzZW50IHRvIFdlYlZpZXcgdG8gZHVtcCB0ZXh0LiIpOwogICAgICAgICBzd2l0Y2ggKG1EdW1wRGF0YVR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRFVNUF9BU19URVhUOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFyZzEgPSBtRHVtcFRvcEZyYW1lQXNUZXh0ID8gMSA6IDA7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMiA9IG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPyAxIDogMDsKICAgICAgICAgICAgICAgICBtV2ViVmlldy5kb2N1bWVudEFzVGV4dChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVYVF9SRVBSOgpAQCAtMTE2LDYgKzEyMCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CiAKICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRlbnRWaWV3ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKICAgICAgICAgY29udGVudFZpZXcuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKQEAgLTE1OCw2ICsxNjMsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gaW50ZW50LmdldEludEV4dHJhKFRPVEFMX1RFU1RfQ09VTlQsIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIG1DdXJyZW50VGVzdE51bWJlciA9IGludGVudC5nZXRJbnRFeHRyYShDVVJSRU5UX1RFU1RfTlVNQkVSLCBtQ3VycmVudFRlc3ROdW1iZXIpOworCiAgICAgICAgIG1UZXN0VXJsID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFRFU1RfVVJMKTsKICAgICAgICAgaWYgKG1UZXN0VXJsID09IG51bGwpIHsKICAgICAgICAgICAgIG1VaUF1dG9UZXN0UGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShVSV9BVVRPX1RFU1QpOwpAQCAtMTcxLDYgKzE3OSwxMCBAQAogICAgICAgICBtVGltZW91dEluTWlsbGlzID0gaW50ZW50LmdldEludEV4dHJhKFRJTUVPVVRfSU5fTUlMTElTLCAwKTsKICAgICAgICAgbUdldERyYXd0aW1lID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShHRVRfRFJBV19USU1FLCBmYWxzZSk7CiAgICAgICAgIG1TYXZlSW1hZ2VQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFNBVkVfSU1BR0UpOworICAgICAgICBzZXRUaXRsZSgiVGVzdCAiICsgbUN1cnJlbnRUZXN0TnVtYmVyICsgIiBvZiAiICsgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpbUN1cnJlbnRUZXN0TnVtYmVyIC8gbVRvdGFsVGVzdENvdW50OworICAgICAgICBpbnQgcHJvZ3Jlc3MgPSAoaW50KShyYXRpbyAqIFdpbmRvdy5QUk9HUkVTU19FTkQpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLCBwcm9ncmVzcyk7CiAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiICBMb2FkaW5nICIgKyBtVGVzdFVybCk7CiAgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwobVRlc3RVcmwpOwpAQCAtMjM2LDYgKzI0OCw3IEBACiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCBGc1V0aWxzLmdldFRlc3RVcmwodXJsKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCArK21DdXJyZW50VGVzdE51bWJlcik7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMTAwMDApOwogICAgICAgICBleGVjdXRlSW50ZW50KGludGVudCk7CiAgICAgfQpAQCAtMzMwLDEyICszNDMsMjIgQEAKICAgICAvLyBMYXlvdXRUZXN0Q29udHJvbGxlciBGdW5jdGlvbnMKICAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCkgewogICAgICAgICBtRHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVDsKKyAgICAgICAgbUR1bXBUb3BGcmFtZUFzVGV4dCA9IHRydWU7CiAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQXNUZXh0IGNhbGxlZDogIit1cmwpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtRHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVDsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IHRydWU7CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQ2hpbGRGcmFtZXNBc1RleHQgY2FsbGVkOiAiK3VybCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgewogICAgICAgICBtV2FpdFVudGlsRG9uZSA9IHRydWU7CiAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKQEAgLTM0Nyw3ICszNzAsOSBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJub3RpZnlEb25lIGNhbGxlZDogIiArIHVybCk7CiAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgewogICAgICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIG1DaHJvbWVDbGllbnQub25Qcm9ncmVzc0NoYW5nZWQobVdlYlZpZXcsIDEwMSk7CisgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRXZWJLaXREYXRhICYmICFtVGltZWRPdXQgJiYgIWZpbmlzaGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00NzIsNiArNDk3LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZCAoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3Q2xpZW50IG1WaWV3Q2xpZW50ID0gbmV3IFdlYlZpZXdDbGllbnQoKXsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgewpAQCAtNDg5LDExICs1MTgsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgZHJhd1BhZ2VUb0ZpbGUobVNhdmVJbWFnZVBhdGggKyAiLyIgKyBuYW1lICsgIi5wbmciLCBtV2ViVmlldyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBDYWxsaW5nIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSd2ZSBtZXQgYWxsIHRoZSBjb25kaXRpb25zIGZvciBjb21wbGV0aW5nCi0gICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4KKyAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LiBPdGhlcndpc2Ugd2UgYXNrIFdlYkNvcmUgdG8KKyAgICAgICAgICAgIC8vIGR1bXAgdGhlIHBhZ2UuCiAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdhaXRpbmcgZm9yIG5vdGlmeURvbmUgdG8gYmUgY2FsbGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3ZWJraXQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IGFscmVhZHkgdGltZWQgb3V0OiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN1cGVyLm9uUGFnZUZpbmlzaGVkKHZpZXcsIHVybCk7CiAgICAgICAgIH0KIApAQCAtNTM1LDQ0ICs1ODMsOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJDaHJvbWVDbGllbnQgbUNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChXZWJWaWV3IHZpZXcsIGludCBuZXdQcm9ncmVzcykgewotCi0gICAgICAgICAgICAvLyBub3RpZnlEb25lIGNhbGxzIHRoaXMgd2l0aCAxMDElLiBXZSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoaXMgZmxhZyBpZiB0aGlzCi0gICAgICAgICAgICAvLyBpcyB0aGUgcmVhbCBjYWxsIGZyb20gV2ViQ29yZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA9PSAxMDApIHsKLSAgICAgICAgICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdpdGggdGhlIGZsYWcgdXBkYXRlZCwgd2UgY2FuIG5vdyBwcm9jZWVkIGFzIG5vcm1hbCB3aGV0aGVyIHRoZSBwcm9ncmVzcyB1cGRhdGUgY2FtZSBmcm9tCi0gICAgICAgICAgICAvLyBXZWJDb3JlIG9yIG5vdGlmeURvbmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlIGFyZSByZWFkeSB0byBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgYW5kIGRvIHNvIGlmIHdlIGFyZS4KLSAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtVGltZWRPdXQgJiYgIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkZpbmlzaGVkOiAiKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiVGltZWQgb3V0IGJlZm9yZSBmaW5pc2hpbmc6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1XYWl0VW50aWxEb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJXYWl0aW5nIGZvciBub3RpZnlEb25lOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVxdWVzdGVkIHdlYmtpdCBkYXRhIHJlYWR5OiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoV2ViVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IDMwKQotICAgICAgICAgICAgICAgIHRpdGxlID0gIi4uLiIrdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpLTMwKTsKLSAgICAgICAgICAgIHNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQgKyAiOiAiKyB0aXRsZSk7CiAgICAgICAgICAgICBpZiAobUR1bXBUaXRsZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCgiVElUTEUgQ0hBTkdFRDogIik7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQodGl0bGUpOwpAQCAtNjc1LDE1ICs2ODcsMjggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbnNvbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIiArIGNvbnNvbGVNZXNzYWdlLmxpbmVOdW1iZXIoKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iOwogICAgICAgICAgICAgaWYgKG1Db25zb2xlTWVzc2FnZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29uc29sZU1lc3NhZ2UgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIKLSAgICAgICAgICAgICAgICAgICAgKyBsaW5lTnVtYmVyICsiOiAiKyBtZXNzYWdlICsiXG4iOwotICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQoY29uc29sZU1lc3NhZ2UpOwotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiK2NvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKG1zZyk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIgKyBtc2cpOworICAgICAgICAgICAgLy8gdGhlIHJhdGlvbmFsZSBoZXJlIGlzIHRoYXQgaWYgdGhlcmUncyBhbiBlcnJvciBvZiBlaXRoZXIgdHlwZSwgYW5kIHRoZSB0ZXN0IHdhcworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIm5vdGlmeURvbmUiIHNpZ25hbCB0byBmaW5pc2gsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nCisgICAgICAgICAgICAvLyBhbnltb3JlIGJlY2F1c2UgdGhlIEpTIGV4ZWN1dGlvbiBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYXQgdGhpcyBwb2ludCBhbmQgYQorICAgICAgICAgICAgLy8gIm5vdGlmeURvbmUiIHdpbGwgbmV2ZXIgY29tZSBvdXQgc28gaXQncyBqdXN0IHdhc3RpbmcgdGltZSB0aWxsIHRpbWVvdXQga2lja3MgaW4KKyAgICAgICAgICAgIGlmIChtc2cuY29udGFpbnMoIlVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiIpIHx8IG1zZy5jb250YWlucygiVW5jYXVnaHQgVHlwZUVycm9yOiIpCisgICAgICAgICAgICAgICAgICAgICYmIG1XYWl0VW50aWxEb25lKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGVybWluYXRpbmcgdGVzdCBjYXNlIG9uIHVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yIG9yIFR5cGVFcnJvci4iKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeURvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzI5LDYgKzc1NCw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGVzdFN0YXR1cygpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IG1EZWZhdWx0RHVtcERhdGFUeXBlOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gZmFsc2U7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSBmYWxzZTsKICAgICAgICAgbVRpbWVkT3V0ID0gZmFsc2U7CiAgICAgICAgIG1EdW1wVGl0bGVDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgIG1SZXF1ZXN0ZWRXZWJLaXREYXRhID0gZmFsc2U7CkBAIC03MzgsMTAgKzc2NSwxMCBAQAogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaFBvaW50cygpOwogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaE1ldGFTdGF0ZSgpOwogICAgICAgICBtUGFnZUZpbmlzaGVkID0gZmFsc2U7Ci0gICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBmYWxzZTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBudWxsOworICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3MobVdlYlZpZXcpOwogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZ1tdIGdldERyYXdXZWJWaWV3VGltZShXZWJWaWV3IHZpZXcsIGludCBjb3VudCkgewpAQCAtNzc4LDcgKzgwNSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVUb05leHRUZXN0KCkgewotICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OworICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXR1cFdlYlZpZXdGb3JMYXlvdXRUZXN0cyhXZWJWaWV3IHdlYnZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgewpAQCAtNzg2LDYgKzgxMywxOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKHdlYnZpZXcpOworCisgICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOworICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOworICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3CisgICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCisgICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCisgICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCisgICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCisgICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFdlYlNldHRpbmdzKFdlYlZpZXcgd2VidmlldykgewogICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IHdlYnZpZXcuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOwpAQCAtNzk4LDE1ICs4MzgsNyBAQAogICAgICAgICBzZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLDApLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgc2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKLSAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKLSAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldwotICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQotICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgotICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAotICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgotICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgICAgICBzZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OwpAQCAtODIzLDYgKzg1NSw4IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNhdmVJbWFnZVBhdGg7CiAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBtVGVzdExpc3RSZWFkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZXREcmF3dGltZTsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0TnVtYmVyOwogCiAgICAgLy8gU3RhdGVzCiAgICAgcHJpdmF0ZSBib29sZWFuIG1UaW1lZE91dDsKQEAgLTgzMiw2ICs4NjYsOCBAQAogICAgIC8vIExheW91dCB0ZXN0IGNvbnRyb2xsZXIgdmFyaWFibGVzLgogICAgIHByaXZhdGUgRHVtcERhdGFUeXBlIG1EdW1wRGF0YVR5cGU7CiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbURlZmF1bHREdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRVhUX1JFUFI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVG9wRnJhbWVBc1RleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1XYWl0VW50aWxEb25lOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFRpdGxlQ2hhbmdlczsKICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtVGl0bGVDaGFuZ2VzOwpAQCAtODQ1LDcgKzg4MSw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbVBhZ2VGaW5pc2hlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFdlYktpdERhdGEgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSBmYWxzZTsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRU9VVF9TVFIgPSAiKipUZXN0IHRpbWVvdXQiOwogCkBAIC04NjAsNiArODk1LDggQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0FVVE9fVEVTVCA9ICJVaUF1dG9UZXN0IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9EUkFXX1RJTUUgPSAiR2V0RHJhd1RpbWUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9JTUFHRSA9ICJTYXZlSW1hZ2UiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9UQUxfVEVTVF9DT1VOVCA9ICJUZXN0Q291bnQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9URVNUX05VTUJFUiA9ICJUZXN0TnVtYmVyIjsKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRFJBV19SVU5TID0gNTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERSQVdfVElNRV9MT0cgPSAiL3NkY2FyZC9hbmRyb2lkL3BhZ2VfZHJhd190aW1lLnR4dCI7CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCA3MCUKY29weSBmcm9tIGxpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKY29weSB0byB0ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawppbmRleCA5ZTZlZDdlLi5kNDc0M2Y5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTQgKzE0LDEzIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLSNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBId0FjY2VsZXJhdGlvblRlc3QKIAotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZpbG0KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmYwYjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aSI+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSHdVaSIKKyAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJId1VpQWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvSHdVaUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvSHdVaUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlMzk5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Id1VpQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgSHdVaUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkh3VWkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIERpcnR5Qml0bWFwVmlldyBjb250YWluZXIgPSBuZXcgRGlydHlCaXRtYXBWaWV3KHRoaXMpOworCisgICAgICAgIENvbG9yVmlldyBjb2xvciA9IG5ldyBDb2xvclZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGNvbG9yLCBuZXcgRGlydHlCaXRtYXBWaWV3LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBkaXBUb1B4KHRoaXMsIDEwMCksIGRpcFRvUHgodGhpcywgMTAwKSwgR3Jhdml0eS5DRU5URVIpKTsKKworICAgICAgICBBbHBoYUFuaW1hdGlvbiBhID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIGNvbG9yLnN0YXJ0QW5pbWF0aW9uKGEpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ29sb3JWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIENvbG9yVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDAsIDI1NSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRGlydHlCaXRtYXBWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDIwMC4wZiwgMC4wZiwgMjIwLjBmLCAyMC4wZiwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMTAwLjBmLCAxMDAuMGYsIDExMC4wZiwgMTEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImNsaXBSZWN0ID0gIiArIGNhbnZhcy5nZXRDbGlwQm91bmRzKCkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCg1MC4wZiwgNTAuMGYsIDYwLjBmLCA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoODAuMGYsIDgwLjBmLCA5MC4wZiwgOTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUoMi4wZiwgMi4wZik7ICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMC4wZiwgMjAuMGYsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZVRvID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYSgwLjBmLCAxMDAuMGYsIGdldFdpZHRoKCksIDE1MC4wZiwgMTI3LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMTAwLjBmLCA0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMGZmZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDQwLjBmLCAxMDAuMGYsIDE0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZjAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDE0MC4wZiwgMTAwLjBmLCAyNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlVG8pOworCisgICAgICAgICAgICBzdXBlci5kaXNwYXRjaERyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAgYi90b29scy9hYXB0L0NvbW1hbmQuY3BwCmluZGV4IDgzMDU3YjguLmM0MGFmODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKKysrIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcApAQCAtMTk3LDggKzE5NywxMCBAQAogICAgICAgICBpZiAoJnJlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBwcmludGYoIlxuTm8gcmVzb3VyY2UgdGFibGUgZm91bmQuXG4iKTsKICAgICAgICAgfSBlbHNlIHsKKyNpZm5kZWYgSEFWRV9BTkRST0lEX09TCiAgICAgICAgICAgICBwcmludGYoIlxuUmVzb3VyY2UgdGFibGU6XG4iKTsKICAgICAgICAgICAgIHJlcy5wcmludChmYWxzZSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIEFzc2V0KiBtYW5pZmVzdEFzc2V0ID0gYXNzZXRzLm9wZW5Ob25Bc3NldCgiQW5kcm9pZE1hbmlmZXN0LnhtbCIsCkBAIC0zODgsOCArMzkwLDkgQEAKICAgICB9CiAKICAgICBpZiAoc3RyY21wKCJyZXNvdXJjZXMiLCBvcHRpb24pID09IDApIHsKKyNpZm5kZWYgSEFWRV9BTkRST0lEX09TCiAgICAgICAgIHJlcy5wcmludChidW5kbGUtPmdldFZhbHVlcygpKTsKLQorI2VuZGlmCiAgICAgfSBlbHNlIGlmIChzdHJjbXAoInhtbHRyZWUiLCBvcHRpb24pID09IDApIHsKICAgICAgICAgaWYgKGJ1bmRsZS0+Z2V0RmlsZVNwZWNDb3VudCgpIDwgMykgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogbm8gZHVtcCB4bWx0cmVlIHJlc291cmNlIGZpbGUgc3BlY2lmaWVkXG4iKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAgYi90b29scy9hYXB0L1BhY2thZ2UuY3BwCmluZGV4IDk5OWE1Y2YuLjNjYjYxNGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcApAQCAtNDQxLDcgKzQ0MSw3IEBACiAKIHNzaXplX3QgcHJvY2Vzc0phckZpbGVzKEJ1bmRsZSogYnVuZGxlLCBaaXBGaWxlKiB6aXApCiB7Ci0gICAgc3NpemVfdCBlcnI7CisgICAgc3RhdHVzX3QgZXJyOwogICAgIHNzaXplX3QgY291bnQgPSAwOwogICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjxjb25zdCBjaGFyKj4mIGphcnMgPSBidW5kbGUtPmdldEphckZpbGVzKCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwIGIvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAKaW5kZXggY2FmZDYzNS4uNTg1NWI1NiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAKQEAgLTU0MiwxMSArNTQyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8QWFwdEdyb3VwRW50cnksIHNwPEFhcHRGaWxlPiA+IGJhc2VGaWxlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VHcm91cC0+Z2V0RmlsZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGJhc2VGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiYmFzZUZpbGUgJWxkIGhhcyBmbGF2b3IgJXNcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJiYXNlRmlsZSAlZCBoYXMgZmxhdm9yICVzXG4iLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUZpbGVzLmtleUF0KGkpLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgb3ZlcmxheUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJvdmVybGF5RmlsZSAlbGQgaGFzIGZsYXZvciAlc1xuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm92ZXJsYXlGaWxlICVkIGhhcyBmbGF2b3IgJXNcbiIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5RmlsZXMua2V5QXQoaSkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU2MCw3ICs1NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlBdChvdmVybGF5R3JvdXBJbmRleCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmFzZUZpbGVJbmRleCA8IFVOS05PV05fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlLT5nZXRWZXJib3NlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhIG1hdGNoICglbGQpIGZvciBvdmVybGF5IGZpbGUgJXMsIGZvciBmbGF2b3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZm91bmQgYSBtYXRjaCAoJWQpIGZvciBvdmVybGF5IGZpbGUgJXMsIGZvciBmbGF2b3IgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUZpbGVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5R3JvdXAtPmdldExlYWYoKS5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5RmlsZXMua2V5QXQob3ZlcmxheUdyb3VwSW5kZXgpLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggNzU1YjkzYi4uZjQwYTg3NyAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0yMzY2LDcgKzIzNjYsNyBAQAogICAgICAgICBpZiAoY29uZmlnU2V0LmNvdW50KGRlZmF1bHRMb2NhbGUpID09IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiYWFwdDogd2FybmluZzogc3RyaW5nICclcycgaGFzIG5vIGRlZmF1bHQgdHJhbnNsYXRpb24gaW4gJXM7IGZvdW5kOiIsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobmFtZUl0ZXItPmZpcnN0KS5zdHJpbmcoKSwgbUJ1bmRsZS0+Z2V0UmVzb3VyY2VTb3VyY2VEaXJzKClbMF0pOwotICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46Oml0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMgIT0gY29uZmlnU2V0LmVuZCgpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzKyspIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAlcyIsICgqbG9jYWxlcykuc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcCBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKaW5kZXggYTA5Y2VjMC4uZTI4YmRmZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAorKysgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICBzdHIgPSBTdHJpbmc4KHBvb2wtPnN0cmluZ0F0KHMsICZsZW4pKS5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaW50ZigiU3RyaW5nICMlbGQ6ICVzXG4iLCBzLCBzdHIpOworICAgICAgICBwcmludGYoIlN0cmluZyAjJWQ6ICVzXG4iLCBzLCBzdHIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcCBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKaW5kZXggNTdmZjQ3YS4uNDUyNTQ5YiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAorKysgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCkBAIC0yMDMsOSArMjAzLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhsaWZmRGVwdGggPT0gMCAmJiBwc2V1ZG9sb2NhbGl6ZSkgeworI2lmZGVmIEVOQUJMRV9QU0VVRE9MT0NBTElaRQogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWcoU3RyaW5nOCh0ZXh0KS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHNldWRvID0gcHNldWRvbG9jYWxpemVfc3RyaW5nKG9yaWcpOwogICAgICAgICAgICAgICAgIGN1clN0cmluZy5hcHBlbmQoU3RyaW5nMTYoU3RyaW5nOChwc2V1ZG8uY19zdHIoKSkpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoaXNGb3JtYXR0ZWQgJiYgaGFzU3Vic3RpdHV0aW9uRXJyb3JzKGZpbGVOYW1lLCBpblhtbCwgdGV4dCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1ppcEZpbGUuaCBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCmluZGV4IGRiYmQwNzIuLjc4Nzc1NTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCisrKyBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgLyoKICAgICAgKiBPcGVuIGEgbmV3IG9yIGV4aXN0aW5nIGFyY2hpdmUuCiAgICAgICovCi0gICAgdHlwZWRlZiBlbnVtIHsKKyAgICBlbnVtIHsKICAgICAgICAga09wZW5SZWFkT25seSAgID0gMHgwMSwKICAgICAgICAga09wZW5SZWFkV3JpdGUgID0gMHgwMiwKICAgICAgICAga09wZW5DcmVhdGUgICAgID0gMHgwNCwgICAgIC8vIGNyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvUkVBRE1FIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0xheW91dGxpYiBpcyBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIFZpZXcgZnJhbWV3b3JrIGRlc2lnbmVkIHRvIHJ1biBpbnNpZGUgRWNsaXBzZS4KK1RoZSBnb2FsIG9mIHRoZSBsaWJyYXJ5IGlzIHRvIHByb3ZpZGUgbGF5b3V0IHJlbmRlcmluZyBpbiBFY2xpcHNlIHRoYXQgYXJlIHZlcnkgdmVyeSBjbG9zZSB0byB0aGVpciByZW5kZXJpbmcgb24gZGV2aWNlcy4KKworTm9uZSBvZiB0aGUgY29tLmFuZHJvaWQuKiBvciBhbmRyb2lkLiogY2xhc3NlcyBpbiBsYXlvdXRsaWIgcnVuIG9uIGRldmljZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQppbmRleCA3NDRiZmJlLi41OGIxYjZjIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0xMDU5LDYgKzEwNjAsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGFyZzAsIGludCBhcmcxLAorICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBhcmcyLCBEYXRhYmFzZUVycm9ySGFuZGxlciBhcmczKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERyYXdhYmxlIHBlZWtXYWxscGFwZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKaW5kZXggZTA4Zjg1Ny4uN2EzMjgyYyAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKKwogLyoqCiAgKiBOYXRpdmUgY2FsbHMgZm9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uLCBhbmQgZm9yCiAgKiByZWNlaXZpbmcgYXN5bmNocm9ub3VzIGV2ZW50cy4gQWxsIG1ldGhvZHMgb2YgdGhlIGZvcm0gInh4eHhDb21tYW5kKCkiCkBAIC0xNDMsNiArMTQ1LDEwIEBACiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGNsZWFyQmxhY2tsaXN0Q29tbWFuZCgpOwogCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBkb0RoY3BSZXF1ZXN0KERoY3BJbmZvIHJlc3VsdHMpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldERoY3BFcnJvcigpOworCiAgICAgLyoqCiAgICAgICogV2FpdCBmb3IgdGhlIHN1cHBsaWNhbnQgdG8gc2VuZCBhbiBldmVudCwgcmV0dXJuaW5nIHRoZSBldmVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgZXZlbnQgc3RyaW5nIHNlbnQgYnkgdGhlIHN1cHBsaWNhbnQuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKaW5kZXggOTlmM2QwNi4uNWI0ZmFmOTcgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKICAqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR0QgPSBDb25maWcuTE9HRCB8fCBmYWxzZTsKICAgICAKQEAgLTE5Nyw2ICsxOTcsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZUlwQWRkcmVzczsKICAgICBwcml2YXRlIGJvb2xlYW4gbU9idGFpbmluZ0lwQWRkcmVzczsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRvcm5Eb3duQnlDb25uTWdyOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBmYWxzZTsKICAgICAvKioKICAgICAgKiBBIERJU0NPTk5FQ1QgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQsIGJ1dCBwcm9jZXNzaW5nIGl0CiAgICAgICogaXMgYmVpbmcgZGVmZXJyZWQuCkBAIC0zMTQsNyArMzE2LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SZWxlYXNlV2FrZUxvY2tDYWxsYmFjazsKKyAgICBwcml2YXRlIEhhbmRsZXIgbVRhcmdldDsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURlZmF1bHRSb3V0ZVNldCA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1cHBsaWNhbnQgc3RhdGUKQEAgLTM1MCw4ICszNTYsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7Ci0gICAgICAgIAorICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CiAgICAgICAgIG1XaWZpSW5mbyA9IG5ldyBXaWZpSW5mbygpOwogICAgICAgICBtV2lmaU1vbml0b3IgPSBuZXcgV2lmaU1vbml0b3IodGhpcyk7CiAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7CkBAIC0zNzIsOSArMzc5LDkgQEAKICAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKIAogICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJ3aWZpLmludGVyZmFjZSIsICJ0aXdsYW4wIik7Ci0gICAgICAgIG1EbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIm5ldC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczEiLAotICAgICAgICAgICAgIm5ldC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczIiCisgICAgICAgIHNEbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImRoY3AuIiArIG1JbnRlcmZhY2VOYW1lICsgIi5kbnMxIiwKKyAgICAgICAgICAgICJkaGNwLiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMiIKICAgICAgICAgfTsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IElCYXR0ZXJ5U3RhdHMuU3R1Yi5hc0ludGVyZmFjZShTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJiYXR0ZXJ5aW5mbyIpKTsKIApAQCAtNDA3LDYgKzQxNCw1NyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQorICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bworICAgICAqIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAorICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIKKyAgICAgICAgICAgICAgICArIG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgKyAiIGFuZCBuZXcgc3RhdGU9IiArIHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KKyAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQorICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSBjb25uZWN0aW9uCiAgICAgICogbWFuYWdlciBhc2tlZCB0aGUgbmV0d29yayB0byBiZSB0b3JuIGRvd24gKGFuZCBzbyBvbmx5IHRoZSBjb25uZWN0aW9uCiAgICAgICogbWFuYWdlciBjYW4gc2V0IGl0IHVwIGFnYWluKS4KQEAgLTQxOSw2ICs0NzcsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgV0xBTgorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1Byb3BOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNEbnNQcm9wTmFtZXM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIG91ciBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlLgogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIGludGVyZmFjZS4KICAgICAgKi8KQEAgLTQyNiw2ICs0OTMsMzAgQEAKICAgICAgICAgcmV0dXJuIG1JbnRlcmZhY2VOYW1lOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbVByaXZhdGVEbnNSb3V0ZVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcwogICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCkBAIC02NzMsMjIgKzc2NCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV2UgcmVsZWFzZSB0aGUgd2FrZWxvY2sgaW4gV2lmaVNlcnZpY2UKLSAgICAgKiB1c2luZyBhIHRpbWVyLgotICAgICAqCi0gICAgICogVE9ETzoKLSAgICAgKiBSZWxlYXNpbmcgd2FrZWxvY2sgdXNpbmcgYm90aCB0aW1lciBhbmQKLSAgICAgKiBhIGNhbGwgZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlIHJlcXVpcmVzCi0gICAgICogYSByZXRoaW5rLiBXZSBoYWQgcHJvYmxlbXMgd2hlcmUgV2lmaVNlcnZpY2UKLSAgICAgKiBjb3VsZCBrZWVwIGEgd2FrZWxvY2sgZm9yZXZlciBpZiB3ZSBkZWxldGUKLSAgICAgKiBtZXNzYWdlcyBpbiB0aGUgYXN5bmNocm9ub3VzIGNhbGwKLSAgICAgKiBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVHJhY2tzIHRoZSBXUEEgc3VwcGxpY2FudCBzdGF0ZXMgdG8gZGV0ZWN0ICJsb29wIiBzaXR1YXRpb25zLgogICAgICAqIEBwYXJhbSBuZXdTdXBwbGljYW50U3RhdGUgVGhlIG5ldyBXUEEgc3VwcGxpY2FudCBzdGF0ZS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpY2FudCBsb29wIHNob3VsZCBiZSBzdG9wcGVkCkBAIC0yMDc2LDcgKzIxNTEsNiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7CiAKICAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgpAQCAtMjEyMiw2ICsyMTk2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2VuZCBhICBub3RpZmljYXRpb24gdGhhdCB0aGUgcmVzdWx0cyBvZiBhIHNjYW4gZm9yIG5ldHdvcmsgYWNjZXNzCisgICAgICogcG9pbnRzIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzIGFyZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgogICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2Vlbgo=